AddressBookController

 avatar
unknown
dart
3 years ago
10 kB
1
Indexable
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:get/get.dart';
import 'package:google_place/google_place.dart';
import 'package:mobile/app/Dto/address_book_dto.dart';
import 'package:mobile/app/models/responses/get_all_cities.dart';
import 'package:mobile/app/providers/api_provider.dart';
import 'package:mobile/common/ui.dart';

class AddressBookController extends GetxController {
  @override
  void onInit() async {
    googlePlace = GooglePlace('AIzaSyA794Klcl_yyVCNL8t7Tu-jbRTt0737KoI').obs;
    print('Google Places Added');
    super.onInit();
    refeshListAddressBook();
    getAllCities();
  }

  List<AutocompletePrediction> predictions = <AutocompletePrediction>[].obs;

  Rx<GooglePlace> googlePlace;
  // final Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
  Rx<TextEditingController> city = TextEditingController().obs;
  RxBool isloading = false.obs;
  Rx<TextEditingController> flat = TextEditingController().obs;
  Rx<TextEditingController> building = TextEditingController().obs;
  Rx<TextEditingController> street = TextEditingController().obs;
  Rx<TextEditingController> area = TextEditingController().obs;
  Rx<TextEditingController> direction = TextEditingController().obs;
  Rx<TextEditingController> manualAddress = TextEditingController().obs;
  Rx<TextEditingController> nickName = TextEditingController().obs;
  Rx<TextEditingController> autoComplete = TextEditingController().obs;

  String activeRequesterId = '';
  RxString nicknameStr = ''.obs;
  RxInt addressBookType = 0.obs; //Home ,Work ,Others
  RxInt addressBookOperation = 0.obs; //Add=1 ,Update=2;
  String latX;
  String longY;
  Rx<AddressBookDto> activeAddressBook = AddressBookDto().obs;
  List<AddressBookDto> AddressBookList = <AddressBookDto>[].obs;
  Position userCurrentPos;
  Future<void> refeshListAddressBook() async {
    AddressBookList.clear();
    await ApiProvider(httpClient: Dio()).getAllAdressBook().then((value) {
      print(value.toString());

      //
      value.data.items.forEach((v) {
        //languagesList.add(v);
        AddressBookList.add(v);
        // print(v.area);
      });
      print('length of ddress list=' + AddressBookList.length.toString());
    });
  }

  void populateData() {
    city.value.text = activeAddressBook.value.city ?? '';
    building.value.text = activeAddressBook.value.buildingNumber ?? '';
    street.value.text = activeAddressBook.value.street ?? '';
    area.value.text = activeAddressBook.value.area ?? '';
    direction.value.text = activeAddressBook.value.directions ?? '';
    // city.value.text = activeAddressBook.value.city ?? ''; for direction
    (nickName.value.text.toLowerCase().trim()) == 'home'
        ? addressBookType.value = 0
        : (nickName.value.text.toLowerCase().trim()) == 'work'
            ? addressBookType.value = 1
            : addressBookType.value = 2;
    nickName.value.text = activeAddressBook.value.nickName ?? '';
    nicknameStr.value = nickName.value.text;
  }

  void populateNewData() {
    city.value.text = '';
    building.value.text = '';
    street.value.text = '';
    area.value.text = '';
    direction.value.text = '';
    // city.value.text = activeAddressBook.value.city ?? ''; for direction
    addressBookType.value = 2;
    nickName.value.text = '';
    nicknameStr.value = '';
  }

  void populateNewMapData(String nameStr, String cityStr, String areaStr,
      String streetNameStr, String latStr, String longStr) {
    city.value.text = cityStr;
    building.value.text = '';
    street.value.text = streetNameStr;
    area.value.text = areaStr;
    direction.value.text = '';
    // city.value.text = activeAddressBook.value.city ?? ''; for direction
    addressBookType.value = 2;
    nickName.value.text = nameStr;
    nicknameStr.value = nameStr;
    latX = latStr.toString();
    longY = longStr.toString();
  }

