import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:taafee_mobile/common/const/const.dart'; import 'package:taafee_mobile/features/card/data_layer/model/add_card.dart'; import 'package:taafee_mobile/features/card/data_layer/model/card_images.dart'; import 'package:taafee_mobile/features/card/data_layer/model/card_model.dart'; import 'package:taafee_mobile/features/card/data_layer/model/edit_card.dart'; import 'package:taafee_mobile/features/card/data_layer/source/card_service.dart'; import 'package:rx_future/rx_future.dart'; import '../../../core/utils/pagination_list.dart'; class CardController extends GetxController { //---------------data source-----------// CardService cardService = CardService(); //----------- model-----------// Rx cardModel = AddCardModel.zero().obs; //-------------add card-------------// RxFuture addCardState = RxFuture(null); void addImagesToList(File file) { cardModel.update((val) { val!.images?.add(file); }); } Future addCard( {void Function(void)? onSuccess, void Function(Object)? onError}) async { await addCardState.observe( (p0) async { await cardService.addCard(cardModel.value); }, onSuccess: (value) { onSuccess?.call(value); }, onError: (error) { onError?.call(error); }, ); } //-------------get cards-----------// RxFuture> cardState = RxFuture(Pagination.zero()); Future getCards({void Function(Object e)? onConnectionError}) async { await cardState.observe((value) async { await value?.nextPage((currentPage) async { List cards = await cardService.getCards( page: currentPage, onConnectionError: onConnectionError); if (cards.isEmpty) return []; return cards; }); return value!; // return await cardService.getCards(); }, onSuccess: (value) {}); } RxFuture favoriteState = RxFuture(null); Future toggleFavorite(int id, bool removeFromFavorite, {void Function(void)? onSuccess}) async { List temp = cardState.result.data; for (int i = 0; i < temp.length; i++) { if (temp[i].id == id) { temp[i].isFav = !cardState.result.data[i].isFav; break; } } cardState.update((val) { val!.value = Pagination(data: temp); }); cardState.refresh(); // cardState.result.data.firstWhere((element) => element.id == id).isFav = // !removeFromFavorite; update(); await favoriteState.observe((p0) async { removeFromFavorite ? await cardService.removeFromFavorite(id) : await cardService.addToFavorite(id); }, onSuccess: onSuccess); } ///-------------my cards------------/// RxFuture> myCardState = RxFuture(Pagination.zero()); Future getMyCards(int userId, {void Function(Object)? onConnectionError}) async { myCardState.result.clear(); await myCardState.observe((value) async { await value?.nextPage((currentPage) async { List cards = await cardService.getMyCards(userId, page: currentPage, onConnectionError: onConnectionError); if (cards.isEmpty) return []; return cards; }); return value!; // return await cardService.getMyCards(userId); }); } //--------edit card--------// Rx editCardModel = EditCardModel.zero().obs; RxFuture editCardState = RxFuture(null); Future editCard(int cardId, {void Function(void)? onSuccess, void Function(Object)? onError}) async { await editCardState.observe( (p0) async { await cardService.editCard(cardId, editCardModel.value); }, onSuccess: (value) { onSuccess?.call(value); }, onError: (error) { onError?.call(error); }, ); } /// add images to card /// RxFuture addImagesState = RxFuture(null); void editingAddImagesToList(File file) { editCardModel.value.images!.add(file); cardModel.update((val) { val!.images?.add(file); }); cardModel.refresh(); } Future uploadImages({void Function(void)? onSuccess}) async { await addImagesState.observe( (p0) async { await cardService.addImagesToCard(editCardModel.value); }, onSuccess: onSuccess, ); } /// ------------delete image from card--------/// RxList cardModelNetworkImages = [].obs; RxFuture deleteImageState = RxFuture(null); RxFuture> networkImagesState = RxFuture([]); void changeNetworkImages(List cardImages) { cardModelNetworkImages.value = cardImages; cardModelNetworkImages.refresh(); cardModelNetworkImages; } Future updateNetworkImages(int cardId) async { networkImagesState.observe( (p0) async { return cardModelNetworkImages.value = await cardService.getCardImages(cardId); }, onSuccess: (cardImages) { cardModelNetworkImages.refresh(); }, ); } void removeImageFromNewCard(int index) { cardModel.value.images!.removeAt(index); cardModel.refresh(); } void deleteImage(int imageId, {void Function(void)? onSuccess, required int cardId}) async { if (!addImagesState.loading) { deleteImageState.observe( (p0) async { return await cardService.deleteImage(imageId); }, onSuccess: (value) async { await updateNetworkImages(cardId); }, ); } } /// ------------delete card -----------/// RxFuture deleteCardState = RxFuture(null); Future deleteCard(int cardId, {void Function(void)? onSuccess}) async { deleteCardState.observe( (value) async { return await cardService.deleteCard(cardId); }, onSuccess: onSuccess, ); } /// --------- gallery view network images -----/// List cardNetworkImagesUrls = [].obs; void updateCardNetworkImageUrls(List cardImages) { cardNetworkImagesUrls.clear(); cardImages.forEach((element) { cardNetworkImagesUrls.add(Domain.domain + element.url.substring(6)); }); } Rx pageController = PageController().obs; int imageIndex = 0; void pageControllerInitialValue(int index) { pageController.value = PageController(initialPage: index); pageController.refresh(); } void changeImageIndex(int newIndex) { imageIndex = newIndex; } /// --------- save images to gallery ------/// final Random random = Random(); RxFuture saveCardState = RxFuture(null); saveNetworkImage(String imageUrl, {void Function(Object)? onError, void Function(void)? onSuccess}) async { saveCardState.observe((p0) async { Uint8List image = await cardService.downloadImage(imageUrl); await ImageGallerySaver.saveImage( image, quality: 60, name: "yellow pages image ${random.nextInt(500)}", ); }, onError: (e) { onError?.call(e); }, onSuccess: onSuccess); } }