insert-figure-dropdown.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { ToolbarButtonMenu } from './button-menu'
  2. import Icon from '@/shared/components/icon'
  3. import BootstrapVersionSwitcher from '@/features/ui/components/bootstrap-5/bootstrap-version-switcher'
  4. import MaterialIcon from '@/shared/components/material-icon'
  5. import OLListGroupItem from '@/features/ui/components/ol/ol-list-group-item'
  6. import { memo, useCallback } from 'react'
  7. import { FigureModalSource } from '../figure-modal/figure-modal-context'
  8. import { useTranslation } from 'react-i18next'
  9. import { emitToolbarEvent } from '../../extensions/toolbar/utils/analytics'
  10. import { useCodeMirrorViewContext } from '../codemirror-context'
  11. import { insertFigure } from '../../extensions/toolbar/commands'
  12. import getMeta from '@/utils/meta'
  13. export const InsertFigureDropdown = memo(function InsertFigureDropdown() {
  14. const { t } = useTranslation()
  15. const view = useCodeMirrorViewContext()
  16. const openFigureModal = useCallback(
  17. (source: FigureModalSource, sourceName: string) => {
  18. emitToolbarEvent(view, `toolbar-figure-modal-${sourceName}`)
  19. window.dispatchEvent(
  20. new CustomEvent('figure-modal:open', {
  21. detail: { source },
  22. })
  23. )
  24. },
  25. [view]
  26. )
  27. const {
  28. hasLinkedProjectFileFeature,
  29. hasLinkedProjectOutputFileFeature,
  30. hasLinkUrlFeature,
  31. } = getMeta('ol-ExposedSettings')
  32. return (
  33. <ToolbarButtonMenu
  34. id="toolbar-figure"
  35. label={t('toolbar_insert_figure')}
  36. icon={
  37. <BootstrapVersionSwitcher
  38. bs3={<Icon fw type="picture-o" />}
  39. bs5={<MaterialIcon type="add_photo_alternate" />}
  40. />
  41. }
  42. altCommand={insertFigure}
  43. >
  44. <OLListGroupItem
  45. onClick={() =>
  46. openFigureModal(FigureModalSource.FILE_UPLOAD, 'file-upload')
  47. }
  48. >
  49. <BootstrapVersionSwitcher
  50. bs3={<Icon type="upload" fw />}
  51. bs5={<MaterialIcon type="upload" />}
  52. />
  53. {t('upload_from_computer')}
  54. </OLListGroupItem>
  55. <OLListGroupItem
  56. onClick={() =>
  57. openFigureModal(FigureModalSource.FILE_TREE, 'current-project')
  58. }
  59. >
  60. <BootstrapVersionSwitcher
  61. bs3={<Icon type="archive" fw />}
  62. bs5={<MaterialIcon type="inbox" />}
  63. />
  64. {t('from_project_files')}
  65. </OLListGroupItem>
  66. {(hasLinkedProjectFileFeature || hasLinkedProjectOutputFileFeature) && (
  67. <OLListGroupItem
  68. onClick={() =>
  69. openFigureModal(FigureModalSource.OTHER_PROJECT, 'other-project')
  70. }
  71. >
  72. <BootstrapVersionSwitcher
  73. bs3={<Icon type="folder-open" fw />}
  74. bs5={<MaterialIcon type="folder_open" />}
  75. />
  76. {t('from_another_project')}
  77. </OLListGroupItem>
  78. )}
  79. {hasLinkUrlFeature && (
  80. <OLListGroupItem
  81. onClick={() =>
  82. openFigureModal(FigureModalSource.FROM_URL, 'from-url')
  83. }
  84. >
  85. <BootstrapVersionSwitcher
  86. bs3={<Icon type="globe" fw />}
  87. bs5={<MaterialIcon type="public" />}
  88. />
  89. {t('from_url')}
  90. </OLListGroupItem>
  91. )}
  92. </ToolbarButtonMenu>
  93. )
  94. })