Merge pull request 'show message when there is error in submit or remove approvals' (#102) from like_tenders_error_approval into main

Reviewed-on: https://repo.ravanertebat.com/TM/tm_app/pulls/102
This commit is contained in:
a.ghabeli
2025-09-06 14:11:19 +03:30
6 changed files with 137 additions and 88 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ class FetchDataException extends AppException {
FetchDataException([String? message, int? statusCode, originalError]) FetchDataException([String? message, int? statusCode, originalError])
: super( : super(
message ?? 'Error During Communication: ', message ?? 'Error During Communication: ',
'Network Error', 'Network Error : ',
statusCode, statusCode,
originalError, originalError,
); );
@@ -55,6 +55,11 @@ class LikedTendersViewModel with ChangeNotifier {
_homeViewModel.init(); _homeViewModel.init();
} }
void clearApprovalErrorMessage() {
_errorMessage = null;
notifyListeners();
}
Future<void> getLikedTenders({bool reset = false}) async { Future<void> getLikedTenders({bool reset = false}) async {
if (!reset && (isLoadingMore || !hasMore)) { if (!reset && (isLoadingMore || !hasMore)) {
return; return;
@@ -303,7 +308,7 @@ class LikedTendersViewModel with ChangeNotifier {
approvalStatus = false; approvalStatus = false;
break; break;
} }
approvalStatus = false;
_isSubmitApprovalLoading = false; _isSubmitApprovalLoading = false;
notifyListeners(); notifyListeners();
} }
@@ -370,6 +375,7 @@ class LikedTendersViewModel with ChangeNotifier {
break; break;
} }
approvalStatus = false;
_isRejectApprovalLoading = false; _isRejectApprovalLoading = false;
notifyListeners(); notifyListeners();
} }
@@ -24,9 +24,26 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
@override @override
void initState() { void initState() {
viewModel = context.read<LikedTendersViewModel>(); viewModel = context.read<LikedTendersViewModel>();
viewModel.addListener(_viewModelListener);
super.initState(); super.initState();
} }
void _viewModelListener() {
if (viewModel.approvalErrorMessage?.isNotEmpty == true &&
viewModel.approvalStatus == false) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(viewModel.approvalErrorMessage!)));
viewModel.clearApprovalErrorMessage();
}
}
@override
void dispose() {
viewModel.removeListener(_viewModelListener);
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return PopScope( return PopScope(
@@ -27,6 +27,18 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
viewModel = context.read<LikedTendersViewModel>(); viewModel = context.read<LikedTendersViewModel>();
super.initState(); super.initState();
_scrollController = ScrollController()..addListener(_onScroll); _scrollController = ScrollController()..addListener(_onScroll);
viewModel.addListener(_viewModelListener);
}
void _viewModelListener() {
if (mounted &&
viewModel.approvalErrorMessage?.isNotEmpty == true &&
viewModel.approvalStatus == false) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(viewModel.approvalErrorMessage!)));
viewModel.clearApprovalErrorMessage();
}
} }
void _onScroll() { void _onScroll() {
@@ -46,6 +58,7 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
void dispose() { void dispose() {
_scrollController.removeListener(_onScroll); _scrollController.removeListener(_onScroll);
_scrollController.dispose(); _scrollController.dispose();
viewModel.removeListener(_viewModelListener);
super.dispose(); super.dispose();
} }
@@ -94,11 +107,7 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
final itemCount = final itemCount =
feedback.length + (viewModel.isLoadingMore ? 1 : 0); feedback.length + (viewModel.isLoadingMore ? 1 : 0);
return RefreshIndicator( return ListView.builder(
onRefresh: () async {
await viewModel.getLikedTenders(reset: true);
},
child: ListView.builder(
controller: _scrollController, controller: _scrollController,
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 24.0.w(), horizontal: 24.0.w(),
@@ -109,8 +118,9 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
if (index < feedback.length) { if (index < feedback.length) {
final item = feedback[index]; final item = feedback[index];
TenderApprovalsData? approval; TenderApprovalsData? approval;
bool hasApproval = viewModel bool hasApproval = viewModel.hasTenderApprovalForTender(
.hasTenderApprovalForTender(item.tenderId!); item.tenderId!,
);
if (hasApproval) { if (hasApproval) {
approval = viewModel.getApprovalStatusForTender( approval = viewModel.getApprovalStatusForTender(
item.tenderId!, item.tenderId!,
@@ -162,7 +172,6 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
); );
} }
}, },
),
); );
}, },
), ),
@@ -26,6 +26,23 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
void initState() { void initState() {
viewModel = context.read<LikedTendersViewModel>(); viewModel = context.read<LikedTendersViewModel>();
super.initState(); super.initState();
viewModel.addListener(_viewModelListener);
}
void _viewModelListener() {
if (viewModel.approvalErrorMessage?.isNotEmpty == true &&
viewModel.approvalStatus == false) {
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(viewModel.approvalErrorMessage!)));
viewModel.clearApprovalErrorMessage();
}
}
@override
void dispose() {
viewModel.removeListener(_viewModelListener);
super.dispose();
} }
@override @override