insert-figure-dropdown.tsx 2.2 KB

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