project-title.tsx 3.1 KB

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