editor-navigation-toolbar-root.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import React, { 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 toggleHistoryOpen = useCallback(() => {
  62. const action = view === 'history' ? 'close' : 'open'
  63. eventTracking.sendMB('navigation-clicked-history', { action })
  64. setView(view === 'history' ? 'editor' : 'history')
  65. }, [view, setView])
  66. const openShareModal = useCallback(() => {
  67. eventTracking.sendMB('navigation-clicked-share')
  68. openShareProjectModal()
  69. }, [openShareProjectModal])
  70. const onShowLeftMenuClick = useCallback(() => {
  71. eventTracking.sendMB('navigation-clicked-menu')
  72. setLeftMenuShown(value => !value)
  73. }, [setLeftMenuShown])
  74. const goToUser = useCallback(
  75. user => {
  76. if (user.doc && typeof user.row === 'number') {
  77. openDoc(user.doc, { gotoLine: user.row + 1 })
  78. }
  79. },
  80. [openDoc]
  81. )
  82. return (
  83. <ToolbarHeader
  84. // @ts-ignore: TODO(convert ToolbarHeader to TSX)
  85. cobranding={cobranding}
  86. onShowLeftMenuClick={onShowLeftMenuClick}
  87. chatIsOpen={chatIsOpen}
  88. unreadMessageCount={unreadMessageCount}
  89. toggleChatOpen={toggleChatOpen}
  90. reviewPanelOpen={reviewPanelOpen}
  91. toggleReviewPanelOpen={toggleReviewPanelOpen}
  92. historyIsOpen={view === 'history'}
  93. toggleHistoryOpen={toggleHistoryOpen}
  94. onlineUsers={onlineUsersArray}
  95. goToUser={goToUser}
  96. isRestrictedTokenMember={isRestrictedTokenMember}
  97. hasPublishPermissions={
  98. permissionsLevel === 'owner' || permissionsLevel === 'readAndWrite'
  99. }
  100. projectName={projectName}
  101. renameProject={renameProject}
  102. hasRenamePermissions={permissionsLevel === 'owner'}
  103. openShareModal={openShareModal}
  104. trackChangesVisible={trackChangesVisible}
  105. />
  106. )
  107. }
  108. )
  109. export default EditorNavigationToolbarRoot