|
|
@@ -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(
|