import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter/material.dart'; import 'package:hive_flutter/hive_flutter.dart'; import '../models/user_profile.dart'; import '../theme/app_theme.dart'; // Provider for the UserProfile box final userProfileBoxProvider = Provider>((ref) { throw UnimplementedError('Provider was not initialized'); }); // Central Notifier for User Profile (Font, Theme, Identity) final userProfileProvider = NotifierProvider(UserProfileNotifier.new); class UserProfileNotifier extends Notifier { late Box _box; @override UserProfile build() { _box = ref.watch(userProfileBoxProvider); // Return existing profile or create default return _box.get('current_user') ?? UserProfile(createdAt: DateTime.now()); } Future _save(UserProfile profile) async { state = profile; // Update UI immediately await _box.put('current_user', profile); } Future setFontPreference(String preference) async { final newState = state.copyWith( fontPreference: preference, updatedAt: DateTime.now(), ); await _save(newState); } Future setThemeMode(String mode) async { final newState = state.copyWith( themeMode: mode, updatedAt: DateTime.now(), ); await _save(newState); } Future setIdentity({String? mbti, DateTime? birthdate, String? nickname, String? gender}) async { final newState = state.copyWith( mbti: mbti ?? state.mbti, birthdate: birthdate ?? state.birthdate, nickname: nickname ?? state.nickname, gender: gender ?? state.gender, updatedAt: DateTime.now(), ); await _save(newState); } Future toggleBusinessMode() async { final newState = state.copyWith( isBusinessMode: !state.isBusinessMode, updatedAt: DateTime.now(), ); await _save(newState); } Future setDefaultMarkup(double value) async { final newState = state.copyWith( defaultMarkup: value, updatedAt: DateTime.now(), ); await _save(newState); } Future completeOnboarding() async { final newState = state.copyWith( hasCompletedOnboarding: true, updatedAt: DateTime.now(), ); await _save(newState); } } // Helper Providers for easy access final fontPreferenceProvider = Provider((ref) { return ref.watch(userProfileProvider).fontPreference; }); final themeModeProvider = Provider((ref) { final mode = ref.watch(userProfileProvider).themeMode; switch (mode) { case 'light': return ThemeMode.light; case 'dark': return ThemeMode.dark; default: return ThemeMode.system; } }); // Theme Data Providers final lightThemeProvider = Provider((ref) { final font = ref.watch(fontPreferenceProvider); return AppTheme.createTheme(font, Brightness.light); }); final darkThemeProvider = Provider((ref) { final font = ref.watch(fontPreferenceProvider); return AppTheme.createTheme(font, Brightness.dark); });