@@ -208,10 +208,10 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
208208 } )
209209 } )
210210
211- const usedColors = new Set < AvatarColorKey > ( )
211+ const [ colors , setColors ] = createStore < Record < string , AvatarColorKey > > ( { } )
212212
213- function pickAvailableColor ( ) : AvatarColorKey {
214- const available = AVATAR_COLOR_KEYS . filter ( ( c ) => ! usedColors . has ( c ) )
213+ function pickAvailableColor ( used : Set < string > ) : AvatarColorKey {
214+ const available = AVATAR_COLOR_KEYS . filter ( ( c ) => ! used . has ( c ) )
215215 if ( available . length === 0 ) return AVATAR_COLOR_KEYS [ Math . floor ( Math . random ( ) * AVATAR_COLOR_KEYS . length ) ]
216216 return available [ Math . floor ( Math . random ( ) * available . length ) ]
217217 }
@@ -222,24 +222,15 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
222222 const metadata = projectID
223223 ? globalSync . data . project . find ( ( x ) => x . id === projectID )
224224 : globalSync . data . project . find ( ( x ) => x . worktree === project . worktree )
225- return [
226- {
227- ...( metadata ?? { } ) ,
228- ...project ,
229- icon : { url : metadata ?. icon ?. url , color : metadata ?. icon ?. color } ,
225+ return {
226+ ...( metadata ?? { } ) ,
227+ ...project ,
228+ icon : {
229+ url : metadata ?. icon ?. url ,
230+ override : metadata ?. icon ?. override ,
231+ color : metadata ?. icon ?. color ,
230232 } ,
231- ]
232- }
233-
234- function colorize ( project : LocalProject ) {
235- if ( project . icon ?. color ) return project
236- const color = pickAvailableColor ( )
237- usedColors . add ( color )
238- project . icon = { ...project . icon , color }
239- if ( project . id ) {
240- globalSdk . client . project . update ( { projectID : project . id , icon : { color } } )
241233 }
242- return project
243234 }
244235
245236 const roots = createMemo ( ( ) => {
@@ -277,8 +268,37 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
277268 } )
278269 } )
279270
280- const enriched = createMemo ( ( ) => server . projects . list ( ) . flatMap ( enrich ) )
281- const list = createMemo ( ( ) => enriched ( ) . flatMap ( colorize ) )
271+ const enriched = createMemo ( ( ) => server . projects . list ( ) . map ( enrich ) )
272+ const list = createMemo ( ( ) => {
273+ const projects = enriched ( )
274+ return projects . map ( ( project ) => {
275+ const color = project . icon ?. color ?? colors [ project . worktree ]
276+ if ( ! color ) return project
277+ const icon = project . icon ? { ...project . icon , color } : { color }
278+ return { ...project , icon }
279+ } )
280+ } )
281+
282+ createEffect ( ( ) => {
283+ const projects = enriched ( )
284+ if ( projects . length === 0 ) return
285+
286+ const used = new Set < string > ( )
287+ for ( const project of projects ) {
288+ const color = project . icon ?. color ?? colors [ project . worktree ]
289+ if ( color ) used . add ( color )
290+ }
291+
292+ for ( const project of projects ) {
293+ if ( project . icon ?. color ) continue
294+ if ( colors [ project . worktree ] ) continue
295+ const color = pickAvailableColor ( used )
296+ used . add ( color )
297+ setColors ( project . worktree , color )
298+ if ( ! project . id ) continue
299+ void globalSdk . client . project . update ( { projectID : project . id , icon : { color } } )
300+ }
301+ } )
282302
283303 onMount ( ( ) => {
284304 Promise . all (
0 commit comments