import "dart:convert"; import "package:dio/dio.dart"; import "package:flash_mail/data/providers/providers.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flash_mail/data/models/account/account.dart"; import "package:flash_mail/data/models/message/message.dart"; import "package:flash_mail/data/models/message_detail/message_detail.dart"; import "package:flash_mail/shared/utils/random_string.dart"; class ApiClient { final Dio dio; final Ref ref; ApiClient(this.dio, this.ref); Future generateToken(String address, String password) async { final tokenResponse = await dio.post( "/token", data: jsonEncode({"address": address, "password": password}), ); final Map tokenData = tokenResponse.data as Map; ref.read(tokenProvider.notifier).state = tokenData["token"]; } Future createAccount() async { final response = await dio.get("/domains"); final Map data = response.data as Map; final List> domains = List.from(data["hydra:member"]); final username = randomString(7); final domain = domains[0]["domain"]; Map payload = { "address": "$username@$domain", "password": randomString(10), }; final userResponse = await dio.post( "/accounts", data: jsonEncode(payload), ); final Map info = userResponse.data as Map; payload["address"] = info["address"]; await generateToken( payload["address"] as String, payload["password"] as String, ); return TMAccount( id: info["id"], email: info["address"], password: payload["password"]!, quota: info["quota"], used: info["used"], ); } Future login(String address, String password) async { final response = await dio.post( "/token", data: jsonEncode({"address": address, "password": password}), ); final Map tokenData = response.data as Map; ref.read(tokenProvider.notifier).state = tokenData["token"]; final userId = tokenData["id"]; final options = Options(headers: { "Authorization": "Bearer ${tokenData["token"]}", }); final userResponse = await dio.get("/accounts/$userId", options: options); final Map info = userResponse.data as Map; return TMAccount( id: info["id"], email: address, password: password, quota: info["quota"], used: info["used"], ); } Future> fetchMessages(String email, String password) async { if (ref.read(tokenProvider) == null) { await generateToken(email, password); } final token = ref.read(tokenProvider); final options = Options(headers: {"Authorization": "Bearer $token"}); final response = await dio.get("/messages", options: options); Map messageData = response.data as Map; final messages = List>.from(messageData["hydra:member"]); return messages.map((message) => TMMessage.fromJson(message)).toList(); } Future fetchMessageDetail(String id) async { if (ref.read(tokenProvider) == null) throw Exception("Token not found"); final token = ref.read(tokenProvider); final options = Options(headers: {"Authorization": "Bearer $token"}); final response = await dio.get("/messages/$id", options: options); Map messageData = response.data as Map; return TMMessageDetail.fromJson(messageData); } Future deleteMessage(String id) async { if (ref.read(tokenProvider) == null) throw Exception("Token not found"); final token = ref.read(tokenProvider); final options = Options(headers: {"Authorization": "Bearer $token"}); await dio.delete("/messages/$id", options: options); } }