(Feat) Migration PocketBase

This commit is contained in:
2026-07-18 11:51:32 +02:00
parent 1d3ee69c6d
commit e483fd9070
15 changed files with 522 additions and 453 deletions
+36 -19
View File
@@ -1,55 +1,72 @@
import 'package:flutter/foundation.dart';
import '../config.dart';
import '../supabase_config.dart';
import '../pocketbase_config.dart';
/// Réglages globaux du magasin (ligne unique `reglages` id=1 sur Supabase).
/// Étend [ChangeNotifier] pour que les écrans se rafraîchissent au changement.
/// Réglages globaux du magasin (unique enregistrement de la collection
/// `reglages` sur PocketBase). [ChangeNotifier] pour rafraîchir les écrans.
class Reglages extends ChangeNotifier {
Reglages._();
static final Reglages instance = Reglages._();
String? _recordId;
bool _abonne = false;
double _eurosParPoint = Config.eurosParPointParDefaut;
String _nomMagasin = '';
/// Nombre d'euros à dépenser pour gagner 1 point.
double get eurosParPoint => _eurosParPoint;
/// Nom du magasin, affiché sur la carte / le QR du client.
String get nomMagasin => _nomMagasin;
Future<void> charger() async {
try {
final row = await supabase
.from('reglages')
.select('euros_par_point, nom_magasin')
.eq('id', 1)
.maybeSingle();
if (row != null) {
_eurosParPoint = (row['euros_par_point'] as num?)?.toDouble() ??
final rows = await pb.collection('reglages').getFullList();
if (rows.isNotEmpty) {
final r = rows.first;
_recordId = r.id;
_eurosParPoint = (r.toJson()['euros_par_point'] as num?)?.toDouble() ??
Config.eurosParPointParDefaut;
_nomMagasin = (row['nom_magasin'] as String?) ?? '';
_nomMagasin = (r.toJson()['nom_magasin'] as String?) ?? '';
notifyListeners();
await _sabonner();
}
} catch (_) {
// Réglages par défaut si non connecté / hors-ligne.
// Valeurs par défaut si non connecté / serveur injoignable.
}
}
/// Abonnement temps réel : un changement de ratio/nom se propage aux appareils.
Future<void> _sabonner() async {
if (_abonne) return;
_abonne = true;
try {
await pb.collection('reglages').subscribe('*', (e) {
final rec = e.record;
if (rec == null) return;
_recordId = rec.id;
_eurosParPoint = (rec.toJson()['euros_par_point'] as num?)?.toDouble() ??
_eurosParPoint;
_nomMagasin = (rec.toJson()['nom_magasin'] as String?) ?? _nomMagasin;
notifyListeners();
});
} catch (_) {
_abonne = false;
}
}
/// Points gagnés pour un montant donné, selon le ratio courant.
double pointsPour(double euros) =>
_eurosParPoint > 0 ? euros / _eurosParPoint : 0;
Future<void> definirEurosParPoint(double valeur) async {
if (valeur <= 0) return;
await supabase.from('reglages').update({'euros_par_point': valeur}).eq('id', 1);
if (valeur <= 0 || _recordId == null) return;
await pb.collection('reglages').update(_recordId!, body: {'euros_par_point': valeur});
_eurosParPoint = valeur;
notifyListeners();
}
Future<void> definirNomMagasin(String valeur) async {
if (_recordId == null) return;
final v = valeur.trim();
await supabase.from('reglages').update({'nom_magasin': v}).eq('id', 1);
await pb.collection('reglages').update(_recordId!, body: {'nom_magasin': v});
_nomMagasin = v;
notifyListeners();
}