project-title.tsx 3.0 KB

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