toolbar-header.jsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import React from 'react'
  2. import PropTypes from 'prop-types'
  3. import { useTranslation } from 'react-i18next'
  4. import MenuButton from './menu-button'
  5. import CobrandingLogo from './cobranding-logo'
  6. import BackToProjectsButton from './back-to-projects-button'
  7. import UpgradePrompt from './upgrade-prompt'
  8. import ChatToggleButton from './chat-toggle-button'
  9. import LayoutDropdownButton from './layout-dropdown-button'
  10. import OnlineUsersWidget from './online-users-widget'
  11. import ProjectNameEditableLabel from './project-name-editable-label'
  12. import TrackChangesToggleButton from './track-changes-toggle-button'
  13. import HistoryToggleButton from './history-toggle-button'
  14. import ShareProjectButton from './share-project-button'
  15. import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
  16. import BackToEditorButton from './back-to-editor-button'
  17. import getMeta from '@/utils/meta'
  18. const [publishModalModules] = importOverleafModules('publishModal')
  19. const PublishButton = publishModalModules?.import.default
  20. const ToolbarHeader = React.memo(function ToolbarHeader({
  21. cobranding,
  22. onShowLeftMenuClick,
  23. chatIsOpen,
  24. toggleChatOpen,
  25. reviewPanelOpen,
  26. toggleReviewPanelOpen,
  27. historyIsOpen,
  28. toggleHistoryOpen,
  29. unreadMessageCount,
  30. onlineUsers,
  31. goToUser,
  32. isRestrictedTokenMember,
  33. hasPublishPermissions,
  34. chatVisible,
  35. projectName,
  36. renameProject,
  37. hasRenamePermissions,
  38. openShareModal,
  39. trackChangesVisible,
  40. }) {
  41. const { t } = useTranslation()
  42. const shouldDisplayPublishButton = hasPublishPermissions && PublishButton
  43. return (
  44. <header
  45. className="toolbar toolbar-header toolbar-with-labels"
  46. role="navigation"
  47. aria-label={t('project_layout_sharing_submission')}
  48. >
  49. <div className="toolbar-left">
  50. <MenuButton onClick={onShowLeftMenuClick} />
  51. {cobranding && cobranding.logoImgUrl && (
  52. <CobrandingLogo {...cobranding} />
  53. )}
  54. <BackToProjectsButton />
  55. </div>
  56. {getMeta('ol-showUpgradePrompt') && <UpgradePrompt />}
  57. <ProjectNameEditableLabel
  58. className="toolbar-center"
  59. projectName={projectName}
  60. hasRenamePermissions={hasRenamePermissions}
  61. onChange={renameProject}
  62. />
  63. <div className="toolbar-right">
  64. <OnlineUsersWidget onlineUsers={onlineUsers} goToUser={goToUser} />
  65. {historyIsOpen ? (
  66. <BackToEditorButton onClick={toggleHistoryOpen} />
  67. ) : (
  68. <>
  69. {trackChangesVisible && (
  70. <TrackChangesToggleButton
  71. onMouseDown={toggleReviewPanelOpen}
  72. disabled={historyIsOpen}
  73. trackChangesIsOpen={reviewPanelOpen}
  74. />
  75. )}
  76. <ShareProjectButton onClick={openShareModal} />
  77. {shouldDisplayPublishButton && (
  78. <PublishButton cobranding={cobranding} />
  79. )}
  80. {!isRestrictedTokenMember && (
  81. <HistoryToggleButton onClick={toggleHistoryOpen} />
  82. )}
  83. <LayoutDropdownButton />
  84. {chatVisible && (
  85. <ChatToggleButton
  86. chatIsOpen={chatIsOpen}
  87. onClick={toggleChatOpen}
  88. unreadMessageCount={unreadMessageCount}
  89. />
  90. )}
  91. </>
  92. )}
  93. </div>
  94. </header>
  95. )
  96. })
  97. ToolbarHeader.propTypes = {
  98. onShowLeftMenuClick: PropTypes.func.isRequired,
  99. cobranding: PropTypes.object,
  100. chatIsOpen: PropTypes.bool,
  101. toggleChatOpen: PropTypes.func.isRequired,
  102. reviewPanelOpen: PropTypes.bool,
  103. toggleReviewPanelOpen: PropTypes.func.isRequired,
  104. historyIsOpen: PropTypes.bool,
  105. toggleHistoryOpen: PropTypes.func.isRequired,
  106. unreadMessageCount: PropTypes.number.isRequired,
  107. onlineUsers: PropTypes.array.isRequired,
  108. goToUser: PropTypes.func.isRequired,
  109. isRestrictedTokenMember: PropTypes.bool,
  110. hasPublishPermissions: PropTypes.bool,
  111. chatVisible: PropTypes.bool,
  112. projectName: PropTypes.string.isRequired,
  113. renameProject: PropTypes.func.isRequired,
  114. hasRenamePermissions: PropTypes.bool,
  115. openShareModal: PropTypes.func.isRequired,
  116. trackChangesVisible: PropTypes.bool,
  117. }
  118. export default ToolbarHeader