From f288cb30e631fddcec46a6c8a245266cc27fa0b7 Mon Sep 17 00:00:00 2001 From: nilsreichardt Date: Fri, 1 Mar 2024 22:44:48 +0100 Subject: [PATCH] Fix --- app/lib/main/sharezone_bloc_providers.dart | 4 ++++ .../change_type_of_user_controller.dart | 23 ++++++++++--------- .../change_type_of_user_page.dart | 5 +++- .../change_type_of_user_repository.dart | 17 ++++++++++++++ 4 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_repository.dart diff --git a/app/lib/main/sharezone_bloc_providers.dart b/app/lib/main/sharezone_bloc_providers.dart index a420c091d..b21bc5c0e 100644 --- a/app/lib/main/sharezone_bloc_providers.dart +++ b/app/lib/main/sharezone_bloc_providers.dart @@ -92,6 +92,7 @@ import 'package:sharezone/settings/src/subpages/imprint/bloc/imprint_bloc_factor import 'package:sharezone/settings/src/subpages/imprint/gateway/imprint_gateway.dart'; import 'package:sharezone/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_analytics.dart'; import 'package:sharezone/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_controller.dart'; +import 'package:sharezone/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_repository.dart'; import 'package:sharezone/settings/src/subpages/timetable/bloc/timetable_settings_bloc_factory.dart'; import 'package:sharezone/settings/src/subpages/timetable/time_picker_settings_cache.dart'; import 'package:sharezone/sharezone_plus/page/sharezone_plus_page_controller.dart'; @@ -365,6 +366,9 @@ class _SharezoneBlocProvidersState extends State { ), ChangeNotifierProvider( create: (context) => ChangeTypeOfUserController( + repository: ChangeTypeOfUserRepository( + functions: widget.blocDependencies.functions, + ), typeOfUserStream: typeOfUserStream, analytics: ChangeTypeOfUserAnalytics(analytics), userId: UserId(api.uID), diff --git a/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_controller.dart b/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_controller.dart index a4106ae8c..7dddf51c8 100644 --- a/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_controller.dart +++ b/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_controller.dart @@ -1,14 +1,16 @@ import 'dart:async'; +import 'package:cloud_functions/cloud_functions.dart'; import 'package:common_domain_models/common_domain_models.dart'; import 'package:flutter/material.dart'; import 'package:sharezone/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_analytics.dart'; +import 'package:sharezone/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_repository.dart'; import 'package:user/user.dart'; class ChangeTypeOfUserController extends ChangeNotifier { - /// The user ID of the user whose type of user should be changed. final UserId userId; final ChangeTypeOfUserAnalytics analytics; + final ChangeTypeOfUserRepository repository; StreamSubscription? _typeOfUserSubscription; late ChangeTypeOfUserState state; @@ -22,6 +24,7 @@ class ChangeTypeOfUserController extends ChangeNotifier { ChangeTypeOfUserController({ required this.userId, required this.analytics, + required this.repository, required Stream typeOfUserStream, }) { state = const ChangeTypeOfUserInitial(); @@ -38,20 +41,15 @@ class ChangeTypeOfUserController extends ChangeNotifier { Future changeTypeOfUser() async { final typeOfUser = selectedTypeOfUser; if (typeOfUser == null) { - state = const NoTypeOfUserSelectedException(); - notifyListeners(); - return; + throw const NoTypeOfUserSelectedException(); } if (typeOfUser == initialTypeOfUser) { - state = const TypeUserOfUserHasNotChangedException(); - notifyListeners(); - return; + throw const TypeUserOfUserHasNotChangedException(); } try { - // Call backend... - await Future.delayed(const Duration(seconds: 1)); + await repository.changeTypeOfUser(typeOfUser); analytics.logChangedOrder( from: initialTypeOfUser, @@ -59,8 +57,11 @@ class ChangeTypeOfUserController extends ChangeNotifier { ); initialTypeOfUser = typeOfUser; state = const ChangedTypeOfUserSuccessfully(); + } on FirebaseFunctionsException catch (e) { + throw ChangeTypeOfUserUnknownException( + '[${e.plugin}/${e.code}] ${e.message}'); } catch (e) { - state = ChangeTypeOfUserUnknownException(e); + throw ChangeTypeOfUserUnknownException(e); } finally { notifyListeners(); } @@ -90,7 +91,7 @@ class ChangedTypeOfUserSuccessfully extends ChangeTypeOfUserState { const ChangedTypeOfUserSuccessfully(); } -sealed class ChangeTypeOfUserFailed extends ChangeTypeOfUserState { +sealed class ChangeTypeOfUserFailed { const ChangeTypeOfUserFailed(); } diff --git a/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_page.dart b/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_page.dart index b97f0a403..f7e71a92c 100644 --- a/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_page.dart +++ b/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_page.dart @@ -45,6 +45,7 @@ class _SaveFab extends StatelessWidget { TypeUserOfUserHasNotChangedException() => 'Der Account-Typ hat sich nicht geƤndert.', }, + context: context, ); } @@ -60,6 +61,7 @@ class _SaveFab extends StatelessWidget { await controller.changeTypeOfUser(); if (context.mounted) { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); _showRestartDialog(context); } } on ChangeTypeOfUserFailed catch (e) { @@ -112,7 +114,8 @@ class _ChangeTypeOfUser extends StatelessWidget { @override Widget build(BuildContext context) { final controller = context.watch(); - final selectedTypeOfUser = controller.selectedTypeOfUser; + final selectedTypeOfUser = + controller.selectedTypeOfUser ?? controller.initialTypeOfUser; return Column( children: [ for (final typeOfUser in [ diff --git a/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_repository.dart b/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_repository.dart new file mode 100644 index 000000000..e0e8b872b --- /dev/null +++ b/app/lib/settings/src/subpages/my_profile/change_type_of_user/change_type_of_user_repository.dart @@ -0,0 +1,17 @@ +import 'package:cloud_functions/cloud_functions.dart'; +import 'package:user/user.dart'; + +class ChangeTypeOfUserRepository { + final FirebaseFunctions _functions; + + const ChangeTypeOfUserRepository({ + required FirebaseFunctions functions, + }) : _functions = functions; + + Future changeTypeOfUser(TypeOfUser typeOfUser) async { + final callable = _functions.httpsCallable('changeTypeOfUser'); + await callable.call({ + 'type': typeOfUser.name, + }); + } +}