1
1
import 'package:bloc/bloc.dart' ;
2
+ import 'package:equatable/equatable.dart' ;
2
3
import 'package:firebase_analytics/firebase_analytics.dart' ;
3
- import 'package:freezed_annotation/freezed_annotation.dart' ;
4
4
import 'package:get/get.dart' ;
5
5
import 'package:rtu_mirea_app/domain/entities/student.dart' ;
6
6
import 'package:rtu_mirea_app/domain/entities/user.dart' ;
@@ -12,7 +12,6 @@ import 'package:sentry_flutter/sentry_flutter.dart';
12
12
13
13
part 'user_event.dart' ;
14
14
part 'user_state.dart' ;
15
- part 'user_bloc.freezed.dart' ;
16
15
17
16
class UserBloc extends Bloc <UserEvent , UserState > {
18
17
final LogIn logIn;
@@ -25,19 +24,19 @@ class UserBloc extends Bloc<UserEvent, UserState> {
25
24
required this .logOut,
26
25
required this .getUserData,
27
26
required this .getAuthToken,
28
- }) : super (const _Unauthorized ()) {
29
- on < _LogIn > (_onLogInEvent);
30
- on < _LogOut > (_onLogOutEvent);
31
- on < _Started > (_onGetUserDataEvent);
32
- on < _GetUserData > (_onGetUserDataEvent);
33
- on < _SetAuntificatedData > (_onSetAuntificatedDataEvent);
27
+ }) : super (const UserState ()) {
28
+ on < LogInEvent > (_onLogInEvent);
29
+ on < LogOutEvent > (_onLogOutEvent);
30
+ on < Started > (_onGetUserDataEvent);
31
+ on < GetUserDataEvent > (_onGetUserDataEvent);
32
+ on < SetAuthenticatedData > (_onSetAuntificatedDataEvent);
34
33
}
35
34
36
35
void _onSetAuntificatedDataEvent (
37
- _SetAuntificatedData event,
36
+ SetAuthenticatedData event,
38
37
Emitter <UserState > emit,
39
38
) async {
40
- emit (_LogInSuccess ( event.user));
39
+ emit (state. copyWith (status : UserStatus .authorized, user : event.user));
41
40
}
42
41
43
42
void _setSentryUserIdentity (String id, String email, String group) {
@@ -49,7 +48,7 @@ class UserBloc extends Bloc<UserEvent, UserState> {
49
48
UserEvent event,
50
49
Emitter <UserState > emit,
51
50
) async {
52
- if (state is _LogInSuccess ) return ;
51
+ if (state.status == UserStatus .authorized ) return ;
53
52
54
53
// We use oauth2 to get token. So we don't need to pass login and password
55
54
// to the server. We just need to pass them to the oauth2 server.
@@ -59,26 +58,25 @@ class UserBloc extends Bloc<UserEvent, UserState> {
59
58
final logInRes = await logIn ();
60
59
61
60
logInRes.fold (
62
- (failure) => emit (_LogInError (
63
- failure.cause ?? "Ошибка при авторизации. Повторите попытку" )),
61
+ (failure) => emit (state.copyWith (status: UserStatus .authorizeError)),
64
62
(res) {
65
63
loggedIn = true ;
66
64
},
67
65
);
68
66
69
67
if (loggedIn) {
70
- emit (const _Loading ( ));
68
+ emit (state. copyWith (status : UserStatus .loading ));
71
69
final user = await getUserData ();
72
70
73
71
user.fold (
74
- (failure) => emit (const _Unauthorized ( )),
72
+ (failure) => emit (state. copyWith (status : UserStatus .unauthorized )),
75
73
(user) {
76
74
FirebaseAnalytics .instance.logLogin ();
77
75
var student = getActiveStudent (user);
78
76
79
77
_setSentryUserIdentity (
80
78
user.id.toString (), user.login, student.academicGroup);
81
- emit (_LogInSuccess ( user));
79
+ emit (state. copyWith (status : UserStatus .authorized, user : user));
82
80
},
83
81
);
84
82
}
@@ -89,7 +87,7 @@ class UserBloc extends Bloc<UserEvent, UserState> {
89
87
Emitter <UserState > emit,
90
88
) async {
91
89
final res = await logOut ();
92
- res.fold ((failure) => null , (r) => emit (const _Unauthorized ()));
90
+ res.fold ((failure) => null , (r) => emit (state. copyWith ()));
93
91
}
94
92
95
93
static Student getActiveStudent (User user) {
@@ -103,7 +101,7 @@ class UserBloc extends Bloc<UserEvent, UserState> {
103
101
UserEvent event,
104
102
Emitter <UserState > emit,
105
103
) async {
106
- if (state is _LogInSuccess ) return ;
104
+ if (state.status == UserStatus .authorized ) return ;
107
105
108
106
final token = await getAuthToken ();
109
107
@@ -113,14 +111,16 @@ class UserBloc extends Bloc<UserEvent, UserState> {
113
111
114
112
// If token in the storage, user is authorized at least once and we can
115
113
// try to get user data
116
- emit (const _Loading ( ));
114
+ emit (state. copyWith (status : UserStatus .loading ));
117
115
final user = await getUserData ();
118
116
119
- user.fold ((failure) => emit (const _Unauthorized ()), (r) {
117
+ user.fold (
118
+ (failure) => emit (state.copyWith (status: UserStatus .unauthorized)),
119
+ (r) {
120
120
var student = getActiveStudent (r);
121
121
122
122
_setSentryUserIdentity (r.id.toString (), r.login, student.academicGroup);
123
- emit (_LogInSuccess ( r));
123
+ emit (state. copyWith (status : UserStatus .authorized, user : r));
124
124
});
125
125
}
126
126
}
0 commit comments