summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/components/file-tree.tsx
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-06 09:37:49 -0600
committerGitHub <[email protected]>2026-02-06 09:37:49 -0600
commita4bc883595df9ea0f752079519081bc602408553 (patch)
tree583f21642f431899abe1dfb1f6bd9b2c01dc0206 /packages/app/src/components/file-tree.tsx
parentc07077f96c0019b2e18e0e8e1e0383deda08b3e6 (diff)
downloadopencode-a4bc883595df9ea0f752079519081bc602408553.tar.gz
opencode-a4bc883595df9ea0f752079519081bc602408553.zip
chore: refactoring and tests (#12468)
Diffstat (limited to 'packages/app/src/components/file-tree.tsx')
-rw-r--r--packages/app/src/components/file-tree.tsx60
1 files changed, 50 insertions, 10 deletions
diff --git a/packages/app/src/components/file-tree.tsx b/packages/app/src/components/file-tree.tsx
index 491a16de7..183c1555b 100644
--- a/packages/app/src/components/file-tree.tsx
+++ b/packages/app/src/components/file-tree.tsx
@@ -8,6 +8,7 @@ import {
createMemo,
For,
Match,
+ on,
Show,
splitProps,
Switch,
@@ -25,6 +26,34 @@ type Filter = {
dirs: Set<string>
}
+export function shouldListRoot(input: { level: number; dir?: { loaded?: boolean; loading?: boolean } }) {
+ if (input.level !== 0) return false
+ if (input.dir?.loaded) return false
+ if (input.dir?.loading) return false
+ return true
+}
+
+export function shouldListExpanded(input: {
+ level: number
+ dir?: { expanded?: boolean; loaded?: boolean; loading?: boolean }
+}) {
+ if (input.level === 0) return false
+ if (!input.dir?.expanded) return false
+ if (input.dir.loaded) return false
+ if (input.dir.loading) return false
+ return true
+}
+
+export function dirsToExpand(input: {
+ level: number
+ filter?: { dirs: Set<string> }
+ expanded: (dir: string) => boolean
+}) {
+ if (input.level !== 0) return []
+ if (!input.filter) return []
+ return [...input.filter.dirs].filter((dir) => !input.expanded(dir))
+}
+
export default function FileTree(props: {
path: string
class?: string
@@ -111,19 +140,30 @@ export default function FileTree(props: {
createEffect(() => {
const current = filter()
- if (!current) return
- if (level !== 0) return
-
- for (const dir of current.dirs) {
- const expanded = untrack(() => file.tree.state(dir)?.expanded) ?? false
- if (expanded) continue
- file.tree.expand(dir)
- }
+ const dirs = dirsToExpand({
+ level,
+ filter: current,
+ expanded: (dir) => untrack(() => file.tree.state(dir)?.expanded) ?? false,
+ })
+ for (const dir of dirs) file.tree.expand(dir)
})
+ createEffect(
+ on(
+ () => props.path,
+ (path) => {
+ const dir = untrack(() => file.tree.state(path))
+ if (!shouldListRoot({ level, dir })) return
+ void file.tree.list(path)
+ },
+ { defer: false },
+ ),
+ )
+
createEffect(() => {
- const path = props.path
- untrack(() => void file.tree.list(path))
+ const dir = file.tree.state(props.path)
+ if (!shouldListExpanded({ level, dir })) return
+ void file.tree.list(props.path)
})
const nodes = createMemo(() => {