Add Firebase cloud sync for household sharing v1.1.0
✨ New Features: - Firebase Firestore integration for real-time household sharing - Create household → generates code stored in cloud - Join household → looks up code from Firebase across devices - Leave household → updates member list in cloud - Cloud-first with local Hive fallback for offline 🔧 Technical Implementation: - Added firebase_core and cloud_firestore dependencies - Created FirebaseHouseholdService for all cloud operations - Updated HouseholdScreen to use Firebase for create/join/leave - Modified gradle files to support Google Services plugin - Increased minSdk to 21 for Firebase compatibility - Version bumped to 1.1.0+2 (MAJOR.MINOR.BUGFIX) 📁 New Files: - lib/features/household/services/firebase_household_service.dart - FIREBASE_SETUP.md - Complete setup instructions - android/app/google-services.json - Placeholder (needs replacement) - android/app/README_FIREBASE.md - Firebase config reminder ⚙️ Setup Required: 1. Create Firebase project at console.firebase.google.com 2. Add Android app with package name: com.sage.sage 3. Download real google-services.json 4. Enable Firestore Database in test mode 5. See FIREBASE_SETUP.md for complete instructions 🎯 How it works: - Device A creates household → stored in Firestore - Device B joins with code → reads from Firestore - Both devices now share same household ID - Inventory items sync via shared household ID 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import '../../../core/constants/colors.dart';
|
||||
import '../../../data/local/hive_database.dart';
|
||||
import '../../household/services/firebase_household_service.dart';
|
||||
import '../models/app_settings.dart';
|
||||
import '../models/household.dart';
|
||||
|
||||
@@ -13,6 +14,7 @@ class HouseholdScreen extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _HouseholdScreenState extends State<HouseholdScreen> {
|
||||
final _firebaseService = FirebaseHouseholdService();
|
||||
AppSettings? _settings;
|
||||
Household? _household;
|
||||
bool _isLoading = true;
|
||||
@@ -29,7 +31,8 @@ class _HouseholdScreenState extends State<HouseholdScreen> {
|
||||
|
||||
if (settings.currentHouseholdId != null) {
|
||||
try {
|
||||
household = await HiveDatabase.getHousehold(settings.currentHouseholdId!);
|
||||
// Load from Firebase
|
||||
household = await _firebaseService.getHousehold(settings.currentHouseholdId!);
|
||||
} catch (e) {
|
||||
// Household not found
|
||||
}
|
||||
@@ -81,13 +84,10 @@ class _HouseholdScreenState extends State<HouseholdScreen> {
|
||||
);
|
||||
|
||||
if (result != null && result.isNotEmpty) {
|
||||
final household = Household(
|
||||
id: Household.generateCode(),
|
||||
name: result,
|
||||
ownerName: _settings!.userName!,
|
||||
members: [_settings!.userName!],
|
||||
);
|
||||
// Create household in Firebase
|
||||
final household = await _firebaseService.createHousehold(result, _settings!.userName!);
|
||||
|
||||
// Also save to local Hive for offline access
|
||||
await HiveDatabase.saveHousehold(household);
|
||||
|
||||
_settings!.currentHouseholdId = household.id;
|
||||
@@ -150,26 +150,32 @@ class _HouseholdScreenState extends State<HouseholdScreen> {
|
||||
|
||||
if (result != null && result.isNotEmpty) {
|
||||
try {
|
||||
final household = await HiveDatabase.getHousehold(result.toUpperCase());
|
||||
final code = result.toUpperCase();
|
||||
|
||||
if (household != null) {
|
||||
if (!household.members.contains(_settings!.userName!)) {
|
||||
household.members.add(_settings!.userName!);
|
||||
await household.save();
|
||||
}
|
||||
// Join household in Firebase
|
||||
final success = await _firebaseService.joinHousehold(code, _settings!.userName!);
|
||||
|
||||
_settings!.currentHouseholdId = household.id;
|
||||
await _settings!.save();
|
||||
if (success) {
|
||||
// Load the household data
|
||||
final household = await _firebaseService.getHousehold(code);
|
||||
|
||||
await _loadData();
|
||||
if (household != null) {
|
||||
// Save to local Hive for offline access
|
||||
await HiveDatabase.saveHousehold(household);
|
||||
|
||||
if (mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('Joined ${household.name}!'),
|
||||
backgroundColor: AppColors.success,
|
||||
),
|
||||
);
|
||||
_settings!.currentHouseholdId = household.id;
|
||||
await _settings!.save();
|
||||
|
||||
await _loadData();
|
||||
|
||||
if (mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('Joined ${household.name}!'),
|
||||
backgroundColor: AppColors.success,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (mounted) {
|
||||
@@ -184,8 +190,8 @@ class _HouseholdScreenState extends State<HouseholdScreen> {
|
||||
} catch (e) {
|
||||
if (mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(
|
||||
content: Text('Household not found. Check the code and try again.'),
|
||||
SnackBar(
|
||||
content: Text('Error joining household: $e'),
|
||||
backgroundColor: AppColors.error,
|
||||
),
|
||||
);
|
||||
@@ -261,8 +267,8 @@ class _HouseholdScreenState extends State<HouseholdScreen> {
|
||||
);
|
||||
|
||||
if (confirm == true && _household != null) {
|
||||
_household!.members.remove(_settings!.userName);
|
||||
await _household!.save();
|
||||
// Leave household in Firebase
|
||||
await _firebaseService.leaveHousehold(_household!.id, _settings!.userName!);
|
||||
|
||||
_settings!.currentHouseholdId = null;
|
||||
await _settings!.save();
|
||||
|
Reference in New Issue
Block a user