// πŸ§‘β€πŸ€β€πŸ§‘ λ°±ν’ˆνƒ€ 친ꡬ λͺ©λ‘/μ‹ μ²­ ν™”λ©΄μ˜ κΈ°λŠ₯(μ„œλ²„ 톡신/μƒνƒœ) λ‹΄λ‹Ή 컨트둀러. import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; import '../config.dart'; class FriendController extends ChangeNotifier { final String studentId; final String studentName; FriendController({required this.studentId, required this.studentName}); bool _isLoading = true; bool _isBusy = false; List _friends = []; List _requests = []; bool _disposed = false; bool get isLoading => _isLoading; bool get isBusy => _isBusy; List get friends => _friends; List get requests => _requests; void _safeNotify() { if (!_disposed) notifyListeners(); } @override void dispose() { _disposed = true; super.dispose(); } Future init() async { await refresh(); } Future refresh() async { _isLoading = true; _safeNotify(); await Future.wait([_fetchFriends(), _fetchRequests()]); _isLoading = false; _safeNotify(); } Future _fetchFriends() async { try { final response = await http.get( Uri.parse('$baseUrl/api/friends/list?studentId=$studentId'), ); if (response.statusCode == 200) { final data = jsonDecode(utf8.decode(response.bodyBytes)); _friends = data['friends'] ?? []; } } catch (_) { // 쑰용히 λ¬΄μ‹œ } } Future _fetchRequests() async { try { final response = await http.get( Uri.parse('$baseUrl/api/friends/requests?studentId=$studentId'), ); if (response.statusCode == 200) { final data = jsonDecode(utf8.decode(response.bodyBytes)); _requests = data['requests'] ?? []; } } catch (_) { // 쑰용히 λ¬΄μ‹œ } } Future<(bool success, String message)> sendRequest(String friendId) async { _isBusy = true; _safeNotify(); try { final response = await http.post( Uri.parse('$baseUrl/api/friends/request'), headers: {"Content-Type": "application/json"}, body: jsonEncode({ "studentId": studentId, "studentName": studentName, "friendId": friendId.trim(), }), ); final result = jsonDecode(utf8.decode(response.bodyBytes)); if (response.statusCode == 200 && result['status'] == 'success') { return (true, '${result['message'] ?? '친ꡬ 신청을 λ³΄λƒˆμŠ΅λ‹ˆλ‹€.'}'); } return (false, '${result['message'] ?? '친ꡬ μ‹ μ²­ μ‹€νŒ¨'}'); } catch (e) { return (false, 'λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); } finally { _isBusy = false; _safeNotify(); } } Future<(bool success, String message)> respondRequest( int requestId, bool accept, ) async { _isBusy = true; _safeNotify(); try { final response = await http.post( Uri.parse('$baseUrl/api/friends/respond'), headers: {"Content-Type": "application/json"}, body: jsonEncode({ "requestId": requestId, "responderId": studentId, "accept": accept, }), ); final result = jsonDecode(utf8.decode(response.bodyBytes)); if (response.statusCode == 200 && result['status'] == 'success') { await refresh(); return (true, '${result['message'] ?? 'μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.'}'); } return (false, '${result['message'] ?? '처리 μ‹€νŒ¨'}'); } catch (e) { return (false, 'λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); } finally { _isBusy = false; _safeNotify(); } } Future<(bool success, String message)> removeFriend(String friendId) async { _isBusy = true; _safeNotify(); try { final response = await http.delete( Uri.parse('$baseUrl/api/friends'), headers: {"Content-Type": "application/json"}, body: jsonEncode({"studentId": studentId, "friendId": friendId}), ); final result = jsonDecode(utf8.decode(response.bodyBytes)); if (response.statusCode == 200 && result['status'] == 'success') { await _fetchFriends(); return (true, '${result['message'] ?? 'μ‚­μ œν–ˆμŠ΅λ‹ˆλ‹€.'}'); } return (false, '${result['message'] ?? 'μ‚­μ œ μ‹€νŒ¨'}'); } catch (e) { return (false, 'λ„€νŠΈμ›Œν¬ μ—λŸ¬: $e'); } finally { _isBusy = false; _safeNotify(); } } }