import 'package:yimaru_app/app/app.bottomsheets.dart'; import 'package:yimaru_app/app/app.dialogs.dart'; import 'package:yimaru_app/app/app.locator.dart'; import 'package:yimaru_app/app/app.router.dart'; import 'package:yimaru_app/models/user_model.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 'package:yimaru_app/ui/common/ui_helpers.dart'; import 'package:yimaru_app/ui/views/failure/failure_view.dart'; import 'package:yimaru_app/ui/views/login/login_view.dart'; import 'package:yimaru_app/ui/views/startup/startup_view.dart'; import '../../../services/api_service.dart'; import '../../../services/authentication_service.dart'; import '../../common/enmus.dart'; class HomeViewModel extends BaseViewModel { final _apiService = locator(); final _dialogService = locator(); final _statusChecker = locator(); final _navigationService = locator(); final _bottomSheetService = locator(); final _authenticationService = locator(); // Bottom navigation int _currentIndex = 0; int get currentIndex => _currentIndex; void setCurrentIndex(int index) { _currentIndex = index; rebuildUi(); } void showDialog() { _dialogService.showCustomDialog( title: 'Stacked Rocks!', variant: DialogType.infoAlert, description: 'Give stacked stars on Github', ); } void showBottomSheet() { _bottomSheetService.showCustomSheet( title: ksHomeBottomSheetTitle, variant: BottomSheetType.notice, description: ksHomeBottomSheetDescription, ); } Future saveFullName(String name) async { Map data = { 'firstName': name, }; await _authenticationService.saveFullName(data); } Future saveProfileStatus(bool value) async => await _authenticationService.saveProfileStatus(value); // Navigation Future replaceWithFailure() async => await _navigationService.clearStackAndShowView( const FailureView(label: 'Check your internet connection to proceed'), ); Future replaceWithOnboarding() async => await _navigationService.replaceWithOnboardingView(); // Remote api calls Future getProfileData() async => await runBusyFuture>(_getProfileData()); Future> _getProfileData() async { Map response = {}; UserModel? user = await _authenticationService.getUser(); if (user?.profileCompleted != null) { if (await _statusChecker.checkConnection()) { response = await _apiService.getProfileData(user?.userId); if (response['status'] == ResponseStatus.success) { Map data = { 'firstName': response['data']['first_name'] }; await _authenticationService.saveFullName(data); } } } return response; } Future getProfileStatus() async => await runBusyFuture(_getProfileStatus()); Future _getProfileStatus() async { Map response = {}; UserModel? user = await _authenticationService.getUser(); if (user?.profileCompleted == null) { if (await _statusChecker.checkConnection()) { response = await _apiService.getProfileStatus(user); } else { await replaceWithFailure(); } } 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']); } } }