diff --git a/lib/core/config/dependencies.dart b/lib/core/config/dependencies.dart index da42d67..1e564dc 100644 --- a/lib/core/config/dependencies.dart +++ b/lib/core/config/dependencies.dart @@ -84,17 +84,18 @@ List get viewModels { ChangeNotifierProvider( create: (context) => HomeViewModel(homeRepository: context.read()), ), + ChangeNotifierProvider( + create: (context) => TendersViewModel(tendersRepository: context.read()), + ), ChangeNotifierProvider( create: (context) => TenderDetailViewModel( tenderDetailRepository: context.read(), tendersRepository: context.read(), + tendersViewModel: context.read(), ), ), - ChangeNotifierProvider( - create: (context) => TendersViewModel(tendersRepository: context.read()), - ), ChangeNotifierProvider( create: (context) => diff --git a/lib/view_models/profile_view_model.dart b/lib/view_models/profile_view_model.dart index bd08a6d..f827381 100644 --- a/lib/view_models/profile_view_model.dart +++ b/lib/view_models/profile_view_model.dart @@ -93,7 +93,7 @@ class ProfileViewModel with ChangeNotifier { switch (result) { case Ok(): - _authViewModel.localLogout(); + await _authViewModel.localLogout(); _loggedOut = true; break; case Error(): diff --git a/lib/view_models/tender_detail_view_model.dart b/lib/view_models/tender_detail_view_model.dart index 511afb5..ca13cd2 100644 --- a/lib/view_models/tender_detail_view_model.dart +++ b/lib/view_models/tender_detail_view_model.dart @@ -8,16 +8,20 @@ import 'package:tm_app/data/services/model/tender_detail_response/tender_detail_ import '../data/services/model/tender_approvals_by_id_response/tender_approvals_by_id_response.dart'; import '../data/services/model/tender_approvals_data/tender_approvals_data.dart'; import '../data/services/model/tender_approvals_toggle_response/tender_approvals_toggle_response.dart'; +import 'tenders_view_model.dart'; class TenderDetailViewModel with ChangeNotifier { final TenderDetailRepository _tenderDetailRepository; final TendersRepository _tendersRepository; + final TendersViewModel _tendersViewModel; TenderDetailViewModel({ required TenderDetailRepository tenderDetailRepository, required TendersRepository tendersRepository, + required TendersViewModel tendersViewModel, }) : _tenderDetailRepository = tenderDetailRepository, - _tendersRepository = tendersRepository; + _tendersRepository = tendersRepository, + _tendersViewModel = tendersViewModel; bool _isLoading = false; bool _isSubmitApprovalLoading = false; @@ -114,6 +118,10 @@ class TenderDetailViewModel with ChangeNotifier { notifyListeners(); } + void updateTenderApprovals(String tenderId) { + _tendersViewModel.getTenderApprovals(tenderId); + } + Future getTenderApprovals(String tenderId) async { _errorMessage = null; notifyListeners(); diff --git a/lib/views/detail/pages/detail_desktop_page.dart b/lib/views/detail/pages/detail_desktop_page.dart index 876b527..4748e33 100644 --- a/lib/views/detail/pages/detail_desktop_page.dart +++ b/lib/views/detail/pages/detail_desktop_page.dart @@ -10,7 +10,6 @@ import 'package:tm_app/views/detail/widgets/tender_detail_header.dart'; import '../../../core/constants/strings.dart'; import '../../../view_models/home_view_model.dart'; -import '../../../view_models/tenders_view_model.dart'; import '../../shared/desktop_navigation_widget.dart'; class TenderDetailDesktopPage extends StatefulWidget { @@ -81,7 +80,9 @@ class _TenderDetailDesktopPageState extends State { return PopScope( onPopInvokedWithResult: (didPop, result) { WidgetsBinding.instance.addPostFrameCallback((_) { - context.read().getTenderApprovals(widget.tenderId); + context.read().updateTenderApprovals( + widget.tenderId, + ); }); }, child: Scaffold( diff --git a/lib/views/detail/pages/detail_mobile_page.dart b/lib/views/detail/pages/detail_mobile_page.dart index 7d67fc3..db9c59f 100644 --- a/lib/views/detail/pages/detail_mobile_page.dart +++ b/lib/views/detail/pages/detail_mobile_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/strings.dart'; @@ -73,42 +74,53 @@ class _TenderDetailMobilePageState extends State { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColors.backgroundColor, - appBar: appBar(context: context, title: AppStrings.tenderDetailTitle), - body: Consumer( - builder: (context, tenderViewModel, child) { - if (tenderViewModel.isLoading) { - return const Center( - child: CircularProgressIndicator(color: AppColors.secondary50), + return PopScope( + onPopInvokedWithResult: (didPop, result) { + if (kIsWeb) { + WidgetsBinding.instance.addPostFrameCallback((_) { + context.read().updateTenderApprovals( + widget.tenderId, ); - } + }); + } + }, + child: Scaffold( + backgroundColor: AppColors.backgroundColor, + appBar: appBar(context: context, title: AppStrings.tenderDetailTitle), + body: Consumer( + builder: (context, tenderViewModel, child) { + if (tenderViewModel.isLoading) { + return const Center( + child: CircularProgressIndicator(color: AppColors.secondary50), + ); + } - if (tenderViewModel.errorMessage != null) { - return Center(child: Text(tenderViewModel.errorMessage!)); - } + if (tenderViewModel.errorMessage != null) { + return Center(child: Text(tenderViewModel.errorMessage!)); + } - final detail = tenderViewModel.tenderDetail; - if (detail == null) { - return const Center(child: Text(AppStrings.tenderNoData)); - } + final detail = tenderViewModel.tenderDetail; + if (detail == null) { + return const Center(child: Text(AppStrings.tenderNoData)); + } - return SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TenderDetailHeader(isScreenBig: false, detail: detail), - SizedBox(height: 24.0.h()), - TenderDetailCard(detail: detail), - SizedBox(height: 24.0.h()), - TenderDetailActions(isScreenBig: false, detail: detail), - ], + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TenderDetailHeader(isScreenBig: false, detail: detail), + SizedBox(height: 24.0.h()), + TenderDetailCard(detail: detail), + SizedBox(height: 24.0.h()), + TenderDetailActions(isScreenBig: false, detail: detail), + ], + ), ), - ), - ); - }, + ); + }, + ), ), ); } diff --git a/lib/views/detail/pages/detail_tablet_page.dart b/lib/views/detail/pages/detail_tablet_page.dart index dfac552..191286c 100644 --- a/lib/views/detail/pages/detail_tablet_page.dart +++ b/lib/views/detail/pages/detail_tablet_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:go_router/go_router.dart'; @@ -79,91 +80,102 @@ class _TenderDetailTabletPageState extends State { @override Widget build(BuildContext context) { final GlobalKey key = GlobalKey(); - return Scaffold( - key: key, - backgroundColor: AppColors.backgroundColor, - appBar: PreferredSize( - preferredSize: const Size.fromHeight(64), - child: AppBar( - backgroundColor: AppColors.backgroundColor, - elevation: 0, - titleSpacing: 0, - leading: Padding( - padding: EdgeInsetsDirectional.only(start: 24.0.w()), - child: SvgPicture.asset(AssetsManager.logoSmall), - ), - actions: [ - IconButton( - icon: Padding( - padding: EdgeInsetsDirectional.only(end: 24.0.w()), - child: SvgPicture.asset( - AssetsManager.menu, - height: 32.0.w(), - width: 32.0.w(), - ), - ), - onPressed: () => key.currentState!.openDrawer(), - ), - ], - ), - ), - drawer: TabletNavigationWidget( - currentIndex: 1, // Home is index 0 - onTabChanged: (index) { - // Handle navigation to other tabs - switch (index) { - case 0: - Router.neglect(context, () => context.go('/home')); - context.read().init(); - break; - case 1: - break; - case 2: - // Navigate to profile - context.pop(); - Router.neglect(context, () => context.go('/profile')); - break; - } - }, - ), - body: Consumer( - builder: (context, tenderViewModel, child) { - if (tenderViewModel.isLoading) { - return const Center( - child: CircularProgressIndicator(color: AppColors.secondary50), + return PopScope( + onPopInvokedWithResult: (didPop, result) { + if (kIsWeb) { + WidgetsBinding.instance.addPostFrameCallback((_) { + context.read().updateTenderApprovals( + widget.tenderId, ); - } + }); + } + }, + key: key, + child: Scaffold( + backgroundColor: AppColors.backgroundColor, + appBar: PreferredSize( + preferredSize: const Size.fromHeight(64), + child: AppBar( + backgroundColor: AppColors.backgroundColor, + elevation: 0, + titleSpacing: 0, + leading: Padding( + padding: EdgeInsetsDirectional.only(start: 24.0.w()), + child: SvgPicture.asset(AssetsManager.logoSmall), + ), + actions: [ + IconButton( + icon: Padding( + padding: EdgeInsetsDirectional.only(end: 24.0.w()), + child: SvgPicture.asset( + AssetsManager.menu, + height: 32.0.w(), + width: 32.0.w(), + ), + ), + onPressed: () => key.currentState!.openDrawer(), + ), + ], + ), + ), + drawer: TabletNavigationWidget( + currentIndex: 1, // Home is index 0 + onTabChanged: (index) { + // Handle navigation to other tabs + switch (index) { + case 0: + Router.neglect(context, () => context.go('/home')); + context.read().init(); + break; + case 1: + break; + case 2: + // Navigate to profile + context.pop(); + Router.neglect(context, () => context.go('/profile')); + break; + } + }, + ), + body: Consumer( + builder: (context, tenderViewModel, child) { + if (tenderViewModel.isLoading) { + return const Center( + child: CircularProgressIndicator(color: AppColors.secondary50), + ); + } - if (tenderViewModel.errorMessage != null) { - return Center(child: Text(tenderViewModel.errorMessage!)); - } + if (tenderViewModel.errorMessage != null) { + return Center(child: Text(tenderViewModel.errorMessage!)); + } - final detail = tenderViewModel.tenderDetail; - if (detail == null) { - return const Center(child: Text(AppStrings.tenderNoData)); - } - return SingleChildScrollView( - child: Center( - child: SizedBox( - width: 768, + final detail = tenderViewModel.tenderDetail; + if (detail == null) { + return const Center(child: Text(AppStrings.tenderNoData)); + } + return SingleChildScrollView( + child: Center( + child: SizedBox( + width: 768, - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TenderDetailHeader(isScreenBig: true, detail: detail), - SizedBox(height: 28.0.h()), - TenderDetailCard(detail: detail), - SizedBox(height: 24.0.h()), - TenderDetailActions(isScreenBig: true, detail: detail), - ], + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TenderDetailHeader(isScreenBig: true, detail: detail), + SizedBox(height: 28.0.h()), + TenderDetailCard(detail: detail), + SizedBox(height: 24.0.h()), + TenderDetailActions(isScreenBig: true, detail: detail), + ], + ), ), ), ), - ), - ); - }, + ); + }, + ), ), ); }