| 191 | const loads = new Map<string, Promise<DesktopTheme | undefined>>() |
| 192 | |
| 193 | const load = (id: string) => { |
| 194 | const next = normalize(id) |
| 195 | if (!next) return Promise.resolve(undefined) |
| 196 | const hit = store.themes[next] |
| 197 | if (hit) return Promise.resolve(hit) |
| 198 | const pending = loads.get(next) |
| 199 | if (pending) return pending |
| 200 | const file = getFiles()[`./themes/${next}.json`] |
| 201 | if (!file) return Promise.resolve(undefined) |
| 202 | const task = file() |
| 203 | .then((mod) => { |
| 204 | const theme = mod.default |
| 205 | setStore("themes", next, theme) |
| 206 | return theme |
| 207 | }) |
| 208 | .finally(() => { |
| 209 | loads.delete(next) |
| 210 | }) |
| 211 | loads.set(next, task) |
| 212 | return task |
| 213 | } |
| 214 | |
| 215 | const applyTheme = (theme: DesktopTheme, themeId: string, mode: "light" | "dark") => { |
| 216 | applyThemeCss(theme, themeId, mode) |