Skip to content

Commit 7269d44

Browse files
Allow local storage settings to be overridden (#1129)
Required for classroom language switching via query param.
1 parent ba691aa commit 7269d44

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

src/common/use-storage.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ export function useStorage<T>(
1414
storageType: storageType,
1515
key: string,
1616
defaultValue: T,
17-
validate?: (x: unknown) => x is T
17+
validate?: (x: unknown) => x is T,
18+
overrides?: Partial<T>
1819
): [T, (value: T) => void] {
1920
const [state, setState] = useState<T>(() => {
2021
const storage =
@@ -29,6 +30,7 @@ export function useStorage<T>(
2930
parsed = {
3031
...defaultValue,
3132
...parsed,
33+
...overrides,
3234
};
3335
// Remove any top-level keys that aren't present in defaults.
3436
const unknownKeys = new Set(Object.keys(parsed));

src/settings/settings.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { createContext, ReactNode, useContext } from "react";
77
import { useStorage } from "../common/use-storage";
88
import { defaultCodeFontSizePt } from "../deployment/misc";
99
import { stage } from "../environment";
10+
import { flags } from "../flags";
1011

1112
export interface Language {
1213
id: string;
@@ -168,14 +169,15 @@ export const useSettings = (): SettingsContextValue => {
168169
};
169170

170171
const SettingsProvider = ({ children }: { children: ReactNode }) => {
171-
const settings = useStorage<Settings>(
172+
const [settings, setSettings] = useStorage<Settings>(
172173
"local",
173174
"settings",
174175
defaultSettings,
175-
isValidSettingsObject
176+
isValidSettingsObject,
177+
flags.noLang ? { languageId: getLanguageFromQuery() } : {}
176178
);
177179
return (
178-
<SettingsContext.Provider value={settings}>
180+
<SettingsContext.Provider value={[settings, setSettings]}>
179181
{children}
180182
</SettingsContext.Provider>
181183
);

0 commit comments

Comments
 (0)