diff --git a/assets/images/green_coupon.png b/assets/images/green_coupon.png new file mode 100644 index 0000000..0104534 Binary files /dev/null and b/assets/images/green_coupon.png differ diff --git a/assets/images/orange_coupon.png b/assets/images/orange_coupon.png new file mode 100644 index 0000000..59970ca Binary files /dev/null and b/assets/images/orange_coupon.png differ diff --git a/assets/images/red_coupon.png b/assets/images/red_coupon.png new file mode 100644 index 0000000..d085818 Binary files /dev/null and b/assets/images/red_coupon.png differ diff --git a/lib/buy_a_pass/view/buy_pass_view.dart b/lib/buy_a_pass/view/buy_pass_view.dart index d6aa0a9..54cbc8d 100644 --- a/lib/buy_a_pass/view/buy_pass_view.dart +++ b/lib/buy_a_pass/view/buy_pass_view.dart @@ -35,7 +35,12 @@ class BuyPassView extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: 20.0.w), child: Row( children: [ - Icon(Icons.arrow_back), + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Icon(Icons.arrow_back), + ), SizedBox(width: 8.w), CustomText(text: "Buy a Pass", size: 12.sp), ], diff --git a/lib/checkout/view/checkout_view.dart b/lib/checkout/view/checkout_view.dart index fc18b20..6f5bec8 100644 --- a/lib/checkout/view/checkout_view.dart +++ b/lib/checkout/view/checkout_view.dart @@ -1,3 +1,4 @@ +import 'package:citycards_customer/checkout/widget/all_coupons_bottomsheet.dart'; import 'package:citycards_customer/checkout/widget/login_email_bottomsheet.dart'; import 'package:citycards_customer/common_packages/app_bar.dart'; import 'package:citycards_customer/common_packages/custom_filled_button.dart'; @@ -26,7 +27,12 @@ class CheckoutView extends StatelessWidget { ), Row( children: [ - Icon(Icons.arrow_back), + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Icon(Icons.arrow_back), + ), SizedBox(width: 8.w), CustomText(text: "Checkout", size: 12.sp), ], @@ -217,10 +223,25 @@ class CheckoutView extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - CustomText( - text: "View all coupons", - color: Color(0xFFF95F62), - size: 12, + GestureDetector( + onTap: (){ + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + builder: (_) => AllCouponsBottomsheet(), + ); + }, + child: CustomText( + text: "View all coupons", + color: Color(0xFFF95F62), + size: 12, + ), ), SizedBox(width: 3.w), Icon(Icons.arrow_right, color: Color(0xFFF95F62)), @@ -230,23 +251,24 @@ class CheckoutView extends StatelessWidget { ), const Spacer(), - Container( - padding: EdgeInsets.symmetric( - horizontal: 12.w, - vertical: 10.h, + Container( + padding: EdgeInsets.symmetric( + horizontal: 20.w, + vertical: 10.h, + ), + decoration: BoxDecoration( + border: Border.all(color: Color(0xFFF95F62)), + borderRadius: BorderRadius.circular(8.r), + ), + child: CustomText( + text: "Apply", + color: Color(0xFFF95F62), + size: 14.sp, + ), ), - decoration: BoxDecoration( - border: Border.all(color: Color(0xFFF95F62)), - borderRadius: BorderRadius.circular(8.r), - ), - child: CustomText( - text: "Apply", - color: Color(0xFFF95F62), - size: 14.sp, - ), - ), + ], - ), + ) ), SizedBox(height: 15.h), @@ -327,7 +349,6 @@ class CheckoutView extends StatelessWidget { ), builder: (_) => const LoginEmailBottomsheet(), ); - }, label: "Login to Checkout", ), diff --git a/lib/checkout/widget/all_coupons_bottomsheet.dart b/lib/checkout/widget/all_coupons_bottomsheet.dart new file mode 100644 index 0000000..c9ca2e2 --- /dev/null +++ b/lib/checkout/widget/all_coupons_bottomsheet.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:citycards_customer/common_packages/custom_text.dart'; + +class AllCouponsBottomsheet extends StatelessWidget { + AllCouponsBottomsheet({super.key}); + + final List coupons = [ + "assets/images/red_coupon.png", + "assets/images/green_coupon.png", + "assets/images/orange_coupon.png", + "assets/images/orange_coupon.png", + ]; + + @override + Widget build(BuildContext context) { + return AnimatedPadding( + duration: const Duration(milliseconds: 250), + curve: Curves.easeOut, + padding: EdgeInsets.only( + top: 24.h, + left: 20.w, + right: 20.w, + bottom: MediaQuery.of(context).viewInsets.bottom, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + /// --- Header --- + Container( + height: 4.h, + width: 40.w, + decoration: BoxDecoration( + color: Color(0xFF2D3134), + borderRadius: BorderRadius.circular(4.r), + ), + ), + SizedBox(height: 12.h), + CustomText(text: "All Coupons", size: 18.sp, weight: FontWeight.w500), + SizedBox(height: 22.h), + + /// --- Coupon list --- + Flexible( + child: ListView.separated( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + itemCount: coupons.length, + separatorBuilder: (_, __) => SizedBox(height: 12.h), + itemBuilder: (context, index) { + return Container( + alignment: Alignment.center, + padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 8.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.r), + border: Border.all( + color: const Color(0xFFF95F62).withOpacity(0.12), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + width: 183.9.w, + height: 72.82.h, + coupons[index], + fit: BoxFit.cover, + ), + Container( + width: 110.w, + height: 44.h, + decoration: BoxDecoration( + color: Color(0xFFF95F62), + borderRadius: BorderRadius.circular(12.r), + ), + child: Center( + child: CustomText( + text: "Apply Coupon", + size: 12.sp, + color: Colors.white, + ), + ), + ), + ], + ), + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart index 5c4693f..b8406f3 100644 --- a/lib/core/app_router.dart +++ b/lib/core/app_router.dart @@ -4,6 +4,7 @@ import 'package:citycards_customer/buy_a_pass/view/buy_pass_view.dart'; import 'package:citycards_customer/checkout/view/checkout_view.dart'; import 'package:citycards_customer/common_bloc/language_selection_bloc.dart'; import 'package:citycards_customer/contact_us/contact_us_view.dart'; +import 'package:citycards_customer/create_account/create_account_view.dart'; import 'package:citycards_customer/edit_profile/edit_profile_view.dart'; import 'package:citycards_customer/esim_offer/esim_offer_view.dart'; import 'package:citycards_customer/faq/faq_view.dart'; @@ -139,6 +140,11 @@ class AppRouter { child: SearchOffersWithListing(), ); }); + + case RouteConstants.createAcct: + return MaterialPageRoute(builder: (_){ + return CreateAccountView(); + }); default: return MaterialPageRoute( builder: (_) => diff --git a/lib/core/route_constants.dart b/lib/core/route_constants.dart index 7ddc72a..1306057 100644 --- a/lib/core/route_constants.dart +++ b/lib/core/route_constants.dart @@ -35,7 +35,7 @@ class RouteConstants { static const String buyPass ='/buyPass'; static const String checkout ='/checkout'; static const String searchOffer = '/searchOffer'; - + static const String createAcct = '/createAcct'; } diff --git a/lib/create_account/create_account_view.dart b/lib/create_account/create_account_view.dart new file mode 100644 index 0000000..f45320e --- /dev/null +++ b/lib/create_account/create_account_view.dart @@ -0,0 +1,122 @@ +import 'package:citycards_customer/common_packages/app_bar.dart'; +import 'package:citycards_customer/common_packages/custom_filled_button.dart'; +import 'package:citycards_customer/common_packages/custom_text.dart'; +import 'package:citycards_customer/common_packages/custom_textfield.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class CreateAccountView extends StatelessWidget { + CreateAccountView({super.key}); + + final TextEditingController firstNameController = TextEditingController(); + final TextEditingController lastNameController = TextEditingController(); + final TextEditingController emailController = TextEditingController(); + final TextEditingController phoneController = TextEditingController(); + final TextEditingController addressController = TextEditingController(); + + @override + Widget build(BuildContext context) { + + + return Scaffold( + backgroundColor: Colors.white, + body: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20.w), + child: Column( + children: [ + CommonAppBar( + isWhiteLogo: false, + isProfilePage: false, + showCart: false, + ), + Row( + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: Icon(Icons.arrow_back), + ), + SizedBox(width: 8.w), + CustomText(text: "Create your account", size: 12.sp), + ], + ), + SizedBox(height: 26.h,), + + Align( + alignment: Alignment.centerLeft, + child: CustomText( + text: "Personal Information", + size: 18.sp, + weight: FontWeight.w500, + ), + ), + SizedBox(height: 12.h), + + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: CustomTextField( + label: "First Name", + hint: "Enter your first name", + controller: firstNameController, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: CustomTextField( + label: "Last Name", + hint: "Enter your last name", + controller: lastNameController, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: CustomTextField( + label: "Email", + hint: "Enter your email address", + controller: emailController, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w), + child: CustomTextField( + label: "Phone Number", + hint: "Enter your phone number", + controller: phoneController, + ), + ), + + SizedBox(height: 2.h), + + // Location Details + Align( + alignment: Alignment.centerLeft, + child: CustomText( + text: "Location Details", + size: 18.sp, + weight: FontWeight.w500, + ), + ), + SizedBox(height: 16.h), + + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0.w), + child: CustomTextField( + label: "Address 1", + hint: "Enter address manually or tap to search", + controller: addressController, + ), + ), + + SizedBox(height: 36.h), + CustomFilledButton( + width: double.infinity, + onTap: (){}, label: "Create Account") + ], + ), + ), + ), + ); + } +}