diff --git a/assets/icons/tick.svg b/assets/icons/tick.svg new file mode 100644 index 0000000..10807d4 --- /dev/null +++ b/assets/icons/tick.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/core/constants/assets.dart b/lib/core/constants/assets.dart index dcc83a8..148a221 100644 --- a/lib/core/constants/assets.dart +++ b/lib/core/constants/assets.dart @@ -22,6 +22,7 @@ class AssetsManager { static const arrowCircleRight = 'assets/icons/arrow-circle-right.svg'; static const arrowLeftSmall = 'assets/icons/arrow-left-small.svg'; static const arrowRightSmall = 'assets/icons/arrow-right-small.svg'; + static const tick = 'assets/icons/tick.svg'; //home page static const arrows = 'assets/icons/arrows.svg'; diff --git a/lib/core/utils/size_config.dart b/lib/core/utils/size_config.dart index cda31ff..81fef8e 100644 --- a/lib/core/utils/size_config.dart +++ b/lib/core/utils/size_config.dart @@ -34,6 +34,7 @@ extension SizeDoubleExt on double { final double screenWidth = SizeConfig.screenWidth; final double res = (this / 412.0) * screenWidth; if (displaySize == DisplaySize.extraSmall + // || // displaySize == DisplaySize.small ) { return res; diff --git a/lib/data/services/home_service.dart b/lib/data/services/home_service.dart index 5a81dc3..b579a0c 100644 --- a/lib/data/services/home_service.dart +++ b/lib/data/services/home_service.dart @@ -25,9 +25,6 @@ class HomeService { await Future.delayed(Duration(seconds: 2)); appLogger.info('get home success'); // TODO: will change when api is ready - appLogger.debug( - HomeResponseModel.fromJson(jsonDecode(homeMockData)['data']), - ); return Result.ok( HomeResponseModel.fromJson(jsonDecode(homeMockData)['data']), ); diff --git a/lib/views/tenders/tenders_screen.dart b/lib/views/tenders/tenders_screen.dart index 53df727..7a60de9 100644 --- a/lib/views/tenders/tenders_screen.dart +++ b/lib/views/tenders/tenders_screen.dart @@ -6,33 +6,9 @@ import '../../core/theme/colors.dart'; import '../../core/utils/size_config.dart'; import 'widgets/main_tenders_slider.dart'; -class TendersScreen extends StatefulWidget { +class TendersScreen extends StatelessWidget { const TendersScreen({super.key}); - @override - State createState() => _TendersScreenState(); -} - -class _TendersScreenState extends State - with SingleTickerProviderStateMixin { - late final TabController controller; - - @override - void initState() { - super.initState(); - controller = TabController(length: 2, vsync: this); - // Add listener to rebuild when tab changes - controller.addListener(() { - setState(() {}); - }); - } - - @override - void dispose() { - controller.dispose(); - super.dispose(); - } - @override Widget build(BuildContext context) { return SafeArea( @@ -42,12 +18,7 @@ class _TendersScreenState extends State body: SingleChildScrollView( child: Padding( padding: EdgeInsets.symmetric(vertical: 24.0.h()), - child: Column( - children: [ - // MainTabBar(controller: controller), - MainTendersSlider(), - ], - ), + child: MainTendersSlider(), ), ), ), diff --git a/lib/views/tenders/widgets/main_tenders_slider.dart b/lib/views/tenders/widgets/main_tenders_slider.dart index 7e7c408..2ee327b 100644 --- a/lib/views/tenders/widgets/main_tenders_slider.dart +++ b/lib/views/tenders/widgets/main_tenders_slider.dart @@ -21,6 +21,8 @@ class _MainTendersSliderState extends State { List likedTenders = []; List dislikedTenders = []; int currentPage = 1; + List rejectedTenders = []; + List submittedTenders = []; void _onDislike(Tender tender) { if (likedTenders.contains(tender)) { @@ -74,6 +76,25 @@ class _MainTendersSliderState extends State { }); } + void _onReject(Tender tender) { + if (rejectedTenders.contains(tender)) { + rejectedTenders.remove(tender); + } else { + rejectedTenders.add(tender); + } + setState(() {}); + } + + void _onSubmit(Tender tender) { + if (submittedTenders.contains(tender)) { + submittedTenders.remove(tender); + } else { + submittedTenders.add(tender); + } + + setState(() {}); + } + @override void dispose() { pageController.dispose(); @@ -86,7 +107,7 @@ class _MainTendersSliderState extends State { children: [ SizedBox( width: double.infinity, - height: 694.0.h(), + height: 717.0.h(), child: PageView.builder( controller: pageController, scrollDirection: Axis.horizontal, @@ -112,6 +133,10 @@ class _MainTendersSliderState extends State { onDislike: () => _onDislike(tender), onLike: () => _onLike(tender), onApply: () => TenderDetailRouteData().push(context), + onReject: () => _onReject(tender), + onSubmit: () => _onSubmit(tender), + rejected: rejectedTenders.contains(tender), + submitted: submittedTenders.contains(tender), ); }, ), diff --git a/lib/views/tenders/widgets/tender_action_buttons.dart b/lib/views/tenders/widgets/tender_action_buttons.dart index 03b84b4..f03e233 100644 --- a/lib/views/tenders/widgets/tender_action_buttons.dart +++ b/lib/views/tenders/widgets/tender_action_buttons.dart @@ -9,16 +9,24 @@ class TenderActionButtons extends StatelessWidget { final VoidCallback? onLike; final VoidCallback? onDislike; final VoidCallback? onClose; + final VoidCallback? onReject; + final VoidCallback? onSubmit; final bool isLiked; final bool isDisliked; + final bool rejected; + final bool submitted; const TenderActionButtons({ super.key, this.onLike, this.onDislike, this.onClose, + this.onReject, + this.onSubmit, this.isLiked = false, this.isDisliked = false, + this.rejected = false, + this.submitted = false, }); @override @@ -31,31 +39,129 @@ class TenderActionButtons extends StatelessWidget { // Dislike button GestureDetector( onTap: onDislike, - child: SvgPicture.asset( - width: 32.0.w(), - height: 32.0.w(), - fit: BoxFit.cover, - AssetsManager.dislike, - colorFilter: ColorFilter.mode( - isDisliked ? AppColors.errorColor : AppColors.grey50, - BlendMode.srcATop, - ), + child: Column( + children: [ + SvgPicture.asset( + width: 32.0.w(), + height: 32.0.w(), + fit: BoxFit.cover, + AssetsManager.dislike, + colorFilter: ColorFilter.mode( + isDisliked ? AppColors.errorColor : AppColors.grey50, + BlendMode.srcATop, + ), + ), + SizedBox(height: 8.0.h()), + Text( + 'Like', + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w400, + color: isDisliked ? AppColors.errorColor : AppColors.grey50, + ), + ), + ], ), ), - - SizedBox(width: 48.0.w()), + SizedBox(width: 32.0.w()), + //reject button + GestureDetector( + onTap: onReject, + child: Column( + children: [ + Container( + width: 32.0.w(), + height: 32.0.w(), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: rejected ? AppColors.errorColor : AppColors.grey60, + width: 1.5.w(), + ), + ), + alignment: Alignment.center, + child: Icon( + Icons.close, + color: rejected ? AppColors.errorColor : AppColors.grey60, + size: 16, + ), + ), + SizedBox(height: 8.0.h()), + Text( + 'Reject', + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w400, + color: rejected ? AppColors.errorColor : AppColors.grey60, + ), + ), + ], + ), + ), + SizedBox(width: 32.0.w()), + //submit button + GestureDetector( + onTap: onSubmit, + child: Column( + children: [ + Container( + width: 32.0.w(), + height: 32.0.w(), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: + submitted ? AppColors.successColor : AppColors.grey60, + width: 1.5.w(), + ), + ), + alignment: Alignment.center, + child: SvgPicture.asset( + AssetsManager.tick, + colorFilter: ColorFilter.mode( + submitted ? AppColors.successColor : AppColors.grey60, + BlendMode.srcATop, + ), + ), + ), + SizedBox(height: 8.0.h()), + Text( + 'Submit', + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w400, + color: submitted ? AppColors.successColor : AppColors.grey60, + ), + ), + ], + ), + ), + SizedBox(width: 32.0.w()), // Like button GestureDetector( onTap: onLike, - child: SvgPicture.asset( - width: 32.0.w(), - height: 32.0.w(), - fit: BoxFit.cover, - AssetsManager.like, - colorFilter: ColorFilter.mode( - isLiked ? AppColors.successColor : AppColors.grey50, - BlendMode.srcATop, - ), + child: Column( + children: [ + SvgPicture.asset( + width: 32.0.w(), + height: 32.0.w(), + fit: BoxFit.cover, + AssetsManager.like, + colorFilter: ColorFilter.mode( + isLiked ? AppColors.successColor : AppColors.grey50, + BlendMode.srcATop, + ), + ), + SizedBox(height: 8.0.h()), + Text( + 'Like', + style: TextStyle( + fontSize: 12.0.sp(), + fontWeight: FontWeight.w400, + color: isLiked ? AppColors.successColor : AppColors.grey50, + ), + ), + ], ), ), ], diff --git a/lib/views/tenders/widgets/tender_card.dart b/lib/views/tenders/widgets/tender_card.dart index 5424b54..72ac79d 100644 --- a/lib/views/tenders/widgets/tender_card.dart +++ b/lib/views/tenders/widgets/tender_card.dart @@ -22,7 +22,10 @@ class TenderCard extends StatelessWidget { final VoidCallback? onClose; final bool isLiked; final bool isDisliked; - + final VoidCallback? onReject; + final VoidCallback? onSubmit; + final bool rejected; + final bool submitted; const TenderCard({ required this.date, required this.deadline, @@ -38,6 +41,10 @@ class TenderCard extends StatelessWidget { this.onClose, this.isLiked = false, this.isDisliked = false, + this.onReject, + this.onSubmit, + this.rejected = false, + this.submitted = false, super.key, }); @@ -46,7 +53,9 @@ class TenderCard extends StatelessWidget { return Column( children: [ Container( - width: 364.0.w(), + // width: 364.0.w(), + width: double.infinity, + margin: EdgeInsets.symmetric(horizontal: 16.0.w()), height: 587.0.h(), decoration: BoxDecoration( color: AppColors.grey0, @@ -255,6 +264,10 @@ class TenderCard extends StatelessWidget { onDislike: onDislike, onLike: onLike, onClose: onClose, + onReject: onReject, + onSubmit: onSubmit, + rejected: rejected, + submitted: submitted, ), ], );