toolbar-header.js 3.7 KB

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