Untitled

 avatar
unknown
plain_text
a year ago
52 kB
6
Indexable
import 'dart:developer';

import 'package:animation_wrappers/animation_wrappers.dart';
import 'package:flutter/material.dart';
import 'package:old_barrel/Assets/assets.dart';
import 'package:old_barrel/Components/custom_button2.dart';
import 'package:old_barrel/Components/entry_field2.dart';
import 'package:old_barrel/Locale/locale.dart';
import 'package:old_barrel/Routes/page_routes.dart';
import 'package:old_barrel/constant/common_string.dart';
import 'package:old_barrel/custom_widgets/common_indicator.dart';
import 'package:old_barrel/providers/cart_controller.dart';
import 'package:provider/provider.dart';

import '../BottomNavigation/Home/home_page.dart';
import '../BottomNavigation/Home/item_info.dart';
import '../Components/custom_button.dart';
import '../Components/entry_field.dart';
import '../constant/custom_dialog/confirm_dialog.dart';
import '../models/select_address_model.dart';
import '../providers/add_address_controller.dart';

class CartPage extends StatefulWidget {
  @override
  _CartPageState createState() => _CartPageState();
}

class CartItem {
  String image;
  String name;
  String volume;
  double price;
  int quantity;

  CartItem(this.image, this.name, this.volume, this.price, this.quantity);
}

List<CartItem> cartItems = [
  CartItem(Assets.beer1Shadow, 'Classic Beer Dark\nStrong', '350ml', 8.50, 3),
  CartItem(Assets.beer2, 'Whyte Premium\nWhiskey', '500ml', 10.50, 1),
];

