Add real-time inventory syncing across devices v1.1.0

🔄 Inventory Sync Features:
- Automatic sync to Firebase when adding/updating/deleting items
- Real-time listener pulls changes from other devices
- Bi-directional sync keeps all household devices in sync
- Conflict resolution based on lastModified timestamp
- Firebase version always wins on conflicts

📱 How It Works:
Device A adds item → syncs to Firebase → Device B receives update
Device B updates item → syncs to Firebase → Device A receives update
Device A deletes item → syncs to Firebase → Device B removes item

🔧 Technical Implementation:
- InventorySyncService: Real-time Firestore listener
- Repository hooks: add/update/delete sync to Firebase
- HomeScreen lifecycle: starts/stops sync automatically
- Conflict resolution: newer timestamp wins
- Local Hive + Cloud Firestore hybrid architecture

📁 New Files:
- lib/features/household/services/inventory_sync_service.dart

 Updated Files:
- lib/features/inventory/repositories/inventory_repository_impl.dart
  - Added Firebase sync on add/update/delete operations
  - Maintains local Hive for offline access
- lib/features/home/screens/home_screen.dart
  - Starts sync service on init if in household
  - Stops sync service on dispose

⚠️ Requirements:
- Firebase must be configured (see FIREBASE_SETUP.md)
- Internet connection required for cross-device sync
- Local Hive works offline, syncs when online

 Build Status:
- APK: 63.4MB
- Package: com.github.mystiatech.sage
- Version: 1.1.0+2

🎯 Next Steps for User:
1. Set up Firebase (FIREBASE_SETUP.md)
2. Replace google-services.json with real file
3. Rebuild APK
4. Install on both devices
5. Create/join household
6. Add items → they sync! 🎉

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-04 15:47:53 -04:00
parent 6c29751e49
commit 3388f24eb4
4 changed files with 185 additions and 8 deletions

View File

@@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../core/constants/colors.dart';
import '../../../data/local/hive_database.dart';
import '../../household/services/inventory_sync_service.dart';
import '../../inventory/controllers/inventory_controller.dart';
import '../../inventory/screens/add_item_screen.dart';
import '../../inventory/screens/barcode_scanner_screen.dart';
@@ -8,11 +10,42 @@ import '../../inventory/screens/inventory_screen.dart';
import '../../settings/screens/settings_screen.dart';
/// Home screen - Dashboard with expiring items and quick actions
class HomeScreen extends ConsumerWidget {
class HomeScreen extends ConsumerStatefulWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
ConsumerState<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends ConsumerState<HomeScreen> {
final _syncService = InventorySyncService();
@override
void initState() {
super.initState();
_startSyncIfNeeded();
}
@override
void dispose() {
_syncService.stopSync();
super.dispose();
}
Future<void> _startSyncIfNeeded() async {
final settings = await HiveDatabase.getSettings();
if (settings.currentHouseholdId != null) {
try {
await _syncService.startSync(settings.currentHouseholdId!);
print('🔄 Started syncing inventory for household: ${settings.currentHouseholdId}');
} catch (e) {
print('Failed to start sync: $e');
}
}
}
@override
Widget build(BuildContext context) {
final itemCount = ref.watch(itemCountProvider);
final expiringSoon = ref.watch(expiringSoonProvider);