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; 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; }); } @override void dispose() { pageController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Stack( children: [ SizedBox( width: double.infinity, height: 694.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), ); }, ), ), 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: SvgPicture.asset(AssetsManager.arrowCircleLeft), ), Text( '$currentPage/${sampleTenders.length}', style: TextStyle( fontSize: 14.0.sp(), fontWeight: FontWeight.w500, color: AppColors.grey, ), ), GestureDetector( onTap: _goToNextPage, child: SvgPicture.asset(AssetsManager.arrowCircleRight), ), ], ), ), ], ); } }