class _CartPageState extends State<CartPage> {
  @override
  void initState() {
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      Provider.of<CartController>(context, listen: false).cartApi();
      Provider.of<CartController>(context, listen: false).addressListApi();
    });
    super.initState();
  }

  var id;
  var selectedAddress = '';
  var name = '';
  var add1;
  var add2;
  var state;
  var pinCode;
  var mobile;
  bool sel = false;
  List<SelectAddressModel> address = [];
  final GlobalKey<FormState> addressKey = GlobalKey<FormState>();
  var totalPrice;
  @override
  Widget build(BuildContext context) {
    var locale = AppLocalizations.of(context)!;
    return Consumer<CartController>(builder: (context, cartController, child) {
      return WillPopScope(
        onWillPop: () async {
          Navigator.pop(context);
          return false;
        },
        child: Scaffold(
          backgroundColor: Theme.of(context).secondaryHeaderColor,
          appBar: PreferredSize(
            preferredSize: Size.fromHeight(200),
            child: Column(
              children: [
                AppBar(
                  title: Text(locale.myBag!),
                  centerTitle: true,
                  leading: IconButton(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                    icon: Icon(Icons.arrow_back_ios),
                  ),
                ),
                InkWell(
                  onTap: () async {
                    showModalBottomSheet<void>(
                        context: context,
                        builder: (BuildContext context) {
                          return StatefulBuilder(
                            builder: (BuildContext context, setState) {
                              return SingleChildScrollView(
                                child: Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: [
                                    Container(
                                      child: Padding(
                                        padding: const EdgeInsets.only(
                                            left: 20, right: 20),
                                        child: Row(
                                          mainAxisAlignment:
                                              MainAxisAlignment.spaceBetween,
                                          children: [
                                            SectionText(text: "SELECT ADDRESS"),
                                            Material(
                                              color: Theme.of(context)
                                                  .secondaryHeaderColor,
                                              child: InkWell(
                                                  onTap: () {
                                                    showDialog(
                                                        context: context,
                                                        builder: (context) {
                                                          return Scaffold(
                                                            body: Form(
                                                              key: addressKey,
                                                              child:
                                                                  SingleChildScrollView(
                                                                child: Column(
                                                                  crossAxisAlignment:
                                                                      CrossAxisAlignment
                                                                          .stretch,
                                                                  children: [
                                                                    EntryField(
                                                                      label: AppString
                                                                          .firstName,
                                                                      hint: AppString
                                                                          .enterFirstName,
                                                                      controller:
                                                                          cartController
                                                                              .firstNameController,
                                                                      validator:
                                                                          (value) {
                                                                        if (value!
                                                                            .isEmpty) {
                                                                          return AppString
                                                                              .enterYourFirstName
                                                                              .toString();
                                                                        }
                                                                        return null;
                                                                      },
                                                                    ),
                                                                    EntryField(
                                                                      label: AppString
                                                                          .lastName,
                                                                      hint: AppString
                                                                          .enterLastName,
                                                                      controller:
                                                                          cartController
                                                                              .lastNameController,
                                                                      validator:
                                                                          (value) {
                                                                        if (value!
                                                                            .isEmpty) {
                                                                          return AppString
                                                                              .enterYourLastName
                                                                              .toString();
                                                                        }
                                                                        return null;
                                                                      },
                                                                    ),
                                                                    EntryField(
                                                                      label: AppString
                                                                          .emailAddress,
                                                                      hint: AppString
                                                                          .enterEmailAddress,
                                                                      controller:
                                                                          cartController
                                                                              .emailController,
                                                                    ),
                                                                    EntryField(
                                                                      label: AppString
                                                                          .mobileNumber,
                                                                      hint: AppString
                                                                          .enterMobileNumber,
                                                                      controller:
                                                                          cartController
                                                                              .mobileNumberController,
                                                                      validator:
                                                                          (value) {
                                                                        if (value!
                                                                            .isEmpty) {
                                                                          return AppString
                                                                              .enterYourMobilenumber
                                                                              .toString();
                                                                        } else if (value.length !=
                                                                            10) {
                                                                          return AppString
                                                                              .enter10Char;
                                                                        }
                                                                        return null;
                                                                      },
                                                                      textInputType:
                                                                          TextInputType
                                                                              .number,
                                                                      maxLength:
                                                                          10,
                                                                    ),
                                                                    EntryField(
                                                                      label: AppString
                                                                          .add1,
                                                                      hint: AppString
                                                                          .enterAdd1,
                                                                      controller:
                                                                          cartController
                                                                              .add1Controller,
                                                                      validator:
                                                                          (value) {
                                                                        if (value!
                                                                            .isEmpty) {
                                                                          return AppString
                                                                              .enterYourAdd1
                                                                              .toString();
                                                                        }
                                                                        return null;
                                                                      },
                                                                    ),
                                                                    EntryField(
                                                                      label: AppString
                                                                          .add2,
                                                                      hint: AppString
                                                                          .enterAdd2,
                                                                      controller:
                                                                          cartController
                                                                              .add2Controller,
                                                                    ),
                                                                    EntryField(
                                                                      label: AppString
                                                                          .pinCode,
                                                                      hint: AppString
                                                                          .enterPinCode,
                                                                      controller:
                                                                          cartController
                                                                              .pinCodeController,
                                                                      validator:
                                                                          (value) {
                                                                        if (value!
                                                                            .isEmpty) {
                                                                          return AppString
                                                                              .enterYourPinCode
                                                                              .toString();
                                                                        } else if (value.length !=
                                                                            6) {
                                                                          return AppString
                                                                              .enterYour6PinCode;
                                                                        }
                                                                        return null;
                                                                      },
                                                                      textInputType:
                                                                          TextInputType
                                                                              .number,
                                                                      maxLength:
                                                                          6,
                                                                    ),
                                                                    EntryField(
                                                                      label: AppString
                                                                          .city,
                                                                      hint: AppString
                                                                          .enterCity,
                                                                      controller:
                                                                          cartController
                                                                              .cityController,
                                                                      validator:
                                                                          (value) {
                                                                        if (value!
                                                                            .isEmpty) {
                                                                          return AppString
                                                                              .enterYourCity
                                                                              .toString();
                                                                        }
                                                                        return null;
                                                                      },
                                                                    ),
                                                                    EntryField(
                                                                      label: AppString
                                                                          .state,
                                                                      hint: AppString
                                                                          .enterState,
                                                                      controller:
                                                                          cartController
                                                                              .stateController,
                                                                      validator:
                                                                          (value) {
                                                                        if (value!
                                                                            .isEmpty) {
                                                                          return AppString
                                                                              .enterYourState
                                                                              .toString();
                                                                        }
                                                                        return null;
                                                                      },
                                                                      readOnly:
                                                                          true,
                                                                    ),
                                                                    SizedBox(
                                                                      height:
                                                                          20,
                                                                    ),
                                                                    Padding(
                                                                      padding: const EdgeInsets
                                                                              .fromLTRB(
                                                                          20,
                                                                          0,
                                                                          20,
                                                                          20),
                                                                      child:
                                                                          CustomButton(
                                                                        onTap:
                                                                            () {
                                                                          if (addressKey
                                                                              .currentState!
                                                                              .validate()) {
                                                                            showIndicator(context);
                                                                            cartController.addAddressApi(context);
                                                                            // addressController.registerApi(context);
                                                                          }
                                                                        },
                                                                      ),
                                                                    ),
                                                                  ],
                                                                ),
                                                              ),
                                                            ),
                                                          );
                                                        });
                                                  },
                                                  child: SectionText(
                                                      text: "Add ADDRESS")),
                                            ),
                                          ],
                                        ),
                                      ),
                                      color: Theme.of(context)
                                          .secondaryHeaderColor,
                                      width: MediaQuery.of(context).size.width,
                                    ),
                                    Container(
                                        decoration: BoxDecoration(
                                            color: Theme.of(context)
                                                .secondaryHeaderColor),
                                        child: SizedBox(
                                          height: 400,
                                          width:
                                              MediaQuery.of(context).size.width,
                                          child: cartController
                                                      .addressListModel ==
                                                  null
                                              ? Container()
                                              : ListView.builder(
                                                  scrollDirection:
                                                      Axis.vertical,
                                                  physics: ScrollPhysics(),
                                                  shrinkWrap: true,
                                                  primary: true,
                                                  itemCount: cartController
                                                      .addressListModel!.length,
                                                  itemBuilder:
                                                      (context, index) {
                                                    var data = cartController
                                                            .addressListModel![
                                                        index];
                                                    return InkWell(
                                                      onTap: () {
                                                        this.setState(() {
                                                          name =
                                                              selectedAddress;
                                                        });
                                                        setState(() {
                                                          name =
                                                              selectedAddress;
                                                        });
                                                      },
                                                      child: RadioListTile<
                                                              dynamic>(
                                                          fillColor:
                                                              MaterialStateColor
                                                                  .resolveWith(
                                                            (Set<MaterialState>
                                                                states) {
                                                              if (states.contains(
                                                                  MaterialState
                                                                      .selected)) {
                                                                return Theme.of(
                                                                        context)
                                                                    .primaryColor;
                                                              }
                                                              return Colors
                                                                  .white;
                                                            },
                                                          ),
                                                          title: Text(
                                                            "${cartController.addressListModel![index].fullname}\n${cartController.addressListModel![index].add1}${cartController.addressListModel![index].add2}, ${cartController.addressListModel![index].state} - ${cartController.addressListModel![index].pincode}\n${cartController.addressListModel![index].mobileno}",
                                                            style: TextStyle(
                                                                color: Colors
                                                                    .white),
                                                          ),
                                                          value:
                                                              "${data.id}#${data.fullname}#${data.add1}#${data.add2}#${data.mobileno}#${data.pincode}#${data.state}",
                                                          groupValue:
                                                              cartController
                                                                  .value,
                                                          onChanged: (val) {
                                                            cartController
                                                                .value = val;
                                                            id = val
                                                                .toString()
                                                                .split('#')[0];
                                                            name = val
                                                                .toString()
                                                                .split('#')[1];
                                                            add1 = val
                                                                .toString()
                                                                .split('#')[2];
                                                            add2 = val
                                                                .toString()
                                                                .split('#')[3];
                                                            mobile = val
                                                                .toString()
                                                                .split('#')[4];
                                                            pinCode = val
                                                                .toString()
                                                                .split('#')[5];
                                                            state = val
                                                                .toString()
                                                                .split('#')[6];
                                                            selectedAddress =
                                                                '${name}\n${add1}, ${add2}, ${state} - ${pinCode}\n${mobile}';
                                                            log(selectedAddress
                                                                .toString());
                                                            cartController
                                                                .reload();
                                                            sel = true;
                                                            Navigator.of(
                                                                    context)
                                                                .pop();
                                                            setState(() {});
                                                          }),
                                                    );
                                                  }),
                                        )),
                                  ],
                                ),
                              );
                            },
                          );
                        });
                  },
                  child: Container(
                    width: MediaQuery.of(context).size.width / 1,
                    height: 140,
                    margin: EdgeInsets.symmetric(
                      horizontal: 14,
                    ),
                    padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
                    decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(4),
                        color: Theme.of(context).scaffoldBackgroundColor),
                    child: Row(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        Image.asset(
                          Assets.locationIcon,
                          scale: 3,
                        ),
                        SizedBox(
                          width: 12,
                        ),
                        Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Row(
                              children: [
                                Text(
                                  locale.deliveryTo!.toUpperCase(),
                                  style: Theme.of(context)
                                      .textTheme
                                      .bodyMedium!
                                      .copyWith(
                                          color: Theme.of(context).primaryColor,
                                          fontSize: 12),
                                ),
                              ],
                            ),
                            SizedBox(
                              height: 4,
                            ),
                            SizedBox(
                              width: MediaQuery.of(context).size.width / 1.4,
                              child: Wrap(
                                children: [
                                  Text(
                                    "${sel == true ? selectedAddress : cartController.defaultd}",
                                    style: Theme.of(context)
                                        .textTheme
                                        .bodyMedium!
                                        .copyWith(
                                            fontSize: 12, color: Colors.white),
                                  ),
                                ],
                              ),
                            )
                          ],
                        ),
                        Icon(
                          Icons.keyboard_arrow_down,
                          color: Theme.of(context).primaryColor,
                          size: 25,
                        )
                      ],
                    ),
                  ),
                ),
              ],
            ),
          ),
          body: FadedSlideAnimation(
            child: Stack(
              alignment: Alignment.bottomCenter,
              children: [
                Container(
                  height: MediaQuery.of(context).size.height,
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.vertical(
                        top: Radius.circular(20),
                      ),
                      color: Theme.of(context).scaffoldBackgroundColor),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: [
                      Padding(
                        padding: const EdgeInsets.symmetric(
                            horizontal: 20.0, vertical: 20.0),
                        child: Column(
                          children: [
                            Text(
                              '${cartController.cartData.length}  ' +
                                  locale.itemsInBag!,
                              style: Theme.of(context).textTheme.bodySmall,
                            ),
                          ],
                        ),
                      ),
                      Container(
                        height: MediaQuery.of(context).size.height / 2,
                        child: ListView.builder(
                            scrollDirection: Axis.vertical,
                            itemCount: cartController.cartData.length,
                            shrinkWrap: true,
                            primary: true,
                            itemBuilder: (context, index) {
                              var data = cartController.cartData[index];
                              var p = int.tryParse(data.price.toString());
                              int q = int.tryParse(data.qty.toString()) ?? 1;
                              totalPrice = (p! * q);
                              Map imgMap = {};
                              if (data.img is Map) imgMap = data.img as Map;
                              print(data.img);
                              return Padding(
                                padding: const EdgeInsetsDirectional.only(
                                    start: 20, end: 16, bottom: 16),
                                child: Row(
                                  mainAxisAlignment:
                                      MainAxisAlignment.spaceEvenly,
                                  children: [
                                    Expanded(
                                      flex: 2,
                                      child: Container(
                                        margin: EdgeInsets.only(right: 10),
                                        child: imgMap.isNotEmpty
                                            ? Image.network(
                                                'https://theliquidexchange.in/admin/product_images/' +
                                                    '${data.img['small_img']}',
                                                scale: 15,
                                              )
                                            : Image.asset(
                                                Assets.placeHolder,
                                                scale: 5.5,
                                              ),
                                      ),
                                    ),
                                    Expanded(
                                      flex: 4,
                                      child: Container(
                                        width:
                                            MediaQuery.of(context).size.width /
                                                2,
                                        child: Column(
                                          crossAxisAlignment:
                                              CrossAxisAlignment.start,
                                          children: [
                                            Text(
                                              data.productname.toString(),
                                              style: Theme.of(context)
                                                  .textTheme
                                                  .bodyMedium!
                                                  .copyWith(
                                                      overflow:
                                                          TextOverflow.fade),
                                            ),
                                            Padding(
                                              padding:
                                                  const EdgeInsets.symmetric(
                                                      vertical: 5),
                                              child: Text(
                                                data.variationsString
                                                        .toString() +
                                                    ' ml',
                                                style: Theme.of(context)
                                                    .textTheme
                                                    .bodySmall,
                                              ),
                                            ),
                                            Text(
                                              '₹' + '${data.price ?? ''}',
                                              style: Theme.of(context)
                                                  .textTheme
                                                  .bodyMedium!
                                                  .copyWith(
                                                      color: Theme.of(context)
                                                          .primaryColor),
                                            ),
                                          ],
                                        ),
                                      ),
                                    ),
                                    Expanded(
                                      flex: 2,
                                      child: Column(
                                        crossAxisAlignment:
                                            CrossAxisAlignment.center,
                                        mainAxisAlignment:
                                            MainAxisAlignment.spaceBetween,
                                        children: [
                                          Row(
                                            mainAxisAlignment:
                                                MainAxisAlignment.spaceEvenly,
                                            children: [
                                              InkWell(
                                                onTap: () {
                                                  if (q > 1) {
                                                    if (q > 1)
                                                      setState(() {
                                                        q--;
                                                      });
                                                    showIndicator(context);
                                                    cartController.updateCart(
                                                      context,
                                                      caryId: data.cartId,
                                                      qty: q.toString(),
                                                    );
                                                    cartController.cartApi();
                                                  } else {
                                                    showIndicator(context);
                                                    confirmDialog(context,
                                                        text: AppString
                                                            .deleteItem,
                                                        onPressed: () {
                                                      cartController.deleteCartItem(
                                                          data.cartId,
                                                          data.shoppingSessionId,
                                                          context);
                                                    });
                                                  }
                                                },
                                                child: Icon(
                                                  Icons.remove,
                                                  color: Colors.white,
                                                  size: 24,
                                                ),
                                              ),
                                              Padding(
                                                padding:
                                                    const EdgeInsets.symmetric(
                                                        horizontal: 8.0),
                                                child: Text(
                                                  q.toString() ?? '',
                                                  style: Theme.of(context)
                                                      .textTheme
                                                      .bodyMedium!
                                                      .copyWith(
                                                          color:
                                                              Theme.of(context)
                                                                  .primaryColor,
                                                          fontSize: 20),
                                                ),
                                              ),
                                              InkWell(
                                                onTap: () {
                                                  setState(() {
                                                    q++;
                                                  });
                                                  showIndicator(context);
                                                  cartController.updateCart(
                                                    context,
                                                    caryId: data.cartId,
                                                    qty: q.toString(),
                                                  );
                                                  cartController.cartApi();
                                                  log(q.toString());
                                                },
                                                child: Icon(
                                                  Icons.add,
                                                  color: Colors.white,
                                                  size: 24,
                                                ),
                                              ),
                                            ],
                                          ),
                                          /* Padding(
                                            padding: const EdgeInsets.symmetric(
                                                vertical: 10),
                                            child: InkWell(
                                              onTap: () {
                                                showIndicator(context);
                                                confirmDialog(context,
                                                    text: AppString.deleteItem,
                                                    onPressed: () {
                                                  cartController.deleteCartItem(
                                                      data.cartId,
                                                      data.shoppingSessionId,
                                                      context);
                                                });
                                              },
                                              child: Icon(
                                                Icons.delete,
                                                color: Colors.red,
                                                size: 18,
                                              ),
                                            ),
                                          ),*/
                                          Text(
                                            '₹' + '${totalPrice}',
                                            style: Theme.of(context)
                                                .textTheme
                                                .bodyLarge,
                                          )
                                        ],
                                      ),
                                    ),
                                  ],
                                ),
                              );
                            }),
                      )
                    ],
                  ),
                ),
                PositionedDirectional(
                  bottom: 0,
                  start: 0,
                  end: 0,
                  child: CartPay(
                    sTotal: cartController.calculateTotal().toString(),
                    onTap: () {
                      cartController.checkout(context,
                          address: cartController.value.split('#')[0],
                          shopping_session_id:
                              cartController.cartData[0].shoppingSessionId,
                          gross_amount:
                              cartController.calculateTotal().toString(),
                          net_amt: cartController.calculateTotal().toString(),
                          tax_amount: "0",
                          discount_per: "0",
                          discount_amt: "0");
                    },
                  ),
                ),
              ],
            ),
            beginOffset: Offset(0, 0.3),
            endOffset: Offset(0, 0),
            slideCurve: Curves.linearToEaseOut,
          ),
        ),
      );
    });
  }
}

