editor-navigation-toolbar-root.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import React, { useState, useCallback } from 'react'
  2. import ToolbarHeader from './toolbar-header'
  3. import { useEditorContext } from '../../../shared/context/editor-context'
  4. import { useChatContext } from '../../chat/context/chat-context'
  5. import { useLayoutContext } from '../../../shared/context/layout-context'
  6. import { useProjectContext } from '../../../shared/context/project-context'
  7. import * as eventTracking from '../../../infrastructure/event-tracking'
  8. import { Doc } from '../../../../../types/doc'
  9. function isOpentoString(open: boolean) {
  10. return open ? 'open' : 'close'
  11. }
  12. const EditorNavigationToolbarRoot = React.memo(
  13. function EditorNavigationToolbarRoot({
  14. onlineUsersArray,
  15. openDoc,
  16. openShareProjectModal,
  17. }: {
  18. onlineUsersArray: any[]
  19. openDoc: (doc: Doc, { gotoLine }: { gotoLine: number }) => void
  20. openShareProjectModal: () => void
  21. }) {
  22. const {
  23. name: projectName,
  24. features: { trackChangesVisible },
  25. } = useProjectContext()
  26. const {
  27. cobranding,
  28. isRestrictedTokenMember,
  29. renameProject,
  30. permissionsLevel,
  31. } = useEditorContext()
  32. const {
  33. chatIsOpen,
  34. setChatIsOpen,
  35. reviewPanelOpen,
  36. setReviewPanelOpen,
  37. view,
  38. setView,
  39. setLeftMenuShown,
  40. } = useLayoutContext()
  41. const { markMessagesAsRead, unreadMessageCount } = useChatContext()
  42. const toggleChatOpen = useCallback(() => {
  43. if (!chatIsOpen) {
  44. markMessagesAsRead()
  45. }
  46. eventTracking.sendMB('navigation-clicked-chat', {
  47. action: isOpentoString(!chatIsOpen),
  48. })
  49. setChatIsOpen(!chatIsOpen)
  50. }, [chatIsOpen, setChatIsOpen, markMessagesAsRead])
  51. const toggleReviewPanelOpen = useCallback(
  52. event => {
  53. event.preventDefault()
  54. eventTracking.sendMB('navigation-clicked-review', {
  55. action: isOpentoString(!reviewPanelOpen),
  56. })
  57. setReviewPanelOpen(value => !value)
  58. },
  59. [reviewPanelOpen, setReviewPanelOpen]
  60. )
  61. const [shouldReopenChat, setShouldReopenChat] = useState(chatIsOpen)
  62. const toggleHistoryOpen = useCallback(() => {
  63. const action = view === 'history' ? 'close' : 'open'
  64. eventTracking.sendMB('navigation-clicked-history', { action })
  65. if (chatIsOpen && action === 'open') {
  66. setShouldReopenChat(true)
  67. toggleChatOpen()
  68. }
  69. if (shouldReopenChat && action === 'close') {
  70. setShouldReopenChat(false)
  71. toggleChatOpen()
  72. }
  73. setView(view === 'history' ? 'editor' : 'history')
  74. }, [view, chatIsOpen, shouldReopenChat, setView, toggleChatOpen])
  75. const openShareModal = useCallback(() => {
  76. eventTracking.sendMB('navigation-clicked-share')
  77. openShareProjectModal()
  78. }, [openShareProjectModal])
  79. const onShowLeftMenuClick = useCallback(() => {
  80. eventTracking.sendMB('navigation-clicked-menu')
  81. setLeftMenuShown(value => !value)
  82. }, [setLeftMenuShown])
  83. const goToUser = useCallback(
  84. user => {
  85. if (user.doc && typeof user.row === 'number') {
  86. openDoc(user.doc, { gotoLine: user.row + 1 })
  87. }
  88. },
  89. [openDoc]
  90. )
  91. return (
  92. <ToolbarHeader
  93. // @ts-ignore: TODO(convert ToolbarHeader to TSX)
  94. cobranding={cobranding}
  95. onShowLeftMenuClick={onShowLeftMenuClick}
  96. chatIsOpen={chatIsOpen}
  97. unreadMessageCount={unreadMessageCount}
  98. toggleChatOpen={toggleChatOpen}
  99. reviewPanelOpen={reviewPanelOpen}
  100. toggleReviewPanelOpen={toggleReviewPanelOpen}
  101. historyIsOpen={view === 'history'}
  102. toggleHistoryOpen={toggleHistoryOpen}
  103. onlineUsers={onlineUsersArray}
  104. goToUser={goToUser}
  105. isRestrictedTokenMember={isRestrictedTokenMember}
  106. hasPublishPermissions={
  107. permissionsLevel === 'owner' || permissionsLevel === 'readAndWrite'
  108. }
  109. chatVisible={!isRestrictedTokenMember}
  110. projectName={projectName}
  111. renameProject={renameProject}
  112. hasRenamePermissions={permissionsLevel === 'owner'}
  113. openShareModal={openShareModal}
  114. trackChangesVisible={trackChangesVisible}
  115. />
  116. )
  117. }
  118. )
  119. export default EditorNavigationToolbarRoot