import 'dart:convert'; import 'package:get/get.dart'; import 'package:encrypt_shared_preferences/provider.dart'; import 'package:f0ckapp/models/user.dart'; class AuthController extends GetxController { final EncryptedSharedPreferencesAsync storage = EncryptedSharedPreferencesAsync.getInstance(); final GetConnect http = GetConnect(); RxnString token = RxnString(); Rxn user = Rxn(); RxBool isLoading = false.obs; RxnString error = RxnString(); @override void onInit() { super.onInit(); loadToken(); } Future loadToken() async { token.value = await storage.getString('token'); if (token.value != null) { await fetchUserInfo(); } } Future saveToken(String newToken) async { token.value = newToken; await storage.setString('token', newToken); await fetchUserInfo(); } Future logout() async { if (token.value != null) { try { await http.post( 'https://api.f0ck.me/logout', {}, headers: { 'Authorization': 'Bearer ${token.value}', 'Content-Type': 'application/json', }, ); } catch (_) {} } token.value = null; user.value = null; await storage.remove('token'); } Future login(String username, String password) async { isLoading.value = true; error.value = null; try { final Response response = await http.post( 'https://api.f0ck.me/login', json.encode({'username': username, 'password': password}), headers: {'Content-Type': 'application/json'}, ); if (response.statusCode == 200) { final dynamic data = response.body is String ? json.decode(response.body) : response.body; if (data['token'] != null) { await saveToken(data['token']); user.value = User.fromJson(data); return true; } else { error.value = 'Kein Token erhalten'; } } else { error.value = 'Login fehlgeschlagen'; } } catch (e) { error.value = e.toString(); } finally { isLoading.value = false; } return false; } Future fetchUserInfo() async { if (token.value == null) return; try { final Response response = await http.get( 'https://api.f0ck.me/login/check', headers: {'Authorization': 'Bearer ${token.value}'}, ); if (response.statusCode == 200) { final dynamic data = response.body is String ? json.decode(response.body) : response.body; user.value = User.fromJson(data); } else { await logout(); } } catch (_) { await logout(); } } bool get isLoggedIn => token.value != null && token.value!.isNotEmpty; }