Auto-sync: 20260304_180001

This commit is contained in:
Paolo 2026-03-04 18:00:01 +01:00
parent 2d6e86db3c
commit a3a30ebf1e
10 changed files with 114 additions and 21 deletions

View file

@ -3,20 +3,28 @@ import 'package:provider/provider.dart';
import 'core/theme_manager.dart'; import 'core/theme_manager.dart';
import 'logic/game_controller.dart'; import 'logic/game_controller.dart';
import 'ui/home/home_screen.dart'; import 'ui/home/home_screen.dart';
import 'services/storage_service.dart'; // <-- Importiamo il servizio import 'services/storage_service.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_auth/firebase_auth.dart'; // <-- NUOVO IMPORT
import 'firebase_options.dart'; import 'firebase_options.dart';
void main() async { void main() async {
// Assicuriamoci che i motori di Flutter siano pronti // Assicuriamoci che i motori di Flutter siano pronti
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
// 1. Accendiamo Firebase! (Questo ti era sfuggito) // 1. Accendiamo Firebase!
await Firebase.initializeApp( await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform, options: DefaultFirebaseOptions.currentPlatform,
); );
// 2. Accendiamo la Memoria Locale! // 2. Login Silenzioso (Crea la nostra "Identità Sicura" per Firebase)
try {
await FirebaseAuth.instance.signInAnonymously();
} catch (e) {
debugPrint("Errore Auth: $e");
}
// 3. Accendiamo la Memoria Locale!
await StorageService.instance.init(); await StorageService.instance.init();
runApp( runApp(

View file

@ -6,6 +6,8 @@ import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:cloud_firestore/cloud_firestore.dart';
import '../core/app_colors.dart'; import '../core/app_colors.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/foundation.dart';
class StorageService { class StorageService {
static final StorageService instance = StorageService._internal(); static final StorageService instance = StorageService._internal();
@ -59,15 +61,22 @@ class StorageService {
Future<void> syncLeaderboard() async { Future<void> syncLeaderboard() async {
if (playerName.isNotEmpty) { if (playerName.isNotEmpty) {
try { try {
await FirebaseFirestore.instance.collection('leaderboard').doc(playerName).set({ // Recuperiamo il nostro ID segreto e univoco appena creato
'name': playerName, final user = FirebaseAuth.instance.currentUser;
if (user != null) {
// Usiamo user.uid come nome del documento, NON più il playerName!
await FirebaseFirestore.instance.collection('leaderboard').doc(user.uid).set({
'name': playerName, // Il nome rimane dentro per mostrarlo nella lista
'xp': totalXP, 'xp': totalXP,
'level': playerLevel, 'level': playerLevel,
'wins': wins, 'wins': wins,
'lastActive': FieldValue.serverTimestamp(), 'lastActive': FieldValue.serverTimestamp(),
}, SetOptions(merge: true)); }, SetOptions(merge: true));
}
} catch(e) { } catch(e) {
// Ignoriamo gli errori se manca la rete, si sincronizzerà dopo // Ignoriamo gli errori se manca la rete, si sincronizzerà dopo
debugPrint("Errore sinc. classifica: $e");
} }
} }
} }

View file

@ -20,6 +20,7 @@ import '../settings/settings_screen.dart';
import '../../services/storage_service.dart'; import '../../services/storage_service.dart';
import '../multiplayer/lobby_screen.dart'; import '../multiplayer/lobby_screen.dart';
import 'history_screen.dart'; import 'history_screen.dart';
import 'package:firebase_auth/firebase_auth.dart';
TextStyle _getTextStyle(AppThemeType themeType, TextStyle baseStyle) { TextStyle _getTextStyle(AppThemeType themeType, TextStyle baseStyle) {
if (themeType == AppThemeType.doodle) { if (themeType == AppThemeType.doodle) {
@ -906,10 +907,12 @@ class _HomeScreenState extends State<HomeScreen> with WidgetsBindingObserver {
final docs = snapshot.data!.docs; final docs = snapshot.data!.docs;
return ListView.builder( return ListView.builder(
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
itemCount: docs.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
var data = docs[index].data() as Map<String, dynamic>; var data = docs[index].data() as Map<String, dynamic>;
bool isMe = data['name'] == StorageService.instance.playerName;
// Ora controlliamo se l'ID del documento su Firebase è uguale al nostro ID segreto!
String? myUid = FirebaseAuth.instance.currentUser?.uid;
bool isMe = docs[index].id == myUid;
return Container( return Container(
margin: const EdgeInsets.only(bottom: 8), margin: const EdgeInsets.only(bottom: 8),

BIN
macos/.DS_Store vendored

Binary file not shown.

View file

@ -8,6 +8,7 @@ import Foundation
import app_links import app_links
import audioplayers_darwin import audioplayers_darwin
import cloud_firestore import cloud_firestore
import firebase_auth
import firebase_core import firebase_core
import share_plus import share_plus
import shared_preferences_foundation import shared_preferences_foundation
@ -16,6 +17,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin")) AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin"))
AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin"))
FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin"))
FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin"))
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))

View file

@ -1203,15 +1203,33 @@ PODS:
- Firebase/Firestore (~> 12.8.0) - Firebase/Firestore (~> 12.8.0)
- firebase_core - firebase_core
- FlutterMacOS - FlutterMacOS
- Firebase/Auth (12.8.0):
- Firebase/CoreOnly
- FirebaseAuth (~> 12.8.0)
- Firebase/CoreOnly (12.8.0): - Firebase/CoreOnly (12.8.0):
- FirebaseCore (~> 12.8.0) - FirebaseCore (~> 12.8.0)
- Firebase/Firestore (12.8.0): - Firebase/Firestore (12.8.0):
- Firebase/CoreOnly - Firebase/CoreOnly
- FirebaseFirestore (~> 12.8.0) - FirebaseFirestore (~> 12.8.0)
- firebase_auth (6.1.4):
- Firebase/Auth (~> 12.8.0)
- Firebase/CoreOnly (~> 12.8.0)
- firebase_core
- FlutterMacOS
- firebase_core (4.4.0): - firebase_core (4.4.0):
- Firebase/CoreOnly (~> 12.8.0) - Firebase/CoreOnly (~> 12.8.0)
- FlutterMacOS - FlutterMacOS
- FirebaseAppCheckInterop (12.8.0) - FirebaseAppCheckInterop (12.8.0)
- FirebaseAuth (12.8.0):
- FirebaseAppCheckInterop (~> 12.8.0)
- FirebaseAuthInterop (~> 12.8.0)
- FirebaseCore (~> 12.8.0)
- FirebaseCoreExtension (~> 12.8.0)
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
- GoogleUtilities/Environment (~> 8.1)
- GTMSessionFetcher/Core (< 6.0, >= 3.4)
- RecaptchaInterop (~> 101.0)
- FirebaseAuthInterop (12.8.0)
- FirebaseCore (12.8.0): - FirebaseCore (12.8.0):
- FirebaseCoreInternal (~> 12.8.0) - FirebaseCoreInternal (~> 12.8.0)
- GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Environment (~> 8.1)
@ -1242,14 +1260,27 @@ PODS:
- nanopb (~> 3.30910.0) - nanopb (~> 3.30910.0)
- FirebaseSharedSwift (12.8.0) - FirebaseSharedSwift (12.8.0)
- FlutterMacOS (1.0.0) - FlutterMacOS (1.0.0)
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Privacy
- GoogleUtilities/Environment (8.1.0): - GoogleUtilities/Environment (8.1.0):
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/Logger (8.1.0): - GoogleUtilities/Logger (8.1.0):
- GoogleUtilities/Environment - GoogleUtilities/Environment
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/Network (8.1.0):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Privacy
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (8.1.0)": - "GoogleUtilities/NSData+zlib (8.1.0)":
- GoogleUtilities/Privacy - GoogleUtilities/Privacy
- GoogleUtilities/Privacy (8.1.0) - GoogleUtilities/Privacy (8.1.0)
- GoogleUtilities/Reachability (8.1.0):
- GoogleUtilities/Logger
- GoogleUtilities/Privacy
- "gRPC-C++ (1.69.0)": - "gRPC-C++ (1.69.0)":
- "gRPC-C++/Implementation (= 1.69.0)" - "gRPC-C++/Implementation (= 1.69.0)"
- "gRPC-C++/Interface (= 1.69.0)" - "gRPC-C++/Interface (= 1.69.0)"
@ -1342,6 +1373,7 @@ PODS:
- gRPC-Core/Privacy (= 1.69.0) - gRPC-Core/Privacy (= 1.69.0)
- gRPC-Core/Interface (1.69.0) - gRPC-Core/Interface (1.69.0)
- gRPC-Core/Privacy (1.69.0) - gRPC-Core/Privacy (1.69.0)
- GTMSessionFetcher/Core (5.1.0)
- leveldb-library (1.22.6) - leveldb-library (1.22.6)
- nanopb (3.30910.0): - nanopb (3.30910.0):
- nanopb/decode (= 3.30910.0) - nanopb/decode (= 3.30910.0)
@ -1358,6 +1390,7 @@ DEPENDENCIES:
- app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`) - app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`)
- audioplayers_darwin (from `Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos`) - audioplayers_darwin (from `Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos`)
- cloud_firestore (from `Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos`) - cloud_firestore (from `Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos`)
- firebase_auth (from `Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos`)
- firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`)
- FlutterMacOS (from `Flutter/ephemeral`) - FlutterMacOS (from `Flutter/ephemeral`)
- share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`)
@ -1369,6 +1402,8 @@ SPEC REPOS:
- BoringSSL-GRPC - BoringSSL-GRPC
- Firebase - Firebase
- FirebaseAppCheckInterop - FirebaseAppCheckInterop
- FirebaseAuth
- FirebaseAuthInterop
- FirebaseCore - FirebaseCore
- FirebaseCoreExtension - FirebaseCoreExtension
- FirebaseCoreInternal - FirebaseCoreInternal
@ -1378,6 +1413,7 @@ SPEC REPOS:
- GoogleUtilities - GoogleUtilities
- "gRPC-C++" - "gRPC-C++"
- gRPC-Core - gRPC-Core
- GTMSessionFetcher
- leveldb-library - leveldb-library
- nanopb - nanopb
@ -1388,6 +1424,8 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos :path: Flutter/ephemeral/.symlinks/plugins/audioplayers_darwin/macos
cloud_firestore: cloud_firestore:
:path: Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos :path: Flutter/ephemeral/.symlinks/plugins/cloud_firestore/macos
firebase_auth:
:path: Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos
firebase_core: firebase_core:
:path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos
FlutterMacOS: FlutterMacOS:
@ -1404,8 +1442,11 @@ SPEC CHECKSUMS:
BoringSSL-GRPC: dded2a44897e45f28f08ae87a55ee4bcd19bc508 BoringSSL-GRPC: dded2a44897e45f28f08ae87a55ee4bcd19bc508
cloud_firestore: 71947b640bd24f6f849d9d185e5d0a619fa6b93b cloud_firestore: 71947b640bd24f6f849d9d185e5d0a619fa6b93b
Firebase: 9a58fdbc9d8655ed7b79a19cf9690bb007d3d46d Firebase: 9a58fdbc9d8655ed7b79a19cf9690bb007d3d46d
firebase_auth: 2c2438e41f061c03bd67dcb045dfd7bc843b5f52
firebase_core: b1697fb64ff2b9ca16baaa821205f8b0c058e5d2 firebase_core: b1697fb64ff2b9ca16baaa821205f8b0c058e5d2
FirebaseAppCheckInterop: ba3dc604a89815379e61ec2365101608d365cf7d FirebaseAppCheckInterop: ba3dc604a89815379e61ec2365101608d365cf7d
FirebaseAuth: 4c289b1a43f5955283244a55cf6bd616de344be5
FirebaseAuthInterop: 95363fe96493cb4f106656666a0768b420cba090
FirebaseCore: 0dbad74bda10b8fb9ca34ad8f375fb9dd3ebef7c FirebaseCore: 0dbad74bda10b8fb9ca34ad8f375fb9dd3ebef7c
FirebaseCoreExtension: 6605938d51f765d8b18bfcafd2085276a252bee2 FirebaseCoreExtension: 6605938d51f765d8b18bfcafd2085276a252bee2
FirebaseCoreInternal: fe5fa466aeb314787093a7dce9f0beeaad5a2a21 FirebaseCoreInternal: fe5fa466aeb314787093a7dce9f0beeaad5a2a21
@ -1416,6 +1457,7 @@ SPEC CHECKSUMS:
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
"gRPC-C++": cc207623316fb041a7a3e774c252cf68a058b9e8 "gRPC-C++": cc207623316fb041a7a3e774c252cf68a058b9e8
gRPC-Core: 860978b7db482de8b4f5e10677216309b5ff6330 gRPC-Core: 860978b7db482de8b4f5e10677216309b5ff6330
GTMSessionFetcher: b8ab00db932816e14b0a0664a08cb73dda6d164b
leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19 leveldb-library: cc8b8f8e013647a295ad3f8cd2ddf49a6f19be19
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc

View file

@ -10,5 +10,7 @@
<true/> <true/>
<key>com.apple.security.network.server</key> <key>com.apple.security.network.server</key>
<true/> <true/>
<key>keychain-access-groups</key>
<array/>
</dict> </dict>
</plist> </plist>

View file

@ -8,5 +8,7 @@
<true/> <true/>
<key>com.apple.security.network.client</key> <key>com.apple.security.network.client</key>
<true/> <true/>
<key>keychain-access-groups</key>
<array/>
</dict> </dict>
</plist> </plist>

View file

@ -249,6 +249,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.0.1" version: "7.0.1"
firebase_auth:
dependency: "direct main"
description:
name: firebase_auth
sha256: b20d1540460814c5984474c1e9dd833bdbcff6ecd8d6ad86cc9da8cfd581c172
url: "https://pub.dev"
source: hosted
version: "6.1.4"
firebase_auth_platform_interface:
dependency: transitive
description:
name: firebase_auth_platform_interface
sha256: fd0225320b6bbc92460c86352d16b60aea15f9ef88292774cca97b0522ea9f72
url: "https://pub.dev"
source: hosted
version: "8.1.6"
firebase_auth_web:
dependency: transitive
description:
name: firebase_auth_web
sha256: be7dccb263b89fbda2a564de9d8193118196e8481ffb937222a025cdfdf82c40
url: "https://pub.dev"
source: hosted
version: "6.1.2"
firebase_core: firebase_core:
dependency: "direct main" dependency: "direct main"
description: description:

View file

@ -18,6 +18,7 @@ dependencies:
flutter_localizations: # Il sistema multilingua ufficiale flutter_localizations: # Il sistema multilingua ufficiale
sdk: flutter sdk: flutter
firebase_core: ^4.4.0 firebase_core: ^4.4.0
firebase_auth: ^6.1.4 # <--- NUOVO: LA CORAZZA DI SICUREZZA!
cloud_firestore: ^6.1.2 cloud_firestore: ^6.1.2
share_plus: ^12.0.1 share_plus: ^12.0.1
app_links: ^7.0.0 app_links: ^7.0.0