71 lines
2.4 KiB
JavaScript
71 lines
2.4 KiB
JavaScript
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
import { Classe } from './models';
|
|
|
|
const STORAGE_KEY = '@tirage_classes:classes';
|
|
|
|
/** Charge toutes les classes depuis le stockage local (offline), sous forme d'instances Classe. */
|
|
export async function chargerClasses() {
|
|
const brut = await AsyncStorage.getItem(STORAGE_KEY);
|
|
if (!brut) return [];
|
|
try {
|
|
const donnees = JSON.parse(brut);
|
|
return donnees.map((c) => Classe.fromJSON(c));
|
|
} catch (e) {
|
|
console.warn('Données locales corrompues, réinitialisation.', e);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
async function sauvegarderClasses(classes) {
|
|
await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(classes.map((c) => c.toJSON())));
|
|
}
|
|
|
|
export async function obtenirClasse(id) {
|
|
const classes = await chargerClasses();
|
|
return classes.find((c) => c.id === id) || null;
|
|
}
|
|
|
|
export async function creerClasse({ nom, nombreEleves, ponderationMax }) {
|
|
const classes = await chargerClasses();
|
|
const nouvelle = new Classe({ nom: nom.trim(), nombreEleves, ponderationMax });
|
|
classes.push(nouvelle);
|
|
await sauvegarderClasses(classes);
|
|
return nouvelle;
|
|
}
|
|
|
|
export async function modifierClasse(id, { nom, nombreEleves, ponderationMax }) {
|
|
const classes = await chargerClasses();
|
|
const classe = classes.find((c) => c.id === id);
|
|
if (!classe) throw new Error('Classe introuvable');
|
|
classe.nom = nom.trim();
|
|
classe.nombreEleves = Number(nombreEleves);
|
|
classe.ponderationMax = Number(ponderationMax) || 2;
|
|
await sauvegarderClasses(classes);
|
|
return classe;
|
|
}
|
|
|
|
export async function supprimerClasse(id) {
|
|
const classes = await chargerClasses();
|
|
await sauvegarderClasses(classes.filter((c) => c.id !== id));
|
|
}
|
|
|
|
/** Effectue un tirage pondéré sur la classe et persiste le résultat. */
|
|
export async function effectuerTirage(classeId) {
|
|
const classes = await chargerClasses();
|
|
const classe = classes.find((c) => c.id === classeId);
|
|
if (!classe) throw new Error('Classe introuvable');
|
|
classe.tirer();
|
|
await sauvegarderClasses(classes);
|
|
return classe;
|
|
}
|
|
|
|
/** Annule le dernier tirage et en effectue immédiatement un nouveau (bouton "Re-tirer"). */
|
|
export async function reTirer(classeId) {
|
|
const classes = await chargerClasses();
|
|
const classe = classes.find((c) => c.id === classeId);
|
|
if (!classe) throw new Error('Classe introuvable');
|
|
classe.reTirer();
|
|
await sauvegarderClasses(classes);
|
|
return classe;
|
|
}
|