toolbar-header.jsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. const [publishModalModules] = importOverleafModules('publishModal')
  17. const PublishButton = publishModalModules?.import.default
  18. const ToolbarHeader = React.memo(function ToolbarHeader({
  19. cobranding,
  20. onShowLeftMenuClick,
  21. chatIsOpen,
  22. toggleChatOpen,
  23. reviewPanelOpen,
  24. toggleReviewPanelOpen,
  25. historyIsOpen,
  26. toggleHistoryOpen,
  27. unreadMessageCount,
  28. onlineUsers,
  29. goToUser,
  30. isRestrictedTokenMember,
  31. hasPublishPermissions,
  32. projectName,
  33. renameProject,
  34. hasRenamePermissions,
  35. openShareModal,
  36. trackChangesVisible,
  37. }) {
  38. const { t } = useTranslation()
  39. const shouldDisplayPublishButton = hasPublishPermissions && PublishButton
  40. return (
  41. <header
  42. className="toolbar toolbar-header toolbar-with-labels"
  43. role="navigation"
  44. aria-label={t('project_layout_sharing_submission')}
  45. >
  46. <div className="toolbar-left">
  47. <MenuButton onClick={onShowLeftMenuClick} />
  48. {cobranding && cobranding.logoImgUrl && (
  49. <CobrandingLogo {...cobranding} />
  50. )}
  51. <BackToProjectsButton />
  52. </div>
  53. {window.showUpgradePrompt && <UpgradePrompt />}
  54. <ProjectNameEditableLabel
  55. className="toolbar-center"
  56. projectName={projectName}
  57. hasRenamePermissions={hasRenamePermissions}
  58. onChange={renameProject}
  59. />
  60. <div className="toolbar-right">
  61. <OnlineUsersWidget onlineUsers={onlineUsers} goToUser={goToUser} />
  62. {trackChangesVisible && (
  63. <TrackChangesToggleButton
  64. onMouseDown={toggleReviewPanelOpen}
  65. disabled={historyIsOpen}
  66. trackChangesIsOpen={reviewPanelOpen}
  67. />
  68. )}
  69. <ShareProjectButton onClick={openShareModal} />
  70. {shouldDisplayPublishButton && (
  71. <PublishButton cobranding={cobranding} />
  72. )}
  73. {!isRestrictedTokenMember && (
  74. <HistoryToggleButton
  75. historyIsOpen={historyIsOpen}
  76. onClick={toggleHistoryOpen}
  77. />
  78. )}
  79. <LayoutDropdownButton />
  80. {!isRestrictedTokenMember && (
  81. <ChatToggleButton
  82. chatIsOpen={chatIsOpen}
  83. onClick={toggleChatOpen}
  84. unreadMessageCount={unreadMessageCount}
  85. />
  86. )}
  87. </div>
  88. </header>
  89. )
  90. })
  91. ToolbarHeader.propTypes = {
  92. onShowLeftMenuClick: PropTypes.func.isRequired,
  93. cobranding: PropTypes.object,
  94. chatIsOpen: PropTypes.bool,
  95. toggleChatOpen: PropTypes.func.isRequired,
  96. reviewPanelOpen: PropTypes.bool,
  97. toggleReviewPanelOpen: PropTypes.func.isRequired,
  98. historyIsOpen: PropTypes.bool,
  99. toggleHistoryOpen: PropTypes.func.isRequired,
  100. unreadMessageCount: PropTypes.number.isRequired,
  101. onlineUsers: PropTypes.array.isRequired,
  102. goToUser: PropTypes.func.isRequired,
  103. isRestrictedTokenMember: PropTypes.bool,
  104. hasPublishPermissions: PropTypes.bool,
  105. projectName: PropTypes.string.isRequired,
  106. renameProject: PropTypes.func.isRequired,
  107. hasRenamePermissions: PropTypes.bool,
  108. openShareModal: PropTypes.func.isRequired,
  109. trackChangesVisible: PropTypes.bool,
  110. }
  111. export default ToolbarHeader