Skip to content

Commit 337ef7e

Browse files
committed
update theme cache
1 parent 4a60e4d commit 337ef7e

4 files changed

Lines changed: 32 additions & 6 deletions

File tree

app/src/contexts/Theme.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ export const ThemeProvider = (props: Props) => {
3737
const [customThemes, setCustomThemes] = useState<Record<string, Theme>>({})
3838
const theme = props.theme ?? customThemes[themeName] ?? Themes[themeName] ?? Themes.blue
3939

40+
// 次回起動時のCachedThemeProvider用に、解決できたテーマをキャッシュする。
41+
// カスタムテーマはロード完了前は解決できないため、未解決のままblueを書き込まないよう条件付き
42+
useEffect(() => {
43+
const resolved = customThemes[themeName] ?? Themes[themeName]
44+
if (resolved) localStorage.setItem('cachedTheme', JSON.stringify(resolved))
45+
}, [customThemes, themeName])
46+
4047
const reloadThemes = useCallback(async () => {
4148
const themes = await loadCustomThemes(client)
4249
setCustomThemes(themes)

app/src/main.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,20 @@ import { OverlayStackBackBridge } from './components/OverlayStackBackBridge'
2626
import { AgeGateProvider } from './contexts/AgeGate'
2727
import { CssVar, OverlayStackProvider, Text, ThemeProvider as BaseThemeProvider } from '@concrnt/ui'
2828
import { Themes } from './data/themes'
29+
import { type Theme } from './types/Theme'
2930
import { usePersistent } from './hooks/usePersistent'
3031
import { type ReactNode } from 'react'
3132

32-
// 設定(cckv)ロード前でも、localStorageにキャッシュされたpreferenceから前回のテーマを引く
33-
// カスタムテーマは色が引けないためビルトインのみ・無ければblue
33+
// 設定(cckv)ロード前でも、前回解決されたテーマのキャッシュ(cachedTheme)から前回のテーマを引く
34+
// キャッシュ未生成時はpreferenceのテーマ名をビルトインから引き、それも無ければblue
3435
const CachedThemeProvider = ({ children }: { children: ReactNode }) => {
3536
const [cachedPref] = usePersistent<Preference>('preference')
36-
return <BaseThemeProvider theme={Themes[cachedPref?.themeName ?? ''] ?? Themes.blue}>{children}</BaseThemeProvider>
37+
const [cachedTheme] = usePersistent<Theme>('cachedTheme')
38+
return (
39+
<BaseThemeProvider theme={cachedTheme ?? Themes[cachedPref?.themeName ?? ''] ?? Themes.blue}>
40+
{children}
41+
</BaseThemeProvider>
42+
)
3743
}
3844

3945
const ClientLoadingScreen = () => {

web/src/contexts/Theme.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ export const ThemeProvider = (props: Props) => {
3737
const [customThemes, setCustomThemes] = useState<Record<string, Theme>>({})
3838
const theme = props.theme ?? customThemes[themeName] ?? Themes[themeName] ?? Themes.blue
3939

40+
// 次回起動時のCachedThemeProvider用に、解決できたテーマをキャッシュする。
41+
// カスタムテーマはロード完了前は解決できないため、未解決のままblueを書き込まないよう条件付き
42+
useEffect(() => {
43+
const resolved = customThemes[themeName] ?? Themes[themeName]
44+
if (resolved) localStorage.setItem('cachedTheme', JSON.stringify(resolved))
45+
}, [customThemes, themeName])
46+
4047
const reloadThemes = useCallback(async () => {
4148
const themes = await loadCustomThemes(client)
4249
setCustomThemes(themes)

web/src/main.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import { CssVar, IconButton, OverlayStackProvider, Text } from '@concrnt/ui'
5757
import { ThemeProvider as BaseThemeProvider } from '@concrnt/ui'
5858
import { MdArrowBack } from 'react-icons/md'
5959
import { Themes } from './data/themes'
60+
import { type Theme } from './types/Theme'
6061

6162
const ClientLoadingScreen = () => {
6263
const progress = useClientSetupProgress()
@@ -122,11 +123,16 @@ const hasSession = (() => {
122123
return !!domain && (!!masterKey || !!subKey)
123124
})()
124125

125-
// 設定(cckv)ロード前でも、localStorageにキャッシュされたpreferenceから前回のテーマを引く
126-
// カスタムテーマは色が引けないためビルトインのみ・無ければblue
126+
// 設定(cckv)ロード前でも、前回解決されたテーマのキャッシュ(cachedTheme)から前回のテーマを引く
127+
// キャッシュ未生成時はpreferenceのテーマ名をビルトインから引き、それも無ければblue
127128
const CachedThemeProvider = ({ children }: { children: ReactNode }) => {
128129
const [cachedPref] = usePersistent<Preference>('preference')
129-
return <BaseThemeProvider theme={Themes[cachedPref?.themeName ?? ''] ?? Themes.blue}>{children}</BaseThemeProvider>
130+
const [cachedTheme] = usePersistent<Theme>('cachedTheme')
131+
return (
132+
<BaseThemeProvider theme={cachedTheme ?? Themes[cachedPref?.themeName ?? ''] ?? Themes.blue}>
133+
{children}
134+
</BaseThemeProvider>
135+
)
130136
}
131137

132138
// client(≒プロフィール)が変わったら配下をまるごと作り直し、

0 commit comments

Comments
 (0)