forked from witnet/my-wit-wallet
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogin_bloc.dart
More file actions
101 lines (95 loc) · 3.79 KB
/
login_bloc.dart
File metadata and controls
101 lines (95 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:my_wit_wallet/screens/create_wallet/models/wallet_name.dart';
import 'package:my_wit_wallet/shared/api_database.dart';
import 'package:my_wit_wallet/shared/locator.dart';
import 'package:my_wit_wallet/util/storage/database/wallet.dart';
import 'package:local_auth/local_auth.dart';
import 'package:my_wit_wallet/globals.dart' as globals;
part 'login_event.dart';
part 'login_state.dart';
enum BiometricsStatus {
autenticated,
notSupported,
autenticating,
error,
}
class LoginBloc extends Bloc<LoginEvent, LoginState> {
LoginBloc()
: super(LoginState(
message: '',
status: LoginStatus.LoginLoading,
password: '',
)) {
on<LoginSubmittedEvent>(_onSubmitted);
on<LoginAutenticationEvent>(_onBiometricsAutenticate);
on<LoginLogoutEvent>(_onLogoutEvent);
}
final LocalAuthentication auth = LocalAuthentication();
Future<BiometricsStatus> _onBiometricsAutenticate(
LoginAutenticationEvent event, Emitter<LoginState> emit) async {
ApiDatabase apiDatabase = Locator.instance<ApiDatabase>();
BiometricsStatus status = BiometricsStatus.autenticating;
try {
bool isDeviceSupported = await auth.isDeviceSupported();
bool canCheckBiometrics = await auth.canCheckBiometrics;
if (isDeviceSupported && canCheckBiometrics) {
emit(state.copyWith(status: LoginStatus.LoginInProgress));
globals.biometricsAuthInProgress = true;
bool authenticated = await auth.authenticate(
localizedReason:
'Scan your fingerprint (or face or whatever) to authenticate',
persistAcrossBackgrounding: true,
biometricOnly: true,
);
if (authenticated) {
status = BiometricsStatus.autenticated;
final currentWalletId = apiDatabase.walletStorage.currentWallet.id;
await apiDatabase.updateCurrentWallet(
currentWalletId: currentWalletId);
emit(state.copyWith(status: LoginStatus.LoginSuccess));
} else {
status = BiometricsStatus.error;
emit(state.copyWith(status: LoginStatus.LoginInvalid));
}
} else {
status = BiometricsStatus.notSupported;
emit(state.copyWith(status: LoginStatus.BiometricsNotSupported));
}
globals.biometricsAuthInProgress = false;
} on PlatformException catch (error) {
print('Exception using biometrics authentication $error');
status = BiometricsStatus.error;
globals.biometricsAuthInProgress = false;
emit(state.copyWith(status: LoginStatus.LoginCancelled));
}
return status;
}
void _onSubmitted(LoginSubmittedEvent event, Emitter<LoginState> emit) async {
ApiDatabase apiDatabase = Locator.instance<ApiDatabase>();
try {
emit(state.copyWith(status: LoginStatus.LoginInProgress));
bool verified = await apiDatabase.verifyLogin(event.password);
if (verified) {
final currentWallet = apiDatabase.walletStorage.currentWallet;
await apiDatabase.updateCurrentWallet(
currentWalletId: currentWallet.id,
isHdWallet: currentWallet.walletType == WalletType.hd);
emit(state.copyWith(status: LoginStatus.LoginSuccess));
} else {
emit(state.copyWith(status: LoginStatus.LoginInvalid));
}
} catch (e) {
print('Error submitting $e');
}
}
void _onLogoutEvent(LoginLogoutEvent event, Emitter<LoginState> emit) async {
ApiDatabase apiDatabase = Locator.instance<ApiDatabase>();
emit(state.copyWith(
status: LoginStatus.LoggedOut,
message: apiDatabase.walletStorage.wallets.length.toString()));
await apiDatabase.lockDatabase();
}
}