/** * Lo stato condiviso fra le schermate: lingua, impostazioni della partita, * partita in corso e ultimi luoghi usati. Impostazioni e recenti si salvano in * un archivio chiave/valore e si rileggono all'avvio. */ import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react'; import Storage from 'expo-sqlite/kv-store'; import { getLocales } from 'expo-localization'; import { validaImpostazioni, validaRecenti, type Impostazioni, type Partita } from '../gioco.ts'; import { linguaDaTag, t as testo, type Chiave, type Lingua } from '../testi/index.ts'; export function leggi(chiave: string): unknown { try { const v = Storage.getItemSync(chiave); return v == null ? null : JSON.parse(v); } catch { return null; } } export function scrivi(chiave: string, valore: unknown): void { try { Storage.setItemSync(chiave, JSON.stringify(valore)); } catch { // Se l'archivio non scrive si perde solo la preferenza, non la partita. } } interface Stato { lingua: Lingua; t: (k: Chiave) => string; imp: Impostazioni; setImp: (i: Impostazioni) => void; partita: Partita | null; setPartita: (p: Partita | null) => void; recenti: number[]; setRecenti: (r: number[]) => void; } const Contesto = createContext(null); export function StatoProvider({ children }: { children: ReactNode }) { const [lingua] = useState(() => linguaDaTag(getLocales()[0]?.languageTag)); const [imp, setImpInterno] = useState(() => validaImpostazioni(leggi('impostazioni'))); const [recenti, setRecentiInterno] = useState(() => validaRecenti(leggi('recenti'))); const [partita, setPartita] = useState(null); const t = useCallback((k: Chiave) => testo(lingua, k), [lingua]); const setImp = useCallback((i: Impostazioni) => { setImpInterno(i); scrivi('impostazioni', i); }, []); const setRecenti = useCallback((r: number[]) => { setRecentiInterno(r); scrivi('recenti', r); }, []); const valore = useMemo( () => ({ lingua, t, imp, setImp, partita, setPartita, recenti, setRecenti }), [lingua, t, imp, setImp, partita, recenti, setRecenti], ); return {children}; } export function useStato(): Stato { const s = useContext(Contesto); if (!s) throw new Error('useStato usato fuori da StatoProvider'); return s; }