editor-navigation-toolbar-root.tsx 4.2 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. import { OnlineUser } from '@/features/ide-react/context/online-users-context'
  10. function isOpentoString(open: boolean) {
  11. return open ? 'open' : 'close'
  12. }
  13. const EditorNavigationToolbarRoot = React.memo(
  14. function EditorNavigationToolbarRoot({
  15. onlineUsersArray,
  16. openDoc,
  17. openShareProjectModal,
  18. }: {
  19. onlineUsersArray: OnlineUser[]
  20. openDoc: (doc: Doc, { gotoLine }: { gotoLine: number }) => void
  21. openShareProjectModal: () => void
  22. }) {
  23. const {
  24. name: projectName,
  25. features: { trackChangesVisible },
  26. } = useProjectContext()
  27. const {
  28. cobranding,
  29. isRestrictedTokenMember,
  30. renameProject,
  31. permissionsLevel,
  32. } = useEditorContext()
  33. const {
  34. chatIsOpen,
  35. setChatIsOpen,
  36. reviewPanelOpen,
  37. setReviewPanelOpen,
  38. view,
  39. setView,
  40. setLeftMenuShown,
  41. } = useLayoutContext()
  42. const { markMessagesAsRead, unreadMessageCount } = useChatContext()
  43. const toggleChatOpen = useCallback(() => {
  44. if (!chatIsOpen) {
  45. markMessagesAsRead()
  46. }
  47. eventTracking.sendMB('navigation-clicked-chat', {
  48. action: isOpentoString(!chatIsOpen),
  49. })
  50. setChatIsOpen(!chatIsOpen)
  51. }, [chatIsOpen, setChatIsOpen, markMessagesAsRead])
  52. const toggleReviewPanelOpen = useCallback(
  53. (event: any) => {
  54. event.preventDefault()
  55. eventTracking.sendMB('navigation-clicked-review', {
  56. action: isOpentoString(!reviewPanelOpen),
  57. })
  58. setReviewPanelOpen(value => !value)
  59. },
  60. [reviewPanelOpen, setReviewPanelOpen]
  61. )
  62. const [shouldReopenChat, setShouldReopenChat] = useState(chatIsOpen)
  63. const toggleHistoryOpen = useCallback(() => {
  64. const action = view === 'history' ? 'close' : 'open'
  65. eventTracking.sendMB('navigation-clicked-history', { action })
  66. if (chatIsOpen && action === 'open') {
  67. setShouldReopenChat(true)
  68. toggleChatOpen()
  69. }
  70. if (shouldReopenChat && action === 'close') {
  71. setShouldReopenChat(false)
  72. toggleChatOpen()
  73. }
  74. setView(view === 'history' ? 'editor' : 'history')
  75. }, [view, chatIsOpen, shouldReopenChat, setView, toggleChatOpen])
  76. const openShareModal = useCallback(() => {
  77. eventTracking.sendMB('navigation-clicked-share')
  78. openShareProjectModal()
  79. }, [openShareProjectModal])
  80. const onShowLeftMenuClick = useCallback(() => {
  81. eventTracking.sendMB('navigation-clicked-menu')
  82. setLeftMenuShown(value => !value)
  83. }, [setLeftMenuShown])
  84. const goToUser = useCallback(
  85. (user: OnlineUser) => {
  86. if (user.doc && typeof user.row === 'number') {
  87. openDoc(user.doc, { gotoLine: user.row + 1 })
  88. }
  89. },
  90. [openDoc]
  91. )
  92. return (
  93. <ToolbarHeader
  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