All files / src/hooks useGeneralSettings.ts

100% Statements 24/24
100% Branches 6/6
100% Functions 11/11
100% Lines 22/22

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";
}