initial commit

This commit is contained in:
2026-09-04 20:05:29 +02:00
parent bc63380515
commit e4ed54a6e2
13 changed files with 9123 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
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;
}