Files
Tracker/lib/main.dart
Sterlen 1c2c56e9e2 feat: Add auto-sync, fix partner linking UI, update sharing settings
- Add 10-second periodic auto-sync to CycleEntriesNotifier
- Fix husband_devotional_screen: use partnerId for isConnected check, navigate to SharingSettingsScreen instead of legacy mock dialog
- Remove obsolete _showConnectDialog method and mock data import
- Update husband_settings_screen: show 'Partner Settings' with linked partner name when connected
- Add SharingSettingsScreen: Pad Supplies toggle (disabled when pad tracking off), Intimacy always enabled
- Add CORS OPTIONS handler to backend server
- Add _ensureServerRegistration for reliable partner linking
- Add copy button to Invite Partner dialog
- Dynamic base URL for web (uses window.location.hostname)
2026-01-09 17:20:49 -06:00

120 lines
3.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'theme/app_theme.dart';
import 'screens/onboarding/onboarding_screen.dart';
import 'screens/home/home_screen.dart';
import 'screens/husband/husband_home_screen.dart';
import 'models/user_profile.dart';
import 'models/cycle_entry.dart';
import 'models/teaching_plan.dart';
import 'models/prayer_request.dart';
import 'models/scripture.dart';
import 'providers/user_provider.dart';
import 'app_startup.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize Hive for local storage
await Hive.initFlutter();
// Register Hive adapters
Hive.registerAdapter(UserProfileAdapter());
Hive.registerAdapter(CycleEntryAdapter());
Hive.registerAdapter(RelationshipStatusAdapter());
Hive.registerAdapter(FertilityGoalAdapter());
Hive.registerAdapter(MoodLevelAdapter());
Hive.registerAdapter(FlowIntensityAdapter());
Hive.registerAdapter(CervicalMucusTypeAdapter());
Hive.registerAdapter(CyclePhaseAdapter());
Hive.registerAdapter(UserRoleAdapter());
Hive.registerAdapter(BibleTranslationAdapter());
Hive.registerAdapter(ScriptureAdapter());
Hive.registerAdapter(AppThemeModeAdapter());
Hive.registerAdapter(SupplyItemAdapter());
Hive.registerAdapter(PadTypeAdapter());
Hive.registerAdapter(TeachingPlanAdapter());
Hive.registerAdapter(PrayerRequestAdapter());
runApp(const ProviderScope(child: AppStartupWidget()));
}
// Helper to convert hex string to Color
Color _colorFromHex(String hexColor) {
try {
final hexCode = hexColor.replaceAll('0x', '');
return Color(int.parse('FF$hexCode', radix: 16));
} catch (e) {
return AppColors.sageGreen; // Fallback to default
}
}
class ChristianPeriodTrackerApp extends ConsumerWidget {
const ChristianPeriodTrackerApp({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
// Watch user profile to determine
final userProfile = ref.watch(userProfileProvider);
final ThemeMode themeMode;
final Color accentColor;
if (userProfile != null) {
if (userProfile.isHusband) {
accentColor = _colorFromHex(userProfile.husbandAccentColor);
switch (userProfile.husbandThemeMode) {
case AppThemeMode.light:
themeMode = ThemeMode.light;
break;
case AppThemeMode.dark:
themeMode = ThemeMode.dark;
break;
case AppThemeMode.system:
themeMode = ThemeMode.system;
break;
}
} else {
accentColor = _colorFromHex(userProfile.accentColor);
switch (userProfile.themeMode) {
case AppThemeMode.light:
themeMode = ThemeMode.light;
break;
case AppThemeMode.dark:
themeMode = ThemeMode.dark;
break;
case AppThemeMode.system:
themeMode = ThemeMode.system;
break;
}
}
} else {
// Default theme for initial load or if profile is null
themeMode = ThemeMode.system;
accentColor = AppColors.sageGreen;
}
// Determine the home screen based on profile state
Widget homeScreen;
if (userProfile == null) {
homeScreen = const OnboardingScreen();
} else if (userProfile.role == UserRole.husband) {
homeScreen = const HusbandHomeScreen();
} else {
homeScreen = const HomeScreen();
}
return MaterialApp(
title: 'Christian Period Tracker',
debugShowCheckedModeBanner: false,
theme: AppTheme.getLightTheme(accentColor),
darkTheme: AppTheme.getDarkTheme(accentColor),
themeMode: themeMode,
home: homeScreen,
);
}
}