import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:tm_app/core/routes/app_routes.dart'; import 'package:tm_app/core/theme/colors.dart'; import '../../../core/constants/assets.dart'; import '../../../core/utils/size_config.dart'; import '../models/tender_model.dart'; import 'tender_card.dart'; class MainTendersSlider extends StatefulWidget { const MainTendersSlider({super.key}); @override State createState() => _MainTendersSliderState(); } class _MainTendersSliderState extends State { final PageController pageController = PageController(initialPage: 0); List likedTenders = []; List dislikedTenders = []; int currentPage = 1; List rejectedTenders = []; List submittedTenders = []; void _onDislike(Tender tender) { if (likedTenders.contains(tender)) { likedTenders.remove(tender); } if (!dislikedTenders.contains(tender)) { dislikedTenders.add(tender); } else { dislikedTenders.remove(tender); } setState(() {}); } void _onLike(Tender tender) { if (dislikedTenders.contains(tender)) { dislikedTenders.remove(tender); } if (!likedTenders.contains(tender)) { likedTenders.add(tender); } else { likedTenders.remove(tender); } setState(() {}); } void _goToPreviousPage() { pageController.previousPage( duration: Duration(milliseconds: 300), curve: Curves.easeInOutCubic, ); setState(() { if (currentPage == 1) { return; } currentPage = currentPage - 1; }); } void _goToNextPage() { pageController.nextPage( duration: Duration(milliseconds: 300), curve: Curves.easeInOutCubic, ); setState(() { if (currentPage == sampleTenders.length) { return; } currentPage = currentPage + 1; }); } 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(); super.dispose(); } @override Widget build(BuildContext context) { return Stack( children: [ SizedBox( width: double.infinity, height: 717.0.h(), child: PageView.builder( controller: pageController, scrollDirection: Axis.horizontal, itemCount: sampleTenders.length, onPageChanged: (index) { setState(() { currentPage = index + 1; }); }, itemBuilder: (context, index) { final tender = sampleTenders[index]; return TenderCard( date: tender.date, deadline: tender.deadline, title: tender.title, description: tender.description, tenderId: tender.tenderId, location: tender.location, country: tender.country, matchPercentage: tender.matchPercentage, isLiked: likedTenders.contains(tender), isDisliked: dislikedTenders.contains(tender), onDislike: () => _onDislike(tender), onLike: () => _onLike(tender), onApply: () => TenderDetailRouteData().push(context), onReject: () => _onReject(tender), onSubmit: () => _onSubmit(tender), rejected: rejectedTenders.contains(tender), submitted: submittedTenders.contains(tender), ); }, ), ), Positioned( top: 607.0.h(), bottom: 52.0.h(), left: 9.0.w(), right: 9.0.w(), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( onTap: _goToPreviousPage, child: Container( width: 32.0.w(), height: 32.0.w(), decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: AppColors.iconColor, width: 1.5), ), alignment: Alignment.center, child: SvgPicture.asset( AssetsManager.arrowLeftSmall, colorFilter: ColorFilter.mode( AppColors.iconColor, BlendMode.srcATop, ), ), ), ), Text( '$currentPage/${sampleTenders.length}', style: TextStyle( fontSize: 14.0.sp(), fontWeight: FontWeight.w500, color: AppColors.grey, ), ), GestureDetector( onTap: _goToNextPage, child: Container( width: 32.0.w(), height: 32.0.w(), decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: AppColors.iconColor, width: 1.5), ), alignment: Alignment.center, child: SvgPicture.asset( AssetsManager.arrowRightSmall, colorFilter: ColorFilter.mode( AppColors.iconColor, BlendMode.srcATop, ), ), ), ), ], ), ), ], ); } }