summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-05 06:49:47 -0600
committerAdam <[email protected]>2026-02-05 07:04:43 -0600
commit5b3d94ebaaa013295aad701a612aa2d7f324dd9f (patch)
tree479949b0dc8fc32a7b67ba17a74f5337200d8c16
parent1a6a3f4b54dfd5bb2848d386d4a688524da2a3a2 (diff)
downloadopencode-5b3d94ebaaa013295aad701a612aa2d7f324dd9f.tar.gz
opencode-5b3d94ebaaa013295aad701a612aa2d7f324dd9f.zip
fix(app): file tree out of sync
-rw-r--r--packages/app/src/context/file.tsx23
-rw-r--r--packages/app/src/context/sdk.tsx6
-rw-r--r--packages/app/src/pages/directory-layout.tsx2
-rw-r--r--packages/app/src/pages/session.tsx4
4 files changed, 18 insertions, 17 deletions
diff --git a/packages/app/src/context/file.tsx b/packages/app/src/context/file.tsx
index d05e1ee2a..3ed1b1ae4 100644
--- a/packages/app/src/context/file.tsx
+++ b/packages/app/src/context/file.tsx
@@ -1,5 +1,5 @@
-import { createEffect, createMemo, createRoot, onCleanup } from "solid-js"
-import { createStore, produce } from "solid-js/store"
+import { batch, createEffect, createMemo, createRoot, onCleanup } from "solid-js"
+import { createStore, produce, reconcile } from "solid-js/store"
import { createSimpleContext } from "@opencode-ai/ui/context"
import type { FileContent, FileNode } from "@opencode-ai/sdk/v2"
import { showToast } from "@opencode-ai/ui/toast"
@@ -8,7 +8,6 @@ import { getFilename } from "@opencode-ai/util/path"
import { useSDK } from "./sdk"
import { useSync } from "./sync"
import { useLanguage } from "@/context/language"
-import { decode64 } from "@/utils/base64"
import { Persist, persisted } from "@/utils/persist"
export type FileSelection = {
@@ -276,12 +275,10 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({
const params = useParams()
const language = useLanguage()
- const directory = createMemo(() => decode64(params.dir) ?? sdk.directory)
-
- const scope = createMemo(() => directory())
+ const scope = createMemo(() => sdk.directory)
function normalize(input: string) {
- const root = directory()
+ const root = scope()
const prefix = root.endsWith("/") ? root : root + "/"
let path = unquoteGitPath(stripQueryAndHash(stripFileProtocol(input)))
@@ -372,9 +369,13 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({
inflight.clear()
treeInflight.clear()
contentLru.clear()
- setStore("file", {})
- setTree("node", {})
- setTree("dir", { "": { expanded: true } })
+
+ batch(() => {
+ setStore("file", reconcile({}))
+ setTree("node", reconcile({}))
+ setTree("dir", reconcile({}))
+ setTree("dir", "", { expanded: true })
+ })
})
const viewCache = new Map<string, ViewCacheEntry>()
@@ -415,7 +416,7 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({
return entry.value
}
- const view = createMemo(() => loadView(directory(), params.id))
+ const view = createMemo(() => loadView(scope(), params.id))
function ensure(path: string) {
if (!path) return
diff --git a/packages/app/src/context/sdk.tsx b/packages/app/src/context/sdk.tsx
index 123aa4e73..3a404ec93 100644
--- a/packages/app/src/context/sdk.tsx
+++ b/packages/app/src/context/sdk.tsx
@@ -1,17 +1,17 @@
import { createOpencodeClient, type Event } from "@opencode-ai/sdk/v2/client"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { createGlobalEmitter } from "@solid-primitives/event-bus"
-import { createEffect, createMemo, onCleanup } from "solid-js"
+import { createEffect, createMemo, onCleanup, type Accessor } from "solid-js"
import { useGlobalSDK } from "./global-sdk"
import { usePlatform } from "./platform"
export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
name: "SDK",
- init: (props: { directory: string }) => {
+ init: (props: { directory: Accessor<string> }) => {
const platform = usePlatform()
const globalSDK = useGlobalSDK()
- const directory = createMemo(() => props.directory)
+ const directory = createMemo(props.directory)
const client = createMemo(() =>
createOpencodeClient({
baseUrl: globalSDK.url,
diff --git a/packages/app/src/pages/directory-layout.tsx b/packages/app/src/pages/directory-layout.tsx
index 037b08c72..da4667a82 100644
--- a/packages/app/src/pages/directory-layout.tsx
+++ b/packages/app/src/pages/directory-layout.tsx
@@ -31,7 +31,7 @@ export default function Layout(props: ParentProps) {
})
return (
<Show when={directory()}>
- <SDKProvider directory={directory()}>
+ <SDKProvider directory={directory}>
<SyncProvider>
{iife(() => {
const sync = useSync()
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 7af99d893..7f2727156 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -490,7 +490,7 @@ export default function Page() {
createEffect(
on(
- () => params.id,
+ sessionKey,
() => setTitle({ draft: "", editing: false, saving: false, menuOpen: false, pendingRename: false }),
{ defer: true },
),
@@ -1672,7 +1672,7 @@ export default function Page() {
createEffect(
on(
- () => params.dir,
+ () => sdk.directory,
() => {
void file.tree.list("")