Files
Classeo/frontend/src/lib/features/schedule/stores/scheduleCache.svelte.ts
Mathias STRASSER 8d950b0f3c
Some checks failed
CI / Backend Tests (push) Has been cancelled
CI / Frontend Tests (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Naming Conventions (push) Has been cancelled
CI / Build Check (push) Has been cancelled
feat: Permettre au parent de consulter les devoirs de ses enfants
Les parents avaient accès à l'emploi du temps de leurs enfants mais
pas à leurs devoirs. Sans cette visibilité, ils ne pouvaient pas
accompagner efficacement le travail scolaire à la maison, notamment
identifier les devoirs urgents ou contacter l'enseignant en cas
de besoin.

Le parent dispose désormais d'une vue consolidée multi-enfants avec
filtrage par enfant et par matière, badges d'urgence différenciés
(en retard / aujourd'hui / pour demain), lien de contact enseignant
pré-rempli, et cache offline scopé par utilisateur.
2026-03-23 12:09:01 +01:00

58 lines
1.6 KiB
TypeScript

import { browser } from '$app/environment';
export { isOffline } from '$lib/utils/network';
const LAST_SYNC_KEY = 'classeo:schedule:lastSync';
let lastSyncValue = $state<string | null>(
browser ? localStorage.getItem(LAST_SYNC_KEY) : null
);
/**
* Enregistre la date de dernière synchronisation de l'EDT.
*/
export function recordSync(): void {
if (!browser) return;
const now = new Date().toISOString();
localStorage.setItem(LAST_SYNC_KEY, now);
lastSyncValue = now;
}
/**
* Récupère la date de dernière synchronisation de l'EDT (réactif via $state).
*/
export function getLastSyncDate(): string | null {
return lastSyncValue;
}
/**
* Pré-charge 30 jours d'EDT en cache Service Worker (7 passés + 23 futurs).
*
* Appelé en arrière-plan pour alimenter le cache offline (AC5).
* Les requêtes sont interceptées par le SW (NetworkFirst)
* et les réponses sont automatiquement mises en cache.
*/
export async function prefetchScheduleDays(
fetchFn: (date: string) => Promise<unknown>,
today: Date = new Date()
): Promise<void> {
const CONCURRENCY = 5;
const PAST_DAYS = 7;
const FUTURE_DAYS = 23;
const dates: string[] = [];
for (let i = -PAST_DAYS; i <= FUTURE_DAYS; i++) {
const date = new Date(today);
date.setDate(date.getDate() + i);
const y = date.getFullYear();
const m = String(date.getMonth() + 1).padStart(2, '0');
const d = String(date.getDate()).padStart(2, '0');
dates.push(`${y}-${m}-${d}`);
}
for (let i = 0; i < dates.length; i += CONCURRENCY) {
const batch = dates.slice(i, i + CONCURRENCY);
await Promise.allSettled(batch.map((dateStr) => fetchFn(dateStr)));
}
}