-
Notifications
You must be signed in to change notification settings - Fork 12
/
login_viewmodel.dart
96 lines (77 loc) · 3.15 KB
/
login_viewmodel.dart
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
// Flutter imports:
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
// Package imports:
import 'package:stacked/stacked.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
// Project imports:
import 'package:notredame/core/constants/preferences_flags.dart';
import 'package:notredame/core/constants/router_paths.dart';
import 'package:notredame/core/managers/user_repository.dart';
import 'package:notredame/core/services/navigation_service.dart';
import 'package:notredame/core/services/preferences_service.dart';
import 'package:notredame/locator.dart';
class LoginViewModel extends BaseViewModel {
/// Used to authenticate the user
final UserRepository _userRepository = locator<UserRepository>();
/// Used to redirect on the dashboard.
final NavigationService _navigationService = locator<NavigationService>();
final FlutterSecureStorage _flutterSecureStorage =
locator<FlutterSecureStorage>();
/// Regex matcher to validate the Universal code pattern
final RegExp _universalCodeMatcher = RegExp(r'[a-zA-Z]{2}\d{5}');
/// l10n class used to return the right error message
final AppIntl _appIntl;
String _universalCode = "";
String get universalCode => _universalCode;
String _password = "";
String get password => _password;
/// Used to enable/disable the "log in" button
bool get canSubmit => _universalCode.isNotEmpty && _password.isNotEmpty;
LoginViewModel({required AppIntl intl}) : _appIntl = intl;
/// Use to get the value associated to each settings key
final PreferencesService _preferencesService = locator<PreferencesService>();
/// Validate the format of the universal code
String? validateUniversalCode(String? value) {
if (value == null || value.isEmpty) {
_universalCode = "";
return _appIntl.login_error_field_required;
} else if (!_universalCodeMatcher.hasMatch(value)) {
_universalCode = "";
return _appIntl.login_error_invalid_universal_code;
}
_universalCode = value;
return null;
}
/// Validate there is a password typed
String? validatePassword(String? value) {
if (value == null || value.isEmpty) {
_password = "";
return _appIntl.login_error_field_required;
}
_password = value;
return null;
}
/// Try to authenticate the user. Redirect to the [DashboardView] if everything is correct
Future<String> authenticate() async {
if (!canSubmit) {
return _appIntl.login_error_invalid_credentials;
}
setBusy(true);
final response = await _userRepository.authenticate(
username: _universalCode.toUpperCase(), password: _password);
if (response) {
await _flutterSecureStorage.write(
key: "WidgetSecureUser", value: _universalCode);
await _flutterSecureStorage.write(
key: "WidgetSecurePass", value: _password);
_navigationService.pushNamedAndRemoveUntil(RouterPaths.dashboard);
_preferencesService.setDateTime(PreferencesFlag.ratingTimer,
DateTime.now().add(const Duration(days: 7)));
return '';
}
_password = "";
setBusy(false);
notifyListeners();
return _appIntl.login_error_invalid_credentials;
}
}