import 'package:easy_localization/easy_localization.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; import 'package:yimaru_app/app/app.router.dart'; import 'package:yimaru_app/services/image_picker_service.dart'; import 'package:yimaru_app/ui/common/enmus.dart'; import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart'; import '../../../app/app.locator.dart'; import '../../../models/user.dart'; import '../../../services/api_service.dart'; import '../../../services/authentication_service.dart'; import '../../../services/google_auth_service.dart'; import '../../../services/status_checker_service.dart'; import '../../common/app_colors.dart'; class ProfileViewModel extends ReactiveViewModel { final _apiService = locator(); final _dialogService = locator(); final _statusChecker = locator(); final _navigationService = locator(); final _googleAuthService = locator(); final _imagePickerService = locator(); final _authenticationService = locator(); @override List get listenableServices => [_authenticationService]; // Current user User? get _user => _authenticationService.user; User? get user => _user; // Image picker Future openCamera() async => runBusyFuture(_openCamera(), busyObject: StateObjects.profileImage); Future _openCamera() async { String? image = await _imagePickerService.camera(); pop(); if (image != null) { await updateProfilePicture(image); await _authenticationService.saveProfilePicture(image); } } Future openGallery() async => runBusyFuture(_openGallery(), busyObject: StateObjects.profileImage); Future _openGallery() async { String? image = await _imagePickerService.gallery(); pop(); if (image != null) { await updateProfilePicture(image); await _authenticationService.saveProfilePicture(image); } } // Dialog Future showAbortDialog() async { DialogResponse? response = await _dialogService.showDialog( barrierDismissible: true, cancelTitleColor: kcDarkGrey, title: LocaleKeys.logout.tr(), cancelTitle: LocaleKeys.no.tr(), buttonTitle: LocaleKeys.yes.tr(), buttonTitleColor: kcPrimaryColor, description: LocaleKeys.want_to_quit.tr(), ); return response?.confirmed; } // Navigation void pop() => _navigationService.back(); Future navigateToProfileDetail() async => await _navigationService.navigateToProfileDetailView(); Future navigateToDownloads() async => await _navigationService.navigateToDownloadsView(); Future navigateToProgress() async => await _navigationService.navigateToProgressView(); Future navigateToAccountPrivacy() async => await _navigationService.navigateToAccountPrivacyView(); Future navigateToSupport() async => await _navigationService.navigateToSupportView(); Future navigateToLogin() async => await _navigationService.clearStackAndShow(Routes.loginView); // Remote api call // Update profile Future updateProfilePicture(String image) async => await runBusyFuture(_updateProfilePicture(image)); Future _updateProfilePicture(String image) async { if (await _statusChecker.checkConnection()) { Map data = {'profile_picture_url': image}; await _apiService.updateProfileImage(data: data, userId: _user?.userId); } } Future logout() async { bool? response = await showAbortDialog(); if (response != null && response) { await _logout(); } } Future _logout() async { await _authenticationService.logout(); await navigateToLogin(); } }