project-title.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 {
  14. DownloadProjectPDF,
  15. DownloadProjectZip,
  16. ExportProjectDocx,
  17. ExportProjectMarkdown,
  18. } from './download-project'
  19. import { useCallback, useState } from 'react'
  20. import OLDropdownMenuItem from '@/shared/components/ol/ol-dropdown-menu-item'
  21. import EditableLabel from './editable-label'
  22. import { DuplicateProject } from './duplicate-project'
  23. const [publishModalModules] = importOverleafModules('publishModal')
  24. const SubmitProjectButton = publishModalModules?.import.NewPublishDropdownButton
  25. export const ToolbarProjectTitle = () => {
  26. const { cobranding } = useEditorContext()
  27. const { t } = useTranslation()
  28. const { renameProject } = useEditorContext()
  29. const { permissionsLevel } = useIdeReactContext()
  30. const { name } = useProjectContext()
  31. const shouldDisplaySubmitButton =
  32. (permissionsLevel === 'owner' || permissionsLevel === 'readAndWrite') &&
  33. SubmitProjectButton
  34. const hasRenamePermissions = permissionsLevel === 'owner'
  35. const [isRenaming, setIsRenaming] = useState(false)
  36. const onRename = useCallback(
  37. (name: string) => {
  38. if (name) {
  39. renameProject(name)
  40. }
  41. setIsRenaming(false)
  42. },
  43. [renameProject]
  44. )
  45. const onCancel = useCallback(() => {
  46. setIsRenaming(false)
  47. }, [])
  48. if (isRenaming) {
  49. return (
  50. <EditableLabel
  51. onChange={onRename}
  52. onCancel={onCancel}
  53. initialText={name}
  54. maxLength={150}
  55. className="ide-redesign-toolbar-editable-project-name"
  56. />
  57. )
  58. }
  59. return (
  60. <Dropdown align="end" className="ide-redesign-toolbar-project-dropdown">
  61. <DropdownToggle
  62. id="project-title-options"
  63. aria-label={t('project_title_options')}
  64. className="ide-redesign-toolbar-project-dropdown-toggle ide-redesign-toolbar-dropdown-toggle-subdued fw-bold ide-redesign-toolbar-button-subdued"
  65. >
  66. <span className="ide-redesign-toolbar-project-name" translate="no">
  67. {name}
  68. </span>
  69. <MaterialIcon type="keyboard_arrow_down" />
  70. </DropdownToggle>
  71. <DropdownMenu renderOnMount>
  72. {shouldDisplaySubmitButton && !cobranding && (
  73. <>
  74. <SubmitProjectButton />
  75. <DropdownDivider />
  76. </>
  77. )}
  78. <DownloadProjectPDF />
  79. <DownloadProjectZip />
  80. <ExportProjectDocx />
  81. <ExportProjectMarkdown />
  82. <DropdownDivider />
  83. <DuplicateProject />
  84. <OLDropdownMenuItem
  85. onClick={() => {
  86. setIsRenaming(true)
  87. }}
  88. disabled={!hasRenamePermissions}
  89. >
  90. {t('rename')}
  91. </OLDropdownMenuItem>
  92. </DropdownMenu>
  93. </Dropdown>
  94. )
  95. }