Untitled

 avatar
unknown
dart
3 years ago
35 kB
3
Indexable
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:iketfaa_delivery/App/Common/Modules/SignIn/binding/signin_binding.dart';
import 'package:iketfaa_delivery/App/Common/Modules/SignIn/view/signin_view.dart';
import 'package:iketfaa_delivery/App/Common/Utilities/Constants/AppColors.dart';
import 'package:iketfaa_delivery/App/Common/Utilities/Constants/AppStyles.dart';
import 'package:iketfaa_delivery/App/Common/Utilities/Constants/Strings/Backend.dart';
import 'package:iketfaa_delivery/App/Common/Widgets/no_items_empty.dart';
import 'package:iketfaa_delivery/App/Common/Widgets/primary_button.dart';
import 'package:iketfaa_delivery/App/Delivery/Models/Main/PersonalAddress.dart';
import 'package:iketfaa_delivery/App/Delivery/Modules/DeliveryCart/Controller/delivery_cart_conroller.dart';
import 'package:iketfaa_delivery/App/Delivery/Modules/DeliveryUser/DeliveryUserAddressBook/binding/delivery_address_book_binding.dart';
import 'package:iketfaa_delivery/App/Delivery/Modules/DeliveryUser/DeliveryUserAddressBook/view/delivery_add_new_address_view.dart';
import 'package:iketfaa_delivery/App/Delivery/Utilities/Widgets/Drawer/delivery_tile_button_for_drawer.dart';
import 'package:iketfaa_delivery/App/Delivery/Utilities/Widgets/LocationTile.dart';
import 'package:iketfaa_delivery/App/Delivery/Utilities/Widgets/custimized_cupertino_dialog.dart';
import 'package:iketfaa_delivery/App/Delivery/Utilities/Widgets/DeliveryCartListCard.dart';
import 'package:iketfaa_delivery/App/Delivery/Utilities/Widgets/delivery_white_button.dart';
import 'package:iketfaa_delivery/App/Delivery/Utilities/Widgets/primary_app_bar.dart';

class DeliveryCartView extends GetView<DeliveryCartController> {
  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(15),
      decoration: BoxDecoration(
        gradient: LinearGradient(
          colors: [
            AppColors.white,
            AppColors.greenyWhite,
          ],
          begin: Alignment.topCenter,
          end: Alignment.bottomCenter,
        ),
      ),
      child: Obx(
        () => Scaffold(
            appBar: PrimaryAppBar(
              title: 'shoppingCart'.tr,
              function: () {
                Get.back();
              },
            ),
            backgroundColor: Colors.transparent,
            body: controller.deliveryHomeController.deliveryHubController.cart
                    .value.orders!.isEmpty
                ? EmptyCartView()
                : FilledCartView()),
      ),
    );
  }
}

class EmptyCartView extends GetView<DeliveryCartController> {
  const EmptyCartView({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {},
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Row(),
          Icon(
            Icons.shopping_cart,
            color: AppColors.primary,
            size: 80,
          ),
          SizedBox(
            height: 30.0,
          ),
          Text(
            'noItemToShow'.tr,
            style: Get.textTheme.headline3,
          ),
        ],
      ),
    );
  }
}

