insert-figure-dropdown.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { ListGroupItem } from 'react-bootstrap'
  2. import { ToolbarButtonMenu } from './button-menu'
  3. import Icon from '../../../../shared/components/icon'
  4. import { memo, useCallback } from 'react'
  5. import { FigureModalSource } from '../figure-modal/figure-modal-context'
  6. import { useTranslation } from 'react-i18next'
  7. import { emitToolbarEvent } from '../../extensions/toolbar/utils/analytics'
  8. import { useCodeMirrorViewContext } from '../codemirror-editor'
  9. import { insertFigure } from '../../extensions/toolbar/commands'
  10. export const InsertFigureDropdown = memo(function InsertFigureDropdown() {
  11. const { t } = useTranslation()
  12. const view = useCodeMirrorViewContext()
  13. const openFigureModal = useCallback(
  14. (source: FigureModalSource, sourceName: string) => {
  15. emitToolbarEvent(view, `toolbar-figure-modal-${sourceName}`)
  16. window.dispatchEvent(
  17. new CustomEvent('figure-modal:open', {
  18. detail: source,
  19. })
  20. )
  21. },
  22. [view]
  23. )
  24. const {
  25. hasLinkedProjectFileFeature,
  26. hasLinkedProjectOutputFileFeature,
  27. hasLinkUrlFeature,
  28. } = window.ExposedSettings
  29. return (
  30. <ToolbarButtonMenu
  31. id="toolbar-figure"
  32. label={t('toolbar_insert_figure')}
  33. icon="picture-o"
  34. altCommand={insertFigure}
  35. >
  36. <ListGroupItem
  37. onClick={() =>
  38. openFigureModal(FigureModalSource.FILE_UPLOAD, 'file-upload')
  39. }
  40. >
  41. <Icon type="upload" fw />
  42. {t('upload_from_computer')}
  43. </ListGroupItem>
  44. <ListGroupItem
  45. onClick={() =>
  46. openFigureModal(FigureModalSource.FILE_TREE, 'current-project')
  47. }
  48. >
  49. <Icon type="archive" fw />
  50. {t('from_project_files')}
  51. </ListGroupItem>
  52. {(hasLinkedProjectFileFeature || hasLinkedProjectOutputFileFeature) && (
  53. <ListGroupItem
  54. onClick={() =>
  55. openFigureModal(FigureModalSource.OTHER_PROJECT, 'other-project')
  56. }
  57. >
  58. <Icon type="folder-open" fw />
  59. {t('from_another_project')}
  60. </ListGroupItem>
  61. )}
  62. {hasLinkUrlFeature && (
  63. <ListGroupItem
  64. onClick={() =>
  65. openFigureModal(FigureModalSource.FROM_URL, 'from-url')
  66. }
  67. >
  68. <Icon type="globe" fw />
  69. {t('from_url')}
  70. </ListGroupItem>
  71. )}
  72. </ToolbarButtonMenu>
  73. )
  74. })