import 'package:flutter/material.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import '../theme.dart'; import '../widgets/avatar.dart'; /// 「新的同事」:收到的好友申请列表,可接受 / 拒绝 class NewFriendsScreen extends StatefulWidget { const NewFriendsScreen({super.key}); @override State createState() => _NewFriendsScreenState(); } class _NewFriendsScreenState extends State { List _list = []; bool _loading = true; bool _failed = false; @override void initState() { super.initState(); _load(); } Future _load() async { try { final list = await OpenIM.iMManager.friendshipManager.getFriendApplicationListAsRecipient(); if (!mounted) return; setState(() { _list = list; _loading = false; _failed = false; }); } catch (_) { if (!mounted) return; setState(() { _loading = false; _failed = true; }); } } Future _handle(FriendApplicationInfo a, bool accept) async { try { if (accept) { await OpenIM.iMManager.friendshipManager.acceptFriendApplication(userID: a.fromUserID ?? '', handleMsg: ''); } else { await OpenIM.iMManager.friendshipManager.refuseFriendApplication(userID: a.fromUserID ?? '', handleMsg: ''); } if (!mounted) return; setState(() => a.handleResult = accept ? 1 : -1); _toast(accept ? '已添加为同事' : '已拒绝'); } catch (_) { _toast('操作失败,请检查网络后重试'); } } void _toast(String text) { ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(text), duration: const Duration(seconds: 2))); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('新的同事')), body: _buildBody(), ); } Widget _buildBody() { if (_loading) { return const Center(child: CircularProgressIndicator(color: AppColors.primary)); } if (_failed) { return Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ const Text('申请列表没加载出来', style: TextStyle(fontSize: AppFont.body, color: AppColors.textPrimary)), const SizedBox(height: AppGap.x4), OutlinedButton(onPressed: _load, child: const Text('重试')), ], ), ); } if (_list.isEmpty) { return const Center( child: Text('暂时没有新的申请', style: TextStyle(fontSize: AppFont.sub, color: AppColors.textSecondary)), ); } return ListView.separated( itemCount: _list.length, separatorBuilder: (_, __) => const Divider(indent: 76), itemBuilder: (_, i) => _tile(_list[i]), ); } Widget _tile(FriendApplicationInfo a) { final name = a.fromNickname?.isNotEmpty == true ? a.fromNickname! : (a.fromUserID ?? ''); Widget trailing; if (a.handleResult == 1) { trailing = const Text('已添加', style: TextStyle(fontSize: AppFont.sub, color: AppColors.textSecondary)); } else if (a.handleResult == -1) { trailing = const Text('已拒绝', style: TextStyle(fontSize: AppFont.sub, color: AppColors.textSecondary)); } else { trailing = Row( mainAxisSize: MainAxisSize.min, children: [ FilledButton( onPressed: () => _handle(a, true), style: FilledButton.styleFrom( backgroundColor: AppColors.primary, minimumSize: const Size(0, 32), padding: const EdgeInsets.symmetric(horizontal: AppGap.x3), ), child: const Text('接受', style: TextStyle(fontSize: AppFont.sub)), ), const SizedBox(width: AppGap.x2), OutlinedButton( onPressed: () => _handle(a, false), style: OutlinedButton.styleFrom( minimumSize: const Size(0, 32), padding: const EdgeInsets.symmetric(horizontal: AppGap.x3), ), child: const Text('拒绝', style: TextStyle(fontSize: AppFont.sub)), ), ], ); } return ListTile( leading: NameAvatar(name: name), title: Text(name, style: const TextStyle(fontSize: AppFont.body)), subtitle: a.reqMsg?.isNotEmpty == true ? Text(a.reqMsg!, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(fontSize: AppFont.sub, color: AppColors.textSecondary)) : null, trailing: trailing, ); } }