editor-navigation-toolbar-root.js 3.7 KB

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