editor-and-sidebar.tsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import React, { useCallback, useState } from 'react'
  2. import TwoColumnMainContent from '@/features/ide-react/components/layout/two-column-main-content'
  3. import Editor from '@/features/ide-react/components/editor/editor'
  4. import EditorSidebar from '@/features/ide-react/components/editor-sidebar'
  5. import customLocalStorage from '@/infrastructure/local-storage'
  6. import History from '@/features/ide-react/components/history'
  7. import { HistoryProvider } from '@/features/history/context/history-context'
  8. import { useProjectContext } from '@/shared/context/project-context'
  9. import { useLayoutContext } from '@/shared/context/layout-context'
  10. import { FileTreeFindResult } from '@/features/ide-react/types/file-tree'
  11. type EditorAndSidebarProps = {
  12. shouldPersistLayout: boolean
  13. leftColumnDefaultSize: number
  14. setLeftColumnDefaultSize: React.Dispatch<React.SetStateAction<number>>
  15. }
  16. export function EditorAndSidebar({
  17. shouldPersistLayout,
  18. leftColumnDefaultSize,
  19. setLeftColumnDefaultSize,
  20. }: EditorAndSidebarProps) {
  21. const [leftColumnIsOpen, setLeftColumnIsOpen] = useState(true)
  22. const { rootDocId, _id: projectId } = useProjectContext()
  23. const { view } = useLayoutContext()
  24. const historyIsOpen = view === 'history'
  25. const [openDocId, setOpenDocId] = useState(
  26. () => customLocalStorage.getItem(`doc.open_id.${projectId}`) || rootDocId
  27. )
  28. const [fileTreeReady, setFileTreeReady] = useState(false)
  29. const handleFileTreeInit = useCallback(() => {
  30. setFileTreeReady(true)
  31. }, [])
  32. const handleFileTreeSelect = useCallback(
  33. (selectedEntities: FileTreeFindResult[]) => {
  34. const firstDocId =
  35. selectedEntities.find(result => result.type === 'doc')?.entity._id ||
  36. null
  37. setOpenDocId(firstDocId)
  38. },
  39. []
  40. )
  41. const leftColumnContent = (
  42. <EditorSidebar
  43. shouldPersistLayout={shouldPersistLayout}
  44. onFileTreeInit={handleFileTreeInit}
  45. onFileTreeSelect={handleFileTreeSelect}
  46. />
  47. )
  48. const rightColumnContent = (
  49. <>
  50. {/* Recreate the history context when the history view is toggled */}
  51. {historyIsOpen && (
  52. <HistoryProvider>
  53. <History />
  54. </HistoryProvider>
  55. )}
  56. <Editor
  57. shouldPersistLayout={shouldPersistLayout}
  58. openDocId={openDocId}
  59. fileTreeReady={fileTreeReady}
  60. />
  61. </>
  62. )
  63. return (
  64. <TwoColumnMainContent
  65. leftColumnId="editor-left-column"
  66. leftColumnContent={leftColumnContent}
  67. leftColumnDefaultSize={leftColumnDefaultSize}
  68. setLeftColumnDefaultSize={setLeftColumnDefaultSize}
  69. rightColumnContent={rightColumnContent}
  70. leftColumnIsOpen={leftColumnIsOpen}
  71. setLeftColumnIsOpen={setLeftColumnIsOpen}
  72. shouldPersistLayout={shouldPersistLayout}
  73. />
  74. )
  75. }