insert-figure-dropdown.tsx 2.9 KB

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