root-document-setting.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { useProjectSettingsContext } from '@/features/editor-left-menu/context/project-settings-context'
  2. import DropdownSetting from '../dropdown-setting'
  3. import { useMemo } from 'react'
  4. import type { Option } from '../dropdown-setting'
  5. import { useTranslation } from 'react-i18next'
  6. import { usePermissionsContext } from '@/features/ide-react/context/permissions-context'
  7. import { useFileTreeData } from '@/shared/context/file-tree-data-context'
  8. import { isValidTeXFile } from '@/main/is-valid-tex-file'
  9. import { useSetCompilationSettingWithEvent } from '@/features/editor-left-menu/hooks/use-set-compilation-setting'
  10. export default function RootDocumentSetting() {
  11. const { rootDocId, setRootDocId } = useProjectSettingsContext()
  12. const { t } = useTranslation()
  13. const { write } = usePermissionsContext()
  14. const { docs } = useFileTreeData()
  15. const changeRootDocId = useSetCompilationSettingWithEvent(
  16. 'root-doc-id',
  17. setRootDocId,
  18. { omitValueInEvent: true }
  19. )
  20. const validDocsOptions = useMemo(() => {
  21. const filteredDocs =
  22. docs?.filter(
  23. doc => isValidTeXFile(doc.doc.name) || rootDocId === doc.doc.id
  24. ) ?? []
  25. const mappedDocs: Array<Option> = filteredDocs.map(doc => ({
  26. value: doc.doc.id,
  27. label: doc.path,
  28. }))
  29. if (!rootDocId) {
  30. mappedDocs.unshift({
  31. value: '',
  32. label: 'None',
  33. disabled: true,
  34. })
  35. }
  36. return mappedDocs
  37. }, [docs, rootDocId])
  38. return (
  39. <DropdownSetting
  40. id="rootDocId"
  41. label={t('main_document')}
  42. description={`${t('the_primary_file_for_compiling_your_project')} ${t('you_can_also_right_click_a_file_to_set_it_as_main')}`}
  43. disabled={!write}
  44. options={validDocsOptions}
  45. onChange={changeRootDocId}
  46. value={rootDocId ?? ''}
  47. translateOptions="no"
  48. />
  49. )
  50. }