flutter/lib/utils/notification_banner.dart
2025-09-13 17:01:01 +08:00

96 lines
3.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:loopin/IM/im_service.dart';
import 'package:loopin/components/network_or_asset_image.dart';
import 'package:loopin/utils/parse_message_summary.dart';
import 'package:shirne_dialog/shirne_dialog.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
class NotificationBanner {
static void show(V2TimMessage msg, bool isGroup) async {
String name = '';
String avatar = '';
if (isGroup) {
final res = await ImService.instance.getGroupsInfo(groupIDList: [msg.groupID!]);
if (res.success && res.data != null) {
V2TimGroupInfo? gpInfo = res.data!.first.groupInfo;
name = gpInfo?.groupName ?? "未知群名";
avatar = gpInfo?.faceUrl ?? "";
} else {
name = '获取群名称失败';
}
} else {
name = msg.nameCard ?? msg.nickName ?? msg.senderProfile?.nickName ?? msg.sender ?? '未知用户';
avatar = msg.faceUrl ?? msg.senderProfile?.faceUrl ?? '';
}
final text = parseMessageSummary(msg);
Get.snackbar(
name,
text,
duration: const Duration(seconds: 3),
snackPosition: SnackPosition.TOP,
margin: const EdgeInsets.all(12),
backgroundColor: Get.theme.cardColor,
colorText: Get.theme.textTheme.bodyLarge?.color,
icon: ClipOval(
child: NetworkOrAssetImage(
imageUrl: avatar,
placeholderAsset: isGroup ? 'assets/images/group.png' : 'assets/images/avatar/default.png',
),
),
onTap: (_) async {
// 点击后立刻关闭
Get.closeCurrentSnackbar();
String? conversationID;
if (msg.groupID != null && msg.groupID!.isNotEmpty) {
conversationID = 'group_${msg.groupID}';
} else if (msg.userID != null && msg.userID!.isNotEmpty) {
conversationID = 'c2c_${msg.userID}';
}
final cRes = await ImService.instance.getConversation(conversationID: conversationID!);
if (cRes.success) {
if (msg.userID != null) {
// 单聊消息
Get.toNamed('/chat', arguments: cRes.data);
} else if (msg.groupID != null) {
Get.toNamed('/chatGroup', arguments: cRes.data);
}
} else {
// 异常
MyDialog.toast(cRes.desc, icon: Icon(Icons.warning), style: ToastStyle(backgroundColor: Colors.red.withAlpha(200)));
}
},
);
}
/// 被关注通知
static void foucs(V2TimUserFullInfo msg) {
final nickname = msg.nickName ?? '未知用户';
final avatar = msg.faceUrl ?? '';
final text = '$nickname:关注了你';
Get.snackbar(
'新的关注',
text,
duration: const Duration(seconds: 5),
snackPosition: SnackPosition.TOP,
margin: const EdgeInsets.all(12),
backgroundColor: Get.theme.cardColor,
colorText: Get.theme.textTheme.bodyLarge?.color,
icon: avatar.isNotEmpty
? CircleAvatar(
backgroundImage: NetworkImage(avatar),
radius: 16,
)
: null,
onTap: (_) async {
// 点击后立刻关闭
Get.closeCurrentSnackbar();
// 跳转到新关注我的页面
},
);
}
}