import 'dart:convert'; import 'dart:developer'; import 'dart:ui'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/requests/AddProductToCartRequestModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/requests/CreateCustomerRequestModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/requests/OffersCategoriesRequestModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/requests/OffersProductsRequestModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesCartItemsResponseModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesCategoriesResponseModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesResponseModel.dart'; import 'package:diplomaticquarterapp/core/model/packages_offers/responses/PackagesCustomerResponseModel.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/core/service/client/base_app_client.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:flutter/cupertino.dart'; import '../../../locator.dart'; class OffersAndPackagesServices extends BaseService { List categoryList = List(); List productList = List(); List latestOffersList = List(); List bestSellerList = List(); List bannersList = List(); List cartItemList = List(); PackagesCustomerResponseModel customer; Future> getAllCategories(OffersCategoriesRequestModel request) async { Future errorThrow; var url = EXA_CART_API_BASE_URL + PACKAGES_CATEGORIES; await baseAppClient.simpleGet(url, onSuccess: (dynamic stringResponse, int statusCode) { if (statusCode == 200) { var jsonResponse = json.decode(stringResponse); jsonResponse['categories'].forEach((json) { categoryList.add(PackagesCategoriesResponseModel().fromJson(json)); }); } }, onFailure: (String error, int statusCode) { log(error); }, queryParams: request.toFlatMap()); return categoryList; } Future> getAllProducts({@required OffersProductsRequestModel request, @required BuildContext context, @required bool showLoading = true}) async { Future errorThrow; request.sinceId = (productList.isNotEmpty) ? productList.last.id : 0; productList = List(); var url = EXA_CART_API_BASE_URL + PACKAGES_PRODUCTS; await baseAppClient.simpleGet(url, onSuccess: (dynamic stringResponse, int statusCode) { if (statusCode == 200) { var jsonResponse = json.decode(stringResponse); jsonResponse['products'].forEach((json) { productList.add(PackagesResponseModel().fromJson(json)); }); } }, onFailure: (String error, int statusCode) { log(error); }, queryParams: request.toFlatMap()); return productList; } Future> getLatestOffers({@required OffersProductsRequestModel request, @required BuildContext context, @required bool showLoading = true}) async { var url = EXA_CART_API_BASE_URL + PACKAGES_PRODUCTS; await baseAppClient.simpleGet(url, onSuccess: (dynamic stringResponse, int statusCode) { if (statusCode == 200) { var jsonResponse = json.decode(stringResponse); jsonResponse['products'].forEach((json) { latestOffersList.add(PackagesResponseModel().fromJson(json)); }); } }, onFailure: (String error, int statusCode) { log(error); }, queryParams: request.toFlatMap()); return latestOffersList; } Future> getBestSellers({@required OffersProductsRequestModel request, @required BuildContext context, @required bool showLoading = true}) async { var url = EXA_CART_API_BASE_URL + PACKAGES_PRODUCTS; await baseAppClient.simpleGet(url, onSuccess: (dynamic stringResponse, int statusCode) { if (statusCode == 200) { var jsonResponse = json.decode(stringResponse); jsonResponse['products'].forEach((json) { bestSellerList.add(PackagesResponseModel().fromJson(json)); }); } }, onFailure: (String error, int statusCode) { log(error); }, queryParams: request.toFlatMap()); return bestSellerList; } Future> getBanners({@required OffersProductsRequestModel request, @required BuildContext context, @required bool showLoading = true}) async { var url = EXA_CART_API_BASE_URL + PACKAGES_PRODUCTS; await baseAppClient.simpleGet(url, onSuccess: (dynamic stringResponse, int statusCode) { if (statusCode == 200) { var jsonResponse = json.decode(stringResponse); jsonResponse['products'].forEach((json) { bannersList.add(PackagesResponseModel().fromJson(json)); }); } }, onFailure: (String error, int statusCode) { log(error); }, queryParams: request.toFlatMap()); return bannersList; } Future loadOffersPackagesDataForMainPage({@required BuildContext context, bool showLoading = true, Function completion }) async { var finished = 0; var totalCalls = 3; completedAll(){ finished++; if(completion != null && finished == totalCalls) { _hideLoading(context, showLoading); completion(); } } _showLoading(context, showLoading); // Performing Parallel Request on same time // # 1 getBestSellers(request: OffersProductsRequestModel(), context: context, showLoading: false).then((value){ completedAll(); }); // # 2 getLatestOffers(request: OffersProductsRequestModel(), context: context, showLoading: false).then((value){ completedAll(); }); // # 3 getBanners(request: OffersProductsRequestModel(), context: context, showLoading: false).then((value){ completedAll(); }); } // -------------------- // Create Customer // -------------------- Future createCustomer(PackagesCustomerRequestModel request, {@required BuildContext context, bool showLoading = true, Function(bool) completion }) async{ if(customer != null) return Future.value(customer); hasError = false; var url = EXA_CART_API_BASE_URL + PACKAGES_CUSTOMER; customer = null; _showLoading(context, showLoading); await baseAppClient.simplePost(url, body: request.json(), onSuccess: (dynamic stringResponse, int statusCode){ _hideLoading(context, showLoading); var jsonResponse = json.decode(stringResponse); var customerJson = jsonResponse['customers'].first; customer = PackagesCustomerResponseModel.fromJson(customerJson); }, onFailure: (String error, int statusCode){ _hideLoading(context, showLoading); log(error); }); return customer; } // -------------------- // Shopping Cart // -------------------- Future> cartItems({@required BuildContext context, bool showLoading = true}) async{ Future errorThrow; cartItemList.clear(); _showLoading(context, showLoading); var url = EXA_CART_API_BASE_URL + PACKAGES_SHOPPING_CART + '/${customer.id}'; await baseAppClient.simpleGet(url, onSuccess: (dynamic stringResponse, int statusCode) { _hideLoading(context, showLoading); var jsonResponse = json.decode(stringResponse); jsonResponse['shopping_carts'].forEach((json) { cartItemList.add(CartProductResponseModel.fromJson(json)); }); }, onFailure: (String error, int statusCode) { _hideLoading(context, showLoading); log(error); errorThrow = Future.error({"error":error, "statusCode":statusCode}); }, queryParams: null); return errorThrow ?? cartItemList; } Future addProductToCart(AddProductToCartRequestModel request, {@required BuildContext context, bool showLoading = true}) async{ Future errorThrow; request.customer_id = customer.id; _showLoading(context, showLoading); var url = EXA_CART_API_BASE_URL + PACKAGES_SHOPPING_CART; await baseAppClient.simplePost(url, body: request.json(), onSuccess: (dynamic stringResponse, int statusCode){ _hideLoading(context, showLoading); var jsonResponse = json.decode(stringResponse); }, onFailure: (String error, int statusCode){ _hideLoading(context, showLoading); log(error); errorThrow = Future.error(error); }); return errorThrow ?? true; } Future updateProductToCart(int cartItemID, {UpdateProductToCartRequestModel request, @required BuildContext context, bool showLoading = true}) async{ Future errorThrow; _showLoading(context, showLoading); var url = EXA_CART_API_BASE_URL + PACKAGES_SHOPPING_CART + '/$cartItemID'; await baseAppClient.simplePut(url, body: request.json(), onSuccess: (dynamic stringResponse, int statusCode){ _hideLoading(context, showLoading); var jsonResponse = json.decode(stringResponse); }, onFailure: (String error, int statusCode){ _hideLoading(context, showLoading); log(error); errorThrow = Future.error({"error":error, "statusCode":statusCode}); }); return errorThrow ?? bannersList; } Future deleteProductFromCart(int cartItemID, {@required BuildContext context, bool showLoading = true}) async{ Future errorThrow; _showLoading(context, showLoading); var url = EXA_CART_API_BASE_URL + PACKAGES_SHOPPING_CART + '/$cartItemID'; await baseAppClient.simpleDelete(url, onSuccess: (dynamic stringResponse, int statusCode){ _hideLoading(context, showLoading); // var jsonResponse = json.decode(stringResponse); }, onFailure: (String error, int statusCode){ _hideLoading(context, showLoading); log(error); errorThrow = Future.error({"error":error, "statusCode":statusCode}); }); return errorThrow ?? true; } // -------------------- // Place Order // -------------------- Future placeOrder({@required BuildContext context, bool showLoading = true}) async{ Future errorThrow; var jsonBody = { "order": { "customer_id" : customer.id } }; _showLoading(context, showLoading); var url = EXA_CART_API_BASE_URL + PACKAGES_SHOPPING_CART; await baseAppClient.simplePost(url, body: jsonBody, onSuccess: (dynamic stringResponse, int statusCode){ _hideLoading(context, showLoading); var jsonResponse = json.decode(stringResponse); }, onFailure: (String error, int statusCode){ _hideLoading(context, showLoading); log(error); errorThrow = Future.error(error); }); return errorThrow ?? true; } } _showLoading(BuildContext context, bool flag){ if(flag) GifLoaderDialogUtils.showMyDialog(context); } _hideLoading(BuildContext context, bool flag){ if(flag) GifLoaderDialogUtils.hideDialog(context); }