editor-navigation-toolbar-root.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import React, { useCallback } from 'react'
  2. import PropTypes from 'prop-types'
  3. import ToolbarHeader from './toolbar-header'
  4. import { useEditorContext } from '../../../shared/context/editor-context'
  5. import { useChatContext } from '../../chat/context/chat-context'
  6. import { useLayoutContext } from '../../../shared/context/layout-context'
  7. import { useProjectContext } from '../../../shared/context/project-context'
  8. const projectContextPropTypes = {
  9. name: PropTypes.string.isRequired,
  10. }
  11. const editorContextPropTypes = {
  12. cobranding: PropTypes.object,
  13. loading: PropTypes.bool,
  14. isRestrictedTokenMember: PropTypes.bool,
  15. renameProject: PropTypes.func.isRequired,
  16. isProjectOwner: PropTypes.bool,
  17. permissionsLevel: PropTypes.string,
  18. }
  19. const layoutContextPropTypes = {
  20. chatIsOpen: PropTypes.bool,
  21. setChatIsOpen: PropTypes.func.isRequired,
  22. reviewPanelOpen: PropTypes.bool,
  23. setReviewPanelOpen: PropTypes.func.isRequired,
  24. view: PropTypes.string,
  25. setView: PropTypes.func.isRequired,
  26. setLeftMenuShown: PropTypes.func.isRequired,
  27. pdfLayout: PropTypes.string.isRequired,
  28. }
  29. const chatContextPropTypes = {
  30. markMessagesAsRead: PropTypes.func.isRequired,
  31. unreadMessageCount: PropTypes.number.isRequired,
  32. }
  33. const EditorNavigationToolbarRoot = React.memo(
  34. function EditorNavigationToolbarRoot({
  35. onlineUsersArray,
  36. openDoc,
  37. openShareProjectModal,
  38. }) {
  39. const { name: projectName } = useProjectContext(projectContextPropTypes)
  40. const {
  41. cobranding,
  42. loading,
  43. isRestrictedTokenMember,
  44. renameProject,
  45. isProjectOwner,
  46. permissionsLevel,
  47. } = useEditorContext(editorContextPropTypes)
  48. const {
  49. chatIsOpen,
  50. setChatIsOpen,
  51. reviewPanelOpen,
  52. setReviewPanelOpen,
  53. view,
  54. setView,
  55. setLeftMenuShown,
  56. pdfLayout,
  57. } = useLayoutContext(layoutContextPropTypes)
  58. const { markMessagesAsRead, unreadMessageCount } = useChatContext(
  59. chatContextPropTypes
  60. )
  61. const toggleChatOpen = useCallback(() => {
  62. if (!chatIsOpen) {
  63. markMessagesAsRead()
  64. }
  65. setChatIsOpen(value => !value)
  66. }, [chatIsOpen, setChatIsOpen, markMessagesAsRead])
  67. const toggleReviewPanelOpen = useCallback(
  68. () => setReviewPanelOpen(value => !value),
  69. [setReviewPanelOpen]
  70. )
  71. const toggleHistoryOpen = useCallback(() => {
  72. setView(view === 'history' ? 'editor' : 'history')
  73. }, [view, setView])
  74. const togglePdfView = useCallback(() => {
  75. setView(view === 'pdf' ? 'editor' : 'pdf')
  76. }, [view, setView])
  77. const openShareModal = useCallback(() => {
  78. openShareProjectModal(isProjectOwner)
  79. }, [openShareProjectModal, isProjectOwner])
  80. const onShowLeftMenuClick = useCallback(
  81. () => setLeftMenuShown(value => !value),
  82. [setLeftMenuShown]
  83. )
  84. const goToUser = useCallback(
  85. user => {
  86. if (user.doc && typeof user.row === 'number') {
  87. openDoc(user.doc, { gotoLine: user.row + 1 })
  88. }
  89. },
  90. [openDoc]
  91. )
  92. // using {display: 'none'} as 1:1 migration from Angular's ng-hide. Using
  93. // `loading ? null : <ToolbarHeader/>` causes UI glitches
  94. return (
  95. <ToolbarHeader
  96. style={loading ? { display: 'none' } : {}}
  97. cobranding={cobranding}
  98. onShowLeftMenuClick={onShowLeftMenuClick}
  99. chatIsOpen={chatIsOpen}
  100. unreadMessageCount={unreadMessageCount}
  101. toggleChatOpen={toggleChatOpen}
  102. reviewPanelOpen={reviewPanelOpen}
  103. toggleReviewPanelOpen={toggleReviewPanelOpen}
  104. historyIsOpen={view === 'history'}
  105. toggleHistoryOpen={toggleHistoryOpen}
  106. onlineUsers={onlineUsersArray}
  107. goToUser={goToUser}
  108. isRestrictedTokenMember={isRestrictedTokenMember}
  109. hasPublishPermissions={
  110. permissionsLevel === 'owner' || permissionsLevel === 'readAndWrite'
  111. }
  112. projectName={projectName}
  113. renameProject={renameProject}
  114. hasRenamePermissions={permissionsLevel === 'owner'}
  115. openShareModal={openShareModal}
  116. pdfViewIsOpen={view === 'pdf'}
  117. pdfButtonIsVisible={pdfLayout === 'flat'}
  118. togglePdfView={togglePdfView}
  119. />
  120. )
  121. }
  122. )
  123. EditorNavigationToolbarRoot.propTypes = {
  124. onlineUsersArray: PropTypes.array.isRequired,
  125. openDoc: PropTypes.func.isRequired,
  126. openShareProjectModal: PropTypes.func.isRequired,
  127. }
  128. export default EditorNavigationToolbarRoot