class CartPay extends StatelessWidget {
  final String? sTotal;
  final String? dCharge;
  final String? toPay;
  final VoidCallback? onTap;
  const CartPay({Key? key, this.sTotal, this.dCharge, this.toPay, this.onTap})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    var locale = AppLocalizations.of(context)!;

    return Container(
      decoration: BoxDecoration(
          borderRadius: BorderRadius.vertical(
            top: Radius.circular(20),
          ),
          color: Theme.of(context).secondaryHeaderColor),
      child: Column(
        children: [
          Padding(
            padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 20),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Text(
                  'Total',
                  style: Theme.of(context).textTheme.bodyMedium!.copyWith(
                      color: Theme.of(context).primaryColor, fontSize: 16),
                ),
                Text(
                  '₹${sTotal ?? ''}',
                  style: Theme.of(context).textTheme.bodyMedium!.copyWith(
                      color: Theme.of(context).primaryColor, fontSize: 16),
                ),
              ],
            ),
          ),
          SizedBox(
            height: 12,
          ),
          CustomButton2(
            onTap:
                onTap /*() {
              Navigator.pushNamed(context, PageRoutes.paymentPage);
            }*/
            ,
            centerWidget: Center(
              child: Text(
                'PLACE ORDER',
                style: Theme.of(context)
                    .textTheme
                    .bodyLarge!
                    .copyWith(fontWeight: FontWeight.w700, fontSize: 16),
              ),
            ),
            /*  suffix: Icon(
              Icons.arrow_forward,
              color: Theme.of(context).colorScheme.background,
            ),*/
          )
        ],
      ),
    );
  }
}
Leave a Comment