From a8a3a618ebfc42b1dfd449deff56fa52e1e834c9 Mon Sep 17 00:00:00 2001 From: Vinayakkadge04 Date: Wed, 29 Oct 2025 14:49:41 +0530 Subject: [PATCH] Completed offer pass view --- lib/core/app_router.dart | 6 + lib/core/route_constants.dart | 1 + lib/main.dart | 2 +- .../offer_pass_detail_view.dart | 252 ++++++++++++++++++ 4 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 lib/offer_pass_detail/offer_pass_detail_view.dart diff --git a/lib/core/app_router.dart b/lib/core/app_router.dart index 47a8522..8b42458 100644 --- a/lib/core/app_router.dart +++ b/lib/core/app_router.dart @@ -16,6 +16,7 @@ import 'package:citycards_customer/itinerary_creation/views/itinerary_creation_s import 'package:citycards_customer/itinerary_creation/views/itinerary_creation_view.dart'; import 'package:citycards_customer/itinerary_creation/views/magic_itinerary_empty_view.dart'; import 'package:citycards_customer/itinerary_creation/views/magic_itinerary_filled_view.dart'; +import 'package:citycards_customer/offer_pass_detail/offer_pass_detail_view.dart'; import 'package:citycards_customer/privacy/privacy_view.dart'; import 'package:citycards_customer/search_offers/bloc/search_offers_listing_bloc.dart'; import 'package:citycards_customer/search_offers/view/search_offers_with_listing.dart'; @@ -191,6 +192,11 @@ class AppRouter { return MaterialPageRoute(builder: (_){ return MagicItineraryFilledView(); }); + + case RouteConstants.offerPassDetail: + return MaterialPageRoute(builder: (_){ + return OfferPassDetailView(); + }); default: return MaterialPageRoute( builder: (_) => diff --git a/lib/core/route_constants.dart b/lib/core/route_constants.dart index 65db28c..e554562 100644 --- a/lib/core/route_constants.dart +++ b/lib/core/route_constants.dart @@ -39,6 +39,7 @@ class RouteConstants { static const String searchOffer = '/searchOffer'; static const String createAcct = '/createAcct'; static const String addDetails = '/addDetails'; + static const String offerPassDetail = "/offerPassDetail"; /************************** My card page ***************************************/ diff --git a/lib/main.dart b/lib/main.dart index 1dffb05..40954f7 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -29,7 +29,7 @@ class MyApp extends StatelessWidget { builder: (context, child) { return MaterialApp( onGenerateRoute: _appRouter.onGenerateRoute, - initialRoute: RouteConstants.cartPage, + initialRoute: RouteConstants.offerPassDetail, debugShowCheckedModeBanner: false, title: 'City Cards', theme: ThemeData( diff --git a/lib/offer_pass_detail/offer_pass_detail_view.dart b/lib/offer_pass_detail/offer_pass_detail_view.dart new file mode 100644 index 0000000..a963299 --- /dev/null +++ b/lib/offer_pass_detail/offer_pass_detail_view.dart @@ -0,0 +1,252 @@ +import 'package:citycards_customer/attraction_details/share_bottomsheet.dart'; +import 'package:citycards_customer/common_packages/app_bar.dart'; +import 'package:citycards_customer/common_packages/custom_bullet_points.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; + +class OfferPassDetailView extends StatelessWidget { + const OfferPassDetailView({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: SafeArea( + child: SingleChildScrollView( + child: Column( + children: [ + Stack( + children: [ + Image.asset( + 'assets/images/koh_rong_samloem_banner.png', + height: 377.h, + width: double.infinity, + fit: BoxFit.cover, + ), + Positioned( + top: 0, + left: 0, + right: 0, + child: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.w, + vertical: 10.h, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CommonAppBar( + isWhiteLogo: true, + isProfilePage: false, + ), + + SizedBox(height: 10.h), + Divider( + color: Colors.white.withOpacity(0.6), + height: 1.h, + ), + SizedBox(height: 8.h), + + Row( + children: [ + GestureDetector( + onTap: () => Navigator.pop(context), + child: Icon( + Icons.arrow_back, + size: 24.sp, + color: Colors.white, + ), + ), + SizedBox(width: 8.w), + Text( + "Aster Hotels", + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + color: Colors.white, + ), + ), + ], + ), + ], + ), + ), + ), + ), + + Positioned( + bottom: 31.h, + left: 12.w, + child: Text( + "Aster \nHotels", + style: TextStyle( + color: Colors.white, + fontSize: 48.sp, + fontWeight: FontWeight.w500, + height: 1.2, + ), + ), + ), + + Positioned( + bottom: 31.h, + right: 17.w, + child: GestureDetector( + onTap: () { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => const ShareBottomSheet(), + ); + }, + child: Container( + height: 36.h, + width: 36.w, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20.r), + ), + child: Center( + child: Icon( + Icons.share_sharp, + color: Colors.black, + size: 18.sp, + ), + ), + ), + ), + ), + ], + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.0.w, + vertical: 30.5.h, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "About Aster Hotels", + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w600, + ), + ), + SizedBox(height: 8.h), + Text( + "20% Off on dining and drinks on purchase upto \$500 T&Cs* apply", + style: TextStyle( + fontSize: 14.sp, + color: Colors.black, + fontWeight: FontWeight.w400, + ), + ), + SizedBox(height: 10.h), + Text( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + "Convallis condimentum morbi non egestas enim amet sagittis. " + "Proin sed aliquet rhoncus ut pellentesque ullamcorper sit eget ac. " + "Sit nisi, cras amet varius eget egestas pellentesque. Cursus gravida euismod non...", + style: TextStyle( + fontSize: 14.sp, + height: 1.4, + color: const Color(0xFF656565), + ), + ), + SizedBox(height: 40.h), + + // How to make booking + Text( + "How to make a booking?", + style: TextStyle( + fontSize: 18.sp, + fontWeight: FontWeight.w400, + ), + ), + SizedBox(height: 16.h), + + CustomBulletPoints( + text: + "Check the expiration date of your coupon to ensure it's still valid.", + textColor: Color(0xFF656565), + ), + CustomBulletPoints( + text: + "Visit the store or website where the coupon can be redeemed.", + textColor: Color(0xFF656565), + ), + CustomBulletPoints( + text: + "If shopping online, add items to your cart and proceed to checkout.", + textColor: Color(0xFF656565), + ), + CustomBulletPoints( + text: + "Look for a field labeled 'Coupon Code' or 'Promo Code' during checkout.", + textColor: Color(0xFF656565), + ), + CustomBulletPoints( + text: + "Enter your coupon code exactly as it appears, including any special characters.", + textColor: Color(0xFF656565), + ), + SizedBox(height: 24.h), + + // Coupon Box + Container( + width: double.infinity, + height: 48.h, + padding: EdgeInsets.symmetric( + vertical: 12.h, + horizontal: 24.w, + ), + decoration: BoxDecoration( + color: const Color(0xFFFEE7E7), + borderRadius: BorderRadius.circular(10.r), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "AFJIJFJ500", + style: TextStyle( + fontSize: 14.sp, + fontWeight: FontWeight.w600, + letterSpacing: 0.5, + ), + ), + GestureDetector( + onTap: () { + Clipboard.setData( + const ClipboardData(text: "AFJIJFJ500"), + ); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text("Coupon code copied!"), + duration: Duration(seconds: 1), + ), + ); + }, + child: Icon( + Icons.copy_outlined, + color: Color(0xFF464646), + size: 20.sp, + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +}