import 'package:flutter/material.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import 'package:get/get.dart'; import 'package:openim_common/openim_common.dart'; import '../../../company/brand/app_tokens.dart'; import '../../../company/ui/state_views.dart'; import 'friend_requests_logic.dart'; class FriendRequestsPage extends StatelessWidget { final logic = Get.find(); FriendRequestsPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('新的同事')), backgroundColor: AppColors.pageBg, body: Obx(() { if (logic.loading.value) { return const CompanyLoadingView(); } if (logic.loadFailed.value) { return CompanyFailView(onRetry: logic.retry); } if (logic.applicationList.isEmpty) { return const CompanyEmptyView( icon: Icons.person_outline, title: '暂无同事申请', subtitle: '发出或收到的申请会显示在这里', ); } return ListView.builder( itemCount: logic.applicationList.length, itemBuilder: (_, index) => _buildItemView(logic.applicationList[index]), ); }), ); } Widget _buildItemView(FriendApplicationInfo info) { final isISendRequest = info.fromUserID == OpenIM.iMManager.userID; final name = isISendRequest ? info.toNickname : info.fromNickname; final faceURL = isISendRequest ? info.toFaceURL : info.fromFaceURL; final waiting = info.isWaitingHandle; final rejected = info.isRejected; final agreed = info.isAgreed; return Container( constraints: const BoxConstraints(minHeight: 72), padding: const EdgeInsets.symmetric( horizontal: AppGap.x4, vertical: AppGap.x3), decoration: const BoxDecoration( color: AppColors.pageBg, border: Border(bottom: BorderSide(color: AppColors.divider, width: 0.5)), ), child: Row( children: [ AvatarView(url: faceURL, text: name, width: 48, height: 48), const SizedBox(width: AppGap.x3), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( name ?? '', maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: AppFont.body, color: AppColors.textPrimary), ), if (IMUtils.isNotNullEmptyStr(info.reqMsg)) Text( info.reqMsg ?? '', maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( fontSize: AppFont.sub, color: AppColors.textSecondary), ), ], ), ), const SizedBox(width: AppGap.x2), if (waiting && isISendRequest) const Text('等待对方通过', style: TextStyle( fontSize: AppFont.sub, color: AppColors.textSecondary)), if (waiting && !isISendRequest) SizedBox( width: 132, child: Row( children: [ Expanded( child: OutlinedButton( onPressed: () => logic.refuseFriendApplication(info), style: OutlinedButton.styleFrom( minimumSize: const Size(0, 32), padding: EdgeInsets.zero, side: const BorderSide( color: AppColors.textSecondary, width: 0.5), foregroundColor: AppColors.textPrimary, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppRadius.control)), ), child: const Text('拒绝', style: TextStyle(fontSize: AppFont.sub)), ), ), const SizedBox(width: AppGap.x2), Expanded( child: FilledButton( onPressed: () => logic.acceptFriendApplication(info), style: FilledButton.styleFrom( minimumSize: const Size(0, 32), padding: EdgeInsets.zero, backgroundColor: AppColors.primary, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppRadius.control)), ), child: const Text('接受', style: TextStyle( fontSize: AppFont.sub, color: Colors.white)), ), ), ], ), ), if (agreed) const Text('已添加', style: TextStyle( fontSize: AppFont.sub, color: AppColors.textSecondary)), if (rejected) const Text('已拒绝', style: TextStyle( fontSize: AppFont.sub, color: AppColors.textSecondary)), ], ), ); } }