
Adds a logout button to the home page app bar. Implements the logout logic in the login page model, clearing the stored user token. Navigates to the splash screen after logout to handle redirection based on the updated authentication state.
117 lines
3.6 KiB
Dart
117 lines
3.6 KiB
Dart
import 'package:barcode_scanner/router/go_router_builder.dart';
|
|
import 'package:barcode_scanner/services/secure_storage.dart';
|
|
import 'package:barcode_scanner/services/token_provider.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
|
|
part 'login_page_model.freezed.dart';
|
|
|
|
/// The provider for the AuthViewModel, using Riverpod's StateNotifierProvider
|
|
/// with autoDispose to manage the lifecycle of the view model.
|
|
final loginPageModelProvider =
|
|
StateNotifierProvider<LoginPageModel, LoginPageState>((ref) {
|
|
return LoginPageModel(
|
|
secureStorage: ref.read(sharedPrefsProvider),
|
|
tokenProvider: ref.read(tokenProvider),
|
|
);
|
|
});
|
|
|
|
class LoginPageModel extends StateNotifier<LoginPageState> {
|
|
/// Constructor initializes the TaskRepository using the provider reference.
|
|
LoginPageModel({required this.secureStorage, required this.tokenProvider})
|
|
: super(const LoginPageState());
|
|
|
|
late FlutterSecureStorage secureStorage;
|
|
late TokenProvider tokenProvider;
|
|
|
|
Future<void> checkHasUserConnected() async {
|
|
try {
|
|
state = state.copyWith(
|
|
loading: true,
|
|
status: LoginPageStateStatus.logOut,
|
|
);
|
|
|
|
final token = await secureStorage.read(key: TokenProvider.tokenKey);
|
|
|
|
state = state.copyWith(
|
|
loading: false,
|
|
status: token != null
|
|
? LoginPageStateStatus.logged
|
|
: LoginPageStateStatus.logOut,
|
|
);
|
|
} catch (e) {
|
|
debugPrint("Error reading secure storage, clearing storage...");
|
|
await secureStorage
|
|
.deleteAll(); // Suppression des anciennes données en cas d'erreur
|
|
}
|
|
}
|
|
|
|
Future<void> signIn(
|
|
BuildContext context, {
|
|
required String email,
|
|
required String password,
|
|
}) async {
|
|
try {
|
|
state = state.copyWith(loading: true);
|
|
await Future.delayed(Duration(seconds: 5));
|
|
if (email == "user@yopmail.com" && password == "password") {
|
|
setTokenInLocal(context, 'token');
|
|
state = state.copyWith(
|
|
loading: false,
|
|
status: LoginPageStateStatus.logOut,
|
|
);
|
|
} else {
|
|
state = state.copyWith(
|
|
loading: false,
|
|
status: LoginPageStateStatus.logOut,
|
|
);
|
|
}
|
|
} catch (e) {
|
|
state = state.copyWith(
|
|
loading: false,
|
|
status: LoginPageStateStatus.logOut,
|
|
);
|
|
debugPrint("$e");
|
|
// Toast.showError(e.toString());
|
|
}
|
|
}
|
|
|
|
Future<void> setTokenInLocal(BuildContext context, String token) async {
|
|
await Future.wait([
|
|
tokenProvider.setToken(token),
|
|
tokenProvider.setRefreshToken(token),
|
|
]);
|
|
|
|
state = state.copyWith(loading: false, status: LoginPageStateStatus.logged);
|
|
debugPrint("$token");
|
|
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
|
SplashRoute().go(context);
|
|
});
|
|
}
|
|
|
|
Future<void> logOut() async {
|
|
await secureStorage.delete(key: TokenProvider.tokenKey);
|
|
await checkHasUserConnected();
|
|
}
|
|
}
|
|
|
|
@freezed
|
|
abstract class LoginPageState with _$LoginPageState {
|
|
const factory LoginPageState({
|
|
@Default(LoginPageStateStatus.logOut) LoginPageStateStatus status,
|
|
@Default(false) bool hasLangSelected,
|
|
@Default(false) bool loading,
|
|
@Default(false) bool googleSigninloading,
|
|
}) = _LoginPageState;
|
|
}
|
|
|
|
enum LoginPageStateStatus { otpSent, logged, logOut }
|
|
|
|
extension LoginPageStateStatusExt on LoginPageStateStatus {
|
|
bool get isLogged => this == LoginPageStateStatus.logged;
|
|
bool get isLogOut => this == LoginPageStateStatus.logOut;
|
|
}
|