editor-navigation-toolbar-root.tsx 4.3 KB

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