Files
pfm-ocr/lib/features/auth/auth_provider.dart
T

60 lines
1.6 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../core/network/api_client.dart';
import '../../config/app_config.dart';
class AuthNotifier extends StateNotifier<bool> {
AuthNotifier() : super(false);
Future<bool> checkLoginState() async {
final prefs = await SharedPreferences.getInstance();
final token = prefs.getString('auth_token');
if (token != null) {
state = true;
return true;
}
state = false;
return false;
}
Future<void> login(String username, String password) async {
final apiClient = ApiClient();
try {
final response = await apiClient.client.post(
AppConfig.loginEndpoint,
data: {
'username': username,
'password': password,
},
);
if (response.data is! Map || response.data['data'] is! Map) {
throw Exception("Format respon server tidak valid (bukan JSON)");
}
final token = response.data['data']['token'];
if (token == null) {
throw Exception("Token otentikasi tidak ditemukan dalam respon");
}
final prefs = await SharedPreferences.getInstance();
await prefs.setString('auth_token', token);
state = true;
} catch (e) {
state = false;
rethrow;
}
}
Future<void> logout() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('auth_token');
state = false;
}
}
final authProvider = StateNotifierProvider<AuthNotifier, bool>((ref) {
return AuthNotifier();
});