toolbar-header.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. cobranding,
  20. onShowLeftMenuClick,
  21. handleChangeLayout,
  22. chatIsOpen,
  23. toggleChatOpen,
  24. reviewPanelOpen,
  25. toggleReviewPanelOpen,
  26. historyIsOpen,
  27. toggleHistoryOpen,
  28. unreadMessageCount,
  29. onlineUsers,
  30. goToUser,
  31. isRestrictedTokenMember,
  32. hasPublishPermissions,
  33. projectName,
  34. renameProject,
  35. hasRenamePermissions,
  36. openShareModal,
  37. pdfLayout,
  38. pdfViewIsOpen,
  39. pdfButtonIsVisible,
  40. togglePdfView,
  41. trackChangesVisible,
  42. view,
  43. }) {
  44. const { t } = useTranslation()
  45. const shouldDisplayPublishButton = hasPublishPermissions && PublishButton
  46. const shouldDisplayTrackChangesButton =
  47. trackChangesVisible && !isRestrictedTokenMember
  48. return (
  49. <header
  50. className="toolbar toolbar-header toolbar-with-labels"
  51. role="navigation"
  52. aria-label={t('project_layout_sharing_submission')}
  53. >
  54. <div className="toolbar-left">
  55. <MenuButton onClick={onShowLeftMenuClick} />
  56. {cobranding && cobranding.logoImgUrl && (
  57. <CobrandingLogo {...cobranding} />
  58. )}
  59. <BackToProjectsButton />
  60. </div>
  61. {pdfButtonIsVisible && (
  62. <PdfToggleButton
  63. onClick={togglePdfView}
  64. pdfViewIsOpen={pdfViewIsOpen}
  65. />
  66. )}
  67. <ProjectNameEditableLabel
  68. className="toolbar-center"
  69. projectName={projectName}
  70. hasRenamePermissions={hasRenamePermissions}
  71. onChange={renameProject}
  72. />
  73. <div className="toolbar-right">
  74. <OnlineUsersWidget onlineUsers={onlineUsers} goToUser={goToUser} />
  75. {window.showPdfDetach && (
  76. <LayoutDropdownButton
  77. handleChangeLayout={handleChangeLayout}
  78. pdfLayout={pdfLayout}
  79. view={view}
  80. />
  81. )}
  82. {shouldDisplayTrackChangesButton && (
  83. <TrackChangesToggleButton
  84. onClick={toggleReviewPanelOpen}
  85. disabled={historyIsOpen}
  86. trackChangesIsOpen={reviewPanelOpen}
  87. />
  88. )}
  89. <ShareProjectButton onClick={openShareModal} />
  90. {shouldDisplayPublishButton && (
  91. <PublishButton cobranding={cobranding} />
  92. )}
  93. {!isRestrictedTokenMember && (
  94. <>
  95. <HistoryToggleButton
  96. historyIsOpen={historyIsOpen}
  97. onClick={toggleHistoryOpen}
  98. />
  99. <ChatToggleButton
  100. chatIsOpen={chatIsOpen}
  101. onClick={toggleChatOpen}
  102. unreadMessageCount={unreadMessageCount}
  103. />
  104. </>
  105. )}
  106. </div>
  107. </header>
  108. )
  109. })
  110. ToolbarHeader.propTypes = {
  111. onShowLeftMenuClick: PropTypes.func.isRequired,
  112. handleChangeLayout: PropTypes.func.isRequired,
  113. cobranding: PropTypes.object,
  114. chatIsOpen: PropTypes.bool,
  115. toggleChatOpen: PropTypes.func.isRequired,
  116. reviewPanelOpen: PropTypes.bool,
  117. toggleReviewPanelOpen: PropTypes.func.isRequired,
  118. historyIsOpen: PropTypes.bool,
  119. toggleHistoryOpen: PropTypes.func.isRequired,
  120. unreadMessageCount: PropTypes.number.isRequired,
  121. onlineUsers: PropTypes.array.isRequired,
  122. goToUser: PropTypes.func.isRequired,
  123. isRestrictedTokenMember: PropTypes.bool,
  124. hasPublishPermissions: PropTypes.bool,
  125. projectName: PropTypes.string.isRequired,
  126. renameProject: PropTypes.func.isRequired,
  127. hasRenamePermissions: PropTypes.bool,
  128. openShareModal: PropTypes.func.isRequired,
  129. pdfLayout: PropTypes.string.isRequired,
  130. pdfViewIsOpen: PropTypes.bool,
  131. pdfButtonIsVisible: PropTypes.bool,
  132. togglePdfView: PropTypes.func.isRequired,
  133. trackChangesVisible: PropTypes.bool,
  134. view: PropTypes.string,
  135. }
  136. export default ToolbarHeader