89 lines
2.4 KiB
Markdown
89 lines
2.4 KiB
Markdown
## File tree fetches
|
|
|
|
Make directory listing triggers explicit and minimal
|
|
|
|
---
|
|
|
|
### Summary
|
|
|
|
`packages/app/src/components/file-tree.tsx` currently invokes `file.tree.list(path)` from a generic effect in each tree instance. Even with inflight guards, this pattern causes avoidable list calls and makes load behavior harder to reason about. This spec tightens fetch triggers.
|
|
|
|
---
|
|
|
|
### Goals
|
|
|
|
- Avoid redundant list invocations from passive rerenders
|
|
- Fetch directory data only when needed (mount + expansion + explicit refresh)
|
|
- Keep tree behavior unchanged for users
|
|
|
|
---
|
|
|
|
### Non-goals
|
|
|
|
- Replacing recursive tree rendering with virtualization
|
|
- Changing file-tree visual design
|
|
- Backend/API changes for file listing
|
|
|
|
---
|
|
|
|
### Parallel execution contract
|
|
|
|
This spec owns:
|
|
|
|
- `packages/app/src/components/file-tree.tsx`
|
|
|
|
This spec should not modify:
|
|
|
|
- `packages/app/src/context/file.tsx`
|
|
- `packages/app/src/pages/session.tsx`
|
|
|
|
---
|
|
|
|
### Implementation plan
|
|
|
|
1. Replace broad list effect with explicit triggers
|
|
|
|
- Load root path on mount.
|
|
- For nested directories, list only when:
|
|
- node is expanded, or
|
|
- parent explicitly requests refresh.
|
|
|
|
2. Guard expansion-driven fetches
|
|
|
|
- Keep `file.tree.expand(path)` as the primary source of truth for expansion fetches.
|
|
- Ensure passive rerenders do not retrigger `list(path)` calls for already loaded dirs.
|
|
|
|
3. Keep filter auto-expand behavior
|
|
|
|
- Preserve existing "allowed filter" directory auto-expansion.
|
|
- Ensure auto-expanded directories still fetch exactly once unless force refresh occurs.
|
|
|
|
---
|
|
|
|
### Acceptance criteria
|
|
|
|
- `file-tree.tsx` no longer calls `file.tree.list(path)` from an unscoped rerender effect.
|
|
- Expanding a folder still loads its children correctly.
|
|
- Filtering by `allowed` still opens and shows required parent directories.
|
|
- No regressions in change/all tabs where `FileTree` is used.
|
|
|
|
---
|
|
|
|
### Validation plan
|
|
|
|
- Manual:
|
|
- Expand/collapse deep directory trees repeatedly.
|
|
- Switch between "changes" and "all" tree tabs.
|
|
- Open review, click files, verify tree stays responsive.
|
|
- Optional instrumentation:
|
|
- count list calls per user action and compare before/after.
|
|
|
|
---
|
|
|
|
### Risks and mitigations
|
|
|
|
- Risk: directories fail to load when expansion timing changes.
|
|
- Mitigation: rely on `expand()` path and verify for root + nested nodes.
|
|
- Risk: filter-driven auto-expand misses one level.
|
|
- Mitigation: keep existing auto-expand iteration and add regression checks.
|