import { useEffect } from 'react'; import { useApi, useDb, useStates } from '@cap-rel/smartcommon'; function OfflineCapableList() { const api = useApi(); const db = useDb({ name: 'myApp', version: 1, stores: { items: 'id, name, synced' } }); const st = useStates({ initialStates: { items: [], loading: true } }); useEffect(() => { loadItems(); }, []); const loadItems = async () => { try { // Essayer de charger depuis l'API const data = await api.private.get('items').json(); // Sauvegarder en local await db.items.clear(); await db.items.bulkAdd(data.map(i => ({ ...i, synced: true }))); st.set('items', data); } catch (err) { // En cas d'erreur réseau, charger depuis IndexedDB console.log('Mode offline - chargement local'); const localItems = await db.items.toArray(); st.set('items', localItems); } finally { st.set('loading', false); } }; const addItem = async (item) => { // Sauvegarder localement d'abord const id = await db.items.add({ ...item, synced: false }); // Mettre à jour l'UI st.set('items', [...st.get('items'), { ...item, id }]); // Tenter de synchroniser try { const result = await api.private.post('items', { json: item }).json(); await db.items.update(id, { ...result, synced: true }); } catch (err) { console.log('Sync échouée, sera retentée plus tard'); } }; // ... }