insert-figure-dropdown.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { ToolbarButtonMenu } from './button-menu'
  2. import MaterialIcon from '@/shared/components/material-icon'
  3. import OLListGroupItem from '@/shared/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 sparkleWhite from '@/shared/svgs/sparkle-small-white.svg'
  11. import sparkle from '@/shared/svgs/ai-sparkle-text.svg'
  12. import getMeta from '@/utils/meta'
  13. import { usePermissionsContext } from '@/features/ide-react/context/permissions-context'
  14. import { ToolbarButton } from './toolbar-button'
  15. import { useEditorContext } from '@/shared/context/editor-context'
  16. import { isSplitTestEnabled } from '@/utils/splitTestUtils'
  17. export const InsertFigureDropdown = memo(function InsertFigureDropdown() {
  18. const { t } = useTranslation()
  19. const view = useCodeMirrorViewContext()
  20. const { writefullInstance } = useEditorContext()
  21. const { write } = usePermissionsContext()
  22. const openFigureModal = useCallback(
  23. (source: FigureModalSource, sourceName: string) => {
  24. emitToolbarEvent(view, `toolbar-figure-modal-${sourceName}`)
  25. window.dispatchEvent(
  26. new CustomEvent('figure-modal:open', {
  27. detail: { source },
  28. })
  29. )
  30. },
  31. [view]
  32. )
  33. const {
  34. hasLinkedProjectFileFeature,
  35. hasLinkedProjectOutputFileFeature,
  36. hasLinkUrlFeature,
  37. } = getMeta('ol-ExposedSettings')
  38. const hasGenerateFromTextFeature =
  39. writefullInstance !== null &&
  40. isSplitTestEnabled('writefull-figure-generator')
  41. if (!write) {
  42. return (
  43. <ToolbarButton
  44. id="toolbar-figure"
  45. label={t('toolbar_insert_figure')}
  46. command={() =>
  47. openFigureModal(FigureModalSource.FILE_TREE, 'current-project')
  48. }
  49. icon="add_photo_alternate"
  50. />
  51. )
  52. }
  53. return (
  54. <ToolbarButtonMenu
  55. id="toolbar-figure"
  56. label={t('toolbar_insert_figure')}
  57. icon={<MaterialIcon type="add_photo_alternate" />}
  58. altCommand={insertFigure}
  59. >
  60. <OLListGroupItem
  61. onClick={() =>
  62. openFigureModal(FigureModalSource.FILE_UPLOAD, 'file-upload')
  63. }
  64. >
  65. <MaterialIcon type="upload" />
  66. {t('upload_from_computer')}
  67. </OLListGroupItem>
  68. <OLListGroupItem
  69. onClick={() =>
  70. openFigureModal(FigureModalSource.FILE_TREE, 'current-project')
  71. }
  72. >
  73. <MaterialIcon type="inbox" />
  74. {t('from_project_files')}
  75. </OLListGroupItem>
  76. {(hasLinkedProjectFileFeature || hasLinkedProjectOutputFileFeature) && (
  77. <OLListGroupItem
  78. onClick={() =>
  79. openFigureModal(FigureModalSource.OTHER_PROJECT, 'other-project')
  80. }
  81. >
  82. <MaterialIcon type="folder_open" />
  83. {t('from_another_project')}
  84. </OLListGroupItem>
  85. )}
  86. {hasLinkUrlFeature && (
  87. <OLListGroupItem
  88. onClick={() =>
  89. openFigureModal(FigureModalSource.FROM_URL, 'from-url')
  90. }
  91. >
  92. <MaterialIcon type="public" />
  93. {t('from_url')}
  94. </OLListGroupItem>
  95. )}
  96. {hasGenerateFromTextFeature && (
  97. <OLListGroupItem
  98. onClick={() => {
  99. writefullInstance!.openFigureGenerator()
  100. }}
  101. >
  102. <img
  103. alt="sparkle"
  104. className="ol-cm-toolbar-ai-sparkle-gradient"
  105. src={sparkle}
  106. aria-hidden="true"
  107. />
  108. <img
  109. alt="sparkle"
  110. className="ol-cm-toolbar-ai-sparkle-white"
  111. src={sparkleWhite}
  112. aria-hidden="true"
  113. />
  114. <span>{t('generate_from_text')}</span>
  115. </OLListGroupItem>
  116. )}
  117. </ToolbarButtonMenu>
  118. )
  119. })