file-tree-modal-create-file-body.jsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { useTranslation } from 'react-i18next'
  2. import FileTreeCreateNewDoc from './modes/file-tree-create-new-doc'
  3. import FileTreeImportFromUrl from './modes/file-tree-import-from-url'
  4. import FileTreeImportFromProject from './modes/file-tree-import-from-project'
  5. import FileTreeModalCreateFileMode from './file-tree-modal-create-file-mode'
  6. import FileTreeCreateNameProvider from '../../contexts/file-tree-create-name'
  7. import { useFileTreeActionable } from '../../contexts/file-tree-actionable'
  8. import { useFileTreeData } from '../../../../shared/context/file-tree-data-context'
  9. import importOverleafModules from '../../../../../macros/import-overleaf-module.macro'
  10. import { lazy, Suspense } from 'react'
  11. import { FullSizeLoadingSpinner } from '@/shared/components/loading-spinner'
  12. import getMeta from '@/utils/meta'
  13. const createFileModeModules = importOverleafModules('createFileModes')
  14. const FileTreeUploadDoc = lazy(() => import('./modes/file-tree-upload-doc'))
  15. export default function FileTreeModalCreateFileBody() {
  16. const { t } = useTranslation()
  17. const { newFileCreateMode } = useFileTreeActionable()
  18. const { fileCount } = useFileTreeData()
  19. const {
  20. hasLinkedProjectFileFeature,
  21. hasLinkedProjectOutputFileFeature,
  22. hasLinkUrlFeature,
  23. } = getMeta('ol-ExposedSettings')
  24. if (!fileCount || fileCount.status === 'error') {
  25. return null
  26. }
  27. return (
  28. <table>
  29. <tbody>
  30. <tr>
  31. <td className="modal-new-file-list">
  32. <ul className="list-unstyled">
  33. <FileTreeModalCreateFileMode
  34. mode="doc"
  35. icon="description"
  36. label={t('new_file')}
  37. />
  38. <FileTreeModalCreateFileMode
  39. mode="upload"
  40. icon="upload"
  41. label={t('upload')}
  42. />
  43. {(hasLinkedProjectFileFeature ||
  44. hasLinkedProjectOutputFileFeature) && (
  45. <FileTreeModalCreateFileMode
  46. mode="project"
  47. icon="folder_open"
  48. label={t('from_another_project')}
  49. />
  50. )}
  51. {hasLinkUrlFeature && (
  52. <FileTreeModalCreateFileMode
  53. mode="url"
  54. icon="globe"
  55. label={t('from_external_url')}
  56. />
  57. )}
  58. {createFileModeModules.map(
  59. ({ import: { CreateFileMode }, path }) => (
  60. <CreateFileMode key={path} />
  61. )
  62. )}
  63. </ul>
  64. </td>
  65. <td
  66. className={`modal-new-file-body modal-new-file-body-${newFileCreateMode}`}
  67. >
  68. {newFileCreateMode === 'doc' && (
  69. <FileTreeCreateNameProvider initialName="name.tex">
  70. <FileTreeCreateNewDoc />
  71. </FileTreeCreateNameProvider>
  72. )}
  73. {newFileCreateMode === 'url' && (
  74. <FileTreeCreateNameProvider>
  75. <FileTreeImportFromUrl />
  76. </FileTreeCreateNameProvider>
  77. )}
  78. {newFileCreateMode === 'project' && (
  79. <FileTreeCreateNameProvider>
  80. <FileTreeImportFromProject />
  81. </FileTreeCreateNameProvider>
  82. )}
  83. {newFileCreateMode === 'upload' && (
  84. <Suspense fallback={<FullSizeLoadingSpinner delay={500} />}>
  85. <FileTreeUploadDoc />
  86. </Suspense>
  87. )}
  88. {createFileModeModules.map(
  89. ({ import: { CreateFilePane }, path }) => (
  90. <CreateFilePane key={path} />
  91. )
  92. )}
  93. </td>
  94. </tr>
  95. </tbody>
  96. </table>
  97. )
  98. }