From 97c9499f3e319c9f44adc60d3a7d2fb644408d57 Mon Sep 17 00:00:00 2001 From: WooSignal Date: Sat, 16 May 2020 20:30:34 +0100 Subject: [PATCH] RazorPay checkout added, Option to use shipping address, Config update, Pubspec.yaml change, Option to use different billing or shipping address, Bug fixes --- LabelStoreMax/CHANGELOG.md | 9 + LabelStoreMax/assets/images/razorpay.png | Bin 0 -> 65022 bytes .../ios/Runner.xcodeproj/project.pbxproj | 4 + LabelStoreMax/lang/en.json | 7 +- LabelStoreMax/lib/app_payment_methods.dart | 15 +- LabelStoreMax/lib/helpers/data/order_wc.dart | 6 + LabelStoreMax/lib/labelconfig.dart | 12 +- .../lib/models/checkout_session.dart | 40 +- .../lib/pages/checkout_confirmation.dart | 4 +- LabelStoreMax/lib/pages/checkout_details.dart | 665 ++++++++++++++---- .../lib/providers/cash_on_delivery.dart | 2 + LabelStoreMax/lib/providers/razor_pay.dart | 94 +++ LabelStoreMax/lib/providers/stripe_pay.dart | 2 + LabelStoreMax/pubspec.lock | 14 + LabelStoreMax/pubspec.yaml | 4 +- 15 files changed, 713 insertions(+), 165 deletions(-) create mode 100644 LabelStoreMax/assets/images/razorpay.png create mode 100644 LabelStoreMax/lib/providers/razor_pay.dart diff --git a/LabelStoreMax/CHANGELOG.md b/LabelStoreMax/CHANGELOG.md index c82afc3..7cfa957 100644 --- a/LabelStoreMax/CHANGELOG.md +++ b/LabelStoreMax/CHANGELOG.md @@ -1,3 +1,12 @@ +## [2.0.5] - 2020-05-16 + +* RazorPay checkout added +* Option to use shipping address +* Config update +* Pubspec.yaml change +* Option to use different billing or shipping address +* Bug fixes + ## [2.0.4] - 2020-05-13 * Added Flexible widget for checkout details diff --git a/LabelStoreMax/assets/images/razorpay.png b/LabelStoreMax/assets/images/razorpay.png new file mode 100644 index 0000000000000000000000000000000000000000..5f858126dddf2e551e2ee7f4880ed00fc81ed810 GIT binary patch literal 65022 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 arrPaymentMethods = [ ), ), + addPayment( + PaymentType( + id: 3, + name: "RazorPay", + desc: "Debit or Credit Card", + assetImage: "razorpay.png", + pay: razorPay, + ), + ), + // e.g. add more here // addPayment( // PaymentType( -// id: 3, +// id: 4, // name: "MyNewPaymentMethod", // desc: "Debit or Credit Card", // assetImage: "add icon image to assets/images/myimage.png", -// pay: stripePay +// pay: myCustomPaymentFunction // ), // ), ]; diff --git a/LabelStoreMax/lib/helpers/data/order_wc.dart b/LabelStoreMax/lib/helpers/data/order_wc.dart index 80ddf22..3184bca 100644 --- a/LabelStoreMax/lib/helpers/data/order_wc.dart +++ b/LabelStoreMax/lib/helpers/data/order_wc.dart @@ -66,6 +66,9 @@ Future buildOrderWC({TaxRate taxRate, bool markPaid = true}) async { billing.postcode = billingDetails.billingAddress.postalCode; billing.country = billingDetails.billingAddress.country; billing.email = billingDetails.billingAddress.emailAddress; + if (billingDetails.billingAddress.country == "United States") { + billing.state = billingDetails.billingAddress.state; + } orderWC.billing = billing; @@ -75,6 +78,9 @@ Future buildOrderWC({TaxRate taxRate, bool markPaid = true}) async { shipping.address1 = billingDetails.shippingAddress.addressLine; shipping.city = billingDetails.shippingAddress.city; shipping.postcode = billingDetails.shippingAddress.postalCode; + if (billingDetails.shippingAddress.country == "United States") { + shipping.state = billingDetails.shippingAddress.state; + } shipping.country = billingDetails.shippingAddress.country; orderWC.shipping = shipping; diff --git a/LabelStoreMax/lib/labelconfig.dart b/LabelStoreMax/lib/labelconfig.dart index ec32f13..89a4d98 100644 --- a/LabelStoreMax/lib/labelconfig.dart +++ b/LabelStoreMax/lib/labelconfig.dart @@ -16,7 +16,7 @@ import 'dart:ui'; Developer Notes SUPPORT EMAIL - support@woosignal.com - VERSION - 2.0.4 + VERSION - 2.0.5 https://woosignal.com */ @@ -24,7 +24,8 @@ import 'dart:ui'; const app_name = "MyApp"; -const app_key = "Your app key from WooSignal"; +const app_key = + "app_b2538b4325a4a6b0f3b919f4c91cea8087ba80977f4a7c1feda669127aca"; // Your App key from WooSignal // link: https://woosignal.com/dashboard/apps @@ -47,7 +48,7 @@ const app_locales_supported = [ /**/ -// Available: "Stripe", "CashOnDelivery", +// Available: "Stripe", "CashOnDelivery", "RazorPay" // Add the method to the array below e.g. ["Stripe", "CashOnDelivery"] const app_payment_methods = ["Stripe"]; @@ -78,6 +79,11 @@ const app_forgot_password_url = "https://mysite.com/my-account/lost-password"; // change to your forgot password url const app_wp_api_path = "/wp-json"; // By default "/wp-json" should work +/**/ +// https://razorpay.com/ + +const app_razor_id = "Your Razor ID from RazorPay"; + /**/ const app_debug = true; diff --git a/LabelStoreMax/lib/models/checkout_session.dart b/LabelStoreMax/lib/models/checkout_session.dart index 29d6fb0..d7d9f3e 100644 --- a/LabelStoreMax/lib/models/checkout_session.dart +++ b/LabelStoreMax/lib/models/checkout_session.dart @@ -21,7 +21,10 @@ import 'package:woosignal/models/response/tax_rate.dart'; import '../helpers/tools.dart'; class CheckoutSession { - String sfKeyCheckout = "CS_BILLING_DETAILS"; + String sfKeyBillingCheckout = "CS_BILLING_DETAILS"; + String sfKeyShippingCheckout = "CS_SHIPPING_DETAILS"; + bool shipToDifferentAddress = false; + CheckoutSession._privateConstructor(); static final CheckoutSession getInstance = CheckoutSession._privateConstructor(); @@ -35,19 +38,25 @@ class CheckoutSession { shippingType = null; } + void clear() { + billingDetails = null; + shippingType = null; + paymentType = null; + } + void saveBillingAddress() { SharedPref sharedPref = SharedPref(); CustomerAddress customerAddress = CheckoutSession.getInstance.billingDetails.billingAddress; String billingAddress = jsonEncode(customerAddress.toJson()); - sharedPref.save(sfKeyCheckout, billingAddress); + sharedPref.save(sfKeyBillingCheckout, billingAddress); } Future getBillingAddress() async { SharedPref sharedPref = SharedPref(); - String strCheckoutDetails = await sharedPref.read(sfKeyCheckout); + String strCheckoutDetails = await sharedPref.read(sfKeyBillingCheckout); if (strCheckoutDetails != null && strCheckoutDetails != "") { return CustomerAddress.fromJson(jsonDecode(strCheckoutDetails)); @@ -57,7 +66,30 @@ class CheckoutSession { void clearBillingAddress() { SharedPref sharedPref = SharedPref(); - sharedPref.remove(sfKeyCheckout); + sharedPref.remove(sfKeyBillingCheckout); + } + + void saveShippingAddress() { + SharedPref sharedPref = SharedPref(); + CustomerAddress customerAddress = + CheckoutSession.getInstance.billingDetails.shippingAddress; + + String shippingAddress = jsonEncode(customerAddress.toJson()); + sharedPref.save(sfKeyShippingCheckout, shippingAddress); + } + + Future getShippingAddress() async { + SharedPref sharedPref = SharedPref(); + String strCheckoutDetails = await sharedPref.read(sfKeyShippingCheckout); + if (strCheckoutDetails != null && strCheckoutDetails != "") { + return CustomerAddress.fromJson(jsonDecode(strCheckoutDetails)); + } + return null; + } + + void clearShippingAddress() { + SharedPref sharedPref = SharedPref(); + sharedPref.remove(sfKeyShippingCheckout); } Future total({bool withFormat, TaxRate taxRate}) async { diff --git a/LabelStoreMax/lib/pages/checkout_confirmation.dart b/LabelStoreMax/lib/pages/checkout_confirmation.dart index 7c395ed..daf93a9 100644 --- a/LabelStoreMax/lib/pages/checkout_confirmation.dart +++ b/LabelStoreMax/lib/pages/checkout_confirmation.dart @@ -291,14 +291,14 @@ class CheckoutConfirmationPageState extends State { .getTotal(withFormatting: true)), (_taxRate != null ? wsCheckoutTaxAmountWidgetFB(taxRate: _taxRate) - : Container()), + : null), wsCheckoutTotalWidgetFB( title: trans(context, "Total"), taxRate: _taxRate), Divider( color: Colors.black12, thickness: 1, ), - ], + ].where((e) => e != null).toList(), ), wsPrimaryButton( context, diff --git a/LabelStoreMax/lib/pages/checkout_details.dart b/LabelStoreMax/lib/pages/checkout_details.dart index a2a3be6..df2695d 100644 --- a/LabelStoreMax/lib/pages/checkout_details.dart +++ b/LabelStoreMax/lib/pages/checkout_details.dart @@ -28,22 +28,274 @@ class CheckoutDetailsPage extends StatefulWidget { class _CheckoutDetailsPageState extends State { _CheckoutDetailsPageState(); + bool _valDifferentShippingAddress = false; + int activeTabIndex = 0; + // BILLING TEXT CONTROLLERS + TextEditingController _txtBillingFirstName; + TextEditingController _txtBillingLastName; + TextEditingController _txtBillingAddressLine; + TextEditingController _txtBillingCity; + TextEditingController _txtBillingPostalCode; + TextEditingController _txtBillingEmailAddress; + TextEditingController _txtShippingFirstName; TextEditingController _txtShippingLastName; TextEditingController _txtShippingAddressLine; TextEditingController _txtShippingCity; TextEditingController _txtShippingPostalCode; TextEditingController _txtShippingEmailAddress; + String _strBillingCountry; String _strBillingState; + String _strShippingCountry; + String _strShippingState; + var valRememberDetails = true; + Widget activeTab; + + Widget tabShippingDetails() { + return Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _valDifferentShippingAddress + ? Divider( + height: 0, + ) + : null, + Flexible( + child: Row( + children: [ + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "First Name"), + controller: _txtShippingFirstName, + shouldAutoFocus: true, + ), + ), + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "Last Name"), + controller: _txtShippingLastName, + ), + ), + ], + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + ), + ), + Flexible( + child: Row( + children: [ + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "Address Line"), + controller: _txtShippingAddressLine, + ), + ), + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "City"), + controller: _txtShippingCity, + ), + ), + ], + ), + ), + Flexible( + child: Row( + children: [ + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "Postal code"), + controller: _txtShippingPostalCode, + ), + ), + Flexible( + child: wsTextEditingRow(context, + heading: trans(context, "Email address"), + keyboardType: TextInputType.emailAddress, + controller: _txtShippingEmailAddress), + ), + ], + ), + ), + Flexible( + child: Row( + children: [ + (_strShippingCountry == "United States" + ? Flexible( + child: Padding( + child: wsSecondaryButton( + context, + title: (_strShippingState != null && + _strShippingState.isNotEmpty + ? trans(context, "Selected") + + "\n" + + _strShippingState + : trans(context, "Select state")), + action: () => _showSelectStateModal("shipping"), + ), + padding: EdgeInsets.all(8), + ), + ) + : null), + Flexible( + child: Padding( + child: wsSecondaryButton( + context, + title: (_strShippingCountry != null && + _strShippingCountry.isNotEmpty + ? trans(context, "Selected") + + "\n" + + _strShippingCountry + : trans(context, "Select country")), + action: () => _showSelectCountryModal("shipping"), + ), + padding: EdgeInsets.all(8), + ), + ), + ].where((element) => element != null).toList(), + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + ), + ), + ].where((e) => e != null).toList(), + ), + ); + } + + Widget tabBillingDetails() { + return Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _valDifferentShippingAddress + ? Divider( + height: 0, + ) + : null, + Flexible( + child: Row( + children: [ + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "First Name"), + controller: _txtBillingFirstName, + shouldAutoFocus: true, + ), + ), + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "Last Name"), + controller: _txtBillingLastName, + ), + ), + ], + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + ), + ), + Flexible( + child: Row( + children: [ + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "Address Line"), + controller: _txtBillingAddressLine, + ), + ), + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "City"), + controller: _txtBillingCity, + ), + ), + ], + ), + ), + Flexible( + child: Row( + children: [ + Flexible( + child: wsTextEditingRow( + context, + heading: trans(context, "Postal code"), + controller: _txtBillingPostalCode, + ), + ), + Flexible( + child: wsTextEditingRow(context, + heading: trans(context, "Email address"), + keyboardType: TextInputType.emailAddress, + controller: _txtBillingEmailAddress), + ), + ], + ), + ), + Flexible( + child: Row( + children: [ + (_strBillingCountry == "United States" + ? Flexible( + child: Padding( + child: wsSecondaryButton( + context, + title: (_strBillingState != null && + _strBillingState.isNotEmpty + ? trans(context, "Selected") + + "\n" + + _strBillingState + : trans(context, "Select state")), + action: () => _showSelectStateModal("billing"), + ), + padding: EdgeInsets.all(8), + ), + ) + : null), + Flexible( + child: Padding( + child: wsSecondaryButton( + context, + title: (_strBillingCountry != null && + _strBillingCountry.isNotEmpty + ? trans(context, "Selected") + + "\n" + + _strBillingCountry + : trans(context, "Select country")), + action: () => _showSelectCountryModal("billing"), + ), + padding: EdgeInsets.all(8), + ), + ), + ].where((element) => element != null).toList(), + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + ), + ), + ].where((e) => e != null).toList(), + ), + ); + } @override void initState() { super.initState(); + // SHIPPING _txtShippingFirstName = TextEditingController(); _txtShippingLastName = TextEditingController(); _txtShippingAddressLine = TextEditingController(); @@ -51,42 +303,75 @@ class _CheckoutDetailsPageState extends State { _txtShippingPostalCode = TextEditingController(); _txtShippingEmailAddress = TextEditingController(); + // BILLING + _txtBillingFirstName = TextEditingController(); + _txtBillingLastName = TextEditingController(); + _txtBillingAddressLine = TextEditingController(); + _txtBillingCity = TextEditingController(); + _txtBillingPostalCode = TextEditingController(); + _txtBillingEmailAddress = TextEditingController(); + if (CheckoutSession.getInstance.billingDetails.billingAddress == null) { CheckoutSession.getInstance.billingDetails.initSession(); CheckoutSession.getInstance.billingDetails.shippingAddress.initAddress(); CheckoutSession.getInstance.billingDetails.billingAddress.initAddress(); } BillingDetails billingDetails = CheckoutSession.getInstance.billingDetails; - _txtShippingFirstName.text = billingDetails.billingAddress.firstName; - _txtShippingLastName.text = billingDetails.billingAddress.lastName; - _txtShippingAddressLine.text = billingDetails.billingAddress.addressLine; - _txtShippingCity.text = billingDetails.billingAddress.city; - _txtShippingPostalCode.text = billingDetails.billingAddress.postalCode; - _txtShippingEmailAddress.text = billingDetails.billingAddress.emailAddress; + _txtBillingFirstName.text = billingDetails.billingAddress.firstName; + _txtBillingLastName.text = billingDetails.billingAddress.lastName; + _txtBillingAddressLine.text = billingDetails.billingAddress.addressLine; + _txtBillingCity.text = billingDetails.billingAddress.city; + _txtBillingPostalCode.text = billingDetails.billingAddress.postalCode; + _txtBillingEmailAddress.text = billingDetails.billingAddress.emailAddress; _strBillingCountry = billingDetails.billingAddress.country; _strBillingState = billingDetails.billingAddress.state; + _txtShippingFirstName.text = billingDetails.shippingAddress.firstName; + _txtShippingLastName.text = billingDetails.shippingAddress.lastName; + _txtShippingAddressLine.text = billingDetails.shippingAddress.addressLine; + _txtShippingCity.text = billingDetails.shippingAddress.city; + _txtShippingPostalCode.text = billingDetails.shippingAddress.postalCode; + _txtShippingEmailAddress.text = billingDetails.shippingAddress.emailAddress; + _strShippingCountry = billingDetails.shippingAddress.country; + _strShippingState = billingDetails.shippingAddress.state; + + _valDifferentShippingAddress = + CheckoutSession.getInstance.shipToDifferentAddress; valRememberDetails = billingDetails.rememberDetails ?? true; _sfCustomerAddress(); } _sfCustomerAddress() async { - CustomerAddress sfCustomerAddress = + CustomerAddress sfCustomerBillingAddress = await CheckoutSession.getInstance.getBillingAddress(); - if (sfCustomerAddress != null) { - CustomerAddress customerAddress = sfCustomerAddress; + if (sfCustomerBillingAddress != null) { + CustomerAddress customerAddress = sfCustomerBillingAddress; + _txtBillingFirstName.text = customerAddress.firstName; + _txtBillingLastName.text = customerAddress.lastName; + _txtBillingAddressLine.text = customerAddress.addressLine; + _txtBillingCity.text = customerAddress.city; + _txtBillingPostalCode.text = customerAddress.postalCode; + _txtBillingEmailAddress.text = customerAddress.emailAddress; + _strBillingState = customerAddress.state; + _strBillingCountry = customerAddress.country; + } + + CustomerAddress sfCustomerShippingAddress = + await CheckoutSession.getInstance.getShippingAddress(); + if (sfCustomerShippingAddress != null) { + CustomerAddress customerAddress = sfCustomerShippingAddress; _txtShippingFirstName.text = customerAddress.firstName; _txtShippingLastName.text = customerAddress.lastName; _txtShippingAddressLine.text = customerAddress.addressLine; _txtShippingCity.text = customerAddress.city; _txtShippingPostalCode.text = customerAddress.postalCode; _txtShippingEmailAddress.text = customerAddress.emailAddress; - _strBillingState = customerAddress.state; - _strBillingCountry = customerAddress.country; + _strShippingCountry = customerAddress.country; + _strShippingState = customerAddress.state; } } - _showSelectCountryModal() { + _showSelectCountryModal(String type) { wsModalBottom( context, title: trans(context, "Select a country"), @@ -104,12 +389,24 @@ class _CheckoutDetailsPageState extends State { splashColor: Colors.grey, highlightColor: Colors.black12, onTap: () => setState(() { - _strBillingCountry = strName["name"]; - Navigator.of(context).pop(); - if (strName["code"] == "US") { - _showSelectStateModal(); - } else { - _strBillingState = ""; + if (type == "shipping") { + _strShippingCountry = strName["name"]; + activeTab = tabShippingDetails(); + Navigator.of(context).pop(); + if (strName["code"] == "US") { + _showSelectStateModal(type); + } else { + _strShippingState = ""; + } + } else if (type == "billing") { + _strBillingCountry = strName["name"]; + Navigator.of(context).pop(); + activeTab = tabBillingDetails(); + if (strName["code"] == "US") { + _showSelectStateModal(type); + } else { + _strBillingState = ""; + } } }), ); @@ -122,7 +419,7 @@ class _CheckoutDetailsPageState extends State { ); } - _showSelectStateModal() { + _showSelectStateModal(String type) { wsModalBottom( context, title: trans(context, "Select a state"), @@ -142,8 +439,15 @@ class _CheckoutDetailsPageState extends State { splashColor: Colors.grey, highlightColor: Colors.black12, onTap: () => setState(() { - _strBillingState = strName["name"]; - Navigator.of(context).pop(); + if (type == "shipping") { + _strShippingState = strName["name"]; + Navigator.of(context).pop(); + activeTab = tabShippingDetails(); + } else if (type == "billing") { + _strBillingState = strName["name"]; + Navigator.of(context).pop(); + activeTab = tabBillingDetails(); + } }), ); }, @@ -183,109 +487,86 @@ class _CheckoutDetailsPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - Flexible( - child: Row( - children: [ - Flexible( - child: wsTextEditingRow( - context, - heading: trans(context, "First Name"), - controller: _txtShippingFirstName, - shouldAutoFocus: true, - ), - ), - Flexible( - child: wsTextEditingRow( - context, - heading: trans(context, "Last Name"), - controller: _txtShippingLastName, - ), - ), - ], - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - ), - ), - Flexible( - child: Row( - children: [ - Flexible( - child: wsTextEditingRow( - context, - heading: trans(context, "Address Line"), - controller: _txtShippingAddressLine, - ), - ), - Flexible( - child: wsTextEditingRow( - context, - heading: trans(context, "City"), - controller: _txtShippingCity, - ), - ), - ], - ), - ), - Flexible( - child: Row( - children: [ - Flexible( - child: wsTextEditingRow( - context, - heading: trans(context, "Postal code"), - controller: _txtShippingPostalCode, - ), - ), - Flexible( - child: wsTextEditingRow(context, - heading: trans(context, "Email address"), - keyboardType: TextInputType.emailAddress, - controller: _txtShippingEmailAddress), - ), - ], - ), - ), - Flexible( - child: Row( - children: [ - (_strBillingCountry == "United States" - ? Flexible( - child: Padding( - child: wsSecondaryButton( - context, - title: (_strBillingState != null && - _strBillingState.isNotEmpty - ? trans(context, "Selected") + - "\n" + - _strBillingState - : trans(context, "Select state")), - action: _showSelectStateModal, + _valDifferentShippingAddress + ? Padding( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + Flexible( + child: InkWell( + child: Container( + width: double.infinity, + child: Text( + trans(context, "Billing Details"), + style: Theme.of(context) + .textTheme + .subtitle1 + .copyWith( + color: activeTabIndex == 0 + ? Colors.white + : Colors.black), + textAlign: TextAlign.center, + ), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(4), + color: activeTabIndex == 0 + ? Colors.black + : Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 4, vertical: 4), ), - padding: EdgeInsets.all(8), + onTap: () { + setState(() { + activeTabIndex = 0; + activeTab = tabBillingDetails(); + }); + }, + ), + ), + Flexible( + child: InkWell( + child: Container( + width: double.infinity, + child: Text( + trans(context, "Shipping Address"), + style: Theme.of(context) + .textTheme + .subtitle1 + .copyWith( + color: activeTabIndex == 1 + ? Colors.white + : Colors.black), + textAlign: TextAlign.center, + ), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(4), + color: activeTabIndex == 1 + ? Colors.black + : Colors.white, + ), + padding: EdgeInsets.symmetric( + horizontal: 4, vertical: 2), + ), + onTap: () { + setState(() { + activeTabIndex = 1; + activeTab = tabShippingDetails(); + }); + }, ), ) - : null), - Flexible( - child: Padding( - child: wsSecondaryButton( - context, - title: (_strBillingCountry != null && - _strBillingCountry.isNotEmpty - ? trans(context, "Selected") + - "\n" + - _strBillingCountry - : trans(context, "Select country")), - action: _showSelectCountryModal, - ), - padding: EdgeInsets.all(8), + ].where((e) => e != null).toList(), ), + padding: EdgeInsets.symmetric(vertical: 8), ) - ].where((element) => element != null).toList(), - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - ), - ) - ], + : null, + activeTab ?? tabBillingDetails(), + ].where((e) => e != null).toList(), ), decoration: BoxDecoration( color: Colors.white, @@ -294,13 +575,28 @@ class _CheckoutDetailsPageState extends State { ), padding: EdgeInsets.all(8), ), - height: (constraints.maxHeight - constraints.minHeight) * 0.6, + height: + (constraints.maxHeight - constraints.minHeight) * 0.62, ), Column( children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + trans(context, "Ship to a different address?"), + style: Theme.of(context).primaryTextTheme.bodyText2, + ), + Checkbox( + value: _valDifferentShippingAddress, + onChanged: _onChangeShipping, + ) + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( trans(context, "Remember my details"), @@ -317,37 +613,8 @@ class _CheckoutDetailsPageState extends State { ], ), wsPrimaryButton(context, - title: trans(context, "USE SHIPPING ADDRESS"), - action: () { - CustomerAddress customerAddress = new CustomerAddress(); - customerAddress.firstName = _txtShippingFirstName.text; - customerAddress.lastName = _txtShippingLastName.text; - customerAddress.addressLine = - _txtShippingAddressLine.text; - customerAddress.city = _txtShippingCity.text; - customerAddress.postalCode = _txtShippingPostalCode.text; - customerAddress.state = _strBillingState; - customerAddress.country = _strBillingCountry; - customerAddress.emailAddress = - _txtShippingEmailAddress.text; - - CheckoutSession.getInstance.billingDetails - .shippingAddress = customerAddress; - CheckoutSession.getInstance.billingDetails - .billingAddress = customerAddress; - - CheckoutSession.getInstance.billingDetails - .rememberDetails = valRememberDetails; - - if (valRememberDetails == true) { - CheckoutSession.getInstance.saveBillingAddress(); - } else { - CheckoutSession.getInstance.clearBillingAddress(); - } - - CheckoutSession.getInstance.shippingType = null; - Navigator.pop(context); - }), + title: trans(context, "USE DETAILS"), + action: () => _useDetailsTapped()), ], ), ], @@ -357,4 +624,98 @@ class _CheckoutDetailsPageState extends State { ), ); } + + _useDetailsTapped() { + CustomerAddress customerBillingAddress = new CustomerAddress(); + customerBillingAddress.firstName = _txtBillingFirstName.text; + customerBillingAddress.lastName = _txtBillingLastName.text; + customerBillingAddress.addressLine = _txtBillingAddressLine.text; + customerBillingAddress.city = _txtBillingCity.text; + customerBillingAddress.postalCode = _txtBillingPostalCode.text; + customerBillingAddress.state = _strBillingState; + customerBillingAddress.country = _strBillingCountry; + customerBillingAddress.emailAddress = _txtBillingEmailAddress.text; + + if (!_valDifferentShippingAddress) { + CheckoutSession.getInstance.billingDetails.shippingAddress = + customerBillingAddress; + + CheckoutSession.getInstance.billingDetails.billingAddress = + customerBillingAddress; + + if (valRememberDetails == true) { + CheckoutSession.getInstance.saveBillingAddress(); + } + } else { + CustomerAddress customerShippingAddress = new CustomerAddress(); + customerShippingAddress.firstName = _txtShippingFirstName.text; + customerShippingAddress.lastName = _txtShippingLastName.text; + customerShippingAddress.addressLine = _txtShippingAddressLine.text; + customerShippingAddress.city = _txtShippingCity.text; + customerShippingAddress.postalCode = _txtShippingPostalCode.text; + customerShippingAddress.state = _strShippingState; + customerShippingAddress.country = _strShippingCountry; + customerShippingAddress.emailAddress = _txtShippingEmailAddress.text; + + if (customerShippingAddress.hasMissingFields()) { + showEdgeAlertWith(context, + title: trans(context, "Oops"), + desc: trans( + context, + trans(context, + "Invalid shipping address, please check your shipping details"), + ), + style: EdgeAlertStyle.WARNING); + return; + } + + CheckoutSession.getInstance.billingDetails.billingAddress = + customerBillingAddress; + + CheckoutSession.getInstance.billingDetails.shippingAddress = + customerShippingAddress; + + if (valRememberDetails == true) { + CheckoutSession.getInstance.saveBillingAddress(); + CheckoutSession.getInstance.saveShippingAddress(); + } + } + + CheckoutSession.getInstance.billingDetails.rememberDetails = + valRememberDetails; + + if (valRememberDetails != true) { + CheckoutSession.getInstance.clearBillingAddress(); + CheckoutSession.getInstance.clearShippingAddress(); + } + + CheckoutSession.getInstance.shipToDifferentAddress = + _valDifferentShippingAddress; + + CheckoutSession.getInstance.shippingType = null; + Navigator.pop(context); + } + + _onChangeShipping(bool value) async { + _valDifferentShippingAddress = value; + activeTabIndex = 1; + if (value == true) { + activeTab = tabShippingDetails(); + } else { + activeTab = tabBillingDetails(); + } + CustomerAddress sfCustomerShippingAddress = + await CheckoutSession.getInstance.getShippingAddress(); + if (sfCustomerShippingAddress == null) { + _txtShippingFirstName.text = ""; + _txtShippingLastName.text = ""; + _txtShippingAddressLine.text = ""; + _txtShippingCity.text = ""; + _txtShippingPostalCode.text = ""; + _txtShippingEmailAddress.text = ""; + _strShippingState = ""; + _strShippingCountry = ""; + } + setState(() {}); + } } diff --git a/LabelStoreMax/lib/providers/cash_on_delivery.dart b/LabelStoreMax/lib/providers/cash_on_delivery.dart index 33a9e54..0d6ecd5 100644 --- a/LabelStoreMax/lib/providers/cash_on_delivery.dart +++ b/LabelStoreMax/lib/providers/cash_on_delivery.dart @@ -15,6 +15,7 @@ import 'package:flutter/widgets.dart'; import 'package:label_storemax/helpers/data/order_wc.dart'; import 'package:label_storemax/helpers/tools.dart'; import 'package:label_storemax/models/cart.dart'; +import 'package:label_storemax/models/checkout_session.dart'; import 'package:label_storemax/pages/checkout_confirmation.dart'; import 'package:woosignal/models/payload/order_wc.dart'; import 'package:woosignal/models/response/order.dart'; @@ -29,6 +30,7 @@ cashOnDeliveryPay(context, if (order != null) { Cart.getInstance.clear(); + CheckoutSession.getInstance.clear(); Navigator.pushNamed(context, "/checkout-status", arguments: order); } else { showEdgeAlertWith( diff --git a/LabelStoreMax/lib/providers/razor_pay.dart b/LabelStoreMax/lib/providers/razor_pay.dart new file mode 100644 index 0000000..eda7b0d --- /dev/null +++ b/LabelStoreMax/lib/providers/razor_pay.dart @@ -0,0 +1,94 @@ +// +// LabelCore +// Label StoreMAX +// +// Created by Anthony Gordon. +// 2020, WooSignal Ltd. All rights reserved. +// + +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// + +import 'package:flutter/widgets.dart'; +import 'package:label_storemax/helpers/data/order_wc.dart'; +import 'package:label_storemax/helpers/tools.dart'; +import 'package:label_storemax/labelconfig.dart'; +import 'package:label_storemax/models/cart.dart'; +import 'package:label_storemax/models/checkout_session.dart'; +import 'package:label_storemax/pages/checkout_confirmation.dart'; +import 'package:razorpay_flutter/razorpay_flutter.dart'; +import 'package:woosignal/models/response/tax_rate.dart'; +import 'package:woosignal/models/payload/order_wc.dart'; +import 'package:woosignal/models/response/order.dart'; + +razorPay(context, + {@required CheckoutConfirmationPageState state, TaxRate taxRate}) async { + Razorpay _razorpay = Razorpay(); + + _razorpay.on(Razorpay.EVENT_PAYMENT_SUCCESS, + (PaymentSuccessResponse response) async { + OrderWC orderWC = await buildOrderWC(taxRate: taxRate); + + Order order = await appWooSignal((api) => api.createOrder(orderWC)); + + if (order != null) { + Cart.getInstance.clear(); + CheckoutSession.getInstance.clear(); + _razorpay.clear(); + Navigator.pushNamed(context, "/checkout-status", arguments: order); + } else { + showEdgeAlertWith(context, + title: trans(context, "Error"), + desc: trans( + context, + trans(context, "Something went wrong, please contact our store"), + ), + style: EdgeAlertStyle.WARNING); + _razorpay.clear(); + state.reloadState(showLoader: false); + } + }); + + _razorpay.on(Razorpay.EVENT_PAYMENT_ERROR, (PaymentFailureResponse response) { + showEdgeAlertWith(context, + title: trans(context, "Error"), + desc: response.message, + style: EdgeAlertStyle.WARNING); + _razorpay.clear(); + state.reloadState(showLoader: false); + }); + + _razorpay.on(Razorpay.EVENT_EXTERNAL_WALLET, + (ExternalWalletResponse response) { + showEdgeAlertWith(context, + title: trans(context, "Error"), + desc: trans(context, "Not supported, try a card payment"), + style: EdgeAlertStyle.WARNING); + _razorpay.clear(); + state.reloadState(showLoader: false); + }); + + // CHECKOUT HELPER + await checkout(taxRate, (total, billingDetails, cart) async { + var options = { + 'key': app_razor_id, + 'amount': (parseWcPrice(total) * 100).toInt(), + 'name': app_name, + 'description': await cart.cartShortDesc(), + 'prefill': { + "name": [ + billingDetails.billingAddress.firstName, + billingDetails.billingAddress.lastName + ].where((t) => t != null || t != "").toList().join(" "), + "method": "card", + 'email': billingDetails.billingAddress.emailAddress + } + }; + + state.reloadState(showLoader: true); + + _razorpay.open(options); + }); +} diff --git a/LabelStoreMax/lib/providers/stripe_pay.dart b/LabelStoreMax/lib/providers/stripe_pay.dart index 8640156..c1a8f6d 100644 --- a/LabelStoreMax/lib/providers/stripe_pay.dart +++ b/LabelStoreMax/lib/providers/stripe_pay.dart @@ -17,6 +17,7 @@ import 'package:label_storemax/helpers/data/order_wc.dart'; import 'package:label_storemax/helpers/tools.dart'; import 'package:label_storemax/labelconfig.dart'; import 'package:label_storemax/models/cart.dart'; +import 'package:label_storemax/models/checkout_session.dart'; import 'package:label_storemax/pages/checkout_confirmation.dart'; import 'package:woosignal/models/payload/order_wc.dart'; import 'package:woosignal/models/response/order.dart'; @@ -78,6 +79,7 @@ stripePay(context, if (order != null) { Cart.getInstance.clear(); + CheckoutSession.getInstance.clear(); Navigator.pushNamed(context, "/checkout-status", arguments: order); } else { showEdgeAlertWith( diff --git a/LabelStoreMax/pubspec.lock b/LabelStoreMax/pubspec.lock index 0ad3c0b..6d202b8 100644 --- a/LabelStoreMax/pubspec.lock +++ b/LabelStoreMax/pubspec.lock @@ -113,6 +113,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.0.1" + eventify: + dependency: transitive + description: + name: eventify + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" file: dependency: transitive description: @@ -357,6 +364,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.3" + razorpay_flutter: + dependency: "direct main" + description: + name: razorpay_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" rxdart: dependency: transitive description: diff --git a/LabelStoreMax/pubspec.yaml b/LabelStoreMax/pubspec.yaml index 3d47e52..b72cee3 100644 --- a/LabelStoreMax/pubspec.yaml +++ b/LabelStoreMax/pubspec.yaml @@ -1,5 +1,5 @@ # Label StoreMax -# Version 2.0.4 +# Version 2.0.5 #authors: - "Anthony Gordon" #documentation: https://woosignal.com/docs/app/ios/label-storemax #homepage: https://woosignal.com/ @@ -26,6 +26,7 @@ environment: dependencies: woosignal: ^1.0.8 woosignal_stripe: ^0.0.4 + razorpay_flutter: ^1.2.0 wp_json_api: ^0.1.2 shared_preferences: ^0.5.6+3 cached_network_image: ^2.0.0 @@ -77,6 +78,7 @@ flutter: - assets/images/shipping_icon.png - assets/images/dark_powered_by_stripe.png - assets/images/cash_on_delivery.jpeg + - assets/images/razorpay.png - lang/en.json fonts: