insert-figure-dropdown.tsx 2.4 KB

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