  Future<void> addOrEditAddressBookItem() async {
    if (Get.locale.toString() == 'ar' ?  selectedCity.nameAr.trim() != '' : selectedCity.nameEn.trim() != '' &&
        building.value.text.trim() != '' &&
        street.value.text.trim() != '' &&
        area.value.text.trim() != '' &&
        nickName.value.text.trim() != '') {
      if (addressBookOperation.value == 1) {
        AddressBookDto addressBookItem = AddressBookDto(
            area: area.value.text.trim(),
            cityId: selectedCity.id,
            buildingNumber: building.value.text.trim(),
            city: Get.locale.toString() == 'ar'? selectedCity.nameAr : selectedCity.nameEn,
            directions: city.value.text.trim() ?? '',
            requesterId:
                activeRequesterId, // '91b1f328-ff61-4577-a71d-0a4bb8d8008b',
            street: street.value.text.trim(),
            nickName: nickName.value.text.trim(),
            isDefault: false,
            isDeleted: false,
            latitude: latX.toString(),
            longitude: longY.toString(),
            region: city.value.text.trim());

        await addAddressBookItem(addressBookItem);
        //.whenComplete(() => Get.back()); //.then((value) => Get.back());
      }
      if (addressBookOperation.value == 2) {
        AddressBookDto addressBookItem = AddressBookDto(
            area: area.value.text.trim(),
            cityId: selectedCity.id,
            buildingNumber: building.value.text.trim(),
            city: Get.locale.toString() == 'ar'? selectedCity.nameAr.trim() ?? '' : selectedCity.nameEn.trim() ?? '',
            directions: city.value.text.trim() ?? '',
            requesterId: activeAddressBook.value.requesterId,
            street: street.value.text.trim(),
            nickName: nickName.value.text.trim(),
            isDefault: activeAddressBook.value.isDefault ?? '',
            isDeleted: activeAddressBook.value.isDeleted ?? '',
            createdBy: activeAddressBook.value.createdBy ?? '',
            createdDate: activeAddressBook.value.createdDate,
            id: activeAddressBook.value.id,
            requesterName: activeAddressBook.value.requesterName ?? '',
            latitude: activeAddressBook.value.latitude ?? '',
            longitude: activeAddressBook.value.longitude ?? '',
            modifiedBy: activeAddressBook.value.modifiedBy ?? '',
            modifiedDate: activeAddressBook.value.createdDate ?? '',
            region: Get.locale.toString() == 'ar'? selectedCity.nameAr.trim() ?? '' : selectedCity.nameEn.trim() ?? '');
        await editAddressBookItem(addressBookItem);
        //.whenComplete(() => Get.back()); //.then((value) => Get.back());
      }
    }
  }

  Future<void> addAddressBookItem(AddressBookDto addressBookItem) async {
    await ApiProvider(httpClient: Dio())
        .requesterAddAddressBook(addressBookItem)
        .then((val) {
      print("val=" + val.toString());
      if (val != 'error')
        Get.showSnackbar(Ui.SuccessSnackBar(
          title: 'Success'.tr,
          message: 'Address Added Successfully'.tr,
        )).whenComplete(
            () => Get.back()); //.then((value) => refeshListAddressBook()

      // );
      // return val.toString();

      // Get.back();
    });
    selectedCity = null;
    // await ApiProvider(httpClient: Dio())
    //     .getAllProviderStatistics()
    //     .then((value) => {
    //           _accountController.getAllproviderStatistics(),
    //         });
  }

  Future<void> editAddressBookItem(AddressBookDto addressBookItem) async {
    // addressBookItem.isDefault = true;
    await ApiProvider(httpClient: Dio())
        .requesterEditAddressBook(addressBookItem)
        .then((val) {
      // return val.toString() ?? '';
      Get.showSnackbar(Ui.SuccessSnackBar(
        title: 'Success'.tr,
        message: 'Address Updated Successfully'.tr,
      )).whenComplete(() => Get.back());
    });
    //.whenComplete(() => Get.back());
    // await ApiProvider(httpClient: Dio())
    //     .getAllProviderStatistics()
    //     .then((value) => {
    //           _accountController.getAllproviderStatistics(),
    //         });
    // return "";
  }

  Future<void> deleteAddressBookItem(AddressBookDto addressBookItem) async {
    await ApiProvider(httpClient: Dio())
        .requesterDeleteAddressBook(addressBookItem)
        .then((val) {
      // Get.showSnackbar(Ui.SuccessSnackBar(
      //   title: 'Success'.tr,
      //   message: 'Address Deleted Successfully'.tr,
      // ));
    }); //.whenComplete(() => Get.back());
    // await ApiProvider(httpClient: Dio())
    //     .getAllProviderStatistics()
    //     .then((value) => {
    //           _accountController.getAllproviderStatistics(),
    //         });
  }

  RxList<AddressBookDto> providerNotifications = RxList<AddressBookDto>();

  Future<void> checkLocationPermission() async {
    bool serviceEnabled;
    LocationPermission permission;

    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('Location services are disabled.');
    }

    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.deniedForever) {
        return Future.error(
            'Location permissions are permanently denied, we cannot request permissions.');
      }

      if (permission == LocationPermission.denied) {
        return Future.error('Location permissions are denied');
      }
    }

    userCurrentPos = await Geolocator.getCurrentPosition();
  }

  RxList<CityItems> citiesList = RxList<CityItems>();
  TextEditingController cityController = TextEditingController();
  CityItems selectedCity;

    getAllCities() async {
    await ApiProvider(httpClient: Dio()).GetAllCitis().then((value) {
      value.data.items.forEach((v) {
        citiesList.add(v);
        print(v);
      });
    });
  }

    void onCityChange(CityItems value) {
    selectedCity = value;
  }
}