Browse Source

fix(app): file tree out of sync

Adam 3 weeks ago
parent
commit
5b3d94ebaa

+ 12 - 11
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 { createSimpleContext } from "@opencode-ai/ui/context"
 import type { FileContent, FileNode } from "@opencode-ai/sdk/v2"
 import type { FileContent, FileNode } from "@opencode-ai/sdk/v2"
 import { showToast } from "@opencode-ai/ui/toast"
 import { showToast } from "@opencode-ai/ui/toast"
@@ -8,7 +8,6 @@ import { getFilename } from "@opencode-ai/util/path"
 import { useSDK } from "./sdk"
 import { useSDK } from "./sdk"
 import { useSync } from "./sync"
 import { useSync } from "./sync"
 import { useLanguage } from "@/context/language"
 import { useLanguage } from "@/context/language"
-import { decode64 } from "@/utils/base64"
 import { Persist, persisted } from "@/utils/persist"
 import { Persist, persisted } from "@/utils/persist"
 
 
 export type FileSelection = {
 export type FileSelection = {
@@ -276,12 +275,10 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({
     const params = useParams()
     const params = useParams()
     const language = useLanguage()
     const language = useLanguage()
 
 
-    const directory = createMemo(() => decode64(params.dir) ?? sdk.directory)
-
-    const scope = createMemo(() => directory())
+    const scope = createMemo(() => sdk.directory)
 
 
     function normalize(input: string) {
     function normalize(input: string) {
-      const root = directory()
+      const root = scope()
       const prefix = root.endsWith("/") ? root : root + "/"
       const prefix = root.endsWith("/") ? root : root + "/"
 
 
       let path = unquoteGitPath(stripQueryAndHash(stripFileProtocol(input)))
       let path = unquoteGitPath(stripQueryAndHash(stripFileProtocol(input)))
@@ -372,9 +369,13 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({
       inflight.clear()
       inflight.clear()
       treeInflight.clear()
       treeInflight.clear()
       contentLru.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>()
     const viewCache = new Map<string, ViewCacheEntry>()
@@ -415,7 +416,7 @@ export const { use: useFile, provider: FileProvider } = createSimpleContext({
       return entry.value
       return entry.value
     }
     }
 
 
-    const view = createMemo(() => loadView(directory(), params.id))
+    const view = createMemo(() => loadView(scope(), params.id))
 
 
     function ensure(path: string) {
     function ensure(path: string) {
       if (!path) return
       if (!path) return

+ 3 - 3
packages/app/src/context/sdk.tsx

@@ -1,17 +1,17 @@
 import { createOpencodeClient, type Event } from "@opencode-ai/sdk/v2/client"
 import { createOpencodeClient, type Event } from "@opencode-ai/sdk/v2/client"
 import { createSimpleContext } from "@opencode-ai/ui/context"
 import { createSimpleContext } from "@opencode-ai/ui/context"
 import { createGlobalEmitter } from "@solid-primitives/event-bus"
 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 { useGlobalSDK } from "./global-sdk"
 import { usePlatform } from "./platform"
 import { usePlatform } from "./platform"
 
 
 export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
 export const { use: useSDK, provider: SDKProvider } = createSimpleContext({
   name: "SDK",
   name: "SDK",
-  init: (props: { directory: string }) => {
+  init: (props: { directory: Accessor<string> }) => {
     const platform = usePlatform()
     const platform = usePlatform()
     const globalSDK = useGlobalSDK()
     const globalSDK = useGlobalSDK()
 
 
-    const directory = createMemo(() => props.directory)
+    const directory = createMemo(props.directory)
     const client = createMemo(() =>
     const client = createMemo(() =>
       createOpencodeClient({
       createOpencodeClient({
         baseUrl: globalSDK.url,
         baseUrl: globalSDK.url,

+ 1 - 1
packages/app/src/pages/directory-layout.tsx

@@ -31,7 +31,7 @@ export default function Layout(props: ParentProps) {
   })
   })
   return (
   return (
     <Show when={directory()}>
     <Show when={directory()}>
-      <SDKProvider directory={directory()}>
+      <SDKProvider directory={directory}>
         <SyncProvider>
         <SyncProvider>
           {iife(() => {
           {iife(() => {
             const sync = useSync()
             const sync = useSync()

+ 2 - 2
packages/app/src/pages/session.tsx

@@ -490,7 +490,7 @@ export default function Page() {
 
 
   createEffect(
   createEffect(
     on(
     on(
-      () => params.id,
+      sessionKey,
       () => setTitle({ draft: "", editing: false, saving: false, menuOpen: false, pendingRename: false }),
       () => setTitle({ draft: "", editing: false, saving: false, menuOpen: false, pendingRename: false }),
       { defer: true },
       { defer: true },
     ),
     ),
@@ -1672,7 +1672,7 @@ export default function Page() {
 
 
   createEffect(
   createEffect(
     on(
     on(
-      () => params.dir,
+      () => sdk.directory,
       () => {
       () => {
         void file.tree.list("")
         void file.tree.list("")