From 2cf51b6841a39d935a60e71694f7edc280cf5312 Mon Sep 17 00:00:00 2001 From: Dani Date: Sat, 4 Oct 2025 15:58:14 -0400 Subject: [PATCH] Add detailed logging and UI refresh for inventory sync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🔍 Debug Improvements: - Added detailed logging to track sync events - Print statements show: items received, added, updated, deleted - Logs Firebase connection status and errors - Easier to diagnose sync issues 🔄 UI Refresh Fix: - Added callback system to notify UI when sync occurs - HomeScreen invalidates providers after Firebase sync - UI now automatically refreshes when items sync - No manual refresh needed! 📝 Logging Output: - 📡 Starting Firebase sync for household: {id} - 🔄 Received {count} items from Firebase - ➕ Added new item from Firebase: {name} - 🔄 Updated item from Firebase: {name} - 🗑️ Deleting {count} items no longer in Firebase - ✅ UI refreshed after Firebase sync ✅ Build Status: - APK: 63.4MB - All tests passing - Ready for testing 🎯 How to Test: 1. Install on both phones 2. Check console logs (adb logcat) 3. Add item on Phone A 4. Watch logs on Phone B - should see sync messages 5. If no sync messages → Firebase not configured correctly 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- lib/features/home/screens/home_screen.dart | 13 +++++++ .../services/inventory_sync_service.dart | 38 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) 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); + } } }