1+ import { useTaskData } from "@features/task-detail/hooks/useTaskData" ;
12import { FileIcon , FolderIcon , FolderOpenIcon } from "@phosphor-icons/react" ;
23import { Box , Flex , Text } from "@radix-ui/themes" ;
34import type { Task } from "@shared/types" ;
45import { useQuery } from "@tanstack/react-query" ;
56import { useState } from "react" ;
6- import { useTaskData } from "@features/task-detail/hooks/useTaskData" ;
77
88interface FileTreePanelProps {
99 taskId : string ;
@@ -17,8 +17,17 @@ interface TreeNode {
1717 path : string ;
1818}
1919
20- function buildTreeFromPaths ( files : Array < { path : string ; name : string } > ) : TreeNode [ ] {
21- const root : Record < string , TreeNode > = { } ;
20+ interface TreeNodeBuilder {
21+ name : string ;
22+ type : "file" | "folder" ;
23+ children ?: Record < string , TreeNodeBuilder > ;
24+ path : string ;
25+ }
26+
27+ function buildTreeFromPaths (
28+ files : Array < { path : string ; name : string } > ,
29+ ) : TreeNode [ ] {
30+ const root : Record < string , TreeNodeBuilder > = { } ;
2231
2332 for ( const file of files ) {
2433 const parts = file . path . split ( "/" ) . filter ( Boolean ) ;
@@ -39,13 +48,13 @@ function buildTreeFromPaths(files: Array<{ path: string; name: string }>): TreeN
3948 }
4049
4150 if ( ! isLastPart && currentLevel [ part ] . children ) {
42- currentLevel = currentLevel [ part ] . children as Record < string , TreeNode > ;
51+ currentLevel = currentLevel [ part ] . children ;
4352 }
4453 }
4554 }
4655
4756 // Convert children objects to arrays and sort
48- const convertToArray = ( node : TreeNode ) : TreeNode => {
57+ const convertToArray = ( node : TreeNodeBuilder ) : TreeNode => {
4958 if ( node . children && typeof node . children === "object" ) {
5059 const childrenArray = Object . values ( node . children )
5160 . map ( convertToArray )
@@ -56,9 +65,19 @@ function buildTreeFromPaths(files: Array<{ path: string; name: string }>): TreeN
5665 }
5766 return a . name . localeCompare ( b . name ) ;
5867 } ) ;
59- return { ...node , children : childrenArray } ;
68+ return {
69+ name : node . name ,
70+ type : node . type ,
71+ path : node . path ,
72+ children : childrenArray ,
73+ } ;
6074 }
61- return node ;
75+ return {
76+ name : node . name ,
77+ type : node . type ,
78+ path : node . path ,
79+ children : undefined ,
80+ } ;
6281 } ;
6382
6483 return Object . values ( root )
@@ -96,7 +115,7 @@ function TreeItem({ node, depth }: TreeItemProps) {
96115 paddingLeft : `${ depth * 16 + 8 } px` ,
97116 cursor : node . type === "folder" ? "pointer" : "default" ,
98117 } }
99- className = "hover:bg-gray-2 rounded "
118+ className = "rounded hover:bg-gray-2"
100119 onClick = { handleToggle }
101120 >
102121 { node . type === "folder" ? (
@@ -115,7 +134,11 @@ function TreeItem({ node, depth }: TreeItemProps) {
115134 { node . type === "folder" && isExpanded && node . children && (
116135 < Box >
117136 { node . children . map ( ( child , index ) => (
118- < TreeItem key = { `${ child . name } -${ index } ` } node = { child } depth = { depth + 1 } />
137+ < TreeItem
138+ key = { `${ child . name } -${ index } ` }
139+ node = { child }
140+ depth = { depth + 1 }
141+ />
119142 ) ) }
120143 </ Box >
121144 ) }
0 commit comments