diff --git a/lib/features/home/screens/home_screen.dart b/lib/features/home/screens/home_screen.dart index 08f540b..42f4990 100644 --- a/lib/features/home/screens/home_screen.dart +++ b/lib/features/home/screens/home_screen.dart @@ -28,6 +28,7 @@ class _HomeScreenState extends ConsumerState { @override void dispose() { + _syncService.removeSyncCallback(_onItemsSync); _syncService.stopSync(); super.dispose(); } @@ -36,6 +37,9 @@ class _HomeScreenState extends ConsumerState { final settings = await HiveDatabase.getSettings(); if (settings.currentHouseholdId != null) { try { + // Register callback to refresh UI when items sync + _syncService.addSyncCallback(_onItemsSync); + await _syncService.startSync(settings.currentHouseholdId!); print('🔄 Started syncing inventory for household: ${settings.currentHouseholdId}'); } catch (e) { @@ -44,6 +48,15 @@ class _HomeScreenState extends ConsumerState { } } + void _onItemsSync() { + if (mounted) { + // Refresh all inventory providers when Firebase syncs + ref.invalidate(itemCountProvider); + ref.invalidate(expiringSoonProvider); + print('✅ UI refreshed after Firebase sync'); + } + } + @override Widget build(BuildContext context) { final itemCount = ref.watch(itemCountProvider); diff --git a/lib/features/household/services/inventory_sync_service.dart b/lib/features/household/services/inventory_sync_service.dart index 2c8abdd..2441852 100644 --- a/lib/features/household/services/inventory_sync_service.dart +++ b/lib/features/household/services/inventory_sync_service.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/foundation.dart'; import '../../../data/local/hive_database.dart'; import '../../inventory/models/food_item.dart'; @@ -7,18 +8,39 @@ import '../../inventory/models/food_item.dart'; class InventorySyncService { final FirebaseFirestore _firestore = FirebaseFirestore.instance; StreamSubscription? _itemsSubscription; + final _syncCallbacks = []; + + /// Register a callback to be called when sync occurs + void addSyncCallback(VoidCallback callback) { + _syncCallbacks.add(callback); + } + + /// Remove a sync callback + void removeSyncCallback(VoidCallback callback) { + _syncCallbacks.remove(callback); + } /// Start listening to household items from Firebase Future startSync(String householdId) async { await stopSync(); // Stop any existing subscription + print('📡 Starting Firebase sync for household: $householdId'); + _itemsSubscription = _firestore .collection('households') .doc(householdId) .collection('items') .snapshots() .listen((snapshot) async { + print('🔄 Received ${snapshot.docs.length} items from Firebase'); await _handleItemsUpdate(snapshot, householdId); + + // Notify listeners + for (final callback in _syncCallbacks) { + callback(); + } + }, onError: (error) { + print('❌ Firebase sync error: $error'); }); } @@ -33,10 +55,13 @@ class InventorySyncService { QuerySnapshot snapshot, String householdId, ) async { + print('📦 Processing ${snapshot.docs.length} items from Firebase'); final box = await HiveDatabase.getFoodBox(); // Track Firebase item IDs final firebaseItemIds = {}; + int newItems = 0; + int updatedItems = 0; for (final doc in snapshot.docs) { firebaseItemIds.add(doc.id); @@ -53,6 +78,8 @@ class InventorySyncService { if (existingItem == null) { // New item from Firebase - add to local Hive with specific key await box.put(itemKey, item); + newItems++; + print('➕ Added new item from Firebase: ${item.name} (key: $itemKey)'); } else { // Update existing item if Firebase version is newer final firebaseModified = DateTime.parse(data['lastModified'] as String); @@ -61,11 +88,15 @@ class InventorySyncService { if (firebaseModified.isAfter(localModified)) { // Firebase version is newer - update local await box.put(itemKey, item); + updatedItems++; + print('🔄 Updated item from Firebase: ${item.name} (key: $itemKey)'); } } } } + print('📊 Sync stats: $newItems new, $updatedItems updated'); + // Delete items that no longer exist in Firebase final itemsToDelete = []; for (final item in box.values) { @@ -76,8 +107,11 @@ class InventorySyncService { } } - for (final key in itemsToDelete) { - await box.delete(key); + if (itemsToDelete.isNotEmpty) { + print('🗑️ Deleting ${itemsToDelete.length} items that no longer exist in Firebase'); + for (final key in itemsToDelete) { + await box.delete(key); + } } }