Просмотр исходного кода

fix(desktop): removed projects

Adam 3 месяцев назад
Родитель
Сommit
742cf10dee

+ 8 - 5
packages/desktop/src/context/layout.tsx

@@ -61,21 +61,22 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
 
 
     function enrich(project: { worktree: string; expanded: boolean }) {
     function enrich(project: { worktree: string; expanded: boolean }) {
       const metadata = globalSync.data.project.find((x) => x.worktree === project.worktree)
       const metadata = globalSync.data.project.find((x) => x.worktree === project.worktree)
-      if (!metadata) return []
       return [
       return [
         {
         {
           ...project,
           ...project,
-          ...metadata,
+          ...(metadata ?? {}),
         },
         },
       ]
       ]
     }
     }
 
 
-    function colorize(project: Project & { expanded: boolean }) {
+    function colorize(project: Partial<Project> & { worktree: string; expanded: boolean }) {
       if (project.icon?.color) return project
       if (project.icon?.color) return project
       const color = pickAvailableColor()
       const color = pickAvailableColor()
       usedColors.add(color)
       usedColors.add(color)
       project.icon = { ...project.icon, color }
       project.icon = { ...project.icon, color }
-      globalSdk.client.project.update({ projectID: project.id, icon: { color } })
+      if (project.id) {
+        globalSdk.client.project.update({ projectID: project.id, icon: { color } })
+      }
       return project
       return project
     }
     }
 
 
@@ -95,7 +96,9 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
       projects: {
       projects: {
         list,
         list,
         open(directory: string) {
         open(directory: string) {
-          if (store.projects.find((x) => x.worktree === directory)) return
+          if (store.projects.find((x) => x.worktree === directory)) {
+            return
+          }
           globalSync.project.loadSessions(directory)
           globalSync.project.loadSessions(directory)
           setStore("projects", (x) => [{ worktree: directory, expanded: true }, ...x])
           setStore("projects", (x) => [{ worktree: directory, expanded: true }, ...x])
         },
         },

+ 2 - 1
packages/desktop/src/context/local.tsx

@@ -337,6 +337,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
       const load = async (path: string) => {
       const load = async (path: string) => {
         const relativePath = relative(path)
         const relativePath = relative(path)
         await sdk.client.file.read({ path: relativePath }).then((x) => {
         await sdk.client.file.read({ path: relativePath }).then((x) => {
+          if (!store.node[relativePath]) return
           setStore(
           setStore(
             "node",
             "node",
             relativePath,
             relativePath,
@@ -425,7 +426,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
         init,
         init,
         expand(path: string) {
         expand(path: string) {
           setStore("node", path, "expanded", true)
           setStore("node", path, "expanded", true)
-          if (store.node[path].loaded) return
+          if (store.node[path]?.loaded) return
           setStore("node", path, "loaded", true)
           setStore("node", path, "loaded", true)
           list(path)
           list(path)
         },
         },

+ 1 - 1
packages/desktop/src/pages/layout.tsx

@@ -517,7 +517,7 @@ export default function Layout(props: ParentProps) {
     )
     )
   }
   }
 
 
-  const SortableProject = (props: { project: Project & { expanded: boolean } }): JSX.Element => {
+  const SortableProject = (props: { project: Project & { worktree: string; expanded: boolean } }): JSX.Element => {
     const sortable = createSortable(props.project.worktree)
     const sortable = createSortable(props.project.worktree)
     const slug = createMemo(() => base64Encode(props.project.worktree))
     const slug = createMemo(() => base64Encode(props.project.worktree))
     const name = createMemo(() => getFilename(props.project.worktree))
     const name = createMemo(() => getFilename(props.project.worktree))

+ 5 - 4
packages/opencode/src/file/index.ts

@@ -1,5 +1,4 @@
 import { BusEvent } from "@/bus/bus-event"
 import { BusEvent } from "@/bus/bus-event"
-import { Bus } from "@/bus"
 import z from "zod"
 import z from "zod"
 import { $ } from "bun"
 import { $ } from "bun"
 import type { BunFile } from "bun"
 import type { BunFile } from "bun"
@@ -290,9 +289,11 @@ export namespace File {
     }
     }
     const resolved = dir ? path.join(Instance.directory, dir) : Instance.directory
     const resolved = dir ? path.join(Instance.directory, dir) : Instance.directory
     const nodes: Node[] = []
     const nodes: Node[] = []
-    for (const entry of await fs.promises.readdir(resolved, {
-      withFileTypes: true,
-    })) {
+    for (const entry of await fs.promises
+      .readdir(resolved, {
+        withFileTypes: true,
+      })
+      .catch(() => [])) {
       if (exclude.includes(entry.name)) continue
       if (exclude.includes(entry.name)) continue
       const fullPath = path.join(resolved, entry.name)
       const fullPath = path.join(resolved, entry.name)
       const relativePath = path.relative(Instance.directory, fullPath)
       const relativePath = path.relative(Instance.directory, fullPath)