Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | 3x 3x 3x 1x 1x 1x 1x 1x 1x 1x 1x 19x 19x 19x 2x 1x 2x 2x 2x 1x 2x 2x | import { create } from "zustand";
import AsyncStorage from "@react-native-async-storage/async-storage";
type LanguageCode = "en" | "fr";
type CampusCode = "SGW" | "LOYOLA";
interface GeneralSettingsState {
language: LanguageCode;
defaultCampus: CampusCode;
setLanguage: (lang: LanguageCode) => void;
setDefaultCampus: (campus: CampusCode) => void;
hydrateFromStorage: () => Promise<void>;
}
const STORAGE_KEY = "generalSettings.v1";
export const useGeneralSettingsStore = create<GeneralSettingsState>(
(set, get) => ({
language: "en",
defaultCampus: "SGW",
setLanguage: (language) => {
set((state) => {
const next = { ...state, language };
void persist(next);
return next;
});
},
setDefaultCampus: (defaultCampus) => {
set((state) => {
const next = { ...state, defaultCampus };
void persist(next);
return next;
});
},
hydrateFromStorage: async () => {
try {
const raw = await AsyncStorage.getItem(STORAGE_KEY);
if (!raw) return;
const parsed = JSON.parse(raw);
set((state) => ({
...state,
...parsed,
}));
} catch {
// ignore hydration errors
}
},
}),
);
async function persist(state: GeneralSettingsState) {
const { language, defaultCampus } = state;
try {
await AsyncStorage.setItem(
STORAGE_KEY,
JSON.stringify({ language, defaultCampus }),
);
} catch {
// best-effort persistence
}
}
export function useGeneralSettings() {
return useGeneralSettingsStore();
}
export function getLanguageLabel(lang: LanguageCode): string {
return lang === "fr" ? "Français (CA)" : "English (US)";
}
export function getCampusLabel(campus: CampusCode): string {
return campus === "LOYOLA" ? "Loyola Campus" : "Sir George Williams Campus";
}
|