class RdButton extends GetView<DeliveryCartController> {
  const RdButton({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Obx(
        () => Column(
          children: [
            Row(
              children: [
                Radio<PaymentMethod>(
                    value: PaymentMethod.cash,
                    groupValue: controller.character!.value,
                    activeColor: AppColors.primary,
                    onChanged: (PaymentMethod? value) {
                      controller.character!.value = value!;
                      controller.deliveryHomeController.deliveryHubController
                          .cart.value.paymentType = 0;
                    }),
                SizedBox(height: 7),
                Text('cash'.tr, style: Get.textTheme.headline5),
              ],
            ),
            Row(
              children: [
                Radio<PaymentMethod>(
                    value: PaymentMethod.Credit_card,
                    groupValue: controller.character!.value,
                    activeColor: AppColors.primary,
                    onChanged: (PaymentMethod? value) {
                      controller.character!.value = value!;
                      controller.deliveryHomeController.deliveryHubController
                          .cart.value.paymentType = 1;
                    }),
                SizedBox(height: 7),
                Text('cridet card'.tr, style: Get.textTheme.headline5),
              ],
            ),
            Row(
              children: [
                Radio<PaymentMethod>(
                    value: PaymentMethod.wallet,
                    groupValue: controller.character!.value,
                    activeColor: AppColors.primary,
                    onChanged: (PaymentMethod? value) {
                      controller.character!.value = value!;
                      controller.deliveryHomeController.deliveryHubController
                          .cart.value.paymentType = 2;
                    }),
                SizedBox(height: 7),
                Text('wallet'.tr, style: Get.textTheme.headline5),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

class FilledCartView extends GetView<DeliveryCartController> {
  const FilledCartView({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: SingleChildScrollView(
        child: Column(
          children: [
            Obx(
              () => ListView.builder(
                physics: NeverScrollableScrollPhysics(),
                shrinkWrap: true,
                itemCount: controller.deliveryHomeController
                    .deliveryHubController.cart.value.orders!.length,
                itemBuilder: (context, index) {
                  final item = controller.deliveryHomeController
                      .deliveryHubController.cart.value.orders!.length;
                  return Dismissible(
                    background: Container(
                      height: 100,
                      color: Colors.red,
                      child: Center(
                        child: Text(
                          'delete'.tr,
                          style: Get.textTheme.headline5!
                              .copyWith(color: AppColors.white),
                        ),
                      ),
                    ),
                    key: Key(item.toString()),
                    confirmDismiss: (direction) async {
                      await showDialog(
                        context: context,
                        builder: (context) => CustimizedCupertinoDialog(
                          onPressed: () async {
                            controller
                                .deliveryHomeController.deliveryHubController
                                .removeItem(index);
                            controller.deliveryHomeController
                                .deliveryHubController.cart
                                .refresh();
                            controller.deliveryHomeController
                                    .deliveryHubController.cartLength -
                                1;

                            controller.deliveryHomeController
                                .deliveryHubController.cartLength
                                .refresh();

                            Get.back();
                            if (controller
                                    .deliveryHomeController
                                    .deliveryHubController
                                    .cart
                                    .value
                                    .orders!
                                    .length !=
                                0) {
                              controller.deliveryHomeController.distance.value =
                                  await controller.authManager.deliveryTools
                                      .calculateAllDistanceForPrice(controller
                                          .deliveryHomeController
                                          .deliveryHubController
                                          .cart
                                          .value
                                          .orders!);
                              await controller.deliveryHomeController
                                  .deliveryHubController.globalStorage
                                  .write(
                                      'deliveryCartFromLocal',
                                      controller.deliveryHomeController
                                          .deliveryHubController.cart
                                          .toJson());
                            } else {
                              await controller.deliveryHomeController
                                  .deliveryHubController.globalStorage
                                  .remove('deliveryCartFromLocal');
                              controller.deliveryHomeController.distance.value =
                                  await controller.authManager.deliveryTools
                                      .calculateAllDistanceForPrice(controller
                                          .deliveryHomeController
                                          .deliveryHubController
                                          .cart
                                          .value
                                          .orders!);
                            }

                            controller.authManager.commonTools
                                .showSuccessSnackBar(
                                    'order has been deleted successfully'.tr);
                          },
                          title: 'do you want to remove this order?'.tr,
                        ),
                      );
                    },
                    child: DeliveryCartListCard(
                      index: index,
                      orderItem: controller
                          .deliveryHomeController
                          .deliveryHubController
                          .cart
                          .value
                          .orders![index]
                          .orderItems!,
                      storeOrder: controller.deliveryHomeController
                          .deliveryHubController.cart.value.orders![index],
                      onTap: () {},
                    ),
                  );
                },
              ),
            ),
            const SizedBox(height: 30),
            Row(
              children: [
                SvgPicture.asset(
                  'assets/svg/person location.svg',
                  width: 30,
                ),
                Text(
                  'location'.tr,
                  style: Get.textTheme.headline6,
                ),
              ],
            ),
            SizedBox(height: 10),
            Obx(
              () => DeliveryWhiteButton(
                onTap: () {
                  controller.authManager.commonTools.showCustomBottomSheet(
                      context,
                      controller.authManager.isLogged.value
                          ? "chooseDeliveryLocation".tr
                          : 'pleaseSignIn'.tr,
                      controller.authManager.isLogged.value
                          ? StreamBuilder<QuerySnapshot>(
                              stream: FirebaseFirestore.instance
                                  .collection(DELIVERY_USERS_COLLECTION)
                                  .doc(controller.authManager.appUser.value.id)
                                  .collection(PERSONAL_ADDRESS_COLLECTION)
                                  .orderBy(DATE_FIELD, descending: true)
                                  .snapshots(),
                              builder: (context, snapshot) {
                                if (snapshot.data == null) {
                                  return Container(
                                    height: Get.width * 0.6,
                                    width: Get.width,
                                    child: CupertinoActivityIndicator(),
                                  );
                                }
                                if (!snapshot.hasData) {
                                  return Container(
                                    height: Get.width * 0.6,
                                    width: Get.width,
                                    child: CupertinoActivityIndicator(),
                                  );
                                }
                                return !snapshot.data!.docs.isEmpty
                                    ? Container(
                                        height: Get.width * 0.8,
                                        padding: EdgeInsets.symmetric(
                                            horizontal: 25),
                                        child: ListView(
                                          shrinkWrap: true,
                                          children: [
                                            Container(
                                              child: ListView.builder(
                                                shrinkWrap: true,
                                                physics:
                                                    NeverScrollableScrollPhysics(),
                                                itemCount:
                                                    snapshot.data!.docs.length,
                                                itemBuilder: (context, index) {
                                                  DocumentSnapshot doc =
                                                      snapshot
                                                          .data!.docs[index];
                                                  PersonalAddress? address =
                                                      PersonalAddress.fromMap(
                                                          doc.data() as Map<
                                                              String, dynamic>);
                                                  return LocationTile(
                                                    withCricle: true,
                                                    address: address,
                                                    active: controller
                                                            .deliveryHomeController
                                                            .deliveryHubController
                                                            .currentPersonalAddress
                                                            .value
                                                            .adID ==
                                                        address.adID,
                                                    onTap: () async {
                                                      await controller
                                                          .setCurrentAddress(
                                                              address);
                                                      controller
                                                          .deliveryHomeController
                                                          .calculateAllData();
                                                      controller
                                                          .deliveryHomeController
                                                          .deliveryHubController
                                                          .cart
                                                          .refresh();
                                                      Get.back();
                                                    },
                                                  );
                                                },
                                              ),
                                            ),
                                            ListTile(
                                              onTap: () async {
                                                controller
                                                    .deliveryHomeController
                                                    .cartAddressFlag
                                                    .value = true;
                                                Get.to(
                                                  () =>
                                                      DeliveryAddNewAddressView(),
                                                  binding:
                                                      DeliveryAddressBookBinding(),
                                                );
                                                controller
                                                    .deliveryHomeController
                                                    .deliveryHubController
                                                    .cart
                                                    .refresh();
                                              },
                                              title: Text('addNewAddress'.tr,
                                                  style:
                                                      Get.textTheme.headline4),
                                              leading: SvgPicture.asset(
                                                'assets/svg/gen011-021.svg',
                                                width: 25,
                                              ),
                                            ),
                                            Divider(),
                                            ListTile(
                                              onTap: () async {
                                                controller
                                                    .deliveryHomeController
                                                    .deliveryHubController
                                                    .currentPersonalAddress
                                                    .value = PersonalAddress();
                                                await controller
                                                    .setCurrentAddress(controller
                                                        .deliveryHomeController
                                                        .deliveryHubController
                                                        .currentPersonalAddress
                                                        .value);
                                                controller
                                                    .deliveryHomeController
                                                    .calculateAllData();
                                                controller
                                                    .deliveryHomeController
                                                    .deliveryHubController
                                                    .cart
                                                    .refresh();
                                                Get.back();
                                              },
                                              title: Text('currentLocation'.tr,
                                                  style:
                                                      Get.textTheme.headline4),
                                              leading: SvgPicture.asset(
                                                'assets/svg/gen011-021.svg',
                                                width: 25,
                                              ),
                                            )
                                          ],
                                        ),
                                      )
                                    : Container(
                                        padding: EdgeInsets.all(10),
                                        child: Column(
                                          children: [
                                            ListTile(
                                              onTap: () {
                                                controller
                                                    .deliveryHomeController
                                                    .cartAddressFlag
                                                    .value = true;
                                                Get.to(
                                                  () =>
                                                      DeliveryAddNewAddressView(),
                                                  binding:
                                                      DeliveryAddressBookBinding(),
                                                );
                                              },
                                              title: Text('addNewAddress'.tr,
                                                  style:
                                                      Get.textTheme.headline4),
                                              leading: SvgPicture.asset(
                                                'assets/svg/gen011-021.svg',
                                                width: 25,
                                              ),
                                            ),
                                            Divider(),
                                            ListTile(
                                              onTap: () {
                                                controller
                                                    .deliveryHomeController
                                                    .deliveryHubController
                                                    .currentPersonalAddress
                                                    .value = PersonalAddress();
                                                print(controller
                                                    .deliveryHomeController
                                                    .deliveryHubController
                                                    .currentPersonalAddress
                                                    .value
                                                    .lat);
                                                Get.back();
                                              },
                                              title: Text('currentLocation'.tr,
                                                  style:
                                                      Get.textTheme.headline4),
                                              leading: SvgPicture.asset(
                                                'assets/svg/gen011-021.svg',
                                                width: 25,
                                              ),
                                            )
                                          ],
                                        ),
                                      );
                              },
                            )
                          : Column(
                              mainAxisAlignment: MainAxisAlignment.end,
                              children: [
                                Container(
                                  height: 10,
                                  color: AppColors.white,
                                ),
                                Container(
                                  color: AppColors.white,
                                  child: Column(
                                    children: [
                                      DelvieryTileButtonForDrawer(
                                        title: 'login'.tr,
                                        onTap: () {
                                          Get.offAll(() => SignInView(),
                                              binding: SignInBinding());
                                        },
                                        icon: Icon(Icons.login,
                                            color: AppColors.primary),
                                      ),
                                      Container(
                                        height: 30,
                                        color: AppColors.white,
                                      ),
                                    ],
                                  ),
                                ),
                              ],
                            ));
                },
                title: controller.deliveryHomeController.deliveryHubController
                            .currentPersonalAddress.value.adID ==
                        null
                    ? 'currentLocation'.tr
                    : controller.deliveryHomeController.deliveryHubController
                        .currentPersonalAddress.value.title!,
              ),
            ),
            const SizedBox(height: 25),
            Column(
              children: [
                Row(
                  children: [
                    SvgPicture.asset(
                      'assets/svg/Icon payment.svg',
                      width: 18,
                    ),
                    const SizedBox(width: 5),
                    Text(
                      'Choose your preferred payment method'.tr,
                      style: Get.textTheme.headline6,
                    ),
                  ],
                ),
                const SizedBox(height: 10),
                RdButton(),
                const SizedBox(height: 10),
                Divider(
                  endIndent: 2,
                  indent: 2,
                  thickness: 1.2,
                ),
                controller.deliveryHomeController.deliveryHubController.cart
                            .value.orderType ==
                        0
                    ? Obx(
                        () => controller
                                    .deliveryHomeController
                                    .deliveryHubController
                                    .currentPersonalAddress
                                    .value
                                    .adID !=
                                null
                            ? SizedBox()
                            : Container(
                                margin: EdgeInsets.only(
                                    bottom: 15.0,
                                    top: 15.0,
                                    right: 5.0,
                                    left: 5.0),
                                padding: EdgeInsets.all(10.0),
                                decoration: BoxDecoration(
                                    borderRadius: BorderRadius.circular(10.0),
                                    color: AppColors.white,
                                    boxShadow: [AppStyles.primaryShadow]),
                                child: Row(
                                  children: [
                                    Icon(
                                      Icons.report_outlined,
                                      color: AppColors.notification,
                                    ),
                                    SizedBox(
                                      width: 10.0,
                                    ),
                                    Expanded(
                                      child: Text(
                                        "pleaseSelectOrderAddressInCart".tr,
                                        style: Get.textTheme.headline4!
                                            .copyWith(height: 1.5),
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                      )
                    : SizedBox(),
                controller.deliveryHomeController.deliveryHubController.cart
                            .value.orders![0].storeName! !=
                        'directOrder'
                    ? Column(
                        children: [
                          const SizedBox(height: 10),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              Text(
                                'Estimate Delivery Fee'.tr,
                                style: Get.textTheme.headline5,
                              ),
                              Obx(
                                () => Text(
                                  controller.deliveryHomeController.price
                                              .value ==
                                          0.0
                                      ? '-'
                                      : controller.deliveryHomeController.price
                                              .value
                                              .toString() +
                                          ' - ' +
                                          (controller.deliveryHomeController
                                                      .price.value +
                                                  5.0)
                                              .toString() +
                                          ' ' +
                                          'SAR'.tr,
                                  style: Get.textTheme.headline5,
                                ),
                              ),
                            ],
                          ),
                          const SizedBox(height: 10),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              Text(
                                'Total Distance'.tr,
                                style: Get.textTheme.headline5,
                              ),
                              Obx(
                                () => Text(
                                  controller.deliveryHomeController.distance
                                              .value ==
                                          0.0
                                      ? '-'
                                      : controller.authManager.deliveryTools
                                          .getDistanceString(controller
                                              .deliveryHomeController
                                              .distance
                                              .value),
                                  style: Get.textTheme.headline5,
                                ),
                              ),
                            ],
                          ),
                        ],
                      )
                    : Container(),
                const SizedBox(height: 30),
                Column(
                  children: [
                    PrimaryButton(
                      text: 'Send',
                      function: () async {
                        if (!controller.authManager.isLogged.value) {
                          controller.authManager.commonTools
                              .showFailedSnackBar('pleaseLogin');
                          return;
                        }
                        // if (controller
                        //         .deliveryHomeController
                        //         .deliveryHubController
                        //         .currentPersonalAddress
                        //         .value
                        //         .lat ==
                        //     null) {
                        //   controller.authManager.commonTools.showFailedSnackBar(
                        //       'pleaseSelectOrderAddressInCart');
                        //   return;
                        // }
                        controller.authManager.commonTools.showLoading();
                        await controller.sendOrder();
                      },
                    ),
                    const SizedBox(height: 15),
                    PrimaryButton(
                      text: 'clearthebasket'.tr,
                      function: () {
                        showDialog(
                          context: context,
                          builder: (context) => CustimizedCupertinoDialog(
                            onPressed: () async {
                              controller
                                  .deliveryHomeController.deliveryHubController
                                  .clearCart();
                              Get.back();
                              Get.back();
                              if (controller
                                      .deliveryHomeController
                                      .deliveryHubController
                                      .cart
                                      .value
                                      .orderType ==
                                  0) {
                                controller
                                        .deliveryHomeController.distance.value =
                                    await controller.authManager.deliveryTools
                                        .calculateAllDistanceForPrice(controller
                                            .deliveryHomeController
                                            .deliveryHubController
                                            .cart
                                            .value
                                            .orders!);
                              }
                              await controller.deliveryHomeController
                                  .deliveryHubController.globalStorage
                                  .remove('deliveryCartFromLocal');
                            },
                            title: 'do you want to clear this cart?'.tr,
                          ),
                        );
                      },
                      buttonColor: AppColors.white,
                      fontColor: AppColors.black,
                    )
                  ],
                ),
                const SizedBox(height: 30),
              ],
            ),
          ],
        ),
      ),
    );
  }
}