// 家长中心 BLoC — 管理家长-孩子绑定和数据操作 // // 状态机: ParentInitial → ParentLoading → ParentChildrenLoaded / ParentJournalsLoaded / ParentDataExported / ParentDataDeleted / ParentError // API: /diary/parent/* 端点 import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../data/remote/api_client.dart'; part 'parent_event.dart'; part 'parent_state.dart'; /// 家长中心 BLoC — 处理孩子绑定、日记查看、数据导出/删除 class ParentBloc extends Bloc { final ApiClient _api; ParentBloc({required ApiClient api}) : _api = api, super(const ParentInitial()) { on(_onLoadChildren); on(_onBindChild); on(_onViewJournals); on(_onExportData); on(_onDeleteData); on(_onUnbindChild); } /// 加载已绑定的孩子列表 Future _onLoadChildren( ParentLoadChildren event, Emitter emit, ) async { emit(const ParentLoading()); try { final response = await _api.get('/diary/parent/children'); final body = response.data as Map; final items = body['data'] as List? ?? []; final children = items .map((j) => ChildBinding.fromJson(j as Map)) .toList(); emit(ParentChildrenLoaded(children)); } catch (e) { emit(const ParentError('加载孩子列表失败')); } } /// 绑定孩子(输入孩子 ID) Future _onBindChild( ParentBindChild event, Emitter emit, ) async { emit(const ParentLoading()); try { await _api.post('/diary/parent/bind', data: { 'child_id': event.childId, }); // 绑定成功后重新加载列表 add(const ParentLoadChildren()); } catch (e) { emit(const ParentError('绑定失败,请检查孩子 ID')); } } /// 查看孩子日记(只读) Future _onViewJournals( ParentViewJournals event, Emitter emit, ) async { emit(const ParentLoading()); try { final response = await _api.get( '/diary/parent/journals', queryParams: { 'child_id': event.childId, 'page': 1, 'page_size': 50, }, ); final body = response.data as Map; final items = body['data'] as List? ?? []; emit(ParentJournalsLoaded( childId: event.childId, journals: items.cast>(), )); } catch (e) { emit(const ParentError('加载日记失败')); } } /// 导出孩子数据(PIPL 合规) Future _onExportData( ParentExportData event, Emitter emit, ) async { emit(const ParentLoading()); try { final response = await _api.get( '/diary/parent/export', queryParams: {'child_id': event.childId}, ); emit(ParentDataExported( childId: event.childId, data: response.data as Map, )); } catch (e) { emit(const ParentError('导出失败')); } } /// 删除孩子数据(PIPL 合规,需二次确认) Future _onDeleteData( ParentDeleteData event, Emitter emit, ) async { emit(const ParentLoading()); try { await _api.delete('/diary/parent/data', data: { 'child_id': event.childId, }); emit(ParentDataDeleted(event.childId)); } catch (e) { emit(const ParentError('删除失败')); } } /// 解绑孩子 Future _onUnbindChild( ParentUnbindChild event, Emitter emit, ) async { try { await _api.delete('/diary/parent/bind', data: { 'child_id': event.childId, }); add(const ParentLoadChildren()); } catch (e) { emit(const ParentError('解绑失败')); } } }