diff options
| author | Adam <[email protected]> | 2025-12-09 15:46:17 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2025-12-09 15:46:23 -0600 |
| commit | 9c93853e224f953b46bac06817ed2ce36d14f3fb (patch) | |
| tree | d3136be763aabcb5aea9dfd75c5cb27dfdcd1ad7 | |
| parent | 8a9c7a4ef33ee0fd401ab53c1bb52b46138c39b2 (diff) | |
| download | opencode-9c93853e224f953b46bac06817ed2ce36d14f3fb.tar.gz opencode-9c93853e224f953b46bac06817ed2ce36d14f3fb.zip | |
wip(desktop): progress
| -rw-r--r-- | packages/desktop/src/context/global-sync.tsx | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/packages/desktop/src/context/global-sync.tsx b/packages/desktop/src/context/global-sync.tsx index 9a113578e..cd3550379 100644 --- a/packages/desktop/src/context/global-sync.tsx +++ b/packages/desktop/src/context/global-sync.tsx @@ -18,6 +18,31 @@ import { Binary } from "@opencode-ai/util/binary" import { createSimpleContext } from "@opencode-ai/ui/context" import { useGlobalSDK } from "./global-sdk" +const PASTEL_COLORS = [ + "#FFB3BA", // pastel pink + "#FFDFBA", // pastel peach + "#FFFFBA", // pastel yellow + "#BAFFC9", // pastel green + "#BAE1FF", // pastel blue + "#E0BBE4", // pastel lavender + "#FEC8D8", // pastel rose + "#D4F0F0", // pastel cyan + "#FFDAC1", // pastel coral + "#C1E1C1", // pastel mint +] + +function randomPastelColor() { + return PASTEL_COLORS[Math.floor(Math.random() * PASTEL_COLORS.length)] +} + +async function ensureProjectColor(project: Project, sdk: ReturnType<typeof useGlobalSDK>): Promise<Project> { + if (project.icon?.color) return project + const color = randomPastelColor() + const updated = { ...project, icon: { ...project.icon, color } } + sdk.client.project.update({ projectID: project.id, icon: { color } }) + return updated +} + type State = { ready: boolean provider: Provider[] @@ -92,17 +117,19 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple if (directory === "global") { switch (event.type) { case "project.updated": { - const result = Binary.search(globalStore.projects, event.properties.id, (s) => s.id) - if (result.found) { - setGlobalStore("projects", result.index, reconcile(event.properties)) - break - } - setGlobalStore( - "projects", - produce((draft) => { - draft.splice(result.index, 0, event.properties) - }), - ) + ensureProjectColor(event.properties, sdk).then((project) => { + const result = Binary.search(globalStore.projects, project.id, (s) => s.id) + if (result.found) { + setGlobalStore("projects", result.index, reconcile(project)) + return + } + setGlobalStore( + "projects", + produce((draft) => { + draft.splice(result.index, 0, project) + }), + ) + }) break } } @@ -180,14 +207,14 @@ export const { use: useGlobalSync, provider: GlobalSyncProvider } = createSimple }) Promise.all([ - sdk.client.project.list().then((x) => + sdk.client.project.list().then(async (x) => { + const filtered = x.data!.filter((p) => !p.worktree.includes("opencode-test") && p.vcs) + const projects = await Promise.all(filtered.map((p) => ensureProjectColor(p, sdk))) setGlobalStore( "projects", - x - .data!.filter((x) => !x.worktree.includes("opencode-test") && x.vcs) - .sort((a, b) => a.id.localeCompare(b.id)), - ), - ), + projects.sort((a, b) => a.id.localeCompare(b.id)), + ) + }), ]).then(() => setGlobalStore("ready", true)) return { |
