ide-page.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { useConnectionContext } from '@/features/ide-react/context/connection-context'
  2. import useEventListener from '@/shared/hooks/use-event-listener'
  3. import { useCallback, useEffect, useState } from 'react'
  4. import { Alerts } from '@/features/ide-react/components/alerts/alerts'
  5. import { useLayoutContext } from '@/shared/context/layout-context'
  6. import MainLayout from '@/features/ide-react/components/layout/main-layout'
  7. import { EditorAndSidebar } from '@/features/ide-react/components/editor-and-sidebar'
  8. import EditorLeftMenu from '@/features/editor-left-menu/components/editor-left-menu'
  9. import EditorNavigationToolbar from '@/features/ide-react/components/editor-navigation-toolbar'
  10. import ChatPane from '@/features/chat/components/chat-pane'
  11. import { useLayoutEventTracking } from '@/features/ide-react/hooks/use-layout-event-tracking'
  12. import useSocketListeners from '@/features/ide-react/hooks/use-socket-listeners'
  13. import { useModalsContext } from '@/features/ide-react/context/modals-context'
  14. import { useOpenFile } from '@/features/ide-react/hooks/use-open-file'
  15. // This is filled with placeholder content while the real content is migrated
  16. // away from Angular
  17. export default function IdePage() {
  18. useLayoutEventTracking()
  19. useSocketListeners()
  20. // This returns a function to open a binary file but for now we just use the
  21. // fact that it also patches in ide.binaryFilesManager. Once Angular is gone,
  22. // we can remove this hook from here and use it in the history file restore
  23. // component instead.
  24. useOpenFile()
  25. const [leftColumnDefaultSize, setLeftColumnDefaultSize] = useState(20)
  26. const { connectionState, registerUserActivity } = useConnectionContext()
  27. const { showLockEditorMessageModal } = useModalsContext()
  28. // Show modal when editor is forcefully disconnected
  29. useEffect(() => {
  30. if (connectionState.forceDisconnected) {
  31. showLockEditorMessageModal(connectionState.forcedDisconnectDelay)
  32. }
  33. }, [
  34. connectionState.forceDisconnected,
  35. connectionState.forcedDisconnectDelay,
  36. showLockEditorMessageModal,
  37. ])
  38. // Inform the connection manager when the user is active
  39. const listener = useCallback(
  40. () => registerUserActivity(),
  41. [registerUserActivity]
  42. )
  43. useEventListener('cursor:editor:update', listener)
  44. useEffect(() => {
  45. document.body.addEventListener('click', listener)
  46. return () => document.body.removeEventListener('click', listener)
  47. }, [listener])
  48. const { chatIsOpen } = useLayoutContext()
  49. const mainContent = (
  50. <EditorAndSidebar
  51. leftColumnDefaultSize={leftColumnDefaultSize}
  52. setLeftColumnDefaultSize={setLeftColumnDefaultSize}
  53. shouldPersistLayout
  54. />
  55. )
  56. return (
  57. <>
  58. <Alerts />
  59. <EditorLeftMenu />
  60. <MainLayout
  61. headerContent={<EditorNavigationToolbar />}
  62. chatContent={<ChatPane />}
  63. mainContent={mainContent}
  64. chatIsOpen={chatIsOpen}
  65. shouldPersistLayout
  66. />
  67. </>
  68. )
  69. }