insert-figure-dropdown.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. import { usePermissionsContext } from '@/features/ide-react/context/permissions-context'
  14. import { ToolbarButton } from './toolbar-button'
  15. export const InsertFigureDropdown = memo(function InsertFigureDropdown() {
  16. const { t } = useTranslation()
  17. const view = useCodeMirrorViewContext()
  18. const { write } = usePermissionsContext()
  19. const openFigureModal = useCallback(
  20. (source: FigureModalSource, sourceName: string) => {
  21. emitToolbarEvent(view, `toolbar-figure-modal-${sourceName}`)
  22. window.dispatchEvent(
  23. new CustomEvent('figure-modal:open', {
  24. detail: { source },
  25. })
  26. )
  27. },
  28. [view]
  29. )
  30. const {
  31. hasLinkedProjectFileFeature,
  32. hasLinkedProjectOutputFileFeature,
  33. hasLinkUrlFeature,
  34. } = getMeta('ol-ExposedSettings')
  35. if (!write) {
  36. return (
  37. <ToolbarButton
  38. id="toolbar-figure"
  39. label={t('toolbar_insert_figure')}
  40. command={() =>
  41. openFigureModal(FigureModalSource.FILE_TREE, 'current-project')
  42. }
  43. icon="add_photo_alternate"
  44. />
  45. )
  46. }
  47. return (
  48. <ToolbarButtonMenu
  49. id="toolbar-figure"
  50. label={t('toolbar_insert_figure')}
  51. icon={
  52. <BootstrapVersionSwitcher
  53. bs3={<Icon fw type="picture-o" />}
  54. bs5={<MaterialIcon type="add_photo_alternate" />}
  55. />
  56. }
  57. altCommand={insertFigure}
  58. >
  59. <OLListGroupItem
  60. onClick={() =>
  61. openFigureModal(FigureModalSource.FILE_UPLOAD, 'file-upload')
  62. }
  63. >
  64. <BootstrapVersionSwitcher
  65. bs3={<Icon type="upload" fw />}
  66. bs5={<MaterialIcon type="upload" />}
  67. />
  68. {t('upload_from_computer')}
  69. </OLListGroupItem>
  70. <OLListGroupItem
  71. onClick={() =>
  72. openFigureModal(FigureModalSource.FILE_TREE, 'current-project')
  73. }
  74. >
  75. <BootstrapVersionSwitcher
  76. bs3={<Icon type="archive" fw />}
  77. bs5={<MaterialIcon type="inbox" />}
  78. />
  79. {t('from_project_files')}
  80. </OLListGroupItem>
  81. {(hasLinkedProjectFileFeature || hasLinkedProjectOutputFileFeature) && (
  82. <OLListGroupItem
  83. onClick={() =>
  84. openFigureModal(FigureModalSource.OTHER_PROJECT, 'other-project')
  85. }
  86. >
  87. <BootstrapVersionSwitcher
  88. bs3={<Icon type="folder-open" fw />}
  89. bs5={<MaterialIcon type="folder_open" />}
  90. />
  91. {t('from_another_project')}
  92. </OLListGroupItem>
  93. )}
  94. {hasLinkUrlFeature && (
  95. <OLListGroupItem
  96. onClick={() =>
  97. openFigureModal(FigureModalSource.FROM_URL, 'from-url')
  98. }
  99. >
  100. <BootstrapVersionSwitcher
  101. bs3={<Icon type="globe" fw />}
  102. bs5={<MaterialIcon type="public" />}
  103. />
  104. {t('from_url')}
  105. </OLListGroupItem>
  106. )}
  107. </ToolbarButtonMenu>
  108. )
  109. })