summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/pages
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-26 09:39:25 -0600
committeradamelmore <[email protected]>2026-01-26 11:07:52 -0600
commit801eb5d2cb868d0a14c056439e3898b110f4cc21 (patch)
treecf26ac655b9fef7e05e75982ee2aa51c13a5df4b /packages/app/src/pages
parentebeed03115b61f812c56c66785a09be61be35468 (diff)
downloadopencode-801eb5d2cb868d0a14c056439e3898b110f4cc21.tar.gz
opencode-801eb5d2cb868d0a14c056439e3898b110f4cc21.zip
wip(app): file tree mode
Diffstat (limited to 'packages/app/src/pages')
-rw-r--r--packages/app/src/pages/session.tsx65
1 files changed, 53 insertions, 12 deletions
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 5160c5288..5ce03f403 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -1037,7 +1037,7 @@ export default function Page() {
return `session-review-diff-${sum}`
}
- const scrollToReviewDiff = (path: string, behavior: ScrollBehavior) => {
+ const reviewDiffTop = (path: string) => {
const root = reviewScroll()
if (!root) return
@@ -1050,15 +1050,25 @@ export default function Page() {
const a = el.getBoundingClientRect()
const b = root.getBoundingClientRect()
- const top = a.top - b.top + root.scrollTop
- root.scrollTo({ top, behavior })
+ return a.top - b.top + root.scrollTop
+ }
+
+ const scrollToReviewDiff = (path: string) => {
+ const root = reviewScroll()
+ if (!root) return false
+
+ const top = reviewDiffTop(path)
+ if (top === undefined) return false
+
+ view().setScroll("review", { x: root.scrollLeft, y: top })
+ root.scrollTo({ top, behavior: "auto" })
+ return true
}
const focusReviewDiff = (path: string) => {
const current = view().review.open() ?? []
if (!current.includes(path)) view().review.setOpen([...current, path])
setPendingDiff(path)
- requestAnimationFrame(() => scrollToReviewDiff(path, "smooth"))
}
createEffect(() => {
@@ -1067,10 +1077,39 @@ export default function Page() {
if (!reviewScroll()) return
if (!diffsReady()) return
- requestAnimationFrame(() => {
- scrollToReviewDiff(pending, "smooth")
- setPendingDiff(undefined)
- })
+ const attempt = (count: number) => {
+ if (pendingDiff() !== pending) return
+ if (count > 60) {
+ setPendingDiff(undefined)
+ return
+ }
+
+ const root = reviewScroll()
+ if (!root) {
+ requestAnimationFrame(() => attempt(count + 1))
+ return
+ }
+
+ if (!scrollToReviewDiff(pending)) {
+ requestAnimationFrame(() => attempt(count + 1))
+ return
+ }
+
+ const top = reviewDiffTop(pending)
+ if (top === undefined) {
+ requestAnimationFrame(() => attempt(count + 1))
+ return
+ }
+
+ if (Math.abs(root.scrollTop - top) <= 1) {
+ setPendingDiff(undefined)
+ return
+ }
+
+ requestAnimationFrame(() => attempt(count + 1))
+ }
+
+ requestAnimationFrame(() => attempt(0))
})
const activeTab = createMemo(() => {
@@ -2605,12 +2644,12 @@ export default function Page() {
<Show when={layout.fileTree.opened()}>
<div class="relative shrink-0 h-full" style={{ width: `${layout.fileTree.width()}px` }}>
<div class="h-full border-l border-border-weak-base flex flex-col overflow-hidden">
- <Tabs value={fileTreeTab()} onChange={setFileTreeTabValue} class="h-full">
- <Tabs.List class="h-auto">
- <Tabs.Trigger value="changes" class="w-1/2" classes={{ button: "w-full" }}>
+ <Tabs variant="pill" value={fileTreeTab()} onChange={setFileTreeTabValue} class="h-full">
+ <Tabs.List>
+ <Tabs.Trigger value="changes" class="flex-1" classes={{ button: "w-full" }}>
Changes
</Tabs.Trigger>
- <Tabs.Trigger value="all" class="w-1/2 !border-r-0" classes={{ button: "w-full" }}>
+ <Tabs.Trigger value="all" class="flex-1" classes={{ button: "w-full" }}>
All files
</Tabs.Trigger>
</Tabs.List>
@@ -2624,6 +2663,8 @@ export default function Page() {
<FileTree
path=""
allowed={diffs().map((d) => d.file)}
+ draggable={false}
+ tooltip={false}
onFileClick={(node) => focusReviewDiff(node.path)}
/>
</Show>