Files
itinova-budget-si/client/src/contexts/AnneeContext.tsx

72 lines
2.1 KiB
TypeScript

// AnneeContext.tsx — Contexte global pour l'année sélectionnée
// Partagé entre toutes les pages : Renouvellement PC, CAPEX-Construction, CAPEX-Synthèse, DSI-OPEX
import { createContext, useContext, useState, ReactNode } from 'react';
export const ANNEES_DISPONIBLES = [2025, 2026, 2027, 2028, 2029, 2030];
export const ANNEE_DEFAUT = 2027;
const PARAMETRES_STORAGE_KEY = 'itinova_budget_parametres';
function getAnneeDefautFromParametres(): number {
try {
const raw = localStorage.getItem(PARAMETRES_STORAGE_KEY);
if (raw) {
const parsed = JSON.parse(raw);
if (typeof parsed.anneeDefaut === 'number' && ANNEES_DISPONIBLES.includes(parsed.anneeDefaut)) {
return parsed.anneeDefaut;
}
}
} catch { /* ignore */ }
return ANNEE_DEFAUT;
}
interface AnneeContextType {
annee: number;
setAnnee: (a: number) => void;
}
const AnneeContext = createContext<AnneeContextType>({
annee: ANNEE_DEFAUT,
setAnnee: () => {},
});
export function AnneeProvider({ children }: { children: ReactNode }) {
const [annee, setAnneeState] = useState<number>(() => {
try {
const stored = localStorage.getItem('itinova_annee_selectionnee');
if (stored) {
const parsed = parseInt(stored, 10);
if (ANNEES_DISPONIBLES.includes(parsed)) return parsed;
}
// Pas de session mémorisée → utiliser l'année par défaut des paramètres
return getAnneeDefautFromParametres();
} catch { return ANNEE_DEFAUT; }
});
const setAnnee = (a: number) => {
setAnneeState(a);
try { localStorage.setItem('itinova_annee_selectionnee', String(a)); } catch {}
};
return (
<AnneeContext.Provider value={{ annee, setAnnee }}>
{children}
</AnneeContext.Provider>
);
}
export function useAnnee() {
return useContext(AnneeContext);
}
// Génère la clé localStorage pour les saisies CAPEX d'une année donnée
export function getCapexStorageKey(annee: number): string {
return `itinova_budget_capex_${annee}`;
}
// Génère la clé localStorage pour les saisies OPEX d'une année donnée
export function getOpexStorageKey(annee: number): string {
return `itinova_budget_opex_${annee}`;
}