11import 'package:equatable/equatable.dart' ;
22import 'package:flutter_bloc/flutter_bloc.dart' ;
3+ import 'package:nc_cookbook_api/nc_cookbook_api.dart' ;
34import 'package:nextcloud_cookbook_flutter/src/models/app_authentication.dart' ;
45import 'package:nextcloud_cookbook_flutter/src/services/services.dart' ;
56
67part 'authentication_event.dart' ;
8+ part 'authentication_exception.dart' ;
79part 'authentication_state.dart' ;
810
911class AuthenticationBloc
1012 extends Bloc <AuthenticationEvent , AuthenticationState > {
11- AuthenticationBloc () : super (AuthenticationState ()) {
13+ AuthenticationBloc () : super (const AuthenticationState ()) {
1214 on < AppStarted > (_mapAppStartedEventToState);
1315 on < LoggedIn > (_mapLoggedInEventToState);
1416 on < LoggedOut > (_mapLoggedOutEventToState);
@@ -19,19 +21,28 @@ class AuthenticationBloc
1921 AppStarted event,
2022 Emitter <AuthenticationState > emit,
2123 ) async {
22- final hasToken = await userRepository.hasAppAuthentication ();
23-
24- if (hasToken) {
25- await userRepository.loadAppAuthentication ();
24+ if (userRepository.hasAuthentidation) {
2625 try {
26+ await userRepository.loadAppAuthentication ();
27+
2728 final validCredentials = await userRepository.checkAppAuthentication ();
2829
2930 if (validCredentials) {
30- emit (AuthenticationState (status: AuthenticationStatus .authenticated));
31+ final apiVersion = await UserRepository ().fetchApiVersion ();
32+ emit (
33+ AuthenticationState (
34+ status: AuthenticationStatus .authenticated,
35+ apiVersion: apiVersion,
36+ ),
37+ );
3138 } else {
3239 await userRepository.deleteAppAuthentication ();
33- emit (AuthenticationState (status: AuthenticationStatus .invalid));
40+ emit (const AuthenticationState (status: AuthenticationStatus .invalid));
3441 }
42+ } on LoadAuthException {
43+ emit (
44+ const AuthenticationState (status: AuthenticationStatus .authenticated),
45+ );
3546 } catch (e) {
3647 emit (
3748 AuthenticationState (
@@ -41,25 +52,50 @@ class AuthenticationBloc
4152 );
4253 }
4354 } else {
44- emit (AuthenticationState (status: AuthenticationStatus .unauthenticated));
55+ emit (
56+ const AuthenticationState (
57+ status: AuthenticationStatus .unauthenticated,
58+ ),
59+ );
4560 }
4661 }
4762
4863 Future <void > _mapLoggedInEventToState (
4964 LoggedIn event,
5065 Emitter <AuthenticationState > emit,
5166 ) async {
52- emit (AuthenticationState ());
53- await userRepository.persistAppAuthentication (event.appAuthentication);
54- emit (AuthenticationState (status: AuthenticationStatus .authenticated));
67+ emit (const AuthenticationState ());
68+ try {
69+ await userRepository.persistAppAuthentication (event.appAuthentication);
70+
71+ final apiVersion = await UserRepository ().fetchApiVersion ();
72+ emit (
73+ AuthenticationState (
74+ status: AuthenticationStatus .authenticated,
75+ apiVersion: apiVersion,
76+ ),
77+ );
78+ } catch (e) {
79+ emit (
80+ AuthenticationState (
81+ status: AuthenticationStatus .error,
82+ error: e.toString (),
83+ ),
84+ );
85+ }
5586 }
5687
5788 Future <void > _mapLoggedOutEventToState (
5889 LoggedOut event,
5990 Emitter <AuthenticationState > emit,
6091 ) async {
61- emit (AuthenticationState ());
62- await userRepository.deleteAppAuthentication ();
63- emit (AuthenticationState (status: AuthenticationStatus .unauthenticated));
92+ emit (const AuthenticationState ());
93+ try {
94+ await userRepository.deleteAppAuthentication ();
95+ } finally {
96+ emit (
97+ const AuthenticationState (status: AuthenticationStatus .unauthenticated),
98+ );
99+ }
64100 }
65101}
0 commit comments