editor-navigation-toolbar-root.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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 { useApplicationContext } from '../../../shared/context/application-context'
  8. const applicationContextPropTypes = {
  9. user: PropTypes.object,
  10. }
  11. const editorContextPropTypes = {
  12. cobranding: PropTypes.object,
  13. loading: PropTypes.bool,
  14. isRestrictedTokenMember: PropTypes.bool,
  15. projectName: PropTypes.string.isRequired,
  16. renameProject: PropTypes.func.isRequired,
  17. isProjectOwner: PropTypes.bool,
  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. function EditorNavigationToolbarRoot({
  34. onlineUsersArray,
  35. openDoc,
  36. openShareProjectModal,
  37. }) {
  38. const { user } = useApplicationContext(applicationContextPropTypes)
  39. const {
  40. cobranding,
  41. loading,
  42. isRestrictedTokenMember,
  43. projectName,
  44. renameProject,
  45. isProjectOwner,
  46. } = useEditorContext(editorContextPropTypes)
  47. const {
  48. chatIsOpen,
  49. setChatIsOpen,
  50. reviewPanelOpen,
  51. setReviewPanelOpen,
  52. view,
  53. setView,
  54. setLeftMenuShown,
  55. pdfLayout,
  56. } = useLayoutContext(layoutContextPropTypes)
  57. const { markMessagesAsRead, unreadMessageCount } = useChatContext(
  58. chatContextPropTypes
  59. )
  60. const toggleChatOpen = useCallback(() => {
  61. if (!chatIsOpen) {
  62. markMessagesAsRead()
  63. }
  64. setChatIsOpen(value => !value)
  65. }, [chatIsOpen, setChatIsOpen, markMessagesAsRead])
  66. const toggleReviewPanelOpen = useCallback(
  67. () => setReviewPanelOpen(value => !value),
  68. [setReviewPanelOpen]
  69. )
  70. const toggleHistoryOpen = useCallback(() => {
  71. setView(view === 'history' ? 'editor' : 'history')
  72. }, [view, setView])
  73. const togglePdfView = useCallback(() => {
  74. setView(view === 'pdf' ? 'editor' : 'pdf')
  75. }, [view, setView])
  76. const openShareModal = useCallback(() => {
  77. openShareProjectModal(isProjectOwner)
  78. }, [openShareProjectModal, isProjectOwner])
  79. const onShowLeftMenuClick = useCallback(
  80. () => setLeftMenuShown(value => !value),
  81. [setLeftMenuShown]
  82. )
  83. function goToUser(user) {
  84. if (user.doc && typeof user.row === 'number') {
  85. openDoc(user.doc, { gotoLine: user.row + 1 })
  86. }
  87. }
  88. // using {display: 'none'} as 1:1 migration from Angular's ng-hide. Using
  89. // `loading ? null : <ToolbarHeader/>` causes UI glitches
  90. return (
  91. <ToolbarHeader
  92. style={loading ? { display: 'none' } : {}}
  93. cobranding={cobranding}
  94. onShowLeftMenuClick={onShowLeftMenuClick}
  95. chatIsOpen={chatIsOpen}
  96. unreadMessageCount={unreadMessageCount}
  97. toggleChatOpen={toggleChatOpen}
  98. reviewPanelOpen={reviewPanelOpen}
  99. toggleReviewPanelOpen={toggleReviewPanelOpen}
  100. historyIsOpen={view === 'history'}
  101. toggleHistoryOpen={toggleHistoryOpen}
  102. onlineUsers={onlineUsersArray}
  103. goToUser={goToUser}
  104. isRestrictedTokenMember={isRestrictedTokenMember}
  105. isAnonymousUser={user == null}
  106. projectName={projectName}
  107. renameProject={renameProject}
  108. openShareModal={openShareModal}
  109. pdfViewIsOpen={view === 'pdf'}
  110. pdfButtonIsVisible={pdfLayout === 'flat'}
  111. togglePdfView={togglePdfView}
  112. />
  113. )
  114. }
  115. EditorNavigationToolbarRoot.propTypes = {
  116. onlineUsersArray: PropTypes.array.isRequired,
  117. openDoc: PropTypes.func.isRequired,
  118. openShareProjectModal: PropTypes.func.isRequired,
  119. }
  120. export default EditorNavigationToolbarRoot