project-title.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import {
  2. Dropdown,
  3. DropdownDivider,
  4. DropdownMenu,
  5. DropdownToggle,
  6. } from '@/shared/components/dropdown/dropdown-menu'
  7. import MaterialIcon from '@/shared/components/material-icon'
  8. import { useProjectContext } from '@/shared/context/project-context'
  9. import { useTranslation } from 'react-i18next'
  10. import importOverleafModules from '../../../../../macros/import-overleaf-module.macro'
  11. import { useEditorContext } from '@/shared/context/editor-context'
  12. import { useIdeReactContext } from '@/features/ide-react/context/ide-react-context'
  13. import { DownloadProjectPDF, DownloadProjectZip } from './download-project'
  14. import { useCallback, useState } from 'react'
  15. import OLDropdownMenuItem from '@/shared/components/ol/ol-dropdown-menu-item'
  16. import EditableLabel from './editable-label'
  17. import { DuplicateProject } from './duplicate-project'
  18. import { ExportProjectWithConversionButton } from './export-project-with-conversion-button'
  19. const [publishModalModules] = importOverleafModules('publishModal')
  20. const SubmitProjectButton = publishModalModules?.import.NewPublishDropdownButton
  21. export const ToolbarProjectTitle = () => {
  22. const { cobranding } = useEditorContext()
  23. const { t } = useTranslation()
  24. const { renameProject } = useEditorContext()
  25. const { permissionsLevel } = useIdeReactContext()
  26. const { name } = useProjectContext()
  27. const shouldDisplaySubmitButton =
  28. (permissionsLevel === 'owner' || permissionsLevel === 'readAndWrite') &&
  29. SubmitProjectButton
  30. const hasRenamePermissions = permissionsLevel === 'owner'
  31. const [isRenaming, setIsRenaming] = useState(false)
  32. const onRename = useCallback(
  33. (name: string) => {
  34. if (name) {
  35. renameProject(name)
  36. }
  37. setIsRenaming(false)
  38. },
  39. [renameProject]
  40. )
  41. const onCancel = useCallback(() => {
  42. setIsRenaming(false)
  43. }, [])
  44. if (isRenaming) {
  45. return (
  46. <EditableLabel
  47. onChange={onRename}
  48. onCancel={onCancel}
  49. initialText={name}
  50. maxLength={150}
  51. className="ide-redesign-toolbar-editable-project-name"
  52. />
  53. )
  54. }
  55. return (
  56. <Dropdown align="end" className="ide-redesign-toolbar-project-dropdown">
  57. <DropdownToggle
  58. id="project-title-options"
  59. aria-label={t('project_title_options')}
  60. className="ide-redesign-toolbar-project-dropdown-toggle ide-redesign-toolbar-dropdown-toggle-subdued fw-bold ide-redesign-toolbar-button-subdued"
  61. >
  62. <span className="ide-redesign-toolbar-project-name" translate="no">
  63. {name}
  64. </span>
  65. <MaterialIcon type="keyboard_arrow_down" />
  66. </DropdownToggle>
  67. <DropdownMenu renderOnMount>
  68. {shouldDisplaySubmitButton && !cobranding && (
  69. <>
  70. <SubmitProjectButton />
  71. <DropdownDivider />
  72. </>
  73. )}
  74. <DownloadProjectPDF />
  75. <DownloadProjectZip />
  76. <ExportProjectWithConversionButton
  77. featureFlag="export-docx"
  78. conversionType="docx"
  79. label={t('export_as_docx')}
  80. menuBarId="export-as-docx"
  81. />
  82. <ExportProjectWithConversionButton
  83. featureFlag="export-markdown"
  84. conversionType="markdown"
  85. label={t('export_as_markdown')}
  86. menuBarId="export-as-markdown"
  87. />
  88. <ExportProjectWithConversionButton
  89. featureFlag="export-html"
  90. conversionType="html"
  91. label={t('export_as_html')}
  92. menuBarId="export-as-html"
  93. />
  94. <DropdownDivider />
  95. <DuplicateProject />
  96. <OLDropdownMenuItem
  97. onClick={() => {
  98. setIsRenaming(true)
  99. }}
  100. disabled={!hasRenamePermissions}
  101. >
  102. {t('rename')}
  103. </OLDropdownMenuItem>
  104. </DropdownMenu>
  105. </Dropdown>
  106. )
  107. }