diff --git a/lib/admin/providers/account_types_list_provider.dart b/lib/admin/providers/account_types_list_provider.dart index b50ade18f..e3e310f54 100644 --- a/lib/admin/providers/account_types_list_provider.dart +++ b/lib/admin/providers/account_types_list_provider.dart @@ -3,8 +3,6 @@ import 'package:myecl/admin/class/account_type.dart'; import 'package:myecl/admin/repositories/account_type_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; - class AccountTypesNotifier extends ListNotifier { final AccountTypeRepository accountTypeRepository; AccountTypesNotifier({required this.accountTypeRepository}) @@ -23,8 +21,6 @@ final allAccountTypesListProvider = AccountTypesNotifier provider = AccountTypesNotifier( accountTypeRepository: accountTypeRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadAccountTypes(); - }); + provider.loadAccountTypes(); return provider; }); diff --git a/lib/admin/providers/association_membership_list_provider.dart b/lib/admin/providers/association_membership_list_provider.dart index a34e68314..7f29493ff 100644 --- a/lib/admin/providers/association_membership_list_provider.dart +++ b/lib/admin/providers/association_membership_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/association_membership_simple.dart'; import 'package:myecl/admin/repositories/association_membership_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AssociationMembershipListNotifier extends ListNotifier { @@ -67,8 +66,6 @@ final allAssociationMembershipListProvider = AssociationMembershipListNotifier( associationMembershipRepository: associationMembershipRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadAssociationMemberships(); - }); + provider.loadAssociationMemberships(); return provider; }); diff --git a/lib/admin/providers/group_list_provider.dart b/lib/admin/providers/group_list_provider.dart index 31590361f..79c46bcbd 100644 --- a/lib/admin/providers/group_list_provider.dart +++ b/lib/admin/providers/group_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/simple_group.dart'; import 'package:myecl/admin/repositories/group_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/class/user.dart'; import 'package:myecl/user/providers/user_provider.dart'; @@ -59,9 +58,7 @@ final allGroupListProvider = GroupListNotifier provider = GroupListNotifier( groupRepository: groupRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadGroups(); - }); + provider.loadGroups(); return provider; }); @@ -73,8 +70,6 @@ final userGroupListNotifier = GroupListNotifier provider = GroupListNotifier( groupRepository: groupRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadGroupsFromUser(ref.watch(userProvider)); - }); + provider.loadGroupsFromUser(ref.watch(userProvider)); return provider; }); diff --git a/lib/admin/providers/group_logo_provider.dart b/lib/admin/providers/group_logo_provider.dart index 88f1ac096..c891b3ad0 100644 --- a/lib/admin/providers/group_logo_provider.dart +++ b/lib/admin/providers/group_logo_provider.dart @@ -28,6 +28,6 @@ class GroupLogoNotifier extends SingleNotifier { final groupLogoProvider = StateNotifierProvider>((ref) { - final groupLogoRepository = GroupLogoRepository(); + final groupLogoRepository = GroupLogoRepository(ref); return GroupLogoNotifier(groupLogoRepository: groupLogoRepository); }); diff --git a/lib/admin/providers/module_root_list_provider.dart b/lib/admin/providers/module_root_list_provider.dart index 65f9aff9f..5335ea644 100644 --- a/lib/admin/providers/module_root_list_provider.dart +++ b/lib/admin/providers/module_root_list_provider.dart @@ -1,16 +1,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/repositories/module_visibility_repository.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/providers/user_provider.dart'; class ModuleListNotifier extends ListNotifier { - ModuleVisibilityRepository repository = ModuleVisibilityRepository(); - ModuleListNotifier({required String token}) - : super(const AsyncValue.loading()) { - repository.setToken(token); - } + ModuleVisibilityRepository repository; + ModuleListNotifier({required this.repository}) + : super(const AsyncValue.loading()); Future>> loadMyModuleRoots() async { return await loadList(repository.getAccessibleModule); @@ -19,13 +15,11 @@ class ModuleListNotifier extends ListNotifier { final moduleRootListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); + final repository = ref.watch(moduleVisibilityRepositoryProvider); final userProvider = ref.watch(asyncUserProvider); - ModuleListNotifier notifier = ModuleListNotifier(token: token); + ModuleListNotifier notifier = ModuleListNotifier(repository: repository); userProvider.maybeWhen( - data: (data) => tokenExpireWrapperAuth(ref, () async { - await notifier.loadMyModuleRoots(); - }), + data: (data) => notifier.loadMyModuleRoots(), orElse: () {}, ); return notifier; diff --git a/lib/admin/providers/module_visibility_list_provider.dart b/lib/admin/providers/module_visibility_list_provider.dart index 06b674bd5..de8a74c5b 100644 --- a/lib/admin/providers/module_visibility_list_provider.dart +++ b/lib/admin/providers/module_visibility_list_provider.dart @@ -1,16 +1,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/module_visibility.dart'; import 'package:myecl/admin/repositories/module_visibility_repository.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ModuleVisibilityListNotifier extends ListNotifier { - ModuleVisibilityRepository repository = ModuleVisibilityRepository(); - ModuleVisibilityListNotifier({required String token}) - : super(const AsyncValue.loading()) { - repository.setToken(token); - } + ModuleVisibilityRepository repository; + ModuleVisibilityListNotifier({required this.repository}) + : super(const AsyncValue.loading()); Future>> loadModuleVisibility() async { return await loadList(repository.getModuleVisibilityList); @@ -88,12 +84,10 @@ final moduleVisibilityListProvider = ModuleVisibilityListNotifier, AsyncValue> >((ref) { - final token = ref.watch(tokenProvider); + final repository = ref.watch(moduleVisibilityRepositoryProvider); ModuleVisibilityListNotifier notifier = ModuleVisibilityListNotifier( - token: token, + repository: repository, ); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadModuleVisibility(); - }); + notifier.loadModuleVisibility(); return notifier; }); diff --git a/lib/admin/providers/school_list_provider.dart b/lib/admin/providers/school_list_provider.dart index 67dacec2d..e2daffa7c 100644 --- a/lib/admin/providers/school_list_provider.dart +++ b/lib/admin/providers/school_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/school.dart'; import 'package:myecl/admin/repositories/school_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class SchoolListNotifier extends ListNotifier { final SchoolRepository schoolRepository; @@ -51,8 +50,6 @@ final allSchoolListProvider = SchoolListNotifier provider = SchoolListNotifier( schoolRepository: schoolRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadSchools(); - }); + provider.loadSchools(); return provider; }); diff --git a/lib/admin/providers/simple_groups_groups_provider.dart b/lib/admin/providers/simple_groups_groups_provider.dart index 56126e5c7..ad574a329 100644 --- a/lib/admin/providers/simple_groups_groups_provider.dart +++ b/lib/admin/providers/simple_groups_groups_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/group.dart'; import 'package:myecl/admin/providers/group_list_provider.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class SimpleGroupsGroupsNotifier extends MapNotifier { SimpleGroupsGroupsNotifier(); @@ -15,11 +14,9 @@ final simpleGroupsGroupsProvider = >((ref) { SimpleGroupsGroupsNotifier simpleGroupsGroupsNotifier = SimpleGroupsGroupsNotifier(); - tokenExpireWrapperAuth(ref, () async { - final simpleGroups = ref.watch(allGroupListProvider); - simpleGroups.whenData((value) { - simpleGroupsGroupsNotifier.loadTList(value.map((e) => e.id).toList()); - }); + final simpleGroups = ref.watch(allGroupListProvider); + simpleGroups.whenData((value) { + simpleGroupsGroupsNotifier.loadTList(value.map((e) => e.id).toList()); }); return simpleGroupsGroupsNotifier; }); diff --git a/lib/admin/providers/user_association_membership_list_provider.dart b/lib/admin/providers/user_association_membership_list_provider.dart index abbc26c39..63671dcd6 100644 --- a/lib/admin/providers/user_association_membership_list_provider.dart +++ b/lib/admin/providers/user_association_membership_list_provider.dart @@ -2,7 +2,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/admin/class/user_association_membership.dart'; import 'package:myecl/admin/repositories/association_membership_user_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class UserMembershiplistNotifier extends ListNotifier { @@ -54,8 +53,6 @@ final myMembershipListProvider = associationMembershipUserRepository: associationMembershipUserRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadPersonalAssociationMembershipsList(); - }); + provider.loadPersonalAssociationMembershipsList(); return provider; }); diff --git a/lib/admin/repositories/account_type_repository.dart b/lib/admin/repositories/account_type_repository.dart index 58c20c6e4..c71df7335 100644 --- a/lib/admin/repositories/account_type_repository.dart +++ b/lib/admin/repositories/account_type_repository.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/account_type.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class AccountTypeRepository extends Repository { @@ -8,6 +7,8 @@ class AccountTypeRepository extends Repository { // ignore: overridden_fields final ext = "users/account-types/"; + AccountTypeRepository(super.ref); + Future> getAccountTypeList() async { return List.from( (await getList()).map((x) => AccountType.fromJson(x)), @@ -16,6 +17,5 @@ class AccountTypeRepository extends Repository { } final accountTypeRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return AccountTypeRepository()..setToken(token); + return AccountTypeRepository(ref); }); diff --git a/lib/admin/repositories/association_membership_repository.dart b/lib/admin/repositories/association_membership_repository.dart index 7345bf2ba..9da1fce9b 100644 --- a/lib/admin/repositories/association_membership_repository.dart +++ b/lib/admin/repositories/association_membership_repository.dart @@ -1,7 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/association_membership_simple.dart'; import 'package:myecl/admin/class/user_association_membership.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -10,6 +9,8 @@ class AssociationMembershipRepository extends Repository { // ignore: overridden_fields final ext = "memberships/"; + AssociationMembershipRepository(super.ref); + Future> getAssociationMembershipList() async { return List.from( (await getList()).map((x) => AssociationMembership.fromJson(x)), @@ -75,6 +76,5 @@ class AssociationMembershipRepository extends Repository { } final associationMembershipRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return AssociationMembershipRepository()..setToken(token); + return AssociationMembershipRepository(ref); }); diff --git a/lib/admin/repositories/association_membership_user_repository.dart b/lib/admin/repositories/association_membership_user_repository.dart index b8eee2203..6e04f3b62 100644 --- a/lib/admin/repositories/association_membership_user_repository.dart +++ b/lib/admin/repositories/association_membership_user_repository.dart @@ -1,7 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/user_association_membership.dart'; import 'package:myecl/admin/class/user_association_membership_base.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class AssociationMembershipUserRepository extends Repository { @@ -9,6 +8,8 @@ class AssociationMembershipUserRepository extends Repository { // ignore: overridden_fields final ext = "memberships/users/"; + AssociationMembershipUserRepository(super.ref); + Future> getPersonalAssociationMembershipList() async { return List.from( @@ -54,6 +55,5 @@ class AssociationMembershipUserRepository extends Repository { } final associationMembershipUserRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return AssociationMembershipUserRepository()..setToken(token); + return AssociationMembershipUserRepository(ref); }); diff --git a/lib/admin/repositories/group_logo_repository.dart b/lib/admin/repositories/group_logo_repository.dart index 6ccbdcc43..977819ac2 100644 --- a/lib/admin/repositories/group_logo_repository.dart +++ b/lib/admin/repositories/group_logo_repository.dart @@ -1,14 +1,14 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/logo_repository.dart'; class GroupLogoRepository extends LogoRepository { @override // ignore: overridden_fields final ext = 'campaign/'; + + GroupLogoRepository(super.ref); } final groupLogoProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return GroupLogoRepository()..setToken(token); + return GroupLogoRepository(ref); }); diff --git a/lib/admin/repositories/group_repository.dart b/lib/admin/repositories/group_repository.dart index 8e3ee29dc..e70079948 100644 --- a/lib/admin/repositories/group_repository.dart +++ b/lib/admin/repositories/group_repository.dart @@ -1,7 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/group.dart'; import 'package:myecl/admin/class/simple_group.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/user/class/simple_users.dart'; import 'dart:convert'; @@ -13,6 +12,8 @@ class GroupRepository extends Repository { // ignore: overridden_fields final ext = "groups/"; + GroupRepository(super.ref); + Future> getGroupList() async { return List.from( (await getList()).map((x) => SimpleGroup.fromJson(x)), @@ -60,6 +61,5 @@ class GroupRepository extends Repository { } final groupRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return GroupRepository()..setToken(token); + return GroupRepository(ref); }); diff --git a/lib/admin/repositories/module_visibility_repository.dart b/lib/admin/repositories/module_visibility_repository.dart index 775548a97..93b06fc87 100644 --- a/lib/admin/repositories/module_visibility_repository.dart +++ b/lib/admin/repositories/module_visibility_repository.dart @@ -1,3 +1,4 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/module_visibility.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -6,6 +7,8 @@ class ModuleVisibilityRepository extends Repository { // ignore: overridden_fields final ext = "module-visibility/"; + ModuleVisibilityRepository(super.ref); + Future> getModuleVisibilityList() async { return List.from( (await getList()).map((x) => ModuleVisibility.fromJson(x)), @@ -43,3 +46,7 @@ class ModuleVisibilityRepository extends Repository { return await delete("$root/account-types/$allowedAccounTypes"); } } + +final moduleVisibilityRepositoryProvider = Provider((ref) { + return ModuleVisibilityRepository(ref); +}); diff --git a/lib/admin/repositories/school_repository.dart b/lib/admin/repositories/school_repository.dart index 32020a36b..b8c78882f 100644 --- a/lib/admin/repositories/school_repository.dart +++ b/lib/admin/repositories/school_repository.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/school.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class SchoolRepository extends Repository { @@ -8,6 +7,8 @@ class SchoolRepository extends Repository { // ignore: overridden_fields final ext = "schools/"; + SchoolRepository(super.ref); + Future> getSchoolList() async { return List.from((await getList()).map((x) => School.fromJson(x))); } @@ -30,6 +31,5 @@ class SchoolRepository extends Repository { } final schoolRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return SchoolRepository()..setToken(token); + return SchoolRepository(ref); }); diff --git a/lib/admin/router.dart b/lib/admin/router.dart index ae6e6cb9e..a4f5b011d 100644 --- a/lib/admin/router.dart +++ b/lib/admin/router.dart @@ -28,9 +28,9 @@ import 'package:myecl/admin/ui/pages/add_edit_structure_page/add_edit_structure_ deferred as add_edit_structure_page; import 'package:myecl/admin/ui/pages/main_page/main_page.dart' deferred as main_page; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class AdminRouter { diff --git a/lib/admin/ui/admin.dart b/lib/admin/ui/admin.dart index 4c5672cb5..16b24b2f7 100644 --- a/lib/admin/ui/admin.dart +++ b/lib/admin/ui/admin.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/admin/router.dart'; import 'package:myecl/admin/tools/constants.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/top_bar.dart'; import 'package:myecl/user/providers/user_provider.dart'; @@ -23,10 +22,8 @@ class AdminTemplate extends HookConsumerWidget { TopBar( title: AdminTextConstants.administration, root: AdminRouter.root, - onMenu: () { - tokenExpireWrapper(ref, () async { - await meNotifier.loadMe(); - }); + onMenu: () async { + await meNotifier.loadMe(); }, ), Expanded(child: child), diff --git a/lib/admin/ui/pages/add_edit_structure_page/add_edit_structure_page.dart b/lib/admin/ui/pages/add_edit_structure_page/add_edit_structure_page.dart index 9c7bd1b15..378125605 100644 --- a/lib/admin/ui/pages/add_edit_structure_page/add_edit_structure_page.dart +++ b/lib/admin/ui/pages/add_edit_structure_page/add_edit_structure_page.dart @@ -14,7 +14,6 @@ import 'package:myecl/paiement/class/structure.dart'; import 'package:myecl/paiement/providers/structure_list_provider.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; import 'package:myecl/tools/ui/layouts/item_chip.dart'; @@ -137,42 +136,38 @@ class AddEditStructurePage extends HookConsumerWidget { return; } if (key.currentState!.validate()) { - await tokenExpireWrapper(ref, () async { - final value = isEdit - ? await structureListNotifier.updateStructure( - Structure( - name: name.text, - associationMembership: - currentMembership.value, - managerUser: structureManager, - id: structure.id, - ), - ) - : await structureListNotifier.createStructure( - Structure( - name: name.text, - associationMembership: - currentMembership.value, - managerUser: structureManager, - id: '', - ), - ); - if (value) { - QR.back(); - structureManagerNotifier.setUser(SimpleUser.empty()); - displayToastWithContext( - TypeMsg.msg, - isEdit - ? AdminTextConstants.editedStructure - : AdminTextConstants.addedStructure, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.addingError, - ); - } - }); + final value = isEdit + ? await structureListNotifier.updateStructure( + Structure( + name: name.text, + associationMembership: currentMembership.value, + managerUser: structureManager, + id: structure.id, + ), + ) + : await structureListNotifier.createStructure( + Structure( + name: name.text, + associationMembership: currentMembership.value, + managerUser: structureManager, + id: '', + ), + ); + if (value) { + QR.back(); + structureManagerNotifier.setUser(SimpleUser.empty()); + displayToastWithContext( + TypeMsg.msg, + isEdit + ? AdminTextConstants.editedStructure + : AdminTextConstants.addedStructure, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.addingError, + ); + } } }, builder: (child) => AdminButton(child: child), diff --git a/lib/admin/ui/pages/groups/add_group_page/add_group_page.dart b/lib/admin/ui/pages/groups/add_group_page/add_group_page.dart index 1c188d93f..8c484dbbe 100644 --- a/lib/admin/ui/pages/groups/add_group_page/add_group_page.dart +++ b/lib/admin/ui/pages/groups/add_group_page/add_group_page.dart @@ -8,7 +8,6 @@ import 'package:myecl/admin/ui/admin.dart'; import 'package:myecl/admin/ui/components/admin_button.dart'; import 'package:myecl/admin/ui/components/text_editing.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -46,27 +45,25 @@ class AddGroupPage extends HookConsumerWidget { ), WaitingButton( onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await groupListNotifier.createGroup( - SimpleGroup( - name: name.text, - description: description.text, - id: '', - ), + final value = await groupListNotifier.createGroup( + SimpleGroup( + name: name.text, + description: description.text, + id: '', + ), + ); + if (value) { + QR.back(); + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.addedGroup, ); - if (value) { - QR.back(); - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.addedGroup, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.addingError, - ); - } - }); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.addingError, + ); + } }, builder: (child) => AdminButton(child: child), child: const Text( diff --git a/lib/admin/ui/pages/groups/add_loaner_page/add_loaner_page.dart b/lib/admin/ui/pages/groups/add_loaner_page/add_loaner_page.dart index aa66a49e8..0adb79427 100644 --- a/lib/admin/ui/pages/groups/add_loaner_page/add_loaner_page.dart +++ b/lib/admin/ui/pages/groups/add_loaner_page/add_loaner_page.dart @@ -8,7 +8,6 @@ import 'package:myecl/loan/class/loaner.dart'; import 'package:myecl/loan/providers/all_loaner_list_provider.dart'; import 'package:myecl/loan/providers/loaner_list_provider.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -51,29 +50,26 @@ class AddLoanerPage extends HookConsumerWidget { children: canAdd .map( (e) => GestureDetector( - onTap: () { + onTap: () async { Loaner newLoaner = Loaner( groupManagerId: e.id, id: '', name: e.name, ); - tokenExpireWrapper(ref, () async { - final value = - await loanerListNotifier - .addLoaner(newLoaner); - if (value) { - QR.back(); - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.addedLoaner, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.addingError, - ); - } - }); + final value = await loanerListNotifier + .addLoaner(newLoaner); + if (value) { + QR.back(); + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.addedLoaner, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.addingError, + ); + } }, child: Container( padding: const EdgeInsets.symmetric( diff --git a/lib/admin/ui/pages/groups/edit_group_page/edit_group_page.dart b/lib/admin/ui/pages/groups/edit_group_page/edit_group_page.dart index e27a78ead..d970548a3 100644 --- a/lib/admin/ui/pages/groups/edit_group_page/edit_group_page.dart +++ b/lib/admin/ui/pages/groups/edit_group_page/edit_group_page.dart @@ -13,7 +13,6 @@ import 'package:myecl/admin/ui/components/admin_button.dart'; import 'package:myecl/admin/ui/pages/groups/edit_group_page/search_user.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/auto_loader_child.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; @@ -98,28 +97,26 @@ class EditGroupPage extends HookConsumerWidget { if (!key.currentState!.validate()) { return; } - await tokenExpireWrapper(ref, () async { - Group newGroup = group.copyWith( - name: name.text, - description: description.text, + Group newGroup = group.copyWith( + name: name.text, + description: description.text, + ); + groupNotifier.setGroup(newGroup); + final value = await groupListNotifier.updateGroup( + newGroup.toSimpleGroup(), + ); + if (value) { + QR.back(); + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatedGroup, ); - groupNotifier.setGroup(newGroup); - final value = await groupListNotifier.updateGroup( - newGroup.toSimpleGroup(), + } else { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatingError, ); - if (value) { - QR.back(); - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatedGroup, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatingError, - ); - } - }); + } }, builder: (child) => AdminButton(child: child), child: const Text( diff --git a/lib/admin/ui/pages/groups/edit_group_page/results.dart b/lib/admin/ui/pages/groups/edit_group_page/results.dart index dbaf39c3c..cd57cc1b6 100644 --- a/lib/admin/ui/pages/groups/edit_group_page/results.dart +++ b/lib/admin/ui/pages/groups/edit_group_page/results.dart @@ -7,7 +7,6 @@ import 'package:myecl/admin/providers/simple_groups_groups_provider.dart'; import 'package:myecl/admin/tools/constants.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/user/providers/user_list_provider.dart'; @@ -53,26 +52,24 @@ class MemberResults extends HookConsumerWidget { Group newGroup = group.value!.copyWith( members: group.value!.members + [e], ); - await tokenExpireWrapper(ref, () async { - groupNotifier.addMember(newGroup, e).then(( - value, - ) { - if (value) { - simpleGroupGroupsNotifier.setTData( - newGroup.id, - AsyncData([newGroup]), - ); - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.addedMember, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.addingError, - ); - } - }); + groupNotifier.addMember(newGroup, e).then(( + value, + ) { + if (value) { + simpleGroupGroupsNotifier.setTData( + newGroup.id, + AsyncData([newGroup]), + ); + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.addedMember, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.addingError, + ); + } }); } }, diff --git a/lib/admin/ui/pages/groups/edit_group_page/search_user.dart b/lib/admin/ui/pages/groups/edit_group_page/search_user.dart index 50253fce5..c26ebf229 100644 --- a/lib/admin/ui/pages/groups/edit_group_page/search_user.dart +++ b/lib/admin/ui/pages/groups/edit_group_page/search_user.dart @@ -13,7 +13,6 @@ import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/loader.dart'; import 'package:myecl/tools/ui/widgets/styled_search_bar.dart'; import 'package:myecl/user/providers/user_list_provider.dart'; @@ -113,32 +112,30 @@ class SearchUser extends HookConsumerWidget { descriptions: AdminTextConstants.removeGroupMember, title: AdminTextConstants.deleting, onYes: () async { - await tokenExpireWrapper(ref, () async { - Group newGroup = g[0].copyWith( - members: g[0].members - .where((element) => element.id != x.id) - .toList(), + Group newGroup = g[0].copyWith( + members: g[0].members + .where((element) => element.id != x.id) + .toList(), + ); + final value = await groupNotifier.deleteMember( + newGroup, + x, + ); + if (value) { + simpleGroupGroupsNotifier.setTData( + newGroup.id, + AsyncData([newGroup]), ); - final value = await groupNotifier.deleteMember( - newGroup, - x, + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatedGroup, ); - if (value) { - simpleGroupGroupsNotifier.setTData( - newGroup.id, - AsyncData([newGroup]), - ); - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatedGroup, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatingError, - ); - } - }); + } else { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatingError, + ); + } }, ), ); diff --git a/lib/admin/ui/pages/groups/group_page/group_page.dart b/lib/admin/ui/pages/groups/group_page/group_page.dart index a175d6b21..1ea229835 100644 --- a/lib/admin/ui/pages/groups/group_page/group_page.dart +++ b/lib/admin/ui/pages/groups/group_page/group_page.dart @@ -14,7 +14,6 @@ import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/providers/user_list_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -147,21 +146,19 @@ class GroupsPage extends HookConsumerWidget { descriptions: AdminTextConstants.deleteGroup, onYes: () async { - tokenExpireWrapper(ref, () async { - final value = await groupsNotifier - .deleteGroup(group); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.deletedGroup, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.deletingError, - ); - } - }); + final value = await groupsNotifier + .deleteGroup(group); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.deletedGroup, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.deletingError, + ); + } }, ); }, diff --git a/lib/admin/ui/pages/memberships/add_edit_user_membership_page/add_edit_user_membership_page.dart b/lib/admin/ui/pages/memberships/add_edit_user_membership_page/add_edit_user_membership_page.dart index 7a9b6ff66..eb51702f4 100644 --- a/lib/admin/ui/pages/memberships/add_edit_user_membership_page/add_edit_user_membership_page.dart +++ b/lib/admin/ui/pages/memberships/add_edit_user_membership_page/add_edit_user_membership_page.dart @@ -10,7 +10,6 @@ import 'package:myecl/admin/ui/admin.dart'; import 'package:myecl/admin/ui/pages/memberships/add_edit_user_membership_page/search_result.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; @@ -60,13 +59,11 @@ class AddEditUserMembershipPage extends HookConsumerWidget { label: AdminTextConstants.user, editingController: queryController, onChanged: (value) async { - tokenExpireWrapper(ref, () async { - if (value.isNotEmpty) { - await usersNotifier.filterUsers(value); - } else { - usersNotifier.clear(); - } - }); + if (value.isNotEmpty) { + await usersNotifier.filterUsers(value); + } else { + usersNotifier.clear(); + } }, ), SearchResult(queryController: queryController), @@ -133,66 +130,62 @@ class AddEditUserMembershipPage extends HookConsumerWidget { return; } - tokenExpireWrapper(ref, () async { - if (DateTime.parse( - processDateBack(start.text), - ).isAfter(DateTime.parse(processDateBack(end.text)))) { + if (DateTime.parse( + processDateBack(start.text), + ).isAfter(DateTime.parse(processDateBack(end.text)))) { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.dateError, + ); + return; + } + if (isEdit) { + final value = await associationMembershipMembersNotifier + .updateMember( + membership.copyWith( + startDate: DateTime.parse( + processDateBack(start.text), + ), + endDate: DateTime.parse(processDateBack(end.text)), + ), + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatedMembership, + ); + QR.back(); + } else { displayToastWithContext( TypeMsg.error, - AdminTextConstants.dateError, + AdminTextConstants.membershipUpdatingError, ); - return; } - if (isEdit) { - final value = await associationMembershipMembersNotifier - .updateMember( - membership.copyWith( - startDate: DateTime.parse( - processDateBack(start.text), - ), - endDate: DateTime.parse( - processDateBack(end.text), - ), - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatedMembership, - ); - QR.back(); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.membershipUpdatingError, - ); - } + } else { + // Test if the membership already exists with (association_id,member_id,mandate_year) + final membershipAdd = UserAssociationMembershipBase( + id: "", + associationMembershipId: + membership.associationMembershipId, + userId: membership.user.id, + startDate: DateTime.parse(processDateBack(start.text)), + endDate: DateTime.parse(processDateBack(end.text)), + ); + final value = await associationMembershipMembersNotifier + .addMember(membershipAdd, membership.user); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.addedMember, + ); + QR.back(); } else { - // Test if the membership already exists with (association_id,member_id,mandate_year) - final membershipAdd = UserAssociationMembershipBase( - id: "", - associationMembershipId: - membership.associationMembershipId, - userId: membership.user.id, - startDate: DateTime.parse(processDateBack(start.text)), - endDate: DateTime.parse(processDateBack(end.text)), + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.membershipAddingError, ); - final value = await associationMembershipMembersNotifier - .addMember(membershipAdd, membership.user); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.addedMember, - ); - QR.back(); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.membershipAddingError, - ); - } } - }); + } }, ), ], diff --git a/lib/admin/ui/pages/memberships/association_membership_detail_page/association_membership_information_editor.dart b/lib/admin/ui/pages/memberships/association_membership_detail_page/association_membership_information_editor.dart index 14211454d..3fa3d7988 100644 --- a/lib/admin/ui/pages/memberships/association_membership_detail_page/association_membership_information_editor.dart +++ b/lib/admin/ui/pages/memberships/association_membership_detail_page/association_membership_information_editor.dart @@ -8,7 +8,6 @@ import 'package:myecl/admin/providers/association_membership_provider.dart'; import 'package:myecl/admin/tools/constants.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; @@ -122,29 +121,27 @@ class AssociationMembershipInformationEditor extends HookConsumerWidget { return; } - await tokenExpireWrapper(ref, () async { - final value = await associationMembershipListNotifier - .updateAssociationMembership( - associationMembership.copyWith(name: name.text), - ); - if (value) { - associationMembershipNotifier.setAssociationMembership( - associationMembership.copyWith( - name: name.text, - managerGroupId: groupIdController.text, - ), - ); - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatedAssociationMembership, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatingError, + final value = await associationMembershipListNotifier + .updateAssociationMembership( + associationMembership.copyWith(name: name.text), ); - } - }); + if (value) { + associationMembershipNotifier.setAssociationMembership( + associationMembership.copyWith( + name: name.text, + managerGroupId: groupIdController.text, + ), + ); + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatedAssociationMembership, + ); + } else { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatingError, + ); + } }, child: const Text( AdminTextConstants.edit, diff --git a/lib/admin/ui/pages/memberships/association_membership_detail_page/association_membership_member_editable_card.dart b/lib/admin/ui/pages/memberships/association_membership_detail_page/association_membership_member_editable_card.dart index 5ad216f16..062a52485 100644 --- a/lib/admin/ui/pages/memberships/association_membership_detail_page/association_membership_member_editable_card.dart +++ b/lib/admin/ui/pages/memberships/association_membership_detail_page/association_membership_member_editable_card.dart @@ -9,7 +9,6 @@ import 'package:myecl/phonebook/ui/pages/admin_page/delete_button.dart'; import 'package:myecl/phonebook/ui/pages/admin_page/edition_button.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/phonebook/tools/constants.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:qlevar_router/qlevar_router.dart'; class MemberEditableCard extends HookConsumerWidget { @@ -88,21 +87,19 @@ class MemberEditableCard extends HookConsumerWidget { deactivated: false, deletion: true, onDelete: () async { - await tokenExpireWrapper(ref, () async { - final result = await associationMembershipMemberListNotifier - .deleteMember(associationMembership); - if (result) { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.deletedMember, - ); - } else { - displayToastWithContext( - TypeMsg.error, - PhonebookTextConstants.deletingError, - ); - } - }); + final result = await associationMembershipMemberListNotifier + .deleteMember(associationMembership); + if (result) { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.deletedMember, + ); + } else { + displayToastWithContext( + TypeMsg.error, + PhonebookTextConstants.deletingError, + ); + } }, ), ], diff --git a/lib/admin/ui/pages/memberships/association_membership_detail_page/search_filters.dart b/lib/admin/ui/pages/memberships/association_membership_detail_page/search_filters.dart index 1d2121f48..1661de423 100644 --- a/lib/admin/ui/pages/memberships/association_membership_detail_page/search_filters.dart +++ b/lib/admin/ui/pages/memberships/association_membership_detail_page/search_filters.dart @@ -6,7 +6,6 @@ import 'package:myecl/admin/providers/association_membership_provider.dart'; import 'package:myecl/admin/tools/constants.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/date_entry.dart'; @@ -108,28 +107,22 @@ class SearchFilters extends HookConsumerWidget { width: MediaQuery.of(context).size.width * 0.3, child: WaitingButton( onTap: () async { - await tokenExpireWrapper(ref, () async { - await associationMembershipMemberListNotifier - .loadAssociationMembershipMembers( - associationMembership.id, - minimalStartDate: startMinimal.text.isNotEmpty - ? DateTime.parse( - processDateBack(startMinimal.text), - ) - : null, - minimalEndDate: endMinimal.text.isNotEmpty - ? DateTime.parse(processDateBack(endMinimal.text)) - : null, - maximalStartDate: startMaximal.text.isNotEmpty - ? DateTime.parse( - processDateBack(startMaximal.text), - ) - : null, - maximalEndDate: endMaximal.text.isNotEmpty - ? DateTime.parse(processDateBack(endMaximal.text)) - : null, - ); - }); + await associationMembershipMemberListNotifier + .loadAssociationMembershipMembers( + associationMembership.id, + minimalStartDate: startMinimal.text.isNotEmpty + ? DateTime.parse(processDateBack(startMinimal.text)) + : null, + minimalEndDate: endMinimal.text.isNotEmpty + ? DateTime.parse(processDateBack(endMinimal.text)) + : null, + maximalStartDate: startMaximal.text.isNotEmpty + ? DateTime.parse(processDateBack(startMaximal.text)) + : null, + maximalEndDate: endMaximal.text.isNotEmpty + ? DateTime.parse(processDateBack(endMaximal.text)) + : null, + ); }, builder: (child) => AddEditButtonLayout( colors: const [ @@ -158,12 +151,10 @@ class SearchFilters extends HookConsumerWidget { startMinimal.clear(); endMaximal.clear(); endMinimal.clear(); - await tokenExpireWrapper(ref, () async { - await associationMembershipMemberListNotifier - .loadAssociationMembershipMembers( - associationMembership.id, - ); - }); + await associationMembershipMemberListNotifier + .loadAssociationMembershipMembers( + associationMembership.id, + ); }, builder: (child) => AddEditButtonLayout( colors: const [ diff --git a/lib/admin/ui/pages/memberships/association_membership_page/association_membership_page.dart b/lib/admin/ui/pages/memberships/association_membership_page/association_membership_page.dart index 0e3978f0a..1c866b9bb 100644 --- a/lib/admin/ui/pages/memberships/association_membership_page/association_membership_page.dart +++ b/lib/admin/ui/pages/memberships/association_membership_page/association_membership_page.dart @@ -17,7 +17,6 @@ import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:qlevar_router/qlevar_router.dart'; class AssociationMembershipsPage extends HookConsumerWidget { @@ -88,32 +87,29 @@ class AssociationMembershipsPage extends HookConsumerWidget { nameController: nameController, groupIdController: groupIdController, onYes: () async { - tokenExpireWrapper(ref, () async { - final value = - await associationMembershipsNotifier - .createAssociationMembership( - AssociationMembership.empty() - .copyWith( - managerGroupId: - groupIdController - .text, - name: - nameController.text, - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants - .createdAssociationMembership, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.creationError, - ); - } - }); + final value = + await associationMembershipsNotifier + .createAssociationMembership( + AssociationMembership.empty() + .copyWith( + managerGroupId: + groupIdController + .text, + name: nameController.text, + ), + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants + .createdAssociationMembership, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.creationError, + ); + } }, ); }, @@ -158,25 +154,23 @@ class AssociationMembershipsPage extends HookConsumerWidget { descriptions: AdminTextConstants .deleteAssociationMembership, onYes: () async { - tokenExpireWrapper(ref, () async { - final value = - await associationMembershipsNotifier - .deleteAssociationMembership( - associationMembership, - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants - .deletedAssociationMembership, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.deletingError, - ); - } - }); + final value = + await associationMembershipsNotifier + .deleteAssociationMembership( + associationMembership, + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants + .deletedAssociationMembership, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.deletingError, + ); + } }, ); }, diff --git a/lib/admin/ui/pages/schools/add_school_page/add_school_page.dart b/lib/admin/ui/pages/schools/add_school_page/add_school_page.dart index 88491d437..b654c93f1 100644 --- a/lib/admin/ui/pages/schools/add_school_page/add_school_page.dart +++ b/lib/admin/ui/pages/schools/add_school_page/add_school_page.dart @@ -8,7 +8,6 @@ import 'package:myecl/admin/ui/admin.dart'; import 'package:myecl/admin/ui/components/admin_button.dart'; import 'package:myecl/admin/ui/components/text_editing.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -46,27 +45,25 @@ class AddSchoolPage extends HookConsumerWidget { ), WaitingButton( onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await schoolListNotifier.createSchool( - School( - name: name.text, - emailRegex: emailRegex.text, - id: '', - ), + final value = await schoolListNotifier.createSchool( + School( + name: name.text, + emailRegex: emailRegex.text, + id: '', + ), + ); + if (value) { + QR.back(); + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.addedSchool, ); - if (value) { - QR.back(); - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.addedSchool, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.addingError, - ); - } - }); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.addingError, + ); + } }, builder: (child) => AdminButton(child: child), child: const Text( diff --git a/lib/admin/ui/pages/schools/edit_school_page/edit_school_page.dart b/lib/admin/ui/pages/schools/edit_school_page/edit_school_page.dart index deeea7e33..64ea0adaa 100644 --- a/lib/admin/ui/pages/schools/edit_school_page/edit_school_page.dart +++ b/lib/admin/ui/pages/schools/edit_school_page/edit_school_page.dart @@ -10,7 +10,6 @@ import 'package:myecl/admin/ui/admin.dart'; import 'package:myecl/admin/ui/components/admin_button.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; @@ -78,28 +77,26 @@ class EditSchoolPage extends HookConsumerWidget { if (!key.currentState!.validate()) { return; } - await tokenExpireWrapper(ref, () async { - School newSchool = school.copyWith( - name: name.text, - emailRegex: emailRegex.text, + School newSchool = school.copyWith( + name: name.text, + emailRegex: emailRegex.text, + ); + schoolNotifier.setSchool(newSchool); + final value = await schoolListNotifier.updateSchool( + newSchool, + ); + if (value) { + QR.back(); + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatedGroup, ); - schoolNotifier.setSchool(newSchool); - final value = await schoolListNotifier.updateSchool( - newSchool, + } else { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.updatingError, ); - if (value) { - QR.back(); - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatedGroup, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.updatingError, - ); - } - }); + } }, builder: (child) => AdminButton(child: child), child: const Text( diff --git a/lib/admin/ui/pages/schools/school_page/school_page.dart b/lib/admin/ui/pages/schools/school_page/school_page.dart index 168685562..461c348b3 100644 --- a/lib/admin/ui/pages/schools/school_page/school_page.dart +++ b/lib/admin/ui/pages/schools/school_page/school_page.dart @@ -13,7 +13,6 @@ import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/providers/user_list_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -103,21 +102,19 @@ class SchoolsPage extends HookConsumerWidget { descriptions: AdminTextConstants.deleteSchool, onYes: () async { - tokenExpireWrapper(ref, () async { - final value = await schoolsNotifier - .deleteSchool(school); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.deletedSchool, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.deletingError, - ); - } - }); + final value = await schoolsNotifier + .deleteSchool(school); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.deletedSchool, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.deletingError, + ); + } }, ); }, diff --git a/lib/admin/ui/pages/structure_page/structure_page.dart b/lib/admin/ui/pages/structure_page/structure_page.dart index 864e94819..8d1d51d05 100644 --- a/lib/admin/ui/pages/structure_page/structure_page.dart +++ b/lib/admin/ui/pages/structure_page/structure_page.dart @@ -15,7 +15,6 @@ import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/class/simple_users.dart'; import 'package:myecl/user/providers/user_list_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -117,21 +116,19 @@ class StructurePage extends HookConsumerWidget { descriptions: AdminTextConstants.deleteGroup, onYes: () async { - tokenExpireWrapper(ref, () async { - final value = await structuresNotifier - .deleteStructure(structure); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdminTextConstants.deletedGroup, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdminTextConstants.deletingError, - ); - } - }); + final value = await structuresNotifier + .deleteStructure(structure); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdminTextConstants.deletedGroup, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.deletingError, + ); + } }, ); }, diff --git a/lib/advert/providers/advert_list_provider.dart b/lib/advert/providers/advert_list_provider.dart index d52169e89..a7c028561 100644 --- a/lib/advert/providers/advert_list_provider.dart +++ b/lib/advert/providers/advert_list_provider.dart @@ -1,16 +1,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/advert/class/advert.dart'; import 'package:myecl/advert/repositories/advert_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AdvertListNotifier extends ListNotifier { - AdvertRepository repository = AdvertRepository(); - AdvertListNotifier({required String token}) - : super(const AsyncValue.loading()) { - repository.setToken(token); - } + final AdvertRepository repository; + AdvertListNotifier(this.repository) : super(const AsyncValue.loading()); Future>> loadAdverts() async { return await loadList(repository.getAllAdvert); @@ -41,10 +36,8 @@ class AdvertListNotifier extends ListNotifier { final advertListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - AdvertListNotifier notifier = AdvertListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadAdverts(); - }); + final repository = ref.watch(advertRepositoryProvider); + AdvertListNotifier notifier = AdvertListNotifier(repository); + notifier.loadAdverts(); return notifier; }); diff --git a/lib/advert/providers/advert_poster_provider.dart b/lib/advert/providers/advert_poster_provider.dart index e9866d8bb..32eb4e6ff 100644 --- a/lib/advert/providers/advert_poster_provider.dart +++ b/lib/advert/providers/advert_poster_provider.dart @@ -4,19 +4,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/advert/providers/advert_posters_provider.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/advert/repositories/advert_poster_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; class AdvertPosterNotifier extends SingleNotifier { - final advertPosterRepository = AdvertPosterRepository(); + final AdvertPosterRepository advertPosterRepository; final AdvertPostersNotifier advertPostersNotifier; AdvertPosterNotifier({ - required String token, required this.advertPostersNotifier, - }) : super(const AsyncValue.loading()) { - advertPosterRepository.setToken(token); - } + required this.advertPosterRepository, + }) : super(const AsyncValue.loading()); Future getAdvertPoster(String id) async { final image = await advertPosterRepository.getAdvertPoster(id); @@ -34,10 +31,9 @@ class AdvertPosterNotifier extends SingleNotifier { final advertPosterProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); final advertPostersNotifier = ref.watch(advertPostersProvider.notifier); return AdvertPosterNotifier( - token: token, advertPostersNotifier: advertPostersNotifier, + advertPosterRepository: ref.watch(advertPosterRepositoryProvider), ); }); diff --git a/lib/advert/providers/announcer_list_provider.dart b/lib/advert/providers/announcer_list_provider.dart index a22ce3641..0b0906123 100644 --- a/lib/advert/providers/announcer_list_provider.dart +++ b/lib/advert/providers/announcer_list_provider.dart @@ -1,16 +1,12 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/advert/class/announcer.dart'; import 'package:myecl/advert/repositories/announcer_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AnnouncerListNotifier extends ListNotifier { - final AnnouncerRepository _announcerRepository = AnnouncerRepository(); - AnnouncerListNotifier({required String token}) - : super(const AsyncValue.loading()) { - _announcerRepository.setToken(token); - } + final AnnouncerRepository _announcerRepository; + AnnouncerListNotifier(this._announcerRepository) + : super(const AsyncValue.loading()); Future>> loadAllAnnouncerList() async { return await loadList(_announcerRepository.getAllAnnouncer); @@ -48,13 +44,11 @@ final announcerListProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); + final repository = ref.watch(announcerRepositoryProvider); AnnouncerListNotifier announcerListNotifier = AnnouncerListNotifier( - token: token, + repository, ); - tokenExpireWrapperAuth(ref, () async { - await announcerListNotifier.loadAllAnnouncerList(); - }); + announcerListNotifier.loadAllAnnouncerList(); return announcerListNotifier; }); @@ -62,12 +56,10 @@ final userAnnouncerListProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); + final repository = ref.watch(announcerRepositoryProvider); AnnouncerListNotifier announcerListNotifier = AnnouncerListNotifier( - token: token, + repository, ); - tokenExpireWrapperAuth(ref, () async { - await announcerListNotifier.loadMyAnnouncerList(); - }); + announcerListNotifier.loadMyAnnouncerList(); return announcerListNotifier; }); diff --git a/lib/advert/repositories/advert_poster_repository.dart b/lib/advert/repositories/advert_poster_repository.dart index 237c90437..a02788f5a 100644 --- a/lib/advert/repositories/advert_poster_repository.dart +++ b/lib/advert/repositories/advert_poster_repository.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/repository/logo_repository.dart'; @@ -10,6 +11,8 @@ class AdvertPosterRepository extends LogoRepository { // ignore: overridden_fields final ext = "advert/"; + AdvertPosterRepository(super.ref); + Future getAdvertPoster(String id) async { final uint8List = await getLogo("", suffix: "adverts/$id/picture"); if (uint8List.isEmpty) { @@ -23,3 +26,7 @@ class AdvertPosterRepository extends LogoRepository { return Image.memory(uint8List); } } + +final advertPosterRepositoryProvider = Provider((ref) { + return AdvertPosterRepository(ref); +}); diff --git a/lib/advert/repositories/advert_repository.dart b/lib/advert/repositories/advert_repository.dart index 613ed59b5..89cbe232a 100644 --- a/lib/advert/repositories/advert_repository.dart +++ b/lib/advert/repositories/advert_repository.dart @@ -1,3 +1,4 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/advert/class/advert.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -6,6 +7,8 @@ class AdvertRepository extends Repository { // ignore: overridden_fields final ext = 'advert/'; + AdvertRepository(super.ref); + Future> getAllAdvert() async { return (await getList( suffix: 'adverts', @@ -28,3 +31,7 @@ class AdvertRepository extends Repository { return await delete("adverts/$id"); } } + +final advertRepositoryProvider = Provider((ref) { + return AdvertRepository(ref); +}); diff --git a/lib/advert/repositories/announcer_repository.dart b/lib/advert/repositories/announcer_repository.dart index 9ec7e3ffb..d305ab0b9 100644 --- a/lib/advert/repositories/announcer_repository.dart +++ b/lib/advert/repositories/announcer_repository.dart @@ -1,3 +1,4 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/advert/class/announcer.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -6,6 +7,8 @@ class AnnouncerRepository extends Repository { // ignore: overridden_fields final ext = "advert/"; + AnnouncerRepository(super.ref); + Future> getAllAnnouncer() async { return List.from( (await getList(suffix: "advertisers")).map((x) => Announcer.fromJson(x)), @@ -38,3 +41,7 @@ class AnnouncerRepository extends Repository { return await delete("advertisers/$announcerId"); } } + +final announcerRepositoryProvider = Provider((ref) { + return AnnouncerRepository(ref); +}); diff --git a/lib/advert/repositories/tag_repository.dart b/lib/advert/repositories/tag_repository.dart index 8ac99873e..ba299a20b 100644 --- a/lib/advert/repositories/tag_repository.dart +++ b/lib/advert/repositories/tag_repository.dart @@ -6,6 +6,8 @@ class TagRepository extends Repository { // ignore: overridden_fields final ext = "advert/tag/"; + TagRepository(super.ref); + Future> getAllTag() async { return (await getList()).map((e) => Tag.fromJson(e)).toList(); } diff --git a/lib/advert/router.dart b/lib/advert/router.dart index 72bab319a..c22eea7d0 100644 --- a/lib/advert/router.dart +++ b/lib/advert/router.dart @@ -14,9 +14,9 @@ import 'package:myecl/advert/ui/pages/form_page/add_rem_announcer_page.dart' import 'package:myecl/advert/ui/pages/main_page/main_page.dart' deferred as main_page; import 'package:myecl/drawer/class/module.dart'; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class AdvertRouter { diff --git a/lib/advert/ui/pages/form_page/add_edit_advert_page.dart b/lib/advert/ui/pages/form_page/add_edit_advert_page.dart index ade8a5611..1ab66615b 100644 --- a/lib/advert/ui/pages/form_page/add_edit_advert_page.dart +++ b/lib/advert/ui/pages/form_page/add_edit_advert_page.dart @@ -17,7 +17,6 @@ import 'package:myecl/advert/tools/constants.dart'; import 'package:myecl/advert/ui/pages/advert.dart'; import 'package:myecl/advert/ui/components/announcer_bar.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/image_picker_on_tap.dart'; @@ -221,62 +220,58 @@ class AdvertAddEditAdvertPage extends HookConsumerWidget { if (key.currentState!.validate() && selectedAnnouncers.isNotEmpty && (poster.value != null || isEdit)) { - await tokenExpireWrapper(ref, () async { - final advertList = ref.watch(advertListProvider); - Advert newAdvert = Advert( - id: isEdit ? advert.id : '', - announcer: selectedAnnouncers[0], - content: content.text, - date: isEdit ? advert.date : DateTime.now(), - tags: textTagsController.text.split(', '), - title: title.text, - ); - final value = isEdit - ? await advertListNotifier.updateAdvert( - newAdvert, - ) - : await advertListNotifier.addAdvert(newAdvert); - if (value) { - QR.back(); - if (isEdit) { - displayAdvertToastWithContext( - TypeMsg.msg, - AdvertTextConstants.editedAdvert, - ); - advertList.maybeWhen( - data: (list) { - if (poster.value != null) { - posterNotifier.updateAdvertPoster( - advert.id, - poster.value!, - ); - } - }, - orElse: () {}, - ); - } else { - displayAdvertToastWithContext( - TypeMsg.msg, - AdvertTextConstants.addedAdvert, - ); - advertList.maybeWhen( - data: (list) { - final newAdvert = list.last; + final advertList = ref.watch(advertListProvider); + Advert newAdvert = Advert( + id: isEdit ? advert.id : '', + announcer: selectedAnnouncers[0], + content: content.text, + date: isEdit ? advert.date : DateTime.now(), + tags: textTagsController.text.split(', '), + title: title.text, + ); + final value = isEdit + ? await advertListNotifier.updateAdvert(newAdvert) + : await advertListNotifier.addAdvert(newAdvert); + if (value) { + QR.back(); + if (isEdit) { + displayAdvertToastWithContext( + TypeMsg.msg, + AdvertTextConstants.editedAdvert, + ); + advertList.maybeWhen( + data: (list) { + if (poster.value != null) { posterNotifier.updateAdvertPoster( - newAdvert.id, + advert.id, poster.value!, ); - }, - orElse: () {}, - ); - } + } + }, + orElse: () {}, + ); } else { displayAdvertToastWithContext( - TypeMsg.error, - AdvertTextConstants.editingError, + TypeMsg.msg, + AdvertTextConstants.addedAdvert, + ); + advertList.maybeWhen( + data: (list) { + final newAdvert = list.last; + posterNotifier.updateAdvertPoster( + newAdvert.id, + poster.value!, + ); + }, + orElse: () {}, ); } - }); + } else { + displayAdvertToastWithContext( + TypeMsg.error, + AdvertTextConstants.editingError, + ); + } } else { displayToast( context, diff --git a/lib/advert/ui/pages/form_page/add_rem_announcer_page.dart b/lib/advert/ui/pages/form_page/add_rem_announcer_page.dart index 70eeb1c60..8c4093ad7 100644 --- a/lib/advert/ui/pages/form_page/add_rem_announcer_page.dart +++ b/lib/advert/ui/pages/form_page/add_rem_announcer_page.dart @@ -10,7 +10,6 @@ import 'package:myecl/advert/ui/pages/advert.dart'; import 'package:myecl/advert/ui/pages/form_page/announcer_card.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; @@ -67,35 +66,33 @@ class AddRemAnnouncerPage extends HookConsumerWidget { canAdd .map( (e) => GestureDetector( - onTap: () { + onTap: () async { Announcer newAnnouncer = Announcer( groupManagerId: e.id, id: '', name: e.name, ); - tokenExpireWrapper(ref, () async { - final value = - await announcerListNotifier - .addAnnouncer( - newAnnouncer, - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdvertTextConstants - .addedAnnouncer, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdvertTextConstants - .addingError, - ); - } - announcerListNotifier - .loadAllAnnouncerList(); - }); + final value = + await announcerListNotifier + .addAnnouncer( + newAnnouncer, + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdvertTextConstants + .addedAnnouncer, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdvertTextConstants + .addingError, + ); + } + announcerListNotifier + .loadAllAnnouncerList(); }, child: AnnouncerCard( e: e, @@ -117,34 +114,35 @@ class AddRemAnnouncerPage extends HookConsumerWidget { descriptions: AdvertTextConstants .deleteAnnouncer, - onYes: () { - tokenExpireWrapper(ref, () async { - final value = await announcerListNotifier - .deleteAnnouncer( - announcers - .where( - (element) => - e.id == - e.id, - ) - .toList()[0], - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AdvertTextConstants - .removedAnnouncer, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AdvertTextConstants - .removingError, - ); - } - announcerListNotifier - .loadAllAnnouncerList(); - }); + onYes: () async { + final value = + await announcerListNotifier + .deleteAnnouncer( + announcers + .where( + ( + element, + ) => + e.id == + e.id, + ) + .toList()[0], + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AdvertTextConstants + .removedAnnouncer, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdvertTextConstants + .removingError, + ); + } + announcerListNotifier + .loadAllAnnouncerList(); }, ); }, diff --git a/lib/amap/providers/cash_list_provider.dart b/lib/amap/providers/cash_list_provider.dart index 520a84663..d09521e28 100644 --- a/lib/amap/providers/cash_list_provider.dart +++ b/lib/amap/providers/cash_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/cash.dart'; import 'package:myecl/amap/repositories/cash_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class CashListProvider extends ListNotifier { final CashRepository cashRepository; @@ -65,8 +64,6 @@ final cashListProvider = CashListProvider cashListProvider = CashListProvider( cashRepository: cashRepository, ); - tokenExpireWrapperAuth(ref, () async { - await cashListProvider.loadCashList(); - }); + cashListProvider.loadCashList(); return cashListProvider; }); diff --git a/lib/amap/providers/delivery_list_provider.dart b/lib/amap/providers/delivery_list_provider.dart index 70aad844f..0c92a93bf 100644 --- a/lib/amap/providers/delivery_list_provider.dart +++ b/lib/amap/providers/delivery_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/delivery.dart'; import 'package:myecl/amap/repositories/delivery_list_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class DeliveryListNotifier extends ListNotifier { final DeliveryListRepository deliveriesListRepository; @@ -114,9 +113,7 @@ final deliveryListProvider = DeliveryListNotifier orderListNotifier = DeliveryListNotifier( deliveriesListRepository: deliveryListRepository, ); - tokenExpireWrapperAuth(ref, () async { - await orderListNotifier.loadDeliveriesList(); - }); + orderListNotifier.loadDeliveriesList(); return orderListNotifier; }); diff --git a/lib/amap/providers/delivery_order_list_provider.dart b/lib/amap/providers/delivery_order_list_provider.dart index 14808566e..a04bd89be 100644 --- a/lib/amap/providers/delivery_order_list_provider.dart +++ b/lib/amap/providers/delivery_order_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/order.dart'; import 'package:myecl/amap/providers/delivery_list_provider.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AdminDeliveryOrderListNotifier extends MapNotifier { AdminDeliveryOrderListNotifier() : super(); @@ -15,9 +14,7 @@ final adminDeliveryOrderListProvider = >((ref) { AdminDeliveryOrderListNotifier orderListNotifier = AdminDeliveryOrderListNotifier(); - tokenExpireWrapperAuth(ref, () async { - final deliveries = ref.watch(deliveryList); - orderListNotifier.loadTList(deliveries.map((e) => e.id).toList()); - }); + final deliveries = ref.watch(deliveryList); + orderListNotifier.loadTList(deliveries.map((e) => e.id).toList()); return orderListNotifier; }); diff --git a/lib/amap/providers/information_provider.dart b/lib/amap/providers/information_provider.dart index a5c722f73..17160e788 100644 --- a/lib/amap/providers/information_provider.dart +++ b/lib/amap/providers/information_provider.dart @@ -2,7 +2,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/amap/class/information.dart'; import 'package:myecl/amap/repositories/information_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class InformationNotifier extends SingleNotifier { final InformationRepository informationRepository; @@ -35,8 +34,6 @@ final informationProvider = InformationNotifier informationNotifier = InformationNotifier( informationRepository: informationRepository, ); - tokenExpireWrapperAuth(ref, () async { - informationNotifier.loadInformation(); - }); + informationNotifier.loadInformation(); return informationNotifier; }); diff --git a/lib/amap/providers/product_list_provider.dart b/lib/amap/providers/product_list_provider.dart index 3481df03f..738c31639 100644 --- a/lib/amap/providers/product_list_provider.dart +++ b/lib/amap/providers/product_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/product.dart'; import 'package:myecl/amap/repositories/product_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ProductListNotifier extends ListNotifier { final ProductListRepository productListRepository; @@ -44,8 +43,6 @@ final productListProvider = ProductListNotifier productListNotifier = ProductListNotifier( productListRepository: productListRepository, ); - tokenExpireWrapperAuth(ref, () async { - productListNotifier.loadProductList(); - }); + productListNotifier.loadProductList(); return productListNotifier; }); diff --git a/lib/amap/providers/user_amount_provider.dart b/lib/amap/providers/user_amount_provider.dart index 19dbbd433..e808ebb34 100644 --- a/lib/amap/providers/user_amount_provider.dart +++ b/lib/amap/providers/user_amount_provider.dart @@ -3,7 +3,6 @@ import 'package:myecl/amap/class/cash.dart'; import 'package:myecl/amap/repositories/amap_user_repository.dart'; import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class UserCashNotifier extends SingleNotifier { final AmapUserRepository amapUserRepository; @@ -41,11 +40,7 @@ final userAmountProvider = UserCashNotifier userCashNotifier = UserCashNotifier( amapUserRepository: amapUserRepository, ); - tokenExpireWrapperAuth(ref, () async { - final userId = ref.watch(idProvider); - userId.whenData( - (value) async => await userCashNotifier.loadCashByUser(value), - ); - }); + final userId = ref.watch(userIdProvider); + userId.whenData((value) async => userCashNotifier.loadCashByUser(value)); return userCashNotifier; }); diff --git a/lib/amap/providers/user_order_list_provider.dart b/lib/amap/providers/user_order_list_provider.dart index 67a5f7836..e7e2f4392 100644 --- a/lib/amap/providers/user_order_list_provider.dart +++ b/lib/amap/providers/user_order_list_provider.dart @@ -6,7 +6,6 @@ import 'package:myecl/amap/repositories/order_list_repository.dart'; import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/exception.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class UserOrderListNotifier extends ListNotifier { final OrderListRepository orderListRepository; @@ -175,11 +174,9 @@ final userOrderListProvider = userRepository: amapUserRepository, orderListRepository: orderListRepository, ); - tokenExpireWrapperAuth(ref, () async { - final userId = ref.watch(idProvider); - userId.whenData( - (value) async => await userOrderListNotifier.loadOrderList(value), - ); - }); + final userId = ref.watch(userIdProvider); + userId.whenData( + (value) async => userOrderListNotifier.loadOrderList(value), + ); return userOrderListNotifier; }); diff --git a/lib/amap/repositories/amap_user_repository.dart b/lib/amap/repositories/amap_user_repository.dart index b23419c23..aad712736 100644 --- a/lib/amap/repositories/amap_user_repository.dart +++ b/lib/amap/repositories/amap_user_repository.dart @@ -1,7 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/cash.dart'; import 'package:myecl/amap/class/order.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class AmapUserRepository extends Repository { @@ -9,6 +8,8 @@ class AmapUserRepository extends Repository { // ignore: overridden_fields final ext = "amap/users/"; + AmapUserRepository(super.ref); + Future> getOrderList(String userId) async { return List.from( (await getList(suffix: "$userId/orders")).map((x) => Order.fromJson(x)), @@ -21,6 +22,5 @@ class AmapUserRepository extends Repository { } final amapUserRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return AmapUserRepository()..setToken(token); + return AmapUserRepository(ref); }); diff --git a/lib/amap/repositories/cash_repository.dart b/lib/amap/repositories/cash_repository.dart index 0750de99f..d281f6975 100644 --- a/lib/amap/repositories/cash_repository.dart +++ b/lib/amap/repositories/cash_repository.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/cash.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class CashRepository extends Repository { @@ -8,6 +7,8 @@ class CashRepository extends Repository { // ignore: overridden_fields final ext = "amap/users/"; + CashRepository(super.ref); + Future> getCashList() async { return List.from( (await getList(suffix: "cash")).map((x) => Cash.fromJson(x)), @@ -30,6 +31,5 @@ class CashRepository extends Repository { } final cashRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return CashRepository()..setToken(token); + return CashRepository(ref); }); diff --git a/lib/amap/repositories/delivery_list_repository.dart b/lib/amap/repositories/delivery_list_repository.dart index ec54df5dc..25a8f2cfb 100644 --- a/lib/amap/repositories/delivery_list_repository.dart +++ b/lib/amap/repositories/delivery_list_repository.dart @@ -1,7 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/delivery.dart'; import 'package:myecl/amap/class/product.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class DeliveryListRepository extends Repository { @@ -9,6 +8,8 @@ class DeliveryListRepository extends Repository { // ignore: overridden_fields final ext = "amap/deliveries"; + DeliveryListRepository(super.ref); + Future> getDeliveryList() async { return List.from( (await getList()).map((x) => Delivery.fromJson(x)), @@ -60,6 +61,5 @@ class DeliveryListRepository extends Repository { } final deliveryListRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return DeliveryListRepository()..setToken(token); + return DeliveryListRepository(ref); }); diff --git a/lib/amap/repositories/delivery_product_list_repository.dart b/lib/amap/repositories/delivery_product_list_repository.dart index d19a55853..b8ee1bd5c 100644 --- a/lib/amap/repositories/delivery_product_list_repository.dart +++ b/lib/amap/repositories/delivery_product_list_repository.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/product.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class DeliveryProductListRepository extends Repository { @@ -8,6 +7,8 @@ class DeliveryProductListRepository extends Repository { // ignore: overridden_fields final ext = "amap/deliveries/"; + DeliveryProductListRepository(super.ref); + Future createProduct(String deliveryId, Product product) async { return Product.fromJson( await create(product.toJson(), suffix: "$deliveryId/products"), @@ -28,6 +29,5 @@ class DeliveryProductListRepository extends Repository { } final deliveryProductListRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return DeliveryProductListRepository()..setToken(token); + return DeliveryProductListRepository(ref); }); diff --git a/lib/amap/repositories/information_repository.dart b/lib/amap/repositories/information_repository.dart index 97b85d60f..215de2f88 100644 --- a/lib/amap/repositories/information_repository.dart +++ b/lib/amap/repositories/information_repository.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/information.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class InformationRepository extends Repository { @@ -8,6 +7,8 @@ class InformationRepository extends Repository { // ignore: overridden_fields final ext = "amap/information"; + InformationRepository(super.ref); + Future getInformation() async { return Information.fromJson(await getOne("")); } @@ -26,6 +27,5 @@ class InformationRepository extends Repository { } final informationRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return InformationRepository()..setToken(token); + return InformationRepository(ref); }); diff --git a/lib/amap/repositories/order_list_repository.dart b/lib/amap/repositories/order_list_repository.dart index 52245e5d4..2a8f6aa93 100644 --- a/lib/amap/repositories/order_list_repository.dart +++ b/lib/amap/repositories/order_list_repository.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/order.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class OrderListRepository extends Repository { @@ -8,6 +7,8 @@ class OrderListRepository extends Repository { // ignore: overridden_fields final ext = "amap/"; + OrderListRepository(super.ref); + Future createOrder(Order order) async { return Order.fromJson(await create(order.toJson(), suffix: "orders")); } @@ -36,6 +37,5 @@ class OrderListRepository extends Repository { } final orderListRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return OrderListRepository()..setToken(token); + return OrderListRepository(ref); }); diff --git a/lib/amap/repositories/product_repository.dart b/lib/amap/repositories/product_repository.dart index 0aee9fbc4..a9820268b 100644 --- a/lib/amap/repositories/product_repository.dart +++ b/lib/amap/repositories/product_repository.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/amap/class/product.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class ProductListRepository extends Repository { @@ -8,6 +7,8 @@ class ProductListRepository extends Repository { // ignore: overridden_fields final ext = "amap/products"; + ProductListRepository(super.ref); + Future> getProductList() async { return List.from( (await getList()).map((x) => Product.fromJson(x)), @@ -32,6 +33,5 @@ class ProductListRepository extends Repository { } final productListRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return ProductListRepository()..setToken(token); + return ProductListRepository(ref); }); diff --git a/lib/amap/router.dart b/lib/amap/router.dart index 1c419c9c4..76c134fdf 100644 --- a/lib/amap/router.dart +++ b/lib/amap/router.dart @@ -19,9 +19,9 @@ import 'package:myecl/amap/ui/pages/presentation_page/text.dart' import 'package:myecl/amap/ui/pages/product_pages/add_edit_product.dart' deferred as add_edit_product; import 'package:myecl/drawer/class/module.dart'; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class AmapRouter { diff --git a/lib/amap/ui/amap.dart b/lib/amap/ui/amap.dart index 7f1e617ba..ebc8778ef 100644 --- a/lib/amap/ui/amap.dart +++ b/lib/amap/ui/amap.dart @@ -17,7 +17,7 @@ class AmapTemplate extends StatelessWidget { TopBar( title: AMAPTextConstants.amap, root: AmapRouter.root, - rightIcon: QR.currentPath == AmapRouter.root + rightIcon: Uri.parse(QR.currentPath).path == AmapRouter.root ? IconButton( onPressed: () { QR.to(AmapRouter.root + AmapRouter.presentation); diff --git a/lib/amap/ui/components/order_ui.dart b/lib/amap/ui/components/order_ui.dart index d46a639d6..3a8f518de 100644 --- a/lib/amap/ui/components/order_ui.dart +++ b/lib/amap/ui/components/order_ui.dart @@ -11,7 +11,6 @@ import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; class OrderUI extends HookConsumerWidget { @@ -135,23 +134,21 @@ class OrderUI extends HookConsumerWidget { title: AMAPTextConstants.delete, descriptions: AMAPTextConstants.deletingOrder, onYes: () async { - await tokenExpireWrapper(ref, () async { - orderListNotifier.deleteOrder(order).then(( - value, - ) { - if (value) { - balanceNotifier.updateCash(order.amount); - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.deletedOrder, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.deletingError, - ); - } - }); + orderListNotifier.deleteOrder(order).then(( + value, + ) { + if (value) { + balanceNotifier.updateCash(order.amount); + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.deletedOrder, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.deletingError, + ); + } }); }, )), diff --git a/lib/amap/ui/pages/admin_page/delivery_ui.dart b/lib/amap/ui/pages/admin_page/delivery_ui.dart index 0e7670768..487a97c58 100644 --- a/lib/amap/ui/pages/admin_page/delivery_ui.dart +++ b/lib/amap/ui/pages/admin_page/delivery_ui.dart @@ -16,7 +16,6 @@ import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -181,22 +180,20 @@ class DeliveryUi extends HookConsumerWidget { descriptions: AMAPTextConstants.deleteDeliveryDescription, onYes: () async { - await tokenExpireWrapper(ref, () async { - deliveryListNotifier - .deleteDelivery(delivery) - .then((value) { - if (value) { - displayVoteWithContext( - TypeMsg.msg, - AMAPTextConstants.deletedDelivery, - ); - } else { - displayVoteWithContext( - TypeMsg.error, - AMAPTextConstants.deletingError, - ); - } - }); + deliveryListNotifier.deleteDelivery(delivery).then(( + value, + ) { + if (value) { + displayVoteWithContext( + TypeMsg.msg, + AMAPTextConstants.deletedDelivery, + ); + } else { + displayVoteWithContext( + TypeMsg.error, + AMAPTextConstants.deletingError, + ); + } }); }, )), @@ -235,70 +232,68 @@ class DeliveryUi extends HookConsumerWidget { ? AMAPTextConstants.deliveringDelivery : AMAPTextConstants.archivingDelivery, onYes: () async { - await tokenExpireWrapper(ref, () async { - switch (delivery.status) { - case DeliveryStatus.creation: - final value = await deliveryListNotifier - .openDelivery(delivery); - if (value) { - displayVoteWithContext( - TypeMsg.msg, - AMAPTextConstants.deliveryOpened, - ); - } else { - displayVoteWithContext( - TypeMsg.error, - AMAPTextConstants.deliveryNotOpened, - ); - } - break; - case DeliveryStatus.available: - final value = await deliveryListNotifier - .lockDelivery(delivery); - if (value) { - displayVoteWithContext( - TypeMsg.msg, - AMAPTextConstants.deliveryLocked, - ); - } else { - displayVoteWithContext( - TypeMsg.error, - AMAPTextConstants.deliveryNotLocked, - ); - } - break; - case DeliveryStatus.locked: - final value = await deliveryListNotifier - .deliverDelivery(delivery); - if (value) { - displayVoteWithContext( - TypeMsg.msg, - AMAPTextConstants.deliveryDelivered, - ); - } else { - displayVoteWithContext( - TypeMsg.error, - AMAPTextConstants.deliveryNotDelivered, - ); - } - break; - case DeliveryStatus.delivered: - final value = await deliveryListNotifier - .archiveDelivery(delivery); - if (value) { - displayVoteWithContext( - TypeMsg.msg, - AMAPTextConstants.deliveryArchived, - ); - } else { - displayVoteWithContext( - TypeMsg.error, - AMAPTextConstants.deliveryNotArchived, - ); - } - break; - } - }); + switch (delivery.status) { + case DeliveryStatus.creation: + final value = await deliveryListNotifier + .openDelivery(delivery); + if (value) { + displayVoteWithContext( + TypeMsg.msg, + AMAPTextConstants.deliveryOpened, + ); + } else { + displayVoteWithContext( + TypeMsg.error, + AMAPTextConstants.deliveryNotOpened, + ); + } + break; + case DeliveryStatus.available: + final value = await deliveryListNotifier + .lockDelivery(delivery); + if (value) { + displayVoteWithContext( + TypeMsg.msg, + AMAPTextConstants.deliveryLocked, + ); + } else { + displayVoteWithContext( + TypeMsg.error, + AMAPTextConstants.deliveryNotLocked, + ); + } + break; + case DeliveryStatus.locked: + final value = await deliveryListNotifier + .deliverDelivery(delivery); + if (value) { + displayVoteWithContext( + TypeMsg.msg, + AMAPTextConstants.deliveryDelivered, + ); + } else { + displayVoteWithContext( + TypeMsg.error, + AMAPTextConstants.deliveryNotDelivered, + ); + } + break; + case DeliveryStatus.delivered: + final value = await deliveryListNotifier + .archiveDelivery(delivery); + if (value) { + displayVoteWithContext( + TypeMsg.msg, + AMAPTextConstants.deliveryArchived, + ); + } else { + displayVoteWithContext( + TypeMsg.error, + AMAPTextConstants.deliveryNotArchived, + ); + } + break; + } }, )), ); diff --git a/lib/amap/ui/pages/admin_page/product_handler.dart b/lib/amap/ui/pages/admin_page/product_handler.dart index d553927fb..c16d757db 100644 --- a/lib/amap/ui/pages/admin_page/product_handler.dart +++ b/lib/amap/ui/pages/admin_page/product_handler.dart @@ -12,7 +12,6 @@ import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -87,22 +86,20 @@ class ProductHandler extends HookConsumerWidget { title: AMAPTextConstants.deleteProduct, descriptions: AMAPTextConstants .deleteProductDescription, - onYes: () { - tokenExpireWrapper(ref, () async { - final value = await productsNotifier - .deleteProduct(e); - if (value) { - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.deletedProduct, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.productInDelivery, - ); - } - }); + onYes: () async { + final value = await productsNotifier + .deleteProduct(e); + if (value) { + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.deletedProduct, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.productInDelivery, + ); + } }, ), ); diff --git a/lib/amap/ui/pages/admin_page/user_cash_ui.dart b/lib/amap/ui/pages/admin_page/user_cash_ui.dart index f2007434e..0f5a5d7c4 100644 --- a/lib/amap/ui/pages/admin_page/user_cash_ui.dart +++ b/lib/amap/ui/pages/admin_page/user_cash_ui.dart @@ -10,7 +10,6 @@ import 'package:myecl/amap/providers/cash_list_provider.dart'; import 'package:myecl/amap/tools/constants.dart'; import 'package:myecl/amap/ui/pages/admin_page/user_cash_ui_layout.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; @@ -151,33 +150,31 @@ class UserCashUi extends HookConsumerWidget { return; } if (key.currentState!.validate()) { - await tokenExpireWrapper(ref, () async { - await ref - .read(cashListProvider.notifier) - .updateCash( - cash.copyWith( - balance: double.parse( - amount.text.replaceAll(',', '.'), - ), + await ref + .read(cashListProvider.notifier) + .updateCash( + cash.copyWith( + balance: double.parse( + amount.text.replaceAll(',', '.'), ), - cash.balance, - ) - .then((value) { - if (value) { - key.currentState!.reset(); - toggle(); - displayVoteWithContext( - TypeMsg.msg, - AMAPTextConstants.updatedAmount, - ); - } else { - displayVoteWithContext( - TypeMsg.error, - AMAPTextConstants.updatingError, - ); - } - }); - }); + ), + cash.balance, + ) + .then((value) { + if (value) { + key.currentState!.reset(); + toggle(); + displayVoteWithContext( + TypeMsg.msg, + AMAPTextConstants.updatedAmount, + ); + } else { + displayVoteWithContext( + TypeMsg.error, + AMAPTextConstants.updatingError, + ); + } + }); } }, child: const Icon( diff --git a/lib/amap/ui/pages/delivery_pages/add_edit_delivery_cmd_page.dart b/lib/amap/ui/pages/delivery_pages/add_edit_delivery_cmd_page.dart index 5801b31f7..24cb71c3d 100644 --- a/lib/amap/ui/pages/delivery_pages/add_edit_delivery_cmd_page.dart +++ b/lib/amap/ui/pages/delivery_pages/add_edit_delivery_cmd_page.dart @@ -12,7 +12,6 @@ import 'package:myecl/amap/tools/constants.dart'; import 'package:myecl/amap/ui/amap.dart'; import 'package:myecl/amap/ui/pages/delivery_pages/product_ui_check.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; @@ -144,53 +143,49 @@ class AddEditDeliveryPage extends HookConsumerWidget { ), status: DeliveryStatus.creation, ); - await tokenExpireWrapper(ref, () async { - final deliveryNotifier = ref.watch( - deliveryListProvider.notifier, - ); - final value = isEdit - ? await deliveryNotifier.updateDelivery( - del, - ) - : await deliveryNotifier.addDelivery(del); - if (value) { - QR.back(); - if (isEdit) { - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.editedCommand, - ); - } else { - final deliveryOrdersNotifier = ref.watch( - adminDeliveryOrderListProvider.notifier, - ); - final deliveryList = ref.watch( - deliveryListProvider, - ); - deliveryList.whenData((deliveries) { - deliveryOrdersNotifier.addT( - deliveries.last.id, - ); - }); - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.addedCommand, - ); - } + final deliveryNotifier = ref.watch( + deliveryListProvider.notifier, + ); + final value = isEdit + ? await deliveryNotifier.updateDelivery(del) + : await deliveryNotifier.addDelivery(del); + if (value) { + QR.back(); + if (isEdit) { + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.editedCommand, + ); } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.editingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.alreadyExistCommand, + final deliveryOrdersNotifier = ref.watch( + adminDeliveryOrderListProvider.notifier, + ); + final deliveryList = ref.watch( + deliveryListProvider, + ); + deliveryList.whenData((deliveries) { + deliveryOrdersNotifier.addT( + deliveries.last.id, ); - } + }); + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.addedCommand, + ); + } + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.editingError, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.alreadyExistCommand, + ); } - }); + } } else { displayToast( context, diff --git a/lib/amap/ui/pages/detail_delivery_page/order_detail_ui.dart b/lib/amap/ui/pages/detail_delivery_page/order_detail_ui.dart index 59799906f..7190ae78a 100644 --- a/lib/amap/ui/pages/detail_delivery_page/order_detail_ui.dart +++ b/lib/amap/ui/pages/detail_delivery_page/order_detail_ui.dart @@ -12,7 +12,6 @@ import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; class DetailOrderUI extends HookConsumerWidget { @@ -143,39 +142,34 @@ class DetailOrderUI extends HookConsumerWidget { title: AMAPTextConstants.delete, descriptions: AMAPTextConstants.deletingOrder, onYes: () async { - await tokenExpireWrapper(ref, () async { - final index = orderList.maybeWhen( - data: (data) => data.indexWhere( - (element) => element.id == order.id, - ), - orElse: () => -1, - ); - await orderListNotifier.deleteOrder(order).then(( - value, - ) { - if (value) { - if (index != -1) { - deliveryOrdersNotifier.deleteE( - deliveryId, - index, - ); - } - cashListNotifier.fakeUpdateCash( - userCash.copyWith( - balance: userCash.balance + order.amount, - ), - ); - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.deletedOrder, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.deletingError, - ); + final index = orderList.maybeWhen( + data: (data) => data.indexWhere( + (element) => element.id == order.id, + ), + orElse: () => -1, + ); + await orderListNotifier.deleteOrder(order).then(( + value, + ) { + if (value) { + if (index != -1) { + deliveryOrdersNotifier.deleteE(deliveryId, index); } - }); + cashListNotifier.fakeUpdateCash( + userCash.copyWith( + balance: userCash.balance + order.amount, + ), + ); + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.deletedOrder, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.deletingError, + ); + } }); }, )), diff --git a/lib/amap/ui/pages/list_products_page/product_choice_button.dart b/lib/amap/ui/pages/list_products_page/product_choice_button.dart index 240352c2f..c454ab9ac 100644 --- a/lib/amap/ui/pages/list_products_page/product_choice_button.dart +++ b/lib/amap/ui/pages/list_products_page/product_choice_button.dart @@ -9,7 +9,6 @@ import 'package:myecl/amap/providers/user_amount_provider.dart'; import 'package:myecl/amap/tools/constants.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/user/providers/user_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -77,40 +76,38 @@ class ProductChoiceButton extends HookConsumerWidget { user: me.toSimpleUser(), lastAmount: order.amount, ); - await tokenExpireWrapper(ref, () async { - final value = isEdit - ? await orderListNotifier.updateOrder(newOrder) - : await orderListNotifier.addOrder(newOrder); - if (value) { - QR.back(); - userAmountNotifier.updateCash( - order.lastAmount - order.amount, + final value = isEdit + ? await orderListNotifier.updateOrder(newOrder) + : await orderListNotifier.addOrder(newOrder); + if (value) { + QR.back(); + userAmountNotifier.updateCash( + order.lastAmount - order.amount, + ); + if (isEdit) { + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.updatedOrder, + ); + } else { + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.addedOrder, + ); + } + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.updatingError, ); - if (isEdit) { - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.updatedOrder, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.addedOrder, - ); - } } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.updatingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.addingError, - ); - } + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.addingError, + ); } - }); + } } }, child: Text( diff --git a/lib/amap/ui/pages/main_page/main_page.dart b/lib/amap/ui/pages/main_page/main_page.dart index 04b72680f..7367a3181 100644 --- a/lib/amap/ui/pages/main_page/main_page.dart +++ b/lib/amap/ui/pages/main_page/main_page.dart @@ -23,7 +23,6 @@ import 'package:myecl/amap/ui/pages/main_page/collection_slot_selector.dart'; import 'package:myecl/amap/ui/pages/main_page/delivery_section.dart'; import 'package:myecl/amap/ui/pages/main_page/orders_section.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/providers/user_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -226,10 +225,9 @@ class AmapMainPage extends HookConsumerWidget { WaitingButton( onTap: () async { if (availableDeliveriesIds.contains(delivery.id)) { - await tokenExpireWrapper(ref, () async { - await deliveryProductListNotifier - .loadProductList(delivery.products); - }); + await deliveryProductListNotifier.loadProductList( + delivery.products, + ); QR.to(AmapRouter.root + AmapRouter.listProduct); } else { displayToastWithoutContext( diff --git a/lib/amap/ui/pages/product_pages/add_edit_product.dart b/lib/amap/ui/pages/product_pages/add_edit_product.dart index 80f680f75..4fac3425f 100644 --- a/lib/amap/ui/pages/product_pages/add_edit_product.dart +++ b/lib/amap/ui/pages/product_pages/add_edit_product.dart @@ -10,7 +10,6 @@ import 'package:myecl/amap/providers/selected_list_provider.dart'; import 'package:myecl/amap/tools/constants.dart'; import 'package:myecl/amap/ui/amap.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; @@ -174,48 +173,44 @@ class AddEditProduct extends HookConsumerWidget { category: cate, quantity: 0, ); - await tokenExpireWrapper(ref, () async { - final value = isEdit - ? await productsNotifier.updateProduct( - newProduct, - ) - : await productsNotifier.addProduct(newProduct); - if (value) { - if (isEdit) { - formKey.currentState!.reset(); - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.updatedProduct, - ); - } else { - ref - .watch(selectedListProvider.notifier) - .rebuild( - products.maybeWhen( - data: (data) => data, - orElse: () => [], - ), - ); - displayToastWithContext( - TypeMsg.msg, - AMAPTextConstants.addedProduct, - ); - } + final value = isEdit + ? await productsNotifier.updateProduct(newProduct) + : await productsNotifier.addProduct(newProduct); + if (value) { + if (isEdit) { + formKey.currentState!.reset(); + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.updatedProduct, + ); + } else { + ref + .watch(selectedListProvider.notifier) + .rebuild( + products.maybeWhen( + data: (data) => data, + orElse: () => [], + ), + ); + displayToastWithContext( + TypeMsg.msg, + AMAPTextConstants.addedProduct, + ); + } + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.updatingError, + ); } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.updatingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - AMAPTextConstants.addingError, - ); - } + displayToastWithContext( + TypeMsg.error, + AMAPTextConstants.addingError, + ); } - QR.back(); - }); + } + QR.back(); } }, child: Text( diff --git a/lib/auth/class/auth_request.dart b/lib/auth/class/auth_request.dart new file mode 100644 index 000000000..364ac8e8d --- /dev/null +++ b/lib/auth/class/auth_request.dart @@ -0,0 +1,67 @@ +enum AuthGrantType { authorizationCode, refreshToken } + +class AuthRequest { + late final String token; + late final String clientId; + late final String redirectUri; + late final String codeVerifier; + late final AuthGrantType grantType; + + AuthRequest({ + required this.token, + required this.clientId, + required this.redirectUri, + required this.codeVerifier, + required this.grantType, + }); + + Map toJson() { + final data = {}; + data['client_id'] = clientId; + switch (grantType) { + case AuthGrantType.authorizationCode: + data['code_verifier'] = codeVerifier; + data['redirect_uri'] = redirectUri; + data['code'] = token; + data['grant_type'] = 'authorization_code'; + break; + case AuthGrantType.refreshToken: + data['refresh_token'] = token; + + data['grant_type'] = 'refresh_token'; + break; + } + return data; + } + + AuthRequest copyWith({ + String? token, + String? clientId, + String? redirectUri, + String? codeVerifier, + AuthGrantType? grantType, + }) { + return AuthRequest( + token: token ?? this.token, + clientId: clientId ?? this.clientId, + redirectUri: redirectUri ?? this.redirectUri, + codeVerifier: codeVerifier ?? this.codeVerifier, + grantType: grantType ?? this.grantType, + ); + } + + static AuthRequest empty() { + return AuthRequest( + token: '', + clientId: '', + redirectUri: '', + codeVerifier: '', + grantType: AuthGrantType.authorizationCode, + ); + } + + @override + String toString() { + return 'AuthRequest(token: $token, clientId: $clientId, redirectUri: $redirectUri, codeVerifier: $codeVerifier, grantType: $grantType)'; + } +} diff --git a/lib/auth/class/auth_token.dart b/lib/auth/class/auth_token.dart new file mode 100644 index 000000000..76b3f5c7b --- /dev/null +++ b/lib/auth/class/auth_token.dart @@ -0,0 +1,56 @@ +import 'package:flutter_appauth/flutter_appauth.dart'; + +/// A type-safe class to hold authentication tokens, preferable to a raw Map. +class AuthToken { + late final String accessToken; + late final String refreshToken; + + AuthToken({required this.accessToken, required this.refreshToken}); + + AuthToken.fromJson(Map json) { + accessToken = json['access_token'] as String; + refreshToken = json['refresh_token'] as String; + } + + AuthToken.fromTokenResponse(TokenResponse response) { + accessToken = response.accessToken ?? ''; + refreshToken = response.refreshToken ?? ''; + } + + Map toJson() { + final data = {}; + data['access_token'] = accessToken; + data['refresh_token'] = refreshToken; + return data; + } + + static AuthToken empty() { + return AuthToken(accessToken: '', refreshToken: ''); + } + + AuthToken copyWith({String? accessToken, String? refreshToken}) { + return AuthToken( + accessToken: accessToken ?? this.accessToken, + refreshToken: refreshToken ?? this.refreshToken, + ); + } + + @override + String toString() { + return 'AuthToken(accessToken: $accessToken, refreshToken: $refreshToken)'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other.runtimeType != runtimeType) return false; + final AuthToken otherToken = other as AuthToken; + return accessToken == otherToken.accessToken && + refreshToken == otherToken.refreshToken; + } + + @override + int get hashCode { + return accessToken.hashCode ^ refreshToken.hashCode; + } +} diff --git a/lib/auth/providers/is_connected_provider.dart b/lib/auth/providers/connection_status_provider.dart similarity index 70% rename from lib/auth/providers/is_connected_provider.dart rename to lib/auth/providers/connection_status_provider.dart index 1279cf374..593838fae 100644 --- a/lib/auth/providers/is_connected_provider.dart +++ b/lib/auth/providers/connection_status_provider.dart @@ -17,10 +17,9 @@ class IsConnectedProvider extends StateNotifier { } } -final isConnectedProvider = StateNotifierProvider(( - ref, -) { - final notifier = IsConnectedProvider(); - notifier.isInternet(); - return notifier; -}); +final connectionStatusProvider = + StateNotifierProvider((ref) { + final notifier = IsConnectedProvider(); + notifier.isInternet(); + return notifier; + }); diff --git a/lib/auth/providers/openid_provider.dart b/lib/auth/providers/openid_provider.dart index ac4066944..1158d013a 100644 --- a/lib/auth/providers/openid_provider.dart +++ b/lib/auth/providers/openid_provider.dart @@ -7,7 +7,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_appauth/flutter_appauth.dart'; import 'package:flutter/foundation.dart' show kDebugMode, kIsWeb; -import 'package:myecl/auth/providers/is_connected_provider.dart'; +import 'package:myecl/auth/class/auth_request.dart'; +import 'package:myecl/auth/class/auth_token.dart'; +import 'package:myecl/auth/providers/connection_status_provider.dart'; import 'package:myecl/auth/repository/openid_repository.dart'; import 'package:myecl/tools/cache/cache_manager.dart'; import 'package:myecl/tools/functions.dart'; @@ -16,348 +18,368 @@ import 'dart:convert'; import 'package:universal_html/html.dart' as html; final authTokenProvider = - StateNotifierProvider>>( - (ref) { - OpenIdTokenProvider openIdTokenProvider = OpenIdTokenProvider(); - final isConnected = ref.watch(isConnectedProvider); - if (isConnected) { - openIdTokenProvider.getTokenFromStorage(); - } - return openIdTokenProvider; - }, - ); - -class IsLoggedInProvider extends StateNotifier { - IsLoggedInProvider(super.b); + StateNotifierProvider>((ref) { + final openIdRepository = OpenIdRepository(ref); + final authNotifier = AuthNotifier( + appAuth: FlutterAppAuth(), + secureStorage: FlutterSecureStorage(), + cacheManager: CacheManager(), + openIdRepository: openIdRepository, + ); - void refresh(AsyncValue> token) { - state = token.maybeWhen( - data: (tokens) => tokens["token"] == "" - ? false - : !JwtDecoder.isExpired(tokens["token"] as String), - orElse: () => false, - ); - } -} + return authNotifier; + }); -class IsCachingProvider extends StateNotifier { - IsCachingProvider(super.b); +/// This notifier manages the caching state of the authentication token. +/// It extends StateNotifier with a boolean state indicating whether the token is being cached. +class IsAuthCachedNotifier extends StateNotifier { + IsAuthCachedNotifier(super.b); void set(bool b) { state = b; } } -final isCachingProvider = StateNotifierProvider((ref) { - final IsCachingProvider isCachingProvider = IsCachingProvider(false); +/// This provider checks if the user is caching their authentication token. +/// It reads the cached token from the cache manager and sets the state +final isAuthCachedProvider = StateNotifierProvider(( + ref, +) { + final IsAuthCachedNotifier isAuthCachedNotifier = IsAuthCachedNotifier(false); - final isConnected = ref.watch(isConnectedProvider); - CacheManager().readCache("id").then((value) { - isCachingProvider.set(!isConnected && value != ""); - }); - return isCachingProvider; + final isOnline = ref.watch(connectionStatusProvider); + ref + .read(authTokenProvider.notifier) + .cacheManager + .readCache(AuthNotifier.userIdName) + .then((value) { + isAuthCachedNotifier.set(!isOnline && value != ""); + }); + return isAuthCachedNotifier; }); -final isLoggedInProvider = StateNotifierProvider(( - ref, -) { - final IsLoggedInProvider isLoggedInProvider = IsLoggedInProvider(false); - - final isConnected = ref.watch(isConnectedProvider); - final authToken = ref.watch(authTokenProvider); - final isCaching = ref.watch(isCachingProvider); - if (isConnected) { - isLoggedInProvider.refresh(authToken); - } else if (isCaching) { - return IsLoggedInProvider(true); +final isLoggedInProvider = Provider((ref) { + final isLoggedIn = ref.watch( + tokenProvider.select( + (accessToken) => + accessToken.isEmpty ? false : !JwtDecoder.isExpired(accessToken), + ), + ); + final isAuthCached = ref.watch(isAuthCachedProvider); + if (isAuthCached) { + return true; } - return isLoggedInProvider; + return isLoggedIn; }); -final loadingProvider = FutureProvider((ref) { - final isCaching = ref.watch(isCachingProvider); - return isCaching || - ref - .watch(authTokenProvider) - .when( - data: (tokens) => - tokens["token"] != "" && ref.watch(isLoggedInProvider), - error: (e, s) => false, - loading: () => true, - ); +/// This provider checks if the user is currently loading the authentication state. +/// It returns true if the authentication token is being fetched or refreshed. +final isAuthLoadingProvider = Provider((ref) { + final authNotifier = ref.watch(authTokenProvider.notifier); + final isLoading = ref.watch( + authTokenProvider.select((authToken) => authToken.isLoading), + ); + return isLoading || authNotifier.isRefreshing; }); -final idProvider = FutureProvider((ref) { - final cacheManager = CacheManager(); - return ref - .watch(authTokenProvider) - .when( - data: (tokens) { - final id = tokens["token"] == "" +final userIdProvider = FutureProvider((ref) { + final cacheManager = ref.read(authTokenProvider.notifier).cacheManager; + return ref.watch( + authTokenProvider.select( + (authToken) => authToken.when( + data: (authToken) { + final id = authToken.accessToken == "" ? "" - : JwtDecoder.decode(tokens["token"] as String)["sub"]; - cacheManager.writeCache("id", id); + : JwtDecoder.decode(authToken.accessToken)["sub"]; + cacheManager.writeCache(AuthNotifier.userIdName, id); return id; }, error: (e, s) => "", - loading: () => cacheManager.readCache("id"), - ); + loading: () => cacheManager.readCache(AuthNotifier.userIdName), + ), + ), + ); }); final tokenProvider = Provider((ref) { - return ref - .watch(authTokenProvider) - .maybeWhen(data: (tokens) => tokens["token"] as String, orElse: () => ""); + return ref.watch( + authTokenProvider.select( + (authToken) => authToken.maybeWhen( + data: (authToken) => authToken.accessToken, + orElse: () => "", + ), + ), + ); }); -class OpenIdTokenProvider - extends StateNotifier>> { - FlutterAppAuth appAuth = const FlutterAppAuth(); - final CacheManager cacheManager = CacheManager(); - final FlutterSecureStorage _secureStorage = const FlutterSecureStorage(); - final Base64Codec base64 = const Base64Codec.urlSafe(); - final OpenIdRepository openIdRepository = OpenIdRepository(); - final String tokenName = "my_ecl_auth_token"; - final String clientId = "Titan"; - final String tokenKey = "token"; - final String refreshTokenKey = "refresh_token"; - final String redirectURLScheme = "${getTitanPackageName()}://authorized"; - final String redirectURL = "${getTitanURL()}/static.html"; - final String discoveryUrl = - "${Repository.host}.well-known/openid-configuration"; - final List scopes = ["API"]; - OpenIdTokenProvider() : super(const AsyncValue.loading()); +/// The AuthNotifier class is responsible for managing the authentication state +/// of the application. It handles signing in, signing out, refreshing tokens, +/// and storing authentication tokens securely. +/// +/// It uses the Flutter AppAuth package for OAuth 2.0 authorization code flow +/// with PKCE for mobile applications, and a web-based flow for web applications. +class AuthNotifier extends StateNotifier> { + final FlutterAppAuth appAuth; + final FlutterSecureStorage secureStorage; + final CacheManager cacheManager; + final OpenIdRepository openIdRepository; - String generateRandomString(int len) { - var r = Random.secure(); - const chars = - 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890'; - return List.generate(len, (index) => chars[r.nextInt(chars.length)]).join(); - } + bool isRefreshing = false; - String hash(String data) { - return base64.encode(sha256.convert(utf8.encode(data)).bytes); + AuthNotifier({ + required this.appAuth, + required this.secureStorage, + required this.cacheManager, + required this.openIdRepository, + }) : super(AsyncData(AuthToken.empty())) { + // Initialize the authentication state by checking if a token is cached + _initializeAuthState(); } - Future getTokenFromRequest() async { - html.WindowBase? popupWin; - final codeVerifier = generateRandomString(128); + static const Base64Codec base64 = Base64Codec.urlSafe(); + static const String userIdName = "id"; - final authUrl = - "${Repository.host}auth/authorize?client_id=$clientId&response_type=code&scope=${scopes.join(" ")}&redirect_uri=$redirectURL&code_challenge=${hash(codeVerifier)}&code_challenge_method=S256"; + StreamSubscription? _messageSubscription; - state = const AsyncValue.loading(); - try { - if (kIsWeb) { - popupWin = html.window.open( - authUrl, - "Hyperion", - "width=800, height=900, scrollbars=yes", - ); - - final completer = Completer(); - void checkWindowClosed() { - if (popupWin != null && popupWin!.closed == true) { - completer.complete(); - } else { - Future.delayed( - const Duration(milliseconds: 100), - checkWindowClosed, - ); - } - } - - checkWindowClosed(); - completer.future.then((_) { - state.maybeWhen( - loading: () { - state = AsyncValue.data({tokenKey: "", refreshTokenKey: ""}); - }, - orElse: () {}, - ); - }); - - void login(String data) async { - final receivedUri = Uri.parse(data); - final token = receivedUri.queryParameters["code"]; - if (popupWin != null) { - popupWin!.close(); - popupWin = null; - } - try { - if (token != null && token.isNotEmpty) { - final resp = await openIdRepository.getToken( - token, - clientId, - redirectURL.toString(), - codeVerifier, - "authorization_code", - ); - final accessToken = resp[tokenKey]!; - final refreshToken = resp[refreshTokenKey]!; - await _secureStorage.write(key: tokenName, value: refreshToken); - state = AsyncValue.data({ - tokenKey: accessToken, - refreshTokenKey: refreshToken, - }); - } else { - throw Exception('Wrong credentials'); - } - } on TimeoutException catch (_) { - throw Exception('No response from server'); - } catch (e) { - rethrow; - } - } + // --- OIDC Configuration --- + static const String tokenName = "my_ecl_auth_token"; + static const String clientId = "Titan"; + static final String redirectURLScheme = + "${getTitanPackageName()}://authorized"; + static final String redirectURL = "${getTitanURL()}/static.html"; + static final String discoveryUrl = + "${Repository.host}.well-known/openid-configuration"; + static List scopes = ["API"]; - html.window.onMessage.listen((event) { - if (event.data.toString().contains('code=')) { - login(event.data); - } - }); + Future _initializeAuthState() async { + secureStorage.read(key: tokenName).then((token) { + if (token != null && token.isNotEmpty) { + // If a refresh token is found, fetch the access token + refreshAccessToken(); } else { - AuthorizationTokenResponse resp = await appAuth - .authorizeAndExchangeCode( - AuthorizationTokenRequest( - clientId, - redirectURLScheme, - discoveryUrl: discoveryUrl, - scopes: scopes, - allowInsecureConnections: kDebugMode, - ), - ); - await _secureStorage.write(key: tokenName, value: resp.refreshToken); - state = AsyncValue.data({ - tokenKey: resp.accessToken!, - refreshTokenKey: resp.refreshToken!, - }); + // If no token is found, set the state to an empty token + state = AsyncData(AuthToken.empty()); } - } catch (e) { - state = AsyncValue.error("Error $e", StackTrace.empty); - } + }); } - Future getTokenFromStorage() async { - state = const AsyncValue.loading(); - _secureStorage.read(key: tokenName).then((token) async { - if (token != null) { - try { - if (kIsWeb) { - final resp = await openIdRepository.getToken( - token, - clientId, - "", - "", - refreshTokenKey, - ); - final accessToken = resp[tokenKey]!; - final refreshToken = resp[refreshTokenKey]!; - await _secureStorage.write(key: tokenName, value: refreshToken); - state = AsyncValue.data({ - tokenKey: accessToken, - refreshTokenKey: refreshToken, - }); - } else { - final resp = await appAuth.token( - TokenRequest( - clientId, - redirectURLScheme, - discoveryUrl: discoveryUrl, - scopes: scopes, - refreshToken: token, - allowInsecureConnections: kDebugMode, - ), - ); - state = AsyncValue.data({ - tokenKey: resp.accessToken!, - refreshTokenKey: resp.refreshToken!, - }); - storeToken(); - } - } catch (e) { - state = AsyncValue.error(e, StackTrace.empty); - } + /// Signs in the user using the appropriate flow based on the platform. + Future signIn() async { + if (state is AsyncLoading) { + // If already loading, return to avoid multiple request attempts + return; + } + state = const AsyncLoading(); + try { + if (kIsWeb) { + await _signInWeb(); } else { - state = const AsyncValue.error("No token found", StackTrace.empty); + await _signInMobile(); } - }); + } catch (e, s) { + state = AsyncError("Error $e", s); + } finally { + // Ensure the state is updated to reflect the loading status + if (state is AsyncLoading) { + // If the sign-in process fails, reset the state to an empty token + // to avoid leaving the app in a loading state. + // This is important for mobile apps where the user might not be able + // to retry the sign-in easily. + state = AsyncData(AuthToken.empty()); + } + } } - Future getAuthToken(String authorizationToken) async { - appAuth - .token( - TokenRequest( + /// Signs in the user using the mobile app flow. + /// This method uses the Flutter AppAuth package to perform the OAuth 2.0 + /// authorization code flow with PKCE. + Future _signInMobile() async { + AuthorizationTokenResponse response = await appAuth + .authorizeAndExchangeCode( + AuthorizationTokenRequest( clientId, redirectURLScheme, discoveryUrl: discoveryUrl, scopes: scopes, - authorizationCode: authorizationToken, allowInsecureConnections: kDebugMode, ), - ) - .then((resp) { - state = AsyncValue.data({ - tokenKey: resp.accessToken!, - refreshTokenKey: resp.refreshToken!, - }); - }); + ); + _saveAndStoreToken(AuthToken.fromTokenResponse(response)); } - Future refreshToken() async { - return state.when( - data: (token) async { - if (token[refreshTokenKey] != null && token[refreshTokenKey] != "") { - TokenResponse? resp = await appAuth.token( - TokenRequest( - clientId, - redirectURLScheme, - discoveryUrl: discoveryUrl, - scopes: scopes, - refreshToken: token[refreshTokenKey] as String, - allowInsecureConnections: kDebugMode, + /// Signs in the user using the web flow. + /// This method opens a popup window for the user to authenticate and + /// then retrieves the authorization code from the redirect URI. + /// It uses the code to request an access token from the OpenID provider. + Future _signInWeb() async { + final codeVerifier = _generateRandomString(128); + final authUrl = _generateAuthUrl(codeVerifier); + + html.WindowBase? popupWin = html.window.open( + authUrl, + "Hyperion", + "width=800, height=900, scrollbars=yes", + ); + + final completer = Completer(); + void checkWindowClosed() { + if (popupWin != null && popupWin!.closed == true) { + completer.complete(); + } else { + Future.delayed(const Duration(milliseconds: 100), checkWindowClosed); + } + } + + checkWindowClosed(); + completer.future.then((_) { + state.maybeWhen( + loading: () { + // If the state is still loading, reset it to an empty token + // to avoid leaving the app in a loading state. + state = AsyncData(AuthToken.empty()); + }, + orElse: () {}, + ); + }); + + Future login(String data) async { + final receivedUri = Uri.parse(data); + final token = receivedUri.queryParameters["code"]; + if (popupWin != null) { + popupWin!.close(); + popupWin = null; + } + try { + if (token != null && token.isNotEmpty) { + final authToken = await openIdRepository.getToken( + AuthRequest( + token: token, + clientId: clientId, + redirectUri: redirectURL, + codeVerifier: codeVerifier, + grantType: AuthGrantType.authorizationCode, ), ); - state = AsyncValue.data({ - tokenKey: resp.accessToken!, - refreshTokenKey: resp.refreshToken!, - }); - storeToken(); - return true; + _saveAndStoreToken(authToken); + _messageSubscription?.cancel(); + _messageSubscription = null; + } else { + throw Exception('Wrong credentials'); + } + } on TimeoutException catch (_) { + throw Exception('No response from server'); + } catch (e) { + rethrow; + } + } + + _messageSubscription?.cancel(); + _messageSubscription = html.window.onMessage.listen((event) { + if (event.data.toString().contains('code=')) { + login(event.data); + } + }); + } + + /// Refreshes the access token based on the current platform. + /// For web applications, it uses the OpenID repository to refresh the token. + /// For mobile applications, it uses the Flutter AppAuth package to refresh the token. + /// If the token is successfully refreshed, it stores the new token. + /// If an error occurs, it updates the state with the error. + Future refreshAccessToken() async { + if (isRefreshing) { + // If already loading, return false to avoid multiple refresh attempts + return false; + } + final refreshToken = await secureStorage.read(key: tokenName); + if (refreshToken != null) { + try { + isRefreshing = true; + + if (kIsWeb) { + await _refreshAccessTokenWeb(refreshToken); + } else { + await _refreshAccessTokenMobile(refreshToken); } - state = const AsyncValue.error(e, StackTrace.empty); - return false; - }, - error: (error, stackTrace) { - state = AsyncValue.error(error, stackTrace); - return false; - }, - loading: () { - return false; - }, + return true; + } catch (e, s) { + state = AsyncError(e, s); + } finally { + isRefreshing = false; + } + } else { + state = const AsyncError("No token found", StackTrace.empty); + } + + return false; + } + + // Refreshes access token for web applications. + Future _refreshAccessTokenWeb(String refreshToken) async { + final authToken = await openIdRepository.getToken( + AuthRequest( + token: refreshToken, + clientId: clientId, + redirectUri: redirectURL, + codeVerifier: "", + grantType: AuthGrantType.refreshToken, + ), ); + await _saveAndStoreToken(authToken); } - void storeToken() { - state.when( - data: (tokens) => - _secureStorage.write(key: tokenName, value: tokens[refreshTokenKey]), - error: (e, s) { - throw e; - }, - loading: () { - throw Exception("Token is not loaded"); - }, + // Refreshes access token for mobile applications. + Future _refreshAccessTokenMobile(String? refreshToken) async { + final response = await appAuth.token( + TokenRequest( + clientId, + redirectURLScheme, + discoveryUrl: discoveryUrl, + scopes: scopes, + refreshToken: refreshToken, + allowInsecureConnections: kDebugMode, + ), ); + await _saveAndStoreToken(AuthToken.fromTokenResponse(response)); } - void deleteToken() { + /// Deletes the authentication token from secure storage and cache. + void signOut() { try { - _secureStorage.delete(key: tokenName); + secureStorage.delete(key: tokenName); cacheManager.deleteCache(tokenName); - cacheManager.deleteCache("id"); - state = AsyncValue.data({tokenKey: "", refreshTokenKey: ""}); + cacheManager.deleteCache(userIdName); + state = AsyncData(AuthToken.empty()); } catch (e) { - state = AsyncValue.error(e, StackTrace.empty); + state = AsyncError(e, StackTrace.empty); } } + + /// Saves the authentication token in the state and stores it securely. + Future _saveAndStoreToken(AuthToken authToken) async { + state = AsyncData(authToken); + await secureStorage.write(key: tokenName, value: authToken.refreshToken); + } + + // --- Helper Methods --- + + /// Generates a random string of the specified length. + /// This is used to create a code verifier for the OAuth 2.0 PKCE flow. + static String _generateRandomString(int len) { + final r = Random.secure(); + const chars = + 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890'; + return List.generate(len, (index) => chars[r.nextInt(chars.length)]).join(); + } + + /// Hashes the given data using SHA-256 and encodes it in Base64. + /// This is used to create a code challenge for the OAuth 2.0 PKCE flow. + static String _hash(String data) { + return base64.encode(sha256.convert(utf8.encode(data)).bytes); + } + + /// Generates the authorization URL for the OAuth 2.0 PKCE flow. + String _generateAuthUrl(String codeVerifier) { + return "${Repository.host}auth/authorize?client_id=$clientId&response_type=code&scope=${scopes.join(" ")}&redirect_uri=$redirectURL&code_challenge=${_hash(codeVerifier)}&code_challenge_method=S256"; + } } diff --git a/lib/auth/repository/openid_repository.dart b/lib/auth/repository/openid_repository.dart index 244fc5c89..9c6a8a00c 100644 --- a/lib/auth/repository/openid_repository.dart +++ b/lib/auth/repository/openid_repository.dart @@ -1,25 +1,17 @@ import 'dart:async'; import 'dart:convert'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:http/http.dart' as http; +import 'package:myecl/auth/class/auth_request.dart'; +import 'package:myecl/auth/class/auth_token.dart'; import 'package:myecl/tools/repository/repository.dart'; class OpenIdRepository extends Repository { - Future> getToken( - String token, - String clientId, - String redirectUri, - String codeVerifier, - String grantType, - ) async { - var body = { - "client_id": clientId, - "code": token, - "redirect_uri": redirectUri.toString(), - "code_verifier": codeVerifier, - "grant_type": grantType, - "refresh_token": token, - }; + OpenIdRepository(super.ref); + + Future getToken(AuthRequest request) async { + final body = request.toJson(); final Map headers = { 'Content-Type': 'application/x-www-form-urlencoded', @@ -34,9 +26,9 @@ class OpenIdRepository extends Repository { ) .timeout(const Duration(seconds: 5)); if (response.statusCode == 200) { - final token = jsonDecode(response.body)["access_token"]; - final refreshToken = jsonDecode(response.body)["refresh_token"]; - return {"token": token, "refresh_token": refreshToken}; + return AuthToken.fromJson( + json.decode(response.body) as Map, + ); } else { throw Exception('Empty token'); } @@ -47,3 +39,8 @@ class OpenIdRepository extends Repository { } } } + +final openIdRepositoryProvider = Provider((ref) { + // No need to watch tokenProvider here, as the OpenIdRepository does not require a token. + return OpenIdRepository(ref); +}); diff --git a/lib/booking/providers/confirmed_booking_list_provider.dart b/lib/booking/providers/confirmed_booking_list_provider.dart index 8ecd68d0b..4befb518b 100644 --- a/lib/booking/providers/confirmed_booking_list_provider.dart +++ b/lib/booking/providers/confirmed_booking_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/booking/class/booking.dart'; import 'package:myecl/booking/repositories/booking_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ConfirmedBookingListProvider extends ListNotifier { final BookingRepository bookingRepository; @@ -48,8 +47,6 @@ final confirmedBookingListProvider = final provider = ConfirmedBookingListProvider( bookingRepository: bookingRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadConfirmedBooking(); - }); + provider.loadConfirmedBooking(); return provider; }); diff --git a/lib/booking/providers/manager_booking_list_provider.dart b/lib/booking/providers/manager_booking_list_provider.dart index c96803699..18e1925c8 100644 --- a/lib/booking/providers/manager_booking_list_provider.dart +++ b/lib/booking/providers/manager_booking_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/booking/class/booking.dart'; import 'package:myecl/booking/repositories/booking_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ManagerBookingListProvider extends ListNotifier { final BookingRepository bookingRepository; @@ -41,8 +40,6 @@ final managerBookingListProvider = final provider = ManagerBookingListProvider( bookingRepository: bookingRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadUserManageBookings(); - }); + provider.loadUserManageBookings(); return provider; }); diff --git a/lib/booking/providers/manager_confirmed_booking_list_provider.dart b/lib/booking/providers/manager_confirmed_booking_list_provider.dart index 4eb5a2ed3..17bd5cf74 100644 --- a/lib/booking/providers/manager_confirmed_booking_list_provider.dart +++ b/lib/booking/providers/manager_confirmed_booking_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/booking/class/booking.dart'; import 'package:myecl/booking/repositories/booking_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ManagerConfirmedBookingListProvider extends ListNotifier { final BookingRepository bookingRepository; @@ -39,8 +38,6 @@ final managerConfirmedBookingListProvider = final provider = ManagerConfirmedBookingListProvider( bookingRepository: bookingRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadConfirmedBookingForManager(); - }); + provider.loadConfirmedBookingForManager(); return provider; }); diff --git a/lib/booking/providers/manager_list_provider.dart b/lib/booking/providers/manager_list_provider.dart index dc5b5576b..786bd8a4f 100644 --- a/lib/booking/providers/manager_list_provider.dart +++ b/lib/booking/providers/manager_list_provider.dart @@ -1,16 +1,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/booking/class/manager.dart'; import 'package:myecl/booking/repositories/manager_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ManagerListNotifier extends ListNotifier { - final ManagerRepository _repository = ManagerRepository(); - ManagerListNotifier({required String token}) - : super(const AsyncValue.loading()) { - _repository.setToken(token); - } + final ManagerRepository _repository; + ManagerListNotifier(this._repository) : super(const AsyncValue.loading()); Future>> loadManagers() async { return await loadList(_repository.getManagerList); @@ -43,10 +38,8 @@ final managerListProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); - final provider = ManagerListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await provider.loadManagers(); - }); + final managerRepository = ref.watch(managerRepositoryProvider); + final provider = ManagerListNotifier(managerRepository); + provider.loadManagers(); return provider; }); diff --git a/lib/booking/providers/room_list_provider.dart b/lib/booking/providers/room_list_provider.dart index 384aea320..671f84768 100644 --- a/lib/booking/providers/room_list_provider.dart +++ b/lib/booking/providers/room_list_provider.dart @@ -2,7 +2,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/booking/class/room.dart'; import 'package:myecl/booking/repositories/rooms_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class RoomListNotifier extends ListNotifier { final RoomRepository roomRepository; @@ -39,8 +38,6 @@ final roomListProvider = StateNotifierProvider>>((ref) { final roomRepository = ref.watch(roomRepositoryProvider); final provider = RoomListNotifier(roomRepository: roomRepository); - tokenExpireWrapperAuth(ref, () async { - await provider.loadRooms(); - }); + provider.loadRooms(); return provider; }); diff --git a/lib/booking/providers/user_booking_list_provider.dart b/lib/booking/providers/user_booking_list_provider.dart index 43f5c1869..6a26ebbbd 100644 --- a/lib/booking/providers/user_booking_list_provider.dart +++ b/lib/booking/providers/user_booking_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/booking/class/booking.dart'; import 'package:myecl/booking/repositories/booking_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class UserBookingListProvider extends ListNotifier { final BookingRepository bookingRepository; @@ -44,8 +43,6 @@ final userBookingListProvider = final provider = UserBookingListProvider( bookingRepository: bookingRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadUserBookings(); - }); + provider.loadUserBookings(); return provider; }); diff --git a/lib/booking/providers/user_manager_list_provider.dart b/lib/booking/providers/user_manager_list_provider.dart index 2137a4d9d..e9b79641a 100644 --- a/lib/booking/providers/user_manager_list_provider.dart +++ b/lib/booking/providers/user_manager_list_provider.dart @@ -1,16 +1,12 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/booking/class/manager.dart'; import 'package:myecl/booking/repositories/manager_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class UserManagerListNotifier extends ListNotifier { - final ManagerRepository managerRepository = ManagerRepository(); - UserManagerListNotifier({required String token}) - : super(const AsyncValue.loading()) { - managerRepository.setToken(token); - } + final ManagerRepository managerRepository; + UserManagerListNotifier(this.managerRepository) + : super(const AsyncValue.loading()); Future>> loadManagers() async { return await loadList(managerRepository.getUserManagerList); @@ -21,10 +17,8 @@ final userManagerListProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); - final provider = UserManagerListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await provider.loadManagers(); - }); + final managerRepository = ref.watch(managerRepositoryProvider); + final provider = UserManagerListNotifier(managerRepository); + provider.loadManagers(); return provider; }); diff --git a/lib/booking/repositories/booking_repository.dart b/lib/booking/repositories/booking_repository.dart index 7434dfe9a..aa4531ee1 100644 --- a/lib/booking/repositories/booking_repository.dart +++ b/lib/booking/repositories/booking_repository.dart @@ -1,5 +1,4 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/booking/class/booking.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +7,8 @@ class BookingRepository extends Repository { // ignore: overridden_fields final ext = 'booking/bookings'; + BookingRepository(super.ref); + Future> getUserBookingList() async { return List.from( (await getList(suffix: "/users/me")).map((x) => Booking.fromJson(x)), @@ -58,6 +59,5 @@ class BookingRepository extends Repository { } final bookingRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return BookingRepository()..setToken(token); + return BookingRepository(ref); }); diff --git a/lib/booking/repositories/manager_repository.dart b/lib/booking/repositories/manager_repository.dart index eebf2ade6..003b91fdd 100644 --- a/lib/booking/repositories/manager_repository.dart +++ b/lib/booking/repositories/manager_repository.dart @@ -1,3 +1,4 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/booking/class/manager.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -6,6 +7,8 @@ class ManagerRepository extends Repository { // ignore: overridden_fields final ext = "booking/managers"; + ManagerRepository(super.ref); + Future> getManagerList() async { return List.from( (await getList()).map((x) => Manager.fromJson(x)), @@ -30,3 +33,7 @@ class ManagerRepository extends Repository { return await delete("/$managerId"); } } + +final managerRepositoryProvider = Provider((ref) { + return ManagerRepository(ref); +}); diff --git a/lib/booking/repositories/rooms_repository.dart b/lib/booking/repositories/rooms_repository.dart index 58069f535..72b955378 100644 --- a/lib/booking/repositories/rooms_repository.dart +++ b/lib/booking/repositories/rooms_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/booking/class/room.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +7,8 @@ class RoomRepository extends Repository { // ignore: overridden_fields final ext = 'booking/rooms'; + RoomRepository(super.ref); + Future> getRoomList() async { return List.from((await getList()).map((x) => Room.fromJson(x))); } @@ -26,6 +27,5 @@ class RoomRepository extends Repository { } final roomRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return RoomRepository()..setToken(token); + return RoomRepository(ref); }); diff --git a/lib/booking/router.dart b/lib/booking/router.dart index b9946838d..f7a54417b 100644 --- a/lib/booking/router.dart +++ b/lib/booking/router.dart @@ -18,9 +18,9 @@ import 'package:myecl/booking/ui/pages/manager_page/manager_page.dart' import 'package:myecl/booking/ui/pages/admin_pages/add_edit_room_page.dart' deferred as add_edit_room_page; import 'package:myecl/drawer/class/module.dart'; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class BookingRouter { diff --git a/lib/booking/ui/pages/admin_pages/add_edit_manager_page.dart b/lib/booking/ui/pages/admin_pages/add_edit_manager_page.dart index 7621df74b..df277facc 100644 --- a/lib/booking/ui/pages/admin_pages/add_edit_manager_page.dart +++ b/lib/booking/ui/pages/admin_pages/add_edit_manager_page.dart @@ -12,7 +12,6 @@ import 'package:myecl/booking/ui/pages/admin_pages/admin_entry.dart'; import 'package:myecl/booking/ui/pages/admin_pages/admin_scroll_chips.dart'; import 'package:myecl/booking/ui/pages/admin_pages/admin_shrink_button.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/item_chip.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -99,40 +98,36 @@ class AddEditManagerPage extends HookConsumerWidget { const SizedBox(height: 50), AdminShrinkButton( onTap: () async { - await tokenExpireWrapper(ref, () async { - Manager newManager = Manager( - id: isEdit ? manager.id : '', - name: name.text, - groupId: groupId, - ); - final value = isEdit - ? await managerListNotifier.updateManager( - newManager, + Manager newManager = Manager( + id: isEdit ? manager.id : '', + name: name.text, + groupId: groupId, + ); + final value = isEdit + ? await managerListNotifier.updateManager(newManager) + : await managerListNotifier.addManager(newManager); + if (value) { + QR.back(); + isEdit + ? displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.editedManager, ) - : await managerListNotifier.addManager(newManager); - if (value) { - QR.back(); - isEdit - ? displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.editedManager, - ) - : displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.addedManager, - ); - } else { - isEdit - ? displayToastWithContext( - TypeMsg.error, - BookingTextConstants.editionError, - ) - : displayToastWithContext( - TypeMsg.error, - BookingTextConstants.addingError, - ); - } - }); + : displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.addedManager, + ); + } else { + isEdit + ? displayToastWithContext( + TypeMsg.error, + BookingTextConstants.editionError, + ) + : displayToastWithContext( + TypeMsg.error, + BookingTextConstants.addingError, + ); + } }, buttonText: isEdit ? BookingTextConstants.edit @@ -142,32 +137,30 @@ class AddEditManagerPage extends HookConsumerWidget { const SizedBox(height: 30), AdminShrinkButton( onTap: () async { - await tokenExpireWrapper(ref, () async { - await showDialog( - context: context, - builder: (context) => CustomDialogBox( - descriptions: BookingTextConstants - .deleteManagerConfirmation, - onYes: () async { - final value = await managerListNotifier - .deleteManager(manager); - if (value) { - QR.back(); - displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.deletedManager, - ); - } else { - displayToastWithContext( - TypeMsg.error, - BookingTextConstants.deletingError, - ); - } - }, - title: BookingTextConstants.deleting, - ), - ); - }); + await showDialog( + context: context, + builder: (context) => CustomDialogBox( + descriptions: + BookingTextConstants.deleteManagerConfirmation, + onYes: () async { + final value = await managerListNotifier + .deleteManager(manager); + if (value) { + QR.back(); + displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.deletedManager, + ); + } else { + displayToastWithContext( + TypeMsg.error, + BookingTextConstants.deletingError, + ); + } + }, + title: BookingTextConstants.deleting, + ), + ); }, buttonText: BookingTextConstants.delete, ), diff --git a/lib/booking/ui/pages/admin_pages/add_edit_room_page.dart b/lib/booking/ui/pages/admin_pages/add_edit_room_page.dart index 706f48ad6..79f7ba7a9 100644 --- a/lib/booking/ui/pages/admin_pages/add_edit_room_page.dart +++ b/lib/booking/ui/pages/admin_pages/add_edit_room_page.dart @@ -13,7 +13,6 @@ import 'package:myecl/booking/ui/pages/admin_pages/admin_entry.dart'; import 'package:myecl/booking/ui/pages/admin_pages/admin_scroll_chips.dart'; import 'package:myecl/booking/ui/pages/admin_pages/admin_shrink_button.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/item_chip.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -99,38 +98,36 @@ class AddEditRoomPage extends HookConsumerWidget { const SizedBox(height: 50), AdminShrinkButton( onTap: () async { - await tokenExpireWrapper(ref, () async { - Room newRoom = Room( - id: isEdit ? room.id : '', - name: name.text, - managerId: managerId, - ); - final value = isEdit - ? await roomListNotifier.updateRoom(newRoom) - : await roomListNotifier.addRoom(newRoom); - if (value) { - QR.back(); - isEdit - ? displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.editedRoom, - ) - : displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.addedRoom, - ); - } else { - isEdit - ? displayToastWithContext( - TypeMsg.error, - BookingTextConstants.editionError, - ) - : displayToastWithContext( - TypeMsg.error, - BookingTextConstants.addingError, - ); - } - }); + Room newRoom = Room( + id: isEdit ? room.id : '', + name: name.text, + managerId: managerId, + ); + final value = isEdit + ? await roomListNotifier.updateRoom(newRoom) + : await roomListNotifier.addRoom(newRoom); + if (value) { + QR.back(); + isEdit + ? displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.editedRoom, + ) + : displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.addedRoom, + ); + } else { + isEdit + ? displayToastWithContext( + TypeMsg.error, + BookingTextConstants.editionError, + ) + : displayToastWithContext( + TypeMsg.error, + BookingTextConstants.addingError, + ); + } }, buttonText: isEdit ? BookingTextConstants.edit @@ -140,33 +137,31 @@ class AddEditRoomPage extends HookConsumerWidget { const SizedBox(height: 30), AdminShrinkButton( onTap: () async { - await tokenExpireWrapper(ref, () async { - await showDialog( - context: context, - builder: (context) => CustomDialogBox( - descriptions: - BookingTextConstants.deleteRoomConfirmation, - onYes: () async { - final value = await roomListNotifier.deleteRoom( - room, + await showDialog( + context: context, + builder: (context) => CustomDialogBox( + descriptions: + BookingTextConstants.deleteRoomConfirmation, + onYes: () async { + final value = await roomListNotifier.deleteRoom( + room, + ); + if (value) { + QR.back(); + displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.deletedRoom, ); - if (value) { - QR.back(); - displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.deletedRoom, - ); - } else { - displayToastWithContext( - TypeMsg.error, - BookingTextConstants.deletingError, - ); - } - }, - title: BookingTextConstants.deleteBooking, - ), - ); - }); + } else { + displayToastWithContext( + TypeMsg.error, + BookingTextConstants.deletingError, + ); + } + }, + title: BookingTextConstants.deleteBooking, + ), + ); }, buttonText: BookingTextConstants.delete, ), diff --git a/lib/booking/ui/pages/booking_pages/add_edit_booking_page.dart b/lib/booking/ui/pages/booking_pages/add_edit_booking_page.dart index 55b841d72..c6a1704b3 100644 --- a/lib/booking/ui/pages/booking_pages/add_edit_booking_page.dart +++ b/lib/booking/ui/pages/booking_pages/add_edit_booking_page.dart @@ -18,7 +18,6 @@ import 'package:myecl/booking/ui/pages/admin_pages/admin_scroll_chips.dart'; import 'package:myecl/booking/ui/pages/booking_pages/checkbox_entry.dart'; import 'package:myecl/event/tools/functions.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/layouts/item_chip.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; @@ -372,85 +371,81 @@ class AddEditBookingPage extends HookConsumerWidget { return; } } - await tokenExpireWrapper(ref, () async { - Booking newBooking = Booking( - id: isEdit ? booking.id : "", - reason: motif.text, - start: DateTime.parse( - processDateBackWithHour(startString), - ), - end: DateTime.parse( - processDateBackWithHour(endString), - ), - creation: DateTime.now(), - note: note.text.isEmpty ? null : note.text, - room: room.value, - key: keyRequired.value, - decision: booking.decision, - recurrenceRule: recurrenceRule, - entity: entity.text, - applicant: isManagerPage - ? booking.applicant - : user.toApplicant(), - applicantId: isManagerPage - ? booking.applicantId - : user.id, - ); - final value = isManagerPage - ? await ref - .read( - managerBookingListProvider.notifier, - ) - .updateBooking(newBooking) - : isEdit - ? await ref - .read(userBookingListProvider.notifier) - .updateBooking(newBooking) - : await ref - .read(userBookingListProvider.notifier) - .addBooking(newBooking); - if (value) { - QR.back(); - ref - .read(userBookingListProvider.notifier) - .loadUserBookings(); - ref - .read(confirmedBookingListProvider.notifier) - .loadConfirmedBooking(); - ref - .read(managerBookingListProvider.notifier) - .loadUserManageBookings(); - ref - .read( - managerConfirmedBookingListProvider - .notifier, - ) - .loadConfirmedBookingForManager(); - if (isEdit) { - displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.editedBooking, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.addedBooking, - ); - } + Booking newBooking = Booking( + id: isEdit ? booking.id : "", + reason: motif.text, + start: DateTime.parse( + processDateBackWithHour(startString), + ), + end: DateTime.parse( + processDateBackWithHour(endString), + ), + creation: DateTime.now(), + note: note.text.isEmpty ? null : note.text, + room: room.value, + key: keyRequired.value, + decision: booking.decision, + recurrenceRule: recurrenceRule, + entity: entity.text, + applicant: isManagerPage + ? booking.applicant + : user.toApplicant(), + applicantId: isManagerPage + ? booking.applicantId + : user.id, + ); + final value = isManagerPage + ? await ref + .read(managerBookingListProvider.notifier) + .updateBooking(newBooking) + : isEdit + ? await ref + .read(userBookingListProvider.notifier) + .updateBooking(newBooking) + : await ref + .read(userBookingListProvider.notifier) + .addBooking(newBooking); + if (value) { + QR.back(); + ref + .read(userBookingListProvider.notifier) + .loadUserBookings(); + ref + .read(confirmedBookingListProvider.notifier) + .loadConfirmedBooking(); + ref + .read(managerBookingListProvider.notifier) + .loadUserManageBookings(); + ref + .read( + managerConfirmedBookingListProvider + .notifier, + ) + .loadConfirmedBookingForManager(); + if (isEdit) { + displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.editedBooking, + ); } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - BookingTextConstants.editionError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - BookingTextConstants.addingError, - ); - } + displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.addedBooking, + ); } - }); + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + BookingTextConstants.editionError, + ); + } else { + displayToastWithContext( + TypeMsg.error, + BookingTextConstants.addingError, + ); + } + } } } else { displayToast( diff --git a/lib/booking/ui/pages/main_page/main_page.dart b/lib/booking/ui/pages/main_page/main_page.dart index 75215cc53..6e5c5d32e 100644 --- a/lib/booking/ui/pages/main_page/main_page.dart +++ b/lib/booking/ui/pages/main_page/main_page.dart @@ -17,7 +17,6 @@ import 'package:myecl/booking/ui/booking.dart'; import 'package:myecl/booking/ui/calendar/calendar.dart'; import 'package:myecl/booking/ui/components/booking_card.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/admin_button.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; @@ -147,36 +146,32 @@ class BookingMainPage extends HookConsumerWidget { QR.to(BookingRouter.root + BookingRouter.detail); }, onDelete: () async { - await tokenExpireWrapper(ref, () async { - await showDialog( - context: context, - builder: (context) => CustomDialogBox( - descriptions: BookingTextConstants - .deleteBookingConfirmation, - onYes: () async { - final value = await bookingsNotifier - .deleteBooking(e); - if (value) { - ref - .read( - managerBookingListProvider.notifier, - ) - .loadUserManageBookings; - displayToastWithContext( - TypeMsg.msg, - BookingTextConstants.deleteBooking, - ); - } else { - displayToastWithContext( - TypeMsg.error, - BookingTextConstants.deletingError, - ); - } - }, - title: BookingTextConstants.deleteBooking, - ), - ); - }); + await showDialog( + context: context, + builder: (context) => CustomDialogBox( + descriptions: BookingTextConstants + .deleteBookingConfirmation, + onYes: () async { + final value = await bookingsNotifier + .deleteBooking(e); + if (value) { + ref + .read(managerBookingListProvider.notifier) + .loadUserManageBookings; + displayToastWithContext( + TypeMsg.msg, + BookingTextConstants.deleteBooking, + ); + } else { + displayToastWithContext( + TypeMsg.error, + BookingTextConstants.deletingError, + ); + } + }, + title: BookingTextConstants.deleteBooking, + ), + ); }, onCopy: () { handleBooking(e.copyWith(id: "")); diff --git a/lib/booking/ui/pages/manager_page/list_booking.dart b/lib/booking/ui/pages/manager_page/list_booking.dart index bfbcda1e7..a2024bb67 100644 --- a/lib/booking/ui/pages/manager_page/list_booking.dart +++ b/lib/booking/ui/pages/manager_page/list_booking.dart @@ -12,7 +12,6 @@ import 'package:myecl/booking/providers/selected_days_provider.dart'; import 'package:myecl/booking/router.dart'; import 'package:myecl/booking/tools/constants.dart'; import 'package:myecl/booking/ui/components/booking_card.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -121,30 +120,23 @@ class ListBooking extends HookConsumerWidget { title: BookingTextConstants.confirm, descriptions: BookingTextConstants.confirmBooking, onYes: () async { - await tokenExpireWrapper(ref, () async { - Booking newBooking = e.copyWith( - decision: Decision.approved, - ); - bookingListNotifier - .toggleConfirmed( - newBooking, - Decision.approved, - ) - .then((value) { - if (value) { - ref - .read( - userBookingListProvider.notifier, - ) - .loadUserBookings(); - confirmedBookingListNotifier.addBooking( - newBooking, - ); - managerConfirmedBookingListNotifier - .addBooking(newBooking); - } - }); - }); + Booking newBooking = e.copyWith( + decision: Decision.approved, + ); + bookingListNotifier + .toggleConfirmed(newBooking, Decision.approved) + .then((value) { + if (value) { + ref + .read(userBookingListProvider.notifier) + .loadUserBookings(); + confirmedBookingListNotifier.addBooking( + newBooking, + ); + managerConfirmedBookingListNotifier + .addBooking(newBooking); + } + }); }, ); }, @@ -158,29 +150,23 @@ class ListBooking extends HookConsumerWidget { title: BookingTextConstants.decline, descriptions: BookingTextConstants.declineBooking, onYes: () async { - await tokenExpireWrapper(ref, () async { - Booking newBooking = e.copyWith( - decision: Decision.declined, - ); - bookingListNotifier - .toggleConfirmed( - newBooking, - Decision.declined, - ) - .then((value) { - if (value) { - ref - .read( - userBookingListProvider.notifier, - ) - .loadUserBookings(); - confirmedBookingListNotifier - .deleteBooking(newBooking); - managerConfirmedBookingListNotifier - .deleteBooking(newBooking); - } - }); - }); + Booking newBooking = e.copyWith( + decision: Decision.declined, + ); + bookingListNotifier + .toggleConfirmed(newBooking, Decision.declined) + .then((value) { + if (value) { + ref + .read(userBookingListProvider.notifier) + .loadUserBookings(); + confirmedBookingListNotifier.deleteBooking( + newBooking, + ); + managerConfirmedBookingListNotifier + .deleteBooking(newBooking); + } + }); }, ); }, diff --git a/lib/centralisation/providers/centralisation_section_provider.dart b/lib/centralisation/providers/centralisation_section_provider.dart index 5175e1717..feadfb15b 100644 --- a/lib/centralisation/providers/centralisation_section_provider.dart +++ b/lib/centralisation/providers/centralisation_section_provider.dart @@ -3,7 +3,6 @@ import 'package:myecl/centralisation/class/module.dart'; import 'package:myecl/centralisation/class/section.dart'; import 'package:myecl/centralisation/repositories/section_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class SectionNotifier extends ListNotifier
{ SectionRepository sectionRepository = SectionRepository(); @@ -23,8 +22,6 @@ class SectionNotifier extends ListNotifier
{ final sectionProvider = StateNotifierProvider>>((ref) { SectionNotifier notifier = SectionNotifier(); - tokenExpireWrapperAuth(ref, () async { - await notifier.initState(); - }); + notifier.initState(); return notifier; }); diff --git a/lib/centralisation/providers/favorites_providers.dart b/lib/centralisation/providers/favorites_providers.dart index 8164f36c7..e3201d6ca 100644 --- a/lib/centralisation/providers/favorites_providers.dart +++ b/lib/centralisation/providers/favorites_providers.dart @@ -1,5 +1,4 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'dart:async'; @@ -47,8 +46,6 @@ class FavoritesNameNotifier extends StateNotifier> { final favoritesNameProvider = StateNotifierProvider>((ref) { final favoritesNameNotifier = FavoritesNameNotifier(); - tokenExpireWrapperAuth(ref, () async { - favoritesNameNotifier.loadFavorites(); - }); + favoritesNameNotifier.loadFavorites(); return favoritesNameNotifier; }); diff --git a/lib/centralisation/router.dart b/lib/centralisation/router.dart index 24130b5ee..c9aaefb96 100644 --- a/lib/centralisation/router.dart +++ b/lib/centralisation/router.dart @@ -5,8 +5,8 @@ import 'package:myecl/centralisation/tools/constants.dart'; import 'package:myecl/centralisation/ui/pages/main_page.dart' deferred as main_page; import 'package:myecl/drawer/class/module.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class CentralisationRouter { diff --git a/lib/cinema/providers/cinema_topic_provider.dart b/lib/cinema/providers/cinema_topic_provider.dart index b767915e7..7ecb73792 100644 --- a/lib/cinema/providers/cinema_topic_provider.dart +++ b/lib/cinema/providers/cinema_topic_provider.dart @@ -1,15 +1,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/cinema/repositories/cinema_topic_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class CinemaTopicsProvider extends ListNotifier { - final CinemaTopicRepository cinemaTopicRepository = CinemaTopicRepository(); - CinemaTopicsProvider({required String token}) - : super(const AsyncValue.loading()) { - cinemaTopicRepository.setToken(token); - } + final CinemaTopicRepository cinemaTopicRepository; + CinemaTopicsProvider(this.cinemaTopicRepository) + : super(const AsyncValue.loading()); Future>> getTopics() async { return await loadList(cinemaTopicRepository.getCinemaTopics); @@ -48,10 +44,8 @@ final cinemaTopicsProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); - CinemaTopicsProvider notifier = CinemaTopicsProvider(token: token); - tokenExpireWrapperAuth(ref, () async { - notifier.getTopics(); - }); + final repository = ref.watch(cinemaTopicRepositoryProvider); + CinemaTopicsProvider notifier = CinemaTopicsProvider(repository); + notifier.getTopics(); return notifier; }); diff --git a/lib/cinema/providers/session_list_provider.dart b/lib/cinema/providers/session_list_provider.dart index c77b6268d..9e9aa2e08 100644 --- a/lib/cinema/providers/session_list_provider.dart +++ b/lib/cinema/providers/session_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/cinema/class/session.dart'; import 'package:myecl/cinema/repositories/session_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class SessionListNotifier extends ListNotifier { final SessionRepository sessionRepository; @@ -44,8 +43,6 @@ final sessionListProvider = SessionListNotifier notifier = SessionListNotifier( sessionRepository: sessionRepository, ); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadSessions(); - }); + notifier.loadSessions(); return notifier; }); diff --git a/lib/cinema/repositories/cinema_topic_repository.dart b/lib/cinema/repositories/cinema_topic_repository.dart index 87eb159fe..e80bce7f3 100644 --- a/lib/cinema/repositories/cinema_topic_repository.dart +++ b/lib/cinema/repositories/cinema_topic_repository.dart @@ -1,3 +1,4 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/tools/repository/repository.dart'; class CinemaTopicRepository extends Repository { @@ -6,6 +7,8 @@ class CinemaTopicRepository extends Repository { final ext = 'notification/'; final prefix = "cinema_"; + CinemaTopicRepository(super.ref); + Future subscribeSession(String topic) async { return await create({}, suffix: "topics/$prefix$topic/subscribe"); } @@ -22,3 +25,7 @@ class CinemaTopicRepository extends Repository { ); } } + +final cinemaTopicRepositoryProvider = Provider((ref) { + return CinemaTopicRepository(ref); +}); diff --git a/lib/cinema/repositories/session_poster_repository.dart b/lib/cinema/repositories/session_poster_repository.dart index dc55c4622..101cf0bc3 100644 --- a/lib/cinema/repositories/session_poster_repository.dart +++ b/lib/cinema/repositories/session_poster_repository.dart @@ -3,7 +3,6 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/repository/logo_repository.dart'; @@ -12,6 +11,8 @@ class SessionPosterRepository extends LogoRepository { // ignore: overridden_fields final ext = 'cinema/sessions/'; + SessionPosterRepository(super.ref); + Future getSessionLogo(String id) async { final bytes = await getLogo(id, suffix: "/poster"); if (bytes.isEmpty) { @@ -29,6 +30,5 @@ class SessionPosterRepository extends LogoRepository { } final sessionPosterRepository = Provider((ref) { - final token = ref.watch(tokenProvider); - return SessionPosterRepository()..setToken(token); + return SessionPosterRepository(ref); }); diff --git a/lib/cinema/repositories/session_repository.dart b/lib/cinema/repositories/session_repository.dart index 07ca246dc..d30d49256 100644 --- a/lib/cinema/repositories/session_repository.dart +++ b/lib/cinema/repositories/session_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/cinema/class/session.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +7,8 @@ class SessionRepository extends Repository { // ignore: overridden_fields final ext = 'cinema/sessions'; + SessionRepository(super.ref); + Future> getAllSessions() async { return (await getList()).map((e) => Session.fromJson(e)).toList(); } @@ -30,6 +31,5 @@ class SessionRepository extends Repository { } final sessionRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return SessionRepository()..setToken(token); + return SessionRepository(ref); }); diff --git a/lib/cinema/repositories/the_movie_db_repository.dart b/lib/cinema/repositories/the_movie_db_repository.dart index a4bd9efb3..9c3eef1c2 100644 --- a/lib/cinema/repositories/the_movie_db_repository.dart +++ b/lib/cinema/repositories/the_movie_db_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/cinema/class/the_movie_db_genre.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,12 +7,13 @@ class TheMovieDBRepository extends Repository { // ignore: overridden_fields final ext = 'cinema/themoviedb/'; + TheMovieDBRepository(super.ref); + Future getMovie(String movieId) async { return TheMovieDBMovie.fromJson(await getOne(movieId)); } } final theMovieDBRepository = Provider((ref) { - final token = ref.watch(tokenProvider); - return TheMovieDBRepository()..setToken(token); + return TheMovieDBRepository(ref); }); diff --git a/lib/cinema/router.dart b/lib/cinema/router.dart index b13706274..0f60cf1a4 100644 --- a/lib/cinema/router.dart +++ b/lib/cinema/router.dart @@ -11,10 +11,10 @@ import 'package:myecl/cinema/ui/pages/main_page/main_page.dart' import 'package:myecl/cinema/ui/pages/session_pages/add_edit_session.dart' deferred as add_edit_session_page; import 'package:myecl/drawer/class/module.dart'; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; -import 'package:myecl/tools/middlewares/notification_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/notification_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class CinemaRouter { diff --git a/lib/cinema/ui/pages/session_pages/add_edit_session.dart b/lib/cinema/ui/pages/session_pages/add_edit_session.dart index b437c1f14..edf582fba 100644 --- a/lib/cinema/ui/pages/session_pages/add_edit_session.dart +++ b/lib/cinema/ui/pages/session_pages/add_edit_session.dart @@ -15,7 +15,6 @@ import 'package:myecl/cinema/tools/functions.dart'; import 'package:myecl/cinema/ui/cinema.dart'; import 'package:myecl/cinema/ui/pages/session_pages/tmdb_button.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/widgets/date_entry.dart'; @@ -106,31 +105,27 @@ class AddEditSessionPage extends HookConsumerWidget { "www.imdb.com" => url.pathSegments[1], _ => throw const FormatException(), }; - tokenExpireWrapper(ref, () async { - movieNotifier.loadMovie(movieId).then((value) { - value.when( - data: (data) async { - name.text = data.title; - overview.text = data.overview; - posterUrl.text = data.posterUrl; - genre.text = data.genres.join(', '); - tagline.text = data.tagline; - duration.text = parseDurationBack( - data.runtime, - ); - logo.value = await getFromUrl( - data.posterUrl, - ); - }, - loading: () {}, - error: (e, s) { - displayToastWithContext( - TypeMsg.error, - e.toString(), - ); - }, - ); - }); + movieNotifier.loadMovie(movieId).then((value) { + value.when( + data: (data) async { + name.text = data.title; + overview.text = data.overview; + posterUrl.text = data.posterUrl; + genre.text = data.genres.join(', '); + tagline.text = data.tagline; + duration.text = parseDurationBack( + data.runtime, + ); + logo.value = await getFromUrl(data.posterUrl); + }, + loading: () {}, + error: (e, s) { + displayToastWithContext( + TypeMsg.error, + e.toString(), + ); + }, + ); }); } on FormatException catch (_) { displayToastWithContext( @@ -238,87 +233,81 @@ class AddEditSessionPage extends HookConsumerWidget { ); return; } - await tokenExpireWrapper(ref, () async { - Session newSession = Session( - name: name.text, - duration: parseDuration(duration.text), - genre: genre.text.isEmpty ? null : genre.text, - id: isEdit ? session.id : '', - overview: overview.text.isEmpty - ? null - : overview.text, - start: DateTime.parse( - processDateBackWithHour(start.text), - ), - tagline: tagline.text.isEmpty ? null : tagline.text, - ); - final value = isEdit - ? await sessionListNotifier.updateSession( - newSession, - ) - : await sessionListNotifier.addSession(newSession); - if (value) { - QR.back(); - if (isEdit) { - sessionList.maybeWhen( - data: (list) async { - final logoBytes = logo.value; - if (logoBytes != null) { - final sessionPosterMapNotifier = ref.read( - sessionPosterMapProvider.notifier, - ); - sessionPosterMapNotifier.autoLoad( - ref, - session.id, - (sessionId) => sessionPosterNotifier - .updateLogo(sessionId, logoBytes), - ); - } - }, - orElse: () {}, - ); - displayToastWithContext( - TypeMsg.msg, - CinemaTextConstants.editedSession, - ); - } else { - sessionList.maybeWhen( - data: (list) async { - final newSession = list.last; - final logoBytes = logo.value; - if (logoBytes != null) { - final sessionPosterMapNotifier = ref.read( - sessionPosterMapProvider.notifier, - ); - sessionPosterMapNotifier.autoLoad( - ref, - newSession.id, - (sessionId) => sessionPosterNotifier - .updateLogo(sessionId, logoBytes), - ); - } - }, - orElse: () {}, - ); - displayToastWithContext( - TypeMsg.msg, - CinemaTextConstants.addedSession, - ); - } + Session newSession = Session( + name: name.text, + duration: parseDuration(duration.text), + genre: genre.text.isEmpty ? null : genre.text, + id: isEdit ? session.id : '', + overview: overview.text.isEmpty ? null : overview.text, + start: DateTime.parse( + processDateBackWithHour(start.text), + ), + tagline: tagline.text.isEmpty ? null : tagline.text, + ); + final value = isEdit + ? await sessionListNotifier.updateSession(newSession) + : await sessionListNotifier.addSession(newSession); + if (value) { + QR.back(); + if (isEdit) { + sessionList.maybeWhen( + data: (list) async { + final logoBytes = logo.value; + if (logoBytes != null) { + final sessionPosterMapNotifier = ref.read( + sessionPosterMapProvider.notifier, + ); + sessionPosterMapNotifier.autoLoad( + ref, + session.id, + (sessionId) => sessionPosterNotifier + .updateLogo(sessionId, logoBytes), + ); + } + }, + orElse: () {}, + ); + displayToastWithContext( + TypeMsg.msg, + CinemaTextConstants.editedSession, + ); } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - CinemaTextConstants.editingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - CinemaTextConstants.addingError, - ); - } + sessionList.maybeWhen( + data: (list) async { + final newSession = list.last; + final logoBytes = logo.value; + if (logoBytes != null) { + final sessionPosterMapNotifier = ref.read( + sessionPosterMapProvider.notifier, + ); + sessionPosterMapNotifier.autoLoad( + ref, + newSession.id, + (sessionId) => sessionPosterNotifier + .updateLogo(sessionId, logoBytes), + ); + } + }, + orElse: () {}, + ); + displayToastWithContext( + TypeMsg.msg, + CinemaTextConstants.addedSession, + ); } - }); + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + CinemaTextConstants.editingError, + ); + } else { + displayToastWithContext( + TypeMsg.error, + CinemaTextConstants.addingError, + ); + } + } } else { displayToast( context, diff --git a/lib/drawer/ui/drawer_top_bar.dart b/lib/drawer/ui/drawer_top_bar.dart index 9b80c778e..a25a7ee58 100644 --- a/lib/drawer/ui/drawer_top_bar.dart +++ b/lib/drawer/ui/drawer_top_bar.dart @@ -4,7 +4,7 @@ import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/admin/providers/is_admin_provider.dart'; import 'package:myecl/admin/router.dart'; -import 'package:myecl/auth/providers/is_connected_provider.dart'; +import 'package:myecl/auth/providers/connection_status_provider.dart'; import 'package:myecl/drawer/providers/animation_provider.dart'; import 'package:myecl/drawer/providers/swipe_provider.dart'; import 'package:myecl/drawer/tools/constants.dart'; @@ -29,7 +29,7 @@ class DrawerTopBar extends HookConsumerWidget { final profilePicture = ref.watch(profilePictureProvider); final hasScrolled = ref.watch(hasScrolledProvider.notifier); final isAdmin = ref.watch(isAdminProvider); - final isConnected = ref.watch(isConnectedProvider); + final isConnected = ref.watch(connectionStatusProvider); final animation = ref.watch(animationProvider); final dropDownAnimation = useAnimationController( duration: const Duration(milliseconds: 250), diff --git a/lib/drawer/ui/quit_dialog.dart b/lib/drawer/ui/quit_dialog.dart index 6d095882f..55f46b950 100644 --- a/lib/drawer/ui/quit_dialog.dart +++ b/lib/drawer/ui/quit_dialog.dart @@ -14,9 +14,9 @@ class QuitDialog extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final auth = ref.watch(authTokenProvider.notifier); - final isCachingNotifier = ref.watch(isCachingProvider.notifier); - final displayQuitNotifier = ref.watch(displayQuitProvider.notifier); + final auth = ref.read(authTokenProvider.notifier); + final isCachingNotifier = ref.read(isAuthCachedProvider.notifier); + final displayQuitNotifier = ref.read(displayQuitProvider.notifier); return GestureDetector( onTap: () { displayQuitNotifier.setDisplay(false); @@ -29,14 +29,14 @@ class QuitDialog extends HookConsumerWidget { descriptions: DrawerTextConstants.loginOut, title: DrawerTextConstants.logOut, onYes: () { - auth.deleteToken(); + displayQuitNotifier.setDisplay(false); + auth.signOut(); if (!kIsWeb) { ref.watch(messagesProvider.notifier).forgetDevice(); ref.watch(firebaseTokenExpirationProvider.notifier).reset(); } isCachingNotifier.set(false); displayToast(context, TypeMsg.msg, DrawerTextConstants.logOut); - displayQuitNotifier.setDisplay(false); }, onNo: () { displayQuitNotifier.setDisplay(false); diff --git a/lib/event/providers/confirmed_event_list_provider.dart b/lib/event/providers/confirmed_event_list_provider.dart index 3a3a0e153..6f267706b 100644 --- a/lib/event/providers/confirmed_event_list_provider.dart +++ b/lib/event/providers/confirmed_event_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/event/class/event.dart'; import 'package:myecl/event/repositories/event_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ConfirmedEventListProvider extends ListNotifier { final EventRepository eventRepository; @@ -32,12 +31,10 @@ final confirmedEventListProvider = StateNotifierProvider>>(( ref, ) { - final eventRepository = ref.watch(eventRepositoryProvider); + final eventRepository = EventRepository(ref); final provider = ConfirmedEventListProvider( eventRepository: eventRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadConfirmedEvent(); - }); + provider.loadConfirmedEvent(); return provider; }); diff --git a/lib/event/providers/event_list_provider.dart b/lib/event/providers/event_list_provider.dart index 4c6935f35..5a5981727 100644 --- a/lib/event/providers/event_list_provider.dart +++ b/lib/event/providers/event_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/event/class/event.dart'; import 'package:myecl/event/repositories/event_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class EventListNotifier extends ListNotifier { final EventRepository eventRepository; @@ -47,12 +46,10 @@ class EventListNotifier extends ListNotifier { final eventListProvider = StateNotifierProvider>>((ref) { - final eventRepository = ref.watch(eventRepositoryProvider); + final eventRepository = EventRepository(ref); EventListNotifier notifier = EventListNotifier( eventRepository: eventRepository, ); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadEventList(); - }); + notifier.loadEventList(); return notifier; }); diff --git a/lib/event/providers/is_admin_provider.dart b/lib/event/providers/is_admin_provider.dart index f4f1f06ca..ac8869420 100644 --- a/lib/event/providers/is_admin_provider.dart +++ b/lib/event/providers/is_admin_provider.dart @@ -2,8 +2,8 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/user/providers/user_provider.dart'; final isEventAdminProvider = StateProvider((ref) { - final me = ref.watch(userProvider); - return me.groups + final groups = ref.watch(userProvider.select((value) => value.groups)); + return groups .map((e) => e.id) .contains("53a669d6-84b1-4352-8d7c-421c1fbd9c6a"); }); diff --git a/lib/event/providers/user_event_list_provider.dart b/lib/event/providers/user_event_list_provider.dart index 54b91aa1e..fdd11a89f 100644 --- a/lib/event/providers/user_event_list_provider.dart +++ b/lib/event/providers/user_event_list_provider.dart @@ -3,7 +3,6 @@ import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/event/class/event.dart'; import 'package:myecl/event/repositories/event_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class EventEventListProvider extends ListNotifier { final EventRepository eventRepository; @@ -45,14 +44,12 @@ final eventEventListProvider = StateNotifierProvider>>(( ref, ) { - final eventRepository = ref.watch(eventRepositoryProvider); - final userId = ref.watch(idProvider); + final eventRepository = EventRepository(ref); + final userId = ref.watch(userIdProvider); final provider = EventEventListProvider(eventRepository: eventRepository); - tokenExpireWrapperAuth(ref, () async { - userId.whenData((value) async { - provider.setId(value); - await provider.loadConfirmedEvent(); - }); + userId.whenData((value) async { + provider.setId(value); + provider.loadConfirmedEvent(); }); return provider; }); diff --git a/lib/event/repositories/event_repository.dart b/lib/event/repositories/event_repository.dart index 2d115b2ab..466430583 100644 --- a/lib/event/repositories/event_repository.dart +++ b/lib/event/repositories/event_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/event/class/event.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +6,8 @@ class EventRepository extends Repository { // ignore: overridden_fields final ext = "calendar/events/"; + EventRepository(super.ref); + Future> getAllEvent() async { return List.from((await getList()).map((x) => Event.fromJson(x))); } @@ -48,8 +48,3 @@ class EventRepository extends Repository { return await delete(id); } } - -final eventRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return EventRepository()..setToken(token); -}); diff --git a/lib/event/router.dart b/lib/event/router.dart index b38b0f46b..1e9e97b63 100644 --- a/lib/event/router.dart +++ b/lib/event/router.dart @@ -11,9 +11,9 @@ import 'package:myecl/event/ui/pages/event_pages/add_edit_event_page.dart' deferred as add_edit_event_page; import 'package:myecl/event/ui/pages/main_page/main_page.dart' deferred as main_page; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class EventRouter { diff --git a/lib/event/ui/pages/admin_page/list_event.dart b/lib/event/ui/pages/admin_page/list_event.dart index 2fb843953..1fd377190 100644 --- a/lib/event/ui/pages/admin_page/list_event.dart +++ b/lib/event/ui/pages/admin_page/list_event.dart @@ -10,7 +10,6 @@ import 'package:myecl/event/providers/event_list_provider.dart'; import 'package:myecl/event/providers/event_provider.dart'; import 'package:myecl/event/router.dart'; import 'package:myecl/event/ui/components/event_ui.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; @@ -105,17 +104,15 @@ class ListEvent extends HookConsumerWidget { title: BookingTextConstants.confirm, descriptions: BookingTextConstants.confirmBooking, onYes: () async { - await tokenExpireWrapper(ref, () async { - eventListNotifier - .toggleConfirmed( - e.copyWith(decision: Decision.approved), - ) - .then((value) { - if (value) { - confirmedEventListNotifier.addEvent(e); - } - }); - }); + eventListNotifier + .toggleConfirmed( + e.copyWith(decision: Decision.approved), + ) + .then((value) { + if (value) { + confirmedEventListNotifier.addEvent(e); + } + }); }, ); }, @@ -129,17 +126,15 @@ class ListEvent extends HookConsumerWidget { title: BookingTextConstants.decline, descriptions: BookingTextConstants.declineBooking, onYes: () async { - await tokenExpireWrapper(ref, () async { - eventListNotifier - .toggleConfirmed( - e.copyWith(decision: Decision.declined), - ) - .then((value) { - if (value) { - confirmedEventListNotifier.deleteEvent(e); - } - }); - }); + eventListNotifier + .toggleConfirmed( + e.copyWith(decision: Decision.declined), + ) + .then((value) { + if (value) { + confirmedEventListNotifier.deleteEvent(e); + } + }); }, ); }, diff --git a/lib/event/ui/pages/event_pages/add_edit_event_page.dart b/lib/event/ui/pages/event_pages/add_edit_event_page.dart index bfb0516e2..cb5db0aad 100644 --- a/lib/event/ui/pages/event_pages/add_edit_event_page.dart +++ b/lib/event/ui/pages/event_pages/add_edit_event_page.dart @@ -12,7 +12,6 @@ import 'package:myecl/event/providers/user_event_list_provider.dart'; import 'package:myecl/event/tools/constants.dart'; import 'package:myecl/event/tools/functions.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; @@ -417,103 +416,100 @@ class AddEditEventPage extends HookConsumerWidget { EventTextConstants.noDaySelected, ); } else { - await tokenExpireWrapper(ref, () async { - String recurrenceRule = ""; - String startString = start.text; - if (!startString.contains("/")) { - startString = - "${processDate(now)} $startString"; - } - String endString = end.text; - if (!endString.contains("/")) { - endString = - "${processDate(now)} $endString"; - } - if (recurrent.value) { - RecurrenceProperties recurrence = - RecurrenceProperties(startDate: now); - recurrence.recurrenceType = - RecurrenceType.weekly; - recurrence.recurrenceRange = - RecurrenceRange.endDate; - recurrence.endDate = DateTime.parse( - processDateBack(recurrenceEndDate.text), - ); - recurrence.weekDays = WeekDays.values - .where( - (element) => - selectedDays[(WeekDays.values - .indexOf(element) - - 1) % - 7], - ) - .toList(); - recurrence.interval = int.parse( - interval.text, - ); - recurrenceRule = SfCalendar.generateRRule( - recurrence, - DateTime.parse( - processDateBackWithHour(startString), - ), - DateTime.parse( - processDateBackWithHour(endString), - ), - ); - } - Event newEvent = Event( - id: isEdit ? event.id : "", - description: description.text, - end: DateTime.parse( - processDateBack(endString), + String recurrenceRule = ""; + String startString = start.text; + if (!startString.contains("/")) { + startString = + "${processDate(now)} $startString"; + } + String endString = end.text; + if (!endString.contains("/")) { + endString = "${processDate(now)} $endString"; + } + if (recurrent.value) { + RecurrenceProperties recurrence = + RecurrenceProperties(startDate: now); + recurrence.recurrenceType = + RecurrenceType.weekly; + recurrence.recurrenceRange = + RecurrenceRange.endDate; + recurrence.endDate = DateTime.parse( + processDateBack(recurrenceEndDate.text), + ); + recurrence.weekDays = WeekDays.values + .where( + (element) => + selectedDays[(WeekDays.values + .indexOf(element) - + 1) % + 7], + ) + .toList(); + recurrence.interval = int.parse( + interval.text, + ); + recurrenceRule = SfCalendar.generateRRule( + recurrence, + DateTime.parse( + processDateBackWithHour(startString), ), - name: name.text, - organizer: organizer.text, - allDay: allDay.value, - location: location.text, - start: DateTime.parse( - processDateBack(startString), + DateTime.parse( + processDateBackWithHour(endString), ), - type: eventType.value, - recurrenceRule: recurrenceRule, - applicantId: user.id, - applicant: user.toApplicant(), - decision: Decision.pending, ); - final value = isEdit - ? await eventListNotifier.updateEvent( - newEvent, - ) - : await eventListNotifier.addEvent( - newEvent, - ); - if (value) { - QR.back(); - if (isEdit) { - displayToastWithContext( - TypeMsg.msg, - EventTextConstants.editedEvent, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - EventTextConstants.addedEvent, + } + Event newEvent = Event( + id: isEdit ? event.id : "", + description: description.text, + end: DateTime.parse( + processDateBack(endString), + ), + name: name.text, + organizer: organizer.text, + allDay: allDay.value, + location: location.text, + start: DateTime.parse( + processDateBack(startString), + ), + type: eventType.value, + recurrenceRule: recurrenceRule, + applicantId: user.id, + applicant: user.toApplicant(), + decision: Decision.pending, + ); + final value = isEdit + ? await eventListNotifier.updateEvent( + newEvent, + ) + : await eventListNotifier.addEvent( + newEvent, ); - } + if (value) { + QR.back(); + if (isEdit) { + displayToastWithContext( + TypeMsg.msg, + EventTextConstants.editedEvent, + ); } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - EventTextConstants.editingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - EventTextConstants.addingError, - ); - } + displayToastWithContext( + TypeMsg.msg, + EventTextConstants.addedEvent, + ); + } + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + EventTextConstants.editingError, + ); + } else { + displayToastWithContext( + TypeMsg.error, + EventTextConstants.addingError, + ); } - }); + } } } }, diff --git a/lib/event/ui/pages/main_page/main_page.dart b/lib/event/ui/pages/main_page/main_page.dart index b94824812..7756bd1a1 100644 --- a/lib/event/ui/pages/main_page/main_page.dart +++ b/lib/event/ui/pages/main_page/main_page.dart @@ -21,8 +21,8 @@ class EventMainPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final isAdmin = ref.watch(isEventAdminProvider); - final eventNotifier = ref.watch(eventProvider.notifier); - final eventListNotifier = ref.watch(eventEventListProvider.notifier); + final eventNotifier = ref.read(eventProvider.notifier); + final eventListNotifier = ref.read(eventEventListProvider.notifier); final events = ref.watch(eventEventListProvider); return EventTemplate( child: AsyncChild( diff --git a/lib/flappybird/providers/score_list_provider.dart b/lib/flappybird/providers/score_list_provider.dart index adfb0cab1..856faf91e 100644 --- a/lib/flappybird/providers/score_list_provider.dart +++ b/lib/flappybird/providers/score_list_provider.dart @@ -1,15 +1,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/flappybird/class/score.dart'; import 'package:myecl/flappybird/repositories/score_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ScoreListNotifier extends ListNotifier { - final ScoreRepository _scoreRepository = ScoreRepository(); - ScoreListNotifier({required String token}) : super(const AsyncLoading()) { - _scoreRepository.setToken(token); - } + final ScoreRepository _scoreRepository; + ScoreListNotifier(this._scoreRepository) : super(const AsyncLoading()); Future>> getLeaderboard() async { return await loadList(_scoreRepository.getLeaderboard); @@ -22,10 +18,8 @@ class ScoreListNotifier extends ListNotifier { final scoreListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - final notifier = ScoreListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.getLeaderboard(); - }); + final scoreRepository = ref.watch(scoreRepositoryProvider); + final notifier = ScoreListNotifier(scoreRepository); + notifier.getLeaderboard(); return notifier; }); diff --git a/lib/flappybird/providers/user_score_provider.dart b/lib/flappybird/providers/user_score_provider.dart index ae01a7b7c..939020716 100644 --- a/lib/flappybird/providers/user_score_provider.dart +++ b/lib/flappybird/providers/user_score_provider.dart @@ -1,15 +1,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/flappybird/class/score.dart'; import 'package:myecl/flappybird/repositories/score_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ScoreListNotifier extends SingleNotifier { - final ScoreRepository _scoreRepository = ScoreRepository(); - ScoreListNotifier({required String token}) : super(const AsyncLoading()) { - _scoreRepository.setToken(token); - } + final ScoreRepository _scoreRepository; + ScoreListNotifier(this._scoreRepository) : super(const AsyncLoading()); Future> getLeaderBoardPosition() async { return await load(_scoreRepository.getLeaderBoardPosition); @@ -18,10 +14,8 @@ class ScoreListNotifier extends SingleNotifier { final userScoreProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - final notifier = ScoreListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.getLeaderBoardPosition(); - }); + final scoreRepository = ref.watch(scoreRepositoryProvider); + final notifier = ScoreListNotifier(scoreRepository); + notifier.getLeaderBoardPosition(); return notifier; }); diff --git a/lib/flappybird/repositories/score_repository.dart b/lib/flappybird/repositories/score_repository.dart index d6ee50318..878ce3207 100644 --- a/lib/flappybird/repositories/score_repository.dart +++ b/lib/flappybird/repositories/score_repository.dart @@ -1,4 +1,5 @@ import 'package:collection/collection.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/flappybird/class/score.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -7,6 +8,8 @@ class ScoreRepository extends Repository { // ignore: overridden_fields final ext = "flappybird/"; + ScoreRepository(super.ref); + Future> getLeaderboard() async { return List.from( (await getList( @@ -27,3 +30,7 @@ class ScoreRepository extends Repository { return Score.fromJson(response); } } + +final scoreRepositoryProvider = Provider((ref) { + return ScoreRepository(ref); +}); diff --git a/lib/flappybird/router.dart b/lib/flappybird/router.dart index 2bd8b6550..860b23a4c 100644 --- a/lib/flappybird/router.dart +++ b/lib/flappybird/router.dart @@ -5,8 +5,8 @@ import 'package:myecl/flappybird/ui/pages/game_page/game_page.dart' deferred as play_page; import 'package:myecl/flappybird/ui/pages/leaderboard_page/leaderboard_page.dart' deferred as main_page; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class FlappyBirdRouter { diff --git a/lib/home/router.dart b/lib/home/router.dart index 6acdea375..6eea1d5c6 100644 --- a/lib/home/router.dart +++ b/lib/home/router.dart @@ -5,8 +5,8 @@ import 'package:myecl/drawer/class/module.dart'; import 'package:myecl/event/ui/pages/detail_page/detail_page.dart' deferred as detail_page; import 'package:myecl/home/ui/home.dart' deferred as home_page; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class HomeRouter { diff --git a/lib/loan/providers/admin_history_loan_list_provider.dart b/lib/loan/providers/admin_history_loan_list_provider.dart index 1f02ab2e8..fc361cf1c 100644 --- a/lib/loan/providers/admin_history_loan_list_provider.dart +++ b/lib/loan/providers/admin_history_loan_list_provider.dart @@ -5,7 +5,6 @@ import 'package:myecl/loan/providers/history_loaner_loan_list_provider.dart'; import 'package:myecl/loan/providers/loaner_provider.dart'; import 'package:myecl/loan/providers/user_loaner_list_provider.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AdminHistoryLoanListNotifier extends MapNotifier { AdminHistoryLoanListNotifier() : super(); @@ -18,17 +17,15 @@ final adminHistoryLoanListProvider = >((ref) { AdminHistoryLoanListNotifier adminLoanListNotifier = AdminHistoryLoanListNotifier(); - tokenExpireWrapperAuth(ref, () async { - final loaners = ref.watch(loanerList); - final loaner = ref.watch(loanerProvider); - final loanListNotifier = ref.watch( - historyLoanerLoanListProvider.notifier, - ); - adminLoanListNotifier.loadTList(loaners); - if (loaner.id == Loaner.empty().id) return adminLoanListNotifier; - loanListNotifier.loadLoan(loaner.id).then((value) { - adminLoanListNotifier.setTData(loaner, value); - }); + final loaners = ref.watch(loanerList); + final loaner = ref.watch(loanerProvider); + final loanListNotifier = ref.watch( + historyLoanerLoanListProvider.notifier, + ); + adminLoanListNotifier.loadTList(loaners); + if (loaner.id == Loaner.empty().id) return adminLoanListNotifier; + loanListNotifier.loadLoan(loaner.id).then((value) { + adminLoanListNotifier.setTData(loaner, value); }); return adminLoanListNotifier; }); diff --git a/lib/loan/providers/admin_loan_list_provider.dart b/lib/loan/providers/admin_loan_list_provider.dart index 93006575f..3e843ad58 100644 --- a/lib/loan/providers/admin_loan_list_provider.dart +++ b/lib/loan/providers/admin_loan_list_provider.dart @@ -5,7 +5,6 @@ import 'package:myecl/loan/providers/loaner_loan_list_provider.dart'; import 'package:myecl/loan/providers/loaner_provider.dart'; import 'package:myecl/loan/providers/user_loaner_list_provider.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AdminLoanListNotifier extends MapNotifier { AdminLoanListNotifier() : super(); @@ -17,15 +16,13 @@ final adminLoanListProvider = Map>?> >((ref) { AdminLoanListNotifier adminLoanListNotifier = AdminLoanListNotifier(); - tokenExpireWrapperAuth(ref, () async { - final loaners = ref.watch(loanerList); - final loaner = ref.watch(loanerProvider); - final loanListNotifier = ref.watch(loanerLoanListProvider.notifier); - adminLoanListNotifier.loadTList(loaners); - if (loaner.id == Loaner.empty().id) return adminLoanListNotifier; - loanListNotifier.loadLoan(loaner.id).then((value) { - adminLoanListNotifier.setTData(loaner, value); - }); + final loaners = ref.watch(loanerList); + final loaner = ref.watch(loanerProvider); + final loanListNotifier = ref.watch(loanerLoanListProvider.notifier); + adminLoanListNotifier.loadTList(loaners); + if (loaner.id == Loaner.empty().id) return adminLoanListNotifier; + loanListNotifier.loadLoan(loaner.id).then((value) { + adminLoanListNotifier.setTData(loaner, value); }); return adminLoanListNotifier; }); diff --git a/lib/loan/providers/history_loaner_loan_list_provider.dart b/lib/loan/providers/history_loaner_loan_list_provider.dart index 56a9f4d5d..ac682d110 100644 --- a/lib/loan/providers/history_loaner_loan_list_provider.dart +++ b/lib/loan/providers/history_loaner_loan_list_provider.dart @@ -1,18 +1,14 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/loan/class/loan.dart'; import 'package:myecl/loan/providers/loaner_id_provider.dart'; import 'package:myecl/loan/repositories/loan_repository.dart'; import 'package:myecl/tools/exception.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class HistoryLoanerLoanListNotifier extends ListNotifier { - final LoanRepository loanRepository = LoanRepository(); - HistoryLoanerLoanListNotifier({required String token}) - : super(const AsyncValue.loading()) { - loanRepository.setToken(token); - } + final LoanRepository loanRepository; + HistoryLoanerLoanListNotifier(this.loanRepository) + : super(const AsyncValue.loading()); Future>> loadLoan(String loanerId) async { return await loadList(() async => loanRepository.getHistory(loanerId)); @@ -102,14 +98,12 @@ final historyLoanerLoanListProvider = HistoryLoanerLoanListNotifier, AsyncValue> >((ref) { - final token = ref.watch(tokenProvider); + final loanRepository = ref.watch(loanRepositoryProvider); HistoryLoanerLoanListNotifier historyLoanerLoanListNotifier = - HistoryLoanerLoanListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - final loanerId = ref.watch(loanerIdProvider); - if (loanerId != "") { - historyLoanerLoanListNotifier.loadLoan(loanerId); - } - }); + HistoryLoanerLoanListNotifier(loanRepository); + final loanerId = ref.watch(loanerIdProvider); + if (loanerId != "") { + historyLoanerLoanListNotifier.loadLoan(loanerId); + } return historyLoanerLoanListNotifier; }); diff --git a/lib/loan/providers/item_list_provider.dart b/lib/loan/providers/item_list_provider.dart index 994ad9aba..35ae96b51 100644 --- a/lib/loan/providers/item_list_provider.dart +++ b/lib/loan/providers/item_list_provider.dart @@ -3,7 +3,6 @@ import 'package:myecl/loan/class/item.dart'; import 'package:myecl/loan/providers/loaner_id_provider.dart'; import 'package:myecl/loan/repositories/item_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ItemListNotifier extends ListNotifier { final ItemRepository itemrepository; @@ -56,11 +55,9 @@ final itemListProvider = ItemListNotifier itemListNotifier = ItemListNotifier( itemrepository: itemRepository, ); - tokenExpireWrapperAuth(ref, () async { - final loanerId = ref.watch(loanerIdProvider); - if (loanerId != "") { - await itemListNotifier.loadItemList(loanerId); - } - }); + final loanerId = ref.watch(loanerIdProvider); + if (loanerId != "") { + itemListNotifier.loadItemList(loanerId); + } return itemListNotifier; }); diff --git a/lib/loan/providers/loan_list_provider.dart b/lib/loan/providers/loan_list_provider.dart index 0a7802bda..f61368b4f 100644 --- a/lib/loan/providers/loan_list_provider.dart +++ b/lib/loan/providers/loan_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/loan/class/loan.dart'; import 'package:myecl/loan/repositories/loan_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class LoanListNotifier extends ListNotifier { final LoanRepository loanrepository; @@ -50,8 +49,6 @@ final loanListProvider = LoanListNotifier loanListNotifier = LoanListNotifier( loanrepository: loanRepository, ); - tokenExpireWrapperAuth(ref, () async { - await loanListNotifier.loadLoanList(); - }); + loanListNotifier.loadLoanList(); return loanListNotifier; }); diff --git a/lib/loan/providers/loaner_list_provider.dart b/lib/loan/providers/loaner_list_provider.dart index 71ecd144f..85106d7c4 100644 --- a/lib/loan/providers/loaner_list_provider.dart +++ b/lib/loan/providers/loaner_list_provider.dart @@ -2,7 +2,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/loan/class/loaner.dart'; import 'package:myecl/loan/repositories/loaner_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class LoanerListNotifier extends ListNotifier { final LoanerRepository loanerRepository; @@ -42,8 +41,6 @@ final loanerListProvider = LoanerListNotifier orderListNotifier = LoanerListNotifier( loanerRepository: loanerRepository, ); - tokenExpireWrapperAuth(ref, () async { - await orderListNotifier.loadLoanerList(); - }); + orderListNotifier.loadLoanerList(); return orderListNotifier; }); diff --git a/lib/loan/providers/loaner_loan_list_provider.dart b/lib/loan/providers/loaner_loan_list_provider.dart index b25c55ace..1b57fc46d 100644 --- a/lib/loan/providers/loaner_loan_list_provider.dart +++ b/lib/loan/providers/loaner_loan_list_provider.dart @@ -4,7 +4,6 @@ import 'package:myecl/loan/providers/loaner_id_provider.dart'; import 'package:myecl/loan/repositories/loan_repository.dart'; import 'package:myecl/tools/exception.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class LoanerLoanListNotifier extends ListNotifier { final LoanRepository loanrepository; @@ -104,11 +103,9 @@ final loanerLoanListProvider = LoanerLoanListNotifier loanerLoanListNotifier = LoanerLoanListNotifier( loanrepository: loanerRepository, ); - tokenExpireWrapperAuth(ref, () async { - final loanerId = ref.watch(loanerIdProvider); - if (loanerId != "") { - loanerLoanListNotifier.loadLoan(loanerId); - } - }); + final loanerId = ref.watch(loanerIdProvider); + if (loanerId != "") { + loanerLoanListNotifier.loadLoan(loanerId); + } return loanerLoanListNotifier; }); diff --git a/lib/loan/providers/loaner_provider.dart b/lib/loan/providers/loaner_provider.dart index 12cf70538..e7e6240ae 100644 --- a/lib/loan/providers/loaner_provider.dart +++ b/lib/loan/providers/loaner_provider.dart @@ -7,8 +7,10 @@ final loanerProvider = Provider((ref) { final loanerId = ref.watch(loanerIdProvider); final loanerList = ref.watch(userLoanerListProvider); return loanerList.maybeWhen( - data: (loanerList) => - loanerList.firstWhere((loaner) => loaner.id == loanerId), + data: (loanerList) => loanerList.firstWhere( + (loaner) => loaner.id == loanerId, + orElse: () => Loaner.empty(), + ), orElse: () => Loaner.empty(), ); }); diff --git a/lib/loan/providers/user_loaner_list_provider.dart b/lib/loan/providers/user_loaner_list_provider.dart index 42bad48ff..a22908872 100644 --- a/lib/loan/providers/user_loaner_list_provider.dart +++ b/lib/loan/providers/user_loaner_list_provider.dart @@ -2,7 +2,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/loan/class/loaner.dart'; import 'package:myecl/loan/repositories/loaner_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class UserLoanerListNotifier extends ListNotifier { final LoanerRepository loanerRepository; @@ -44,9 +43,7 @@ final userLoanerListProvider = UserLoanerListNotifier orderListNotifier = UserLoanerListNotifier( loanerRepository: loanerRepository, ); - tokenExpireWrapperAuth(ref, () async { - await orderListNotifier.loadMyLoanerList(); - }); + orderListNotifier.loadMyLoanerList(); return orderListNotifier; }); diff --git a/lib/loan/repositories/item_repository.dart b/lib/loan/repositories/item_repository.dart index d27df048b..4f622725f 100644 --- a/lib/loan/repositories/item_repository.dart +++ b/lib/loan/repositories/item_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/loan/class/item.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +7,8 @@ class ItemRepository extends Repository { // ignore: overridden_fields final ext = "loans/loaners/"; + ItemRepository(super.ref); + Future> getItemList(String loanerId) async { return List.from( (await getList(suffix: "$loanerId/items")).map((x) => Item.fromJson(x)), @@ -30,6 +31,5 @@ class ItemRepository extends Repository { } final itemRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return ItemRepository()..setToken(token); + return ItemRepository(ref); }); diff --git a/lib/loan/repositories/loan_repository.dart b/lib/loan/repositories/loan_repository.dart index 8c368771e..fc04555c4 100644 --- a/lib/loan/repositories/loan_repository.dart +++ b/lib/loan/repositories/loan_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/loan/class/loan.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +7,8 @@ class LoanRepository extends Repository { // ignore: overridden_fields final ext = "loans/"; + LoanRepository(super.ref); + Future> getLoanListByLoanerId(String loanerId) async { return List.from( (await getList( @@ -58,6 +59,5 @@ class LoanRepository extends Repository { } final loanRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return LoanRepository()..setToken(token); + return LoanRepository(ref); }); diff --git a/lib/loan/repositories/loaner_repository.dart b/lib/loan/repositories/loaner_repository.dart index bc83357e3..06180bd8d 100644 --- a/lib/loan/repositories/loaner_repository.dart +++ b/lib/loan/repositories/loaner_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/loan/class/loaner.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +7,8 @@ class LoanerRepository extends Repository { // ignore: overridden_fields final ext = "loans/"; + LoanerRepository(super.ref); + Future> getLoanerList() async { return List.from( (await getList(suffix: "loaners/")).map((x) => Loaner.fromJson(x)), @@ -40,6 +41,5 @@ class LoanerRepository extends Repository { } final loanerRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return LoanerRepository()..setToken(token); + return LoanerRepository(ref); }); diff --git a/lib/loan/router.dart b/lib/loan/router.dart index 38e3fc418..df01eb867 100644 --- a/lib/loan/router.dart +++ b/lib/loan/router.dart @@ -13,9 +13,9 @@ import 'package:myecl/loan/ui/pages/loan_group_page/add_edit_loan_page.dart' deferred as add_edit_loan_page; import 'package:myecl/loan/ui/pages/main_page/main_page.dart' deferred as main_page; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class LoanRouter { diff --git a/lib/loan/ui/loan.dart b/lib/loan/ui/loan.dart index ccbe301fd..16eb5a847 100644 --- a/lib/loan/ui/loan.dart +++ b/lib/loan/ui/loan.dart @@ -21,7 +21,7 @@ class LoanTemplate extends HookConsumerWidget { title: LoanTextConstants.loan, root: LoanRouter.root, onBack: () { - if (QR.currentPath == + if (Uri.parse(QR.currentPath).path == LoanRouter.root + LoanRouter.admin + LoanRouter.addEditLoan) { final loanersItemsNotifier = ref.watch( loanersItemsProvider.notifier, diff --git a/lib/loan/ui/pages/admin_page/admin_page.dart b/lib/loan/ui/pages/admin_page/admin_page.dart index 23c713165..9670bb77c 100644 --- a/lib/loan/ui/pages/admin_page/admin_page.dart +++ b/lib/loan/ui/pages/admin_page/admin_page.dart @@ -14,7 +14,6 @@ import 'package:myecl/loan/ui/pages/admin_page/loan_history.dart'; import 'package:myecl/loan/ui/pages/admin_page/loaners_bar.dart'; import 'package:myecl/loan/ui/pages/admin_page/loaners_items.dart'; import 'package:myecl/loan/ui/pages/admin_page/on_going_loan.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; class AdminPage extends HookConsumerWidget { @@ -71,84 +70,80 @@ class AdminPage extends HookConsumerWidget { const SizedBox(height: 30), LoanersBar( onTap: (key) async { - tokenExpireWrapper(ref, () async { - loanerIdNotifier.setId(key.id); - final itemListNotifier = ref.read( - itemListProvider.notifier, + loanerIdNotifier.setId(key.id); + final itemListNotifier = ref.read(itemListProvider.notifier); + final loanersItemsNotifier = ref.read( + loanersItemsProvider.notifier, + ); + final listItems = loanersItems[key]; + if (listItems == null) { + loanersItemsNotifier.autoLoadList( + ref, + key, + (key) => itemListNotifier.loadItemList(key.id), ); - final loanersItemsNotifier = ref.read( - loanersItemsProvider.notifier, + } else { + listItems.whenData((loanersItems) async { + if (loanersItems.isEmpty) { + loanersItemsNotifier.autoLoadList( + ref, + key, + (key) => itemListNotifier.loadItemList(key.id), + ); + } + }); + } + final loanListNotifier = ref.read( + loanerLoanListProvider.notifier, + ); + final adminLoanListNotifier = ref.read( + adminLoanListProvider.notifier, + ); + final listAdminItems = adminLoanList[key]; + if (listAdminItems == null) { + adminLoanListNotifier.autoLoadList( + ref, + key, + (key) => loanListNotifier.loadLoan(key.id), ); - final listItems = loanersItems[key]; - if (listItems == null) { - loanersItemsNotifier.autoLoadList( - ref, - key, - (key) => itemListNotifier.loadItemList(key.id), - ); - } else { - listItems.whenData((loanersItems) async { - if (loanersItems.isEmpty) { - loanersItemsNotifier.autoLoadList( - ref, - key, - (key) => itemListNotifier.loadItemList(key.id), - ); - } - }); - } - final loanListNotifier = ref.read( - loanerLoanListProvider.notifier, - ); - final adminLoanListNotifier = ref.read( - adminLoanListProvider.notifier, - ); - final listAdminItems = adminLoanList[key]; - if (listAdminItems == null) { - adminLoanListNotifier.autoLoadList( - ref, - key, - (key) => loanListNotifier.loadLoan(key.id), - ); - } else { - listAdminItems.whenData((adminLoanList) async { - if (adminLoanList.isEmpty) { - adminLoanListNotifier.autoLoadList( - ref, - key, - (key) => loanListNotifier.loadLoan(key.id), - ); - } - }); - } + } else { + listAdminItems.whenData((adminLoanList) async { + if (adminLoanList.isEmpty) { + adminLoanListNotifier.autoLoadList( + ref, + key, + (key) => loanListNotifier.loadLoan(key.id), + ); + } + }); + } - final historyLoanListNotifier = ref.read( - historyLoanerLoanListProvider.notifier, - ); - final adminHistoryLoanListNotifier = ref.read( - adminHistoryLoanListProvider.notifier, + final historyLoanListNotifier = ref.read( + historyLoanerLoanListProvider.notifier, + ); + final adminHistoryLoanListNotifier = ref.read( + adminHistoryLoanListProvider.notifier, + ); + final listAdminHistoryItems = adminHistoryLoanList[key]; + if (listAdminHistoryItems == null) { + adminHistoryLoanListNotifier.autoLoadList( + ref, + key, + (key) => historyLoanListNotifier.loadLoan(key.id), ); - final listAdminHistoryItems = adminHistoryLoanList[key]; - if (listAdminHistoryItems == null) { - adminHistoryLoanListNotifier.autoLoadList( - ref, - key, - (key) => historyLoanListNotifier.loadLoan(key.id), - ); - } else { - listAdminHistoryItems.whenData(( - adminHistoryLoanList, - ) async { - if (adminHistoryLoanList.isEmpty) { - adminHistoryLoanListNotifier.autoLoadList( - ref, - key, - (key) => historyLoanListNotifier.loadLoan(key.id), - ); - } - }); - } - }); + } else { + listAdminHistoryItems.whenData(( + adminHistoryLoanList, + ) async { + if (adminHistoryLoanList.isEmpty) { + adminHistoryLoanListNotifier.autoLoadList( + ref, + key, + (key) => historyLoanListNotifier.loadLoan(key.id), + ); + } + }); + } }, ), const Column( diff --git a/lib/loan/ui/pages/admin_page/loaners_items.dart b/lib/loan/ui/pages/admin_page/loaners_items.dart index 9e541ea83..3247edb6a 100644 --- a/lib/loan/ui/pages/admin_page/loaners_items.dart +++ b/lib/loan/ui/pages/admin_page/loaners_items.dart @@ -15,7 +15,6 @@ import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; import 'package:myecl/tools/ui/widgets/styled_search_bar.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -98,27 +97,25 @@ class LoanersItems extends HookConsumerWidget { builder: (BuildContext context) { return CustomDialogBox( descriptions: LoanTextConstants.deletingItem, - onYes: () { - tokenExpireWrapper(ref, () async { - final value = await itemListNotifier.deleteItem( - e, - loaner.id, + onYes: () async { + final value = await itemListNotifier.deleteItem( + e, + loaner.id, + ); + if (value) { + itemListNotifier.copy().then((value) { + loanersItemsNotifier.setTData(loaner, value); + }); + displayToastWithContext( + TypeMsg.msg, + LoanTextConstants.deletedItem, ); - if (value) { - itemListNotifier.copy().then((value) { - loanersItemsNotifier.setTData(loaner, value); - }); - displayToastWithContext( - TypeMsg.msg, - LoanTextConstants.deletedItem, - ); - } else { - displayToastWithContext( - TypeMsg.error, - LoanTextConstants.deletingError, - ); - } - }); + } else { + displayToastWithContext( + TypeMsg.error, + LoanTextConstants.deletingError, + ); + } }, title: LoanTextConstants.delete, ); diff --git a/lib/loan/ui/pages/admin_page/on_going_loan.dart b/lib/loan/ui/pages/admin_page/on_going_loan.dart index edbcc893e..abf0318b5 100644 --- a/lib/loan/ui/pages/admin_page/on_going_loan.dart +++ b/lib/loan/ui/pages/admin_page/on_going_loan.dart @@ -18,7 +18,6 @@ import 'package:myecl/loan/tools/constants.dart'; import 'package:myecl/loan/ui/pages/admin_page/loan_card.dart'; import 'package:myecl/loan/ui/pages/admin_page/delay_dialog.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; @@ -126,27 +125,25 @@ class OnGoingLoan extends HookConsumerWidget { end: e.end.add(Duration(days: i)), ); await loanNotifier.setLoan(newLoan); - tokenExpireWrapper(ref, () async { - final value = await loanListNotifier.extendLoan( - newLoan, - i, + final value = await loanListNotifier.extendLoan( + newLoan, + i, + ); + if (value) { + adminLoanListNotifier.setTData( + loaner, + await loanListNotifier.copy(), + ); + displayToastWithContext( + TypeMsg.msg, + LoanTextConstants.extendedLoan, ); - if (value) { - adminLoanListNotifier.setTData( - loaner, - await loanListNotifier.copy(), - ); - displayToastWithContext( - TypeMsg.msg, - LoanTextConstants.extendedLoan, - ); - } else { - displayToastWithContext( - TypeMsg.error, - LoanTextConstants.extendingError, - ); - } - }); + } else { + displayToastWithContext( + TypeMsg.error, + LoanTextConstants.extendingError, + ); + } }, ); }, @@ -159,44 +156,42 @@ class OnGoingLoan extends HookConsumerWidget { title: LoanTextConstants.returnLoan, descriptions: LoanTextConstants.returnLoanDescription, onYes: () async { - await tokenExpireWrapper(ref, () async { - final loanItemsId = e.itemsQuantity - .map((e) => e.itemSimple.id) - .toList(); - final updatedItems = loanersItems[loaner]! - .maybeWhen>( - data: (items) => items, - orElse: () => [], - ) - .map((item) { - if (loanItemsId.contains(item.id)) { - return item.copyWith(); - } - return item; - }) - .toList(); - final value = await loanListNotifier.returnLoan(e); - if (value) { - QR.to(LoanRouter.root + LoanRouter.admin); - loanersItemsNotifier.setTData( - loaner, - AsyncData(updatedItems), - ); - adminLoanListNotifier.setTData( - loaner, - await loanListNotifier.copy(), - ); - displayToastWithContext( - TypeMsg.msg, - LoanTextConstants.returnedLoan, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - LoanTextConstants.returningError, - ); - } - }); + final loanItemsId = e.itemsQuantity + .map((e) => e.itemSimple.id) + .toList(); + final updatedItems = loanersItems[loaner]! + .maybeWhen>( + data: (items) => items, + orElse: () => [], + ) + .map((item) { + if (loanItemsId.contains(item.id)) { + return item.copyWith(); + } + return item; + }) + .toList(); + final value = await loanListNotifier.returnLoan(e); + if (value) { + QR.to(LoanRouter.root + LoanRouter.admin); + loanersItemsNotifier.setTData( + loaner, + AsyncData(updatedItems), + ); + adminLoanListNotifier.setTData( + loaner, + await loanListNotifier.copy(), + ); + displayToastWithContext( + TypeMsg.msg, + LoanTextConstants.returnedLoan, + ); + } else { + displayToastWithContext( + TypeMsg.msg, + LoanTextConstants.returningError, + ); + } }, ), ); diff --git a/lib/loan/ui/pages/item_group_page/add_edit_item_page.dart b/lib/loan/ui/pages/item_group_page/add_edit_item_page.dart index dee22f849..1ffcc50e0 100644 --- a/lib/loan/ui/pages/item_group_page/add_edit_item_page.dart +++ b/lib/loan/ui/pages/item_group_page/add_edit_item_page.dart @@ -9,7 +9,6 @@ import 'package:myecl/loan/providers/loaners_items_provider.dart'; import 'package:myecl/loan/tools/constants.dart'; import 'package:myecl/loan/ui/loan.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; @@ -97,57 +96,55 @@ class AddEditItemPage extends HookConsumerWidget { return; } if (key.currentState!.validate()) { - await tokenExpireWrapper(ref, () async { - Item newItem = Item( - id: isEdit ? item.id : '', - name: name.text, - caution: int.parse(caution.text), - suggestedLendingDuration: int.parse( - lendingDuration.text, - ), - loanedQuantity: 1, - totalQuantity: int.parse(quantity.text), + Item newItem = Item( + id: isEdit ? item.id : '', + name: name.text, + caution: int.parse(caution.text), + suggestedLendingDuration: int.parse( + lendingDuration.text, + ), + loanedQuantity: 1, + totalQuantity: int.parse(quantity.text), + ); + final value = isEdit + ? await itemListNotifier.updateItem( + newItem, + loaner.id, + ) + : await itemListNotifier.addItem( + newItem, + loaner.id, + ); + if (value) { + QR.back(); + loanersItemsNotifier.setTData( + loaner, + await itemListNotifier.copy(), ); - final value = isEdit - ? await itemListNotifier.updateItem( - newItem, - loaner.id, - ) - : await itemListNotifier.addItem( - newItem, - loaner.id, - ); - if (value) { - QR.back(); - loanersItemsNotifier.setTData( - loaner, - await itemListNotifier.copy(), + if (isEdit) { + displayToastWithContext( + TypeMsg.msg, + LoanTextConstants.updatedItem, ); - if (isEdit) { - displayToastWithContext( - TypeMsg.msg, - LoanTextConstants.updatedItem, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - LoanTextConstants.addedObject, - ); - } } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - LoanTextConstants.updatingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - LoanTextConstants.addingError, - ); - } + displayToastWithContext( + TypeMsg.msg, + LoanTextConstants.addedObject, + ); + } + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + LoanTextConstants.updatingError, + ); + } else { + displayToastWithContext( + TypeMsg.error, + LoanTextConstants.addingError, + ); } - }); + } } else { displayToast( context, diff --git a/lib/loan/ui/pages/loan_group_page/add_edit_button.dart b/lib/loan/ui/pages/loan_group_page/add_edit_button.dart index 94341e70b..e0a6cbd07 100644 --- a/lib/loan/ui/pages/loan_group_page/add_edit_button.dart +++ b/lib/loan/ui/pages/loan_group_page/add_edit_button.dart @@ -14,7 +14,6 @@ import 'package:myecl/loan/providers/selected_items_provider.dart'; import 'package:myecl/loan/providers/start_provider.dart'; import 'package:myecl/loan/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -62,71 +61,69 @@ class AddEditButton extends HookConsumerWidget { } else { await items.when( data: (itemList) async { - await tokenExpireWrapper(ref, () async { - List selected = itemList - .where( - (element) => - selectedItems[itemList.indexOf(element)] != 0, - ) - .map( - (e) => ItemQuantity( - itemSimple: e.toItemSimple(), - quantity: selectedItems[itemList.indexOf(e)], - ), - ) - .toList(); - if (selected.isNotEmpty) { - Loan newLoan = Loan( - loaner: isEdit ? loan.loaner : loaner, - itemsQuantity: selected, - borrower: borrower, - caution: caution.text, - end: DateTime.parse(processDateBack(end)), - id: isEdit ? loan.id : "", - notes: note.text, - start: DateTime.parse(processDateBack(start)), - returned: false, + List selected = itemList + .where( + (element) => + selectedItems[itemList.indexOf(element)] != 0, + ) + .map( + (e) => ItemQuantity( + itemSimple: e.toItemSimple(), + quantity: selectedItems[itemList.indexOf(e)], + ), + ) + .toList(); + if (selected.isNotEmpty) { + Loan newLoan = Loan( + loaner: isEdit ? loan.loaner : loaner, + itemsQuantity: selected, + borrower: borrower, + caution: caution.text, + end: DateTime.parse(processDateBack(end)), + id: isEdit ? loan.id : "", + notes: note.text, + start: DateTime.parse(processDateBack(start)), + returned: false, + ); + final value = isEdit + ? await loanListNotifier.updateLoan(newLoan) + : await loanListNotifier.addLoan(newLoan); + if (value) { + adminLoanListNotifier.setTData( + isEdit ? loan.loaner : loaner, + await loanListNotifier.copy(), ); - final value = isEdit - ? await loanListNotifier.updateLoan(newLoan) - : await loanListNotifier.addLoan(newLoan); - if (value) { - adminLoanListNotifier.setTData( - isEdit ? loan.loaner : loaner, - await loanListNotifier.copy(), + QR.back(); + if (isEdit) { + displayToastWithContext( + TypeMsg.msg, + LoanTextConstants.updatedLoan, ); - QR.back(); - if (isEdit) { - displayToastWithContext( - TypeMsg.msg, - LoanTextConstants.updatedLoan, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - LoanTextConstants.addedLoan, - ); - } } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - LoanTextConstants.updatingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - LoanTextConstants.addingError, - ); - } + displayToastWithContext( + TypeMsg.msg, + LoanTextConstants.addedLoan, + ); } } else { - displayToastWithContext( - TypeMsg.error, - LoanTextConstants.noItemSelected, - ); + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + LoanTextConstants.updatingError, + ); + } else { + displayToastWithContext( + TypeMsg.error, + LoanTextConstants.addingError, + ); + } } - }); + } else { + displayToastWithContext( + TypeMsg.error, + LoanTextConstants.noItemSelected, + ); + } }, error: (error, s) { displayToast(context, TypeMsg.error, error.toString()); diff --git a/lib/loan/ui/pages/loan_group_page/add_edit_loan_page.dart b/lib/loan/ui/pages/loan_group_page/add_edit_loan_page.dart index 202565413..690302ca4 100644 --- a/lib/loan/ui/pages/loan_group_page/add_edit_loan_page.dart +++ b/lib/loan/ui/pages/loan_group_page/add_edit_loan_page.dart @@ -17,7 +17,6 @@ import 'package:myecl/loan/ui/pages/loan_group_page/number_selected_text.dart'; import 'package:myecl/loan/ui/pages/loan_group_page/search_result.dart'; import 'package:myecl/loan/ui/pages/loan_group_page/start_date_entry.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/styled_search_bar.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; import 'package:myecl/user/providers/user_list_provider.dart'; @@ -82,16 +81,12 @@ class AddEditLoanPage extends HookConsumerWidget { const SizedBox(height: 20), TextEntry( label: LoanTextConstants.borrower, - onChanged: (value) { - tokenExpireWrapper(ref, () async { - if (queryController.text.isNotEmpty) { - await usersNotifier.filterUsers( - queryController.text, - ); - } else { - usersNotifier.clear(); - } - }); + onChanged: (value) async { + if (queryController.text.isNotEmpty) { + await usersNotifier.filterUsers(queryController.text); + } else { + usersNotifier.clear(); + } }, canBeEmpty: false, controller: queryController, diff --git a/lib/login/repositories/sign_up_repository.dart b/lib/login/repositories/sign_up_repository.dart index 0a1a62096..1bb2ea6b6 100644 --- a/lib/login/repositories/sign_up_repository.dart +++ b/lib/login/repositories/sign_up_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/login/class/account_type.dart'; import 'package:myecl/login/class/create_account.dart'; import 'package:myecl/login/class/recover_request.dart'; @@ -11,6 +10,8 @@ class SignUpRepository extends Repository { // ignore: overridden_fields final ext = "users/"; + SignUpRepository(super.ref); + Future createUser(String email, AccountType accountType) async { try { final value = await create({ @@ -69,6 +70,5 @@ class SignUpRepository extends Repository { } final signUpRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return SignUpRepository()..setToken(token); + return SignUpRepository(ref); }); diff --git a/lib/login/router.dart b/lib/login/router.dart index e455fe6a3..bbc886cf2 100644 --- a/lib/login/router.dart +++ b/lib/login/router.dart @@ -11,8 +11,8 @@ import 'package:myecl/login/ui/pages/recover_password/recover_password_page.dart import 'package:myecl/login/ui/pages/register_page/register_page.dart' deferred as register_page; import 'package:myecl/login/ui/web/web_sign_in.dart' deferred as web_sign_in; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class LoginRouter { diff --git a/lib/login/ui/app_sign_in.dart b/lib/login/ui/app_sign_in.dart index e1f84da79..fe130ff60 100644 --- a/lib/login/ui/app_sign_in.dart +++ b/lib/login/ui/app_sign_in.dart @@ -8,9 +8,10 @@ import 'package:myecl/login/router.dart'; import 'package:myecl/login/tools/constants.dart'; import 'package:myecl/login/ui/auth_page.dart'; import 'package:myecl/login/ui/components/sign_in_up_bar.dart'; +import 'package:myecl/router.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/providers/path_forwarding_provider.dart'; +import 'package:myecl/routing/providers/auth_redirect_service_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; class AppSignIn extends HookConsumerWidget { @@ -18,10 +19,15 @@ class AppSignIn extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final authNotifier = ref.watch(authTokenProvider.notifier); - final pathForwarding = ref.read(pathForwardingProvider); + final authNotifier = ref.read(authTokenProvider.notifier); final controller = ref.watch(backgroundAnimationProvider); + final redirectPath = ref.watch( + authRedirectServiceProvider.select( + (service) => service.getRedirect(QR.currentPath), + ), + ); + return LoginTemplate( callback: (AnimationController controller) { if (controller.isCompleted) { @@ -60,20 +66,16 @@ class AppSignIn extends HookConsumerWidget { child: Image(image: AssetImage(getTitanLogo())), ), SignInUpBar( - isLoading: ref - .watch(loadingProvider) - .maybeWhen( - data: (data) => data, - orElse: () => false, - ), + isLoading: ref.watch(isAuthLoadingProvider), + label: LoginTextConstants.signIn, onPressed: () async { - await authNotifier.getTokenFromRequest(); + await authNotifier.signIn(); ref .watch(authTokenProvider) .when( data: (token) { - QR.to(pathForwarding.path); + QR.to(redirectPath ?? AppRouter.root); }, error: (e, s) { displayToast( diff --git a/lib/login/ui/pages/create_account_page/create_account_page.dart b/lib/login/ui/pages/create_account_page/create_account_page.dart index ea0001adf..7b5d29412 100644 --- a/lib/login/ui/pages/create_account_page/create_account_page.dart +++ b/lib/login/ui/pages/create_account_page/create_account_page.dart @@ -25,7 +25,7 @@ class CreateAccountPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final authTokenNotifier = ref.watch(authTokenProvider.notifier); + final authTokenNotifier = ref.read(authTokenProvider.notifier); final signUpNotifier = ref.watch(signUpProvider.notifier); final code = QR.params['code'] ?? ''; final isCodeGiven = code != ''; @@ -279,7 +279,7 @@ class CreateAccountPage extends HookConsumerWidget { TypeMsg.msg, LoginTextConstants.accountActivated, ); - authTokenNotifier.deleteToken(); + authTokenNotifier.signOut(); QR.to(LoginRouter.root); } else { displayToastWithContext( diff --git a/lib/login/ui/pages/forget_page/forget_page.dart b/lib/login/ui/pages/forget_page/forget_page.dart index 16262b80b..c1d06ab88 100644 --- a/lib/login/ui/pages/forget_page/forget_page.dart +++ b/lib/login/ui/pages/forget_page/forget_page.dart @@ -92,9 +92,7 @@ class ForgetPassword extends HookConsumerWidget { const SizedBox(height: 30), SignInUpBar( label: LoginTextConstants.recover, - isLoading: ref - .watch(loadingProvider) - .maybeWhen(data: (data) => data, orElse: () => false), + isLoading: ref.watch(isAuthLoadingProvider), onPressed: () async { final value = await signUpNotifier.recoverUser( email.text, diff --git a/lib/login/ui/pages/recover_password/recover_password_page.dart b/lib/login/ui/pages/recover_password/recover_password_page.dart index e7c4f9685..18e3f7f15 100644 --- a/lib/login/ui/pages/recover_password/recover_password_page.dart +++ b/lib/login/ui/pages/recover_password/recover_password_page.dart @@ -81,7 +81,7 @@ class RecoverPasswordPage extends HookConsumerWidget { TypeMsg.msg, LoginTextConstants.resetedPassword, ); - authTokenNotifier.deleteToken(); + authTokenNotifier.signOut(); QR.to(LoginRouter.root); } else { displayToastWithContext( diff --git a/lib/login/ui/pages/register_page/register_page.dart b/lib/login/ui/pages/register_page/register_page.dart index f66b37840..8e0200d5e 100644 --- a/lib/login/ui/pages/register_page/register_page.dart +++ b/lib/login/ui/pages/register_page/register_page.dart @@ -107,9 +107,7 @@ class Register extends HookConsumerWidget { const SizedBox(height: 30), SignInUpBar( label: LoginTextConstants.create, - isLoading: ref - .watch(loadingProvider) - .maybeWhen(data: (data) => data, orElse: () => false), + isLoading: ref.watch(isAuthLoadingProvider), onPressed: () async { if (key.currentState!.validate()) { final value = await signUpNotifier.createUser( diff --git a/lib/login/ui/pages/sign_in_page/sign_in_page.dart b/lib/login/ui/pages/sign_in_page/sign_in_page.dart index 4f2923c4b..d98349b10 100644 --- a/lib/login/ui/pages/sign_in_page/sign_in_page.dart +++ b/lib/login/ui/pages/sign_in_page/sign_in_page.dart @@ -7,9 +7,9 @@ import 'package:myecl/login/router.dart'; import 'package:myecl/login/tools/constants.dart'; import 'package:myecl/login/ui/auth_page.dart'; import 'package:myecl/login/ui/components/sign_in_up_bar.dart'; +import 'package:myecl/router.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/providers/path_forwarding_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; class SignIn extends HookConsumerWidget { @@ -17,8 +17,7 @@ class SignIn extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final authNotifier = ref.watch(authTokenProvider.notifier); - final pathForwarding = ref.read(pathForwardingProvider); + final authNotifier = ref.read(authTokenProvider.notifier); return LoginTemplate( callback: (AnimationController controller) { @@ -61,20 +60,19 @@ class SignIn extends HookConsumerWidget { child: Image(image: AssetImage(getTitanLogo())), ), SignInUpBar( - isLoading: ref - .watch(loadingProvider) - .maybeWhen( - data: (data) => data, - orElse: () => false, - ), + isLoading: ref.watch(isAuthLoadingProvider), label: LoginTextConstants.signIn, onPressed: () async { - await authNotifier.getTokenFromRequest(); + await authNotifier.signIn(); ref .watch(authTokenProvider) .when( data: (token) { - QR.to(pathForwarding.path); + QR.to( + QR.params['forwardedFrom'] + ?.toString() ?? + AppRouter.root, + ); }, error: (e, s) { displayToast( diff --git a/lib/login/ui/web/left_panel.dart b/lib/login/ui/web/left_panel.dart index c83d0e310..fe361b1f2 100644 --- a/lib/login/ui/web/left_panel.dart +++ b/lib/login/ui/web/left_panel.dart @@ -6,8 +6,9 @@ import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/login/providers/animation_provider.dart'; import 'package:myecl/login/router.dart'; import 'package:myecl/login/tools/constants.dart'; +import 'package:myecl/router.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/providers/path_forwarding_provider.dart'; +import 'package:myecl/routing/providers/auth_redirect_service_provider.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -16,12 +17,15 @@ class LeftPanel extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final authNotifier = ref.watch(authTokenProvider.notifier); - final pathForwarding = ref.read(pathForwardingProvider); + final authNotifier = ref.read(authTokenProvider.notifier); final controller = ref.watch(backgroundAnimationProvider); - final isLoading = ref - .watch(loadingProvider) - .maybeWhen(data: (data) => data, orElse: () => false); + final isLoading = ref.watch(isAuthLoadingProvider); + + final redirectPath = ref.watch( + authRedirectServiceProvider.select( + (service) => service.getRedirect(QR.currentPath), + ), + ); return Column( children: [ @@ -82,12 +86,12 @@ class LeftPanel extends HookConsumerWidget { const SizedBox(height: 70), WaitingButton( onTap: () async { - await authNotifier.getTokenFromRequest(); + await authNotifier.signIn(); ref .watch(authTokenProvider) .when( data: (token) { - QR.to(pathForwarding.path); + QR.to(redirectPath ?? AppRouter.root); }, error: (e, s) { displayToast( diff --git a/lib/main.dart b/lib/main.dart index c5f138a9e..e3660d941 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -94,7 +94,7 @@ class MyApp extends HookConsumerWidget { canPop: false, onPopInvokedWithResult: (didPop, result) async { final topBarCallBack = ref.watch(topBarCallBackProvider); - if (QR.currentPath.split('/').length <= 2) { + if (Uri.parse(QR.currentPath).pathSegments.length <= 2) { final animation = ref.watch(animationProvider); if (animation != null) { final controller = ref.watch(swipeControllerProvider(animation)); diff --git a/lib/others/ui/loading_page.dart b/lib/others/ui/loading_page.dart deleted file mode 100644 index 387053256..000000000 --- a/lib/others/ui/loading_page.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; -import 'package:myecl/login/router.dart'; -import 'package:myecl/router.dart'; -import 'package:myecl/tools/providers/path_forwarding_provider.dart'; -import 'package:myecl/tools/ui/widgets/loader.dart'; -import 'package:myecl/user/providers/user_provider.dart'; -import 'package:myecl/version/providers/titan_version_provider.dart'; -import 'package:myecl/version/providers/version_verifier_provider.dart'; -import 'package:qlevar_router/qlevar_router.dart'; - -class LoadingPage extends ConsumerWidget { - const LoadingPage({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - final versionVerifier = ref.watch(versionVerifierProvider); - final titanVersion = ref.watch(titanVersionProvider); - final isLoggedIn = ref.watch(isLoggedInProvider); - final check = versionVerifier.whenData( - (value) => value.minimalTitanVersion <= titanVersion, - ); - final pathForwarding = ref.read(pathForwardingProvider); - check.when( - data: (value) { - if (!value) { - QR.to(AppRouter.update); - } - if (!isLoggedIn) { - QR.to(LoginRouter.root); - } - final user = ref.watch(asyncUserProvider); - user.when( - data: (data) { - QR.to(pathForwarding.path); - }, - error: (error, s) { - QR.to(LoginRouter.root); - }, - loading: () {}, - ); - }, - loading: () {}, - error: (error, stack) => QR.to(AppRouter.noInternet), - ); - return const Scaffold(body: Loader()); - } -} diff --git a/lib/paiement/providers/device_list_provider.dart b/lib/paiement/providers/device_list_provider.dart index 1f93dedeb..a1f476d8e 100644 --- a/lib/paiement/providers/device_list_provider.dart +++ b/lib/paiement/providers/device_list_provider.dart @@ -26,7 +26,7 @@ final deviceListProvider = StateNotifierProvider>>(( ref, ) { - final deviceListRepository = ref.watch(devicesRepositoryProvider); + final deviceListRepository = DevicesRepository(ref); return DeviceListNotifier(devicesRepository: deviceListRepository) ..getDeviceList(); }); diff --git a/lib/paiement/providers/device_provider.dart b/lib/paiement/providers/device_provider.dart index 473efc5c2..c90fc452c 100644 --- a/lib/paiement/providers/device_provider.dart +++ b/lib/paiement/providers/device_provider.dart @@ -27,6 +27,6 @@ class DeviceListNotifier extends SingleNotifier { final deviceProvider = StateNotifierProvider>((ref) { - final deviceListRepository = ref.watch(devicesRepositoryProvider); + final deviceListRepository = DevicesRepository(ref); return DeviceListNotifier(devicesRepository: deviceListRepository); }); diff --git a/lib/paiement/providers/funding_url_provider.dart b/lib/paiement/providers/funding_url_provider.dart index 729ba4a85..21bb88b4c 100644 --- a/lib/paiement/providers/funding_url_provider.dart +++ b/lib/paiement/providers/funding_url_provider.dart @@ -16,6 +16,6 @@ class FundingUrlNotifier extends SingleNotifier { final fundingUrlProvider = StateNotifierProvider>((ref) { - final fundingUrlRepository = ref.watch(fundingRepositoryProvider); + final fundingUrlRepository = FundingRepository(ref); return FundingUrlNotifier(fundingRepository: fundingUrlRepository); }); diff --git a/lib/paiement/providers/my_history_provider.dart b/lib/paiement/providers/my_history_provider.dart index 80a2964be..a2d17ec89 100644 --- a/lib/paiement/providers/my_history_provider.dart +++ b/lib/paiement/providers/my_history_provider.dart @@ -15,7 +15,7 @@ class MyHistoryNotifier extends ListNotifier { final myHistoryProvider = StateNotifierProvider>>((ref) { - final historyRepository = ref.watch(usersMeRepositoryProvider); + final historyRepository = UsersMeRepository(ref); return MyHistoryNotifier(usersMeRepository: historyRepository) ..getHistory(); }); diff --git a/lib/paiement/providers/my_stores_provider.dart b/lib/paiement/providers/my_stores_provider.dart index 9c0a002c5..4e4b16efb 100644 --- a/lib/paiement/providers/my_stores_provider.dart +++ b/lib/paiement/providers/my_stores_provider.dart @@ -15,7 +15,7 @@ class MyStoresNotifier extends ListNotifier { final myStoresProvider = StateNotifierProvider>>((ref) { - final myStoresRepository = ref.watch(usersMeRepositoryProvider); + final myStoresRepository = UsersMeRepository(ref); return MyStoresNotifier(usersMeRepository: myStoresRepository) ..getMyStores(); }); diff --git a/lib/paiement/providers/my_wallet_provider.dart b/lib/paiement/providers/my_wallet_provider.dart index 855cffb5f..bd961051e 100644 --- a/lib/paiement/providers/my_wallet_provider.dart +++ b/lib/paiement/providers/my_wallet_provider.dart @@ -15,7 +15,7 @@ class MyWalletNotifier extends SingleNotifier { final myWalletProvider = StateNotifierProvider>((ref) { - final usersMeRepository = ref.watch(usersMeRepositoryProvider); + final usersMeRepository = UsersMeRepository(ref); return MyWalletNotifier(usersMeRepository: usersMeRepository) ..getMyWallet(); }); diff --git a/lib/paiement/providers/register_provider.dart b/lib/paiement/providers/register_provider.dart index 715fcfa95..1bfe64b4d 100644 --- a/lib/paiement/providers/register_provider.dart +++ b/lib/paiement/providers/register_provider.dart @@ -14,6 +14,6 @@ class RegisterNotifier extends SingleNotifier { final registerProvider = StateNotifierProvider>((ref) { - final registerRepository = ref.watch(usersMeRepositoryProvider); + final registerRepository = UsersMeRepository(ref); return RegisterNotifier(usersMeRepository: registerRepository); }); diff --git a/lib/paiement/providers/scan_provider.dart b/lib/paiement/providers/scan_provider.dart index 396412260..de0ff7414 100644 --- a/lib/paiement/providers/scan_provider.dart +++ b/lib/paiement/providers/scan_provider.dart @@ -28,6 +28,6 @@ class ScanNotifier extends SingleNotifier { final scanProvider = StateNotifierProvider>((ref) { - final storesRepository = ref.watch(storesRepositoryProvider); + final storesRepository = StoresRepository(ref); return ScanNotifier(storesRepository: storesRepository); }); diff --git a/lib/paiement/providers/selected_store_history.dart b/lib/paiement/providers/selected_store_history.dart index 2bdd6b244..f7c1603f8 100644 --- a/lib/paiement/providers/selected_store_history.dart +++ b/lib/paiement/providers/selected_store_history.dart @@ -26,7 +26,7 @@ final sellerHistoryProvider = StateNotifierProvider>>(( ref, ) { - final storesRepository = ref.watch(storesRepositoryProvider); + final storesRepository = StoresRepository(ref); final selectedStore = ref.watch(selectedStoreProvider); final selectedInterval = ref.watch(selectedIntervalProvider); if (selectedStore.id != Store.empty().id) { diff --git a/lib/paiement/providers/store_sellers_list_provider.dart b/lib/paiement/providers/store_sellers_list_provider.dart index ac97ce393..3bf602a1a 100644 --- a/lib/paiement/providers/store_sellers_list_provider.dart +++ b/lib/paiement/providers/store_sellers_list_provider.dart @@ -49,7 +49,7 @@ final sellerStoreProvider = AsyncValue>, String >((ref, storeId) { - final sellerStoreRepository = ref.watch(sellerStoreRepositoryProvider); + final sellerStoreRepository = SellerStoreRepository(ref); return StoreSellerListNotifier( sellerStoreRepository: sellerStoreRepository, )..getStoreSellerList(storeId); diff --git a/lib/paiement/providers/stores_list_provider.dart b/lib/paiement/providers/stores_list_provider.dart index 421363c47..d01d53bb2 100644 --- a/lib/paiement/providers/stores_list_provider.dart +++ b/lib/paiement/providers/stores_list_provider.dart @@ -50,9 +50,9 @@ class StoreListNotifier extends ListNotifier { final storeListProvider = StateNotifierProvider>>((ref) { - final storeListRepository = ref.watch(storesRepositoryProvider); - final structureRepository = ref.watch(structuresRepositoryProvider); - final usersMeRepository = ref.watch(usersMeRepositoryProvider); + final storeListRepository = StoresRepository(ref); + final structureRepository = StructuresRepository(ref); + final usersMeRepository = UsersMeRepository(ref); return StoreListNotifier( storesRepository: storeListRepository, structureRepository: structureRepository, diff --git a/lib/paiement/providers/structure_list_provider.dart b/lib/paiement/providers/structure_list_provider.dart index 90dd35fc0..eb324a551 100644 --- a/lib/paiement/providers/structure_list_provider.dart +++ b/lib/paiement/providers/structure_list_provider.dart @@ -41,7 +41,7 @@ final structureListProvider = StateNotifierProvider>>(( ref, ) { - final structureRepository = ref.watch(structuresRepositoryProvider); + final structureRepository = StructuresRepository(ref); final notifier = StructureListNotifier( structuresRepository: structureRepository, )..getStructures(); diff --git a/lib/paiement/providers/tos_provider.dart b/lib/paiement/providers/tos_provider.dart index db85af66e..8fe0e6128 100644 --- a/lib/paiement/providers/tos_provider.dart +++ b/lib/paiement/providers/tos_provider.dart @@ -18,6 +18,6 @@ class TOSNotifier extends SingleNotifier { } final tosProvider = StateNotifierProvider>((ref) { - final tosRepository = ref.watch(tosRepositoryProvider); + final tosRepository = TosRepository(ref); return TOSNotifier(tosRepository: tosRepository)..getTOS(); }); diff --git a/lib/paiement/providers/transaction_provider.dart b/lib/paiement/providers/transaction_provider.dart index 01a817e85..3ae79b12b 100644 --- a/lib/paiement/providers/transaction_provider.dart +++ b/lib/paiement/providers/transaction_provider.dart @@ -26,6 +26,6 @@ class TransactionNotifier extends SingleNotifier { final transactionProvider = StateNotifierProvider>((ref) { - final transactionRepository = ref.watch(transactionsRepositoryProvider); + final transactionRepository = TransactionsRepository(ref); return TransactionNotifier(transactionRepository: transactionRepository); }); diff --git a/lib/paiement/providers/transfer_structure_provider.dart b/lib/paiement/providers/transfer_structure_provider.dart index bc635e3dd..687ca4c53 100644 --- a/lib/paiement/providers/transfer_structure_provider.dart +++ b/lib/paiement/providers/transfer_structure_provider.dart @@ -16,7 +16,7 @@ class TransferStructureNotifier extends StateNotifier { } final transferStructureProvider = StateNotifierProvider((ref) { - final structureRepository = ref.watch(structuresRepositoryProvider); + final structureRepository = StructuresRepository(ref); final notifier = TransferStructureNotifier( structuresRepository: structureRepository, ); diff --git a/lib/paiement/repositories/devices_repository.dart b/lib/paiement/repositories/devices_repository.dart index 5d055601f..f004145b7 100644 --- a/lib/paiement/repositories/devices_repository.dart +++ b/lib/paiement/repositories/devices_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/paiement/class/create_device.dart'; import 'package:myecl/paiement/class/wallet_device.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -9,6 +7,8 @@ class DevicesRepository extends Repository { // ignore: overridden_fields final ext = 'myeclpay/users/me/wallet/devices'; + DevicesRepository(super.ref); + Future registerDevice(CreateDevice body) async { return WalletDevice.fromJson(await create(body.toJson())); } @@ -27,8 +27,3 @@ class DevicesRepository extends Repository { return await create(id, suffix: '/$id/revoke'); } } - -final devicesRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return DevicesRepository()..setToken(token); -}); diff --git a/lib/paiement/repositories/funding_repository.dart b/lib/paiement/repositories/funding_repository.dart index 0a116f021..0a14d5212 100644 --- a/lib/paiement/repositories/funding_repository.dart +++ b/lib/paiement/repositories/funding_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/paiement/class/funding_url.dart'; import 'package:myecl/paiement/class/init_info.dart'; import 'package:myecl/paiement/class/transfert.dart'; @@ -10,6 +8,8 @@ class FundingRepository extends Repository { // ignore: overridden_fields final ext = 'myeclpay/transfer/'; + FundingRepository(super.ref); + Future getAdminPaymentUrl(Transfer transfer) async { return await create(transfer.toJson(), suffix: "admin"); } @@ -18,8 +18,3 @@ class FundingRepository extends Repository { return FundingUrl.fromJson(await create(info.toJson(), suffix: "init")); } } - -final fundingRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return FundingRepository()..setToken(token); -}); diff --git a/lib/paiement/repositories/store_sellers_repository.dart b/lib/paiement/repositories/store_sellers_repository.dart index b9d607db7..b43df1814 100644 --- a/lib/paiement/repositories/store_sellers_repository.dart +++ b/lib/paiement/repositories/store_sellers_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/paiement/class/seller.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +6,8 @@ class SellerStoreRepository extends Repository { // ignore: overridden_fields final ext = 'myeclpay/stores'; + SellerStoreRepository(super.ref); + Future createSeller(String storeId, Seller seller) async { return Seller.fromJson( await create(seller.toJson(), suffix: "/$storeId/sellers"), @@ -34,8 +34,3 @@ class SellerStoreRepository extends Repository { return await update(seller.toJson(), "/$storeId/sellers/$userId"); } } - -final sellerStoreRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return SellerStoreRepository()..setToken(token); -}); diff --git a/lib/paiement/repositories/stores_repository.dart b/lib/paiement/repositories/stores_repository.dart index 4511e77d9..94748094f 100644 --- a/lib/paiement/repositories/stores_repository.dart +++ b/lib/paiement/repositories/stores_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/paiement/class/history.dart'; import 'package:myecl/paiement/class/qr_code_data.dart'; import 'package:myecl/paiement/class/store.dart'; @@ -12,6 +10,8 @@ class StoresRepository extends Repository { // ignore: overridden_fields final ext = 'myeclpay/stores'; + StoresRepository(super.ref); + Future updateStore(Store store) async { return await update(store.toJson(), "/${store.id}"); } @@ -55,8 +55,3 @@ class StoresRepository extends Repository { return response["success"] == true; } } - -final storesRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return StoresRepository()..setToken(token); -}); diff --git a/lib/paiement/repositories/structure_repository.dart b/lib/paiement/repositories/structure_repository.dart new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/lib/paiement/repositories/structure_repository.dart @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/paiement/repositories/structures_repository.dart b/lib/paiement/repositories/structures_repository.dart index 8ce1640cc..f9a2c5821 100644 --- a/lib/paiement/repositories/structures_repository.dart +++ b/lib/paiement/repositories/structures_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/paiement/class/store.dart'; import 'package:myecl/paiement/class/structure.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -9,6 +7,8 @@ class StructuresRepository extends Repository { // ignore: overridden_fields final ext = 'myeclpay/structures'; + StructuresRepository(super.ref); + Future createStructure(Structure structure) async { return Structure.fromJson(await create(structure.toJson())); } @@ -50,8 +50,3 @@ class StructuresRepository extends Repository { ); } } - -final structuresRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return StructuresRepository()..setToken(token); -}); diff --git a/lib/paiement/repositories/tos_repository.dart b/lib/paiement/repositories/tos_repository.dart index 1d673d78d..9d6de5a64 100644 --- a/lib/paiement/repositories/tos_repository.dart +++ b/lib/paiement/repositories/tos_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/paiement/class/tos.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +6,8 @@ class TosRepository extends Repository { // ignore: overridden_fields final ext = 'myeclpay/users/me/'; + TosRepository(super.ref); + Future getTOS() async { return TOS.fromJson(await getOne("tos")); } @@ -16,8 +16,3 @@ class TosRepository extends Repository { return await create(tos.toJson(), suffix: "tos"); } } - -final tosRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return TosRepository()..setToken(token); -}); diff --git a/lib/paiement/repositories/transaction_repository.dart b/lib/paiement/repositories/transaction_repository.dart index 289f0ac4f..99ab734a0 100644 --- a/lib/paiement/repositories/transaction_repository.dart +++ b/lib/paiement/repositories/transaction_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/paiement/class/refund.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +6,8 @@ class TransactionsRepository extends Repository { // ignore: overridden_fields final ext = 'myeclpay/transactions'; + TransactionsRepository(super.ref); + Future refundTransaction(String transactionId, Refund refund) async { return await create(refund.toJson(), suffix: '/$transactionId/refund'); } @@ -16,8 +16,3 @@ class TransactionsRepository extends Repository { return await create({}, suffix: '/$transactionId/cancel'); } } - -final transactionsRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return TransactionsRepository()..setToken(token); -}); diff --git a/lib/paiement/repositories/users_me_repository.dart b/lib/paiement/repositories/users_me_repository.dart index c8fe16049..4fd478c5b 100644 --- a/lib/paiement/repositories/users_me_repository.dart +++ b/lib/paiement/repositories/users_me_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/paiement/class/history.dart'; import 'package:myecl/paiement/class/user_store.dart'; import 'package:myecl/paiement/class/wallet.dart'; @@ -10,6 +8,8 @@ class UsersMeRepository extends Repository { // ignore: overridden_fields final ext = 'myeclpay/users/me/'; + UsersMeRepository(super.ref); + Future register() async { return await create({}, suffix: 'register'); } @@ -30,8 +30,3 @@ class UsersMeRepository extends Repository { return Wallet.fromJson(await getOne("wallet")); } } - -final usersMeRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return UsersMeRepository()..setToken(token); -}); diff --git a/lib/paiement/router.dart b/lib/paiement/router.dart index f5aa4f2fa..12ec27eb7 100644 --- a/lib/paiement/router.dart +++ b/lib/paiement/router.dart @@ -21,9 +21,9 @@ import 'package:myecl/paiement/ui/pages/store_stats_page/store_stats_page.dart' deferred as store_stats_page; import 'package:myecl/paiement/ui/pages/transfer_structure_page/transfer_structure_page.dart' deferred as transfer_structure_page; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class PaymentRouter { diff --git a/lib/paiement/ui/pages/admin_page/admin_store_card.dart b/lib/paiement/ui/pages/admin_page/admin_store_card.dart index 91416c078..ebeab3e29 100644 --- a/lib/paiement/ui/pages/admin_page/admin_store_card.dart +++ b/lib/paiement/ui/pages/admin_page/admin_store_card.dart @@ -6,7 +6,6 @@ import 'package:myecl/paiement/providers/store_provider.dart'; import 'package:myecl/paiement/providers/stores_list_provider.dart'; import 'package:myecl/paiement/router.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; @@ -80,23 +79,21 @@ class AdminStoreCard extends ConsumerWidget { title: "Supprimer l'association", descriptions: "Voulez-vous vraiment supprimer cette association ?", - onYes: () { - tokenExpireWrapper(ref, () async { - final value = await storeListNotifier.deleteStore( - store, + onYes: () async { + final value = await storeListNotifier.deleteStore( + store, + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + "Association supprimée", ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - "Association supprimée", - ); - } else { - displayToastWithContext( - TypeMsg.error, - "Impossible de supprimer l'association", - ); - } - }); + } else { + displayToastWithContext( + TypeMsg.error, + "Impossible de supprimer l'association", + ); + } }, ), ); diff --git a/lib/paiement/ui/pages/devices_page/devices_page.dart b/lib/paiement/ui/pages/devices_page/devices_page.dart index 763cadbf7..bda4745f5 100644 --- a/lib/paiement/ui/pages/devices_page/devices_page.dart +++ b/lib/paiement/ui/pages/devices_page/devices_page.dart @@ -17,7 +17,6 @@ import 'package:myecl/paiement/ui/pages/devices_page/device_item.dart'; import 'package:myecl/paiement/ui/pages/main_page/account_card/device_dialog_box.dart'; import 'package:myecl/paiement/ui/paiement.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; @@ -158,30 +157,27 @@ class DevicesPage extends HookConsumerWidget { descriptions: "Vous ne pourrez plus utiliser cet appareil pour les paiements", onYes: () async { - tokenExpireWrapper(ref, () async { - final value = await devicesNotifier - .revokeDevice( - device.copyWith( - status: WalletDeviceStatus.revoked, - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - "Appareil révoqué", - ); - final savedId = await keyService - .getKeyId(); - if (savedId == device.id) { - await keyService.clear(); - } - } else { - displayToastWithContext( - TypeMsg.error, - "Erreur lors de la révocation de l'appareil", + final value = await devicesNotifier + .revokeDevice( + device.copyWith( + status: WalletDeviceStatus.revoked, + ), ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + "Appareil révoqué", + ); + final savedId = await keyService.getKeyId(); + if (savedId == device.id) { + await keyService.clear(); } - }); + } else { + displayToastWithContext( + TypeMsg.error, + "Erreur lors de la révocation de l'appareil", + ); + } }, ); }, diff --git a/lib/paiement/ui/pages/main_page/account_card/account_card.dart b/lib/paiement/ui/pages/main_page/account_card/account_card.dart index 8404d0821..35575b924 100644 --- a/lib/paiement/ui/pages/main_page/account_card/account_card.dart +++ b/lib/paiement/ui/pages/main_page/account_card/account_card.dart @@ -18,7 +18,6 @@ import 'package:myecl/paiement/ui/pages/main_page/main_card_button.dart'; import 'package:myecl/paiement/ui/pages/main_page/main_card_template.dart'; import 'package:myecl/paiement/ui/pages/pay_page/pay_page.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -98,78 +97,76 @@ class AccountCard extends HookConsumerWidget { icon: HeroIcons.qrCode, title: "Payer", onPressed: () async { - await tokenExpireWrapper(ref, () async { - if (!hasAcceptedToS) { - displayToastWithContext( - TypeMsg.error, - "Veuillez accepter les Conditions Générales d'Utilisation.", - ); - return; - } - String? keyId = await keyService.getKeyId(); - if (keyId == null) { - await showDialog( - context: context, - builder: (context) { - return DeviceDialogBox( - title: 'Appareil non enregistré', - descriptions: - 'Votre appareil n\'est pas encore enregistré. \nPour l\'enregistrer, veuillez vous rendre sur la page des appareils.', - buttonText: 'Accéder à la page', - onClick: () { - QR.to(PaymentRouter.root + PaymentRouter.devices); - }, - ); - }, - ); - return; - } - final device = await deviceNotifier.getDevice(keyId); - device.when( - data: (device) async { - if (device.status == WalletDeviceStatus.active) { - showPayModal(); - } else if (device.status == WalletDeviceStatus.inactive) { - await showDialog( - context: context, - builder: (context) { - return DeviceDialogBox( - title: 'Appareil non activé', - descriptions: - 'Votre appareil n\'est pas encore activé. \nPour l\'activer, veuillez vous rendre sur la page des appareils.', - buttonText: 'Accéder à la page', - onClick: () { - QR.to(PaymentRouter.root + PaymentRouter.devices); - }, - ); - }, - ); - } else { - await showDialog( - context: context, - builder: (context) { - return DeviceDialogBox( - title: 'Appareil révoqué', - descriptions: - 'Votre appareil a été révoqué. \nPour le réactiver, veuillez vous rendre sur la page des appareils.', - buttonText: 'Accéder à la page', - onClick: () { - QR.to(PaymentRouter.root + PaymentRouter.devices); - }, - ); - }, - ); - } - }, - error: (e, s) { - displayToastWithContext( - TypeMsg.error, - "Erreur lors de la récupération de l'appareil", + if (!hasAcceptedToS) { + displayToastWithContext( + TypeMsg.error, + "Veuillez accepter les Conditions Générales d'Utilisation.", + ); + return; + } + String? keyId = await keyService.getKeyId(); + if (keyId == null) { + await showDialog( + context: context, + builder: (context) { + return DeviceDialogBox( + title: 'Appareil non enregistré', + descriptions: + 'Votre appareil n\'est pas encore enregistré. \nPour l\'enregistrer, veuillez vous rendre sur la page des appareils.', + buttonText: 'Accéder à la page', + onClick: () { + QR.to(PaymentRouter.root + PaymentRouter.devices); + }, ); }, - loading: () {}, ); - }); + return; + } + final device = await deviceNotifier.getDevice(keyId); + device.when( + data: (device) async { + if (device.status == WalletDeviceStatus.active) { + showPayModal(); + } else if (device.status == WalletDeviceStatus.inactive) { + await showDialog( + context: context, + builder: (context) { + return DeviceDialogBox( + title: 'Appareil non activé', + descriptions: + 'Votre appareil n\'est pas encore activé. \nPour l\'activer, veuillez vous rendre sur la page des appareils.', + buttonText: 'Accéder à la page', + onClick: () { + QR.to(PaymentRouter.root + PaymentRouter.devices); + }, + ); + }, + ); + } else { + await showDialog( + context: context, + builder: (context) { + return DeviceDialogBox( + title: 'Appareil révoqué', + descriptions: + 'Votre appareil a été révoqué. \nPour le réactiver, veuillez vous rendre sur la page des appareils.', + buttonText: 'Accéder à la page', + onClick: () { + QR.to(PaymentRouter.root + PaymentRouter.devices); + }, + ); + }, + ); + } + }, + error: (e, s) { + displayToastWithContext( + TypeMsg.error, + "Erreur lors de la récupération de l'appareil", + ); + }, + loading: () {}, + ); }, ), MainCardButton( diff --git a/lib/paiement/ui/pages/scan_page/scan_page.dart b/lib/paiement/ui/pages/scan_page/scan_page.dart index 47bda70d7..a06ad5378 100644 --- a/lib/paiement/ui/pages/scan_page/scan_page.dart +++ b/lib/paiement/ui/pages/scan_page/scan_page.dart @@ -12,7 +12,6 @@ import 'package:myecl/paiement/ui/pages/scan_page/cancel_button.dart'; import 'package:myecl/paiement/ui/pages/scan_page/scanner.dart'; import 'package:myecl/tools/exception.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/ui/widgets/loader.dart'; @@ -289,44 +288,39 @@ class ScanPage extends HookConsumerWidget { descriptions: "Voulez-vous vraiment annuler la transaction de ${formatter.format(transaction.total / 100)} € ?", onYes: () async { - tokenExpireWrapper(ref, () async { - final value = - await transactionNotifier - .cancelTransaction( - transaction.id, - ); - value.when( - data: (value) { - if (value) { - displayToastWithContext( - TypeMsg.msg, - "Transaction annulée", - ); - ref - .read( - ongoingTransactionProvider - .notifier, - ) - .clearOngoingTransaction(); - } else { - displayToastWithContext( - TypeMsg.error, - "Erreur lors de l'annulation", - ); - } - ongoingTransactionNotifier + final value = await transactionNotifier + .cancelTransaction(transaction.id); + value.when( + data: (value) { + if (value) { + displayToastWithContext( + TypeMsg.msg, + "Transaction annulée", + ); + ref + .read( + ongoingTransactionProvider + .notifier, + ) .clearOngoingTransaction(); - barcodeNotifier.clearBarcode(); - }, - error: (error, stack) { + } else { displayToastWithContext( TypeMsg.error, - error.toString(), + "Erreur lors de l'annulation", ); - }, - loading: () {}, - ); - }); + } + ongoingTransactionNotifier + .clearOngoingTransaction(); + barcodeNotifier.clearBarcode(); + }, + error: (error, stack) { + displayToastWithContext( + TypeMsg.error, + error.toString(), + ); + }, + loading: () {}, + ); scannerKey.currentState?.resetScanner(); }, ); diff --git a/lib/paiement/ui/pages/scan_page/scanner.dart b/lib/paiement/ui/pages/scan_page/scanner.dart index bcc950c35..f73e47cb7 100644 --- a/lib/paiement/ui/pages/scan_page/scanner.dart +++ b/lib/paiement/ui/pages/scan_page/scanner.dart @@ -13,7 +13,6 @@ import 'package:myecl/paiement/providers/scan_provider.dart'; import 'package:myecl/paiement/providers/selected_store_provider.dart'; import 'package:myecl/paiement/ui/pages/scan_page/scan_overlay_shape.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:qr_flutter/qr_flutter.dart'; @@ -47,9 +46,7 @@ class ScannerState extends ConsumerState with WidgetsBindingObserver { descriptions: "Ce produit n'est pas disponnible pour les non-adhérents. Confirmer l'encaissement ?", onYes: () async { - tokenExpireWrapper(ref, () async { - onYes.call(); - }); + onYes.call(); }, ); }, diff --git a/lib/paiement/ui/pages/store_admin_page/search_result.dart b/lib/paiement/ui/pages/store_admin_page/search_result.dart index 670e04b46..635cf81bd 100644 --- a/lib/paiement/ui/pages/store_admin_page/search_result.dart +++ b/lib/paiement/ui/pages/store_admin_page/search_result.dart @@ -9,7 +9,6 @@ import 'package:myecl/paiement/providers/store_sellers_list_provider.dart'; import 'package:myecl/paiement/ui/pages/store_admin_page/right_check_box.dart'; import 'package:myecl/paiement/ui/pages/store_admin_page/seller_right_dialog.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/user/class/simple_users.dart'; @@ -66,37 +65,35 @@ class SearchResult extends HookConsumerWidget { ], ), onYes: () async { - await tokenExpireWrapper(ref, () async { - newAdminNotifier.updateNewAdmin(simpleUser); - queryController.text = simpleUser.getName(); - Seller seller = Seller( - storeId: store.id, - userId: simpleUser.id, - user: simpleUser, - canBank: sellerRightsList[0], - canSeeHistory: sellerRightsList[1], - canCancel: sellerRightsList[2], - canManageSellers: sellerRightsList[3], - ); - final value = await sellerStoreNotifier.createStoreSeller( - seller, - ); - if (value) { - queryController.clear(); - usersNotifier.clear(); - sellerRightsListNotifier.clearRights(); - newAdminNotifier.resetNewAdmin(); - displayToastWithContext(TypeMsg.msg, "Vendeur ajouté"); - if (context.mounted) { - Navigator.of(context).pop(); - } - } else { - displayToastWithContext( - TypeMsg.error, - "Erreur lors de l'ajout", - ); + newAdminNotifier.updateNewAdmin(simpleUser); + queryController.text = simpleUser.getName(); + Seller seller = Seller( + storeId: store.id, + userId: simpleUser.id, + user: simpleUser, + canBank: sellerRightsList[0], + canSeeHistory: sellerRightsList[1], + canCancel: sellerRightsList[2], + canManageSellers: sellerRightsList[3], + ); + final value = await sellerStoreNotifier.createStoreSeller( + seller, + ); + if (value) { + queryController.clear(); + usersNotifier.clear(); + sellerRightsListNotifier.clearRights(); + newAdminNotifier.resetNewAdmin(); + displayToastWithContext(TypeMsg.msg, "Vendeur ajouté"); + if (context.mounted) { + Navigator.of(context).pop(); } - }); + } else { + displayToastWithContext( + TypeMsg.error, + "Erreur lors de l'ajout", + ); + } onChoose(); }, ); diff --git a/lib/paiement/ui/pages/store_admin_page/seller_right_card.dart b/lib/paiement/ui/pages/store_admin_page/seller_right_card.dart index 16fe7e9a0..15ca167b0 100644 --- a/lib/paiement/ui/pages/store_admin_page/seller_right_card.dart +++ b/lib/paiement/ui/pages/store_admin_page/seller_right_card.dart @@ -5,7 +5,6 @@ import 'package:myecl/paiement/class/seller.dart'; import 'package:myecl/paiement/providers/selected_store_provider.dart'; import 'package:myecl/paiement/providers/store_sellers_list_provider.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; @@ -154,40 +153,38 @@ class SellerRightCard extends ConsumerWidget { vertical: -4, ), onChanged: (value) async { - await tokenExpireWrapper(ref, () async { - final value = await sellerStoreNotifier - .updateStoreSeller( - storeSeller.copyWith( - canBank: i == 0 - ? !sellerRights[0] - : sellerRights[0], - canSeeHistory: i == 1 - ? !sellerRights[1] - : sellerRights[1], - canCancel: i == 2 - ? !sellerRights[2] - : sellerRights[2], - canManageSellers: i == 3 - ? !sellerRights[3] - : sellerRights[3], - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - "Droits mis à jour", - ); - sellerRights[i] = !sellerRights[i]; - if (context.mounted) { - Navigator.pop(context); - } - } else { - displayToastWithContext( - TypeMsg.error, - "Impossible de mettre à jour les droits", + final value = await sellerStoreNotifier + .updateStoreSeller( + storeSeller.copyWith( + canBank: i == 0 + ? !sellerRights[0] + : sellerRights[0], + canSeeHistory: i == 1 + ? !sellerRights[1] + : sellerRights[1], + canCancel: i == 2 + ? !sellerRights[2] + : sellerRights[2], + canManageSellers: i == 3 + ? !sellerRights[3] + : sellerRights[3], + ), ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + "Droits mis à jour", + ); + sellerRights[i] = !sellerRights[i]; + if (context.mounted) { + Navigator.pop(context); } - }); + } else { + displayToastWithContext( + TypeMsg.error, + "Impossible de mettre à jour les droits", + ); + } }, ), ], @@ -202,25 +199,23 @@ class SellerRightCard extends ConsumerWidget { title: "Supprimer l'association", descriptions: "Voulez-vous vraiment supprimer ce vendeur ?", - onYes: () { - tokenExpireWrapper(ref, () async { - final value = await sellerStoreNotifier - .deleteStoreSeller(storeSeller); - if (value) { - displayToastWithContext( - TypeMsg.msg, - "Vendeur supprimé", - ); - if (context.mounted) { - Navigator.pop(context); - } - } else { - displayToastWithContext( - TypeMsg.error, - "Impossible de supprimer le vendeur", - ); + onYes: () async { + final value = await sellerStoreNotifier + .deleteStoreSeller(storeSeller); + if (value) { + displayToastWithContext( + TypeMsg.msg, + "Vendeur supprimé", + ); + if (context.mounted) { + Navigator.pop(context); } - }); + } else { + displayToastWithContext( + TypeMsg.error, + "Impossible de supprimer le vendeur", + ); + } }, ), ); diff --git a/lib/paiement/ui/pages/store_admin_page/store_admin_page.dart b/lib/paiement/ui/pages/store_admin_page/store_admin_page.dart index 7772a3699..6a22d2e20 100644 --- a/lib/paiement/ui/pages/store_admin_page/store_admin_page.dart +++ b/lib/paiement/ui/pages/store_admin_page/store_admin_page.dart @@ -7,7 +7,6 @@ import 'package:myecl/paiement/providers/store_sellers_list_provider.dart'; import 'package:myecl/paiement/ui/pages/store_admin_page/search_result.dart'; import 'package:myecl/paiement/ui/pages/store_admin_page/seller_right_card.dart'; import 'package:myecl/paiement/ui/paiement.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; @@ -115,16 +114,14 @@ class StoreAdminPage extends HookConsumerWidget { Expanded( child: TextEntry( label: "Ajouter un vendeur", - onChanged: (value) { - tokenExpireWrapper(ref, () async { - if (queryController.text.isNotEmpty) { - await usersNotifier.filterUsers( - queryController.text, - ); - } else { - usersNotifier.clear(); - } - }); + onChanged: (value) async { + if (queryController.text.isNotEmpty) { + await usersNotifier.filterUsers( + queryController.text, + ); + } else { + usersNotifier.clear(); + } }, canBeEmpty: false, controller: queryController, diff --git a/lib/ph/providers/ph_cover_provider.dart b/lib/ph/providers/ph_cover_provider.dart index a38e57fac..d28f2320e 100644 --- a/lib/ph/providers/ph_cover_provider.dart +++ b/lib/ph/providers/ph_cover_provider.dart @@ -7,8 +7,6 @@ final phCoverProvider = FutureProvider.family(( ref, id, ) async { - final PhCoverRepository phPdfFirstPageRepository = ref.watch( - phCoverRepositoryProvider, - ); + final PhCoverRepository phPdfFirstPageRepository = PhCoverRepository(ref); return await phPdfFirstPageRepository.getPhPdfFirstPage(id); }); diff --git a/lib/ph/providers/ph_list_provider.dart b/lib/ph/providers/ph_list_provider.dart index a63a8a23a..52ef8cb3a 100644 --- a/lib/ph/providers/ph_list_provider.dart +++ b/lib/ph/providers/ph_list_provider.dart @@ -1,15 +1,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/ph/class/ph.dart'; import 'package:myecl/ph/repositories/ph_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class PhListNotifier extends ListNotifier { - final PhRepository _phRepository = PhRepository(); - PhListNotifier({required String token}) : super(const AsyncValue.loading()) { - _phRepository.setToken(token); - } + final PhRepository _phRepository; + PhListNotifier(this._phRepository) : super(const AsyncValue.loading()); Future>> loadPhList() async { return await loadList(() async => _phRepository.getAllPh()); @@ -40,10 +36,8 @@ class PhListNotifier extends ListNotifier { final phListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - final notifier = PhListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadPhList(); - }); + final repository = PhRepository(ref); + final notifier = PhListNotifier(repository); + notifier.loadPhList(); return notifier; }); diff --git a/lib/ph/providers/ph_pdf_provider.dart b/lib/ph/providers/ph_pdf_provider.dart index 487b23fbe..f38ec6e28 100644 --- a/lib/ph/providers/ph_pdf_provider.dart +++ b/lib/ph/providers/ph_pdf_provider.dart @@ -6,12 +6,12 @@ import 'package:myecl/ph/repositories/ph_pdf_repository.dart'; class PhPdf extends FamilyAsyncNotifier { @override Future build(String arg) async { - final PhPdfRepository phPdfRepository = ref.watch(phPdfRepositoryProvider); + final PhPdfRepository phPdfRepository = PhPdfRepository(ref); return await phPdfRepository.getPhPdf(arg); } Future updatePhPdf(Uint8List bytes) async { - final PhPdfRepository phPdfRepository = ref.watch(phPdfRepositoryProvider); + final PhPdfRepository phPdfRepository = PhPdfRepository(ref); return await phPdfRepository.updatePhPdf(bytes, arg); } } diff --git a/lib/ph/repositories/ph_cover_repository.dart b/lib/ph/repositories/ph_cover_repository.dart index 3520bd246..0dddb5eb9 100644 --- a/lib/ph/repositories/ph_cover_repository.dart +++ b/lib/ph/repositories/ph_cover_repository.dart @@ -1,7 +1,5 @@ import 'dart:async'; import 'dart:typed_data'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/logo_repository.dart'; class PhCoverRepository extends LogoRepository { @@ -9,13 +7,10 @@ class PhCoverRepository extends LogoRepository { // ignore: overridden_fields final ext = "ph/"; + PhCoverRepository(super.ref); + Future getPhPdfFirstPage(String id) async { final uint8List = await getLogo("", suffix: "$id/cover"); return uint8List; } } - -final phCoverRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return PhCoverRepository()..setToken(token); -}); diff --git a/lib/ph/repositories/ph_pdf_repository.dart b/lib/ph/repositories/ph_pdf_repository.dart index 8202db78e..e37d84593 100644 --- a/lib/ph/repositories/ph_pdf_repository.dart +++ b/lib/ph/repositories/ph_pdf_repository.dart @@ -1,7 +1,5 @@ import 'dart:async'; import 'dart:typed_data'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/pdf_repository.dart'; class PhPdfRepository extends PdfRepository { @@ -9,6 +7,8 @@ class PhPdfRepository extends PdfRepository { // ignore: overridden_fields final ext = "ph/"; + PhPdfRepository(super.ref); + Future getPhPdf(String id) async { final uint8List = await getPdf("", suffix: "$id/pdf"); return uint8List; @@ -19,8 +19,3 @@ class PhPdfRepository extends PdfRepository { return uint8List; } } - -final phPdfRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return PhPdfRepository()..setToken(token); -}); diff --git a/lib/ph/repositories/ph_repository.dart b/lib/ph/repositories/ph_repository.dart index 0dffaff81..57afce7ee 100644 --- a/lib/ph/repositories/ph_repository.dart +++ b/lib/ph/repositories/ph_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/ph/class/ph.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +6,8 @@ class PhRepository extends Repository { // ignore: overridden_fields final ext = "ph/"; + PhRepository(super.ref); + Future> getAllPh() async { return (await getList(suffix: '')).map((e) => Ph.fromJson(e)).toList(); } @@ -24,8 +24,3 @@ class PhRepository extends Repository { return await delete(id); } } - -final phRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return PhRepository()..setToken(token); -}); diff --git a/lib/ph/router.dart b/lib/ph/router.dart index 451933381..79a848188 100644 --- a/lib/ph/router.dart +++ b/lib/ph/router.dart @@ -8,8 +8,8 @@ import 'package:myecl/ph/providers/is_ph_admin_provider.dart'; import 'package:myecl/ph/ui/pages/form_page/add_edit_ph_page.dart' deferred as add_edit_ph_page; import 'package:myecl/ph/ui/pages/past_ph_selection_page/past_ph_selection_page.dart'; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; import 'package:myecl/ph/ui/pages/main_page/main_page.dart' deferred as main_page; diff --git a/lib/ph/ui/pages/form_page/add_edit_ph_page.dart b/lib/ph/ui/pages/form_page/add_edit_ph_page.dart index c7c4afe4e..21ad3d28c 100644 --- a/lib/ph/ui/pages/form_page/add_edit_ph_page.dart +++ b/lib/ph/ui/pages/form_page/add_edit_ph_page.dart @@ -14,7 +14,6 @@ import 'package:myecl/ph/tools/functions.dart'; import 'package:myecl/ph/ui/pages/file_picker/pdf_picker.dart'; import 'package:myecl/ph/ui/pages/ph.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/date_entry.dart'; @@ -97,56 +96,52 @@ class PhAddEditPhPage extends HookConsumerWidget { } if (true && (!listEquals(phSendPdf, Uint8List(0)) || isEdit)) { - await tokenExpireWrapper(ref, () async { - final phList = ref.watch(phListProvider); - Ph newPh = Ph( - id: isEdit ? ph.id : '', - date: DateTime.parse( - processDateBack(dateController.text), - ), - name: name.text, - ); - final value = isEdit - ? await phListNotifier.editPh(newPh) - : await phListNotifier.addPh(newPh); + final phList = ref.watch(phListProvider); + Ph newPh = Ph( + id: isEdit ? ph.id : '', + date: DateTime.parse( + processDateBack(dateController.text), + ), + name: name.text, + ); + final value = isEdit + ? await phListNotifier.editPh(newPh) + : await phListNotifier.addPh(newPh); - if (value) { - SystemChannels.textInput.invokeMethod( - 'TextInput.hide', - ); - QR.back(); - { - if (editPdf) { - phList.maybeWhen( - data: (list) { - ref - .read( - phPdfProvider( - list.last.id, - ).notifier, - ) - .updatePhPdf( - Uint8List.fromList(phSendPdf), - ); - }, - orElse: () {}, - ); - } - displayPhToastWithContext( - TypeMsg.msg, - isEdit - ? PhTextConstants.edited - : PhTextConstants.added, + if (value) { + SystemChannels.textInput.invokeMethod( + 'TextInput.hide', + ); + QR.back(); + { + if (editPdf) { + phList.maybeWhen( + data: (list) { + ref + .read( + phPdfProvider(list.last.id).notifier, + ) + .updatePhPdf( + Uint8List.fromList(phSendPdf), + ); + }, + orElse: () {}, ); - editPdfNotifier.editPdf(false); } - } else { displayPhToastWithContext( - TypeMsg.error, - PhTextConstants.addingFileError, + TypeMsg.msg, + isEdit + ? PhTextConstants.edited + : PhTextConstants.added, ); + editPdfNotifier.editPdf(false); } - }); + } else { + displayPhToastWithContext( + TypeMsg.error, + PhTextConstants.addingFileError, + ); + } } else { displayToast( context, diff --git a/lib/phonebook/providers/association_kinds_provider.dart b/lib/phonebook/providers/association_kinds_provider.dart index 4e668bd51..d2b3ee631 100644 --- a/lib/phonebook/providers/association_kinds_provider.dart +++ b/lib/phonebook/providers/association_kinds_provider.dart @@ -1,16 +1,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/phonebook/class/association_kinds.dart'; import 'package:myecl/phonebook/repositories/association_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AssociationKindsNotifier extends SingleNotifier { - final AssociationRepository associationRepository = AssociationRepository(); - AssociationKindsNotifier({required String token}) - : super(const AsyncValue.loading()) { - associationRepository.setToken(token); - } + final AssociationRepository associationRepository; + AssociationKindsNotifier(this.associationRepository) + : super(const AsyncValue.loading()); void setKind(AssociationKinds i) { state = AsyncValue.data(i); @@ -26,12 +22,10 @@ final associationKindsProvider = AssociationKindsNotifier, AsyncValue >((ref) { - final token = ref.watch(tokenProvider); + final associationRepository = AssociationRepository(ref); AssociationKindsNotifier notifier = AssociationKindsNotifier( - token: token, + associationRepository, ); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadAssociationKinds(); - }); + notifier.loadAssociationKinds(); return notifier; }); diff --git a/lib/phonebook/providers/association_list_provider.dart b/lib/phonebook/providers/association_list_provider.dart index a23109788..f88d770cd 100644 --- a/lib/phonebook/providers/association_list_provider.dart +++ b/lib/phonebook/providers/association_list_provider.dart @@ -1,17 +1,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/phonebook/class/association.dart'; import 'package:myecl/phonebook/repositories/association_repository.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AssociationListNotifier extends ListNotifier { - final AssociationRepository associationRepository = AssociationRepository(); + final AssociationRepository associationRepository; AsyncValue> associationList = const AsyncValue.loading(); - AssociationListNotifier({required String token}) - : super(const AsyncValue.loading()) { - associationRepository.setToken(token); - } + AssociationListNotifier(this.associationRepository) + : super(const AsyncValue.loading()); Future>> loadAssociations() async { return await loadList(associationRepository.getAssociationList); @@ -67,10 +63,10 @@ final associationListProvider = AssociationListNotifier, AsyncValue> >((ref) { - final token = ref.watch(tokenProvider); - AssociationListNotifier notifier = AssociationListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadAssociations(); - }); + final associationRepository = AssociationRepository(ref); + AssociationListNotifier notifier = AssociationListNotifier( + associationRepository, + ); + notifier.loadAssociations(); return notifier; }); diff --git a/lib/phonebook/providers/association_member_list_provider.dart b/lib/phonebook/providers/association_member_list_provider.dart index b4db47537..8e8a80528 100644 --- a/lib/phonebook/providers/association_member_list_provider.dart +++ b/lib/phonebook/providers/association_member_list_provider.dart @@ -1,19 +1,14 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/phonebook/class/complete_member.dart'; import 'package:myecl/phonebook/class/membership.dart'; import 'package:myecl/phonebook/providers/association_provider.dart'; import 'package:myecl/phonebook/repositories/association_member_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AssociationMemberListNotifier extends ListNotifier { - final AssociationMemberRepository associationMemberRepository = - AssociationMemberRepository(); - AssociationMemberListNotifier({required String token}) - : super(const AsyncValue.loading()) { - associationMemberRepository.setToken(token); - } + final AssociationMemberRepository associationMemberRepository; + AssociationMemberListNotifier(this.associationMemberRepository) + : super(const AsyncValue.loading()); Future>> loadMembers( String associationId, @@ -121,17 +116,11 @@ final associationMemberListProvider = AssociationMemberListNotifier, AsyncValue> >((ref) { - final token = ref.watch(tokenProvider); AssociationMemberListNotifier provider = AssociationMemberListNotifier( - token: token, + AssociationMemberRepository(ref), ); - tokenExpireWrapperAuth(ref, () async { - final association = ref.watch(associationProvider); + final association = ref.watch(associationProvider); - await provider.loadMembers( - association.id, - association.mandateYear.toString(), - ); - }); + provider.loadMembers(association.id, association.mandateYear.toString()); return provider; }); diff --git a/lib/phonebook/providers/association_picture_provider.dart b/lib/phonebook/providers/association_picture_provider.dart index 5050ccb72..f3e53b808 100644 --- a/lib/phonebook/providers/association_picture_provider.dart +++ b/lib/phonebook/providers/association_picture_provider.dart @@ -2,26 +2,23 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/phonebook/repositories/association_picture_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; final associationPictureProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); + final associationPictureRepository = AssociationPictureRepository(ref); AssociationPictureNotifier notifier = AssociationPictureNotifier( - token: token, + associationPictureRepository, ); return notifier; }); class AssociationPictureNotifier extends SingleNotifier { - final AssociationPictureRepository associationPictureRepository = - AssociationPictureRepository(); - AssociationPictureNotifier({required String token}) - : super(const AsyncLoading()) { - associationPictureRepository.setToken(token); - } + AssociationPictureNotifier(this.associationPictureRepository) + : super(const AsyncLoading()); + + final AssociationPictureRepository associationPictureRepository; Future getAssociationPicture(String associationId) async { return await associationPictureRepository.getAssociationPicture( diff --git a/lib/phonebook/providers/associations_pictures_provider.dart b/lib/phonebook/providers/associations_pictures_provider.dart index 755141720..2c1b003e4 100644 --- a/lib/phonebook/providers/associations_pictures_provider.dart +++ b/lib/phonebook/providers/associations_pictures_provider.dart @@ -3,7 +3,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/phonebook/class/association.dart'; import 'package:myecl/phonebook/providers/association_list_provider.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class AssociationPictureNotifier extends MapNotifier { AssociationPictureNotifier() : super(); @@ -16,25 +15,23 @@ final associationPicturesProvider = >((ref) { AssociationPictureNotifier associationPictureNotifier = AssociationPictureNotifier(); - tokenExpireWrapperAuth(ref, () async { - ref - .watch(associationListProvider) - .maybeWhen( - data: (association) { - associationPictureNotifier.loadTList(association); - for (final l in association) { - associationPictureNotifier.setTData( - l, - const AsyncValue.data([]), - ); - } - return associationPictureNotifier; - }, - orElse: () { - associationPictureNotifier.loadTList([]); - return associationPictureNotifier; - }, - ); - }); + ref + .watch(associationListProvider) + .maybeWhen( + data: (association) { + associationPictureNotifier.loadTList(association); + for (final l in association) { + associationPictureNotifier.setTData( + l, + const AsyncValue.data([]), + ); + } + return associationPictureNotifier; + }, + orElse: () { + associationPictureNotifier.loadTList([]); + return associationPictureNotifier; + }, + ); return associationPictureNotifier; }); diff --git a/lib/phonebook/providers/complete_member_provider.dart b/lib/phonebook/providers/complete_member_provider.dart index 6fbd0df59..8ed66615e 100644 --- a/lib/phonebook/providers/complete_member_provider.dart +++ b/lib/phonebook/providers/complete_member_provider.dart @@ -1,21 +1,17 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/phonebook/class/complete_member.dart'; import 'package:myecl/phonebook/class/member.dart'; import 'package:myecl/phonebook/repositories/member_repository.dart'; final completeMemberProvider = StateNotifierProvider((ref) { - final token = ref.watch(tokenProvider); - return CompleteMemberProvider(token: token); + final memberRepository = MemberRepository(ref); + return CompleteMemberProvider(memberRepository); }); class CompleteMemberProvider extends StateNotifier { - final MemberRepository memberRepository = MemberRepository(); - CompleteMemberProvider({required String token}) - : super(CompleteMember.empty()) { - memberRepository.setToken(token); - } + final MemberRepository memberRepository; + CompleteMemberProvider(this.memberRepository) : super(CompleteMember.empty()); void setCompleteMember(CompleteMember i) { state = i; diff --git a/lib/phonebook/providers/member_pictures_provider.dart b/lib/phonebook/providers/member_pictures_provider.dart index 4b21ac9f9..106b4e014 100644 --- a/lib/phonebook/providers/member_pictures_provider.dart +++ b/lib/phonebook/providers/member_pictures_provider.dart @@ -3,7 +3,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/phonebook/class/complete_member.dart'; import 'package:myecl/phonebook/providers/association_member_list_provider.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class MemberPicturesNotifier extends MapNotifier { MemberPicturesNotifier() : super(); @@ -15,19 +14,17 @@ final memberPicturesProvider = Map>?> >((ref) { MemberPicturesNotifier memberPicturesNotifier = MemberPicturesNotifier(); - tokenExpireWrapperAuth(ref, () async { - ref - .watch(associationMemberListProvider) - .maybeWhen( - data: (member) { - memberPicturesNotifier.loadTList(member); - return MemberPicturesNotifier; - }, - orElse: () { - memberPicturesNotifier.loadTList([]); - return memberPicturesNotifier; - }, - ); - }); + ref + .watch(associationMemberListProvider) + .maybeWhen( + data: (member) { + memberPicturesNotifier.loadTList(member); + return MemberPicturesNotifier; + }, + orElse: () { + memberPicturesNotifier.loadTList([]); + return memberPicturesNotifier; + }, + ); return memberPicturesNotifier; }); diff --git a/lib/phonebook/providers/profile_picture_provider.dart b/lib/phonebook/providers/profile_picture_provider.dart index 5feb73e46..229695dcc 100644 --- a/lib/phonebook/providers/profile_picture_provider.dart +++ b/lib/phonebook/providers/profile_picture_provider.dart @@ -1,23 +1,18 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; import 'package:myecl/user/repositories/profile_picture_repository.dart'; final profilePictureProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - ProfilePictureNotifier notifier = ProfilePictureNotifier(token: token); - return notifier; + final profilePictureRepository = ProfilePictureRepository(ref); + return ProfilePictureNotifier(profilePictureRepository); }); class ProfilePictureNotifier extends SingleNotifier { - final ProfilePictureRepository profilePictureRepository = - ProfilePictureRepository(); - ProfilePictureNotifier({required String token}) - : super(const AsyncLoading()) { - profilePictureRepository.setToken(token); - } + final ProfilePictureRepository profilePictureRepository; + ProfilePictureNotifier(this.profilePictureRepository) + : super(const AsyncLoading()); Future getProfilePicture(String profileId) async { return Image.memory( diff --git a/lib/phonebook/providers/profile_pictures_provider.dart b/lib/phonebook/providers/profile_pictures_provider.dart index f79e9de7f..6655f63b8 100644 --- a/lib/phonebook/providers/profile_pictures_provider.dart +++ b/lib/phonebook/providers/profile_pictures_provider.dart @@ -3,7 +3,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/phonebook/class/complete_member.dart'; import 'package:myecl/phonebook/providers/association_member_list_provider.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ProfilePictureNotifier extends MapNotifier { ProfilePictureNotifier() : super(); @@ -15,22 +14,20 @@ final profilePicturesProvider = Map>?> >((ref) { ProfilePictureNotifier profilePictureNotifier = ProfilePictureNotifier(); - tokenExpireWrapperAuth(ref, () async { - ref - .watch(associationMemberListProvider) - .maybeWhen( - data: (profile) { - profilePictureNotifier.loadTList(profile); - for (final l in profile) { - profilePictureNotifier.setTData(l, const AsyncValue.data([])); - } - return profilePictureNotifier; - }, - orElse: () { - profilePictureNotifier.loadTList([]); - return profilePictureNotifier; - }, - ); - }); + ref + .watch(associationMemberListProvider) + .maybeWhen( + data: (profile) { + profilePictureNotifier.loadTList(profile); + for (final l in profile) { + profilePictureNotifier.setTData(l, const AsyncValue.data([])); + } + return profilePictureNotifier; + }, + orElse: () { + profilePictureNotifier.loadTList([]); + return profilePictureNotifier; + }, + ); return profilePictureNotifier; }); diff --git a/lib/phonebook/providers/roles_tags_provider.dart b/lib/phonebook/providers/roles_tags_provider.dart index 4582ae39a..5abb27306 100644 --- a/lib/phonebook/providers/roles_tags_provider.dart +++ b/lib/phonebook/providers/roles_tags_provider.dart @@ -1,16 +1,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/phonebook/class/association.dart'; import 'package:myecl/phonebook/class/complete_member.dart'; import 'package:myecl/phonebook/repositories/role_tags_repository.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class RolesTagsNotifier extends MapNotifier { - final RolesTagsRepository rolesTagsRepository = RolesTagsRepository(); - RolesTagsNotifier({required String token}) { - rolesTagsRepository.setToken(token); - } + final RolesTagsRepository rolesTagsRepository; + RolesTagsNotifier(this.rolesTagsRepository); Future loadRolesTags() async { loadTList([]); @@ -39,10 +35,8 @@ final rolesTagsProvider = RolesTagsNotifier, Map>?> >((ref) { - final token = ref.watch(tokenProvider); - RolesTagsNotifier notifier = RolesTagsNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadRolesTags(); - }); + final rolesTagsRepository = RolesTagsRepository(ref); + RolesTagsNotifier notifier = RolesTagsNotifier(rolesTagsRepository); + notifier.loadRolesTags(); return notifier; }); diff --git a/lib/phonebook/repositories/association_member_repository.dart b/lib/phonebook/repositories/association_member_repository.dart index 652e895c8..a164acae9 100644 --- a/lib/phonebook/repositories/association_member_repository.dart +++ b/lib/phonebook/repositories/association_member_repository.dart @@ -7,6 +7,8 @@ class AssociationMemberRepository extends Repository { // ignore: overridden_fields final ext = "phonebook/associations/"; + AssociationMemberRepository(super.ref); + Future> getAssociationMemberList( String associationId, String year, diff --git a/lib/phonebook/repositories/association_picture_repository.dart b/lib/phonebook/repositories/association_picture_repository.dart index f5313748e..78d1f7b40 100644 --- a/lib/phonebook/repositories/association_picture_repository.dart +++ b/lib/phonebook/repositories/association_picture_repository.dart @@ -7,6 +7,7 @@ class AssociationPictureRepository extends LogoRepository { @override // ignore: overridden_fields final ext = 'phonebook/associations/'; + AssociationPictureRepository(super.ref); Future getAssociationPicture(String associationId) async { final uint8List = await getLogo(associationId, suffix: "/picture"); diff --git a/lib/phonebook/repositories/association_repository.dart b/lib/phonebook/repositories/association_repository.dart index d91329df7..baa9562df 100644 --- a/lib/phonebook/repositories/association_repository.dart +++ b/lib/phonebook/repositories/association_repository.dart @@ -7,6 +7,8 @@ class AssociationRepository extends Repository { // ignore: overridden_fields final ext = "phonebook/associations/"; + AssociationRepository(super.ref); + Future> getAssociationList() async { return List.from( (await getList()).map((x) => Association.fromJson(x)), diff --git a/lib/phonebook/repositories/member_repository.dart b/lib/phonebook/repositories/member_repository.dart index d12fead5a..dba7953ca 100644 --- a/lib/phonebook/repositories/member_repository.dart +++ b/lib/phonebook/repositories/member_repository.dart @@ -6,6 +6,8 @@ class MemberRepository extends Repository { // ignore: overridden_fields final ext = "phonebook/member/"; + MemberRepository(super.ref); + Future getCompleteMember(String memberId) async { return CompleteMember.fromJson(await getOne(memberId)); } diff --git a/lib/phonebook/repositories/role_tags_repository.dart b/lib/phonebook/repositories/role_tags_repository.dart index b894e0418..ca3793427 100644 --- a/lib/phonebook/repositories/role_tags_repository.dart +++ b/lib/phonebook/repositories/role_tags_repository.dart @@ -6,6 +6,8 @@ class RolesTagsRepository extends Repository { // ignore: overridden_fields final ext = "phonebook/"; + RolesTagsRepository(super.ref); + Future getRolesTags() async { RolesTags rolesTags = RolesTags.fromJson(await getOne("roletags")); return rolesTags; diff --git a/lib/phonebook/router.dart b/lib/phonebook/router.dart index eef81b281..04a0908d2 100644 --- a/lib/phonebook/router.dart +++ b/lib/phonebook/router.dart @@ -10,8 +10,8 @@ import 'package:myecl/phonebook/ui/pages/association_page/association_page.dart' import 'package:myecl/phonebook/ui/pages/main_page/main_page.dart'; import 'package:myecl/phonebook/ui/pages/member_detail_page/member_detail_page.dart'; import 'package:myecl/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart'; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class PhonebookRouter { diff --git a/lib/phonebook/ui/pages/association_creation_page/association_creation_page.dart b/lib/phonebook/ui/pages/association_creation_page/association_creation_page.dart index 8aa1963d1..69cc09449 100644 --- a/lib/phonebook/ui/pages/association_creation_page/association_creation_page.dart +++ b/lib/phonebook/ui/pages/association_creation_page/association_creation_page.dart @@ -12,7 +12,6 @@ import 'package:myecl/phonebook/ui/components/kinds_bar.dart'; import 'package:myecl/phonebook/ui/phonebook.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; @@ -101,43 +100,41 @@ class AssociationCreationPage extends HookConsumerWidget { ); return; } - await tokenExpireWrapper(ref, () async { - final value = await associationListNotifier - .createAssociation( - Association.empty().copyWith( - name: name.text, - description: description.text, - kind: kind, - mandateYear: DateTime.now().year, - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.addedAssociation, - ); - associations.when( - data: (d) { - associationNotifier.setAssociation(d.last); - QR.to( - PhonebookRouter.root + - PhonebookRouter.admin + - PhonebookRouter.editAssociation, - ); - }, - error: (e, s) => displayToastWithContext( - TypeMsg.error, - PhonebookTextConstants.errorAssociationLoading, + final value = await associationListNotifier + .createAssociation( + Association.empty().copyWith( + name: name.text, + description: description.text, + kind: kind, + mandateYear: DateTime.now().year, ), - loading: () {}, ); - } else { - displayToastWithContext( + if (value) { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.addedAssociation, + ); + associations.when( + data: (d) { + associationNotifier.setAssociation(d.last); + QR.to( + PhonebookRouter.root + + PhonebookRouter.admin + + PhonebookRouter.editAssociation, + ); + }, + error: (e, s) => displayToastWithContext( TypeMsg.error, - AdminTextConstants.addingError, - ); - } - }); + PhonebookTextConstants.errorAssociationLoading, + ), + loading: () {}, + ); + } else { + displayToastWithContext( + TypeMsg.error, + AdminTextConstants.addingError, + ); + } }, child: const Text( AdminTextConstants.add, diff --git a/lib/phonebook/ui/pages/association_editor_page/association_editor_page.dart b/lib/phonebook/ui/pages/association_editor_page/association_editor_page.dart index 235275c61..93ad0c9ec 100644 --- a/lib/phonebook/ui/pages/association_editor_page/association_editor_page.dart +++ b/lib/phonebook/ui/pages/association_editor_page/association_editor_page.dart @@ -21,7 +21,6 @@ import 'package:myecl/phonebook/ui/phonebook.dart'; import 'package:myecl/phonebook/ui/pages/association_editor_page/member_editable_card.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; @@ -122,9 +121,9 @@ class AssociationEditorPage extends HookConsumerWidget { associationId: association.id, ), ); - if (QR.currentPath.contains( - PhonebookRouter.admin, - )) { + if (Uri.parse( + QR.currentPath, + ).path.contains(PhonebookRouter.admin)) { QR.to( PhonebookRouter.root + PhonebookRouter.admin + @@ -170,35 +169,33 @@ class AssociationEditorPage extends HookConsumerWidget { ); }, onReorder: (int oldIndex, int newIndex) async { - await tokenExpireWrapper(ref, () async { - final result = await associationMemberListNotifier - .reorderMember( - associationMemberSortedList[oldIndex], - associationMemberSortedList[oldIndex] - .memberships - .firstWhere( - (element) => - element.associationId == - association.id && - element.mandateYear == - association.mandateYear, - ) - .copyWith(order: newIndex), - oldIndex, - newIndex, - ); - if (result) { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.memberReordered, + final result = await associationMemberListNotifier + .reorderMember( + associationMemberSortedList[oldIndex], + associationMemberSortedList[oldIndex] + .memberships + .firstWhere( + (element) => + element.associationId == + association.id && + element.mandateYear == + association.mandateYear, + ) + .copyWith(order: newIndex), + oldIndex, + newIndex, ); - } else { - displayToastWithContext( - TypeMsg.error, - PhonebookTextConstants.reorderingError, - ); - } - }); + if (result) { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.memberReordered, + ); + } else { + displayToastWithContext( + TypeMsg.error, + PhonebookTextConstants.reorderingError, + ); + } }, children: associationMemberSortedList .map( @@ -263,43 +260,41 @@ class AssociationEditorPage extends HookConsumerWidget { TextButton( onPressed: () async { Navigator.pop(context); - await tokenExpireWrapper(ref, () async { - final value = await associationListNotifier - .updateAssociation( - association.copyWith( - mandateYear: - association.mandateYear + 1, - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants - .newMandateConfirmed, - ); - associationNotifier.setAssociation( + final value = await associationListNotifier + .updateAssociation( association.copyWith( mandateYear: association.mandateYear + 1, ), ); - if (QR.currentPath.contains( - PhonebookRouter.associationDetail, - )) { - kindNotifier.setKind(""); - QR.to( - PhonebookRouter.root + - PhonebookRouter.associationDetail, - ); - } - } else { - displayToastWithContext( - TypeMsg.error, - PhonebookTextConstants - .mandateChangingError, + if (value) { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants + .newMandateConfirmed, + ); + associationNotifier.setAssociation( + association.copyWith( + mandateYear: + association.mandateYear + 1, + ), + ); + if (Uri.parse(QR.currentPath).path.contains( + PhonebookRouter.associationDetail, + )) { + kindNotifier.setKind(""); + QR.to( + PhonebookRouter.root + + PhonebookRouter.associationDetail, ); } - }); + } else { + displayToastWithContext( + TypeMsg.error, + PhonebookTextConstants + .mandateChangingError, + ); + } }, child: const Text( PhonebookTextConstants.validation, diff --git a/lib/phonebook/ui/pages/association_editor_page/association_information_editor.dart b/lib/phonebook/ui/pages/association_editor_page/association_information_editor.dart index 7e2ca2ea0..5c0ab4aeb 100644 --- a/lib/phonebook/ui/pages/association_editor_page/association_information_editor.dart +++ b/lib/phonebook/ui/pages/association_editor_page/association_information_editor.dart @@ -13,7 +13,6 @@ import 'package:myecl/phonebook/tools/constants.dart'; import 'package:myecl/phonebook/ui/components/kinds_bar.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; @@ -160,27 +159,25 @@ class AssociationInformationEditor extends HookConsumerWidget { ); return; } - await tokenExpireWrapper(ref, () async { - final value = await associationListNotifier - .updateAssociation( - association.copyWith( - name: name.text, - description: description.text, - kind: kind, - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.updatedAssociation, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.updatingError, + final value = await associationListNotifier + .updateAssociation( + association.copyWith( + name: name.text, + description: description.text, + kind: kind, + ), ); - } - }); + if (value) { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.updatedAssociation, + ); + } else { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.updatingError, + ); + } }, child: const Text( PhonebookTextConstants.edit, @@ -328,27 +325,25 @@ class AssociationInformationEditor extends HookConsumerWidget { child: child, ), onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await associationListNotifier - .updateAssociationGroups( - association.copyWith( - associatedGroups: selectedGroups - .map((e) => e.id) - .toList(), - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.updatedGroups, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.updatingError, + final value = await associationListNotifier + .updateAssociationGroups( + association.copyWith( + associatedGroups: selectedGroups + .map((e) => e.id) + .toList(), + ), ); - } - }); + if (value) { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.updatedGroups, + ); + } else { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.updatingError, + ); + } }, child: const Text( PhonebookTextConstants.updateGroups, diff --git a/lib/phonebook/ui/pages/association_editor_page/member_editable_card.dart b/lib/phonebook/ui/pages/association_editor_page/member_editable_card.dart index 0e8da950a..f3eff0ab3 100644 --- a/lib/phonebook/ui/pages/association_editor_page/member_editable_card.dart +++ b/lib/phonebook/ui/pages/association_editor_page/member_editable_card.dart @@ -133,7 +133,9 @@ class MemberEditableCard extends HookConsumerWidget { completeMemberNotifier.setCompleteMember(member); membershipNotifier.setMembership(assoMembership); memberRoleTagsNotifier.reset(); - if (QR.currentPath.contains(PhonebookRouter.admin)) { + if (Uri.parse( + QR.currentPath, + ).path.contains(PhonebookRouter.admin)) { QR.to( PhonebookRouter.root + PhonebookRouter.admin + diff --git a/lib/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart b/lib/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart index 79b46626d..cf43e2ab8 100644 --- a/lib/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart +++ b/lib/phonebook/ui/pages/membership_editor_page/membership_editor_page.dart @@ -14,7 +14,6 @@ import 'package:myecl/phonebook/tools/constants.dart'; import 'package:myecl/phonebook/ui/phonebook.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; @@ -70,13 +69,11 @@ class MembershipEditorPage extends HookConsumerWidget { label: PhonebookTextConstants.member, editingController: queryController, onChanged: (value) async { - tokenExpireWrapper(ref, () async { - if (value.isNotEmpty) { - await usersNotifier.filterUsers(value); - } else { - usersNotifier.clear(); - } - }); + if (value.isNotEmpty) { + await usersNotifier.filterUsers(value); + } else { + usersNotifier.clear(); + } }, ), SearchResult(queryController: queryController), @@ -183,89 +180,88 @@ class MembershipEditorPage extends HookConsumerWidget { return; } - tokenExpireWrapper(ref, () async { - if (isEdit) { - final membershipEdit = Membership( - id: membership.id, - memberId: membership.memberId, - associationId: membership.associationId, - rolesTags: memberRoleTags, - apparentName: apparentNameController.text, - mandateYear: membership.mandateYear, - order: membership.order, + if (isEdit) { + final membershipEdit = Membership( + id: membership.id, + memberId: membership.memberId, + associationId: membership.associationId, + rolesTags: memberRoleTags, + apparentName: apparentNameController.text, + mandateYear: membership.mandateYear, + order: membership.order, + ); + member.memberships[member.memberships.indexWhere( + (membership) => membership.id == membershipEdit.id, + )] = + membershipEdit; + final value = await associationMemberListNotifier + .updateMember(member, membershipEdit); + if (value) { + associationMemberListNotifier.loadMembers( + association.id, + association.mandateYear.toString(), ); - member.memberships[member.memberships.indexWhere( - (membership) => membership.id == membershipEdit.id, - )] = - membershipEdit; - final value = await associationMemberListNotifier - .updateMember(member, membershipEdit); - if (value) { - associationMemberListNotifier.loadMembers( - association.id, - association.mandateYear.toString(), - ); - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.updatedMember, - ); - QR.back(); - } else { - displayToastWithContext( - TypeMsg.error, - PhonebookTextConstants.updatingError, - ); - } + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.updatedMember, + ); + QR.back(); } else { - // Test if the membership already exists with (association_id,member_id,mandate_year) - final memberAssociationMemberships = member.memberships - .where( - (membership) => - membership.associationId == association.id, - ); - - if (memberAssociationMemberships - .where( - (membership) => - membership.mandateYear == - association.mandateYear, - ) - .isNotEmpty) { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.existingMembership, + displayToastWithContext( + TypeMsg.error, + PhonebookTextConstants.updatingError, + ); + } + } else { + // Test if the membership already exists with (association_id,member_id,mandate_year) + final memberAssociationMemberships = member.memberships + .where( + (membership) => + membership.associationId == association.id, ); - return; - } - final membershipAdd = Membership( - id: "", - memberId: member.member.id, - associationId: association.id, - rolesTags: memberRoleTags, - apparentName: apparentNameController.text, - mandateYear: association.mandateYear, - order: associationMembers.maybeWhen( - data: (members) => members.length, - orElse: () => 0, - ), + if (memberAssociationMemberships + .where( + (membership) => + membership.mandateYear == association.mandateYear, + ) + .isNotEmpty) { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.existingMembership, ); - final value = await associationMemberListNotifier - .addMember(member, membershipAdd); - if (value) { - displayToastWithContext( - TypeMsg.msg, - PhonebookTextConstants.addedMember, - ); - QR.back(); - } else { - displayToastWithContext( - TypeMsg.error, - PhonebookTextConstants.addingError, - ); - } + return; } - }); + + final membershipAdd = Membership( + id: "", + memberId: member.member.id, + associationId: association.id, + rolesTags: memberRoleTags, + apparentName: apparentNameController.text, + mandateYear: association.mandateYear, + order: associationMembers.maybeWhen( + data: (members) => members.length, + orElse: () => 0, + ), + ); + final value = await associationMemberListNotifier.addMember( + member, + membershipAdd, + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + PhonebookTextConstants.addedMember, + ); + QR.back(); + } else { + displayToastWithContext( + TypeMsg.error, + PhonebookTextConstants.addingError, + ); + } + } }, ), ], diff --git a/lib/phonebook/ui/phonebook.dart b/lib/phonebook/ui/phonebook.dart index 8a3075fa3..e6bce6da1 100644 --- a/lib/phonebook/ui/phonebook.dart +++ b/lib/phonebook/ui/phonebook.dart @@ -20,14 +20,14 @@ class PhonebookTemplate extends HookConsumerWidget { title: PhonebookTextConstants.phonebook, root: PhonebookRouter.root, onBack: () { - if (QR.currentPath != + if (Uri.parse(QR.currentPath).path != PhonebookRouter.root + PhonebookRouter.admin + PhonebookRouter.editAssociation + PhonebookRouter.addEditMember) { kindNotifier.setKind(''); } - if (QR.currentPath == + if (Uri.parse(QR.currentPath).path == PhonebookRouter.root + PhonebookRouter.admin + PhonebookRouter.editAssociation) { diff --git a/lib/purchases/providers/generated_ticket_provider.dart b/lib/purchases/providers/generated_ticket_provider.dart index 6c3d22ac5..8cfbda036 100644 --- a/lib/purchases/providers/generated_ticket_provider.dart +++ b/lib/purchases/providers/generated_ticket_provider.dart @@ -1,10 +1,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/ticket_generator.dart'; class TicketGeneratorNotifier extends StateNotifier { - TicketGeneratorNotifier({required String token}) - : super(TicketGenerator.empty()); + TicketGeneratorNotifier() : super(TicketGenerator.empty()); void setTicketGenerator(TicketGenerator i) { state = i; @@ -13,7 +11,6 @@ class TicketGeneratorNotifier extends StateNotifier { final ticketGeneratorProvider = StateNotifierProvider((ref) { - final token = ref.watch(tokenProvider); - TicketGeneratorNotifier notifier = TicketGeneratorNotifier(token: token); + TicketGeneratorNotifier notifier = TicketGeneratorNotifier(); return notifier; }); diff --git a/lib/purchases/providers/product_id_provider.dart b/lib/purchases/providers/product_id_provider.dart index 10bbe9d68..50e7349e1 100644 --- a/lib/purchases/providers/product_id_provider.dart +++ b/lib/purchases/providers/product_id_provider.dart @@ -1,15 +1,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/repositories/user_information_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; class ProductIdNotifier extends SingleNotifier { - final UserInformationRepository productIdRepository = - UserInformationRepository(); - ProductIdNotifier({required String token}) - : super(const AsyncValue.loading()) { - productIdRepository.setToken(token); - } + final UserInformationRepository productIdRepository; + ProductIdNotifier(this.productIdRepository) + : super(const AsyncValue.loading()); void setProductId(String i) { state = AsyncValue.data(i); @@ -18,7 +14,7 @@ class ProductIdNotifier extends SingleNotifier { final productIdProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - ProductIdNotifier notifier = ProductIdNotifier(token: token); + final productIdRepository = ref.watch(userInformationRepositoryProvider); + ProductIdNotifier notifier = ProductIdNotifier(productIdRepository); return notifier; }); diff --git a/lib/purchases/providers/product_list_provider.dart b/lib/purchases/providers/product_list_provider.dart index 702ed91a0..756729e53 100644 --- a/lib/purchases/providers/product_list_provider.dart +++ b/lib/purchases/providers/product_list_provider.dart @@ -1,16 +1,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/product.dart'; import 'package:myecl/purchases/repositories/product_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; class ProductListNotifier extends ListNotifier { - final ProductRepository productRepository = ProductRepository(); + final ProductRepository productRepository; AsyncValue> productList = const AsyncValue.loading(); - ProductListNotifier({required String token}) - : super(const AsyncValue.loading()) { - productRepository.setToken(token); - } + ProductListNotifier(this.productRepository) + : super(const AsyncValue.loading()); Future>> loadProducts(String sellerId) async { return await loadList(() => productRepository.getProductList(sellerId)); @@ -21,7 +18,7 @@ final productListProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); - ProductListNotifier notifier = ProductListNotifier(token: token); + final productRepository = ProductRepository(ref); + ProductListNotifier notifier = ProductListNotifier(productRepository); return notifier; }); diff --git a/lib/purchases/providers/purchase_list_provider.dart b/lib/purchases/providers/purchase_list_provider.dart index 52217dcf2..ec268f4d6 100644 --- a/lib/purchases/providers/purchase_list_provider.dart +++ b/lib/purchases/providers/purchase_list_provider.dart @@ -1,18 +1,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/purchase.dart'; import 'package:myecl/purchases/repositories/user_purchase_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class PurchaseListNotifier extends ListNotifier { - final UserPurchaseRepository userPurchaseRepository = - UserPurchaseRepository(); + final UserPurchaseRepository userPurchaseRepository; AsyncValue> purchaseList = const AsyncValue.loading(); - PurchaseListNotifier({required String token}) - : super(const AsyncValue.loading()) { - userPurchaseRepository.setToken(token); - } + PurchaseListNotifier(this.userPurchaseRepository) + : super(const AsyncValue.loading()); Future>> loadPurchases() async { return await loadList(userPurchaseRepository.getPurchaseList); @@ -38,10 +33,10 @@ final purchaseListProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); - PurchaseListNotifier notifier = PurchaseListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadPurchases(); - }); + final userPurchaseRepository = UserPurchaseRepository(ref); + PurchaseListNotifier notifier = PurchaseListNotifier( + userPurchaseRepository, + ); + notifier.loadPurchases(); return notifier; }); diff --git a/lib/purchases/providers/purchase_provider.dart b/lib/purchases/providers/purchase_provider.dart index 153b2772d..0b207faad 100644 --- a/lib/purchases/providers/purchase_provider.dart +++ b/lib/purchases/providers/purchase_provider.dart @@ -1,10 +1,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/purchase.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; class PurchaseNotifier extends SingleNotifier { - PurchaseNotifier({required String token}) : super(const AsyncValue.loading()); + PurchaseNotifier() : super(const AsyncValue.loading()); void setPurchase(Purchase i) { state = AsyncValue.data(i); @@ -13,7 +12,6 @@ class PurchaseNotifier extends SingleNotifier { final purchaseProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - PurchaseNotifier notifier = PurchaseNotifier(token: token); + PurchaseNotifier notifier = PurchaseNotifier(); return notifier; }); diff --git a/lib/purchases/providers/scanned_users_list_provider.dart b/lib/purchases/providers/scanned_users_list_provider.dart index 3de72644e..803eea16b 100644 --- a/lib/purchases/providers/scanned_users_list_provider.dart +++ b/lib/purchases/providers/scanned_users_list_provider.dart @@ -1,16 +1,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/repositories/scanner_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; import 'package:myecl/user/class/simple_users.dart'; class ScannedUsersListNotifier extends ListNotifier { - final ScannerRepository scannerRepository = ScannerRepository(); + final ScannerRepository scannerRepository; AsyncValue> tagList = const AsyncValue.loading(); - ScannedUsersListNotifier({required String token}) - : super(const AsyncValue.loading()) { - scannerRepository.setToken(token); - } + ScannedUsersListNotifier(this.scannerRepository) + : super(const AsyncValue.loading()); Future>> loadUsers( String sellerId, @@ -30,9 +27,9 @@ final scannedUsersListProvider = ScannedUsersListNotifier, AsyncValue> >((ref) { - final token = ref.watch(tokenProvider); + final scannerRepository = ScannerRepository(ref); ScannedUsersListNotifier notifier = ScannedUsersListNotifier( - token: token, + scannerRepository, ); return notifier; }); diff --git a/lib/purchases/providers/scanner_provider.dart b/lib/purchases/providers/scanner_provider.dart index e38091f21..28a8eaa44 100644 --- a/lib/purchases/providers/scanner_provider.dart +++ b/lib/purchases/providers/scanner_provider.dart @@ -1,14 +1,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/ticket.dart'; import 'package:myecl/purchases/repositories/scanner_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; class ScannerNotifier extends SingleNotifier { - final ScannerRepository scannerRepository = ScannerRepository(); - ScannerNotifier({required String token}) : super(const AsyncValue.loading()) { - scannerRepository.setToken(token); - } + final ScannerRepository scannerRepository; + ScannerNotifier(this.scannerRepository) : super(const AsyncValue.loading()); Future> scanTicket( String sellerId, String productId, @@ -36,7 +33,7 @@ class ScannerNotifier extends SingleNotifier { final scannerProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - ScannerNotifier notifier = ScannerNotifier(token: token); + final scannerRepository = ScannerRepository(ref); + ScannerNotifier notifier = ScannerNotifier(scannerRepository); return notifier; }); diff --git a/lib/purchases/providers/seller_list_provider.dart b/lib/purchases/providers/seller_list_provider.dart index d6c2a7d39..fa13a4245 100644 --- a/lib/purchases/providers/seller_list_provider.dart +++ b/lib/purchases/providers/seller_list_provider.dart @@ -1,18 +1,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/seller.dart'; import 'package:myecl/purchases/repositories/user_information_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class SellerListNotifier extends ListNotifier { - final UserInformationRepository sellerRepository = - UserInformationRepository(); + final UserInformationRepository sellerRepository; AsyncValue> sellerList = const AsyncValue.loading(); - SellerListNotifier({required String token}) - : super(const AsyncValue.loading()) { - sellerRepository.setToken(token); - } + SellerListNotifier(this.sellerRepository) : super(const AsyncValue.loading()); Future>> loadSellers() async { return await loadList(sellerRepository.getSellerList); @@ -21,10 +15,12 @@ class SellerListNotifier extends ListNotifier { final sellerListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - SellerListNotifier notifier = SellerListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadSellers(); - }); + final userInformationRepository = ref.watch( + userInformationRepositoryProvider, + ); + SellerListNotifier notifier = SellerListNotifier( + userInformationRepository, + ); + notifier.loadSellers(); return notifier; }); diff --git a/lib/purchases/providers/seller_provider.dart b/lib/purchases/providers/seller_provider.dart index afea0215f..22b164e0c 100644 --- a/lib/purchases/providers/seller_provider.dart +++ b/lib/purchases/providers/seller_provider.dart @@ -1,9 +1,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/seller.dart'; class SellerNotifier extends StateNotifier { - SellerNotifier({required String token}) : super(Seller.empty()); + SellerNotifier() : super(Seller.empty()); void setSeller(Seller i) { state = i; @@ -11,7 +10,6 @@ class SellerNotifier extends StateNotifier { } final sellerProvider = StateNotifierProvider((ref) { - final token = ref.watch(tokenProvider); - SellerNotifier notifier = SellerNotifier(token: token); + SellerNotifier notifier = SellerNotifier(); return notifier; }); diff --git a/lib/purchases/providers/tag_list_provider.dart b/lib/purchases/providers/tag_list_provider.dart index 1c677fd7f..3f5228299 100644 --- a/lib/purchases/providers/tag_list_provider.dart +++ b/lib/purchases/providers/tag_list_provider.dart @@ -1,14 +1,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/repositories/scanner_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; class TagListNotifier extends ListNotifier { - final ScannerRepository scannerRepository = ScannerRepository(); + final ScannerRepository scannerRepository; AsyncValue> tagList = const AsyncValue.loading(); - TagListNotifier({required String token}) : super(const AsyncValue.loading()) { - scannerRepository.setToken(token); - } + TagListNotifier(this.scannerRepository) : super(const AsyncValue.loading()); Future>> loadTags( String sellerId, @@ -23,7 +20,7 @@ class TagListNotifier extends ListNotifier { final tagListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - TagListNotifier notifier = TagListNotifier(token: token); + final scannerRepository = ScannerRepository(ref); + TagListNotifier notifier = TagListNotifier(scannerRepository); return notifier; }); diff --git a/lib/purchases/providers/tag_provider.dart b/lib/purchases/providers/tag_provider.dart index 713253fe5..0bde28b07 100644 --- a/lib/purchases/providers/tag_provider.dart +++ b/lib/purchases/providers/tag_provider.dart @@ -1,8 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; class TagNotifier extends StateNotifier { - TagNotifier({required String token}) : super(""); + TagNotifier() : super(""); void setTag(String i) { state = i; @@ -10,7 +9,6 @@ class TagNotifier extends StateNotifier { } final tagProvider = StateNotifierProvider((ref) { - final token = ref.watch(tokenProvider); - TagNotifier notifier = TagNotifier(token: token); + TagNotifier notifier = TagNotifier(); return notifier; }); diff --git a/lib/purchases/providers/ticket_id_provider.dart b/lib/purchases/providers/ticket_id_provider.dart index 0c2ffad82..6ab1d6bc2 100644 --- a/lib/purchases/providers/ticket_id_provider.dart +++ b/lib/purchases/providers/ticket_id_provider.dart @@ -1,15 +1,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/repositories/user_information_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; class TicketIdNotifier extends SingleNotifier { - final UserInformationRepository ticketIdRepository = - UserInformationRepository(); - TicketIdNotifier({required String token}) - : super(const AsyncValue.loading()) { - ticketIdRepository.setToken(token); - } + final UserInformationRepository ticketIdRepository; + TicketIdNotifier(this.ticketIdRepository) : super(const AsyncValue.loading()); void setTicketId(String i) { state = AsyncValue.data(i); @@ -18,7 +13,9 @@ class TicketIdNotifier extends SingleNotifier { final ticketIdProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - TicketIdNotifier notifier = TicketIdNotifier(token: token); + final userInformationRepository = ref.watch( + userInformationRepositoryProvider, + ); + TicketIdNotifier notifier = TicketIdNotifier(userInformationRepository); return notifier; }); diff --git a/lib/purchases/providers/ticket_list_provider.dart b/lib/purchases/providers/ticket_list_provider.dart index 78d3fc6b0..06a633873 100644 --- a/lib/purchases/providers/ticket_list_provider.dart +++ b/lib/purchases/providers/ticket_list_provider.dart @@ -1,20 +1,16 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/ticket.dart'; import 'package:myecl/purchases/repositories/scanner_repository.dart'; import 'package:myecl/purchases/repositories/user_information_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class TicketListNotifier extends ListNotifier { - final UserInformationRepository ticketRepository = - UserInformationRepository(); - final ScannerRepository scannerRepository = ScannerRepository(); - TicketListNotifier({required String token}) - : super(const AsyncValue.loading()) { - ticketRepository.setToken(token); - scannerRepository.setToken(token); - } + final UserInformationRepository ticketRepository; + final ScannerRepository scannerRepository; + TicketListNotifier({ + required this.ticketRepository, + required this.scannerRepository, + }) : super(const AsyncValue.loading()); Future>> loadTickets() async { return await loadList(ticketRepository.getTicketList); @@ -45,10 +41,14 @@ class TicketListNotifier extends ListNotifier { final ticketListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - TicketListNotifier notifier = TicketListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadTickets(); - }); + final userInformationRepository = ref.watch( + userInformationRepositoryProvider, + ); + final scannerRepository = ScannerRepository(ref); + TicketListNotifier notifier = TicketListNotifier( + ticketRepository: userInformationRepository, + scannerRepository: scannerRepository, + ); + notifier.loadTickets(); return notifier; }); diff --git a/lib/purchases/providers/ticket_provider.dart b/lib/purchases/providers/ticket_provider.dart index 3dca5721e..d82f7bbda 100644 --- a/lib/purchases/providers/ticket_provider.dart +++ b/lib/purchases/providers/ticket_provider.dart @@ -1,15 +1,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/purchases/class/ticket.dart'; import 'package:myecl/purchases/repositories/user_information_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; class TicketNotifier extends SingleNotifier { - final UserInformationRepository ticketRepository = - UserInformationRepository(); - TicketNotifier({required String token}) : super(const AsyncValue.loading()) { - ticketRepository.setToken(token); - } + final UserInformationRepository ticketRepository; + TicketNotifier({required this.ticketRepository}) + : super(const AsyncValue.loading()); void setTicket(Ticket i) { state = AsyncValue.data(i); @@ -25,7 +22,11 @@ class TicketNotifier extends SingleNotifier { final ticketProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - TicketNotifier notifier = TicketNotifier(token: token); + final userInformationRepository = ref.watch( + userInformationRepositoryProvider, + ); + TicketNotifier notifier = TicketNotifier( + ticketRepository: userInformationRepository, + ); return notifier; }); diff --git a/lib/purchases/repositories/product_repository.dart b/lib/purchases/repositories/product_repository.dart index 5ddc954a1..96ba4d76c 100644 --- a/lib/purchases/repositories/product_repository.dart +++ b/lib/purchases/repositories/product_repository.dart @@ -6,6 +6,8 @@ class ProductRepository extends Repository { // ignore: overridden_fields final ext = "cdr/sellers/"; + ProductRepository(super.ref); + Future> getProductList(String sellerId) async { return List.from( (await getList( diff --git a/lib/purchases/repositories/scanner_repository.dart b/lib/purchases/repositories/scanner_repository.dart index c33c33e67..846c16a6b 100644 --- a/lib/purchases/repositories/scanner_repository.dart +++ b/lib/purchases/repositories/scanner_repository.dart @@ -7,6 +7,8 @@ class ScannerRepository extends Repository { // ignore: overridden_fields final ext = "cdr/sellers/"; + ScannerRepository(super.ref); + Future scanTicket( String sellerId, String productId, diff --git a/lib/purchases/repositories/user_information_repository.dart b/lib/purchases/repositories/user_information_repository.dart index 5a43e3fe1..142b806e8 100644 --- a/lib/purchases/repositories/user_information_repository.dart +++ b/lib/purchases/repositories/user_information_repository.dart @@ -1,3 +1,4 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/purchases/class/seller.dart'; import 'package:myecl/purchases/class/ticket.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -7,6 +8,8 @@ class UserInformationRepository extends Repository { // ignore: overridden_fields final ext = "cdr/users/me/"; + UserInformationRepository(super.ref); + Future> getSellerList() async { return List.from( (await getList(suffix: "sellers/")).map((x) => Seller.fromJson(x)), @@ -28,3 +31,9 @@ class UserInformationRepository extends Repository { ); } } + +final userInformationRepositoryProvider = Provider(( + ref, +) { + return UserInformationRepository(ref); +}); diff --git a/lib/purchases/repositories/user_purchase_repository.dart b/lib/purchases/repositories/user_purchase_repository.dart index 97ff39a6e..48d16ca3d 100644 --- a/lib/purchases/repositories/user_purchase_repository.dart +++ b/lib/purchases/repositories/user_purchase_repository.dart @@ -6,6 +6,8 @@ class UserPurchaseRepository extends Repository { // ignore: overridden_fields final ext = "cdr/me/"; + UserPurchaseRepository(super.ref); + Future> getPurchaseList() async { return List.from( (await getList(suffix: "purchases/")).map((x) => Purchase.fromJson(x)), diff --git a/lib/purchases/router.dart b/lib/purchases/router.dart index 970f02f3c..5a9238592 100644 --- a/lib/purchases/router.dart +++ b/lib/purchases/router.dart @@ -9,8 +9,8 @@ import 'package:myecl/purchases/ui/pages/purchase_page/purchase_page.dart'; import 'package:myecl/purchases/ui/pages/scan_page/scan_page.dart'; import 'package:myecl/purchases/ui/pages/ticket_page/ticket_page.dart'; import 'package:myecl/purchases/ui/pages/user_list_page/user_list_page.dart'; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class PurchasesRouter { diff --git a/lib/purchases/ui/pages/main_page/main_page.dart b/lib/purchases/ui/pages/main_page/main_page.dart index e91b43485..cb50e1f95 100644 --- a/lib/purchases/ui/pages/main_page/main_page.dart +++ b/lib/purchases/ui/pages/main_page/main_page.dart @@ -9,7 +9,6 @@ import 'package:myecl/purchases/tools/constants.dart'; import 'package:myecl/purchases/ui/pages/main_page/custom_button.dart'; import 'package:myecl/purchases/ui/pages/main_page/ticket_card.dart'; import 'package:myecl/purchases/ui/purchases.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; @@ -75,13 +74,11 @@ class PurchasesMainPage extends HookConsumerWidget { (ticket) => TicketCard( ticket: ticket, onClicked: () async { - await tokenExpireWrapper(ref, () async { - ticketNotifier.setTicket(ticket); - ticketNotifier.loadTicketSecret(); - QR.to( - PurchasesRouter.root + PurchasesRouter.ticket, - ); - }); + ticketNotifier.setTicket(ticket); + ticketNotifier.loadTicketSecret(); + QR.to( + PurchasesRouter.root + PurchasesRouter.ticket, + ); }, ), ), diff --git a/lib/purchases/ui/pages/scan_page/scan_dialog.dart b/lib/purchases/ui/pages/scan_page/scan_dialog.dart index e5730dd7d..0b5499466 100644 --- a/lib/purchases/ui/pages/scan_page/scan_dialog.dart +++ b/lib/purchases/ui/pages/scan_page/scan_dialog.dart @@ -10,7 +10,6 @@ import 'package:myecl/purchases/tools/constants.dart'; import 'package:myecl/purchases/ui/pages/scan_page/qr_code_scanner.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; @@ -137,31 +136,29 @@ class ScanDialog extends HookConsumerWidget { child: QRCodeScannerScreen( scanner: scanner, onScan: (secret) async { - await tokenExpireWrapper(ref, () async { - await scannerNotifier.scanTicket( - sellerId, - productId, - secret, - ticket.id, - ); - scanner.when( - data: (data) { - scannerNotifier.setScanner( - data.copyWith(qrCodeSecret: secret), - ); - }, - error: (error, stack) { - displayToastWithContext( - TypeMsg.error, - error.toString(), - ); - Future.delayed(const Duration(seconds: 2), () { - scannerNotifier.reset(); - }); - }, - loading: () {}, - ); - }); + await scannerNotifier.scanTicket( + sellerId, + productId, + secret, + ticket.id, + ); + scanner.when( + data: (data) { + scannerNotifier.setScanner( + data.copyWith(qrCodeSecret: secret), + ); + }, + error: (error, stack) { + displayToastWithContext( + TypeMsg.error, + error.toString(), + ); + Future.delayed(const Duration(seconds: 2), () { + scannerNotifier.reset(); + }); + }, + loading: () {}, + ); }, ), ), @@ -221,27 +218,25 @@ class ScanDialog extends HookConsumerWidget { const Spacer(), GestureDetector( onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await ticketListNotifier - .consumeTicket( - sellerId, - data, - ticket.id, - tag, - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - "Scan validé", + final value = await ticketListNotifier + .consumeTicket( + sellerId, + data, + ticket.id, + tag, ); - scannerNotifier.reset(); - } else { - displayToastWithContext( - TypeMsg.error, - "Erreur lors de la validation", - ); - } - }); + if (value) { + displayToastWithContext( + TypeMsg.msg, + "Scan validé", + ); + scannerNotifier.reset(); + } else { + displayToastWithContext( + TypeMsg.error, + "Erreur lors de la validation", + ); + } }, child: const SizedBox( width: 100, diff --git a/lib/purchases/ui/pages/scan_page/scan_page.dart b/lib/purchases/ui/pages/scan_page/scan_page.dart index 82b6698b6..6d675cb42 100644 --- a/lib/purchases/ui/pages/scan_page/scan_page.dart +++ b/lib/purchases/ui/pages/scan_page/scan_page.dart @@ -10,7 +10,6 @@ import 'package:myecl/purchases/tools/constants.dart'; import 'package:myecl/purchases/ui/pages/scan_page/ticket_card.dart'; import 'package:myecl/purchases/ui/pages/scan_page/scan_dialog.dart'; import 'package:myecl/purchases/ui/purchases.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; import 'package:myecl/tools/ui/layouts/item_chip.dart'; @@ -55,12 +54,8 @@ class ScanPage extends HookConsumerWidget { return ItemChip( selected: selected, onTap: () async { - await tokenExpireWrapper(ref, () async { - sellerNotifier.setSeller(eachSeller); - await productsNotifier.loadProducts( - eachSeller.id, - ); - }); + sellerNotifier.setSeller(eachSeller); + await productsNotifier.loadProducts(eachSeller.id); }, child: Text( eachSeller.name, diff --git a/lib/purchases/ui/pages/scan_page/ticket_card.dart b/lib/purchases/ui/pages/scan_page/ticket_card.dart index 4c3624cda..417f9b29b 100644 --- a/lib/purchases/ui/pages/scan_page/ticket_card.dart +++ b/lib/purchases/ui/pages/scan_page/ticket_card.dart @@ -9,7 +9,6 @@ import 'package:myecl/purchases/providers/tag_list_provider.dart'; import 'package:myecl/purchases/providers/ticket_id_provider.dart'; import 'package:myecl/purchases/router.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -64,12 +63,10 @@ class TicketCard extends HookConsumerWidget { const Spacer(), GestureDetector( onTap: () async { - await tokenExpireWrapper(ref, () async { - ticketIdNotifier.setTicketId(ticket.id); - productIdNotifier.setProductId(product.id); - tagListNotifier.loadTags(seller.id, product.id, ticket.id); - QR.to(PurchasesRouter.root + PurchasesRouter.userList); - }); + ticketIdNotifier.setTicketId(ticket.id); + productIdNotifier.setProductId(product.id); + tagListNotifier.loadTags(seller.id, product.id, ticket.id); + QR.to(PurchasesRouter.root + PurchasesRouter.userList); }, child: const HeroIcon(HeroIcons.listBullet), ), diff --git a/lib/purchases/ui/pages/user_list_page/user_list_page.dart b/lib/purchases/ui/pages/user_list_page/user_list_page.dart index 238fd0ea2..993c7f98f 100644 --- a/lib/purchases/ui/pages/user_list_page/user_list_page.dart +++ b/lib/purchases/ui/pages/user_list_page/user_list_page.dart @@ -7,7 +7,6 @@ import 'package:myecl/purchases/providers/seller_provider.dart'; import 'package:myecl/purchases/providers/tag_list_provider.dart'; import 'package:myecl/purchases/providers/ticket_id_provider.dart'; import 'package:myecl/purchases/ui/purchases.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; import 'package:myecl/tools/ui/layouts/item_chip.dart'; @@ -61,25 +60,23 @@ class UserListPage extends HookConsumerWidget { return ItemChip( selected: selected, onTap: () async { - await tokenExpireWrapper(ref, () async { - selectedTag.value = tag; - productId.maybeWhen( - orElse: () {}, - data: (id) { - ticketId.maybeWhen( - orElse: () {}, - data: (ticketId) { - scannedUsersListNotifier.loadUsers( - seller.id, - id, - ticketId, - tag, - ); - }, - ); - }, - ); - }); + selectedTag.value = tag; + productId.maybeWhen( + orElse: () {}, + data: (id) { + ticketId.maybeWhen( + orElse: () {}, + data: (ticketId) { + scannedUsersListNotifier.loadUsers( + seller.id, + id, + ticketId, + tag, + ); + }, + ); + }, + ); }, child: Text( tag, diff --git a/lib/raffle/providers/cash_provider.dart b/lib/raffle/providers/cash_provider.dart index b7b2e17f2..9a39e7901 100644 --- a/lib/raffle/providers/cash_provider.dart +++ b/lib/raffle/providers/cash_provider.dart @@ -1,17 +1,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/raffle/class/cash.dart'; import 'package:myecl/raffle/repositories/cash_repository.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/exception.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class CashProvider extends ListNotifier { - final CashRepository _cashRepository = CashRepository(); + final CashRepository _cashRepository; AsyncValue> _cashList = const AsyncLoading(); - CashProvider({required String token}) : super(const AsyncLoading()) { - _cashRepository.setToken(token); - } + CashProvider(this._cashRepository) : super(const AsyncLoading()); Future>> loadCashList() async { return _cashList = await loadList(_cashRepository.getCashList); @@ -67,10 +63,8 @@ class CashProvider extends ListNotifier { final cashProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - CashProvider cashProvider = CashProvider(token: token); - tokenExpireWrapperAuth(ref, () async { - await cashProvider.loadCashList(); - }); + final cashRepository = CashRepository(ref); + CashProvider cashProvider = CashProvider(cashRepository); + cashProvider.loadCashList(); return cashProvider; }); diff --git a/lib/raffle/providers/pack_ticket_list_provider.dart b/lib/raffle/providers/pack_ticket_list_provider.dart index 84766d664..68024342e 100644 --- a/lib/raffle/providers/pack_ticket_list_provider.dart +++ b/lib/raffle/providers/pack_ticket_list_provider.dart @@ -1,23 +1,19 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/raffle/class/raffle.dart'; import 'package:myecl/raffle/class/pack_ticket.dart'; import 'package:myecl/raffle/providers/raffle_id_provider.dart'; import 'package:myecl/raffle/repositories/raffle_detail_repository.dart'; import 'package:myecl/raffle/repositories/pack_ticket_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class PackTicketsListNotifier extends ListNotifier { - final PackTicketRepository _packTicketsRepository = PackTicketRepository(); - final RaffleDetailRepository _raffleDetailRepository = - RaffleDetailRepository(); + final PackTicketRepository _packTicketsRepository; + final RaffleDetailRepository _raffleDetailRepository; late String raffleId; - PackTicketsListNotifier({required String token}) - : super(const AsyncValue.loading()) { - _packTicketsRepository.setToken(token); - _raffleDetailRepository.setToken(token); - } + PackTicketsListNotifier( + this._packTicketsRepository, + this._raffleDetailRepository, + ) : super(const AsyncValue.loading()); void setRaffleId(String id) { raffleId = id; @@ -57,14 +53,16 @@ final packTicketListProvider = PackTicketsListNotifier, AsyncValue> >((ref) { - final token = ref.watch(tokenProvider); - final notifier = PackTicketsListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - final raffleId = ref.watch(raffleIdProvider); - if (raffleId != Raffle.empty().id) { - notifier.setRaffleId(raffleId); - notifier.loadPackTicketList(); - } - }); + final packTicketsRepository = PackTicketRepository(ref); + final raffleDetailRepository = RaffleDetailRepository(ref); + final notifier = PackTicketsListNotifier( + packTicketsRepository, + raffleDetailRepository, + ); + final raffleId = ref.watch(raffleIdProvider); + if (raffleId != Raffle.empty().id) { + notifier.setRaffleId(raffleId); + notifier.loadPackTicketList(); + } return notifier; }); diff --git a/lib/raffle/providers/prize_list_provider.dart b/lib/raffle/providers/prize_list_provider.dart index 2741a1065..02ae6453b 100644 --- a/lib/raffle/providers/prize_list_provider.dart +++ b/lib/raffle/providers/prize_list_provider.dart @@ -1,18 +1,14 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/raffle/class/prize.dart'; import 'package:myecl/raffle/class/raffle.dart'; import 'package:myecl/raffle/providers/raffle_id_provider.dart'; import 'package:myecl/raffle/repositories/prize_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class LotListNotifier extends ListNotifier { - final LotRepository _lotRepository = LotRepository(); + final LotRepository _lotRepository; late String raffleId; - LotListNotifier({required String token}) : super(const AsyncValue.loading()) { - _lotRepository.setToken(token); - } + LotListNotifier(this._lotRepository) : super(const AsyncValue.loading()); void setRaffleId(String id) { raffleId = id; @@ -54,14 +50,12 @@ class LotListNotifier extends ListNotifier { final prizeListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - final notifier = LotListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - final raffleId = ref.watch(raffleIdProvider); - if (raffleId != Raffle.empty().id) { - notifier.setRaffleId(raffleId); - notifier.loadPrizeList(); - } - }); + final lotRepository = LotRepository(ref); + final notifier = LotListNotifier(lotRepository); + final raffleId = ref.watch(raffleIdProvider); + if (raffleId != Raffle.empty().id) { + notifier.setRaffleId(raffleId); + notifier.loadPrizeList(); + } return notifier; }); diff --git a/lib/raffle/providers/raffle_list_provider.dart b/lib/raffle/providers/raffle_list_provider.dart index 29bd9280f..e233aeb11 100644 --- a/lib/raffle/providers/raffle_list_provider.dart +++ b/lib/raffle/providers/raffle_list_provider.dart @@ -1,16 +1,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/raffle/class/raffle.dart'; import 'package:myecl/raffle/repositories/raffle_repositories.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class RaffleListNotifier extends ListNotifier { - final RaffleRepository raffleRepository = RaffleRepository(); - RaffleListNotifier({required String token}) - : super(const AsyncValue.loading()) { - raffleRepository.setToken(token); - } + final RaffleRepository raffleRepository; + RaffleListNotifier(this.raffleRepository) : super(const AsyncValue.loading()); Future>> loadRaffleList() async { return await loadList(() async => raffleRepository.getRaffleList()); @@ -56,10 +51,8 @@ class RaffleListNotifier extends ListNotifier { final raffleListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - RaffleListNotifier notifier = RaffleListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadRaffleList(); - }); + final raffleRepository = RaffleRepository(ref); + RaffleListNotifier notifier = RaffleListNotifier(raffleRepository); + notifier.loadRaffleList(); return notifier; }); diff --git a/lib/raffle/providers/raffle_stats_map_provider.dart b/lib/raffle/providers/raffle_stats_map_provider.dart index 738adda33..978416b52 100644 --- a/lib/raffle/providers/raffle_stats_map_provider.dart +++ b/lib/raffle/providers/raffle_stats_map_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/raffle/class/stats.dart'; import 'package:myecl/raffle/providers/raffle_list_provider.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class RaffleStatsMapNotifier extends MapNotifier { RaffleStatsMapNotifier() : super(); @@ -14,11 +13,9 @@ final raffleStatsMapProvider = Map>?> >((ref) { RaffleStatsMapNotifier notifier = RaffleStatsMapNotifier(); - tokenExpireWrapperAuth(ref, () async { - final raffles = ref.watch(raffleListProvider); - raffles.whenData((value) { - notifier.loadTList(value.map((e) => e.id).toList()); - }); + final raffles = ref.watch(raffleListProvider); + raffles.whenData((value) { + notifier.loadTList(value.map((e) => e.id).toList()); }); return notifier; }); diff --git a/lib/raffle/providers/raffle_stats_provider.dart b/lib/raffle/providers/raffle_stats_provider.dart index 8c619209e..fcc194094 100644 --- a/lib/raffle/providers/raffle_stats_provider.dart +++ b/lib/raffle/providers/raffle_stats_provider.dart @@ -1,5 +1,4 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/raffle/class/raffle.dart'; import 'package:myecl/raffle/class/stats.dart'; import 'package:myecl/raffle/providers/raffle_id_provider.dart'; @@ -7,13 +6,10 @@ import 'package:myecl/raffle/repositories/raffle_detail_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; class RaffleStatsNotifier extends SingleNotifier { - final RaffleDetailRepository _raffleDetailRepository = - RaffleDetailRepository(); + final RaffleDetailRepository _raffleDetailRepository; late String raffleId; - RaffleStatsNotifier({required String token}) - : super(const AsyncValue.loading()) { - _raffleDetailRepository.setToken(token); - } + RaffleStatsNotifier(this._raffleDetailRepository) + : super(const AsyncValue.loading()); void setRaffleId(String raffleId) { this.raffleId = raffleId; @@ -31,8 +27,10 @@ class RaffleStatsNotifier extends SingleNotifier { final raffleStatsProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - RaffleStatsNotifier notifier = RaffleStatsNotifier(token: token); + final raffleDetailRepository = RaffleDetailRepository(ref); + RaffleStatsNotifier notifier = RaffleStatsNotifier( + raffleDetailRepository, + ); final raffleId = ref.watch(raffleIdProvider); if (raffleId != Raffle.empty().id) { notifier.setRaffleId(raffleId); diff --git a/lib/raffle/providers/ticket_list_provider.dart b/lib/raffle/providers/ticket_list_provider.dart index a37abfc0a..09033b64e 100644 --- a/lib/raffle/providers/ticket_list_provider.dart +++ b/lib/raffle/providers/ticket_list_provider.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/raffle/class/raffle.dart'; import 'package:myecl/raffle/class/tickets.dart'; import 'package:myecl/raffle/providers/raffle_id_provider.dart'; @@ -7,13 +6,10 @@ import 'package:myecl/raffle/repositories/raffle_detail_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; class TicketsListNotifier extends ListNotifier { - final RaffleDetailRepository _raffleDetailRepository = - RaffleDetailRepository(); + final RaffleDetailRepository _raffleDetailRepository; late String raffleId; - TicketsListNotifier({required String token}) - : super(const AsyncValue.loading()) { - _raffleDetailRepository.setToken(token); - } + TicketsListNotifier(this._raffleDetailRepository) + : super(const AsyncValue.loading()); void setId(String id) { raffleId = id; @@ -28,8 +24,8 @@ class TicketsListNotifier extends ListNotifier { final ticketsListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - final notifier = TicketsListNotifier(token: token); + final raffleDetailRepository = RaffleDetailRepository(ref); + final notifier = TicketsListNotifier(raffleDetailRepository); final raffleId = ref.watch(raffleIdProvider); if (raffleId != Raffle.empty().id) { notifier.setId(raffleId); diff --git a/lib/raffle/providers/tombola_logo_provider.dart b/lib/raffle/providers/tombola_logo_provider.dart index 99119b558..ccff89657 100644 --- a/lib/raffle/providers/tombola_logo_provider.dart +++ b/lib/raffle/providers/tombola_logo_provider.dart @@ -2,20 +2,17 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/raffle/providers/tombola_logos_provider.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; import 'package:myecl/raffle/repositories/tombola_logo_repository.dart'; class TombolaLogoProvider extends SingleNotifier { - final repository = TombolaLogoRepository(); + final TombolaLogoRepository repository; final TombolaLogosNotifier tombolaLogosNotifier; TombolaLogoProvider({ - required String token, required this.tombolaLogosNotifier, - }) : super(const AsyncValue.loading()) { - repository.setToken(token); - } + required this.repository, + }) : super(const AsyncValue.loading()); Future getLogo(String id) async { Image logo = await repository.getTombolaLogo(id); @@ -34,10 +31,10 @@ class TombolaLogoProvider extends SingleNotifier { final tombolaLogoProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); final tombolaLogosNotifier = ref.watch(tombolaLogosProvider.notifier); + final repository = TombolaLogoRepository(ref); return TombolaLogoProvider( - token: token, tombolaLogosNotifier: tombolaLogosNotifier, + repository: repository, ); }); diff --git a/lib/raffle/providers/user_amount_provider.dart b/lib/raffle/providers/user_amount_provider.dart index 53f76f8cc..5c51ef6a5 100644 --- a/lib/raffle/providers/user_amount_provider.dart +++ b/lib/raffle/providers/user_amount_provider.dart @@ -3,14 +3,10 @@ import 'package:myecl/raffle/class/cash.dart'; import 'package:myecl/raffle/repositories/cash_repository.dart'; import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class UserCashNotifier extends SingleNotifier { - final CashRepository _cashRepository = CashRepository(); - UserCashNotifier({required String token}) - : super(const AsyncValue.loading()) { - _cashRepository.setToken(token); - } + final CashRepository _cashRepository; + UserCashNotifier(this._cashRepository) : super(const AsyncValue.loading()); Future> loadCashByUser(String userId) async { return await load(() async => _cashRepository.getCash(userId)); @@ -37,13 +33,9 @@ class UserCashNotifier extends SingleNotifier { final userAmountProvider = StateNotifierProvider>((ref) { - final token = ref.watch(tokenProvider); - UserCashNotifier userCashNotifier = UserCashNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - final userId = ref.watch(idProvider); - userId.whenData( - (value) async => await userCashNotifier.loadCashByUser(value), - ); - }); + final cashRepository = CashRepository(ref); + UserCashNotifier userCashNotifier = UserCashNotifier(cashRepository); + final userId = ref.watch(userIdProvider); + userId.whenData((value) async => userCashNotifier.loadCashByUser(value)); return userCashNotifier; }); diff --git a/lib/raffle/providers/user_tickets_provider.dart b/lib/raffle/providers/user_tickets_provider.dart index aba337f8b..1ea8603c4 100644 --- a/lib/raffle/providers/user_tickets_provider.dart +++ b/lib/raffle/providers/user_tickets_provider.dart @@ -5,17 +5,13 @@ import 'package:myecl/raffle/class/tickets.dart'; import 'package:myecl/raffle/repositories/tickets_repository.dart'; import 'package:myecl/raffle/repositories/user_tickets_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class UserTicketListNotifier extends ListNotifier { - final UserDetailRepository _userDetailRepository = UserDetailRepository(); - final TicketRepository _ticketsRepository = TicketRepository(); + final UserDetailRepository _userDetailRepository; + final TicketRepository _ticketsRepository; late String userId; - UserTicketListNotifier({required String token}) - : super(const AsyncValue.loading()) { - _userDetailRepository.setToken(token); - _ticketsRepository.setToken(token); - } + UserTicketListNotifier(this._userDetailRepository, this._ticketsRepository) + : super(const AsyncValue.loading()); void setId(String id) { userId = id; @@ -39,14 +35,16 @@ final userTicketListProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); - UserTicketListNotifier notifier = UserTicketListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - final userId = ref.watch(idProvider); - userId.whenData((value) async { - notifier.setId(value); - await notifier.loadTicketList(); - }); + final userDetailRepository = UserDetailRepository(ref); + final ticketsRepository = TicketRepository(ref); + UserTicketListNotifier notifier = UserTicketListNotifier( + userDetailRepository, + ticketsRepository, + ); + final userId = ref.watch(userIdProvider); + userId.whenData((value) async { + notifier.setId(value); + notifier.loadTicketList(); }); return notifier; }); diff --git a/lib/raffle/providers/winning_ticket_list_provider.dart b/lib/raffle/providers/winning_ticket_list_provider.dart index a2442a6c3..cd23d305f 100644 --- a/lib/raffle/providers/winning_ticket_list_provider.dart +++ b/lib/raffle/providers/winning_ticket_list_provider.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/raffle/class/prize.dart'; import 'package:myecl/raffle/class/tickets.dart'; import 'package:myecl/raffle/providers/ticket_list_provider.dart'; @@ -7,11 +6,9 @@ import 'package:myecl/raffle/repositories/prize_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; class WinningTicketNotifier extends ListNotifier { - final LotRepository _lotRepository = LotRepository(); - WinningTicketNotifier({required String token}) - : super(const AsyncValue.loading()) { - _lotRepository.setToken(token); - } + final LotRepository _lotRepository; + WinningTicketNotifier(this._lotRepository) + : super(const AsyncValue.loading()); void setData(List tickets) { state = AsyncValue.data(tickets); @@ -36,8 +33,8 @@ final winningTicketListProvider = StateNotifierProvider>>(( ref, ) { - final token = ref.watch(tokenProvider); - WinningTicketNotifier notifier = WinningTicketNotifier(token: token); + final lotRepository = LotRepository(ref); + WinningTicketNotifier notifier = WinningTicketNotifier(lotRepository); final ticketFromRaffle = ref.watch(ticketsListProvider); final winningTickets = ticketFromRaffle.maybeWhen>( data: (data) => data.where((element) => element.prize != null).toList(), diff --git a/lib/raffle/repositories/cash_repository.dart b/lib/raffle/repositories/cash_repository.dart index a2b6ed72b..545cd8a82 100644 --- a/lib/raffle/repositories/cash_repository.dart +++ b/lib/raffle/repositories/cash_repository.dart @@ -6,6 +6,8 @@ class CashRepository extends Repository { // ignore: overridden_fields final ext = "tombola/users/"; + CashRepository(super.ref); + Future> getCashList() async { return List.from( (await getList(suffix: "cash")).map((x) => Cash.fromJson(x)), diff --git a/lib/raffle/repositories/pack_ticket_repository.dart b/lib/raffle/repositories/pack_ticket_repository.dart index a415016f4..cf4c122c4 100644 --- a/lib/raffle/repositories/pack_ticket_repository.dart +++ b/lib/raffle/repositories/pack_ticket_repository.dart @@ -6,6 +6,8 @@ class PackTicketRepository extends Repository { // ignore: overridden_fields final ext = "tombola/pack_tickets"; + PackTicketRepository(super.ref); + Future getPackTicket(String id) async { return PackTicket.fromJson(await getOne(id)); } diff --git a/lib/raffle/repositories/prize_repository.dart b/lib/raffle/repositories/prize_repository.dart index 2de83d7d8..c6c97e637 100644 --- a/lib/raffle/repositories/prize_repository.dart +++ b/lib/raffle/repositories/prize_repository.dart @@ -1,3 +1,4 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/raffle/class/prize.dart'; import 'package:myecl/raffle/class/tickets.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -7,6 +8,8 @@ class LotRepository extends Repository { // ignore: overridden_fields final ext = "tombola/lots"; + LotRepository(super.ref); + Future> getLotList(String raffle) async { return List.from((await getList()).map((x) => Prize.fromJson(x))); } @@ -36,3 +39,7 @@ class LotRepository extends Repository { ); } } + +final lotRepositoryProvider = Provider((ref) { + return LotRepository(ref); +}); diff --git a/lib/raffle/repositories/prizes_repository.dart b/lib/raffle/repositories/prizes_repository.dart index 5e9b0b1f6..8f4c7997f 100644 --- a/lib/raffle/repositories/prizes_repository.dart +++ b/lib/raffle/repositories/prizes_repository.dart @@ -7,6 +7,8 @@ class LotRepository extends Repository { // ignore: overridden_fields final ext = "tombola/prizes"; + LotRepository(super.ref); + Future> getPrizeList(String raffle) async { return List.from((await getList()).map((x) => Prize.fromJson(x))); } diff --git a/lib/raffle/repositories/raffle_detail_repository.dart b/lib/raffle/repositories/raffle_detail_repository.dart index 8dd50f56b..72867cf9a 100644 --- a/lib/raffle/repositories/raffle_detail_repository.dart +++ b/lib/raffle/repositories/raffle_detail_repository.dart @@ -9,6 +9,8 @@ class RaffleDetailRepository extends Repository { // ignore: overridden_fields final ext = "tombola/raffle/"; + RaffleDetailRepository(super.ref); + Future> getPackTicketListFromRaffle(String raffleId) async { return List.from( (await getList( diff --git a/lib/raffle/repositories/raffle_repositories.dart b/lib/raffle/repositories/raffle_repositories.dart index c7b6d407c..d2b486b49 100644 --- a/lib/raffle/repositories/raffle_repositories.dart +++ b/lib/raffle/repositories/raffle_repositories.dart @@ -6,6 +6,8 @@ class RaffleRepository extends Repository { // ignore: overridden_fields final ext = "tombola/raffles"; + RaffleRepository(super.ref); + Future> getRaffleList() async { return List.from((await getList()).map((x) => Raffle.fromJson(x))); } diff --git a/lib/raffle/repositories/tickets_repository.dart b/lib/raffle/repositories/tickets_repository.dart index cdf10bb70..f096d793a 100644 --- a/lib/raffle/repositories/tickets_repository.dart +++ b/lib/raffle/repositories/tickets_repository.dart @@ -6,6 +6,8 @@ class TicketRepository extends Repository { // ignore: overridden_fields final ext = "tombola/tickets"; + TicketRepository(super.ref); + Future getTicket(String id) async { return Ticket.fromJson(await getOne("/$id")); } diff --git a/lib/raffle/repositories/tombola_logo_repository.dart b/lib/raffle/repositories/tombola_logo_repository.dart index 2dfb3405e..fdb316b20 100644 --- a/lib/raffle/repositories/tombola_logo_repository.dart +++ b/lib/raffle/repositories/tombola_logo_repository.dart @@ -9,6 +9,8 @@ class TombolaLogoRepository extends LogoRepository { // ignore: overridden_fields final ext = 'tombola/raffles/'; + TombolaLogoRepository(super.ref); + Future getTombolaLogo(String id) async { final uint8List = await getLogo(id, suffix: "/logo"); if (uint8List.isEmpty) { diff --git a/lib/raffle/repositories/user_tickets_repository.dart b/lib/raffle/repositories/user_tickets_repository.dart index e833e9de8..c44059bf8 100644 --- a/lib/raffle/repositories/user_tickets_repository.dart +++ b/lib/raffle/repositories/user_tickets_repository.dart @@ -7,6 +7,8 @@ class UserDetailRepository extends Repository { // ignore: overridden_fields final ext = "tombola/users"; + UserDetailRepository(super.ref); + Future> getTicketsListByUserId(String userId) async { return List.from( (await getList( diff --git a/lib/raffle/router.dart b/lib/raffle/router.dart index 5f5833a7f..c9ba3d6f7 100644 --- a/lib/raffle/router.dart +++ b/lib/raffle/router.dart @@ -15,9 +15,9 @@ import 'package:myecl/raffle/ui/pages/prize_page/add_edit_prize_page.dart' deferred as add_edit_prize_page; import 'package:myecl/raffle/ui/pages/raffle_page/raffle_page.dart' deferred as raffle_page; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class RaffleRouter { diff --git a/lib/raffle/ui/pages/admin_module_page/account_handler.dart b/lib/raffle/ui/pages/admin_module_page/account_handler.dart index 743b53bb4..1979daeba 100644 --- a/lib/raffle/ui/pages/admin_module_page/account_handler.dart +++ b/lib/raffle/ui/pages/admin_module_page/account_handler.dart @@ -8,7 +8,6 @@ import 'package:myecl/raffle/providers/searching_raffle_user_provider.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/raffle/ui/pages/admin_module_page/adding_user_container.dart'; import 'package:myecl/raffle/ui/pages/admin_module_page/cash_container.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/providers/user_list_provider.dart'; class AccountHandler extends HookConsumerWidget { @@ -35,22 +34,20 @@ class AccountHandler extends HookConsumerWidget { padding: const EdgeInsets.symmetric(horizontal: 30), alignment: Alignment.centerLeft, child: TextField( - onChanged: (value) { - tokenExpireWrapper(ref, () async { - if (!searchingAmapUser) { - if (editingController.text.isNotEmpty) { - await usersNotifier.filterUsers(editingController.text); - } else { - usersNotifier.clear(); - } + onChanged: (value) async { + if (!searchingAmapUser) { + if (editingController.text.isNotEmpty) { + await usersNotifier.filterUsers(editingController.text); } else { - if (editingController.text.isNotEmpty) { - await cashNotifier.filterCashList(editingController.text); - } else { - cashNotifier.refreshCashList(); - } + usersNotifier.clear(); } - }); + } else { + if (editingController.text.isNotEmpty) { + await cashNotifier.filterCashList(editingController.text); + } else { + cashNotifier.refreshCashList(); + } + } }, focusNode: focusNode, controller: editingController, diff --git a/lib/raffle/ui/pages/admin_module_page/confirm_creation.dart b/lib/raffle/ui/pages/admin_module_page/confirm_creation.dart index 365eabb23..ca6ad3c89 100644 --- a/lib/raffle/ui/pages/admin_module_page/confirm_creation.dart +++ b/lib/raffle/ui/pages/admin_module_page/confirm_creation.dart @@ -9,7 +9,6 @@ import 'package:myecl/raffle/class/raffle.dart'; import 'package:myecl/raffle/class/raffle_status_type.dart'; import 'package:myecl/raffle/providers/raffle_list_provider.dart'; import 'package:myecl/raffle/tools/constants.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; class ConfirmCreationDialog extends HookConsumerWidget { @@ -102,18 +101,16 @@ class ConfirmCreationDialog extends HookConsumerWidget { child: child, ), onTap: () async { - await tokenExpireWrapper(ref, () async { - await raffleListNotifier.createRaffle( - Raffle( - name: "Tombola : ${group.name}", - group: group, - id: '', - raffleStatusType: RaffleStatusType.creation, - ), - ); - await raffleListNotifier.loadRaffleList(); - navigationPop(); - }); + await raffleListNotifier.createRaffle( + Raffle( + name: "Tombola : ${group.name}", + group: group, + id: '', + raffleStatusType: RaffleStatusType.creation, + ), + ); + await raffleListNotifier.loadRaffleList(); + navigationPop(); }, child: const HeroIcon( HeroIcons.check, diff --git a/lib/raffle/ui/pages/creation_edit_page/creation_edit_page.dart b/lib/raffle/ui/pages/creation_edit_page/creation_edit_page.dart index 25abdd9be..619d49f66 100644 --- a/lib/raffle/ui/pages/creation_edit_page/creation_edit_page.dart +++ b/lib/raffle/ui/pages/creation_edit_page/creation_edit_page.dart @@ -23,7 +23,6 @@ import 'package:myecl/raffle/ui/pages/creation_edit_page/ticket_handler.dart'; import 'package:myecl/raffle/ui/pages/creation_edit_page/winning_ticket_handler.dart'; import 'package:myecl/raffle/ui/raffle.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; @@ -203,14 +202,12 @@ class CreationPage extends HookConsumerWidget { onTap: () async { if (raffle.raffleStatusType == RaffleStatusType.creation && formKey.currentState!.validate()) { - await tokenExpireWrapper(ref, () async { - Raffle newRaffle = raffle.copyWith( - name: name.text, - description: raffle.description, - raffleStatusType: raffle.raffleStatusType, - ); - await raffleListNotifier.updateRaffle(newRaffle); - }); + Raffle newRaffle = raffle.copyWith( + name: name.text, + description: raffle.description, + raffleStatusType: raffle.raffleStatusType, + ); + await raffleListNotifier.updateRaffle(newRaffle); raffleList.when( data: (list) async { if (logo.value != null) { @@ -253,55 +250,53 @@ class CreationPage extends HookConsumerWidget { child: WaitingButton( builder: (child) => BlueBtn(child: child), onTap: () async { - await tokenExpireWrapper(ref, () async { - await showDialog( - context: context, - builder: (context) => CustomDialogBox( - title: - raffle.raffleStatusType == - RaffleStatusType.creation - ? RaffleTextConstants.openRaffle - : RaffleTextConstants.closeRaffle, - descriptions: - raffle.raffleStatusType == - RaffleStatusType.creation - ? RaffleTextConstants.openRaffleDescription - : RaffleTextConstants.closeRaffleDescription, - onYes: () async { - switch (raffle.raffleStatusType) { - case RaffleStatusType.creation: - await raffleListNotifier.openRaffle( - raffle.copyWith( - description: raffle.description, - raffleStatusType: RaffleStatusType.open, - ), - ); - QR.back(); - break; - case RaffleStatusType.open: - await raffleListNotifier.lockRaffle( - raffle.copyWith( - description: raffle.description, - raffleStatusType: RaffleStatusType.lock, - ), - ); - prizeList.whenData((prizes) { - for (var prize in prizes) { - if (prize.raffleId == raffle.id) { - winningTicketListNotifier.drawPrize( - prize, - ); - } + await showDialog( + context: context, + builder: (context) => CustomDialogBox( + title: + raffle.raffleStatusType == + RaffleStatusType.creation + ? RaffleTextConstants.openRaffle + : RaffleTextConstants.closeRaffle, + descriptions: + raffle.raffleStatusType == + RaffleStatusType.creation + ? RaffleTextConstants.openRaffleDescription + : RaffleTextConstants.closeRaffleDescription, + onYes: () async { + switch (raffle.raffleStatusType) { + case RaffleStatusType.creation: + await raffleListNotifier.openRaffle( + raffle.copyWith( + description: raffle.description, + raffleStatusType: RaffleStatusType.open, + ), + ); + QR.back(); + break; + case RaffleStatusType.open: + await raffleListNotifier.lockRaffle( + raffle.copyWith( + description: raffle.description, + raffleStatusType: RaffleStatusType.lock, + ), + ); + prizeList.whenData((prizes) { + for (var prize in prizes) { + if (prize.raffleId == raffle.id) { + winningTicketListNotifier.drawPrize( + prize, + ); } - }); - QR.back(); - break; - default: - } - }, - ), - ); - }); + } + }); + QR.back(); + break; + default: + } + }, + ), + ); }, child: BlueBtn( child: Text( diff --git a/lib/raffle/ui/pages/creation_edit_page/prize_handler.dart b/lib/raffle/ui/pages/creation_edit_page/prize_handler.dart index fcfb222b1..b2294778e 100644 --- a/lib/raffle/ui/pages/creation_edit_page/prize_handler.dart +++ b/lib/raffle/ui/pages/creation_edit_page/prize_handler.dart @@ -12,7 +12,6 @@ import 'package:myecl/raffle/router.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/raffle/ui/pages/creation_edit_page/prize_card.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -167,23 +166,20 @@ class PrizeHandler extends HookConsumerWidget { title: "Supprimer le lot", descriptions: "Voulez-vous vraiment supprimer ce lot?", - onYes: () { - tokenExpireWrapper(ref, () async { - final value = await prizesNotifier - .deletePrize(e); - if (value) { - displayToastWithContext( - TypeMsg.msg, - RaffleTextConstants.deletePrize, - ); - } else { - displayToastWithContext( - TypeMsg.error, - RaffleTextConstants - .deletingError, - ); - } - }); + onYes: () async { + final value = await prizesNotifier + .deletePrize(e); + if (value) { + displayToastWithContext( + TypeMsg.msg, + RaffleTextConstants.deletePrize, + ); + } else { + displayToastWithContext( + TypeMsg.error, + RaffleTextConstants.deletingError, + ); + } }, ), ); @@ -205,31 +201,29 @@ class PrizeHandler extends HookConsumerWidget { title: "Tirage", descriptions: "Tirer le gagnant de ce lot ?", - onYes: () { - tokenExpireWrapper(ref, () async { - final value = - await winningTicketListNotifier - .drawPrize(e); - value.when( - data: (winningTicketList) { - prizesNotifier - .setPrizeQuantityToZero( - e.copyWith(quantity: 0), - ); - displayWinningsDialog( - winningTicketList, - ); - }, - error: (e, s) { - displayToastWithContext( - TypeMsg.error, - RaffleTextConstants - .drawingError, - ); - }, - loading: () {}, - ); - }); + onYes: () async { + final value = + await winningTicketListNotifier + .drawPrize(e); + value.when( + data: (winningTicketList) { + prizesNotifier + .setPrizeQuantityToZero( + e.copyWith(quantity: 0), + ); + displayWinningsDialog( + winningTicketList, + ); + }, + error: (e, s) { + displayToastWithContext( + TypeMsg.error, + RaffleTextConstants + .drawingError, + ); + }, + loading: () {}, + ); }, ), ); diff --git a/lib/raffle/ui/pages/creation_edit_page/ticket_handler.dart b/lib/raffle/ui/pages/creation_edit_page/ticket_handler.dart index 9d54e3ba3..19ae35878 100644 --- a/lib/raffle/ui/pages/creation_edit_page/ticket_handler.dart +++ b/lib/raffle/ui/pages/creation_edit_page/ticket_handler.dart @@ -10,7 +10,6 @@ import 'package:myecl/raffle/router.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/raffle/ui/pages/creation_edit_page/ticket_ui.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -117,22 +116,20 @@ class TicketHandler extends HookConsumerWidget { title: "Supprimer le ticket", descriptions: "Voulez-vous vraiment supprimer ce ticket?", - onYes: () { - tokenExpireWrapper(ref, () async { - final value = await packTicketsNotifier - .deletePackTicket(e); - if (value) { - displayToastWithContext( - TypeMsg.msg, - RaffleTextConstants.deletedTicket, - ); - } else { - displayToastWithContext( - TypeMsg.error, - RaffleTextConstants.deletingError, - ); - } - }); + onYes: () async { + final value = await packTicketsNotifier + .deletePackTicket(e); + if (value) { + displayToastWithContext( + TypeMsg.msg, + RaffleTextConstants.deletedTicket, + ); + } else { + displayToastWithContext( + TypeMsg.error, + RaffleTextConstants.deletingError, + ); + } }, ), ); diff --git a/lib/raffle/ui/pages/creation_edit_page/user_cash_ui.dart b/lib/raffle/ui/pages/creation_edit_page/user_cash_ui.dart index 9a9f965a7..61aa7f4f6 100644 --- a/lib/raffle/ui/pages/creation_edit_page/user_cash_ui.dart +++ b/lib/raffle/ui/pages/creation_edit_page/user_cash_ui.dart @@ -9,7 +9,6 @@ import 'package:myecl/raffle/class/cash.dart'; import 'package:myecl/raffle/providers/cash_provider.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; class UserCashUi extends HookConsumerWidget { @@ -229,31 +228,29 @@ class UserCashUi extends HookConsumerWidget { return; } if (key.currentState!.validate()) { - await tokenExpireWrapper(ref, () async { - await ref - .read(cashProvider.notifier) - .updateCash( - cash, - int.parse(amount.text), - ) - .then((value) { - if (value) { - key.currentState!.reset(); - toggle(); - displayVoteWithContext( - TypeMsg.msg, - RaffleTextConstants - .updatedAmount, - ); - } else { - displayVoteWithContext( - TypeMsg.error, - RaffleTextConstants - .updatingError, - ); - } - }); - }); + await ref + .read(cashProvider.notifier) + .updateCash( + cash, + int.parse(amount.text), + ) + .then((value) { + if (value) { + key.currentState!.reset(); + toggle(); + displayVoteWithContext( + TypeMsg.msg, + RaffleTextConstants + .updatedAmount, + ); + } else { + displayVoteWithContext( + TypeMsg.error, + RaffleTextConstants + .updatingError, + ); + } + }); } }, child: const Icon( diff --git a/lib/raffle/ui/pages/main_page/ticket_card.dart b/lib/raffle/ui/pages/main_page/ticket_card.dart index 17b6e9dc4..a449860f8 100644 --- a/lib/raffle/ui/pages/main_page/ticket_card.dart +++ b/lib/raffle/ui/pages/main_page/ticket_card.dart @@ -9,7 +9,6 @@ import 'package:myecl/raffle/providers/tombola_logo_provider.dart'; import 'package:myecl/raffle/providers/tombola_logos_provider.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/raffle/ui/pages/main_page/ticket_card_background.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class TicketWidget extends HookConsumerWidget { final List ticket; @@ -78,16 +77,14 @@ class TicketWidget extends HookConsumerWidget { ); }, ); - tokenExpireWrapper(ref, () async { - tombolaLogoNotifier - .getLogo(raffle.id) - .then((value) { - tombolaLogosNotifier.setTData( - raffle.id, - AsyncData([value]), - ); - }); - }); + tombolaLogoNotifier.getLogo(raffle.id).then( + (value) { + tombolaLogosNotifier.setTData( + raffle.id, + AsyncData([value]), + ); + }, + ); return const HeroIcon( HeroIcons.cubeTransparent, ); diff --git a/lib/raffle/ui/pages/pack_ticket_page/add_edit_pack_ticket_page.dart b/lib/raffle/ui/pages/pack_ticket_page/add_edit_pack_ticket_page.dart index bbbf63b06..4f030f378 100644 --- a/lib/raffle/ui/pages/pack_ticket_page/add_edit_pack_ticket_page.dart +++ b/lib/raffle/ui/pages/pack_ticket_page/add_edit_pack_ticket_page.dart @@ -8,7 +8,6 @@ import 'package:myecl/raffle/providers/pack_ticket_list_provider.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/raffle/ui/components/blue_btn.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -111,52 +110,48 @@ class AddEditPackTicketPage extends HookConsumerWidget { price.text.replaceAll(',', '.'), ); if (ticketPrice != null && ticketPrice > 0) { - await tokenExpireWrapper(ref, () async { - final newPackTicket = packTicket.copyWith( - price: double.parse(price.text), - packSize: int.parse(packSize.text), - raffleId: isEdit - ? packTicket.raffleId - : raffle.id, - id: isEdit ? packTicket.id : "", - ); - final typeTicketNotifier = ref.watch( - packTicketListProvider.notifier, - ); - final value = isEdit - ? await typeTicketNotifier.updatePackTicket( - newPackTicket, - ) - : await typeTicketNotifier.addPackTicket( - newPackTicket, - ); - if (value) { - QR.back(); - if (isEdit) { - displayToastWithContext( - TypeMsg.msg, - RaffleTextConstants.editedTicket, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - RaffleTextConstants.addedTicket, + final newPackTicket = packTicket.copyWith( + price: double.parse(price.text), + packSize: int.parse(packSize.text), + raffleId: isEdit ? packTicket.raffleId : raffle.id, + id: isEdit ? packTicket.id : "", + ); + final typeTicketNotifier = ref.watch( + packTicketListProvider.notifier, + ); + final value = isEdit + ? await typeTicketNotifier.updatePackTicket( + newPackTicket, + ) + : await typeTicketNotifier.addPackTicket( + newPackTicket, ); - } + if (value) { + QR.back(); + if (isEdit) { + displayToastWithContext( + TypeMsg.msg, + RaffleTextConstants.editedTicket, + ); } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - RaffleTextConstants.editingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - RaffleTextConstants.alreadyExistTicket, - ); - } + displayToastWithContext( + TypeMsg.msg, + RaffleTextConstants.addedTicket, + ); + } + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + RaffleTextConstants.editingError, + ); + } else { + displayToastWithContext( + TypeMsg.error, + RaffleTextConstants.alreadyExistTicket, + ); } - }); + } } else { displayToast( context, diff --git a/lib/raffle/ui/pages/prize_page/add_edit_prize_page.dart b/lib/raffle/ui/pages/prize_page/add_edit_prize_page.dart index 91cbfdba0..4645fd7eb 100644 --- a/lib/raffle/ui/pages/prize_page/add_edit_prize_page.dart +++ b/lib/raffle/ui/pages/prize_page/add_edit_prize_page.dart @@ -10,7 +10,6 @@ import 'package:myecl/raffle/ui/components/blue_btn.dart'; import 'package:myecl/raffle/ui/components/section_title.dart'; import 'package:myecl/raffle/ui/raffle.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; @@ -83,46 +82,44 @@ class AddEditPrizePage extends HookConsumerWidget { builder: (child) => BlueBtn(child: child), onTap: () async { if (formKey.currentState!.validate()) { - await tokenExpireWrapper(ref, () async { - final newPrize = prize.copyWith( - name: name.text, - description: description.text, - raffleId: isEdit ? prize.raffleId : raffle.id, - quantity: int.parse(quantity.text), - ); - final prizeNotifier = ref.watch( - prizeListProvider.notifier, - ); - final value = isEdit - ? await prizeNotifier.updatePrize(newPrize) - : await prizeNotifier.addPrize(newPrize); - if (value) { - QR.back(); - if (isEdit) { - displayToastWithContext( - TypeMsg.msg, - RaffleTextConstants.editedTicket, - ); - } else { - displayToastWithContext( - TypeMsg.msg, - RaffleTextConstants.addedTicket, - ); - } + final newPrize = prize.copyWith( + name: name.text, + description: description.text, + raffleId: isEdit ? prize.raffleId : raffle.id, + quantity: int.parse(quantity.text), + ); + final prizeNotifier = ref.watch( + prizeListProvider.notifier, + ); + final value = isEdit + ? await prizeNotifier.updatePrize(newPrize) + : await prizeNotifier.addPrize(newPrize); + if (value) { + QR.back(); + if (isEdit) { + displayToastWithContext( + TypeMsg.msg, + RaffleTextConstants.editedTicket, + ); + } else { + displayToastWithContext( + TypeMsg.msg, + RaffleTextConstants.addedTicket, + ); + } + } else { + if (isEdit) { + displayToastWithContext( + TypeMsg.error, + RaffleTextConstants.editingError, + ); } else { - if (isEdit) { - displayToastWithContext( - TypeMsg.error, - RaffleTextConstants.editingError, - ); - } else { - displayToastWithContext( - TypeMsg.error, - RaffleTextConstants.addingError, - ); - } + displayToastWithContext( + TypeMsg.error, + RaffleTextConstants.addingError, + ); } - }); + } } else { displayToast( context, diff --git a/lib/raffle/ui/pages/raffle_page/buy_pack_ticket_card.dart b/lib/raffle/ui/pages/raffle_page/buy_pack_ticket_card.dart index cf11ff1ce..094bd1672 100644 --- a/lib/raffle/ui/pages/raffle_page/buy_pack_ticket_card.dart +++ b/lib/raffle/ui/pages/raffle_page/buy_pack_ticket_card.dart @@ -8,7 +8,6 @@ import 'package:myecl/raffle/providers/tombola_logo_provider.dart'; import 'package:myecl/raffle/providers/tombola_logos_provider.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/raffle/ui/pages/raffle_page/confirm_payment.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class BuyPackTicket extends HookConsumerWidget { final PackTicket packTicket; @@ -102,15 +101,13 @@ class BuyPackTicket extends HookConsumerWidget { ); }, ); - tokenExpireWrapper(ref, () async { - tombolaLogoNotifier.getLogo(raffle.id).then(( - value, - ) { - tombolaLogosNotifier.setTData( - raffle.id, - AsyncData([value]), - ); - }); + tombolaLogoNotifier.getLogo(raffle.id).then(( + value, + ) { + tombolaLogosNotifier.setTData( + raffle.id, + AsyncData([value]), + ); }); return const HeroIcon( HeroIcons.cubeTransparent, diff --git a/lib/raffle/ui/pages/raffle_page/buy_type_ticket_card.dart b/lib/raffle/ui/pages/raffle_page/buy_type_ticket_card.dart index 4af18a549..8820e33f8 100644 --- a/lib/raffle/ui/pages/raffle_page/buy_type_ticket_card.dart +++ b/lib/raffle/ui/pages/raffle_page/buy_type_ticket_card.dart @@ -8,7 +8,6 @@ import 'package:myecl/raffle/providers/tombola_logo_provider.dart'; import 'package:myecl/raffle/providers/tombola_logos_provider.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/raffle/ui/pages/raffle_page/confirm_payment.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class BuyPackTicket extends HookConsumerWidget { final PackTicket packTicket; @@ -102,15 +101,13 @@ class BuyPackTicket extends HookConsumerWidget { ); }, ); - tokenExpireWrapper(ref, () async { - tombolaLogoNotifier.getLogo(raffle.id).then(( - value, - ) { - tombolaLogosNotifier.setTData( - raffle.id, - AsyncData([value]), - ); - }); + tombolaLogoNotifier.getLogo(raffle.id).then(( + value, + ) { + tombolaLogosNotifier.setTData( + raffle.id, + AsyncData([value]), + ); }); return const HeroIcon( HeroIcons.cubeTransparent, diff --git a/lib/raffle/ui/pages/raffle_page/confirm_payment.dart b/lib/raffle/ui/pages/raffle_page/confirm_payment.dart index 3a033555f..734c98be9 100644 --- a/lib/raffle/ui/pages/raffle_page/confirm_payment.dart +++ b/lib/raffle/ui/pages/raffle_page/confirm_payment.dart @@ -13,7 +13,6 @@ import 'package:myecl/raffle/providers/user_amount_provider.dart'; import 'package:myecl/raffle/providers/user_tickets_provider.dart'; import 'package:myecl/raffle/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; class ConfirmPaymentDialog extends HookConsumerWidget { @@ -133,16 +132,14 @@ class ConfirmPaymentDialog extends HookConsumerWidget { ); }, ); - tokenExpireWrapper(ref, () async { - tombolaLogoNotifier - .getLogo(raffle.id) - .then((value) { - tombolaLogosNotifier.setTData( - raffle.id, - AsyncData([value]), - ); - }); - }); + tombolaLogoNotifier + .getLogo(raffle.id) + .then((value) { + tombolaLogosNotifier.setTData( + raffle.id, + AsyncData([value]), + ); + }); return const HeroIcon( HeroIcons.cubeTransparent, ); @@ -246,25 +243,23 @@ class ConfirmPaymentDialog extends HookConsumerWidget { "Vous n'avez pas assez d'argent", ); } else { - await tokenExpireWrapper(ref, () async { - final value = await userTicketListNotifier - .buyTicket(packTicket); - if (value) { - userAmountNotifier.updateCash( - -packTicket.price.toDouble(), - ); - displayToastWithContext( - TypeMsg.msg, - RaffleTextConstants.boughtTicket, - ); - } else { - displayToastWithContext( - TypeMsg.error, - RaffleTextConstants.addingError, - ); - } - navigationPop(); - }); + final value = await userTicketListNotifier + .buyTicket(packTicket); + if (value) { + userAmountNotifier.updateCash( + -packTicket.price.toDouble(), + ); + displayToastWithContext( + TypeMsg.msg, + RaffleTextConstants.boughtTicket, + ); + } else { + displayToastWithContext( + TypeMsg.error, + RaffleTextConstants.addingError, + ); + } + navigationPop(); } }, child: const HeroIcon( diff --git a/lib/raffle/ui/pages/raffle_page/raffle_page.dart b/lib/raffle/ui/pages/raffle_page/raffle_page.dart index b9b84dbec..83f0c8ed1 100644 --- a/lib/raffle/ui/pages/raffle_page/raffle_page.dart +++ b/lib/raffle/ui/pages/raffle_page/raffle_page.dart @@ -19,7 +19,7 @@ class RaffleInfoPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final userId = ref.watch(idProvider); + final userId = ref.watch(userIdProvider); final raffle = ref.watch(raffleProvider); final balance = ref.watch(userAmountProvider); final balanceNotifier = ref.read(userAmountProvider.notifier); diff --git a/lib/recommendation/providers/recommendation_list_provider.dart b/lib/recommendation/providers/recommendation_list_provider.dart index 7350d8e29..44cf7aae0 100644 --- a/lib/recommendation/providers/recommendation_list_provider.dart +++ b/lib/recommendation/providers/recommendation_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/recommendation/class/recommendation.dart'; import 'package:myecl/recommendation/repositories/recommendation_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class RecommendationListNotifier extends ListNotifier { final RecommendationRepository recommendationRepository; @@ -53,8 +52,6 @@ final recommendationListProvider = final provider = RecommendationListNotifier( recommendationRepository: recommendatioRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadRecommendation(); - }); + provider.loadRecommendation(); return provider; }); diff --git a/lib/recommendation/repositories/recommendation_logo_repository.dart b/lib/recommendation/repositories/recommendation_logo_repository.dart index a377ab90b..b30a875dc 100644 --- a/lib/recommendation/repositories/recommendation_logo_repository.dart +++ b/lib/recommendation/repositories/recommendation_logo_repository.dart @@ -3,7 +3,6 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/logo_repository.dart'; class RecommendationLogoRepository extends LogoRepository { @@ -11,6 +10,8 @@ class RecommendationLogoRepository extends LogoRepository { // ignore: overridden_fields final ext = "recommendation/recommendations"; + RecommendationLogoRepository(super.ref); + Future getRecommendationLogo(String id) async { final uint8List = await getLogo("", suffix: "/$id/picture"); return Image.memory(uint8List); @@ -24,6 +25,5 @@ class RecommendationLogoRepository extends LogoRepository { final recommendationLogoRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return RecommendationLogoRepository()..setToken(token); + return RecommendationLogoRepository(ref); }); diff --git a/lib/recommendation/repositories/recommendation_repository.dart b/lib/recommendation/repositories/recommendation_repository.dart index 34825eeec..81b297da7 100644 --- a/lib/recommendation/repositories/recommendation_repository.dart +++ b/lib/recommendation/repositories/recommendation_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/recommendation/class/recommendation.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +7,8 @@ class RecommendationRepository extends Repository { // ignore: overridden_fields final ext = 'recommendation/recommendations'; + RecommendationRepository(super.ref); + Future> getRecommendationList() async { return List.from( (await getList()).map((x) => Recommendation.fromJson(x)), @@ -32,6 +33,5 @@ class RecommendationRepository extends Repository { final recommendationRepositoryProvider = Provider(( ref, ) { - final token = ref.watch(tokenProvider); - return RecommendationRepository()..setToken(token); + return RecommendationRepository(ref); }); diff --git a/lib/recommendation/router.dart b/lib/recommendation/router.dart index e603fcd0a..e05dc6543 100644 --- a/lib/recommendation/router.dart +++ b/lib/recommendation/router.dart @@ -9,9 +9,9 @@ import 'package:myecl/recommendation/ui/pages/information_page.dart' deferred as information_page; import 'package:myecl/recommendation/ui/pages/add_edit_page.dart' deferred as add_edit_page; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class RecommendationRouter { diff --git a/lib/recommendation/ui/widgets/recommendation_card.dart b/lib/recommendation/ui/widgets/recommendation_card.dart index d93cc9aae..878234461 100644 --- a/lib/recommendation/ui/widgets/recommendation_card.dart +++ b/lib/recommendation/ui/widgets/recommendation_card.dart @@ -12,7 +12,6 @@ import 'package:myecl/recommendation/router.dart'; import 'package:myecl/recommendation/tools/constants.dart'; import 'package:myecl/recommendation/ui/widgets/recommendation_card_layout.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/auto_loader_child.dart'; import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; @@ -154,38 +153,36 @@ class RecommendationCard extends HookConsumerWidget { const SizedBox(height: 10), GestureDetector( onTap: () async { - await tokenExpireWrapper(ref, () async { - await showDialog( - context: context, - builder: (context) => CustomDialogBox( - descriptions: RecommendationTextConstants - .deleteRecommendationConfirmation, - onYes: () async { - final value = - await recommendationListNotifier - .deleteRecommendation( - recommendation, - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - RecommendationTextConstants - .deletedRecommendation, - ); - QR.back(); - } else { - displayToastWithContext( - TypeMsg.error, - RecommendationTextConstants - .deletingRecommendationError, - ); - } - }, - title: RecommendationTextConstants - .deleteRecommendation, - ), - ); - }); + await showDialog( + context: context, + builder: (context) => CustomDialogBox( + descriptions: RecommendationTextConstants + .deleteRecommendationConfirmation, + onYes: () async { + final value = + await recommendationListNotifier + .deleteRecommendation( + recommendation, + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + RecommendationTextConstants + .deletedRecommendation, + ); + QR.back(); + } else { + displayToastWithContext( + TypeMsg.error, + RecommendationTextConstants + .deletingRecommendationError, + ); + } + }, + title: RecommendationTextConstants + .deleteRecommendation, + ), + ); }, child: const CardButton( color: Colors.black, diff --git a/lib/router.dart b/lib/router.dart index 3921783a8..b57279596 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -11,11 +11,11 @@ import 'package:myecl/home/router.dart'; import 'package:myecl/home/ui/home.dart' deferred as home_page; import 'package:myecl/loan/router.dart'; import 'package:myecl/login/router.dart'; -import 'package:myecl/others/ui/loading_page.dart' deferred as loading_page; -import 'package:myecl/others/ui/no_internet_page.dart' +import 'package:myecl/routing/ui/loading_page.dart' deferred as loading_page; +import 'package:myecl/routing/ui/no_internet_page.dart' deferred as no_internet_page; -import 'package:myecl/others/ui/no_module.dart' deferred as no_module_page; -import 'package:myecl/others/ui/update_page.dart' deferred as update_page; +import 'package:myecl/routing/ui/no_module.dart' deferred as no_module_page; +import 'package:myecl/routing/ui/update_page.dart' deferred as update_page; import 'package:myecl/paiement/router.dart'; import 'package:myecl/phonebook/router.dart'; import 'package:myecl/ph/router.dart'; @@ -24,8 +24,9 @@ import 'package:myecl/recommendation/router.dart'; import 'package:myecl/seed-library/router.dart'; import 'package:myecl/settings/router.dart'; import 'package:myecl/raffle/router.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/root_middleware.dart'; import 'package:myecl/vote/router.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -46,6 +47,7 @@ class AppRouter { path: root, builder: () => home_page.HomePage(), middleware: [ + RootMiddleware(ref), AuthenticatedMiddleware(ref), DeferredLoadingMiddleware(home_page.loadLibrary), ], diff --git a/lib/tools/middlewares/admin_middleware.dart b/lib/routing/middlewares/admin_middleware.dart similarity index 80% rename from lib/tools/middlewares/admin_middleware.dart rename to lib/routing/middlewares/admin_middleware.dart index ce8d38802..39952520d 100644 --- a/lib/tools/middlewares/admin_middleware.dart +++ b/lib/routing/middlewares/admin_middleware.dart @@ -10,6 +10,7 @@ class AdminMiddleware extends QMiddleware { @override Future redirectGuard(String path) async { - return ref.watch(isAdminProvider) ? null : AppRouter.root; + final isAdmin = ref.read(isAdminProvider); + return isAdmin ? null : AppRouter.root; } } diff --git a/lib/routing/middlewares/authenticated_middleware.dart b/lib/routing/middlewares/authenticated_middleware.dart new file mode 100644 index 000000000..74bbf7e03 --- /dev/null +++ b/lib/routing/middlewares/authenticated_middleware.dart @@ -0,0 +1,19 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:myecl/routing/providers/auth_redirect_service_provider.dart'; +import 'package:qlevar_router/qlevar_router.dart'; + +class AuthenticatedMiddleware extends QMiddleware { + final Ref ref; + + AuthenticatedMiddleware(this.ref); + + @override + Future redirectGuard(String path) async { + final redirectPath = ref.read( + authRedirectServiceProvider.select( + (service) => service.getRedirect(path), + ), + ); + return redirectPath; + } +} diff --git a/lib/tools/middlewares/deferred_middleware.dart b/lib/routing/middlewares/deferred_middleware.dart similarity index 100% rename from lib/tools/middlewares/deferred_middleware.dart rename to lib/routing/middlewares/deferred_middleware.dart diff --git a/lib/tools/middlewares/notification_middleware.dart b/lib/routing/middlewares/notification_middleware.dart similarity index 100% rename from lib/tools/middlewares/notification_middleware.dart rename to lib/routing/middlewares/notification_middleware.dart diff --git a/lib/routing/middlewares/root_middleware.dart b/lib/routing/middlewares/root_middleware.dart new file mode 100644 index 000000000..c6837d028 --- /dev/null +++ b/lib/routing/middlewares/root_middleware.dart @@ -0,0 +1,21 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:myecl/router.dart'; +import 'package:myecl/settings/providers/module_list_provider.dart'; +import 'package:qlevar_router/qlevar_router.dart'; + +class RootMiddleware extends QMiddleware { + final Ref ref; + + RootMiddleware(this.ref) : super(priority: 1000); + + @override + Future canPop() { + return Future.value(false); + } + + @override + Future redirectGuard(String path) async { + final modules = ref.watch(modulesProvider); + return modules.isNotEmpty ? modules.first.root : AppRouter.noModule; + } +} diff --git a/lib/routing/providers/auth_redirect_service_provider.dart b/lib/routing/providers/auth_redirect_service_provider.dart new file mode 100644 index 000000000..533eb8947 --- /dev/null +++ b/lib/routing/providers/auth_redirect_service_provider.dart @@ -0,0 +1,136 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:myecl/auth/providers/openid_provider.dart'; +import 'package:myecl/login/router.dart'; +import 'package:myecl/routing/providers/has_minimal_version_provider.dart'; +import 'package:myecl/routing/providers/is_app_loading_provider.dart'; +import 'package:myecl/router.dart'; +import 'package:myecl/version/class/version.dart'; +import 'package:myecl/version/providers/version_verifier_provider.dart'; +import 'package:qlevar_router/qlevar_router.dart'; + +const String forwardedFromKey = 'forwardedFrom'; + +final authRedirectServiceProvider = Provider((ref) { + final versionVerifier = ref.watch(versionVerifierProvider); + final isLoggedIn = ref.watch(isLoggedInProvider); + final isAppLoading = ref.watch(isAppLoadingProvider); + final hasMinimalVersion = ref.watch(hasMinimalVersionProvider); + final forwardedFrom = QR.params[forwardedFromKey]?.toString(); + + return AuthRedirectService( + ref, + versionVerifier: versionVerifier, + isLoggedIn: isLoggedIn, + isAppLoading: isAppLoading, + hasMinimalVersion: hasMinimalVersion, + forwardedFrom: forwardedFrom, + ); +}); + +class AuthRedirectService { + final Ref ref; + final AsyncValue versionVerifier; + final bool isLoggedIn; + final bool isAppLoading; + final bool hasMinimalVersion; + final String? forwardedFrom; + + AuthRedirectService( + this.ref, { + required this.versionVerifier, + required this.isLoggedIn, + required this.isAppLoading, + required this.hasMinimalVersion, + required this.forwardedFrom, + }); + + /// Extracts the path from a given URI (without query parameters). + /// Useful for consistent path comparisons. + String segments(String path) { + return Uri.parse(path).path; + } + + /// Determines if the current path needs redirection based on the app state. + String? getRedirect(String currentPath) { + // Redirect to the loading page if the app is still initializing + if (isAppLoading) { + if (segments(currentPath) != AppRouter.loading) { + return forward(AppRouter.loading, currentPath); + } + return null; + } + + // Redirect if there's a network error + // We can find a better way to handle this in the future + if (versionVerifier.hasError) { + return forward(AppRouter.noInternet, currentPath); + } + + // Redirect if the app version is too old + if (!hasMinimalVersion) { + return AppRouter.update; + } + + // Redirect to login if not authenticated + if (!isLoggedIn) { + return forward(LoginRouter.root, currentPath); + } + + // If redirected before, consume the redirection target + return consume(currentPath); + } + + /// Returns a URL that redirects to [targetPath], keeping track of the original [fromPath]. + String? forward(String targetPath, String fromPath) { + if (segments(targetPath) == segments(fromPath)) { + return null; + } + + final originUri = Uri.parse(fromPath); + final targetUri = Uri.parse(targetPath); + final originForwardedFrom = originUri.queryParameters[forwardedFromKey]; + + if (originForwardedFrom != null) { + // Preserve any existing redirection path + return targetUri + .replace( + queryParameters: { + ...targetUri.queryParameters, + forwardedFromKey: segments(originForwardedFrom), + }, + ) + .toString(); + } + + // Otherwise, forward the current path as the origin + return targetUri + .replace( + queryParameters: { + ...targetUri.queryParameters, + forwardedFromKey: segments(fromPath), + }, + ) + .toString(); + } + + /// If the current path has a redirection parameter, extract and return it. + /// Clears query parameters to avoid repeated redirects. + String? consume(String currentPath) { + final currentUri = Uri.parse(currentPath); + // The query parameters are immutable, so we create a mutable copy + final oldQueryParams = Map.from(currentUri.queryParameters); + + final newPath = oldQueryParams[forwardedFromKey]; + + if (newPath == null || newPath.isEmpty) { + return null; + } + + // Remove the redirection parameter to prevent repeated redirects + oldQueryParams.remove(forwardedFromKey); + + return Uri.parse( + newPath, + ).replace(queryParameters: oldQueryParams).toString(); + } +} diff --git a/lib/routing/providers/has_minimal_version_provider.dart b/lib/routing/providers/has_minimal_version_provider.dart new file mode 100644 index 000000000..aff17558d --- /dev/null +++ b/lib/routing/providers/has_minimal_version_provider.dart @@ -0,0 +1,18 @@ +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:myecl/version/providers/titan_version_provider.dart'; +import 'package:myecl/version/providers/version_verifier_provider.dart'; + +final hasMinimalVersionProvider = Provider((ref) { + final versionVerifier = ref.watch(versionVerifierProvider); + final titanVersion = ref.watch(titanVersionProvider); + return versionVerifier.maybeWhen( + data: (verifier) { + return titanVersion >= verifier.minimalTitanVersion; + }, + // If the version verifier is still loading, we assume the app has the minimal version + // the idea is that we don't want to have false negatives and block the user + orElse: () { + return true; + }, + ); +}); diff --git a/lib/routing/providers/is_app_loading_provider.dart b/lib/routing/providers/is_app_loading_provider.dart new file mode 100644 index 000000000..d4b597db4 --- /dev/null +++ b/lib/routing/providers/is_app_loading_provider.dart @@ -0,0 +1,22 @@ +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:myecl/admin/providers/module_root_list_provider.dart'; +import 'package:myecl/auth/providers/openid_provider.dart'; +import 'package:myecl/user/providers/user_provider.dart'; +import 'package:myecl/version/providers/version_verifier_provider.dart'; + +final isAppLoadingProvider = StateProvider((ref) { + final versionVerifierLoading = ref.watch( + versionVerifierProvider.select((value) => value.isLoading), + ); + final isAuthLoading = ref.watch(isAuthLoadingProvider); + final isLoggedIn = ref.watch(isLoggedInProvider); + final asyncUserLoading = ref.watch( + asyncUserProvider.select((value) => value.isLoading), + ); + final moduleRootListLoading = ref.watch( + moduleRootListProvider.select((value) => value.isLoading), + ); + return versionVerifierLoading || + isAuthLoading || + (isLoggedIn && (asyncUserLoading || moduleRootListLoading)); +}); diff --git a/lib/others/tools/constants.dart b/lib/routing/tools/constants.dart similarity index 100% rename from lib/others/tools/constants.dart rename to lib/routing/tools/constants.dart diff --git a/lib/routing/ui/loading_page.dart b/lib/routing/ui/loading_page.dart new file mode 100644 index 000000000..b05edb374 --- /dev/null +++ b/lib/routing/ui/loading_page.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:myecl/router.dart'; +import 'package:myecl/routing/providers/auth_redirect_service_provider.dart'; +import 'package:myecl/tools/ui/widgets/loader.dart'; +import 'package:qlevar_router/qlevar_router.dart'; + +class LoadingPage extends ConsumerWidget { + const LoadingPage({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final redirectPath = ref.watch( + authRedirectServiceProvider.select( + (service) => service.getRedirect(QR.currentPath), + ), + ); + + if (redirectPath != null && + Uri.parse(redirectPath).path != AppRouter.loading) { + Future.microtask(() { + QR.to(redirectPath); + }); + } + + return const Scaffold(body: Loader()); + } +} diff --git a/lib/others/ui/no_internet_page.dart b/lib/routing/ui/no_internet_page.dart similarity index 92% rename from lib/others/ui/no_internet_page.dart rename to lib/routing/ui/no_internet_page.dart index 6d60b5eff..35f71da0f 100644 --- a/lib/others/ui/no_internet_page.dart +++ b/lib/routing/ui/no_internet_page.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/is_connected_provider.dart'; +import 'package:myecl/auth/providers/connection_status_provider.dart'; import 'package:myecl/home/router.dart'; -import 'package:myecl/others/tools/constants.dart'; +import 'package:myecl/routing/tools/constants.dart'; import 'package:myecl/tools/constants.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -12,8 +12,8 @@ class NoInternetPage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final isConnected = ref.watch(isConnectedProvider); - final isConnectedNotifier = ref.watch(isConnectedProvider.notifier); + final isConnected = ref.watch(connectionStatusProvider); + final isConnectedNotifier = ref.watch(connectionStatusProvider.notifier); return Scaffold( body: Container( padding: const EdgeInsets.all(30), diff --git a/lib/others/ui/no_module.dart b/lib/routing/ui/no_module.dart similarity index 76% rename from lib/others/ui/no_module.dart rename to lib/routing/ui/no_module.dart index c19529560..c2a8b6d88 100644 --- a/lib/others/ui/no_module.dart +++ b/lib/routing/ui/no_module.dart @@ -2,8 +2,9 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/admin/providers/module_root_list_provider.dart'; -import 'package:myecl/others/tools/constants.dart'; -import 'package:myecl/tools/providers/path_forwarding_provider.dart'; +import 'package:myecl/routing/tools/constants.dart'; +import 'package:myecl/router.dart'; +import 'package:myecl/routing/providers/auth_redirect_service_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; class NoModulePage extends HookConsumerWidget { @@ -12,10 +13,15 @@ class NoModulePage extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final moduleVisibilityList = ref.watch(moduleRootListProvider); - final pathForwarding = ref.read(pathForwardingProvider); + final redirectPath = ref.watch( + authRedirectServiceProvider.select( + (service) => service.getRedirect(QR.currentPath), + ), + ); + moduleVisibilityList.maybeWhen( data: (data) { - QR.to(pathForwarding.path); + QR.to(redirectPath ?? AppRouter.root); }, orElse: () {}, ); diff --git a/lib/others/ui/update_page.dart b/lib/routing/ui/update_page.dart similarity index 96% rename from lib/others/ui/update_page.dart rename to lib/routing/ui/update_page.dart index 3d3020105..6acdbae78 100644 --- a/lib/others/ui/update_page.dart +++ b/lib/routing/ui/update_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/others/tools/constants.dart'; +import 'package:myecl/routing/tools/constants.dart'; import 'package:myecl/version/providers/titan_version_provider.dart'; class UpdatePage extends HookConsumerWidget { diff --git a/lib/seed-library/providers/information_provider.dart b/lib/seed-library/providers/information_provider.dart index 067e782b4..f32f207ce 100644 --- a/lib/seed-library/providers/information_provider.dart +++ b/lib/seed-library/providers/information_provider.dart @@ -2,7 +2,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/seed-library/class/information.dart'; import 'package:myecl/seed-library/repositories/information_repository.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class InformationNotifier extends SingleNotifier { final InformationRepository informationRepository; @@ -19,13 +18,11 @@ class InformationNotifier extends SingleNotifier { final informationProvider = StateNotifierProvider>((ref) { - final informationRepository = ref.watch(informationRepositoryProvider); + final informationRepository = InformationRepository(ref); InformationNotifier informationNotifier = InformationNotifier( informationRepository: informationRepository, ); - tokenExpireWrapperAuth(ref, () async { - informationNotifier.loadInformation(); - }); + informationNotifier.loadInformation(); return informationNotifier; }); diff --git a/lib/seed-library/providers/plant_complete_provider.dart b/lib/seed-library/providers/plant_complete_provider.dart index e465e3e41..8c5fe8907 100644 --- a/lib/seed-library/providers/plant_complete_provider.dart +++ b/lib/seed-library/providers/plant_complete_provider.dart @@ -27,6 +27,6 @@ class PlantNotifier extends SingleNotifier { final plantProvider = StateNotifierProvider>((ref) { - final plantRepository = ref.watch(plantsRepositoryProvider); + final plantRepository = PlantsRepository(ref); return PlantNotifier(plantsRepository: plantRepository); }); diff --git a/lib/seed-library/providers/plants_list_provider.dart b/lib/seed-library/providers/plants_list_provider.dart index e83a4f70b..cfd8a845d 100644 --- a/lib/seed-library/providers/plants_list_provider.dart +++ b/lib/seed-library/providers/plants_list_provider.dart @@ -3,7 +3,6 @@ import 'package:myecl/seed-library/class/plant_creation.dart'; import 'package:myecl/seed-library/class/plant_simple.dart'; import 'package:myecl/seed-library/repositories/plants_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class PlantListNotifier extends ListNotifier { final PlantsRepository plantsRepository; @@ -62,13 +61,11 @@ final plantListProvider = StateNotifierProvider>>(( ref, ) { - final plantRepository = ref.watch(plantsRepositoryProvider); + final plantRepository = PlantsRepository(ref); PlantListNotifier provider = PlantListNotifier( plantsRepository: plantRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadPlants(); - }); + provider.loadPlants(); return provider; }); @@ -81,13 +78,11 @@ final myPlantListProvider = StateNotifierProvider>>(( ref, ) { - final plantRepository = ref.watch(plantsRepositoryProvider); + final plantRepository = PlantsRepository(ref); PlantListNotifier provider = PlantListNotifier( plantsRepository: plantRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadMyPlants(); - }); + provider.loadMyPlants(); return provider; }); diff --git a/lib/seed-library/providers/species_list_provider.dart b/lib/seed-library/providers/species_list_provider.dart index 9d3454a58..9df2d2898 100644 --- a/lib/seed-library/providers/species_list_provider.dart +++ b/lib/seed-library/providers/species_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/seed-library/class/species.dart'; import 'package:myecl/seed-library/repositories/species_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class SpeciesListNotifier extends ListNotifier { final SpeciesRepository speciesRepository; @@ -41,13 +40,11 @@ final speciesListProvider = StateNotifierProvider>>(( ref, ) { - final speciesRepository = ref.watch(speciesRepositoryProvider); + final speciesRepository = SpeciesRepository(ref); SpeciesListNotifier provider = SpeciesListNotifier( speciesRepository: speciesRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadSpecies(); - }); + provider.loadSpecies(); return provider; }); diff --git a/lib/seed-library/providers/species_type_list_provider.dart b/lib/seed-library/providers/species_type_list_provider.dart index f17a425f0..9cfe0ff34 100644 --- a/lib/seed-library/providers/species_type_list_provider.dart +++ b/lib/seed-library/providers/species_type_list_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/seed-library/class/species_type.dart'; import 'package:myecl/seed-library/repositories/species_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class SpeciesListNotifier extends ListNotifier { final SpeciesRepository speciesRepository; @@ -18,13 +17,11 @@ final speciesTypeListProvider = StateNotifierProvider>>(( ref, ) { - final speciesRepository = ref.watch(speciesRepositoryProvider); + final speciesRepository = SpeciesRepository(ref); SpeciesListNotifier provider = SpeciesListNotifier( speciesRepository: speciesRepository, ); - tokenExpireWrapperAuth(ref, () async { - await provider.loadSpeciesTypes(); - }); + provider.loadSpeciesTypes(); return provider; }); diff --git a/lib/seed-library/repositories/information_repository.dart b/lib/seed-library/repositories/information_repository.dart index 7fca8799d..9bdbb311d 100644 --- a/lib/seed-library/repositories/information_repository.dart +++ b/lib/seed-library/repositories/information_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/seed-library/class/information.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -8,6 +6,8 @@ class InformationRepository extends Repository { // ignore: overridden_fields final ext = "seed_library/information"; + InformationRepository(super.ref); + Future getInformation() async { return Information.fromJson(await getOne("")); } @@ -16,8 +16,3 @@ class InformationRepository extends Repository { return await update(information.toJson(), ""); } } - -final informationRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return InformationRepository()..setToken(token); -}); diff --git a/lib/seed-library/repositories/plants_repository.dart b/lib/seed-library/repositories/plants_repository.dart index 7fd1e58be..6e9c4464d 100644 --- a/lib/seed-library/repositories/plants_repository.dart +++ b/lib/seed-library/repositories/plants_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/seed-library/class/plant_complete.dart'; import 'package:myecl/seed-library/class/plant_creation.dart'; import 'package:myecl/seed-library/class/plant_simple.dart'; @@ -10,6 +8,8 @@ class PlantsRepository extends Repository { // ignore: overridden_fields final ext = "seed_library/plants/"; + PlantsRepository(super.ref); + Future> getPlantSimplelist() async { return List.from( (await getList(suffix: "waiting")).map((x) => PlantSimple.fromJson(x)), @@ -54,8 +54,3 @@ class PlantsRepository extends Repository { return PlantSimple.fromJson(await create(plants.toJson())); } } - -final plantsRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return PlantsRepository()..setToken(token); -}); diff --git a/lib/seed-library/repositories/species_repository.dart b/lib/seed-library/repositories/species_repository.dart index 7cfd5f41e..0e5dab5b9 100644 --- a/lib/seed-library/repositories/species_repository.dart +++ b/lib/seed-library/repositories/species_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/seed-library/class/species.dart'; import 'package:myecl/seed-library/class/species_type.dart'; import 'package:myecl/tools/repository/repository.dart'; @@ -9,6 +7,8 @@ class SpeciesRepository extends Repository { // ignore: overridden_fields final ext = "seed_library/species/"; + SpeciesRepository(super.ref); + Future> getSpeciesList() async { return List.from( (await getList()).map((x) => Species.fromJson(x)), @@ -39,8 +39,3 @@ class SpeciesRepository extends Repository { return Species.fromJson(await create(species.toJson())); } } - -final speciesRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return SpeciesRepository()..setToken(token); -}); diff --git a/lib/seed-library/router.dart b/lib/seed-library/router.dart index bb1710cd6..458a84a76 100644 --- a/lib/seed-library/router.dart +++ b/lib/seed-library/router.dart @@ -23,9 +23,9 @@ import 'package:myecl/seed-library/ui/pages/species_page/species_page.dart' deferred as species_page; import 'package:myecl/seed-library/ui/pages/stock_page/stocks_page.dart' deferred as stocks_page; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class SeedLibraryRouter { diff --git a/lib/seed-library/ui/pages/add_edit_species_page/add_edit_species_page.dart b/lib/seed-library/ui/pages/add_edit_species_page/add_edit_species_page.dart index 04259e345..e2fc4277d 100644 --- a/lib/seed-library/ui/pages/add_edit_species_page/add_edit_species_page.dart +++ b/lib/seed-library/ui/pages/add_edit_species_page/add_edit_species_page.dart @@ -11,7 +11,6 @@ import 'package:myecl/seed-library/ui/components/types_bar.dart'; import 'package:myecl/seed-library/ui/seed_library.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; @@ -229,58 +228,7 @@ class AddEditSpeciesPage extends HookConsumerWidget { return; } if (isEdit) { - await tokenExpireWrapper(ref, () async { - final value = await speciesListNotifier - .updateSpecies( - species.copyWith( - name: name.text, - prefix: prefix.text, - type: type, - difficulty: difficulty, - card: card.text, - nbSeedsRecommended: int.tryParse( - nbSeedsRecommended.text, - ), - startSeason: startMonth.isNotEmpty - ? DateTime( - 2021, - SeedLibraryTextConstants.months - .indexOf(startMonth) + - 1, - 1, - ) - : null, - endSeason: endMonth.isNotEmpty - ? DateTime( - 2021, - SeedLibraryTextConstants.months - .indexOf(endMonth) + - 1, - 1, - ) - : null, - timeMaturation: int.tryParse( - maturationTime.text, - ), - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - SeedLibraryTextConstants.updatedSpecies, - ); - QR.back(); - } else { - displayToastWithContext( - TypeMsg.error, - SeedLibraryTextConstants.updatingError, - ); - } - }); - return; - } - await tokenExpireWrapper(ref, () async { - final value = await speciesListNotifier.createSpecies( + final value = await speciesListNotifier.updateSpecies( species.copyWith( name: name.text, prefix: prefix.text, @@ -316,16 +264,62 @@ class AddEditSpeciesPage extends HookConsumerWidget { if (value) { displayToastWithContext( TypeMsg.msg, - SeedLibraryTextConstants.addedSpecies, + SeedLibraryTextConstants.updatedSpecies, ); QR.back(); } else { displayToastWithContext( TypeMsg.error, - SeedLibraryTextConstants.addingError, + SeedLibraryTextConstants.updatingError, ); } - }); + return; + } + final value = await speciesListNotifier.createSpecies( + species.copyWith( + name: name.text, + prefix: prefix.text, + type: type, + difficulty: difficulty, + card: card.text, + nbSeedsRecommended: int.tryParse( + nbSeedsRecommended.text, + ), + startSeason: startMonth.isNotEmpty + ? DateTime( + 2021, + SeedLibraryTextConstants.months.indexOf( + startMonth, + ) + + 1, + 1, + ) + : null, + endSeason: endMonth.isNotEmpty + ? DateTime( + 2021, + SeedLibraryTextConstants.months.indexOf( + endMonth, + ) + + 1, + 1, + ) + : null, + timeMaturation: int.tryParse(maturationTime.text), + ), + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + SeedLibraryTextConstants.addedSpecies, + ); + QR.back(); + } else { + displayToastWithContext( + TypeMsg.error, + SeedLibraryTextConstants.addingError, + ); + } }, child: Text( isEdit diff --git a/lib/seed-library/ui/pages/edit_presentation_page/edit_information_page.dart b/lib/seed-library/ui/pages/edit_presentation_page/edit_information_page.dart index d7b50e035..16373db5e 100644 --- a/lib/seed-library/ui/pages/edit_presentation_page/edit_information_page.dart +++ b/lib/seed-library/ui/pages/edit_presentation_page/edit_information_page.dart @@ -5,7 +5,6 @@ import 'package:myecl/seed-library/tools/constants.dart'; import 'package:myecl/seed-library/ui/seed_library.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; @@ -99,29 +98,27 @@ class EditInformationPage extends HookConsumerWidget { ); return; } - await tokenExpireWrapper(ref, () async { - final value = await informationNotifier - .updateInformation( - syncInformation.copyWith( - description: description.text, - contact: contact.text, - facebookUrl: facebookUrl.text, - forumUrl: forumUrl.text, - ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - SeedLibraryTextConstants.updatedInformation, + final value = await informationNotifier + .updateInformation( + syncInformation.copyWith( + description: description.text, + contact: contact.text, + facebookUrl: facebookUrl.text, + forumUrl: forumUrl.text, + ), ); - } else { - displayToastWithContext( - TypeMsg.error, - SeedLibraryTextConstants.updatingError, - ); - } - QR.back(); - }); + if (value) { + displayToastWithContext( + TypeMsg.msg, + SeedLibraryTextConstants.updatedInformation, + ); + } else { + displayToastWithContext( + TypeMsg.error, + SeedLibraryTextConstants.updatingError, + ); + } + QR.back(); }, child: Text( SeedLibraryTextConstants.update, diff --git a/lib/seed-library/ui/pages/plant_deposit_page/plant_deposit_page.dart b/lib/seed-library/ui/pages/plant_deposit_page/plant_deposit_page.dart index 5838f6bf4..63e530a6b 100644 --- a/lib/seed-library/ui/pages/plant_deposit_page/plant_deposit_page.dart +++ b/lib/seed-library/ui/pages/plant_deposit_page/plant_deposit_page.dart @@ -19,7 +19,6 @@ import 'package:myecl/seed-library/ui/pages/plant_deposit_page/small_species_car import 'package:myecl/seed-library/ui/seed_library.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; @@ -221,69 +220,64 @@ class PlantDepositPage extends HookConsumerWidget { return; } - await tokenExpireWrapper(ref, () async { - final value = await plantListNotifier - .createPlant( - PlantCreation( - ancestorId: selectedAncestor.id == '' - ? null - : selectedAncestor.id, - speciesId: selectedAncestor.id == '' - ? selectedSpecies.id - : selectedAncestor.speciesId, - propagationMethod: propagationMethod, - nbSeedsEnvelope: - propagationMethod == - PropagationMethod.graine - ? int.parse(seedQuantity.text) - : 1, - previousNote: notes.text, + final value = await plantListNotifier.createPlant( + PlantCreation( + ancestorId: selectedAncestor.id == '' + ? null + : selectedAncestor.id, + speciesId: selectedAncestor.id == '' + ? selectedSpecies.id + : selectedAncestor.speciesId, + propagationMethod: propagationMethod, + nbSeedsEnvelope: + propagationMethod == + PropagationMethod.graine + ? int.parse(seedQuantity.text) + : 1, + previousNote: notes.text, + ), + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + SeedLibraryTextConstants.addedPlant, + ); + showDialog( + context: context.mounted ? context : context, + builder: (context) { + return AlertDialog( + title: Text( + SeedLibraryTextConstants + .writeReference + + plantList.last.plantReference, ), - ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - SeedLibraryTextConstants.addedPlant, - ); - showDialog( - context: context.mounted - ? context - : context, - builder: (context) { - return AlertDialog( - title: Text( - SeedLibraryTextConstants - .writeReference + - plantList.last.plantReference, - ), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text( - SeedLibraryTextConstants.ok, - ), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text( + SeedLibraryTextConstants.ok, ), - ], - ); - }, - ); - } else { - displayToastWithContext( - TypeMsg.error, - SeedLibraryTextConstants.addingError, - ); - } - selectedSpeciesNotifier.setSpecies( - Species.empty(), + ), + ], + ); + }, ); - selectedAncestorNotifier.setPlant( - PlantSimple.empty(), + } else { + displayToastWithContext( + TypeMsg.error, + SeedLibraryTextConstants.addingError, ); - seedQuantity.clear(); - notes.clear(); - }); + } + selectedSpeciesNotifier.setSpecies( + Species.empty(), + ); + selectedAncestorNotifier.setPlant( + PlantSimple.empty(), + ); + seedQuantity.clear(); + notes.clear(); }, child: const Text( SeedLibraryTextConstants.add, diff --git a/lib/seed-library/ui/pages/plant_detail_page/plant_detail_page.dart b/lib/seed-library/ui/pages/plant_detail_page/plant_detail_page.dart index 825d6eb99..ea93febfb 100644 --- a/lib/seed-library/ui/pages/plant_detail_page/plant_detail_page.dart +++ b/lib/seed-library/ui/pages/plant_detail_page/plant_detail_page.dart @@ -8,7 +8,6 @@ import 'package:myecl/seed-library/tools/functions.dart'; import 'package:myecl/seed-library/tools/functions.dart' as function; import 'package:myecl/seed-library/ui/seed_library.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; @@ -155,27 +154,25 @@ class PlantDetailPage extends HookConsumerWidget { child: child, ), onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await plantNotifier.borrowIdPlant( - plantComplete, + final value = await plantNotifier.borrowIdPlant( + plantComplete, + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + SeedLibraryTextConstants.borrowedPlant, ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - SeedLibraryTextConstants.borrowedPlant, - ); - } else { - displayToastWithContext( - TypeMsg.error, - SeedLibraryTextConstants.addingError, - ); - } - plantsNotifier.deletePlantFromList(plantComplete.id); - myPlantsNotifier.addPlantToList( - plantComplete.toPlantSimple(), + } else { + displayToastWithContext( + TypeMsg.error, + SeedLibraryTextConstants.addingError, ); - QR.back(); - }); + } + plantsNotifier.deletePlantFromList(plantComplete.id); + myPlantsNotifier.addPlantToList( + plantComplete.toPlantSimple(), + ); + QR.back(); }, child: const Text( SeedLibraryTextConstants.borrowPlant, diff --git a/lib/seed-library/ui/seed_library.dart b/lib/seed-library/ui/seed_library.dart index 81f9dff3e..51013e4a7 100644 --- a/lib/seed-library/ui/seed_library.dart +++ b/lib/seed-library/ui/seed_library.dart @@ -17,7 +17,7 @@ class SeedLibraryTemplate extends StatelessWidget { TopBar( title: SeedLibraryTextConstants.seedLibrary, root: SeedLibraryRouter.root, - rightIcon: QR.currentPath == SeedLibraryRouter.root + rightIcon: Uri.parse(QR.currentPath).path == SeedLibraryRouter.root ? IconButton( onPressed: () { QR.to( diff --git a/lib/service/providers/messages_provider.dart b/lib/service/providers/messages_provider.dart index 8b0ecb34f..27511456d 100644 --- a/lib/service/providers/messages_provider.dart +++ b/lib/service/providers/messages_provider.dart @@ -1,18 +1,14 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/service/class/message.dart'; import 'package:myecl/service/providers/firebase_token_provider.dart'; import 'package:myecl/service/repositories/notification_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; class MessagesProvider extends ListNotifier { - final NotificationRepository notificationRepository = - NotificationRepository(); + final NotificationRepository notificationRepository; String firebaseToken = ""; - MessagesProvider({required String token}) - : super(const AsyncValue.loading()) { - notificationRepository.setToken(token); - } + MessagesProvider(this.notificationRepository) + : super(const AsyncValue.loading()); void setFirebaseToken(String token) { firebaseToken = token; @@ -35,9 +31,9 @@ class MessagesProvider extends ListNotifier { final messagesProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); final firebaseToken = ref.watch(firebaseTokenProvider); - MessagesProvider notifier = MessagesProvider(token: token); + final notificationRepository = NotificationRepository(ref); + MessagesProvider notifier = MessagesProvider(notificationRepository); firebaseToken.then((value) => notifier.setFirebaseToken(value)); return notifier; }); diff --git a/lib/service/providers/topic_provider.dart b/lib/service/providers/topic_provider.dart index 8b65f4f6b..2ba73692b 100644 --- a/lib/service/providers/topic_provider.dart +++ b/lib/service/providers/topic_provider.dart @@ -1,16 +1,12 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/service/class/topic.dart'; import 'package:myecl/service/repositories/notification_repository.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class TopicsProvider extends ListNotifier { - final NotificationRepository notificationRepository = - NotificationRepository(); - TopicsProvider({required String token}) : super(const AsyncValue.loading()) { - notificationRepository.setToken(token); - } + final NotificationRepository notificationRepository; + TopicsProvider({required this.notificationRepository}) + : super(const AsyncValue.loading()); Future>> getTopics() async { return await loadList(notificationRepository.getTopics); @@ -82,10 +78,10 @@ class TopicsProvider extends ListNotifier { final topicsProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - TopicsProvider notifier = TopicsProvider(token: token); - tokenExpireWrapperAuth(ref, () async { - notifier.getTopics(); - }); + final notificationRepository = NotificationRepository(ref); + TopicsProvider notifier = TopicsProvider( + notificationRepository: notificationRepository, + ); + notifier.getTopics(); return notifier; }); diff --git a/lib/service/repositories/notification_repository.dart b/lib/service/repositories/notification_repository.dart index db30e12b9..7e45cca96 100644 --- a/lib/service/repositories/notification_repository.dart +++ b/lib/service/repositories/notification_repository.dart @@ -9,6 +9,8 @@ class NotificationRepository extends Repository { // ignore: overridden_fields final ext = 'notification/'; + NotificationRepository(super.ref); + Future> getMessages(String firebaseToken) async { final messages = List.from( (await getList( diff --git a/lib/settings/router.dart b/lib/settings/router.dart index ad7fb7a4c..7de17c786 100644 --- a/lib/settings/router.dart +++ b/lib/settings/router.dart @@ -12,8 +12,8 @@ import 'package:myecl/settings/ui/pages/modules_page/modules_page.dart' deferred as modules_page; import 'package:myecl/settings/ui/pages/notification_page/notification_page.dart' deferred as notification_page; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:qlevar_router/qlevar_router.dart'; class SettingsRouter { diff --git a/lib/settings/ui/pages/change_pass/change_pass.dart b/lib/settings/ui/pages/change_pass/change_pass.dart index f49fdb329..408aca36e 100644 --- a/lib/settings/ui/pages/change_pass/change_pass.dart +++ b/lib/settings/ui/pages/change_pass/change_pass.dart @@ -10,7 +10,6 @@ import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/user/providers/user_provider.dart'; import 'package:qlevar_router/qlevar_router.dart'; @@ -124,25 +123,23 @@ class ChangePassPage extends HookConsumerWidget { builder: (context) => CustomDialogBox( descriptions: SettingsTextConstants.changingPassword, onYes: () async { - await tokenExpireWrapper(ref, () async { - final value = await userNotifier.changePassword( - oldPassword.text, - newPassword.text, - user, + final value = await userNotifier.changePassword( + oldPassword.text, + newPassword.text, + user, + ); + if (value) { + QR.back(); + displayToastWithContext( + TypeMsg.msg, + SettingsTextConstants.passwordChanged, ); - if (value) { - QR.back(); - displayToastWithContext( - TypeMsg.msg, - SettingsTextConstants.passwordChanged, - ); - } else { - displayToastWithContext( - TypeMsg.error, - SettingsTextConstants.updatingError, - ); - } - }); + } else { + displayToastWithContext( + TypeMsg.error, + SettingsTextConstants.updatingError, + ); + } }, title: SettingsTextConstants.edit, ), diff --git a/lib/settings/ui/pages/edit_user_page/edit_user_page.dart b/lib/settings/ui/pages/edit_user_page/edit_user_page.dart index def059308..a00c0e7a0 100644 --- a/lib/settings/ui/pages/edit_user_page/edit_user_page.dart +++ b/lib/settings/ui/pages/edit_user_page/edit_user_page.dart @@ -15,7 +15,6 @@ import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/tools/ui/widgets/text_entry.dart'; import 'package:myecl/user/class/floors.dart'; @@ -351,38 +350,36 @@ class EditUserPage extends HookConsumerWidget { child: child, ), onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await asyncUserNotifier.updateMe( - user.copyWith( - birthday: dateController.value.text.isNotEmpty - ? DateTime.parse( - processDateBack(dateController.value.text), - ) - : null, - nickname: nickNameController.value.text.isEmpty - ? null - : nickNameController.value.text, - phone: phoneController.value.text.isEmpty - ? null - : phoneController.value.text, - floor: floorController.value.text, - ), + final value = await asyncUserNotifier.updateMe( + user.copyWith( + birthday: dateController.value.text.isNotEmpty + ? DateTime.parse( + processDateBack(dateController.value.text), + ) + : null, + nickname: nickNameController.value.text.isEmpty + ? null + : nickNameController.value.text, + phone: phoneController.value.text.isEmpty + ? null + : phoneController.value.text, + floor: floorController.value.text, + ), + ); + if (value) { + displayToastWithContext( + TypeMsg.msg, + SettingsTextConstants.updatedProfile, + ); + QR.removeNavigator( + SettingsRouter.root + SettingsRouter.editAccount, + ); + } else { + displayToastWithContext( + TypeMsg.error, + SettingsTextConstants.updatingError, ); - if (value) { - displayToastWithContext( - TypeMsg.msg, - SettingsTextConstants.updatedProfile, - ); - QR.removeNavigator( - SettingsRouter.root + SettingsRouter.editAccount, - ); - } else { - displayToastWithContext( - TypeMsg.error, - SettingsTextConstants.updatingError, - ); - } - }); + } }, child: const Center( child: Text( diff --git a/lib/tools/exception.dart b/lib/tools/exception.dart index e7e8c5321..ba448627a 100644 --- a/lib/tools/exception.dart +++ b/lib/tools/exception.dart @@ -1,4 +1,15 @@ -enum ErrorType { tokenExpire, notFound, invalidData, conflict } +enum ErrorType { + tokenExpire, + notFound, + invalidData, + conflict, + unexpectedResponse, + apiError, + noDefaultValue, + tokenRefreshing, + emptyToken, + tokenRefreshFailed, +} class AppException implements Exception { ErrorType type; diff --git a/lib/tools/functions.dart b/lib/tools/functions.dart index cc9f6ecbb..17c750897 100644 --- a/lib/tools/functions.dart +++ b/lib/tools/functions.dart @@ -8,6 +8,7 @@ import 'package:intl/intl.dart'; import 'package:myecl/tools/constants.dart'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:myecl/tools/plausible/plausible.dart'; +import 'package:qlevar_router/qlevar_router.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; enum TypeMsg { msg, error } @@ -513,3 +514,15 @@ String getTitanPackageName() { String getTitanLogo() { return "assets/images/logo_${getAppFlavor()}.png"; } + +void removeQueryParam(String keyToRemove) { + final params = QR.params.asMap; + params.remove(keyToRemove); + QR.params.updateParams(QParams(params: params)); +} + +void addQueryParam(String key, String value) { + final params = QR.params.asMap; + params[key] = ParamValue(value, keepAlive: true); + QR.params.updateParams(QParams(params: params)); +} diff --git a/lib/tools/middlewares/authenticated_middleware.dart b/lib/tools/middlewares/authenticated_middleware.dart deleted file mode 100644 index 4017447ea..000000000 --- a/lib/tools/middlewares/authenticated_middleware.dart +++ /dev/null @@ -1,65 +0,0 @@ -// ignore_for_file: invalid_use_of_protected_member, invalid_use_of_visible_for_testing_member - -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; -import 'package:myecl/login/router.dart'; -import 'package:myecl/router.dart'; -import 'package:myecl/settings/providers/module_list_provider.dart'; -import 'package:myecl/tools/providers/path_forwarding_provider.dart'; -import 'package:myecl/version/providers/titan_version_provider.dart'; -import 'package:myecl/version/providers/version_verifier_provider.dart'; -import 'package:qlevar_router/qlevar_router.dart'; - -class AuthenticatedMiddleware extends QMiddleware { - final Ref ref; - - AuthenticatedMiddleware(this.ref); - - @override - Future redirectGuard(String path) async { - final pathForwardingNotifier = ref.watch(pathForwardingProvider.notifier); - final versionVerifier = ref.watch(versionVerifierProvider); - final titanVersion = ref.watch(titanVersionProvider); - final isLoggedIn = ref.watch(isLoggedInProvider); - final modules = ref.read(modulesProvider); - final check = versionVerifier.whenData( - (value) => value.minimalTitanVersion <= titanVersion, - ); - if (!pathForwardingNotifier.state.isLoggedIn && - path != LoginRouter.root && - path != "/") { - pathForwardingNotifier.forward(path); - } - return check.when( - data: (value) { - if (!value) { - return AppRouter.update; - } - if (path == LoginRouter.root && - !pathForwardingNotifier.state.isLoggedIn && - !isLoggedIn) { - return null; - } - if (!isLoggedIn) { - return LoginRouter.root; - } - if (!pathForwardingNotifier.state.isLoggedIn) { - pathForwardingNotifier.login(); - } - if (pathForwardingNotifier.state.path == "/") { - if (modules.isEmpty) { - return AppRouter.noModule; - } - pathForwardingNotifier.forward(modules.first.root); - return modules.first.root; - } - if (pathForwardingNotifier.state.path != path) { - return pathForwardingNotifier.state.path; - } - return null; - }, - loading: () => AppRouter.loading, - error: (error, stack) => AppRouter.noInternet, - ); - } -} diff --git a/lib/tools/providers/asking_refresh_token_provider.dart b/lib/tools/providers/asking_refresh_token_provider.dart deleted file mode 100644 index d641593b3..000000000 --- a/lib/tools/providers/asking_refresh_token_provider.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -class AskingRefreshTokenNotifier extends StateNotifier { - AskingRefreshTokenNotifier() : super(false); - - void setAskingRefresh(bool bool) { - state = bool; - } -} - -final askingRefreshTokenProvider = - StateNotifierProvider((ref) { - return AskingRefreshTokenNotifier(); - }); diff --git a/lib/tools/providers/list_notifier.dart b/lib/tools/providers/list_notifier.dart index 6b564895d..1bb61258e 100644 --- a/lib/tools/providers/list_notifier.dart +++ b/lib/tools/providers/list_notifier.dart @@ -7,6 +7,9 @@ abstract class ListNotifier extends StateNotifier>> { Future>> loadList(Future> Function() f) async { try { final data = await f(); + if (!mounted) { + return AsyncValue.error("Component unmounted", StackTrace.current); + } state = AsyncValue.data(data); return state; } catch (e) { diff --git a/lib/tools/providers/map_provider.dart b/lib/tools/providers/map_provider.dart index d0d6d1490..7b33e9777 100644 --- a/lib/tools/providers/map_provider.dart +++ b/lib/tools/providers/map_provider.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class MapNotifier extends StateNotifier>?>> { MapNotifier() : super(>?>{}); @@ -68,12 +67,10 @@ class MapNotifier extends StateNotifier>?>> { Future Function(T t) loader, ) async { setTData(t, const AsyncLoading()); - tokenExpireWrapper(ref, () async { - loader(t).then((value) { - if (mounted) { - setTData(t, AsyncData([value])); - } - }); + loader(t).then((value) { + if (mounted) { + setTData(t, AsyncData([value])); + } }); } @@ -83,12 +80,10 @@ class MapNotifier extends StateNotifier>?>> { Future>> Function(T t) loader, ) async { setTData(t, const AsyncLoading()); - tokenExpireWrapper(ref, () async { - loader(t).then((value) { - if (mounted) { - setTData(t, value); - } - }); + loader(t).then((value) { + if (mounted) { + setTData(t, value); + } }); } } diff --git a/lib/tools/providers/single_notifier.dart b/lib/tools/providers/single_notifier.dart index 1a05e6e50..b42bfd107 100644 --- a/lib/tools/providers/single_notifier.dart +++ b/lib/tools/providers/single_notifier.dart @@ -7,6 +7,9 @@ abstract class SingleNotifier extends StateNotifier> { Future> load(Future Function() f) async { try { final data = await f(); + if (!mounted) { + return AsyncValue.error("Component unmounted", StackTrace.current); + } state = AsyncValue.data(data); return state; } catch (e) { diff --git a/lib/tools/repository/logo_repository.dart b/lib/tools/repository/logo_repository.dart index 0f1f8219d..9eb58882b 100644 --- a/lib/tools/repository/logo_repository.dart +++ b/lib/tools/repository/logo_repository.dart @@ -3,21 +3,29 @@ import 'dart:io'; import 'package:flutter/services.dart'; import 'package:http_parser/http_parser.dart'; +import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/exception.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:http/http.dart' as http; +import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:path/path.dart' show join; import 'package:path_provider/path_provider.dart'; abstract class LogoRepository extends Repository { static const String expiredTokenDetail = "Could not validate credentials"; + LogoRepository(super.ref); + Future getLogo(String id, {String suffix = ""}) async { try { - final response = await http.get( - Uri.parse("${Repository.host}$ext$id$suffix"), - headers: headers, - ); + final response = await tokenExpireWrapper(ref, () async { + final token = ref.read(tokenProvider); + setToken(token); + return http.get( + Uri.parse("${Repository.host}$ext$id$suffix"), + headers: headers, + ); + }); if (response.statusCode == 200) { try { return response.bodyBytes; @@ -71,7 +79,11 @@ abstract class LogoRepository extends Repository { contentType: MediaType('image', 'jpeg'), ), ); - final response = await request.send(); + final response = await tokenExpireWrapper(ref, () async { + final token = ref.read(tokenProvider); + setToken(token); + return await request.send(); + }); response.stream.transform(utf8.decoder).listen((value) async { if (response.statusCode == 201) { try { @@ -98,7 +110,11 @@ abstract class LogoRepository extends Repository { } Future saveLogoToTemp(String path) async { - final response = await http.get(Uri.parse(path)); + final response = await tokenExpireWrapper(ref, () async { + final token = ref.read(tokenProvider); + setToken(token); + return http.get(Uri.parse(path)); + }); if (response.statusCode == 200) { try { Directory tempDir = await getTemporaryDirectory(); diff --git a/lib/tools/repository/pdf_repository.dart b/lib/tools/repository/pdf_repository.dart index 03fefb97f..22dd218eb 100644 --- a/lib/tools/repository/pdf_repository.dart +++ b/lib/tools/repository/pdf_repository.dart @@ -13,6 +13,8 @@ import 'package:path_provider/path_provider.dart'; abstract class PdfRepository extends Repository { static const String expiredTokenDetail = "Could not validate credentials"; + PdfRepository(super.ref); + Future getPdf(String id, {String suffix = ""}) async { try { final response = await http.get( diff --git a/lib/tools/repository/repository.dart b/lib/tools/repository/repository.dart index 92b551752..a0b556f50 100644 --- a/lib/tools/repository/repository.dart +++ b/lib/tools/repository/repository.dart @@ -1,13 +1,19 @@ import 'dart:async'; import 'dart:convert'; import 'package:flutter/foundation.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:http/http.dart' as http; +import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/cache/cache_manager.dart'; import 'package:myecl/tools/exception.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/logs/logger.dart'; +import 'package:myecl/tools/token_expire_wrapper.dart'; + +enum HttpMethod { get, post, patch, delete, put } abstract class Repository { + final Ref ref; static final String host = getTitanHost(); static const String expiredTokenDetail = "Could not validate credentials"; final String ext = ""; @@ -18,240 +24,313 @@ abstract class Repository { final cacheManager = CacheManager(); static final Logger logger = Logger(); + Repository(this.ref) { + initLogger(); + } + void initLogger() { logger.init(); } + /// Sets the authorization token in the request headers. + /// This token will be used for all subsequent HTTP requests. void setToken(String token) { headers["Authorization"] = 'Bearer $token'; } - /// GET ext/suffix - Future getList({String suffix = ""}) async { + /// Handles common error parsing from HTTP responses. + /// Logs the error and throws an [AppException] based on the error detail + /// or a more general error if parsing fails. + Never _handleErrorResponse(http.Response response, String endpoint) { + logger.error( + "HTTP Error for $endpoint: ${response.statusCode} - ${response.body}", + ); try { - final response = await http.get( - Uri.parse(host + ext + suffix), - headers: headers, - ); - if (response.statusCode == 200) { - try { - String toDecode = utf8.decode(response.bodyBytes); - if (!kIsWeb) { - cacheManager.writeCache(ext + suffix, toDecode); - } - return jsonDecode(toDecode); - } catch (e) { - logger.error("GET ${ext + suffix}\nError while decoding response"); - return []; - } - } else if (response.statusCode >= 400) { - logger.error( - "GET ${ext + suffix}\n${response.statusCode} ${response.body}", - ); - try { - String toDecode = utf8.decode(response.bodyBytes); - final decoded = jsonDecode(toDecode); - if (decoded["detail"] == expiredTokenDetail) { - throw AppException(ErrorType.tokenExpire, decoded["detail"]); - } else { - throw AppException(ErrorType.notFound, decoded["detail"]); - } - } on AppException { - rethrow; - } catch (e) { - logger.error("GET ${ext + suffix}\nError while decoding response"); - - throw AppException(ErrorType.notFound, response.body); - } + final String decodedBody = utf8.decode(response.bodyBytes); + final decoded = jsonDecode(decodedBody); + if (decoded is Map && decoded["detail"] == expiredTokenDetail) { + throw AppException(ErrorType.tokenExpire, decoded["detail"]); } else { - logger.error( - "GET ${ext + suffix}\n${response.statusCode} ${response.body}", + throw AppException( + ErrorType.apiError, + decoded["detail"] ?? "Unknown API error", ); - throw AppException(ErrorType.notFound, response.body); } } on AppException { rethrow; } catch (e) { - if (kIsWeb) { - logger.error("GET ${ext + suffix}\nError while fetching response"); - return []; - } - try { - final toDecode = await cacheManager.readCache(ext + suffix); - return jsonDecode(toDecode); - } catch (e) { - logger.error( - "GET ${ext + suffix}\nError while decoding response from cache", - ); - cacheManager.deleteCache(ext + suffix); - return []; - } + logger.error("Error parsing error response for $endpoint: $e"); + throw AppException( + ErrorType.unexpectedResponse, + response.body.isEmpty + ? "Server error" + : utf8.decode(response.bodyBytes), + ); } } - /// Get ext/id/suffix - Future getOne(String id, {String suffix = ""}) async { + /// Executes an HTTP request, handles response processing, and manages caching. + /// + /// This private method centralizes the logic for making API calls, + /// including successful response parsing, error handling, and + /// caching mechanisms. + /// + /// [method]: The HTTP method to use (e.g., `HttpMethod.get`, `HttpMethod.post`). + /// [path]: The full path relative to the host (e.g., "ext/suffix"). + /// [body]: The request body, if any. This is typically used for POST, PATCH, and PUT requests. + /// [parseSuccess]: An optional callback function to parse a successful (2xx) + /// response body. If not provided, `jsonDecode` is used by default. + /// [onErrorDefault]: A required callback function that provides a default value + /// to return in case of a network error or failure to read from cache (when caching is enabled). + /// [cacheResponse]: A boolean indicating whether the successful response should be cached. + /// This is ignored on web platforms. + /// + /// Returns a `Future` which resolves to the parsed response data + /// on success, or the default value provided by `onErrorDefault` on certain errors. + /// + /// Throws an [AppException] for API-specific errors, token expiration, + /// invalid data decoding, or unexpected server responses. + Future _request({ + required HttpMethod method, + required String path, + Object? body, + T Function(String decodedBody)? parseSuccess, + required T Function() onErrorDefault, + bool cacheResponse = false, + }) async { + final uri = Uri.parse(host + path); + logger.info("${method.name.toUpperCase()} $uri"); + + parseSuccess = + parseSuccess ?? (String decodedBody) => jsonDecode(decodedBody); + try { - final response = await http.get( - Uri.parse(host + ext + id + suffix), - headers: headers, + http.Response response; + switch (method) { + case HttpMethod.get: + response = await http.get(uri, headers: headers); + break; + case HttpMethod.post: + response = await http.post(uri, headers: headers, body: body); + break; + case HttpMethod.patch: + response = await http.patch(uri, headers: headers, body: body); + break; + case HttpMethod.delete: + response = await http.delete(uri, headers: headers); + break; + case HttpMethod.put: + response = await http.put(uri, headers: headers, body: body); + break; + } + + logger.info( + "Response for ${method.name} $uri: ${response.statusCode} - ${response.body}", ); - if (response.statusCode == 200) { + + if (response.statusCode >= 200 && response.statusCode < 300) { try { - String toDecode = utf8.decode(response.bodyBytes); - if (!kIsWeb) { - cacheManager.writeCache(ext + id + suffix, toDecode); + final String decodedBody = utf8.decode(response.bodyBytes); + if (cacheResponse && !kIsWeb) { + await cacheManager.writeCache(path, decodedBody); } - return jsonDecode(toDecode); - } catch (e) { - logger.error( - "GET ${ext + id + suffix}\nError while decoding response", - ); - return {}; - } - } else if (response.statusCode >= 400) { - logger.error( - "GET ${ext + id + suffix}\n${response.statusCode} ${response.body}", - ); - try { - String toDecode = utf8.decode(response.bodyBytes); - final decoded = jsonDecode(toDecode); - if (decoded["detail"] == expiredTokenDetail) { - throw AppException(ErrorType.tokenExpire, decoded["detail"]); - } else { - throw AppException(ErrorType.notFound, decoded["detail"]); + if (decodedBody.isEmpty) { + if (response.statusCode == 204) { + // No content response, return default value + logger.info("No content for $uri, returning default value."); + if (T == bool) { + // 204 should be typed as bool + return true as T; + } else { + return onErrorDefault(); + } + } } - } on AppException { - rethrow; + return parseSuccess(decodedBody); } catch (e) { - logger.error( - "GET ${ext + id + suffix}\nError while decoding response", + logger.error("Error decoding successful response for $uri: $e"); + throw AppException( + ErrorType.invalidData, + "Failed to decode API response", ); - throw AppException(ErrorType.notFound, response.body); } + } else if (response.statusCode >= 400) { + _handleErrorResponse(response, path); // This will throw an AppException } else { + // Handle other non-2xx/4xx status codes (e.g., 3xx) logger.error( - "GET ${ext + id + suffix}\n${response.statusCode} ${response.body}", + "Unexpected HTTP Status for $uri: ${response.statusCode} - ${response.body}", + ); + throw AppException( + ErrorType.unexpectedResponse, + "Unexpected status code: ${response.statusCode}", ); - throw AppException(ErrorType.notFound, response.body); } } on AppException { - rethrow; + rethrow; // Re-throw custom exceptions directly } catch (e) { - if (kIsWeb) { - logger.error("GET ${ext + id + suffix}\nError while fetching response"); - return {}; - } - try { - final toDecode = await cacheManager.readCache(ext + id + suffix); - return jsonDecode(toDecode); - } catch (e) { - logger.error( - "GET ${ext + id + suffix}\nError while decoding response from cache", - ); - cacheManager.deleteCache(ext + suffix); - return {}; + logger.error("Network or unexpected error for $uri: $e"); + if (kIsWeb || !cacheResponse) { + // Return the default value if cache is not used or on web + return onErrorDefault(); + } else { + // On mobile/desktop, try to read from cache on network error + try { + final cachedData = await cacheManager.readCache(path); + logger.info("Successfully loaded from cache for $uri."); + return parseSuccess(cachedData); + } catch (cacheError) { + logger.error("Error reading from cache for $uri: $cacheError"); + cacheManager.deleteCache(path); // Clear potentially invalid cache + return onErrorDefault(); + } } } } - /// POST ext/suffix - Future create(dynamic t, {String suffix = ""}) async { - final response = await http.post( - Uri.parse(host + ext + suffix), - headers: headers, - body: jsonEncode(t), - ); - if (response.statusCode == 200) { - try { - String toDecode = utf8.decode(response.bodyBytes); - return jsonDecode(toDecode); - } catch (e) { - logger.error("POST ${ext + suffix}\nError while decoding response"); - throw AppException(ErrorType.invalidData, e.toString()); - } - } else if (response.statusCode == 201) { - try { - String toDecode = utf8.decode(response.bodyBytes); - return jsonDecode(toDecode); - } catch (e) { - logger.error("POST ${ext + suffix}\nError while decoding response"); - throw AppException(ErrorType.invalidData, e.toString()); - } - } else if (response.statusCode == 204) { - return true; - } else if (response.statusCode >= 400) { - logger.error( - "POST ${ext + suffix}\n${response.statusCode} ${response.body}", - ); - String toDecode = utf8.decode(response.bodyBytes); - final decoded = jsonDecode(toDecode); - if (decoded["detail"] == expiredTokenDetail) { - throw AppException(ErrorType.tokenExpire, decoded["detail"]); - } else { - throw AppException(ErrorType.notFound, decoded["detail"]); - } - } else { - logger.error( - "POST ${ext + suffix}\n${response.statusCode} ${response.body}", + Future _requestWithRefreshToken({ + required HttpMethod method, + required String path, + Object? body, + T Function(String decodedBody)? parseSuccess, + required T Function() onErrorDefault, + bool cacheResponse = false, + }) async { + return await tokenExpireWrapper(ref, () async { + ref + .read(authTokenProvider) + .whenData((token) => setToken(token.accessToken)); + return await _request( + method: method, + path: path, + body: body, + parseSuccess: parseSuccess, + onErrorDefault: onErrorDefault, + cacheResponse: cacheResponse, ); + }); + } - throw AppException(ErrorType.notFound, response.body); - } + /// Fetches a list of items from the API. + /// + /// The request is made to `ext/suffix`. + /// On network errors, it attempts to return cached data. + /// + /// [suffix]: Optional additional path segment after the base `ext`. + /// Returns a `Future` that resolves to a `List`. Defaults to an empty list + /// if no data is available from the network or cache. + Future> getList({String suffix = ""}) async { + return _requestWithRefreshToken>( + method: HttpMethod.get, + path: ext + suffix, + onErrorDefault: () => [], + cacheResponse: true, + ); + } + + /// Fetches a single item by its ID from the API. + /// + /// The request is made to `ext/id/suffix`. + /// On network errors, it attempts to return cached data. + /// + /// [id]: The identifier of the item to fetch. + /// [suffix]: Optional additional path segment after the item ID. + /// Returns a `Future` that resolves to an object of type `T`. + /// Throws an [AppException] with `ErrorType.noDefaultValue` if the item + /// is not found and no default value can be provided. + Future getOne(String id, {String suffix = ""}) async { + return _requestWithRefreshToken( + method: HttpMethod.get, + path: ext + id + suffix, + onErrorDefault: () => throw AppException( + ErrorType.noDefaultValue, + "Item with ID $id not found", + ), + cacheResponse: true, + ); } - /// PATCH ext/id/suffix + /// Fetches a single item by its ID without authentication. + /// + /// The request is made to `ext/id/suffix`. + /// This method is useful for public endpoints that do not require authentication. + /// On network errors, it attempts to return cached data. + /// + /// [id]: The identifier of the item to fetch. + /// [suffix]: Optional additional path segment after the item ID. + /// Returns a `Future` that resolves to an object of type `T`. + /// Throws an [AppException] with `ErrorType.noDefaultValue` if the item + /// is not found and no default value can be provided. + Future noAuthGetOne(String id, {String suffix = ""}) async { + return _request( + method: HttpMethod.get, + path: ext + id + suffix, + onErrorDefault: () => throw AppException( + ErrorType.noDefaultValue, + "Item with ID $id not found", + ), + cacheResponse: true, + ); + } + + /// Creates a new item by sending a POST request to the API. + /// + /// The request is made to `ext/suffix`. The provided object `t` is + /// JSON-encoded and sent as the request body. + /// + /// [t]: The object to be created. + /// [suffix]: Optional additional path segment. + /// Returns a `Future` that resolves to an object of type `T` representing + /// the created item. Throws an [AppException] on creation failure. + Future create(dynamic t, {String suffix = ""}) async { + return _requestWithRefreshToken( + method: HttpMethod.post, + path: ext + suffix, + body: jsonEncode(t), + onErrorDefault: () => + throw AppException(ErrorType.noDefaultValue, "Error creating item"), + cacheResponse: false, + ); + } + + /// Updates an existing item by sending a PATCH request to the API. + /// + /// The request is made to `ext/id/suffix`. The provided object `t` is + /// JSON-encoded and sent as the request body. + /// + /// [t]: The object with updated fields. + /// [tId]: The identifier of the item to update. + /// [suffix]: Optional additional path segment. + /// Returns a `Future` that resolves to `true` on successful update, `false` otherwise. Future update(dynamic t, String tId, {String suffix = ""}) async { - final response = await http.patch( - Uri.parse(host + ext + tId + suffix), - headers: headers, + return _requestWithRefreshToken( + method: HttpMethod.patch, + path: ext + tId + suffix, body: jsonEncode(t), + parseSuccess: (decodedBody) { + return true; // Assuming a successful PATCH returns a 2xx status code + }, + onErrorDefault: () => false, + cacheResponse: false, ); - if (response.statusCode == 204 || response.statusCode == 200) { - return true; - } else if (response.statusCode >= 400) { - logger.error( - "PATCH ${ext + tId + suffix}\n${response.statusCode} ${response.body}", - ); - String toDecode = utf8.decode(response.bodyBytes); - final decoded = jsonDecode(toDecode); - if (decoded["detail"] == expiredTokenDetail) { - throw AppException(ErrorType.tokenExpire, decoded["detail"]); - } else { - throw AppException(ErrorType.notFound, decoded["detail"]); - } - } else { - logger.error( - "PATCH ${ext + tId + suffix}\n${response.statusCode} ${response.body}", - ); - throw AppException(ErrorType.notFound, response.body); - } } - /// DELETE ext/id/suffix + /// Deletes an item by sending a DELETE request to the API. + /// + /// The request is made to `ext/id/suffix`. + /// + /// [tId]: The identifier of the item to delete. + /// [suffix]: Optional additional path segment. + /// Returns a `Future` that resolves to `true` on successful deletion, `false` otherwise. Future delete(String tId, {String suffix = ""}) async { - final response = await http.delete( - Uri.parse(host + ext + tId + suffix), - headers: headers, + return _requestWithRefreshToken( + method: HttpMethod.delete, + path: ext + tId + suffix, + parseSuccess: (decodedBody) { + return true; // Assuming a successful DELETE returns a 2xx status code + }, + onErrorDefault: () => false, + cacheResponse: false, ); - if (response.statusCode == 204) { - return true; - } else if (response.statusCode >= 400) { - logger.error( - "DELETE ${ext + tId + suffix}\n${response.statusCode} ${response.body}", - ); - String toDecode = utf8.decode(response.bodyBytes); - final decoded = jsonDecode(toDecode); - if (decoded["detail"] == expiredTokenDetail) { - throw AppException(ErrorType.tokenExpire, decoded["detail"]); - } else { - throw AppException(ErrorType.notFound, decoded["detail"]); - } - } else { - logger.error( - "DELETE ${ext + tId + suffix}\n${response.statusCode} ${response.body}", - ); - throw AppException(ErrorType.notFound, response.body); - } } } diff --git a/lib/tools/token_expire_wrapper.dart b/lib/tools/token_expire_wrapper.dart index b9538e4c2..c3885d37c 100644 --- a/lib/tools/token_expire_wrapper.dart +++ b/lib/tools/token_expire_wrapper.dart @@ -1,60 +1,78 @@ +import 'dart:async'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:jwt_decoder/jwt_decoder.dart'; +import 'package:myecl/auth/class/auth_token.dart'; import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/exception.dart'; -import 'package:myecl/tools/providers/asking_refresh_token_provider.dart'; - -Future tokenExpireWrapper(WidgetRef ref, Future Function() f) async { - await f().catchError((error, stackTrace) async { - final tokenNotifier = ref.watch(authTokenProvider.notifier); - final askingRefreshTokenNotifier = ref.watch( - askingRefreshTokenProvider.notifier, - ); - final askingRefreshToken = ref.watch(askingRefreshTokenProvider); - final isLoggedIn = ref.watch(isLoggedInProvider); - if (error is AppException && - error.type == ErrorType.tokenExpire && - isLoggedIn) { - if (askingRefreshToken) return; - askingRefreshTokenNotifier.setAskingRefresh(true); - try { - final value = await tokenNotifier.refreshToken(); - if (value) { - f(); - } else { - tokenNotifier.deleteToken(); - } - } catch (e) { - tokenNotifier.deleteToken(); + +/// A wrapper for handling token expiration in asynchronous functions. +/// This function checks if the token is valid before executing the provided function. +/// If the token is expired, it attempts to refresh the token and then re-execute the +/// provided function. (A lock is used to ensure that only one refresh happens at a time.) +/// If the refresh fails, it signs out the user and throws an exception. +Future tokenExpireWrapper(Ref ref, Future Function() f) async { + final isTokenValid = ref.read( + authTokenProvider.select( + (authToken) => + authToken.hasValue && + authToken.value != null && + authToken.value != AuthToken.empty() && + !JwtDecoder.isExpired(authToken.value!.accessToken), + ), + ); + + if (isTokenValid) { + return await f(); + } + + final tokenNotifier = ref.read(authTokenProvider.notifier); + + return Future(() async { + try { + // Ensure only one refresh happens at a time + final hasRefreshed = await _refreshLock.refresh(() async { + return await tokenNotifier.refreshAccessToken(); + }); + + if (hasRefreshed) { + return await f(); + } else { + throw AppException(ErrorType.tokenRefreshFailed, "Refresh failed"); } - askingRefreshTokenNotifier.setAskingRefresh(false); + } catch (e, s) { + tokenNotifier.signOut(); + Error.throwWithStackTrace(e, s); } }); } -void tokenExpireWrapperAuth(Ref ref, Future Function() f) async { - f().catchError((error, stackTrace) async { - final tokenNotifier = ref.watch(authTokenProvider.notifier); - final askingRefreshTokenNotifier = ref.watch( - askingRefreshTokenProvider.notifier, - ); - final askingRefreshToken = ref.watch(askingRefreshTokenProvider); - final isLoggedIn = ref.watch(isLoggedInProvider); - if (error is AppException && - error.type == ErrorType.tokenExpire && - isLoggedIn) { - if (askingRefreshToken) return; - askingRefreshTokenNotifier.setAskingRefresh(true); - try { - final value = await tokenNotifier.refreshToken(); - if (value) { - f(); - } else { - tokenNotifier.deleteToken(); - } - } catch (e) { - tokenNotifier.deleteToken(); - } - askingRefreshTokenNotifier.setAskingRefresh(false); +class _TokenRefreshLock { + Completer? _refreshCompleter; + + bool get isRefreshing => _refreshCompleter != null; + + /// This method ensures that the provided callback is executed only once at a time. + /// If a refresh is already in progress, it waits for the existing refresh to complete. + Future refresh(Future Function() callback) async { + if (_refreshCompleter != null) { + // Already refreshing, just wait for it + await _refreshCompleter!.future; + return true; } - }); + + _refreshCompleter = Completer(); + + try { + final result = await callback(); + _refreshCompleter?.complete(); + return result; + } catch (e, s) { + _refreshCompleter?.completeError(e, s); + rethrow; + } finally { + _refreshCompleter = null; + } + } } + +final _refreshLock = _TokenRefreshLock(); diff --git a/lib/tools/ui/builders/auto_loader_child.dart b/lib/tools/ui/builders/auto_loader_child.dart index 565d5cad1..598221a3e 100644 --- a/lib/tools/ui/builders/auto_loader_child.dart +++ b/lib/tools/ui/builders/auto_loader_child.dart @@ -35,9 +35,11 @@ class AutoLoaderChild extends ConsumerWidget { final nonNullLoadingBuilder = loadingBuilder ?? (context) => Loader(color: loaderColor); if (group == null) { - loader == null - ? notifier.autoLoadList(ref, mapKey, listLoader!) - : notifier.autoLoad(ref, mapKey, loader!); + Future( + () => loader == null + ? notifier.autoLoadList(ref, mapKey, listLoader!) + : notifier.autoLoad(ref, mapKey, loader!), + ); return nonNullLoadingBuilder(context); } return AsyncChild( diff --git a/lib/tools/ui/layouts/column_refresher.dart b/lib/tools/ui/layouts/column_refresher.dart index da5957699..3ba7462c5 100644 --- a/lib/tools/ui/layouts/column_refresher.dart +++ b/lib/tools/ui/layouts/column_refresher.dart @@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class ColumnRefresher extends ConsumerWidget { final List children; @@ -30,9 +29,7 @@ class ColumnRefresher extends ConsumerWidget { } Widget buildAndroidList(WidgetRef ref) => RefreshIndicator( - onRefresh: () async { - tokenExpireWrapper(ref, onRefresh); - }, + onRefresh: onRefresh, child: ListView.builder( itemCount: children.length, itemBuilder: (BuildContext context, int index) => children[index], @@ -45,11 +42,7 @@ class ColumnRefresher extends ConsumerWidget { shrinkWrap: true, physics: const BouncingScrollPhysics(), slivers: [ - CupertinoSliverRefreshControl( - onRefresh: () async { - tokenExpireWrapper(ref, onRefresh); - }, - ), + CupertinoSliverRefreshControl(onRefresh: onRefresh), SliverList( delegate: SliverChildBuilderDelegate( (context, index) => children[index], diff --git a/lib/tools/ui/layouts/refresher.dart b/lib/tools/ui/layouts/refresher.dart index 2945d372e..6168fd36a 100644 --- a/lib/tools/ui/layouts/refresher.dart +++ b/lib/tools/ui/layouts/refresher.dart @@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class Refresher extends HookConsumerWidget { final Widget child; @@ -26,9 +25,7 @@ class Refresher extends HookConsumerWidget { Widget buildAndroidList(WidgetRef ref) => LayoutBuilder( builder: (context, constraints) => RefreshIndicator( - onRefresh: () async { - tokenExpireWrapper(ref, onRefresh); - }, + onRefresh: onRefresh, child: SingleChildScrollView( physics: const AlwaysScrollableScrollPhysics( parent: BouncingScrollPhysics(), @@ -47,11 +44,7 @@ class Refresher extends HookConsumerWidget { parent: AlwaysScrollableScrollPhysics(), ), slivers: [ - CupertinoSliverRefreshControl( - onRefresh: () async { - tokenExpireWrapper(ref, onRefresh); - }, - ), + CupertinoSliverRefreshControl(onRefresh: onRefresh), SliverToBoxAdapter( child: ConstrainedBox( constraints: BoxConstraints(minHeight: constraints.maxHeight), diff --git a/lib/tools/ui/widgets/styled_search_bar.dart b/lib/tools/ui/widgets/styled_search_bar.dart index f3ee48772..8e5c1bf91 100644 --- a/lib/tools/ui/widgets/styled_search_bar.dart +++ b/lib/tools/ui/widgets/styled_search_bar.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; class StyledSearchBar extends HookConsumerWidget { final Future Function(String)? onChanged; @@ -33,10 +32,8 @@ class StyledSearchBar extends HookConsumerWidget { alignment: Alignment.centerLeft, child: TextField( focusNode: focusNode, - onChanged: (_) { - tokenExpireWrapper(ref, () async { - await onChanged?.call(editingController.text); - }); + onChanged: (_) async { + await onChanged?.call(editingController.text); }, controller: editingController, cursorColor: color, diff --git a/lib/tools/ui/widgets/top_bar.dart b/lib/tools/ui/widgets/top_bar.dart index 528376ec6..acd790af5 100644 --- a/lib/tools/ui/widgets/top_bar.dart +++ b/lib/tools/ui/widgets/top_bar.dart @@ -34,6 +34,7 @@ class TopBar extends HookConsumerWidget { TopBarCallback(moduleRoot: root, onMenu: onMenu, onBack: onBack), ); }); + final isRootModule = Uri.parse(QR.currentPath).pathSegments.length <= 1; return Column( children: [ const SizedBox(height: 15), @@ -45,7 +46,7 @@ class TopBar extends HookConsumerWidget { builder: (BuildContext appBarContext) { return IconButton( onPressed: () { - if (QR.currentPath == root) { + if (isRootModule) { if (animation != null) { final controllerNotifier = ref.watch( swipeControllerProvider(animation).notifier, @@ -59,7 +60,7 @@ class TopBar extends HookConsumerWidget { } }, icon: HeroIcon( - QR.currentPath == root + isRootModule ? HeroIcons.bars3BottomLeft : HeroIcons.chevronLeft, color: textStyle?.color ?? Colors.black, diff --git a/lib/user/providers/profile_picture_provider.dart b/lib/user/providers/profile_picture_provider.dart index 2fee4513f..bc3a74f1a 100644 --- a/lib/user/providers/profile_picture_provider.dart +++ b/lib/user/providers/profile_picture_provider.dart @@ -7,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/repositories/profile_picture_repository.dart'; import 'package:path_provider/path_provider.dart'; @@ -112,14 +111,10 @@ class ProfilePictureNotifier extends SingleNotifier { final profilePictureProvider = StateNotifierProvider>((ref) { - final profilePictureRepository = ref.watch( - profilePictureRepositoryProvider, - ); + final profilePictureRepository = ProfilePictureRepository(ref); ProfilePictureNotifier notifier = ProfilePictureNotifier( profilePictureRepository: profilePictureRepository, ); - tokenExpireWrapperAuth(ref, () async { - notifier.getMyProfilePicture(); - }); + notifier.getMyProfilePicture(); return notifier; }); diff --git a/lib/user/providers/user_list_provider.dart b/lib/user/providers/user_list_provider.dart index 13b107b81..f89e879f2 100644 --- a/lib/user/providers/user_list_provider.dart +++ b/lib/user/providers/user_list_provider.dart @@ -1,7 +1,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/admin/class/simple_group.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/class/simple_users.dart'; import 'package:myecl/user/repositories/user_list_repository.dart'; @@ -33,12 +32,10 @@ final userList = StateNotifierProvider>>(( ref, ) { - final userListRepository = ref.watch(userListRepositoryProvider); + final userListRepository = UserListRepository(ref); UserListNotifier userListNotifier = UserListNotifier( userListRepository: userListRepository, ); - tokenExpireWrapperAuth(ref, () async { - userListNotifier.clear(); - }); + userListNotifier.clear(); return userListNotifier; }); diff --git a/lib/user/providers/user_provider.dart b/lib/user/providers/user_provider.dart index 8b221a349..677727ea9 100644 --- a/lib/user/providers/user_provider.dart +++ b/lib/user/providers/user_provider.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/user/class/user.dart'; import 'package:myecl/user/repositories/user_repository.dart'; @@ -54,18 +53,15 @@ class UserNotifier extends SingleNotifier { final asyncUserProvider = StateNotifierProvider>( (ref) { - final UserRepository userRepository = ref.watch(userRepositoryProvider); + final UserRepository userRepository = UserRepository(ref); UserNotifier userNotifier = UserNotifier(userRepository: userRepository); - final token = ref.watch(tokenProvider); - tokenExpireWrapperAuth(ref, () async { - final isLoggedIn = ref.watch(isLoggedInProvider); - final id = ref - .watch(idProvider) - .maybeWhen(data: (value) => value, orElse: () => ""); - if (isLoggedIn && id != "" && token != "") { - return userNotifier..loadMe(); - } - }); + final isLoggedIn = ref.watch(isLoggedInProvider); + final id = ref + .watch(userIdProvider) + .maybeWhen(data: (value) => value, orElse: () => ""); + if (isLoggedIn && id != "") { + return userNotifier..loadMe(); + } return userNotifier; }, ); diff --git a/lib/user/repositories/profile_picture_repository.dart b/lib/user/repositories/profile_picture_repository.dart index ff4b2d712..99995cdf3 100644 --- a/lib/user/repositories/profile_picture_repository.dart +++ b/lib/user/repositories/profile_picture_repository.dart @@ -1,6 +1,4 @@ import 'package:flutter/services.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/logo_repository.dart'; class ProfilePictureRepository extends LogoRepository { @@ -8,6 +6,8 @@ class ProfilePictureRepository extends LogoRepository { // ignore: overridden_fields final ext = 'users/'; + ProfilePictureRepository(super.ref); + Future getProfilePicture(String id) async { return await getLogo(id, suffix: "/profile-picture"); } @@ -16,8 +16,3 @@ class ProfilePictureRepository extends LogoRepository { return await addLogo(bytes, "me", suffix: "/profile-picture"); } } - -final profilePictureRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return ProfilePictureRepository()..setToken(token); -}); diff --git a/lib/user/repositories/user_list_repository.dart b/lib/user/repositories/user_list_repository.dart index 4b7444aac..6bdc4254f 100644 --- a/lib/user/repositories/user_list_repository.dart +++ b/lib/user/repositories/user_list_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/user/class/simple_users.dart'; @@ -8,6 +6,8 @@ class UserListRepository extends Repository { // ignore: overridden_fields final ext = "users/"; + UserListRepository(super.ref); + Future> getAllUsers() async { return List.from( (await getList()).map((x) => SimpleUser.fromJson(x)), @@ -38,8 +38,3 @@ class UserListRepository extends Repository { ); } } - -final userListRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return UserListRepository()..setToken(token); -}); diff --git a/lib/user/repositories/user_repository.dart b/lib/user/repositories/user_repository.dart index 84aed7d8f..dce0f721a 100644 --- a/lib/user/repositories/user_repository.dart +++ b/lib/user/repositories/user_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/user/class/user.dart'; @@ -8,6 +6,8 @@ class UserRepository extends Repository { // ignore: overridden_fields final ext = "users/"; + UserRepository(super.ref); + Future getUser(String userId) async { return User.fromJson(await getOne(userId)); } @@ -78,8 +78,3 @@ class UserRepository extends Repository { } } } - -final userRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return UserRepository()..setToken(token); -}); diff --git a/lib/version/providers/version_verifier_provider.dart b/lib/version/providers/version_verifier_provider.dart index 719977a04..041cab22e 100644 --- a/lib/version/providers/version_verifier_provider.dart +++ b/lib/version/providers/version_verifier_provider.dart @@ -15,7 +15,7 @@ class VersionVerifierNotifier extends SingleNotifier { final versionVerifierProvider = StateNotifierProvider>((ref) { - final versionRepository = ref.watch(versionRepositoryProvider); + final versionRepository = VersionRepository(ref); final notifier = VersionVerifierNotifier( versionRepository: versionRepository, ); diff --git a/lib/version/repositories/version_repository.dart b/lib/version/repositories/version_repository.dart index f8fbc09fc..ebb1fc463 100644 --- a/lib/version/repositories/version_repository.dart +++ b/lib/version/repositories/version_repository.dart @@ -1,4 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/version/class/version.dart'; @@ -7,12 +6,10 @@ class VersionRepository extends Repository { // ignore: overridden_fields final ext = "information"; + VersionRepository(super.ref); + Future getVersion() async { initLogger(); - return Version.fromJson(await getOne("")); + return Version.fromJson(await noAuthGetOne("")); } } - -final versionRepositoryProvider = Provider((ref) { - return VersionRepository(); -}); diff --git a/lib/vote/providers/contender_list_provider.dart b/lib/vote/providers/contender_list_provider.dart index 497d74a8f..25e0e2be0 100644 --- a/lib/vote/providers/contender_list_provider.dart +++ b/lib/vote/providers/contender_list_provider.dart @@ -1,6 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/vote/class/contender.dart'; import 'package:myecl/vote/repositories/contender_repository.dart'; import 'package:myecl/vote/tools/functions.dart'; @@ -88,12 +87,10 @@ final contenderListProvider = StateNotifierProvider>>(( ref, ) { - final contenderRepository = ref.watch(contenderRepositoryProvider); + final contenderRepository = ContenderRepository(ref); final contenderListNotifier = ContenderListNotifier( contenderRepository: contenderRepository, ); - tokenExpireWrapperAuth(ref, () async { - await contenderListNotifier.loadContenderList(); - }); + contenderListNotifier.loadContenderList(); return contenderListNotifier; }); diff --git a/lib/vote/providers/contender_logo_provider.dart b/lib/vote/providers/contender_logo_provider.dart index 175c58ace..6e3bc1031 100644 --- a/lib/vote/providers/contender_logo_provider.dart +++ b/lib/vote/providers/contender_logo_provider.dart @@ -30,9 +30,7 @@ class ContenderLogoProvider extends SingleNotifier { final contenderLogoProvider = StateNotifierProvider>((ref) { - final contenderLogoRepository = ref.watch( - contenderLogoRepositoryProvider, - ); + final contenderLogoRepository = ContenderLogoRepository(ref); final contenderLogosNotifier = ref.watch(contenderLogosProvider.notifier); return ContenderLogoProvider( contenderLogoRepository: contenderLogoRepository, diff --git a/lib/vote/providers/result_provider.dart b/lib/vote/providers/result_provider.dart index 7b220e0fc..7a234a73d 100644 --- a/lib/vote/providers/result_provider.dart +++ b/lib/vote/providers/result_provider.dart @@ -1,6 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/vote/class/result.dart'; import 'package:myecl/vote/repositories/result_repository.dart'; @@ -16,10 +15,8 @@ class ResultNotifier extends ListNotifier { final resultProvider = StateNotifierProvider>>((ref) { - final resultRepository = ref.watch(resultRepositoryProvider); + final resultRepository = ResultRepository(ref); final resultNotifier = ResultNotifier(resultRepository: resultRepository); - tokenExpireWrapperAuth(ref, () async { - await resultNotifier.loadResult(); - }); + resultNotifier.loadResult(); return resultNotifier; }); diff --git a/lib/vote/providers/section_vote_count_provide.dart b/lib/vote/providers/section_vote_count_provide.dart index 3d14b67c7..91e4dbf6e 100644 --- a/lib/vote/providers/section_vote_count_provide.dart +++ b/lib/vote/providers/section_vote_count_provide.dart @@ -14,6 +14,6 @@ class SectionVoteCountNotifier extends SingleNotifier { final sectionVoteCountProvider = StateNotifierProvider>((ref) { - final repository = ref.watch(sectionVoteCountRepositoryProvider); + final repository = SectionVoteCountRepository(ref); return SectionVoteCountNotifier(repository: repository); }); diff --git a/lib/vote/providers/sections_contender_provider.dart b/lib/vote/providers/sections_contender_provider.dart index c27501086..e66f24908 100644 --- a/lib/vote/providers/sections_contender_provider.dart +++ b/lib/vote/providers/sections_contender_provider.dart @@ -1,6 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/vote/class/contender.dart'; import 'package:myecl/vote/class/section.dart'; import 'package:myecl/vote/providers/contender_list_provider.dart'; @@ -16,30 +15,28 @@ final sectionContenderProvider = Map>?> >((ref) { SectionContender adminLoanListNotifier = SectionContender(); - tokenExpireWrapperAuth(ref, () async { - final loaners = ref.watch(sectionList); - final contenders = ref.watch(contenderListProvider); - List list = []; - contenders.when( - data: (contender) { - list = contender; - }, - error: (error, stackTrace) { - list = []; - }, - loading: () { - list = []; - }, + final loaners = ref.watch(sectionList); + final contenders = ref.watch(contenderListProvider); + List list = []; + contenders.when( + data: (contender) { + list = contender; + }, + error: (error, stackTrace) { + list = []; + }, + loading: () { + list = []; + }, + ); + adminLoanListNotifier.loadTList(loaners); + for (final l in loaners) { + adminLoanListNotifier.setTData( + l, + AsyncValue.data( + list.where((element) => element.section.id == l.id).toList(), + ), ); - adminLoanListNotifier.loadTList(loaners); - for (final l in loaners) { - adminLoanListNotifier.setTData( - l, - AsyncValue.data( - list.where((element) => element.section.id == l.id).toList(), - ), - ); - } - }); + } return adminLoanListNotifier; }); diff --git a/lib/vote/providers/sections_provider.dart b/lib/vote/providers/sections_provider.dart index 229dc73a6..cb6ebe5a0 100644 --- a/lib/vote/providers/sections_provider.dart +++ b/lib/vote/providers/sections_provider.dart @@ -1,6 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/vote/class/section.dart'; import 'package:myecl/vote/providers/section_id_provider.dart'; import 'package:myecl/vote/repositories/section_repository.dart'; @@ -39,13 +38,11 @@ class SectionNotifier extends ListNotifier
{ final sectionsProvider = StateNotifierProvider>>((ref) { - final sectionRepository = ref.watch(sectionRepositoryProvider); + final sectionRepository = SectionRepository(ref); SectionNotifier notifier = SectionNotifier( sectionRepository: sectionRepository, ); - tokenExpireWrapperAuth(ref, () async { - await notifier.loadSectionList(); - }); + notifier.loadSectionList(); return notifier; }); diff --git a/lib/vote/providers/sections_stats_provider.dart b/lib/vote/providers/sections_stats_provider.dart index b25542836..410c8f6bd 100644 --- a/lib/vote/providers/sections_stats_provider.dart +++ b/lib/vote/providers/sections_stats_provider.dart @@ -1,6 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/tools/providers/map_provider.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/vote/class/section.dart'; import 'package:myecl/vote/providers/sections_provider.dart'; @@ -14,11 +13,9 @@ final sectionsStatsProvider = Map>?> >((ref) { SectionsStatsNotifier sectionsStatsNotifier = SectionsStatsNotifier(); - tokenExpireWrapperAuth(ref, () async { - final sections = ref.watch(sectionsProvider); - sections.whenData((value) { - sectionsStatsNotifier.loadTList(value); - }); + final sections = ref.watch(sectionsProvider); + sections.whenData((value) { + sectionsStatsNotifier.loadTList(value); }); return sectionsStatsNotifier; }); diff --git a/lib/vote/providers/status_provider.dart b/lib/vote/providers/status_provider.dart index dcec60c59..ca711024e 100644 --- a/lib/vote/providers/status_provider.dart +++ b/lib/vote/providers/status_provider.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:myecl/tools/providers/single_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/vote/repositories/status_repository.dart'; class StatusNotifier extends SingleNotifier { @@ -55,10 +54,8 @@ class StatusNotifier extends SingleNotifier { final statusProvider = StateNotifierProvider>((ref) { - final statusRepository = ref.watch(statusRepositoryProvider); + final statusRepository = StatusRepository(ref); final statusNotifier = StatusNotifier(statusRepository: statusRepository); - tokenExpireWrapperAuth(ref, () async { - await statusNotifier.loadStatus(); - }); + statusNotifier.loadStatus(); return statusNotifier; }); diff --git a/lib/vote/providers/voted_section_provider.dart b/lib/vote/providers/voted_section_provider.dart index c01212971..abe3ee0ba 100644 --- a/lib/vote/providers/voted_section_provider.dart +++ b/lib/vote/providers/voted_section_provider.dart @@ -25,7 +25,7 @@ final votedSectionProvider = StateNotifierProvider>>(( ref, ) { - final votesRepository = ref.watch(votedSectionRepositoryProvider); + final votesRepository = VotedSectionRepository(ref); VotedSectionProvider votesProvider = VotedSectionProvider( votesRepository: votesRepository, ); diff --git a/lib/vote/providers/voter_list_provider.dart b/lib/vote/providers/voter_list_provider.dart index f3cef9694..acdecae0c 100644 --- a/lib/vote/providers/voter_list_provider.dart +++ b/lib/vote/providers/voter_list_provider.dart @@ -1,16 +1,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/providers/list_notifier.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/vote/class/voter.dart'; import 'package:myecl/vote/repositories/voter_repository.dart'; class VoterListNotifier extends ListNotifier { - final VoterRepository _voterRepository = VoterRepository(); - VoterListNotifier({required String token}) - : super(const AsyncValue.loading()) { - _voterRepository.setToken(token); - } + final VoterRepository _voterRepository; + VoterListNotifier(this._voterRepository) : super(const AsyncValue.loading()); Future>> loadVoterList() async { return await loadList(_voterRepository.getVoters); @@ -32,10 +27,8 @@ class VoterListNotifier extends ListNotifier { final voterListProvider = StateNotifierProvider>>((ref) { - final token = ref.watch(tokenProvider); - final voterListNotifier = VoterListNotifier(token: token); - tokenExpireWrapperAuth(ref, () async { - await voterListNotifier.loadVoterList(); - }); + final repository = VoterRepository(ref); + final voterListNotifier = VoterListNotifier(repository); + voterListNotifier.loadVoterList(); return voterListNotifier; }); diff --git a/lib/vote/providers/votes_provider.dart b/lib/vote/providers/votes_provider.dart index 107f6725b..8ad88933e 100644 --- a/lib/vote/providers/votes_provider.dart +++ b/lib/vote/providers/votes_provider.dart @@ -33,7 +33,7 @@ class VotesProvider extends ListNotifier { final votesProvider = StateNotifierProvider>>((ref) { - final votesRepository = ref.watch(votesRepositoryProvider); + final votesRepository = VotesRepository(ref); VotesProvider votesProvider = VotesProvider( votesRepository: votesRepository, ); diff --git a/lib/vote/repositories/contender_logo_repository.dart b/lib/vote/repositories/contender_logo_repository.dart index a52c983b6..96c0e483f 100644 --- a/lib/vote/repositories/contender_logo_repository.dart +++ b/lib/vote/repositories/contender_logo_repository.dart @@ -1,8 +1,6 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/repository/logo_repository.dart'; @@ -11,6 +9,8 @@ class ContenderLogoRepository extends LogoRepository { // ignore: overridden_fields final ext = 'campaign/lists/'; + ContenderLogoRepository(super.ref); + Future getContenderLogo(String id) async { final bytes = await getLogo(id, suffix: "/logo"); if (bytes.isEmpty) { @@ -23,10 +23,3 @@ class ContenderLogoRepository extends LogoRepository { return Image.memory(await addLogo(bytes, id, suffix: "/logo")); } } - -final contenderLogoRepositoryProvider = Provider(( - ref, -) { - final token = ref.watch(tokenProvider); - return ContenderLogoRepository()..setToken(token); -}); diff --git a/lib/vote/repositories/contender_repository.dart b/lib/vote/repositories/contender_repository.dart index b951a9f39..a129b69cb 100644 --- a/lib/vote/repositories/contender_repository.dart +++ b/lib/vote/repositories/contender_repository.dart @@ -1,5 +1,3 @@ -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/vote/class/contender.dart'; @@ -8,6 +6,8 @@ class ContenderRepository extends Repository { // ignore: overridden_fields final ext = "campaign/lists"; + ContenderRepository(super.ref); + Future deleteContender(String contenderId) async { return await delete("/$contenderId"); } @@ -28,8 +28,3 @@ class ContenderRepository extends Repository { return delete("/?list_type=$type"); } } - -final contenderRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return ContenderRepository()..setToken(token); -}); diff --git a/lib/vote/repositories/result_repository.dart b/lib/vote/repositories/result_repository.dart index ce00e8cfd..6ea80f353 100644 --- a/lib/vote/repositories/result_repository.dart +++ b/lib/vote/repositories/result_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/vote/class/result.dart'; @@ -8,12 +6,9 @@ class ResultRepository extends Repository { // ignore: overridden_fields final ext = 'campaign/results'; + ResultRepository(super.ref); + Future> getResult() async { return List.from((await getList()).map((e) => Result.fromJson(e))); } } - -final resultRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return ResultRepository()..setToken(token); -}); diff --git a/lib/vote/repositories/section_repository.dart b/lib/vote/repositories/section_repository.dart index 8b4f49461..887de20b8 100644 --- a/lib/vote/repositories/section_repository.dart +++ b/lib/vote/repositories/section_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/vote/class/section.dart'; @@ -8,6 +6,8 @@ class SectionRepository extends Repository { // ignore: overridden_fields final ext = "campaign/sections"; + SectionRepository(super.ref); + Future
getSection(String sectionId) async { return Section.fromJson(await getOne("/$sectionId")); } @@ -28,8 +28,3 @@ class SectionRepository extends Repository { return (await getList()).map((e) => Section.fromJson(e)).toList(); } } - -final sectionRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return SectionRepository()..setToken(token); -}); diff --git a/lib/vote/repositories/section_vote_count_repository.dart b/lib/vote/repositories/section_vote_count_repository.dart index 975353a7a..3600bd80b 100644 --- a/lib/vote/repositories/section_vote_count_repository.dart +++ b/lib/vote/repositories/section_vote_count_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class SectionVoteCountRepository extends Repository { @@ -7,12 +5,9 @@ class SectionVoteCountRepository extends Repository { // ignore: overridden_fields final ext = 'campaign/stats/'; + SectionVoteCountRepository(super.ref); + Future getSectionVoteCount(String id) async { return await getOne(id); } } - -final sectionVoteCountRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return SectionVoteCountRepository()..setToken(token); -}); diff --git a/lib/vote/repositories/status_repository.dart b/lib/vote/repositories/status_repository.dart index 6123b7135..40ace96f7 100644 --- a/lib/vote/repositories/status_repository.dart +++ b/lib/vote/repositories/status_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/vote/tools/functions.dart'; @@ -10,6 +8,8 @@ class StatusRepository extends Repository { // ignore: overridden_fields final ext = 'campaign/status'; + StatusRepository(super.ref); + Future getStatus() async { return stringToStatus((await getOne(''))['status']); } @@ -59,8 +59,3 @@ class StatusRepository extends Repository { } } } - -final statusRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return StatusRepository()..setToken(token); -}); diff --git a/lib/vote/repositories/voted_sections_repository.dart b/lib/vote/repositories/voted_sections_repository.dart index c086c1e22..dab68527c 100644 --- a/lib/vote/repositories/voted_sections_repository.dart +++ b/lib/vote/repositories/voted_sections_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; class VotedSectionRepository extends Repository { @@ -7,12 +5,9 @@ class VotedSectionRepository extends Repository { // ignore: overridden_fields final ext = 'campaign/votes'; + VotedSectionRepository(super.ref); + Future> getVotes() async { return (await getList()).cast(); } } - -final votedSectionRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return VotedSectionRepository()..setToken(token); -}); diff --git a/lib/vote/repositories/voter_repository.dart b/lib/vote/repositories/voter_repository.dart index addec5e5c..5f5f35a61 100644 --- a/lib/vote/repositories/voter_repository.dart +++ b/lib/vote/repositories/voter_repository.dart @@ -6,6 +6,8 @@ class VoterRepository extends Repository { // ignore: overridden_fields final ext = "campaign/voters"; + VoterRepository(super.ref); + Future deleteVoter(String voterId) async { return await delete("/$voterId"); } diff --git a/lib/vote/repositories/votes_repository.dart b/lib/vote/repositories/votes_repository.dart index 3063e2f73..0256cd9e5 100644 --- a/lib/vote/repositories/votes_repository.dart +++ b/lib/vote/repositories/votes_repository.dart @@ -1,5 +1,3 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:myecl/auth/providers/openid_provider.dart'; import 'package:myecl/tools/repository/repository.dart'; import 'package:myecl/vote/class/votes.dart'; @@ -8,6 +6,8 @@ class VotesRepository extends Repository { // ignore: overridden_fields final ext = 'campaign/votes'; + VotesRepository(super.ref); + Future addVote(Votes votes) async { await create(votes.toJson()); return votes; @@ -17,8 +17,3 @@ class VotesRepository extends Repository { return await delete(""); } } - -final votesRepositoryProvider = Provider((ref) { - final token = ref.watch(tokenProvider); - return VotesRepository()..setToken(token); -}); diff --git a/lib/vote/router.dart b/lib/vote/router.dart index de433aaba..1961e8308 100644 --- a/lib/vote/router.dart +++ b/lib/vote/router.dart @@ -2,9 +2,9 @@ import 'package:either_dart/either.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:heroicons/heroicons.dart'; import 'package:myecl/drawer/class/module.dart'; -import 'package:myecl/tools/middlewares/admin_middleware.dart'; -import 'package:myecl/tools/middlewares/authenticated_middleware.dart'; -import 'package:myecl/tools/middlewares/deferred_middleware.dart'; +import 'package:myecl/routing/middlewares/admin_middleware.dart'; +import 'package:myecl/routing/middlewares/authenticated_middleware.dart'; +import 'package:myecl/routing/middlewares/deferred_middleware.dart'; import 'package:myecl/vote/providers/is_vote_admin_provider.dart'; import 'package:myecl/vote/ui/pages/admin_page/admin_page.dart' deferred as admin_page; diff --git a/lib/vote/ui/pages/admin_page/admin_page.dart b/lib/vote/ui/pages/admin_page/admin_page.dart index bfff2f05d..a60c7d4b4 100644 --- a/lib/vote/ui/pages/admin_page/admin_page.dart +++ b/lib/vote/ui/pages/admin_page/admin_page.dart @@ -8,7 +8,6 @@ import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; import 'package:myecl/tools/ui/layouts/refresher.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; import 'package:myecl/user/providers/user_list_provider.dart'; import 'package:myecl/vote/class/contender.dart'; @@ -174,25 +173,23 @@ class AdminPage extends HookConsumerWidget { descriptions: VoteTextConstants.resetVoteDescription, onYes: () async { - await tokenExpireWrapper(ref, () async { - final value = await statusNotifier - .resetVote(); - ref - .watch(contenderListProvider.notifier) - .loadContenderList(); - if (value) { - showVotesNotifier.toggle(false); - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.resetedVotes, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.errorResetingVotes, - ); - } - }); + final value = await statusNotifier + .resetVote(); + ref + .watch(contenderListProvider.notifier) + .loadContenderList(); + if (value) { + showVotesNotifier.toggle(false); + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.resetedVotes, + ); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.errorResetingVotes, + ); + } }, ); }, @@ -263,20 +260,18 @@ class AdminPage extends HookConsumerWidget { child: child, ), onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await statusNotifier.countVote(); - if (value) { - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.votesCounted, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.errorCountingVotes, - ); - } - }); + final value = await statusNotifier.countVote(); + if (value) { + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.votesCounted, + ); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.errorCountingVotes, + ); + } }, child: const Center( child: Text( @@ -307,20 +302,18 @@ class AdminPage extends HookConsumerWidget { child: child, ), onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await statusNotifier.closeVote(); - if (value) { - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.votesClosed, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.errorClosingVotes, - ); - } - }); + final value = await statusNotifier.closeVote(); + if (value) { + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.votesClosed, + ); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.errorClosingVotes, + ); + } }, child: const Center( child: Text( @@ -356,24 +349,21 @@ class AdminPage extends HookConsumerWidget { child: child, ), onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await statusNotifier - .openVote(); - ref - .watch(contenderListProvider.notifier) - .loadContenderList(); - if (value) { - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.votesOpened, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.errorOpeningVotes, - ); - } - }); + final value = await statusNotifier.openVote(); + ref + .watch(contenderListProvider.notifier) + .loadContenderList(); + if (value) { + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.votesOpened, + ); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.errorOpeningVotes, + ); + } }, child: const Center( child: Text( @@ -417,30 +407,25 @@ class AdminPage extends HookConsumerWidget { descriptions: VoteTextConstants .deleteAllDescription, onYes: () async { - await tokenExpireWrapper( - ref, - () async { - final value = await ref - .watch( - contenderListProvider - .notifier, - ) - .deleteContenders(); - if (value) { - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants - .deletedAll, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants - .deletingError, - ); - } - }, - ); + final value = await ref + .watch( + contenderListProvider + .notifier, + ) + .deleteContenders(); + if (value) { + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants + .deletedAll, + ); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants + .deletingError, + ); + } }, ), ); @@ -494,32 +479,27 @@ class AdminPage extends HookConsumerWidget { descriptions: VoteTextConstants .deletePipoDescription, onYes: () async { - await tokenExpireWrapper( - ref, - () async { - final value = await ref - .watch( - contenderListProvider - .notifier, - ) - .deleteContenders( - type: ListType.fake, - ); - if (value) { - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants - .deletedPipo, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants - .deletingError, - ); - } - }, - ); + final value = await ref + .watch( + contenderListProvider + .notifier, + ) + .deleteContenders( + type: ListType.fake, + ); + if (value) { + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants + .deletedPipo, + ); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants + .deletingError, + ); + } }, ), ); diff --git a/lib/vote/ui/pages/admin_page/section_bar.dart b/lib/vote/ui/pages/admin_page/section_bar.dart index ccd234051..87de7742f 100644 --- a/lib/vote/ui/pages/admin_page/section_bar.dart +++ b/lib/vote/ui/pages/admin_page/section_bar.dart @@ -3,7 +3,6 @@ import 'package:heroicons/heroicons.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; import 'package:myecl/tools/ui/layouts/item_chip.dart'; import 'package:myecl/vote/providers/section_id_provider.dart'; @@ -53,35 +52,31 @@ class SectionBar extends HookConsumerWidget { selected: section.id == key.id, isAdmin: status == Status.waiting, onTap: () async { - tokenExpireWrapper(ref, () async { - sectionIdNotifier.setId(key.id); - }); + sectionIdNotifier.setId(key.id); }, onDelete: () async { - tokenExpireWrapper(ref, () async { - await showDialog( - context: context, - builder: (context) => CustomDialogBox( - title: VoteTextConstants.deleteSection, - descriptions: VoteTextConstants.deleteSectionDescription, - onYes: () async { - final result = await sectionsNotifier.deleteSection(key); - if (result) { - sectionContenderListNotifier.deleteT(key); - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.deletedSection, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.deletingError, - ); - } - }, - ), - ); - }); + await showDialog( + context: context, + builder: (context) => CustomDialogBox( + title: VoteTextConstants.deleteSection, + descriptions: VoteTextConstants.deleteSectionDescription, + onYes: () async { + final result = await sectionsNotifier.deleteSection(key); + if (result) { + sectionContenderListNotifier.deleteT(key); + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.deletedSection, + ); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.deletingError, + ); + } + }, + ), + ); }, ), ); diff --git a/lib/vote/ui/pages/admin_page/section_contender_items.dart b/lib/vote/ui/pages/admin_page/section_contender_items.dart index 4eee227b3..786ddfdd4 100644 --- a/lib/vote/ui/pages/admin_page/section_contender_items.dart +++ b/lib/vote/ui/pages/admin_page/section_contender_items.dart @@ -5,7 +5,6 @@ import 'package:myecl/tools/ui/builders/async_child.dart'; import 'package:myecl/tools/ui/layouts/card_layout.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; import 'package:myecl/vote/class/contender.dart'; import 'package:myecl/vote/providers/contender_list_provider.dart'; @@ -75,15 +74,11 @@ class SectionContenderItems extends HookConsumerWidget { contender: e, isAdmin: true, onEdit: () { - tokenExpireWrapper(ref, () async { - contenderNotifier.setId(e); - membersNotifier.setMembers(e.members); - QR.to( - VoteRouter.root + - VoteRouter.admin + - VoteRouter.addEditContender, - ); - }); + contenderNotifier.setId(e); + membersNotifier.setMembers(e.members); + QR.to( + VoteRouter.root + VoteRouter.admin + VoteRouter.addEditContender, + ); }, onDelete: () async { await showDialog( @@ -92,26 +87,24 @@ class SectionContenderItems extends HookConsumerWidget { return CustomDialogBox( title: VoteTextConstants.deletePretendance, descriptions: VoteTextConstants.deletePretendanceDesc, - onYes: () { - tokenExpireWrapper(ref, () async { - final value = await contenderListNotifier.deleteContender( - e, + onYes: () async { + final value = await contenderListNotifier.deleteContender( + e, + ); + if (value) { + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.pretendanceDeleted, + ); + contenderListNotifier.copy().then((value) { + sectionContenderListNotifier.setTData(section, value); + }); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.pretendanceNotDeleted, ); - if (value) { - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.pretendanceDeleted, - ); - contenderListNotifier.copy().then((value) { - sectionContenderListNotifier.setTData(section, value); - }); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.pretendanceNotDeleted, - ); - } - }); + } }, ); }, diff --git a/lib/vote/ui/pages/contender_pages/add_edit_contender.dart b/lib/vote/ui/pages/contender_pages/add_edit_contender.dart index 0fe3c173f..d54d98c89 100644 --- a/lib/vote/ui/pages/contender_pages/add_edit_contender.dart +++ b/lib/vote/ui/pages/contender_pages/add_edit_contender.dart @@ -6,7 +6,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:image_picker/image_picker.dart'; import 'package:myecl/tools/constants.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/layouts/card_button.dart'; import 'package:myecl/tools/ui/layouts/horizontal_list_view.dart'; @@ -222,17 +221,15 @@ class AddEditContenderPage extends HookConsumerWidget { children: [ TextEntry( label: VoteTextConstants.members, - onChanged: (newQuery) { + onChanged: (newQuery) async { showNotifier.setId(true); - tokenExpireWrapper(ref, () async { - if (queryController.text.isNotEmpty) { - await usersNotifier.filterUsers( - queryController.text, - ); - } else { - usersNotifier.clear(); - } - }); + if (queryController.text.isNotEmpty) { + await usersNotifier.filterUsers( + queryController.text, + ); + } else { + usersNotifier.clear(); + } }, color: Colors.black, controller: queryController, @@ -354,82 +351,80 @@ class AddEditContenderPage extends HookConsumerWidget { return; } if (key.currentState!.validate()) { - await tokenExpireWrapper(ref, () async { - final contenderList = ref.watch(contenderListProvider); - Contender newContender = Contender( - name: name.text, - id: isEdit ? contender.id : '', - description: description.text, - listType: listType.value, - members: members, - section: section.value, - program: program.text, - ); - final value = isEdit - ? await contenderListNotifier.updateContender( - newContender, - ) - : await contenderListNotifier.addContender( - newContender, - ); - if (value) { - QR.back(); - if (isEdit) { - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.editedPretendance, - ); - contenderList.maybeWhen( - data: (list) { - final logoBytes = logo.value; - if (logoBytes != null) { - contenderLogosNotifier.autoLoad( - ref, - contender.id, - (contenderId) => logoNotifier.updateLogo( - contenderId, - logoBytes, - ), - ); - } - }, - orElse: () {}, - ); - } else { - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.addedPretendance, - ); - contenderList.maybeWhen( - data: (list) { - final newContender = list.last; - final logoBytes = logo.value; - if (logoBytes != null) { - contenderLogosNotifier.autoLoad( - ref, - newContender.id, - (contenderId) => logoNotifier.updateLogo( - contenderId, - logoBytes, - ), - ); - } - }, - orElse: () {}, + final contenderList = ref.watch(contenderListProvider); + Contender newContender = Contender( + name: name.text, + id: isEdit ? contender.id : '', + description: description.text, + listType: listType.value, + members: members, + section: section.value, + program: program.text, + ); + final value = isEdit + ? await contenderListNotifier.updateContender( + newContender, + ) + : await contenderListNotifier.addContender( + newContender, ); - } - membersNotifier.clearMembers(); - sectionsNotifier.setTData( - section.value, - await contenderListNotifier.copy(), + if (value) { + QR.back(); + if (isEdit) { + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.editedPretendance, + ); + contenderList.maybeWhen( + data: (list) { + final logoBytes = logo.value; + if (logoBytes != null) { + contenderLogosNotifier.autoLoad( + ref, + contender.id, + (contenderId) => logoNotifier.updateLogo( + contenderId, + logoBytes, + ), + ); + } + }, + orElse: () {}, ); } else { displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.editingError, + TypeMsg.msg, + VoteTextConstants.addedPretendance, + ); + contenderList.maybeWhen( + data: (list) { + final newContender = list.last; + final logoBytes = logo.value; + if (logoBytes != null) { + contenderLogosNotifier.autoLoad( + ref, + newContender.id, + (contenderId) => logoNotifier.updateLogo( + contenderId, + logoBytes, + ), + ); + } + }, + orElse: () {}, ); } - }); + membersNotifier.clearMembers(); + sectionsNotifier.setTData( + section.value, + await contenderListNotifier.copy(), + ); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.editingError, + ); + } } else { displayToast( context, diff --git a/lib/vote/ui/pages/main_page/vote_button.dart b/lib/vote/ui/pages/main_page/vote_button.dart index 7abd3e1ab..bd0d98342 100644 --- a/lib/vote/ui/pages/main_page/vote_button.dart +++ b/lib/vote/ui/pages/main_page/vote_button.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/tools/ui/widgets/custom_dialog_box.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/vote/class/votes.dart'; import 'package:myecl/vote/providers/sections_provider.dart'; import 'package:myecl/vote/providers/selected_contender_provider.dart'; @@ -56,25 +55,23 @@ class VoteButton extends HookConsumerWidget { return CustomDialogBox( title: VoteTextConstants.vote, descriptions: VoteTextConstants.confirmVote, - onYes: () { - tokenExpireWrapper(ref, () async { - final result = await votesNotifier.addVote( - Votes(id: selectedContender.id), + onYes: () async { + final result = await votesNotifier.addVote( + Votes(id: selectedContender.id), + ); + if (result) { + votedSectionNotifier.addVote(section.id); + selectedContenderNotifier.clear(); + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.voteSuccess, ); - if (result) { - votedSectionNotifier.addVote(section.id); - selectedContenderNotifier.clear(); - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.voteSuccess, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.voteError, - ); - } - }); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.voteError, + ); + } }, ); }, diff --git a/lib/vote/ui/pages/section_pages/add_section.dart b/lib/vote/ui/pages/section_pages/add_section.dart index 276061fd5..0ffd601ef 100644 --- a/lib/vote/ui/pages/section_pages/add_section.dart +++ b/lib/vote/ui/pages/section_pages/add_section.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:myecl/tools/functions.dart'; -import 'package:myecl/tools/token_expire_wrapper.dart'; import 'package:myecl/tools/ui/layouts/add_edit_button_layout.dart'; import 'package:myecl/tools/ui/widgets/align_left_text.dart'; import 'package:myecl/tools/ui/builders/waiting_button.dart'; @@ -59,30 +58,28 @@ class AddSectionPage extends HookConsumerWidget { WaitingButton( builder: (child) => AddEditButtonLayout(child: child), onTap: () async { - await tokenExpireWrapper(ref, () async { - final value = await sectionListNotifier.addSection( - Section( - name: name.text, - id: '', - description: description.text, - ), + final value = await sectionListNotifier.addSection( + Section( + name: name.text, + id: '', + description: description.text, + ), + ); + if (value) { + QR.back(); + sections.whenData((value) { + sectionContenderNotifier.addT(value.last); + }); + displayVoteToastWithContext( + TypeMsg.msg, + VoteTextConstants.addedSection, ); - if (value) { - QR.back(); - sections.whenData((value) { - sectionContenderNotifier.addT(value.last); - }); - displayVoteToastWithContext( - TypeMsg.msg, - VoteTextConstants.addedSection, - ); - } else { - displayVoteToastWithContext( - TypeMsg.error, - VoteTextConstants.addingError, - ); - } - }); + } else { + displayVoteToastWithContext( + TypeMsg.error, + VoteTextConstants.addingError, + ); + } }, child: const Text( VoteTextConstants.add, diff --git a/test/auth/auth_notifier_test.dart b/test/auth/auth_notifier_test.dart new file mode 100644 index 000000000..575936dc9 --- /dev/null +++ b/test/auth/auth_notifier_test.dart @@ -0,0 +1,182 @@ +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:flutter_appauth/flutter_appauth.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:myecl/auth/class/auth_request.dart'; +import 'package:myecl/auth/class/auth_token.dart'; +import 'package:myecl/auth/providers/openid_provider.dart'; +import 'package:myecl/tools/cache/cache_manager.dart'; +import 'package:myecl/auth/repository/openid_repository.dart'; + +class MockAppAuth extends Mock implements FlutterAppAuth {} + +class MockSecureStorage extends Mock implements FlutterSecureStorage {} + +class MockCacheManager extends Mock implements CacheManager {} + +class MockOpenIdRepository extends Mock implements OpenIdRepository {} + +class MockTokenResponse extends Mock implements AuthorizationTokenResponse { + @override + final String accessToken; + @override + final String refreshToken; + MockTokenResponse({required this.accessToken, required this.refreshToken}) + : super(); +} + +void main() { + late AuthNotifier authNotifier; + late MockSecureStorage mockStorage; + late MockCacheManager mockCache; + late MockAppAuth mockAppAuth; + late MockOpenIdRepository mockOpenIdRepository; + + setUpAll(() { + dotenv.load(); + registerFallbackValue( + AuthRequest( + token: '', + clientId: '', + redirectUri: '', + codeVerifier: '', + grantType: AuthGrantType.authorizationCode, + ), + ); + registerFallbackValue( + TokenRequest("", "", discoveryUrl: "", scopes: [], refreshToken: ""), + ); + registerFallbackValue( + AuthorizationTokenRequest("", "", discoveryUrl: "", scopes: []), + ); + }); + + setUp(() { + mockStorage = MockSecureStorage(); + mockCache = MockCacheManager(); + mockAppAuth = MockAppAuth(); + mockOpenIdRepository = MockOpenIdRepository(); + + authNotifier = AuthNotifier( + appAuth: mockAppAuth, + secureStorage: mockStorage, + cacheManager: mockCache, + openIdRepository: mockOpenIdRepository, + ); + }); + + test( + 'signOut should clear storage and cache and emit empty AuthToken', + () async { + when( + () => mockStorage.delete(key: any(named: 'key')), + ).thenAnswer((_) async {}); + when(() => mockCache.deleteCache(any())).thenAnswer((_) async {}); + + when( + () => mockOpenIdRepository.getToken(any()), + ).thenAnswer((_) async => AuthToken.empty()); + + authNotifier.signOut(); + + expect(authNotifier.state, AsyncData(AuthToken.empty())); + verify(() => mockStorage.delete(key: AuthNotifier.tokenName)).called(1); + verify(() => mockCache.deleteCache(AuthNotifier.tokenName)).called(1); + verify(() => mockCache.deleteCache(AuthNotifier.userIdName)).called(1); + }, + ); + + test('refreshAccessToken success mobile', () async { + final fakeToken = AuthToken(accessToken: "abc", refreshToken: "refresh"); + when( + () => mockStorage.read(key: any(named: 'key')), + ).thenAnswer((_) async => "refresh"); + when( + () => mockStorage.write( + key: any(named: 'key'), + value: any(named: 'value'), + ), + ).thenAnswer((_) async {}); + + when( + () => mockOpenIdRepository.getToken(any()), + ).thenAnswer((_) async => fakeToken); + + when(() => mockAppAuth.token(any())).thenAnswer( + (_) async => + MockTokenResponse(accessToken: "abc", refreshToken: "refresh"), + ); + + final result = await authNotifier.refreshAccessToken(); + + expect(result, isTrue); + expect(authNotifier.state, isA>()); + final data = (authNotifier.state as AsyncData).value; + expect(data.accessToken, "abc"); + expect(data.refreshToken, "refresh"); + verify( + () => mockStorage.write( + key: any(named: 'key'), + value: "refresh", + ), + ).called(1); + }); + + test('refreshAccessToken failure mobile', () async { + when( + () => mockStorage.read(key: any(named: 'key')), + ).thenAnswer((_) async => "invalid_refresh_token"); + + when(() => mockAppAuth.token(any())).thenThrow(Exception("Token error")); + + final result = await authNotifier.refreshAccessToken(); + + expect(result, isFalse); + expect(authNotifier.state, isA>()); + verifyNever( + () => mockStorage.write( + key: any(named: 'key'), + value: any(named: 'value'), + ), + ); + }); + + test('signIn success mobile', () async { + when(() => mockAppAuth.authorizeAndExchangeCode(any())).thenAnswer( + (_) async => + MockTokenResponse(accessToken: "abc", refreshToken: "refresh"), + ); + + when( + () => mockStorage.write( + key: any(named: 'key'), + value: any(named: 'value'), + ), + ).thenAnswer((_) async {}); + + await authNotifier.signIn(); + + expect(authNotifier.state, isA>()); + final data = (authNotifier.state as AsyncData).value; + expect(data.accessToken, "abc"); + expect(data.refreshToken, "refresh"); + }); + + test('signIn failure mobile', () async { + when( + () => mockAppAuth.authorizeAndExchangeCode(any()), + ).thenThrow(Exception("Authorization error")); + + await authNotifier.signIn(); + + expect(authNotifier.state, isA>()); + verifyNever( + () => mockStorage.write( + key: any(named: 'key'), + value: any(named: 'value'), + ), + ); + }); +} diff --git a/test/auth/is_connected_provider_test.dart b/test/auth/is_connected_provider_test.dart index e1d05c788..f1900fdc9 100644 --- a/test/auth/is_connected_provider_test.dart +++ b/test/auth/is_connected_provider_test.dart @@ -1,7 +1,7 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:myecl/auth/providers/is_connected_provider.dart'; +import 'package:myecl/auth/providers/connection_status_provider.dart'; void main() { group('IsConnectedProvider', () { @@ -16,8 +16,8 @@ void main() { test('isConnectedProvider returns the correct value', () { final container = ProviderContainer(); - final provider = container.read(isConnectedProvider.notifier); - expect(container.read(isConnectedProvider), provider.state); + final provider = container.read(connectionStatusProvider.notifier); + expect(container.read(connectionStatusProvider), provider.state); }); }); } diff --git a/test/tools/providers/asling_refresh_token_provider_test.dart b/test/tools/providers/asling_refresh_token_provider_test.dart deleted file mode 100644 index 7403c06df..000000000 --- a/test/tools/providers/asling_refresh_token_provider_test.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:myecl/tools/providers/asking_refresh_token_provider.dart'; - -void main() { - test('AskingRefreshTokenNotifier sets state correctly', () { - final askingRefreshTokenNotifier = AskingRefreshTokenNotifier(); - - askingRefreshTokenNotifier.setAskingRefresh(true); - expect(askingRefreshTokenNotifier.state, true); - - askingRefreshTokenNotifier.setAskingRefresh(false); - expect(askingRefreshTokenNotifier.state, false); - }); - - test('askingRefreshTokenProvider returns correct value', () { - final container = ProviderContainer(); - - container.read(askingRefreshTokenProvider.notifier).setAskingRefresh(true); - expect(container.read(askingRefreshTokenProvider), true); - - container.read(askingRefreshTokenProvider.notifier).setAskingRefresh(false); - expect(container.read(askingRefreshTokenProvider), false); - }); -}