sojorn/sojorn_app/lib/providers/settings_provider.dart
2026-02-15 00:33:24 -06:00

122 lines
3.7 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../models/profile.dart';
import '../models/profile_privacy_settings.dart';
import '../models/user_settings.dart';
import '../models/trust_state.dart';
import '../services/api_service.dart';
class SettingsState {
final Profile? profile;
final ProfilePrivacySettings? privacy;
final UserSettings? user;
final TrustState? trust;
final bool isLoading;
final String? error;
SettingsState({
this.profile,
this.privacy,
this.user,
this.trust,
this.isLoading = false,
this.error,
});
SettingsState copyWith({
Profile? profile,
ProfilePrivacySettings? privacy,
UserSettings? user,
TrustState? trust,
bool? isLoading,
String? error,
}) {
return SettingsState(
profile: profile ?? this.profile,
privacy: privacy ?? this.privacy,
user: user ?? this.user,
trust: trust ?? this.trust,
isLoading: isLoading ?? this.isLoading,
error: error,
);
}
}
class SettingsNotifier extends Notifier<SettingsState> {
@override
SettingsState build() {
Future.microtask(() => refresh());
return SettingsState();
}
ApiService get _apiService => ApiService.instance;
Future<void> refresh() async {
state = state.copyWith(isLoading: true, error: null);
try {
final profileJson = await _apiService.callGoApi('/profile', method: 'GET');
final privacyJson = await _apiService.callGoApi('/settings/privacy', method: 'GET');
final userJson = await _apiService.callGoApi('/settings/user', method: 'GET');
// Trust state might be nested or a separate call
// Based on my knowledge, it's often fetched with the profile or /trust-state
TrustState? trust;
try {
final trustJson = await _apiService.callGoApi('/profile/trust-state', method: 'GET');
trust = TrustState.fromJson(trustJson);
} catch (_) {
// Fallback or ignore if not available
}
state = state.copyWith(
profile: Profile.fromJson(profileJson['profile']),
privacy: ProfilePrivacySettings.fromJson(privacyJson),
user: UserSettings.fromJson(userJson),
trust: trust,
isLoading: false,
);
} catch (e) {
state = state.copyWith(isLoading: false, error: e.toString());
}
}
Future<void> updatePrivacy(ProfilePrivacySettings newPrivacy) async {
final oldPrivacy = state.privacy;
state = state.copyWith(privacy: newPrivacy);
try {
await _apiService.callGoApi('/settings/privacy', method: 'PATCH', body: newPrivacy.toJson());
} catch (e) {
state = state.copyWith(privacy: oldPrivacy, error: e.toString());
}
}
Future<void> updateUser(UserSettings newUser) async {
final oldUser = state.user;
state = state.copyWith(user: newUser);
try {
await _apiService.callGoApi('/settings/user', method: 'PATCH', body: newUser.toJson());
} catch (e) {
state = state.copyWith(user: oldUser, error: e.toString());
}
}
Future<void> updateProfile(Profile newProfile) async {
final oldProfile = state.profile;
state = state.copyWith(profile: newProfile);
try {
// Need to map updateProfile arguments or use map
await _apiService.callGoApi('/profile', method: 'PATCH', body: {
'display_name': newProfile.displayName,
'bio': newProfile.bio,
'location': newProfile.location,
'website': newProfile.website,
'avatar_url': newProfile.avatarUrl,
'cover_url': newProfile.coverUrl,
});
} catch (e) {
state = state.copyWith(profile: oldProfile, error: e.toString());
}
}
}
final settingsProvider = NotifierProvider<SettingsNotifier, SettingsState>(SettingsNotifier.new);