use-current-project-folders.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { useMemo } from 'react'
  2. import { File, FileOrDirectory, filterFolders } from '../utils/file'
  3. import { useFileTreeData } from '@/shared/context/file-tree-data-context'
  4. import { Folder } from '../../../../../types/folder'
  5. import { Doc } from '../../../../../types/doc'
  6. import { FileRef } from '../../../../../types/file-ref'
  7. function docAdapter(doc: Doc): FileOrDirectory {
  8. return {
  9. id: doc._id,
  10. name: doc.name,
  11. type: 'doc',
  12. }
  13. }
  14. function fileRefAdapter(fileRef: FileRef): FileOrDirectory {
  15. return {
  16. id: fileRef._id,
  17. name: fileRef.name,
  18. type: 'file',
  19. }
  20. }
  21. function folderAdapter(folder: Folder): FileOrDirectory {
  22. return {
  23. id: folder._id,
  24. name: folder.name,
  25. type: 'folder',
  26. children: folder.docs
  27. .map(docAdapter)
  28. .concat(
  29. folder.fileRefs.map(fileRefAdapter),
  30. folder.folders.map(folderAdapter)
  31. ),
  32. }
  33. }
  34. export const useCurrentProjectFolders: () => {
  35. folders: File[] | undefined
  36. rootFile: File
  37. rootFolder: FileOrDirectory
  38. } = () => {
  39. const { fileTreeData } = useFileTreeData()
  40. return useMemo(() => {
  41. const rootFolder = folderAdapter(fileTreeData)
  42. const rootFile = { ...rootFolder, path: '' }
  43. const folders = filterFolders(rootFolder)
  44. return { folders, rootFile, rootFolder }
  45. }, [fileTreeData])
  46. }