
Introduces a side navigation drawer on the home page to improve navigation and centralize user actions. Displays the logged-in user's information (name, email) in the drawer header. Adds a link to the Product List page ("Inventaire") within the drawer. Moves the logout functionality to the drawer, ensuring user data is also cleared from local storage upon logout. Ensures user data is saved to local storage during the login process and fetched when the home page loads. Includes minor text updates on the Product Form page.
123 lines
3.8 KiB
Dart
123 lines
3.8 KiB
Dart
import 'package:barcode_scanner/backend/schema/user/user_struct.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_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({
|
|
required String email,
|
|
required String password,
|
|
VoidCallback? onSuccess,
|
|
VoidCallback? onError,
|
|
}) async {
|
|
try {
|
|
state = state.copyWith(loading: true);
|
|
await Future.delayed(Duration(seconds: 5));
|
|
if (email == "user@yopmail.com" && password == "password") {
|
|
setTokenInLocal(
|
|
'token',
|
|
UserStruct(
|
|
id: '1',
|
|
firstName: 'User',
|
|
lastName: 'Anonymous',
|
|
email: 'user@yopmail.com',
|
|
),
|
|
);
|
|
state = state.copyWith(
|
|
loading: false,
|
|
status: LoginPageStateStatus.logOut,
|
|
);
|
|
onSuccess?.call();
|
|
} 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(String token, UserStruct user) async {
|
|
await Future.wait([
|
|
tokenProvider.setToken(token),
|
|
tokenProvider.setRefreshToken(token),
|
|
user.setToLocalStorage(),
|
|
]);
|
|
state = state.copyWith(loading: false, status: LoginPageStateStatus.logged);
|
|
debugPrint("$token");
|
|
}
|
|
|
|
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;
|
|
}
|