@oxyhq/bloom 0.6.14 → 0.6.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/theme/BloomThemeProvider.js +16 -2
- package/lib/commonjs/theme/BloomThemeProvider.js.map +1 -1
- package/lib/commonjs/theme/persistence.js +20 -0
- package/lib/commonjs/theme/persistence.js.map +1 -1
- package/lib/module/theme/BloomThemeProvider.js +17 -3
- package/lib/module/theme/BloomThemeProvider.js.map +1 -1
- package/lib/module/theme/persistence.js +19 -0
- package/lib/module/theme/persistence.js.map +1 -1
- package/lib/typescript/commonjs/theme/BloomThemeProvider.d.ts +6 -0
- package/lib/typescript/commonjs/theme/BloomThemeProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme/persistence.d.ts +2 -0
- package/lib/typescript/commonjs/theme/persistence.d.ts.map +1 -1
- package/lib/typescript/module/theme/BloomThemeProvider.d.ts +6 -0
- package/lib/typescript/module/theme/BloomThemeProvider.d.ts.map +1 -1
- package/lib/typescript/module/theme/persistence.d.ts +2 -0
- package/lib/typescript/module/theme/persistence.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/BloomThemeProvider.persistence.test.tsx +104 -0
- package/src/theme/BloomThemeProvider.tsx +35 -3
- package/src/theme/persistence.ts +25 -0
|
@@ -109,11 +109,23 @@ function useThemeState({
|
|
|
109
109
|
colorPreset: next
|
|
110
110
|
});
|
|
111
111
|
}, [setPresetInternal, onColorPresetChange, persistKey, storage]);
|
|
112
|
+
const resetTheme = (0, _react.useCallback)(() => {
|
|
113
|
+
if (controlledMode === undefined) {
|
|
114
|
+
setModeInternal(defaultMode);
|
|
115
|
+
onModeChange?.(defaultMode);
|
|
116
|
+
}
|
|
117
|
+
if (controlledPreset === undefined) {
|
|
118
|
+
setPresetInternal(defaultPreset);
|
|
119
|
+
onColorPresetChange?.(defaultPreset);
|
|
120
|
+
}
|
|
121
|
+
void (0, _persistence.removePersistedTheme)(persistKey, storage);
|
|
122
|
+
}, [controlledMode, controlledPreset, defaultMode, defaultPreset, setModeInternal, setPresetInternal, onModeChange, onColorPresetChange, persistKey, storage]);
|
|
112
123
|
return {
|
|
113
124
|
mode,
|
|
114
125
|
colorPreset,
|
|
115
126
|
setMode,
|
|
116
127
|
setColorPreset,
|
|
128
|
+
resetTheme,
|
|
117
129
|
hydrated
|
|
118
130
|
};
|
|
119
131
|
}
|
|
@@ -138,6 +150,7 @@ function BloomThemeProvider({
|
|
|
138
150
|
colorPreset,
|
|
139
151
|
setMode,
|
|
140
152
|
setColorPreset,
|
|
153
|
+
resetTheme,
|
|
141
154
|
hydrated
|
|
142
155
|
} = useThemeState({
|
|
143
156
|
controlledMode,
|
|
@@ -166,8 +179,9 @@ function BloomThemeProvider({
|
|
|
166
179
|
mode,
|
|
167
180
|
colorPreset,
|
|
168
181
|
setMode,
|
|
169
|
-
setColorPreset
|
|
170
|
-
|
|
182
|
+
setColorPreset,
|
|
183
|
+
resetTheme
|
|
184
|
+
}), [colorPreset, resolved, isAdaptive, mode, setMode, setColorPreset, resetTheme]);
|
|
171
185
|
const shouldAwait = awaitHydration ?? Boolean(persistKey && storage);
|
|
172
186
|
const isGated = shouldAwait && !hydrated;
|
|
173
187
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(BloomThemeContext.Provider, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["require","_react","_interopRequireWildcard","_reactNative","_useControllableState","_FontLoader","_applyDarkClass","_buildTheme","_persistence","_setColorSchemeSafe","_useIsomorphicLayoutEffect","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_PRESET","DEFAULT_MODE","BloomThemeContext","exports","createContext","useThemeState","controlledMode","controlledPreset","defaultMode","defaultPreset","persistKey","storage","onModeChange","onColorPresetChange","syncResult","useState","readPersistedThemeSync","syncState","kind","state","initialMode","mode","initialPreset","colorPreset","hydrated","setHydrated","setModeInternal","useControllableState","value","defaultValue","setPresetInternal","modeRef","useRef","current","presetRef","useEffect","cancelled","readPersistedTheme","then","undefined","setMode","useCallback","next","writePersistedTheme","setColorPreset","BloomThemeProvider","defaultColorPreset","awaitHydration","onHydrating","fonts","onFontsLoading","children","rnScheme","useRNColorScheme","isAdaptive","effectiveMode","resolved","useIsomorphicLayoutEffect","setColorSchemeSafe","applyDarkClass","applyColorPresetVars","contextValue","useMemo","theme","buildTheme","shouldAwait","Boolean","isGated","jsx","Provider","FontLoader","enabled","fallback","BloomColorScope","parent","useContext","Error"],"sourceRoot":"../../../src","sources":["theme/BloomThemeProvider.tsx"],"mappings":";;;;;;;;AAIAA,OAAA;AAEA,IAAAC,MAAA,GAAAC,uBAAA,CAAAF,OAAA;AASA,IAAAG,YAAA,GAAAH,OAAA;AAEA,IAAAI,qBAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AAEA,IAAAM,eAAA,GAAAN,OAAA;AACA,IAAAO,WAAA,GAAAP,OAAA;AAEA,IAAAQ,YAAA,GAAAR,OAAA;
|
|
1
|
+
{"version":3,"names":["require","_react","_interopRequireWildcard","_reactNative","_useControllableState","_FontLoader","_applyDarkClass","_buildTheme","_persistence","_setColorSchemeSafe","_useIsomorphicLayoutEffect","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_PRESET","DEFAULT_MODE","BloomThemeContext","exports","createContext","useThemeState","controlledMode","controlledPreset","defaultMode","defaultPreset","persistKey","storage","onModeChange","onColorPresetChange","syncResult","useState","readPersistedThemeSync","syncState","kind","state","initialMode","mode","initialPreset","colorPreset","hydrated","setHydrated","setModeInternal","useControllableState","value","defaultValue","setPresetInternal","modeRef","useRef","current","presetRef","useEffect","cancelled","readPersistedTheme","then","undefined","setMode","useCallback","next","writePersistedTheme","setColorPreset","resetTheme","removePersistedTheme","BloomThemeProvider","defaultColorPreset","awaitHydration","onHydrating","fonts","onFontsLoading","children","rnScheme","useRNColorScheme","isAdaptive","effectiveMode","resolved","useIsomorphicLayoutEffect","setColorSchemeSafe","applyDarkClass","applyColorPresetVars","contextValue","useMemo","theme","buildTheme","shouldAwait","Boolean","isGated","jsx","Provider","FontLoader","enabled","fallback","BloomColorScope","parent","useContext","Error"],"sourceRoot":"../../../src","sources":["theme/BloomThemeProvider.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.readPersistedTheme = readPersistedTheme;
|
|
7
7
|
exports.readPersistedThemeSync = readPersistedThemeSync;
|
|
8
|
+
exports.removePersistedTheme = removePersistedTheme;
|
|
8
9
|
exports.webLocalStorage = void 0;
|
|
9
10
|
exports.writePersistedTheme = writePersistedTheme;
|
|
10
11
|
var _reactNative = require("react-native");
|
|
@@ -97,6 +98,18 @@ async function writePersistedTheme(persistKey, storage, state) {
|
|
|
97
98
|
// Persistence is best-effort: ignore quota and privacy-mode errors.
|
|
98
99
|
}
|
|
99
100
|
}
|
|
101
|
+
async function removePersistedTheme(persistKey, storage) {
|
|
102
|
+
if (!persistKey || !storage) return;
|
|
103
|
+
try {
|
|
104
|
+
if (typeof storage.removeItem === 'function') {
|
|
105
|
+
await storage.removeItem(persistKey);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
await storage.setItem(persistKey, '');
|
|
109
|
+
} catch {
|
|
110
|
+
// Best-effort cleanup.
|
|
111
|
+
}
|
|
112
|
+
}
|
|
100
113
|
|
|
101
114
|
/**
|
|
102
115
|
* `localStorage`-backed storage adapter. Only defined on web; on native the
|
|
@@ -121,6 +134,13 @@ const webLocalStorage = exports.webLocalStorage = (() => {
|
|
|
121
134
|
} catch {
|
|
122
135
|
// Swallow quota / privacy-mode errors.
|
|
123
136
|
}
|
|
137
|
+
},
|
|
138
|
+
removeItem: key => {
|
|
139
|
+
try {
|
|
140
|
+
ls.removeItem(key);
|
|
141
|
+
} catch {
|
|
142
|
+
// Swallow privacy-mode errors.
|
|
143
|
+
}
|
|
124
144
|
}
|
|
125
145
|
};
|
|
126
146
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_colorPresets","VALID_PRESETS","Set","APP_COLOR_NAMES","VALID_MODES","isValidMode","value","has","isValidPreset","parsePersistedTheme","raw","parsed","JSON","parse","obj","mode","undefined","colorPreset","isThenable","then","readPersistedThemeSync","persistKey","storage","kind","getItem","state","readPersistedTheme","writePersistedTheme","payload","setItem","stringify","webLocalStorage","exports","Platform","OS","globalThis","ls","localStorage","key"],"sourceRoot":"../../../src","sources":["theme/persistence.ts"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_colorPresets","VALID_PRESETS","Set","APP_COLOR_NAMES","VALID_MODES","isValidMode","value","has","isValidPreset","parsePersistedTheme","raw","parsed","JSON","parse","obj","mode","undefined","colorPreset","isThenable","then","readPersistedThemeSync","persistKey","storage","kind","getItem","state","readPersistedTheme","writePersistedTheme","payload","setItem","stringify","removePersistedTheme","removeItem","webLocalStorage","exports","Platform","OS","globalThis","ls","localStorage","key"],"sourceRoot":"../../../src","sources":["theme/persistence.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -11,7 +11,7 @@ import { useControllableState } from "../hooks/useControllableState.js";
|
|
|
11
11
|
import { FontLoader } from '../fonts/FontLoader';
|
|
12
12
|
import { applyDarkClass, applyColorPresetVars } from "./apply-dark-class.js";
|
|
13
13
|
import { buildTheme } from "./build-theme.js";
|
|
14
|
-
import { readPersistedTheme, readPersistedThemeSync, writePersistedTheme } from "./persistence.js";
|
|
14
|
+
import { readPersistedTheme, readPersistedThemeSync, removePersistedTheme, writePersistedTheme } from "./persistence.js";
|
|
15
15
|
import { setColorSchemeSafe } from "./set-color-scheme-safe.js";
|
|
16
16
|
import { useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
|
|
17
17
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
@@ -101,11 +101,23 @@ function useThemeState({
|
|
|
101
101
|
colorPreset: next
|
|
102
102
|
});
|
|
103
103
|
}, [setPresetInternal, onColorPresetChange, persistKey, storage]);
|
|
104
|
+
const resetTheme = useCallback(() => {
|
|
105
|
+
if (controlledMode === undefined) {
|
|
106
|
+
setModeInternal(defaultMode);
|
|
107
|
+
onModeChange?.(defaultMode);
|
|
108
|
+
}
|
|
109
|
+
if (controlledPreset === undefined) {
|
|
110
|
+
setPresetInternal(defaultPreset);
|
|
111
|
+
onColorPresetChange?.(defaultPreset);
|
|
112
|
+
}
|
|
113
|
+
void removePersistedTheme(persistKey, storage);
|
|
114
|
+
}, [controlledMode, controlledPreset, defaultMode, defaultPreset, setModeInternal, setPresetInternal, onModeChange, onColorPresetChange, persistKey, storage]);
|
|
104
115
|
return {
|
|
105
116
|
mode,
|
|
106
117
|
colorPreset,
|
|
107
118
|
setMode,
|
|
108
119
|
setColorPreset,
|
|
120
|
+
resetTheme,
|
|
109
121
|
hydrated
|
|
110
122
|
};
|
|
111
123
|
}
|
|
@@ -130,6 +142,7 @@ export function BloomThemeProvider({
|
|
|
130
142
|
colorPreset,
|
|
131
143
|
setMode,
|
|
132
144
|
setColorPreset,
|
|
145
|
+
resetTheme,
|
|
133
146
|
hydrated
|
|
134
147
|
} = useThemeState({
|
|
135
148
|
controlledMode,
|
|
@@ -158,8 +171,9 @@ export function BloomThemeProvider({
|
|
|
158
171
|
mode,
|
|
159
172
|
colorPreset,
|
|
160
173
|
setMode,
|
|
161
|
-
setColorPreset
|
|
162
|
-
|
|
174
|
+
setColorPreset,
|
|
175
|
+
resetTheme
|
|
176
|
+
}), [colorPreset, resolved, isAdaptive, mode, setMode, setColorPreset, resetTheme]);
|
|
163
177
|
const shouldAwait = awaitHydration ?? Boolean(persistKey && storage);
|
|
164
178
|
const isGated = shouldAwait && !hydrated;
|
|
165
179
|
return /*#__PURE__*/_jsx(BloomThemeContext.Provider, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","useColorScheme","useRNColorScheme","useControllableState","FontLoader","applyDarkClass","applyColorPresetVars","buildTheme","readPersistedTheme","readPersistedThemeSync","writePersistedTheme","setColorSchemeSafe","useIsomorphicLayoutEffect","jsx","_jsx","DEFAULT_PRESET","DEFAULT_MODE","BloomThemeContext","useThemeState","controlledMode","controlledPreset","defaultMode","defaultPreset","persistKey","storage","onModeChange","onColorPresetChange","syncResult","syncState","kind","state","initialMode","mode","initialPreset","colorPreset","hydrated","setHydrated","setModeInternal","value","defaultValue","setPresetInternal","modeRef","current","presetRef","cancelled","then","undefined","setMode","next","setColorPreset","BloomThemeProvider","defaultColorPreset","awaitHydration","onHydrating","fonts","onFontsLoading","children","rnScheme","isAdaptive","effectiveMode","resolved","contextValue","theme","shouldAwait","Boolean","isGated","Provider","enabled","fallback","BloomColorScope","parent","Error"],"sourceRoot":"../../../src","sources":["theme/BloomThemeProvider.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA,OAAO,uBAAoB;AAE3B,OAAOA,KAAK,IACVC,aAAa,EACbC,WAAW,EACXC,UAAU,EACVC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,SAASC,cAAc,IAAIC,gBAAgB,QAAQ,cAAc;AAEjE,SAASC,oBAAoB,QAAQ,kCAA+B;AACpE,SAASC,UAAU,QAAQ,qBAAqB;AAEhD,SAASC,cAAc,EAAEC,oBAAoB,QAAQ,uBAAoB;AACzE,SAASC,UAAU,QAAQ,kBAAe;AAE1C,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,mBAAmB,QAGd,kBAAe;AACtB,SAASC,kBAAkB,QAAQ,4BAAyB;AAC5D,SAASC,yBAAyB,QAAQ,mCAAgC;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAG3E,MAAMC,cAA4B,GAAG,KAAK;AAC1C,MAAMC,YAAuB,GAAG,QAAQ;
|
|
1
|
+
{"version":3,"names":["React","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","useColorScheme","useRNColorScheme","useControllableState","FontLoader","applyDarkClass","applyColorPresetVars","buildTheme","readPersistedTheme","readPersistedThemeSync","removePersistedTheme","writePersistedTheme","setColorSchemeSafe","useIsomorphicLayoutEffect","jsx","_jsx","DEFAULT_PRESET","DEFAULT_MODE","BloomThemeContext","useThemeState","controlledMode","controlledPreset","defaultMode","defaultPreset","persistKey","storage","onModeChange","onColorPresetChange","syncResult","syncState","kind","state","initialMode","mode","initialPreset","colorPreset","hydrated","setHydrated","setModeInternal","value","defaultValue","setPresetInternal","modeRef","current","presetRef","cancelled","then","undefined","setMode","next","setColorPreset","resetTheme","BloomThemeProvider","defaultColorPreset","awaitHydration","onHydrating","fonts","onFontsLoading","children","rnScheme","isAdaptive","effectiveMode","resolved","contextValue","theme","shouldAwait","Boolean","isGated","Provider","enabled","fallback","BloomColorScope","parent","Error"],"sourceRoot":"../../../src","sources":["theme/BloomThemeProvider.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -90,6 +90,18 @@ export async function writePersistedTheme(persistKey, storage, state) {
|
|
|
90
90
|
// Persistence is best-effort: ignore quota and privacy-mode errors.
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
+
export async function removePersistedTheme(persistKey, storage) {
|
|
94
|
+
if (!persistKey || !storage) return;
|
|
95
|
+
try {
|
|
96
|
+
if (typeof storage.removeItem === 'function') {
|
|
97
|
+
await storage.removeItem(persistKey);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
await storage.setItem(persistKey, '');
|
|
101
|
+
} catch {
|
|
102
|
+
// Best-effort cleanup.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
93
105
|
|
|
94
106
|
/**
|
|
95
107
|
* `localStorage`-backed storage adapter. Only defined on web; on native the
|
|
@@ -114,6 +126,13 @@ export const webLocalStorage = (() => {
|
|
|
114
126
|
} catch {
|
|
115
127
|
// Swallow quota / privacy-mode errors.
|
|
116
128
|
}
|
|
129
|
+
},
|
|
130
|
+
removeItem: key => {
|
|
131
|
+
try {
|
|
132
|
+
ls.removeItem(key);
|
|
133
|
+
} catch {
|
|
134
|
+
// Swallow privacy-mode errors.
|
|
135
|
+
}
|
|
117
136
|
}
|
|
118
137
|
};
|
|
119
138
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","APP_COLOR_NAMES","VALID_PRESETS","Set","VALID_MODES","isValidMode","value","has","isValidPreset","parsePersistedTheme","raw","parsed","JSON","parse","obj","mode","undefined","colorPreset","isThenable","then","readPersistedThemeSync","persistKey","storage","kind","getItem","state","readPersistedTheme","writePersistedTheme","payload","setItem","stringify","webLocalStorage","OS","globalThis","ls","localStorage","key"],"sourceRoot":"../../../src","sources":["theme/persistence.ts"],"mappings":";;AAAA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,eAAe,QAA2B,oBAAiB;AAGpE,MAAMC,aAAa,GAAG,IAAIC,GAAG,CAASF,eAAe,CAAC;AACtD,MAAMG,WAAW,GAAG,IAAID,GAAG,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;;AAE5E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;
|
|
1
|
+
{"version":3,"names":["Platform","APP_COLOR_NAMES","VALID_PRESETS","Set","VALID_MODES","isValidMode","value","has","isValidPreset","parsePersistedTheme","raw","parsed","JSON","parse","obj","mode","undefined","colorPreset","isThenable","then","readPersistedThemeSync","persistKey","storage","kind","getItem","state","readPersistedTheme","writePersistedTheme","payload","setItem","stringify","removePersistedTheme","removeItem","webLocalStorage","OS","globalThis","ls","localStorage","key"],"sourceRoot":"../../../src","sources":["theme/persistence.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,6 +9,12 @@ export interface BloomThemeContextValue {
|
|
|
9
9
|
colorPreset: AppColorName;
|
|
10
10
|
setMode: (mode: ThemeMode) => void;
|
|
11
11
|
setColorPreset: (preset: AppColorName) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Restore mode and color preset to the provider defaults
|
|
14
|
+
* (`defaultMode` / `defaultColorPreset`) and clear the persisted entry.
|
|
15
|
+
* Use this when signing out or otherwise resetting per-user state.
|
|
16
|
+
*/
|
|
17
|
+
resetTheme: () => void;
|
|
12
18
|
}
|
|
13
19
|
export declare const BloomThemeContext: React.Context<BloomThemeContextValue | null>;
|
|
14
20
|
export interface BloomThemeProviderProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BloomThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/BloomThemeProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAQN,MAAM,OAAO,CAAC;AAQf,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"BloomThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/BloomThemeProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAQN,MAAM,OAAO,CAAC;AAQf,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAKL,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKhD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,YAAY,CAAC;IAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C;;;;OAIG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,iBAAiB,8CAAqD,CAAC;AAEpF,MAAM,WAAW,uBAAuB;IACtC,uFAAuF;IACvF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mEAAmE;IACnE,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,YAAY,CAAC;IAElC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAErD;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAkJD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,gBAAgB,EAC7B,WAA0B,EAC1B,kBAAmC,EACnC,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,KAAY,EACZ,cAAc,EACd,QAAQ,GACT,EAAE,uBAAuB,2CAkDzB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,YAAY,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAc9E"}
|
|
@@ -15,6 +15,7 @@ import type { ThemeMode } from './types';
|
|
|
15
15
|
export interface BloomThemeStorage {
|
|
16
16
|
getItem(key: string): string | null | Promise<string | null>;
|
|
17
17
|
setItem(key: string, value: string): void | Promise<void>;
|
|
18
|
+
removeItem?(key: string): void | Promise<void>;
|
|
18
19
|
}
|
|
19
20
|
export interface PersistedThemeState {
|
|
20
21
|
mode?: ThemeMode;
|
|
@@ -40,6 +41,7 @@ export type SyncReadResult = {
|
|
|
40
41
|
export declare function readPersistedThemeSync(persistKey: string | undefined, storage: BloomThemeStorage | undefined): SyncReadResult;
|
|
41
42
|
export declare function readPersistedTheme(persistKey: string | undefined, storage: BloomThemeStorage | undefined): Promise<PersistedThemeState | null>;
|
|
42
43
|
export declare function writePersistedTheme(persistKey: string | undefined, storage: BloomThemeStorage | undefined, state: PersistedThemeState): Promise<void>;
|
|
44
|
+
export declare function removePersistedTheme(persistKey: string | undefined, storage: BloomThemeStorage | undefined): Promise<void>;
|
|
43
45
|
/**
|
|
44
46
|
* `localStorage`-backed storage adapter. Only defined on web; on native the
|
|
45
47
|
* export is `undefined` so consumers pass an `AsyncStorage` adapter explicitly.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../../src/theme/persistence.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKzC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../../src/theme/persistence.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKzC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AA4BD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAKrB;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,cAAc,CAYhB;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CASrC;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,iBAAiB,GAAG,SA8B9C,CAAC"}
|
|
@@ -9,6 +9,12 @@ export interface BloomThemeContextValue {
|
|
|
9
9
|
colorPreset: AppColorName;
|
|
10
10
|
setMode: (mode: ThemeMode) => void;
|
|
11
11
|
setColorPreset: (preset: AppColorName) => void;
|
|
12
|
+
/**
|
|
13
|
+
* Restore mode and color preset to the provider defaults
|
|
14
|
+
* (`defaultMode` / `defaultColorPreset`) and clear the persisted entry.
|
|
15
|
+
* Use this when signing out or otherwise resetting per-user state.
|
|
16
|
+
*/
|
|
17
|
+
resetTheme: () => void;
|
|
12
18
|
}
|
|
13
19
|
export declare const BloomThemeContext: React.Context<BloomThemeContextValue | null>;
|
|
14
20
|
export interface BloomThemeProviderProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BloomThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/BloomThemeProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAQN,MAAM,OAAO,CAAC;AAQf,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"BloomThemeProvider.d.ts","sourceRoot":"","sources":["../../../../src/theme/BloomThemeProvider.tsx"],"names":[],"mappings":"AAIA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,KAQN,MAAM,OAAO,CAAC;AAQf,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAKL,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKhD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,YAAY,CAAC;IAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC/C;;;;OAIG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,iBAAiB,8CAAqD,CAAC;AAEpF,MAAM,WAAW,uBAAuB;IACtC,uFAAuF;IACvF,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mEAAmE;IACnE,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,YAAY,CAAC;IAElC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAErD;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE9B,2DAA2D;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAEjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAkJD,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,gBAAgB,EAC7B,WAA0B,EAC1B,kBAAmC,EACnC,YAAY,EACZ,mBAAmB,EACnB,UAAU,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,KAAY,EACZ,cAAc,EACd,QAAQ,GACT,EAAE,uBAAuB,2CAkDzB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,YAAY,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAc9E"}
|
|
@@ -15,6 +15,7 @@ import type { ThemeMode } from './types';
|
|
|
15
15
|
export interface BloomThemeStorage {
|
|
16
16
|
getItem(key: string): string | null | Promise<string | null>;
|
|
17
17
|
setItem(key: string, value: string): void | Promise<void>;
|
|
18
|
+
removeItem?(key: string): void | Promise<void>;
|
|
18
19
|
}
|
|
19
20
|
export interface PersistedThemeState {
|
|
20
21
|
mode?: ThemeMode;
|
|
@@ -40,6 +41,7 @@ export type SyncReadResult = {
|
|
|
40
41
|
export declare function readPersistedThemeSync(persistKey: string | undefined, storage: BloomThemeStorage | undefined): SyncReadResult;
|
|
41
42
|
export declare function readPersistedTheme(persistKey: string | undefined, storage: BloomThemeStorage | undefined): Promise<PersistedThemeState | null>;
|
|
42
43
|
export declare function writePersistedTheme(persistKey: string | undefined, storage: BloomThemeStorage | undefined, state: PersistedThemeState): Promise<void>;
|
|
44
|
+
export declare function removePersistedTheme(persistKey: string | undefined, storage: BloomThemeStorage | undefined): Promise<void>;
|
|
43
45
|
/**
|
|
44
46
|
* `localStorage`-backed storage adapter. Only defined on web; on native the
|
|
45
47
|
* export is `undefined` so consumers pass an `AsyncStorage` adapter explicitly.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../../src/theme/persistence.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKzC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../../src/theme/persistence.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKzC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AA4BD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAKrB;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,cAAc,CAYhB;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CASrC;AAED,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,iBAAiB,GAAG,SAAS,GACrC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,iBAAiB,GAAG,SA8B9C,CAAC"}
|
package/package.json
CHANGED
|
@@ -29,6 +29,9 @@ function createSyncStorage(initial?: PersistedThemeState): BloomThemeStorage & {
|
|
|
29
29
|
setItem: (key, value) => {
|
|
30
30
|
store[key] = value;
|
|
31
31
|
},
|
|
32
|
+
removeItem: (key) => {
|
|
33
|
+
delete store[key];
|
|
34
|
+
},
|
|
32
35
|
};
|
|
33
36
|
}
|
|
34
37
|
|
|
@@ -215,3 +218,104 @@ describe('BloomThemeProvider — persistence', () => {
|
|
|
215
218
|
expect(getByTestId('preset').props.children).toBe('oxy');
|
|
216
219
|
});
|
|
217
220
|
});
|
|
221
|
+
|
|
222
|
+
describe('BloomThemeProvider — resetTheme', () => {
|
|
223
|
+
function Harness({ onReady }: { onReady: (reset: () => void) => void }) {
|
|
224
|
+
const ctx = useBloomTheme();
|
|
225
|
+
React.useEffect(() => {
|
|
226
|
+
onReady(ctx.resetTheme);
|
|
227
|
+
}, [ctx.resetTheme, onReady]);
|
|
228
|
+
return (
|
|
229
|
+
<>
|
|
230
|
+
<Text testID="mode">{ctx.mode}</Text>
|
|
231
|
+
<Text testID="preset">{ctx.colorPreset}</Text>
|
|
232
|
+
</>
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
it('restores defaults and clears the persisted entry', async () => {
|
|
237
|
+
const storage = createSyncStorage({ mode: 'dark', colorPreset: 'blue' });
|
|
238
|
+
expect(storage.store['bloom-theme']).toBeDefined();
|
|
239
|
+
|
|
240
|
+
let resetFn: (() => void) | undefined;
|
|
241
|
+
|
|
242
|
+
const { getByTestId } = render(
|
|
243
|
+
<BloomThemeProvider
|
|
244
|
+
persistKey="bloom-theme"
|
|
245
|
+
storage={storage}
|
|
246
|
+
defaultMode="system"
|
|
247
|
+
defaultColorPreset="oxy"
|
|
248
|
+
>
|
|
249
|
+
<Harness onReady={(reset) => { resetFn = reset; }} />
|
|
250
|
+
</BloomThemeProvider>,
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
expect(getByTestId('mode').props.children).toBe('dark');
|
|
254
|
+
expect(getByTestId('preset').props.children).toBe('blue');
|
|
255
|
+
|
|
256
|
+
await act(async () => {
|
|
257
|
+
resetFn?.();
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
expect(getByTestId('mode').props.children).toBe('system');
|
|
261
|
+
expect(getByTestId('preset').props.children).toBe('oxy');
|
|
262
|
+
|
|
263
|
+
await waitFor(() => {
|
|
264
|
+
expect(storage.store['bloom-theme']).toBeUndefined();
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('uses removeItem when the adapter provides it', async () => {
|
|
269
|
+
const removeItem = jest.fn();
|
|
270
|
+
const storage: BloomThemeStorage = {
|
|
271
|
+
getItem: () => JSON.stringify({ mode: 'dark', colorPreset: 'blue' }),
|
|
272
|
+
setItem: () => undefined,
|
|
273
|
+
removeItem,
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
let resetFn: (() => void) | undefined;
|
|
277
|
+
|
|
278
|
+
render(
|
|
279
|
+
<BloomThemeProvider
|
|
280
|
+
persistKey="bloom-theme"
|
|
281
|
+
storage={storage}
|
|
282
|
+
defaultMode="system"
|
|
283
|
+
defaultColorPreset="oxy"
|
|
284
|
+
>
|
|
285
|
+
<Harness onReady={(reset) => { resetFn = reset; }} />
|
|
286
|
+
</BloomThemeProvider>,
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
await act(async () => {
|
|
290
|
+
resetFn?.();
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
await waitFor(() => {
|
|
294
|
+
expect(removeItem).toHaveBeenCalledWith('bloom-theme');
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
it('does nothing when mode is controlled', async () => {
|
|
299
|
+
const storage = createSyncStorage({ mode: 'dark', colorPreset: 'blue' });
|
|
300
|
+
let resetFn: (() => void) | undefined;
|
|
301
|
+
|
|
302
|
+
const { getByTestId } = render(
|
|
303
|
+
<BloomThemeProvider
|
|
304
|
+
persistKey="bloom-theme"
|
|
305
|
+
storage={storage}
|
|
306
|
+
mode="dark"
|
|
307
|
+
defaultMode="system"
|
|
308
|
+
defaultColorPreset="oxy"
|
|
309
|
+
>
|
|
310
|
+
<Harness onReady={(reset) => { resetFn = reset; }} />
|
|
311
|
+
</BloomThemeProvider>,
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
await act(async () => {
|
|
315
|
+
resetFn?.();
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
expect(getByTestId('mode').props.children).toBe('dark');
|
|
319
|
+
expect(getByTestId('preset').props.children).toBe('oxy');
|
|
320
|
+
});
|
|
321
|
+
});
|
|
@@ -24,6 +24,7 @@ import { type AppColorName } from './color-presets';
|
|
|
24
24
|
import {
|
|
25
25
|
readPersistedTheme,
|
|
26
26
|
readPersistedThemeSync,
|
|
27
|
+
removePersistedTheme,
|
|
27
28
|
writePersistedTheme,
|
|
28
29
|
type BloomThemeStorage,
|
|
29
30
|
type SyncReadResult,
|
|
@@ -41,6 +42,12 @@ export interface BloomThemeContextValue {
|
|
|
41
42
|
colorPreset: AppColorName;
|
|
42
43
|
setMode: (mode: ThemeMode) => void;
|
|
43
44
|
setColorPreset: (preset: AppColorName) => void;
|
|
45
|
+
/**
|
|
46
|
+
* Restore mode and color preset to the provider defaults
|
|
47
|
+
* (`defaultMode` / `defaultColorPreset`) and clear the persisted entry.
|
|
48
|
+
* Use this when signing out or otherwise resetting per-user state.
|
|
49
|
+
*/
|
|
50
|
+
resetTheme: () => void;
|
|
44
51
|
}
|
|
45
52
|
|
|
46
53
|
export const BloomThemeContext = createContext<BloomThemeContextValue | null>(null);
|
|
@@ -103,6 +110,7 @@ interface ThemeStateResult {
|
|
|
103
110
|
colorPreset: AppColorName;
|
|
104
111
|
setMode: (mode: ThemeMode) => void;
|
|
105
112
|
setColorPreset: (preset: AppColorName) => void;
|
|
113
|
+
resetTheme: () => void;
|
|
106
114
|
hydrated: boolean;
|
|
107
115
|
}
|
|
108
116
|
|
|
@@ -204,7 +212,30 @@ function useThemeState({
|
|
|
204
212
|
[setPresetInternal, onColorPresetChange, persistKey, storage],
|
|
205
213
|
);
|
|
206
214
|
|
|
207
|
-
|
|
215
|
+
const resetTheme = useCallback(() => {
|
|
216
|
+
if (controlledMode === undefined) {
|
|
217
|
+
setModeInternal(defaultMode);
|
|
218
|
+
onModeChange?.(defaultMode);
|
|
219
|
+
}
|
|
220
|
+
if (controlledPreset === undefined) {
|
|
221
|
+
setPresetInternal(defaultPreset);
|
|
222
|
+
onColorPresetChange?.(defaultPreset);
|
|
223
|
+
}
|
|
224
|
+
void removePersistedTheme(persistKey, storage);
|
|
225
|
+
}, [
|
|
226
|
+
controlledMode,
|
|
227
|
+
controlledPreset,
|
|
228
|
+
defaultMode,
|
|
229
|
+
defaultPreset,
|
|
230
|
+
setModeInternal,
|
|
231
|
+
setPresetInternal,
|
|
232
|
+
onModeChange,
|
|
233
|
+
onColorPresetChange,
|
|
234
|
+
persistKey,
|
|
235
|
+
storage,
|
|
236
|
+
]);
|
|
237
|
+
|
|
238
|
+
return { mode, colorPreset, setMode, setColorPreset, resetTheme, hydrated };
|
|
208
239
|
}
|
|
209
240
|
|
|
210
241
|
export function BloomThemeProvider({
|
|
@@ -224,7 +255,7 @@ export function BloomThemeProvider({
|
|
|
224
255
|
}: BloomThemeProviderProps) {
|
|
225
256
|
const rnScheme = useRNColorScheme();
|
|
226
257
|
|
|
227
|
-
const { mode, colorPreset, setMode, setColorPreset, hydrated } = useThemeState({
|
|
258
|
+
const { mode, colorPreset, setMode, setColorPreset, resetTheme, hydrated } = useThemeState({
|
|
228
259
|
controlledMode,
|
|
229
260
|
controlledPreset,
|
|
230
261
|
defaultMode,
|
|
@@ -256,8 +287,9 @@ export function BloomThemeProvider({
|
|
|
256
287
|
colorPreset,
|
|
257
288
|
setMode,
|
|
258
289
|
setColorPreset,
|
|
290
|
+
resetTheme,
|
|
259
291
|
}),
|
|
260
|
-
[colorPreset, resolved, isAdaptive, mode, setMode, setColorPreset],
|
|
292
|
+
[colorPreset, resolved, isAdaptive, mode, setMode, setColorPreset, resetTheme],
|
|
261
293
|
);
|
|
262
294
|
|
|
263
295
|
const shouldAwait = awaitHydration ?? Boolean(persistKey && storage);
|
package/src/theme/persistence.ts
CHANGED
|
@@ -20,6 +20,7 @@ const VALID_MODES = new Set<string>(['light', 'dark', 'system', 'adaptive']);
|
|
|
20
20
|
export interface BloomThemeStorage {
|
|
21
21
|
getItem(key: string): string | null | Promise<string | null>;
|
|
22
22
|
setItem(key: string, value: string): void | Promise<void>;
|
|
23
|
+
removeItem?(key: string): void | Promise<void>;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
export interface PersistedThemeState {
|
|
@@ -119,6 +120,23 @@ export async function writePersistedTheme(
|
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
122
|
|
|
123
|
+
export async function removePersistedTheme(
|
|
124
|
+
persistKey: string | undefined,
|
|
125
|
+
storage: BloomThemeStorage | undefined,
|
|
126
|
+
): Promise<void> {
|
|
127
|
+
if (!persistKey || !storage) return;
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
if (typeof storage.removeItem === 'function') {
|
|
131
|
+
await storage.removeItem(persistKey);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
await storage.setItem(persistKey, '');
|
|
135
|
+
} catch {
|
|
136
|
+
// Best-effort cleanup.
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
122
140
|
/**
|
|
123
141
|
* `localStorage`-backed storage adapter. Only defined on web; on native the
|
|
124
142
|
* export is `undefined` so consumers pass an `AsyncStorage` adapter explicitly.
|
|
@@ -145,5 +163,12 @@ export const webLocalStorage: BloomThemeStorage | undefined = (() => {
|
|
|
145
163
|
// Swallow quota / privacy-mode errors.
|
|
146
164
|
}
|
|
147
165
|
},
|
|
166
|
+
removeItem: (key) => {
|
|
167
|
+
try {
|
|
168
|
+
ls.removeItem(key);
|
|
169
|
+
} catch {
|
|
170
|
+
// Swallow privacy-mode errors.
|
|
171
|
+
}
|
|
172
|
+
},
|
|
148
173
|
};
|
|
149
174
|
})();
|