import 'package:yimaru_app/app/app.bottomsheets.dart'; import 'package:yimaru_app/app/app.locator.dart'; import 'package:yimaru_app/app/app.router.dart'; import 'package:yimaru_app/models/user.dart'; import 'package:yimaru_app/services/status_checker_service.dart'; import 'package:yimaru_app/ui/common/app_strings.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; import '../../../services/api_service.dart'; import '../../../services/authentication_service.dart'; import '../../../services/image_downloader_service.dart'; import '../../common/enmus.dart'; import '../../common/ui_helpers.dart'; class HomeViewModel extends ReactiveViewModel { final _apiService = locator(); final _statusChecker = locator(); final _navigationService = locator(); final _bottomSheetService = locator(); final _authenticationService = locator(); final _imageDownloaderService = locator(); @override List get listenableServices => [_authenticationService]; // Current user User? get _user => _authenticationService.user; User? get user => _user; // Bottom navigation int _currentPage = 0; int get currentPage => _currentPage; // Bottom navigation void showBottomSheet() { _bottomSheetService.showCustomSheet( title: ksHomeBottomSheetTitle, variant: BottomSheetType.notice, description: ksHomeBottomSheetDescription, ); } void setCurrentIndex(int index) { _currentPage = index; rebuildUi(); } // Save profile status Future saveProfileStatus(bool value) async => await _authenticationService.saveProfileStatus(value); // Navigation Future replaceWithFailure() async => await _navigationService .replaceWithFailureView(label: 'Check you internet connection'); Future replaceWithOnboarding() async => await _navigationService.replaceWithOnboardingView(); // Remote api calls // Initialize user data Future initialize() async => await runBusyFuture(_initialize(), busyObject: StateObjects.homeView); Future _initialize() async { await _getProfileStatus(); await _getProfileData(); } // Get profile data Future _getProfileData() async { if (!(_user?.userInfoLoaded ?? false)) { Map response = {}; if (_user?.profileCompleted != null && (_user?.profileCompleted ?? false)) { if (await _statusChecker.checkConnection()) { response = await _apiService.getProfileData(_user?.userId); if (response['status'] == ResponseStatus.success) { User user = response['data'] as User; await _authenticationService.saveUserData(user); String image = await _imageDownloaderService.downloader(user.profilePicture); await _authenticationService.saveProfilePicture(image); } } else { await replaceWithFailure(); } } } } // Get profile status Future _getProfileStatus() async { Map response = {}; if (_user?.profileCompleted == null) { if (await _statusChecker.checkConnection()) { response = await _apiService.getProfileStatus(_user); } else { await Future.delayed(kDuration); await replaceWithFailure(); } } else if (!(_user?.profileCompleted ?? false)) { response = {'data': false, 'status': ResponseStatus.success}; } else { response = {'data': true, 'status': ResponseStatus.success}; } if (response['status'] == ResponseStatus.success && !response['data']) { await replaceWithOnboarding(); } else if (response['status'] == ResponseStatus.success && response['data']) { await saveProfileStatus(response['data']); } } }