figure-modal-source-picker.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { FC } from 'react'
  2. import {
  3. FigureModalSource,
  4. useFigureModalContext,
  5. } from './figure-modal-context'
  6. import { useTranslation } from 'react-i18next'
  7. import getMeta from '@/utils/meta'
  8. import MaterialIcon from '@/shared/components/material-icon'
  9. import { usePermissionsContext } from '@/features/ide-react/context/permissions-context'
  10. export const FigureModalSourcePicker: FC = () => {
  11. const { t } = useTranslation()
  12. const {
  13. hasLinkedProjectFileFeature,
  14. hasLinkedProjectOutputFileFeature,
  15. hasLinkUrlFeature,
  16. } = getMeta('ol-ExposedSettings')
  17. const { write } = usePermissionsContext()
  18. return (
  19. <div className="figure-modal-source-button-grid">
  20. {write && (
  21. <FigureModalSourceButton
  22. type={FigureModalSource.FILE_UPLOAD}
  23. title={t('replace_from_computer')}
  24. icon="upload"
  25. />
  26. )}
  27. <FigureModalSourceButton
  28. type={FigureModalSource.FILE_TREE}
  29. title={t('replace_from_project_files')}
  30. icon="inbox"
  31. />
  32. {write &&
  33. (hasLinkedProjectFileFeature || hasLinkedProjectOutputFileFeature) && (
  34. <FigureModalSourceButton
  35. type={FigureModalSource.OTHER_PROJECT}
  36. title={t('replace_from_another_project')}
  37. icon="folder_open"
  38. />
  39. )}
  40. {write && hasLinkUrlFeature && (
  41. <FigureModalSourceButton
  42. type={FigureModalSource.FROM_URL}
  43. title={t('replace_from_url')}
  44. icon="public"
  45. />
  46. )}
  47. </div>
  48. )
  49. }
  50. const FigureModalSourceButton: FC<{
  51. type: FigureModalSource
  52. title: string
  53. icon: string
  54. }> = ({ type, title, icon }) => {
  55. const { dispatch } = useFigureModalContext()
  56. return (
  57. <button
  58. type="button"
  59. className="figure-modal-source-button"
  60. onClick={() => {
  61. dispatch({ source: type, sourcePickerShown: false, getPath: undefined })
  62. }}
  63. >
  64. <MaterialIcon type={icon} className="figure-modal-source-button-icon" />
  65. <span className="figure-modal-source-button-title">{title}</span>
  66. <MaterialIcon type="chevron_right" />
  67. </button>
  68. )
  69. }