(Feat) Migration PocketBase
This commit is contained in:
+36
-19
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user