import 'dart:convert'; import 'package:get/get.dart'; import 'package:encrypt_shared_preferences/provider.dart'; import 'package:http/http.dart' as http; class AuthController extends GetxController { final EncryptedSharedPreferencesAsync storage = EncryptedSharedPreferencesAsync.getInstance(); RxnString token = RxnString(); RxnInt userId = RxnInt(); RxnString avatarUrl = RxnString(); RxnString username = RxnString(); 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( Uri.parse('https://api.f0ck.me/logout'), headers: { 'Authorization': 'Bearer ${token.value}', 'Content-Type': 'application/json', }, ); } catch (_) {} } token.value = null; userId.value = null; avatarUrl.value = null; username.value = null; await storage.remove('token'); } Future login(String username, String password) async { isLoading.value = true; error.value = null; try { final http.Response response = await http.post( Uri.parse('https://api.f0ck.me/login'), headers: {'Content-Type': 'application/json'}, body: json.encode({'username': username, 'password': password}), ); if (response.statusCode == 200) { final dynamic data = json.decode(response.body); if (data['token'] != null) { await saveToken(data['token']); userId.value = data['userid']; avatarUrl.value = data['avatar'] != null ? 'https://f0ck.me/t/${data['avatar']}.webp' : null; this.username.value = data['user']; 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 http.Response response = await http.get( Uri.parse('https://api.f0ck.me/login/check'), headers: {'Authorization': 'Bearer ${token.value}'}, ); if (response.statusCode == 200) { final dynamic data = json.decode(response.body); userId.value = data['userid'] != null ? int.tryParse(data['userid'].toString()) : null; avatarUrl.value = data['avatar'] != null ? 'https://f0ck.me/t/${data['avatar']}.webp' : null; username.value = data['user']; } else { await logout(); } } catch (_) { await logout(); } } bool get isLoggedIn => token.value != null && token.value!.isNotEmpty; }