import 'dart:convert'; import 'package:equatable/equatable.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../app/constant.dart'; import '../../models/auth_model.dart'; import '../../provider/current_user_provider.dart'; import '../../provider/dio_provider.dart'; import '../../repository/auth_repository.dart'; import '../../repository/base_repository.dart'; // 3. state provider final loginProvider = StateNotifierProvider( (ref) => LoginNotifier(ref: ref)); // 2. notifier class LoginNotifier extends StateNotifier { final Ref ref; LoginNotifier({required this.ref}) : super(LoginStateInit()); void login( {required String username, required String password, bool isRememberMe = false}) async { try { state = LoginStateLoading(); final resp = await AuthRepository(dio: ref.read(dioProvider)) .login(username: username, password: password); state = LoginStateDone(model: resp); //Simpan ke token jk remember me if (isRememberMe == true) { final shared = await SharedPreferences.getInstance(); final token = {"date": DateTime.now().toString(), "model": resp.model}; final tokenEncode = jsonEncode(token); await shared.setString(Constant.tokenName, tokenEncode); await shared.setString("usernameX", username); await shared.setString("passwordX", password); await shared.setBool("isRememberMeX", isRememberMe); } else { // share pref di remove karena remember me tidak di centang final shared = await SharedPreferences.getInstance(); await shared.remove("usernameX"); await shared.remove("passwordX"); await shared.remove("isRememberMeX"); } ref.read(currentUserProvider.notifier).state = AuthModel( token: resp.token, model: resp.model, ); // print(shared.getString(Constant.bearerName)); } catch (e) { if (e is BaseRepositoryException) { state = LoginStateError(message: e.message ?? ""); } else { state = LoginStateError(message: e.toString()); } } } } // 1. state abstract class LoginState extends Equatable { final DateTime date; const LoginState(this.date); @override List get props => [date]; } class LoginStateInit extends LoginState { LoginStateInit() : super(DateTime.now()); } class LoginStateLoading extends LoginState { LoginStateLoading() : super(DateTime.now()); } class LoginStateError extends LoginState { final String? message; LoginStateError({ required this.message, }) : super(DateTime.now()); } class LoginStateDone extends LoginState { final AuthModel model; LoginStateDone({ required this.model, }) : super(DateTime.now()); }