added pagination in your tenders and some fixes
This commit is contained in:
@@ -48,10 +48,10 @@ class FilterButton extends StatelessWidget {
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 12),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.blue.shade50,
|
||||
color: AppColors.primary20,
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
child: const Center(
|
||||
child: Center(
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
@@ -60,7 +60,7 @@ class FilterButton extends StatelessWidget {
|
||||
Text(
|
||||
YourTendersStrings.filter,
|
||||
style: TextStyle(
|
||||
color: Colors.blue,
|
||||
color: AppColors.textBlue,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -165,8 +165,8 @@ class TendersFilterDialog extends StatelessWidget {
|
||||
vm.callWithFilter();
|
||||
},
|
||||
text: YourTendersStrings.confirm,
|
||||
textColor: AppColors.mainBlue,
|
||||
backgroundColor: AppColors.primary30,
|
||||
textColor: AppColors.textBlue,
|
||||
backgroundColor: AppColors.primary20,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
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/tender_card.dart';
|
||||
|
||||
import '../../../data/services/model/tender_approvals_response/tender_approvals_response.dart';
|
||||
|
||||
class TendersSubmitted extends StatelessWidget {
|
||||
class TendersSubmitted extends StatefulWidget {
|
||||
const TendersSubmitted({
|
||||
required this.approvedTenders,
|
||||
required this.isDesktop,
|
||||
@@ -15,57 +18,124 @@ class TendersSubmitted extends StatelessWidget {
|
||||
final TenderApprovalsResponse approvedTenders;
|
||||
final bool isDesktop;
|
||||
|
||||
@override
|
||||
State<TendersSubmitted> createState() => _TendersSubmittedState();
|
||||
}
|
||||
|
||||
class _TendersSubmittedState extends State<TendersSubmitted> {
|
||||
late final ScrollController _scrollController;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_scrollController = ScrollController()..addListener(_onScroll);
|
||||
}
|
||||
|
||||
void _onScroll() {
|
||||
if (!_scrollController.hasClients) {
|
||||
return;
|
||||
}
|
||||
final max = _scrollController.position.maxScrollExtent;
|
||||
final pos = _scrollController.position.pixels;
|
||||
const threshold = 200.0;
|
||||
if (max - pos <= threshold) {
|
||||
final vm = Provider.of<YourTendersViewModel>(context, listen: false);
|
||||
vm.loadMoreTenders();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_scrollController.removeListener(_onScroll);
|
||||
_scrollController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return approvedTenders.data == null
|
||||
? const Center(child: Text('No submitted projects yet.'))
|
||||
: ListView.builder(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
itemCount: approvedTenders.data!.tenders!.length,
|
||||
return Consumer<YourTendersViewModel>(
|
||||
builder: (context, viewModel, child) {
|
||||
if (widget.approvedTenders.data == null) {
|
||||
return const Center(child: Text('No submitted projects yet.'));
|
||||
}
|
||||
|
||||
final tenders = widget.approvedTenders.data!.tenders ?? [];
|
||||
if (tenders.isEmpty) {
|
||||
return const Center(child: Text('No submitted projects yet.'));
|
||||
}
|
||||
|
||||
final itemCount =
|
||||
tenders.length + (viewModel.isLoadingMoreTenders ? 1 : 0);
|
||||
|
||||
return ListView.builder(
|
||||
controller: _scrollController,
|
||||
padding: EdgeInsets.symmetric(
|
||||
// horizontal: 24.0.w(),
|
||||
vertical: 15.0.h(),
|
||||
),
|
||||
itemCount: itemCount,
|
||||
itemBuilder: (context, index) {
|
||||
final tender = approvedTenders.data!.tenders![index];
|
||||
return TenderCard(
|
||||
date: tender.createdAt!.toString(),
|
||||
title: tender.tender!.title!,
|
||||
description: tender.tender!.description!,
|
||||
location: tender.tender!.countryCode!,
|
||||
countryFlag: AssetsManager.seFlag,
|
||||
status: tender.status,
|
||||
countryCode: tender.tender!.countryCode!,
|
||||
projectStatus: tender.tender!.status!,
|
||||
isDesktop: isDesktop,
|
||||
backgroundColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green0
|
||||
: tender.status == 'submitted'
|
||||
? AppColors.grey0
|
||||
: AppColors.red0.withValues(alpha: 0.2),
|
||||
borderColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green10
|
||||
: tender.status == 'submitted'
|
||||
? AppColors.grey30
|
||||
: AppColors.red0,
|
||||
statusIcon:
|
||||
tender.status == 'Won'
|
||||
? AssetsManager.tickCircle
|
||||
: tender.status == 'submitted'
|
||||
? null
|
||||
: AssetsManager.closeCircle,
|
||||
statusCardColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green20
|
||||
: tender.status == 'submitted'
|
||||
? AppColors.green20
|
||||
: AppColors.red0,
|
||||
statusTextColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green30
|
||||
: tender.status == 'submitted'
|
||||
? AppColors.green30
|
||||
: AppColors.red10,
|
||||
);
|
||||
if (index < tenders.length) {
|
||||
final tender = tenders[index];
|
||||
return TenderCard(
|
||||
date: tender.createdAt!.toString(),
|
||||
title: tender.tender!.title!,
|
||||
description: tender.tender!.description!,
|
||||
location: tender.tender!.countryCode!,
|
||||
countryFlag: AssetsManager.seFlag,
|
||||
status: tender.status,
|
||||
countryCode: tender.tender!.countryCode!,
|
||||
projectStatus: tender.tender!.status!,
|
||||
isDesktop: widget.isDesktop,
|
||||
backgroundColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green0
|
||||
: tender.status == 'submitted'
|
||||
? AppColors.grey0
|
||||
: AppColors.red0.withValues(alpha: 0.2),
|
||||
borderColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green10
|
||||
: tender.status == 'submitted'
|
||||
? AppColors.grey30
|
||||
: AppColors.red0,
|
||||
statusIcon:
|
||||
tender.status == 'Won'
|
||||
? AssetsManager.tickCircle
|
||||
: tender.status == 'submitted'
|
||||
? null
|
||||
: AssetsManager.closeCircle,
|
||||
statusCardColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green20
|
||||
: tender.status == 'submitted'
|
||||
? AppColors.green20
|
||||
: AppColors.red0,
|
||||
statusTextColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green30
|
||||
: tender.status == 'submitted'
|
||||
? AppColors.green30
|
||||
: AppColors.red10,
|
||||
);
|
||||
} else {
|
||||
return Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 20.0.h()),
|
||||
child: Center(
|
||||
child: SizedBox(
|
||||
width: 24.0.w(),
|
||||
height: 24.0.h(),
|
||||
child: CircularProgressIndicator(
|
||||
color: AppColors.secondary50,
|
||||
strokeWidth: 2,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user