74 lines
No EOL
2.3 KiB
Dart
74 lines
No EOL
2.3 KiB
Dart
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))));
|
|
}
|
|
} |