toolbar-header.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 ChatToggleButton from './chat-toggle-button'
  8. import LayoutDropdownButton from './layout-dropdown-button'
  9. import OnlineUsersWidget from './online-users-widget'
  10. import ProjectNameEditableLabel from './project-name-editable-label'
  11. import TrackChangesToggleButton from './track-changes-toggle-button'
  12. import HistoryToggleButton from './history-toggle-button'
  13. import ShareProjectButton from './share-project-button'
  14. import PdfToggleButton from './pdf-toggle-button'
  15. import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
  16. const [publishModalModules] = importOverleafModules('publishModal')
  17. const PublishButton = publishModalModules?.import.default
  18. const ToolbarHeader = React.memo(function ToolbarHeader({
  19. reattach,
  20. detach,
  21. detachMode,
  22. detachRole,
  23. cobranding,
  24. onShowLeftMenuClick,
  25. handleChangeLayout,
  26. chatIsOpen,
  27. toggleChatOpen,
  28. reviewPanelOpen,
  29. toggleReviewPanelOpen,
  30. historyIsOpen,
  31. toggleHistoryOpen,
  32. unreadMessageCount,
  33. onlineUsers,
  34. goToUser,
  35. isRestrictedTokenMember,
  36. hasPublishPermissions,
  37. projectName,
  38. renameProject,
  39. hasRenamePermissions,
  40. openShareModal,
  41. pdfLayout,
  42. pdfViewIsOpen,
  43. pdfButtonIsVisible,
  44. togglePdfView,
  45. trackChangesVisible,
  46. view,
  47. }) {
  48. const { t } = useTranslation()
  49. const shouldDisplayPublishButton = hasPublishPermissions && PublishButton
  50. const shouldDisplayTrackChangesButton =
  51. trackChangesVisible && !isRestrictedTokenMember
  52. return (
  53. <header
  54. className="toolbar toolbar-header toolbar-with-labels"
  55. role="navigation"
  56. aria-label={t('project_layout_sharing_submission')}
  57. >
  58. <div className="toolbar-left">
  59. <MenuButton onClick={onShowLeftMenuClick} />
  60. {cobranding && cobranding.logoImgUrl && (
  61. <CobrandingLogo {...cobranding} />
  62. )}
  63. <BackToProjectsButton />
  64. </div>
  65. {!window.showPdfDetach && pdfButtonIsVisible && (
  66. <PdfToggleButton
  67. onClick={togglePdfView}
  68. pdfViewIsOpen={pdfViewIsOpen}
  69. />
  70. )}
  71. <ProjectNameEditableLabel
  72. className="toolbar-center"
  73. projectName={projectName}
  74. hasRenamePermissions={hasRenamePermissions}
  75. onChange={renameProject}
  76. />
  77. <div className="toolbar-right">
  78. <OnlineUsersWidget onlineUsers={onlineUsers} goToUser={goToUser} />
  79. {window.showPdfDetach && (
  80. <LayoutDropdownButton
  81. reattach={reattach}
  82. detach={detach}
  83. handleChangeLayout={handleChangeLayout}
  84. detachMode={detachMode}
  85. detachRole={detachRole}
  86. pdfLayout={pdfLayout}
  87. view={view}
  88. />
  89. )}
  90. {shouldDisplayTrackChangesButton && (
  91. <TrackChangesToggleButton
  92. onClick={toggleReviewPanelOpen}
  93. disabled={historyIsOpen}
  94. trackChangesIsOpen={reviewPanelOpen}
  95. />
  96. )}
  97. <ShareProjectButton onClick={openShareModal} />
  98. {shouldDisplayPublishButton && (
  99. <PublishButton cobranding={cobranding} />
  100. )}
  101. {!isRestrictedTokenMember && (
  102. <>
  103. <HistoryToggleButton
  104. historyIsOpen={historyIsOpen}
  105. onClick={toggleHistoryOpen}
  106. />
  107. <ChatToggleButton
  108. chatIsOpen={chatIsOpen}
  109. onClick={toggleChatOpen}
  110. unreadMessageCount={unreadMessageCount}
  111. />
  112. </>
  113. )}
  114. </div>
  115. </header>
  116. )
  117. })
  118. ToolbarHeader.propTypes = {
  119. reattach: PropTypes.func.isRequired,
  120. detach: PropTypes.func.isRequired,
  121. detachMode: PropTypes.string,
  122. detachRole: PropTypes.string,
  123. onShowLeftMenuClick: PropTypes.func.isRequired,
  124. handleChangeLayout: PropTypes.func.isRequired,
  125. cobranding: PropTypes.object,
  126. chatIsOpen: PropTypes.bool,
  127. toggleChatOpen: PropTypes.func.isRequired,
  128. reviewPanelOpen: PropTypes.bool,
  129. toggleReviewPanelOpen: PropTypes.func.isRequired,
  130. historyIsOpen: PropTypes.bool,
  131. toggleHistoryOpen: PropTypes.func.isRequired,
  132. unreadMessageCount: PropTypes.number.isRequired,
  133. onlineUsers: PropTypes.array.isRequired,
  134. goToUser: PropTypes.func.isRequired,
  135. isRestrictedTokenMember: PropTypes.bool,
  136. hasPublishPermissions: PropTypes.bool,
  137. projectName: PropTypes.string.isRequired,
  138. renameProject: PropTypes.func.isRequired,
  139. hasRenamePermissions: PropTypes.bool,
  140. openShareModal: PropTypes.func.isRequired,
  141. pdfLayout: PropTypes.string.isRequired,
  142. pdfViewIsOpen: PropTypes.bool,
  143. pdfButtonIsVisible: PropTypes.bool,
  144. togglePdfView: PropTypes.func.isRequired,
  145. trackChangesVisible: PropTypes.bool,
  146. view: PropTypes.string,
  147. }
  148. export default ToolbarHeader