import 'dart:io'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:taafee_mobile/common/const/const.dart'; import 'package:taafee_mobile/common/widgets/button.dart'; import 'package:taafee_mobile/common/widgets/text.dart'; import 'package:taafee_mobile/core/local_storage/local_storage.dart'; import 'package:taafee_mobile/core/routing/routing_manager.dart'; import 'package:taafee_mobile/features/card/data_layer/model/appointment.dart'; import 'package:taafee_mobile/features/card/data_layer/model/card_model.dart'; import 'package:taafee_mobile/features/home/data_layer/model/city.dart'; import 'package:taafee_mobile/features/home/data_layer/model/search.dart'; import 'package:taafee_mobile/features/home/data_layer/source/home_service.dart'; import 'package:rx_future/rx_future.dart'; import '../../../core/utils/pagination_list.dart'; import '../../auth/data_layer/model/user.dart'; class HomeController extends GetxController { //---------data source----------/// LocalStorage storage = LocalStorage(); HomeService homeService = HomeService(); //------------navBar------------/// RxInt selectIndex = 0.obs; void onPress(index) { if (index == 1 || index == 2) { if (storage.getIsGuest() ?? true) { Get.defaultDialog( title: '', content: Column( children: [ BoldTextWidget('you_have_to_sign_in'.tr), const SizedBox( height: 20, ), ButtonWidget( onTap: () { RoutingManager.offAll(RouteName.login); storage.clearCache(); storage.savefirstTimeOpened(); }, title: 'sign_in'.tr) ], )); return; } } selectIndex.value = index; selectIndex.refresh(); } //------------read user----------//// //pick avatar image Rx pickedUserImage = null.obs; RxBool isAvatarImagePicked = false.obs; RxBool isUserHasAvatar = false.obs; Rx user = User.zero().obs; void readUser() { user.value = storage.getUser(); if (user.value!.avatarImage != null) { isUserHasAvatar.value = true; } else { isUserHasAvatar.value = false; } List? appointments = storage.getAppointments(); if (appointments != null) { user.update((val) { val!.appointments = appointments; }); } user.refresh(); isUserHasAvatar.refresh(); } void setPickedUserImage(File? file) async { if (file != null) { pickedUserImage = file.obs; isAvatarImagePicked.value = true; isAvatarImagePicked.refresh(); pickedUserImage.refresh(); update(); } } void clearPickedUserImage() async { isAvatarImagePicked.value = false; isAvatarImagePicked.refresh(); pickedUserImage = null.obs; pickedUserImage.refresh(); } //---------------get cities-----------------// RxFuture> cityState = RxFuture([]); Future getCities({String? value}) async { await cityState.observe((p0) async { return await homeService.getCities(value: value); }); } //----------------search------------------// RxFuture> searchState = RxFuture(Pagination.zero()); Rx searchModel = SearchModel.zero().obs; RxBool isUserSearching = false.obs; void setCityName(String newCityName) { searchModel.value.cityName = newCityName; searchModel.refresh(); } void setCategoryName(String newCategoryName) { searchModel.value.categoryName = newCategoryName; searchModel.refresh(); } void changeUserSearchingState(bool newState) { isUserSearching.value = newState; if (newState == false) { searchModel.value.categoryId = null; searchModel.value.cityId = null; searchModel.value.categoryName = null; searchModel.value.cityName = null; } isUserSearching.refresh(); searchModel.refresh(); } void clearSearchFilters() { searchModel.value.categoryId = null; searchModel.value.cityId = null; searchModel.value.categoryName = null; searchModel.value.cityName = null; searchModel.value.searchWords = null; searchModel.refresh(); } Future search({ void Function(Pagination)? onSuccess, void Function(Object)? onError, }) async { if (searchModel.value.searchWords == '') { searchModel.value.searchWords = null; } changeUserSearchingState(true); await searchState.observe( (p0) async { await p0!.nextPage((currentPage) async { searchModel.value.page = currentPage; List cards = await homeService.searchCards(searchModel.value); if (cards.isEmpty) return []; return cards; }); return p0; }, onSuccess: onSuccess, onError: onError, ); } ///------------Ui changes according to language---------/// RxBool isArabic = false.obs; void setUiLanguage(String languageCode) { if (languageCode == Languages.arabic.code) { isArabic.value = true; } else { isArabic.value = false; } isArabic.refresh(); } /// ----------- schedule an appointment -------/// Rx currentCardAppointment = null.obs; void setCardAppointment(int cardId) { currentCardAppointment = getCardAppointment(cardId).obs; currentCardAppointment.refresh(); user.refresh(); } RxFuture appointmentSchedulingState = RxFuture(null); void scheduleAnAppointment(Appointment appointment, {void Function()? onSuccess}) async { appointmentSchedulingState.observe( (value) async { await Future.delayed(const Duration(seconds: 3)); }, onSuccess: (response) async { user.update((val) { if (val!.appointments != null) { val.appointments!.add(appointment); } else { val.appointments = []; val.appointments!.add(appointment); } }); await storage.setAppointments(user.value!.appointments!); currentCardAppointment = appointment.obs; currentCardAppointment.refresh(); user.refresh(); onSuccess?.call(); }, ); } Appointment? getCardAppointment(int cardId) { if (user.value!.appointments == null || user.value!.appointments!.isEmpty) { return null; } Appointment? appointment = user.value!.appointments! .firstWhereOrNull((element) => (element.cardId == cardId)); return appointment; } }