added new design for tenders desktop

This commit is contained in:
llsajjad
2025-09-20 23:09:00 +03:30
parent fae6509698
commit 8a289f2d05
9 changed files with 199 additions and 50 deletions
@@ -15,6 +15,7 @@ class MainTendersSlider extends StatefulWidget {
super.key,
this.isDesktop = false,
});
final bool isDesktop;
final List<TenderData> tenders;
@@ -24,7 +25,6 @@ class MainTendersSlider extends StatefulWidget {
class _MainTendersSliderState extends State<MainTendersSlider> {
final PageController pageController = PageController(initialPage: 0);
int currentPage = 1;
void _goToPreviousPage() {
@@ -32,17 +32,22 @@ class _MainTendersSliderState extends State<MainTendersSlider> {
return;
}
final targetIndex = currentPage - 2;
if (targetIndex < 0) {
return;
}
pageController.previousPage(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOutCubic,
);
setState(() {
currentPage = currentPage - 1;
});
// Fetch feedback and approvals for the previous tender if not already loaded
final viewModel = context.read<TendersViewModel>();
final previousTenderId = widget.tenders[currentPage - 2].id!;
final previousTenderId = widget.tenders[targetIndex].id!;
if (!viewModel.hasFeedbackForTender(previousTenderId)) {
viewModel.getTenderFeedback(previousTenderId);
}
@@ -56,17 +61,22 @@ class _MainTendersSliderState extends State<MainTendersSlider> {
return;
}
final targetIndex = currentPage;
if (targetIndex >= widget.tenders.length) {
return;
}
pageController.nextPage(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOutCubic,
);
setState(() {
currentPage = currentPage + 1;
});
// Fetch feedback and approvals for the next tender if not already loaded
final viewModel = context.read<TendersViewModel>();
final nextTenderId = widget.tenders[currentPage].id!;
final nextTenderId = widget.tenders[targetIndex].id!;
if (!viewModel.hasFeedbackForTender(nextTenderId)) {
viewModel.getTenderFeedback(nextTenderId);
}
@@ -83,11 +93,27 @@ class _MainTendersSliderState extends State<MainTendersSlider> {
@override
Widget build(BuildContext context) {
bool isLtr = Directionality.of(context) == TextDirection.ltr;
return SingleChildScrollView(
child: Stack(
children: [_tendersPageView(), _nextPreviousArrows(isLtr: isLtr)],
),
final bool isLtr = Directionality.of(context) == TextDirection.ltr;
return widget.isDesktop ? _tendersListView() : _tendersSlider(isLtr);
}
Widget _tendersListView() {
return ListView.separated(
padding: EdgeInsets.all(16.0.h()),
itemCount: widget.tenders.length,
separatorBuilder:
(_, __) => SizedBox(height: widget.isDesktop ? 0 : 16.0.h()),
itemBuilder: (context, index) {
final tender = widget.tenders[index];
return TenderCard(tender: tender, isDesktop: widget.isDesktop);
},
);
}
Widget _tendersSlider(bool isLtr) {
return Stack(
children: [_tendersPageView(), _nextPreviousArrows(isLtr: isLtr)],
);
}
@@ -97,25 +123,21 @@ class _MainTendersSliderState extends State<MainTendersSlider> {
height: 722.0.h(),
child: PageView.builder(
controller: pageController,
scrollDirection: Axis.horizontal,
itemCount: widget.tenders.length,
onPageChanged: (index) {
setState(() {
currentPage = index + 1;
});
// Fetch feedback and approvals for the new tender if not already loaded
final viewModel = context.read<TendersViewModel>();
if (!viewModel.hasFeedbackForTender(widget.tenders[index].id!)) {
viewModel.getTenderFeedback(widget.tenders[index].id!);
final id = widget.tenders[index].id!;
if (!viewModel.hasFeedbackForTender(id)) {
viewModel.getTenderFeedback(id);
}
if (!viewModel.hasTenderApprovalForTender(
widget.tenders[index].id!,
)) {
viewModel.getTenderApprovals(widget.tenders[index].id!);
if (!viewModel.hasTenderApprovalForTender(id)) {
viewModel.getTenderApprovals(id);
}
// Check if we need to load more tenders (when user reaches near the end)
if (index >= widget.tenders.length - 1 &&
viewModel.hasMoreData &&
!viewModel.isLoadingMore) {