import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/app_colors.dart'; import '../../core/navigation_provider.dart'; import '../../providers/data_providers.dart' show adminServiceProvider; class AdminDoctorsPage extends ConsumerStatefulWidget { const AdminDoctorsPage({super.key}); @override ConsumerState createState() => _AdminDoctorsPageState(); } class _AdminDoctorsPageState extends ConsumerState { List> _doctors = []; bool _loading = true; @override void initState() { super.initState(); _load(); } Future _load() async { setState(() => _loading = true); try { final res = await ref.read(adminServiceProvider).getDoctors(); if (res['code'] == 0 && mounted) { setState(() { _doctors = List>.from(res['data'] ?? []); _loading = false; }); } } catch (_) { if (mounted) setState(() => _loading = false); } } Future _toggleActive(String id) async { try { await ref.read(adminServiceProvider).toggleDoctorActive(id); _load(); } catch (_) {} } Future _delete(String id) async { final ok = await showDialog( context: context, builder: (ctx) => AlertDialog( title: const Text('确认删除'), content: const Text('删除后患者关联将被清除,确定吗?'), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: const Text('取消'), ), TextButton( onPressed: () => Navigator.pop(ctx, true), child: const Text('删除'), style: TextButton.styleFrom(foregroundColor: AppColors.error), ), ], ), ); if (ok == true) { try { await ref.read(adminServiceProvider).deleteDoctor(id); _load(); } catch (_) {} } } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.pageGrey, floatingActionButton: FloatingActionButton( backgroundColor: AppColors.primary, onPressed: () => pushRoute(ref, 'adminAddDoctor'), child: const Icon(Icons.add, color: Colors.white), ), body: _loading ? const Center(child: CircularProgressIndicator()) : _doctors.isEmpty ? const Center( child: Text( '暂无医生', style: TextStyle(color: AppColors.textHint, fontSize: 16), ), ) : ListView.builder( padding: const EdgeInsets.all(16), itemCount: _doctors.length, itemBuilder: (_, i) { final d = _doctors[i]; final active = d['isActive'] != false; return Card( margin: const EdgeInsets.only(bottom: 10), elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(14), side: const BorderSide(color: AppColors.border), ), child: Padding( padding: const EdgeInsets.all(14), child: Row( children: [ CircleAvatar( backgroundColor: active ? AppColors.successLight : AppColors.background, child: Icon( Icons.local_hospital, size: 20, color: active ? AppColors.success : AppColors.textHint, ), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Text( d['name'] ?? '', style: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, ), ), const SizedBox(width: 8), if (!active) Container( padding: const EdgeInsets.symmetric( horizontal: 6, vertical: 2, ), decoration: BoxDecoration( color: AppColors.errorLight, borderRadius: BorderRadius.circular(4), ), child: const Text( '已停用', style: TextStyle( fontSize: 10, color: AppColors.error, ), ), ), ], ), const SizedBox(height: 4), Text( '${d['title'] ?? ''} 路 ${d['department'] ?? ''}', style: const TextStyle( fontSize: 13, color: AppColors.textSecondary, ), ), if (d['professionalDirection'] != null) Text( d['professionalDirection']!, style: const TextStyle( fontSize: 12, color: AppColors.textHint, ), ), ], ), ), PopupMenuButton( onSelected: (v) { if (v == 'toggle') _toggleActive(d['id']); if (v == 'delete') _delete(d['id']); }, itemBuilder: (_) => [ PopupMenuItem( value: 'toggle', child: Text(active ? '停用' : '启用'), ), const PopupMenuItem( value: 'delete', child: Text( '删除', style: TextStyle(color: AppColors.error), ), ), ], ), ], ), ), ); }, ), ); } }