filters in your tenders fixed

This commit is contained in:
amirrezaghabeli
2025-09-03 13:25:40 +03:30
parent 70181848aa
commit 1e3bd9d9a8
12 changed files with 363 additions and 252 deletions
@@ -2,7 +2,9 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/view_models/your_tenders_view_model.dart';
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
import 'package:tm_app/views/your_tenders/widgets/filter_button.dart';
import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.dart';
import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart';
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
@@ -24,10 +26,6 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
void initState() {
super.initState();
controller = TabController(length: 2, vsync: this);
WidgetsBinding.instance.addPostFrameCallback((_) {
context.read<YourTendersViewModel>().getApprovedTenders();
});
}
@override
@@ -94,9 +92,28 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return TendersSubmitted(
approvedTenders: viewModel.data!,
);
if (viewModel.selectedStatus ==
YourTendersStrings.likeTenders &&
viewModel.likedTendersData != null) {
return LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'liked',
);
} else if (viewModel.selectedStatus ==
YourTendersStrings.dislikeTenders &&
viewModel.likedTendersData != null) {
return LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'disliked',
);
} else if (viewModel.data != null) {
return TendersSubmitted(
approvedTenders: viewModel.data!,
);
} else {
return const Center(child: Text('No data available'));
}
// return TabBarView(
// controller: controller,
// children: [
@@ -5,6 +5,7 @@ import 'package:tm_app/view_models/your_tenders_view_model.dart';
import 'package:tm_app/views/shared/tender_app_bar.dart';
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
import 'package:tm_app/views/your_tenders/widgets/filter_button.dart';
import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.dart';
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
class YourTendersMobilePage extends StatefulWidget {
@@ -55,10 +56,34 @@ class _YourTendersMobilePageState extends State<YourTendersMobilePage> {
return Column(
children: [
// Expanded(child: ApprovedTenders(tendersSubmitted: [])),
Expanded(
child: TendersSubmitted(approvedTenders: viewModel.data!),
),
if (viewModel.selectedStatus ==
YourTendersStrings.likeTenders &&
viewModel.likedTendersData != null)
Expanded(
child: LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'liked tenders',
),
)
else if (viewModel.selectedStatus ==
YourTendersStrings.dislikeTenders &&
viewModel.likedTendersData != null)
Expanded(
child: LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'disliked',
),
)
else if (viewModel.data != null)
Expanded(
child: TendersSubmitted(
approvedTenders: viewModel.data!,
),
)
else
const Expanded(
child: Center(child: Text('No data available')),
),
],
);
},
@@ -6,6 +6,7 @@ import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/view_models/your_tenders_view_model.dart';
import 'package:tm_app/views/your_tenders/widgets/filter_button.dart';
import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.dart';
import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart';
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
@@ -28,10 +29,6 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
void initState() {
super.initState();
controller = TabController(length: 2, vsync: this);
WidgetsBinding.instance.addPostFrameCallback((_) {
context.read<YourTendersViewModel>().getApprovedTenders();
});
}
@override
@@ -46,10 +43,7 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
return Scaffold(
key: key,
backgroundColor: AppColors.backgroundColor,
appBar: tabletAppBar(
title: YourTendersStrings.yourTenders,
key: key,
),
appBar: tabletAppBar(title: YourTendersStrings.yourTenders, key: key),
drawer: TabletNavigationWidget(
currentIndex: 1, // Home is index 0
onTabChanged: (index) {
@@ -102,7 +96,26 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return TendersSubmitted(approvedTenders: viewModel.data!);
if (viewModel.selectedStatus ==
YourTendersStrings.likeTenders &&
viewModel.likedTendersData != null) {
return LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'liked',
);
} else if (viewModel.selectedStatus ==
YourTendersStrings.dislikeTenders &&
viewModel.likedTendersData != null) {
return LikedDislikedTendersList(
data: viewModel.likedTendersData!,
status: 'disliked',
);
} else if (viewModel.data != null) {
return TendersSubmitted(approvedTenders: viewModel.data!);
} else {
return const Center(child: Text('No data available'));
}
},
),
),
@@ -0,0 +1,93 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
import 'package:tm_app/view_models/your_tenders_view_model.dart';
import 'package:tm_app/views/your_tenders/widgets/tender_card.dart';
class LikedDislikedTendersList extends StatefulWidget {
final LikedTendersResponse data;
final String status;
const LikedDislikedTendersList({
required this.data,
required this.status,
super.key,
});
@override
State<LikedDislikedTendersList> createState() =>
_LikedDislikedTendersListState();
}
class _LikedDislikedTendersListState extends State<LikedDislikedTendersList> {
final ScrollController _controller = ScrollController();
@override
void initState() {
super.initState();
_controller.addListener(_onScroll);
}
void _onScroll() {
final vm = context.read<YourTendersViewModel>();
if (_controller.position.pixels >=
_controller.position.maxScrollExtent - 200) {
vm.loadMoreFeedback();
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final vm = context.watch<YourTendersViewModel>();
final data = widget.data;
if (data.data?.feedback == null || data.data!.feedback!.isEmpty) {
return Center(
child: Text(
'No ${widget.status} found',
style: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey70),
),
);
}
final items = data.data!.feedback!;
final itemCount = items.length + (vm.isLoadingMore ? 1 : 0);
return ListView.builder(
controller: _controller,
itemCount: itemCount,
itemBuilder: (context, index) {
if (index >= items.length) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 16.0.h()),
child: const Center(
child: CircularProgressIndicator(color: AppColors.secondary50),
),
);
}
final feedback = items[index];
return Padding(
padding: EdgeInsets.only(bottom: 16.0.h()),
child: TenderCard(
date: feedback.tender!.publicationDate?.toString() ?? '',
title: feedback.tender!.title ?? '',
description: feedback.tender!.description ?? '',
location: feedback.tender!.countryCode ?? '',
countryCode: feedback.tender!.countryCode ?? '',
status: feedback.tender!.status ?? '',
projectStatus: feedback.tender!.procurementTypeCode!,
),
);
},
);
}
}