cid_app/lib/firebase_exchange.dart

74 lines
2.3 KiB
Dart
Raw Normal View History

2026-02-27 23:26:13 +01:00
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:math';
import 'dart:async';
import 'cid_data_manager.dart';
import 'global_data.dart';
class FirebaseExchange {
static final FirebaseFirestore _db = FirebaseFirestore.instance;
static const String collectionName = 'scambi_cid';
// --- LATO CHE GENERA IL QR (Host) ---
static Future<Map<String, dynamic>> avviaSessioneRealTime() async {
String sessionId = _generaCodiceUnivoco();
String mioLato = GlobalData.latoCorrente;
// Estrazione dati
Map<String, dynamic> mieiDati = CidDataManager.estraiDatiPerExport();
Map<String, dynamic> payload = {
'created_at': FieldValue.serverTimestamp(),
'expires_at': DateTime.now().add(const Duration(minutes: 10)).millisecondsSinceEpoch,
'dati_$mioLato': mieiDati,
};
// Scrittura su Firebase
await _db.collection(collectionName).doc(sessionId).set(payload);
return {
'sessionId': sessionId,
'stream': _db.collection(collectionName).doc(sessionId).snapshots()
};
}
// --- LATO CHE SCANSIONA (Guest) ---
static Future<bool> completaScambio(String sessionId) async {
try {
sessionId = sessionId.trim().toUpperCase();
DocumentReference docRef = _db.collection(collectionName).doc(sessionId);
DocumentSnapshot doc = await docRef.get();
if (!doc.exists) return false;
Map<String, dynamic> data = doc.data() as Map<String, dynamic>;
String mioLato = GlobalData.latoCorrente;
String latoAltro = mioLato == 'A' ? 'B' : 'A';
// 1. Importo i dati dell'altro
if (data['dati_$latoAltro'] != null) {
CidDataManager.importaDati(data['dati_$latoAltro']);
} else {
return false;
}
// 2. Invio i miei dati per completare lo scambio
Map<String, dynamic> mieiDati = CidDataManager.estraiDatiPerExport();
await docRef.update({
'dati_$mioLato': mieiDati
});
return true;
} catch (e) {
print("Errore durante lo scambio: $e");
return false;
}
}
static String _generaCodiceUnivoco() {
const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
Random rnd = Random();
return String.fromCharCodes(Iterable.generate(
6, (_) => chars.codeUnitAt(rnd.nextInt(chars.length))));
}
}