summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context/layout.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'packages/app/src/context/layout.tsx')
-rw-r--r--packages/app/src/context/layout.tsx62
1 files changed, 41 insertions, 21 deletions
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index a8a8ce1e9..d7d09aa39 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -208,10 +208,10 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
})
})
- const usedColors = new Set<AvatarColorKey>()
+ const [colors, setColors] = createStore<Record<string, AvatarColorKey>>({})
- function pickAvailableColor(): AvatarColorKey {
- const available = AVATAR_COLOR_KEYS.filter((c) => !usedColors.has(c))
+ function pickAvailableColor(used: Set<string>): AvatarColorKey {
+ const available = AVATAR_COLOR_KEYS.filter((c) => !used.has(c))
if (available.length === 0) return AVATAR_COLOR_KEYS[Math.floor(Math.random() * AVATAR_COLOR_KEYS.length)]
return available[Math.floor(Math.random() * available.length)]
}
@@ -222,24 +222,15 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
const metadata = projectID
? globalSync.data.project.find((x) => x.id === projectID)
: globalSync.data.project.find((x) => x.worktree === project.worktree)
- return [
- {
- ...(metadata ?? {}),
- ...project,
- icon: { url: metadata?.icon?.url, color: metadata?.icon?.color },
+ return {
+ ...(metadata ?? {}),
+ ...project,
+ icon: {
+ url: metadata?.icon?.url,
+ override: metadata?.icon?.override,
+ color: metadata?.icon?.color,
},
- ]
- }
-
- function colorize(project: LocalProject) {
- if (project.icon?.color) return project
- const color = pickAvailableColor()
- usedColors.add(color)
- project.icon = { ...project.icon, color }
- if (project.id) {
- globalSdk.client.project.update({ projectID: project.id, icon: { color } })
}
- return project
}
const roots = createMemo(() => {
@@ -277,8 +268,37 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
})
})
- const enriched = createMemo(() => server.projects.list().flatMap(enrich))
- const list = createMemo(() => enriched().flatMap(colorize))
+ const enriched = createMemo(() => server.projects.list().map(enrich))
+ const list = createMemo(() => {
+ const projects = enriched()
+ return projects.map((project) => {
+ const color = project.icon?.color ?? colors[project.worktree]
+ if (!color) return project
+ const icon = project.icon ? { ...project.icon, color } : { color }
+ return { ...project, icon }
+ })
+ })
+
+ createEffect(() => {
+ const projects = enriched()
+ if (projects.length === 0) return
+
+ const used = new Set<string>()
+ for (const project of projects) {
+ const color = project.icon?.color ?? colors[project.worktree]
+ if (color) used.add(color)
+ }
+
+ for (const project of projects) {
+ if (project.icon?.color) continue
+ if (colors[project.worktree]) continue
+ const color = pickAvailableColor(used)
+ used.add(color)
+ setColors(project.worktree, color)
+ if (!project.id) continue
+ void globalSdk.client.project.update({ projectID: project.id, icon: { color } })
+ }
+ })
onMount(() => {
Promise.all(