import "dart:typed_data"; import "../config/api_config.dart"; import "../models/family_member.dart"; import "api_client.dart"; import "mock_data.dart"; class FamilyService { final ApiClient _client; FamilyService(this._client); Future> fetchFamilyMembers() async { if (ApiConfig.useMockData) { return List.from(MockDataStore.familyMembers); } final data = await _client.getList(ApiConfig.family); return data .map((item) => FamilyMember.fromJson(item as Map)) .toList(); } Future createFamilyMember(FamilyMember member) async { if (ApiConfig.useMockData) { final created = FamilyMember( id: "family-${DateTime.now().millisecondsSinceEpoch}", name: member.name, iconUrl: member.iconUrl, emoji: member.emoji, color: member.color, order: member.order, ); MockDataStore.familyMembers.add(created); return created; } final data = await _client.post(ApiConfig.family, member.toJson()); return FamilyMember.fromJson(data); } Future updateFamilyMember(FamilyMember member) async { if (ApiConfig.useMockData) { final index = MockDataStore.familyMembers.indexWhere( (item) => item.id == member.id, ); if (index != -1) { MockDataStore.familyMembers[index] = member; } return member; } final data = await _client.put( "${ApiConfig.family}/${member.id}", member.toJson(), ); return FamilyMember.fromJson(data); } Future uploadFamilyIcon({ required Uint8List bytes, required String filename, }) async { if (ApiConfig.useMockData) { return "mock://$filename"; } final data = await _client.postMultipart( "${ApiConfig.family}/upload-icon", fieldName: "file", bytes: bytes, filename: filename, ); return data["url"] as String? ?? ""; } Future deleteFamilyMember(String id) async { if (ApiConfig.useMockData) { MockDataStore.familyMembers.removeWhere((item) => item.id == id); return; } await _client.delete("${ApiConfig.family}/$id"); } Future> fetchMembers() => fetchFamilyMembers(); Future createMember(FamilyMember member) => createFamilyMember(member); Future updateMember(FamilyMember member) => updateFamilyMember(member); Future deleteMember(String id) => deleteFamilyMember(id); }