diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ebf4ea..84c20c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 2.5.1 + +## Improvements + +* Improved memory usage, enhancing performance. + # 2.5.0 ## Breaking Changes diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index 1ec0129..5b2a613 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -18,6 +18,7 @@ import path_provider_foundation import photo_manager import shared_preferences_foundation import sqflite +import tencent_cloud_chat_sdk import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { @@ -34,5 +35,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { PhotoManagerPlugin.register(with: registry.registrar(forPlugin: "PhotoManagerPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + TencentCloudChatSdkPlugin.register(with: registry.registrar(forPlugin: "TencentCloudChatSdkPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/example/pubspec.lock b/example/pubspec.lock index 98e0645..6143fde 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -648,14 +648,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.7" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.dev" - source: hosted - version: "4.8.1" just_audio: dependency: transitive description: @@ -884,50 +876,50 @@ packages: dependency: transitive description: name: path_provider - sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.1.2" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" url: "https://pub.dev" source: hosted - version: "2.0.27" + version: "2.2.2" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3" + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.2" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57 + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 url: "https://pub.dev" source: hosted - version: "2.1.11" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.1.1" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96" + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.2.1" permission_handler: dependency: transitive description: @@ -1233,41 +1225,41 @@ packages: dependency: transitive description: name: tencent_chat_i18n_tool - sha256: "0ee982e814bedd0aea4751b972901c6cfcfb224cfeb8e13ae02e43c0b8a58bbc" + sha256: d1e68f06a0cf8372eebd9a6b0f01f57e68b569cf909756ee6bdbbe625688debd url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" tencent_cloud_chat_sdk: dependency: transitive description: name: tencent_cloud_chat_sdk - sha256: "7dbb354209eca61f2c816c8ba7c1b1282dd5fb7e090135186bde56c89d976110" + sha256: a78f1f20dc9ebe40aee1bbb47da097780028434d77e97774fbe733debb21e18e url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "7.7.5296" tencent_cloud_chat_uikit: dependency: "direct main" description: path: ".." relative: true source: path - version: "2.5.0" + version: "2.5.1" tencent_cloud_uikit_core: dependency: transitive description: name: tencent_cloud_uikit_core - sha256: "60779d81e5e2591f2f637fb52388baaf004a8966005d1cbb9aab89efbd1945b9" + sha256: "7ddb2c034e5f832261ba268957e282b7c2e738acb1d21aa40c62dad4eaa433ea" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.5.2" tencent_im_base: dependency: transitive description: name: tencent_im_base - sha256: "52a99ef1c9dbd219530cf6f96a9891ab316f789b9b2c11634e0002d0a0f0f63c" + sha256: "035d97d24bebb87654700d4afc8227de8721a259ef5d0195f3207cb0eb0cdc7a" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.3.775296" tencent_im_sdk_plugin_desktop: dependency: "direct main" description: diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc index 3dddfa3..7c56a89 100644 --- a/example/windows/flutter/generated_plugin_registrant.cc +++ b/example/windows/flutter/generated_plugin_registrant.cc @@ -12,6 +12,7 @@ #include #include #include +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { @@ -27,6 +28,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("PasteboardPlugin")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + TencentCloudChatSdkPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("TencentCloudChatSdkPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/example/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake index 825d9fc..7243502 100644 --- a/example/windows/flutter/generated_plugins.cmake +++ b/example/windows/flutter/generated_plugins.cmake @@ -9,6 +9,7 @@ list(APPEND FLUTTER_PLUGIN_LIST image_clipboard pasteboard permission_handler_windows + tencent_cloud_chat_sdk url_launcher_windows ) diff --git a/lib/business_logic/separate_models/tui_chat_separate_view_model.dart b/lib/business_logic/separate_models/tui_chat_separate_view_model.dart index 89cbb45..ee02e0e 100644 --- a/lib/business_logic/separate_models/tui_chat_separate_view_model.dart +++ b/lib/business_logic/separate_models/tui_chat_separate_view_model.dart @@ -5,7 +5,6 @@ import 'dart:math'; import 'package:collection/collection.dart'; import 'package:flutter/cupertino.dart'; - // ignore: unnecessary_import import 'package:flutter/foundation.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart'; @@ -183,8 +182,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { final String groupID = TencentUtils.checkString(_groupID) ?? conversationID; - - if(filteredList.isNotEmpty){ + if (filteredList.isNotEmpty) { final res = await TencentImSDKPlugin.manager?.getGroupManager().getGroupMembersInfo(groupID: groupID, memberList: filteredList); if (res?.code == 0 && res?.data != null) { final data = res!.data; @@ -194,16 +192,14 @@ class TUIChatSeparateViewModel extends ChangeNotifier { _groupUserShowName[userInfo.userID] = showName ?? userInfo.userID; } } - if(data.isNotEmpty){ + if (data.isNotEmpty) { notifyListeners(); } } } - } - void initForEachConversation(ConvType convType, String convID, ValueChanged? onChangeInputField, - {String? groupID, List? preGroupMemberList}) async { + void initForEachConversation(ConvType convType, String convID, ValueChanged? onChangeInputField, {String? groupID, List? preGroupMemberList}) async { if (_isInit) { return; } @@ -217,49 +213,51 @@ class TUIChatSeparateViewModel extends ChangeNotifier { groupMemberList = null; selfMemberInfo = null; - if (conversationType == ConvType.group) { - _groupID = groupID; - globalModel.refreshGroupApplicationList(); - loadGroupInfo(groupID ?? convID); - if (preGroupMemberList != null) { - groupMemberList = preGroupMemberList; - selfMemberInfo = preGroupMemberList.firstWhereOrNull((e) => e?.userID == selfModel.loginInfo?.userID); - } else { - await loadSelfMemberInfo(groupID: groupID ?? convID); - loadGroupMemberList(groupID: groupID ?? convID); - } - if (selfMemberInfo == null) { - await loadSelfMemberInfo(groupID: groupID ?? convID); - } - } else { - notifyListeners(); - } - if (conversationType == ConvType.c2c) { - final List? friendRes = await _friendshipServices.getFriendsInfo(userIDList: [convID]); - if (friendRes != null && friendRes.isNotEmpty) { - final V2TimFriendInfoResult friendInfoResult = friendRes[0]; - currentChatUserInfo = V2TimGroupMemberFullInfo( - userID: convID, - faceUrl: friendInfoResult.friendInfo?.userProfile?.faceUrl, - nickName: friendInfoResult.friendInfo?.userProfile?.nickName, - friendRemark: friendInfoResult.friendInfo?.friendRemark); - } else { - final List? userRes = await _friendshipServices.getUsersInfo(userIDList: [convID]); - if (userRes != null && userRes.isNotEmpty) { - final V2TimUserFullInfo userFullInfo = userRes[0]; - currentChatUserInfo = V2TimGroupMemberFullInfo( - userID: convID, - faceUrl: userFullInfo.faceUrl, - nickName: userFullInfo.nickName, - ); - } - } - } - globalModel.lifeCycle = lifeCycle; globalModel.setCurrentConversation(CurrentConversation(conversationID, conversationType ?? ConvType.c2c)); + globalModel.lifeCycle = lifeCycle; globalModel.setMessageListPosition(conversationID, HistoryMessagePosition.bottom); globalModel.setChatConfig(chatConfig); globalModel.clearRecivedNewMessageCount(); + + if (conversationType == ConvType.group) { + _groupID = groupID; + notifyListeners(); + Future.delayed(const Duration(milliseconds: 10), () async { + globalModel.refreshGroupApplicationList(); + loadGroupInfo(groupID ?? convID); + if (preGroupMemberList != null) { + groupMemberList = preGroupMemberList; + selfMemberInfo = preGroupMemberList.firstWhereOrNull((e) => e?.userID == selfModel.loginInfo?.userID); + } else { + await loadSelfMemberInfo(groupID: groupID ?? convID); + loadGroupMemberList(groupID: groupID ?? convID); + } + if (selfMemberInfo == null) { + await loadSelfMemberInfo(groupID: groupID ?? convID); + } + }); + } else { + Future.delayed(const Duration(milliseconds: 10), () async { + final List? friendRes = await _friendshipServices.getFriendsInfo(userIDList: [convID]); + if (friendRes != null && friendRes.isNotEmpty) { + final V2TimFriendInfoResult friendInfoResult = friendRes[0]; + currentChatUserInfo = + V2TimGroupMemberFullInfo(userID: convID, faceUrl: friendInfoResult.friendInfo?.userProfile?.faceUrl, nickName: friendInfoResult.friendInfo?.userProfile?.nickName, friendRemark: friendInfoResult.friendInfo?.friendRemark); + } else { + final List? userRes = await _friendshipServices.getUsersInfo(userIDList: [convID]); + if (userRes != null && userRes.isNotEmpty) { + final V2TimUserFullInfo userFullInfo = userRes[0]; + currentChatUserInfo = V2TimGroupMemberFullInfo( + userID: convID, + faceUrl: userFullInfo.faceUrl, + nickName: userFullInfo.nickName, + ); + } + } + notifyListeners(); + }); + } + _isInit = true; Future.delayed(const Duration(milliseconds: 300), () { markMessageAsRead(); @@ -273,11 +271,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { haveMoreData = false; final previousResponse = await _messageService.getHistoryMessageListWithComplete( - count: 20, - getType: HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG, - userID: conversationType == ConvType.c2c ? conversationID : null, - groupID: conversationType == ConvType.group ? conversationID : null, - lastMsgSeq: max(seq, 0)); + count: 20, getType: HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG, userID: conversationType == ConvType.c2c ? conversationID : null, groupID: conversationType == ConvType.group ? conversationID : null, lastMsgSeq: max(seq, 0)); msgList = previousResponse?.messageList ?? []; haveMoreData = !(previousResponse?.isFinished ?? false); haveMoreLatestData = true; @@ -496,8 +490,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { groupMemberList?.clear(); } try { - final res = await _groupServices.getGroupMemberList( - groupID: groupID, filter: GroupMemberFilterTypeEnum.V2TIM_GROUP_MEMBER_FILTER_ALL, count: count, nextSeq: seq ?? groupMemberListSeq); + final res = await _groupServices.getGroupMemberList(groupID: groupID, filter: GroupMemberFilterTypeEnum.V2TIM_GROUP_MEMBER_FILTER_ALL, count: count, nextSeq: seq ?? groupMemberListSeq); final groupMemberListRes = res.data; if (res.code == 0 && groupMemberListRes != null) { final groupMemberListTemp = groupMemberListRes.memberInfoList ?? []; @@ -634,11 +627,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { notifyListeners(); } - return _sendMessage( - convID: convID, - id: textATMessageInfo.id as String, - convType: ConvType.group, - offlinePushInfo: tools.buildMessagePushInfo(textATMessageInfo.messageInfo!, convID, convType)); + return _sendMessage(convID: convID, id: textATMessageInfo.id as String, convType: ConvType.group, offlinePushInfo: tools.buildMessagePushInfo(textATMessageInfo.messageInfo!, convID, convType)); } return null; } @@ -663,8 +652,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { notifyListeners(); } - return _sendMessage( - convID: convID, id: textATMessageInfo.id as String, convType: convType, offlinePushInfo: tools.buildMessagePushInfo(textATMessageInfo.messageInfo!, convID, convType)); + return _sendMessage(convID: convID, id: textATMessageInfo.id as String, convType: convType, offlinePushInfo: tools.buildMessagePushInfo(textATMessageInfo.messageInfo!, convID, convType)); } return null; } @@ -690,11 +678,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { } return _sendMessage( - convID: convID, - id: textMessageInfo.id as String, - convType: convType, - messageInfo: lifeCycleMsg ?? messageInfoWithSender, - offlinePushInfo: tools.buildMessagePushInfo(textMessageInfo.messageInfo!, convID, convType)); + convID: convID, id: textMessageInfo.id as String, convType: convType, messageInfo: lifeCycleMsg ?? messageInfoWithSender, offlinePushInfo: tools.buildMessagePushInfo(textMessageInfo.messageInfo!, convID, convType)); } return null; } @@ -812,8 +796,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { }); } - Future?> sendImageMessage( - {String? imagePath, String? imageName, required String convID, dynamic inputElement, required ConvType convType}) async { + Future?> sendImageMessage({String? imagePath, String? imageName, required String convID, dynamic inputElement, required ConvType convType}) async { String? image; if ((PlatformUtils().isAndroid || PlatformUtils().isIOS) && imagePath != null && imagePath.isNotEmpty) { try { @@ -858,15 +841,10 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } - Future?> sendVideoMessage( - {String? videoPath, int? duration, String? snapshotPath, required String convID, required ConvType convType, dynamic inputElement}) async { + Future?> sendVideoMessage({String? videoPath, int? duration, String? snapshotPath, required String convID, required ConvType convType, dynamic inputElement}) async { List currentHistoryMsgList = getOriginMessageList(); - final videoMessageInfo = await _messageService.createVideoMessage( - videoPath: videoPath, - type: videoPath != null ? videoPath.split(".")[videoPath.split(".").length - 1] : 'mp4', - duration: duration, - inputElement: inputElement, - snapshotPath: snapshotPath); + final videoMessageInfo = + await _messageService.createVideoMessage(videoPath: videoPath, type: videoPath != null ? videoPath.split(".")[videoPath.split(".").length - 1] : 'mp4', duration: duration, inputElement: inputElement, snapshotPath: snapshotPath); final messageInfo = videoMessageInfo!.messageInfo; if (messageInfo != null) { final messageInfoWithSender = tools.setUserInfoForMessage(messageInfo, videoMessageInfo.id); @@ -895,8 +873,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } - Future?> sendFileMessage( - {String? filePath, String? fileName, int? size, dynamic inputElement, required String convID, required ConvType convType}) async { + Future?> sendFileMessage({String? filePath, String? fileName, int? size, dynamic inputElement, required String convID, required ConvType convType}) async { if (await tools.hasZeroSize(filePath ?? "")) { final CoreServicesImpl _coreServices = serviceLocator(); _coreServices.callOnCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: "不支持 0KB 文件的传输", infoCode: 6660417)); @@ -933,8 +910,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } - Future?> sendLocationMessage( - {required String desc, required double longitude, required double latitude, required String convID, required ConvType convType}) async { + Future?> sendLocationMessage({required String desc, required double longitude, required double latitude, required String convID, required ConvType convType}) async { List currentHistoryMsgList = getOriginMessageList(); final locationMessageInfo = await _messageService.createLocationMessage(desc: desc, longitude: longitude, latitude: latitude); final messageInfo = locationMessageInfo!.messageInfo; @@ -1120,8 +1096,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { notifyListeners(); } - return _sendMessage( - convID: convID, id: textMessageInfo.id as String, convType: convType, offlinePushInfo: tools.buildMessagePushInfo(textMessageInfo.messageInfo!, convID, convType)); + return _sendMessage(convID: convID, id: textMessageInfo.id as String, convType: convType, offlinePushInfo: tools.buildMessagePushInfo(textMessageInfo.messageInfo!, convID, convType)); } return null; } diff --git a/lib/business_logic/separate_models/tui_group_profile_model.dart b/lib/business_logic/separate_models/tui_group_profile_model.dart index c4378b2..2f0ad33 100644 --- a/lib/business_logic/separate_models/tui_group_profile_model.dart +++ b/lib/business_logic/separate_models/tui_group_profile_model.dart @@ -1,8 +1,6 @@ // ignore_for_file: unnecessary_getters_setters, avoid_print import 'package:flutter/cupertino.dart'; -import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart'; -import 'package:tencent_im_base/tencent_im_base.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/group_profile_life_cycle.dart'; import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; @@ -10,15 +8,15 @@ import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_ser import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart'; +import 'package:tencent_im_base/tencent_im_base.dart'; class TUIGroupProfileModel extends ChangeNotifier { final CoreServicesImpl _coreServices = serviceLocator(); final GroupServices _groupServices = serviceLocator(); - final ConversationService _conversationService = - serviceLocator(); + final ConversationService _conversationService = serviceLocator(); final MessageService _messageService = serviceLocator(); - final FriendshipServices _friendshipServices = - serviceLocator(); + final FriendshipServices _friendshipServices = serviceLocator(); GroupProfileLifeCycle? _lifeCycle; V2TimConversation? _conversation; @@ -74,8 +72,7 @@ class TUIGroupProfileModel extends ChangeNotifier { } loadGroupInfo(String groupID) async { - final groupInfo = - await _groupServices.getGroupsInfo(groupIDList: [groupID]); + final groupInfo = await _groupServices.getGroupsInfo(groupIDList: [groupID]); if (groupInfo != null) { final groupRes = groupInfo.first; if (groupRes.resultCode == 0) { @@ -85,34 +82,25 @@ class TUIGroupProfileModel extends ChangeNotifier { notifyListeners(); } - Future loadGroupMemberList( - {required String groupID, int count = 100, String? seq}) async { - final String? nextSeq = await _loadGroupMemberListFunction( - groupID: groupID, seq: seq, count: count); + Future loadGroupMemberList({required String groupID, int count = 100, String? seq}) async { + final String? nextSeq = await _loadGroupMemberListFunction(groupID: groupID, seq: seq, count: count); if (nextSeq != null && nextSeq != "0" && nextSeq != "") { - return await loadGroupMemberList( - groupID: groupID, count: count, seq: nextSeq); + return await loadGroupMemberList(groupID: groupID, count: count, seq: nextSeq); } else { notifyListeners(); } } - Future _loadGroupMemberListFunction( - {required String groupID, int count = 100, String? seq}) async { + Future _loadGroupMemberListFunction({required String groupID, int count = 100, String? seq}) async { if (seq == null || seq == "" || seq == "0") { _groupMemberList?.clear(); } - final res = await _groupServices.getGroupMemberList( - groupID: groupID, - filter: GroupMemberFilterTypeEnum.V2TIM_GROUP_MEMBER_FILTER_ALL, - count: count, - nextSeq: seq ?? _groupMemberListSeq); + final res = await _groupServices.getGroupMemberList(groupID: groupID, filter: GroupMemberFilterTypeEnum.V2TIM_GROUP_MEMBER_FILTER_ALL, count: count, nextSeq: seq ?? _groupMemberListSeq); final groupMemberListRes = res.data; if (res.code == 0 && groupMemberListRes != null) { final groupMemberListTemp = groupMemberListRes.memberInfoList ?? []; // TODO - outputLogger.i( - "loadGroupMemberListfinish,groupMemberListTemp, ${groupMemberListRes.nextSeq}, ${groupMemberListTemp.length}"); + outputLogger.i("loadGroupMemberListfinish,groupMemberListTemp, ${groupMemberListRes.nextSeq}, ${groupMemberListTemp.length}"); _groupMemberList = [...?_groupMemberList, ...groupMemberListTemp]; _groupMemberListSeq = groupMemberListRes.nextSeq ?? "0"; } @@ -120,8 +108,7 @@ class TUIGroupProfileModel extends ChangeNotifier { } _loadConversation() async { - conversation = await _conversationService.getConversation( - conversationID: "group_$_groupID"); + conversation = await _conversationService.getConversation(conversationID: "group_$_groupID"); } _loadContactList() async { @@ -130,31 +117,21 @@ class TUIGroupProfileModel extends ChangeNotifier { } pinedConversation(bool isPined) async { - await _conversationService.pinConversation( - conversationID: "group_$_groupID", isPinned: isPined); + await _conversationService.pinConversation(conversationID: "group_$_groupID", isPinned: isPined); conversation?.isPinned = isPined; notifyListeners(); } setMessageDisturb(bool value) async { - final res = await _messageService.setGroupReceiveMessageOpt( - groupID: _groupID, - opt: value - ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE - : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE); + final res = await _messageService.setGroupReceiveMessageOpt(groupID: _groupID, opt: value ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE); if (res.code == 0) { - conversation?.recvOpt = (value - ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE - : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE) - .index; + conversation?.recvOpt = (value ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE).index; } notifyListeners(); } - Future> searchGroupMember( - V2TimGroupMemberSearchParam searchParam) async { - final res = - await _groupServices.searchGroupMembers(searchParam: searchParam); + Future> searchGroupMember(V2TimGroupMemberSearchParam searchParam) async { + final res = await _groupServices.searchGroupMembers(searchParam: searchParam); if (res.code == 0) {} return res; @@ -164,12 +141,7 @@ class TUIGroupProfileModel extends ChangeNotifier { if (_groupInfo != null) { String? originalGroupName = _groupInfo?.groupName; _groupInfo?.groupName = groupName; - final response = await _groupServices.setGroupInfo( - info: V2TimGroupInfo.fromJson({ - "groupID": _groupID, - "groupType": _groupInfo!.groupType, - "groupName": groupName - })); + final response = await _groupServices.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupID": _groupID, "groupType": _groupInfo!.groupType, "groupName": groupName})); if (response.code != 0) { _groupInfo?.groupName = originalGroupName; } @@ -181,12 +153,7 @@ class TUIGroupProfileModel extends ChangeNotifier { setGroupNotification(String notification) async { if (_groupInfo != null) { - final response = await _groupServices.setGroupInfo( - info: V2TimGroupInfo.fromJson({ - "groupID": _groupID, - "groupType": _groupInfo!.groupType, - "notification": notification - })); + final response = await _groupServices.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupID": _groupID, "groupType": _groupInfo!.groupType, "notification": notification})); if (response.code == 0) { notifyListeners(); _groupInfo?.notification = notification; @@ -199,10 +166,7 @@ class TUIGroupProfileModel extends ChangeNotifier { final loginUserID = _coreServices.loginUserInfo?.userID; String nameCard = ""; if (_groupMemberList != null) { - nameCard = groupMemberList - .firstWhere((element) => element?.userID == loginUserID) - ?.nameCard ?? - ""; + nameCard = groupMemberList.firstWhere((element) => element?.userID == loginUserID)?.nameCard ?? ""; } return nameCard; @@ -214,11 +178,9 @@ class TUIGroupProfileModel extends ChangeNotifier { Future setNameCard(String nameCard) async { final loginUserID = _coreServices.loginUserInfo?.userID; if (loginUserID != null) { - final res = await _groupServices.setGroupMemberInfo( - groupID: _groupID, userID: loginUserID, nameCard: nameCard); + final res = await _groupServices.setGroupMemberInfo(groupID: _groupID, userID: loginUserID, nameCard: nameCard); if (res.code == 0) { - final targetIndex = _groupMemberList - ?.indexWhere((element) => element?.userID == loginUserID); + final targetIndex = _groupMemberList?.indexWhere((element) => element?.userID == loginUserID); if (targetIndex != -1) { _groupMemberList![targetIndex!]!.nameCard = nameCard; notifyListeners(); @@ -233,12 +195,7 @@ class TUIGroupProfileModel extends ChangeNotifier { if (_groupInfo != null) { int? originalAddopt = _groupInfo?.groupAddOpt; _groupInfo?.groupAddOpt = addOpt; - final response = await _groupServices.setGroupInfo( - info: V2TimGroupInfo.fromJson({ - "groupID": _groupID, - "groupType": _groupInfo!.groupType, - "groupAddOpt": addOpt - })); + final response = await _groupServices.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupID": _groupID, "groupType": _groupInfo!.groupType, "groupAddOpt": addOpt})); if (response.code != 0) { _groupInfo?.groupAddOpt = originalAddopt; } @@ -249,13 +206,9 @@ class TUIGroupProfileModel extends ChangeNotifier { } Future setMemberToNormal(String userID) async { - final res = await _groupServices.setGroupMemberRole( - groupID: _groupID, - userID: userID, - role: GroupMemberRoleTypeEnum.V2TIM_GROUP_MEMBER_ROLE_MEMBER); + final res = await _groupServices.setGroupMemberRole(groupID: _groupID, userID: userID, role: GroupMemberRoleTypeEnum.V2TIM_GROUP_MEMBER_ROLE_MEMBER); if (res.code == 0) { - final targetIndex = - _groupMemberList!.indexWhere((e) => e!.userID == userID); + final targetIndex = _groupMemberList!.indexWhere((e) => e!.userID == userID); if (targetIndex != -1) { final targetElem = _groupMemberList![targetIndex]; targetElem?.role = GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_MEMBER; @@ -267,13 +220,9 @@ class TUIGroupProfileModel extends ChangeNotifier { } Future setMemberToAdmin(String userID) async { - final res = await _groupServices.setGroupMemberRole( - groupID: _groupID, - userID: userID, - role: GroupMemberRoleTypeEnum.V2TIM_GROUP_MEMBER_ROLE_ADMIN); + final res = await _groupServices.setGroupMemberRole(groupID: _groupID, userID: userID, role: GroupMemberRoleTypeEnum.V2TIM_GROUP_MEMBER_ROLE_ADMIN); if (res.code == 0) { - final targetIndex = - _groupMemberList!.indexWhere((e) => e!.userID == userID); + final targetIndex = _groupMemberList!.indexWhere((e) => e!.userID == userID); if (targetIndex != -1) { final targetElem = _groupMemberList![targetIndex]; targetElem?.role = GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN; @@ -286,21 +235,18 @@ class TUIGroupProfileModel extends ChangeNotifier { bool canInviteMember() { final groupType = _groupInfo?.groupType; - return groupType == GroupType.Work; + return groupType == GroupType.Work || groupType == "Private"; } bool canKickOffMember() { - final isGroupOwner = - _groupInfo?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER; - final isAdmin = - _groupInfo?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN; + final isGroupOwner = _groupInfo?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER; + final isAdmin = _groupInfo?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN; if (_groupInfo?.groupType == GroupType.Work) { /// work 群主才能踢人 return isGroupOwner; } - if (_groupInfo?.groupType == GroupType.Public || - _groupInfo?.groupType == GroupType.Meeting) { + if (_groupInfo?.groupType == GroupType.Public || _groupInfo?.groupType == GroupType.Meeting) { /// public || meeting 群主和管理员可以踢人 return isGroupOwner || isAdmin; } @@ -311,12 +257,7 @@ class TUIGroupProfileModel extends ChangeNotifier { Future setMuteAll(bool muteAll) async { if (_groupInfo != null) { _groupInfo?.isAllMuted = muteAll; - final response = await _groupServices.setGroupInfo( - info: V2TimGroupInfo.fromJson({ - "groupID": _groupInfo!.groupID, - "groupType": _groupInfo!.groupType, - "isAllMuted": muteAll - })); + final response = await _groupServices.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupID": _groupInfo!.groupID, "groupType": _groupInfo!.groupType, "isAllMuted": muteAll})); if (response.code != 0) { _groupInfo?.isAllMuted = muteAll; } @@ -326,14 +267,11 @@ class TUIGroupProfileModel extends ChangeNotifier { return null; } - Future muteGroupMember( - String userID, bool isMute, int? serverTime) async { + Future muteGroupMember(String userID, bool isMute, int? serverTime) async { const muteTime = 315360000; - final res = await _groupServices.muteGroupMember( - groupID: _groupID, userID: userID, seconds: isMute ? muteTime : 0); + final res = await _groupServices.muteGroupMember(groupID: _groupID, userID: userID, seconds: isMute ? muteTime : 0); if (res.code == 0) { - final targetIndex = - _groupMemberList!.indexWhere((e) => e!.userID == userID); + final targetIndex = _groupMemberList!.indexWhere((e) => e!.userID == userID); if (targetIndex != -1) { final targetElem = _groupMemberList![targetIndex]; targetElem?.muteUntil = isMute ? (serverTime ?? 0) + muteTime : 0; @@ -345,15 +283,12 @@ class TUIGroupProfileModel extends ChangeNotifier { } Future kickOffMember(List userIDs) async { - final res = await _groupServices.kickGroupMember( - groupID: _groupID, memberList: userIDs); + final res = await _groupServices.kickGroupMember(groupID: _groupID, memberList: userIDs); return res; } - Future>> - inviteUserToGroup(List userIDS) async { - final res = await _groupServices.inviteUserToGroup( - groupID: _groupID, userList: userIDS); + Future>> inviteUserToGroup(List userIDS) async { + final res = await _groupServices.inviteUserToGroup(groupID: _groupID, userList: userIDS); return res; } } diff --git a/lib/business_logic/view_models/tui_chat_global_model.dart b/lib/business_logic/view_models/tui_chat_global_model.dart index de859fc..9a0b5f6 100644 --- a/lib/business_logic/view_models/tui_chat_global_model.dart +++ b/lib/business_logic/view_models/tui_chat_global_model.dart @@ -198,7 +198,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass { clearCurrentConversation() { // Only keep the last 20 messages when existing a chat. - _messageListMap[currentSelectedConv] = (_messageListMap[currentSelectedConv] ?? []).sublist(max(0, ((_messageListMap[currentSelectedConv] ?? []).length - 20))); + _messageListMap[currentSelectedConv] = (_messageListMap[currentSelectedConv] ?? []).sublist(max(0, ((_messageListMap[currentSelectedConv] ?? []).length - 10))); if (_currentConversationList.isNotEmpty) { _currentConversationList.removeLast(); } @@ -271,7 +271,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass { if (conversationItem == null || conversationItem.type == null) { return; } - final conversationID = conversationItem.userID ?? conversationItem.groupID ?? conversationItem.conversationID; + final conversationID = TencentUtils.checkString(conversationItem.userID) ?? TencentUtils.checkString(conversationItem.groupID) ?? conversationItem.conversationID; if (messageListMap[conversationID] == null || messageListMap[conversationID]!.isEmpty) { index++; Future.delayed(Duration(milliseconds: 500 * index), () { @@ -535,7 +535,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass { }); } _receivedNewMessageCount = 0; - final currentMsg = _messageListMap[convID] ?? []; + final tempCurrentMsgList = _messageListMap[convID] ?? []; + final currentMsg = tempCurrentMsgList..sublist(max(0, (tempCurrentMsgList.length - 30))); _messageListMap[convID] = [newMsg, ...currentMsg]; notifyListeners(); final messageID = newMsg.msgID; diff --git a/lib/business_logic/view_models/tui_conversation_view_model.dart b/lib/business_logic/view_models/tui_conversation_view_model.dart index acdcde7..eca132d 100644 --- a/lib/business_logic/view_models/tui_conversation_view_model.dart +++ b/lib/business_logic/view_models/tui_conversation_view_model.dart @@ -1,18 +1,17 @@ // ignore_for_file: unnecessary_getters_setters import 'package:flutter/material.dart'; -import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/conversation_life_cycle.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; -import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; -List removeDuplicates( - List list, bool Function(T first, T second) isEqual) { +List removeDuplicates(List list, bool Function(T first, T second) isEqual) { List output = []; for (var i = 0; i < list.length; i++) { bool found = false; @@ -30,14 +29,10 @@ List removeDuplicates( } class TUIConversationViewModel extends ChangeNotifier { - final TUISelfInfoViewModel selfInfoViewModel = - serviceLocator(); - final ConversationService _conversationService = - serviceLocator(); - final FriendshipServices _friendshipServices = - serviceLocator(); - final TUIChatGlobalModel _chatGlobalModel = - serviceLocator(); + final TUISelfInfoViewModel selfInfoViewModel = serviceLocator(); + final ConversationService _conversationService = serviceLocator(); + final FriendshipServices _friendshipServices = serviceLocator(); + final TUIChatGlobalModel _chatGlobalModel = serviceLocator(); final MessageService _messageService = serviceLocator(); late V2TimConversationListener _conversationListener; List _conversationList = []; @@ -47,8 +42,7 @@ class TUIConversationViewModel extends ChangeNotifier { bool _haveMoreData = true; int _totalUnReadCount = 0; String? _scrollToConversation; - final TUIChatGlobalModel globalChatModel = - serviceLocator(); + final TUIChatGlobalModel globalChatModel = serviceLocator(); String _nextSeq = "0"; ConversationLifeCycle? _lifeCycle; @@ -57,13 +51,10 @@ class TUIConversationViewModel extends ChangeNotifier { if (PlatformUtils().isWeb) { try { _conversationList.sort((a, b) { - return b!.lastMessage!.timestamp! - .compareTo(a!.lastMessage!.timestamp!); + return b!.lastMessage!.timestamp!.compareTo(a!.lastMessage!.timestamp!); }); - final pinnedConversation = _conversationList - .where((element) => element?.isPinned == true) - .toList(); + final pinnedConversation = _conversationList.where((element) => element?.isPinned == true).toList(); _conversationList.removeWhere((element) => element?.isPinned == true); _conversationList = [...pinnedConversation, ..._conversationList]; // ignore: empty_catches @@ -118,8 +109,7 @@ class TUIConversationViewModel extends ChangeNotifier { } TUIConversationViewModel() { - _conversationListener = - V2TimConversationListener(onConversationChanged: (conversationList) { + _conversationListener = V2TimConversationListener(onConversationChanged: (conversationList) { _onConversationListChanged(conversationList); }, onNewConversation: (conversationList) { _addNewConversation(conversationList); @@ -128,17 +118,19 @@ class TUIConversationViewModel extends ChangeNotifier { _chatGlobalModel.totalUnReadCount = totalUnread; notifyListeners(); }, onSyncServerFinish: () { - if (!PlatformUtils().isWeb) { - loadInitConversation(); - } + // Remove the process to load such a many of conversations after launching + // if (!PlatformUtils().isWeb) { + // loadInitConversation(); + // } }); } loadInitConversation() async { await loadData(count: 40); - if (selfInfoViewModel.globalConfig?.isPreloadMessagesAfterInit ?? true) { - _chatGlobalModel.initMessageMapFromLocalDatabase(_conversationList); - } + // Remove the process to load such a many of conversations after launching + // if (selfInfoViewModel.globalConfig?.isPreloadMessagesAfterInit ?? true) { + // _chatGlobalModel.initMessageMapFromLocalDatabase(_conversationList); + // } } initConversation() async { @@ -149,8 +141,7 @@ class TUIConversationViewModel extends ChangeNotifier { Future loadData({required int count}) async { _haveMoreData = true; final isRefresh = _nextSeq == "0"; - final conversationResult = await _conversationService.getConversationList( - nextSeq: _nextSeq, count: count); + final conversationResult = await _conversationService.getConversationList(nextSeq: _nextSeq, count: count); _nextSeq = conversationResult?.nextSeq ?? ""; final conversationList = conversationResult?.conversationList; if (conversationList != null) { @@ -163,12 +154,8 @@ class TUIConversationViewModel extends ChangeNotifier { } else { combinedConversationList = [..._conversationList, ...conversationList]; } - final List finalConversationList = await _lifeCycle - ?.conversationListWillMount(combinedConversationList) ?? - combinedConversationList; - _conversationList = removeDuplicates( - finalConversationList, - (item1, item2) => item1?.conversationID == item2?.conversationID); + final List finalConversationList = await _lifeCycle?.conversationListWillMount(combinedConversationList) ?? combinedConversationList; + _conversationList = removeDuplicates(finalConversationList, (item1, item2) => item1?.conversationID == item2?.conversationID); notifyListeners(); } _totalUnReadCount = await _conversationService.getTotalUnreadCount(); @@ -185,15 +172,11 @@ class TUIConversationViewModel extends ChangeNotifier { required String conversationID, required bool isPinned, }) { - return _conversationService.pinConversation( - conversationID: conversationID, isPinned: isPinned); + return _conversationService.pinConversation(conversationID: conversationID, isPinned: isPinned); } - Future clearHistoryMessage( - {required String convID, required int convType}) async { - if (_lifeCycle?.shouldClearHistoricalMessageForConversation != null && - await _lifeCycle!.shouldClearHistoricalMessageForConversation(convID) == - false) { + Future clearHistoryMessage({required String convID, required int convType}) async { + if (_lifeCycle?.shouldClearHistoricalMessageForConversation != null && await _lifeCycle!.shouldClearHistoricalMessageForConversation(convID) == false) { return null; } @@ -207,22 +190,17 @@ class TUIConversationViewModel extends ChangeNotifier { } searchFriends(String searchKey) async { - final res = await _friendshipServices.searchFriends( - searchParam: V2TimFriendSearchParam(keywordList: [searchKey])); + final res = await _friendshipServices.searchFriends(searchParam: V2TimFriendSearchParam(keywordList: [searchKey])); return res; } - Future deleteConversation( - {required String conversationID}) async { - if (_lifeCycle?.shouldDeleteConversation != null && - await _lifeCycle!.shouldDeleteConversation(conversationID) == false) { + Future deleteConversation({required String conversationID}) async { + if (_lifeCycle?.shouldDeleteConversation != null && await _lifeCycle!.shouldDeleteConversation(conversationID) == false) { return null; } - final res = await _conversationService.deleteConversation( - conversationID: conversationID); + final res = await _conversationService.deleteConversation(conversationID: conversationID); if (res.code == 0) { - _conversationList - .removeWhere((element) => element?.conversationID == conversationID); + _conversationList.removeWhere((element) => element?.conversationID == conversationID); notifyListeners(); } return res; @@ -230,8 +208,7 @@ class TUIConversationViewModel extends ChangeNotifier { _onConversationListChanged(List list) { for (int element = 0; element < list.length; element++) { - int index = _conversationList.indexWhere( - (item) => item!.conversationID == list[element].conversationID); + int index = _conversationList.indexWhere((item) => item!.conversationID == list[element].conversationID); if (index > -1) { _conversationList.setAll(index, [list[element]]); } else { @@ -244,19 +221,16 @@ class TUIConversationViewModel extends ChangeNotifier { _addNewConversation(List list) { _conversationList.addAll(list); - _conversationList = removeDuplicates(_conversationList, - (item1, item2) => item1?.conversationID == item2?.conversationID); + _conversationList = removeDuplicates(_conversationList, (item1, item2) => item1?.conversationID == item2?.conversationID); notifyListeners(); } setConversationListener() { - _conversationService.addConversationListener( - listener: _conversationListener); + _conversationService.addConversationListener(listener: _conversationListener); } removeConversationListener() { - _conversationService.removeConversationListener( - listener: _conversationListener); + _conversationService.removeConversationListener(listener: _conversationListener); } Future setConversationDraft({ @@ -266,25 +240,19 @@ class TUIConversationViewModel extends ChangeNotifier { String? groupID, bool isAllowWeb = true, }) async { - assert(!isTopic || (groupID != null && groupID.isNotEmpty), - "When 'isTopic' is true, 'groupID' must not be null or empty."); + assert(!isTopic || (groupID != null && groupID.isNotEmpty), "When 'isTopic' is true, 'groupID' must not be null or empty."); if (PlatformUtils().isWeb && isAllowWeb) { webDraftMap[conversationID] = draftText ?? ""; return V2TimCallback(code: 0, desc: ""); } else { if (isTopic) { - final topicInfoList = await TencentImSDKPlugin.v2TIMManager - .getGroupManager() - .getTopicInfoList(groupID: groupID!, topicIDList: [conversationID]); + final topicInfoList = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getTopicInfoList(groupID: groupID!, topicIDList: [conversationID]); final topicInfo = topicInfoList.data?.first.topicInfo; topicInfo?.draftText = draftText; - final res = await TencentImSDKPlugin.v2TIMManager - .getGroupManager() - .setTopicInfo(groupID: groupID, topicInfo: topicInfo!); + final res = await TencentImSDKPlugin.v2TIMManager.getGroupManager().setTopicInfo(groupID: groupID, topicInfo: topicInfo!); return res; } else { - return _conversationService.setConversationDraft( - conversationID: conversationID, draftText: draftText); + return _conversationService.setConversationDraft(conversationID: conversationID, draftText: draftText); } } } diff --git a/lib/data_services/message/message_service_implement.dart b/lib/data_services/message/message_service_implement.dart index 9a5ad6c..02cadc2 100644 --- a/lib/data_services/message/message_service_implement.dart +++ b/lib/data_services/message/message_service_implement.dart @@ -11,7 +11,7 @@ import 'package:tencent_im_base/tencent_im_base.dart'; class MessageServiceImpl extends MessageService { final CoreServicesImpl _coreService = serviceLocator(); - final Map> messgaeListMap = {}; + final Map> messageListMap = {}; final Map> sendingMessage = {}; @override @@ -27,28 +27,28 @@ class MessageServiceImpl extends MessageService { bool haveMoreData = true; final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(count: count, getType: getType, userID: userID, groupID: groupID, lastMsgID: lastMsgID, lastMsgSeq: lastMsgSeq, messageTypeList: messageTypeList); - final List responsedMessageList = res.data ?? []; + final List responseMessageList = res.data ?? []; final conversationID = userID ?? groupID; - final cachedMessageList = messgaeListMap[conversationID]; + final cachedMessageList = messageListMap[conversationID]; List combinedMessageList = []; // 加载更多 if (lastMsgID != null && cachedMessageList != null) { - combinedMessageList = [...cachedMessageList, ...responsedMessageList]; + combinedMessageList = [...cachedMessageList, ...responseMessageList]; // 首次加载 } else { final bool existSendingMessage = sendingMessage[conversationID] != null && sendingMessage[conversationID]!.isNotEmpty; // 存在未发送完成的消息 if (existSendingMessage) { - combinedMessageList = [...sendingMessage[conversationID]!, ...responsedMessageList]; + combinedMessageList = [...sendingMessage[conversationID]!, ...responseMessageList]; } else { sendingMessage.remove(conversationID); - combinedMessageList = responsedMessageList; + combinedMessageList = responseMessageList; } } if (res.code != 0) { _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code)); } - if (responsedMessageList.isEmpty || (!PlatformUtils().isWeb && responsedMessageList.length < count) || (PlatformUtils().isWeb && responsedMessageList.length < min(count, 20))) { + if (responseMessageList.isEmpty || (!PlatformUtils().isWeb && responseMessageList.length < count) || (PlatformUtils().isWeb && responseMessageList.length < min(count, 20))) { haveMoreData = false; } else { haveMoreData = true; diff --git a/lib/i18n/strings.i18n.json b/lib/i18n/strings.i18n.json index 2d3609f..9ea9555 100644 --- a/lib/i18n/strings.i18n.json +++ b/lib/i18n/strings.i18n.json @@ -1 +1 @@ -{"k_1fdhj9g":"This version does not support the message","k_06pujtm":"Accept all friend requests","k_0gyhkp5":"Require approval for friend requests","k_121ruco":"Reject all friend requests","k_05nspni":"Custom field","k_03fchyy":"Group profile photo","k_03i9mfe":"Group introduction","k_03agq58":"Group name","k_039xqny":"Group notification","k_003tr0a":"Group owner","k_002wddw":"Mute","k_0got6f7":"Unmute","k_1uaqed6":"[Custom]","k_0z2z7rx":"[Voice]","k_0y39ngu":"[Emoji]","k_0y1a2my":"[Image]","k_0z4fib8":"[Video]","k_0y24mcg":"[Location]","k_0pewpd1":"[Chat history]","k_13s8d9p":"Unknown message","k_003qkx2":"Calendar","k_003n2pz":"Camera","k_03idjo0":"Contact","k_003ltgm":"Location","k_02k3k86":"Mic","k_003pm7l":"Album","k_15ao57x":"Album write","k_164m3jd":"Local storage","k_03r6qyx":"We need your approval to get information.","k_02noktt":"Reject","k_00043x4":"Agree","k_003qzac":"Yesterday","k_003r39d":"2 days ago","k_03fqp9o":"Sun","k_03ibg5h":"Mon","k_03i7hu1":"Tue","k_03iaiks":"Wed","k_03el9pa":"Thu","k_03i7ok1":"Fri","k_03efxyg":"Sat","k_003q7ba":"Afternoon","k_003q7bb":"Morning","k_003pu3h":"Now","k_002rflt":"Delete","k_1don84v":"Failed to locate the original message","k_003q5fi":"Copy","k_003prq0":"Forward","k_002r1h2":"Multiple-choice","k_003j708":"Reference","k_003pqpr":"Recall","k_03ezhho":"Copied","k_11ctfsz":"Not implemented","k_1hbjg5g":"[Group system message]","k_03tvswb":"[Unknown message]","k_155cj23":"You've recalled a message.","k_0gapun3":"Edit it again","k_0003z7x":"You","k_002wfe4":"Read","k_002wjlg":"Unread","k_003nevv":"Cancel","k_001nmhu":"Open with another app","k_105682d":"Failed to load the image","k_0pytyeu":"Image saved successfully","k_0akceel":"Failed to save the image","k_003rk1s":"Save","k_04a0awq":"[Voice message]","k_105c3y3":"Failed to load the video","k_176rzr7":"Chat history","k_002r305":"Send","k_003n8b0":"Shoot","k_003tnp0":"File","k_0ylosxn":"Custom message","k_0jhdhtp":"Sending failed. The video cannot exceed 100 MB.","k_0am7r68":"Slide up to cancel","k_13dsw4l":"Release to cancel","k_15jl6qw":"Too short","k_0gx7vl6":"Press and hold to talk","k_15dlafd":"One-by-one forward","k_15dryxy":"Combine and forward","k_1eyhieh":"Are you sure you want to delete the selected message?","k_118prbn":"Search globally","k_003kv3v":"Search","k_17fmlyf":"Clear chat","k_0dhesoz":"Unpin from top","k_002sk7x":"Pin to top","k_003ll77":"Draft","k_003kfai":"Unknown","k_13dq4an":"Automatic approval","k_0l13cde":"Admin approval","k_11y8c6a":"Disallow group joining","k_1kvyskd":"Modification failed due to network disconnection","k_16payqf":"Group joining mode","k_0vzvn8r":"Modify group name","k_003rzap":"OK","k_038lh6u":"Group management","k_0k5wyiy":"Set admin","k_0goiuwk":"Mute all","k_1g889xx":"If you mute all, only the group owner and admin can speak.","k_0wlrefq":"Add group members to mute","k_0goox5g":"Mute","k_08daijh":"Admin role canceled successfully","k_0k5u935":"Add admin","k_003ngex":"Complete","k_03enyx5":"Group member","k_03erpei":"Admin","k_0qi9tno":"Group owner and admin","k_0uj7208":"Failed to view the group members due to network disconnection","k_0ef2a12":"Modify my nickname in group","k_1aajych":"2–20 characters, including digits, letters, and underscores","k_137pab5":"My nickname in group","k_0ivim6d":"No group notice","k_03eq6cn":"Group notice","k_002vxya":"Modify","k_03gu05e":"Chat room","k_03b4f3p":"Meeting group","k_03avj1p":"Public group","k_03asq2g":"Work group","k_03b3hbi":"Unknown group","k_03es1ox":"Group type","k_003mz1i":"Agree","k_003lpre":"Reject","k_003qk66":"Profile photo","k_003lhvk":"Nickname","k_003ps50":"Account","k_15lx52z":"Status","k_003qgkp":"Gender","k_003m6hr":"Date of birth","k_0003v6a":"Male","k_00043x2":"Female","k_03bcjkv":"Not set","k_11s0gdz":"Modify nickname","k_0p3j4sd":"Allows only letters, digits, and underscores","k_15lyvdt":"Modify status","k_0vylzjp":"None","k_1hs7ese":"Modify it later","k_03exjk7":"Remarks","k_0s3skfd":"Add to blocklist","k_17fpl3y":"Pin chat to top","k_0p3b31s":"Modify remarks","k_0003y9x":"None","k_11zgnfs":"Profile","k_1tez2xl":"No status","k_0vjj2kp":"Group chat history","k_003n2rp":"Select","k_1m9exwh":"Recent contacts","k_119nwqr":"The input cannot be empty","k_0pzwbmg":"Video saved successfully","k_0aktupv":"Failed to save the video","k_1yemzyd":"Received a message","k_13sajrj":"Emoji message","k_13sjeb7":"File message","k_0yd2ft8":"Group notification","k_13s7mxn":"Image message","k_13satlt":"Location message","k_00bbtsx":"Combined message","k_13sqwu4":"Voice message","k_13sqjjp":"Video message","k_03iqsh4":" $s to ","k_191t5n4":"$opUserNickName changed ","k_1pg6aoj":"$opUserNickName quit group chat","k_1f6zt3v":"Invite $invitedMemberString to the group","k_0y7zd07":"Remove $invitedMemberString from the group","k_1d5mshh":"User $joinedMemberString joined the group","k_0yenqf0":"$userName was","k_0spotql":"Set $adminMember as admin","k_0pg5zzj":"System message: $operationType","k_1c7z88n":"[File] $fileName","k_1c3us5n":"The current group does not support @all","k_11k579v":"Invalid statements detected","k_0qba4ns":" attempted to access your $yoursItem","k_0oozw9x":"$diffMinutes minutes ago","k_13hzn00":"$yesterday, yesterday","k_0n9pyxz":"The user does not exist","k_1bjwemh":"Search by user ID","k_02owlq8":"My user ID: $userID","k_1wu8h4x":"Me: $showName","k_16758qw":"Add friend","k_1shx4d9":"Status: $selfSignature","k_0i553x0":"Enter verification information","k_031ocwx":"Enter remarks and list","k_003ojje":"Remarks","k_003lsav":"List","k_167bdvq":"My friends","k_156b4ut":"Friend request sent","k_1loix7s":"Group type: $groupType","k_1lqbsib":"The group chat does not exist","k_03h153m":"Search by group ID","k_0oxak3r":"Group request sent","k_1uh417q":"$displayName recalled a message","k_1aszp2k":"Are you sure you want to send the message again?","k_0h1ygf8":"Call initiated","k_0h169j0":"Call canceled","k_0h13jjk":"Call accepted","k_0h19hfx":"Call rejected","k_0obi9lh":"No answer","k_0ohzb9l":"Call duration: $callTime","k_0y9u662":"$appName currently does not support this file type. You can use another app to open and preview the file.","k_1ht1b80":"Receiving","k_0d5z4m5":"Select reminder receiver","k_1665ltg":"Initiate call","k_003kthh":"Photo","k_119ucng":"The image cannot be empty","k_0w9x8gw":"Selected successfully: $successPath","k_1np495n":"$messageString[Someone@me]","k_1m797yi":"$messageString[@all]","k_1uaov41":"Search for chat content","k_0bxm97s":"Admin ($adminNum/10)","k_0jayw3z":"Group members ($groupMemberNum members)","k_0h1svv1":"Delete group member","k_0h1g636":"Add group member","k_01yfa4o":"$memberCount members","k_0hpukyx":"View more group members","k_0qtsar0":"Mute notifications","k_03xd79d":"Status: $signature","k_1m9dftc":"All contacts","k_0em4gyz":"All group chats","k_002twmj":"Group chat","k_09kga0d":"More chat history","k_1ui5lzi":"$count messages are found","k_09khmso":"Related chat records","k_1kevf4k":"Chat history with $receiver","k_03ignw6":"All","k_03icaxo":"Custom","k_1969986":"[Voice Call]:$callingLastMsgShow","k_1960dlr":"[Video Call]:$callingLastMsgShow","k_1qbg9xc":"$option8 to ","k_1wq5ubm":"$option7 changed ","k_0y5pu80":"$option6 quit group chat","k_0nl7cmd":"Invite $option5 to the group","k_1ju5iqw":"Remove $option4 from the group","k_1ovt677":"User $option3 joined the group","k_0k05b8b":"$option2 was ","k_0wm4xeb":"System message: $option2","k_0nbq9v3":"Call duration: $option2","k_0i1kf53":"[File] $option2","k_1gnnby6":" attempted to access your $option2","k_1wh4atg":"$option2 minutes ago","k_07sh7g1":"$option2, yesterday","k_1pj8xzh":"My user ID: $option2","k_0py1evo":"Status: $option2","k_1kvj4i2":"$option2 recalled a message","k_1v0lbpp":"$option2 currently does not support this file type. You can use another app to open and preview the file.","k_0torwfz":"Selected successfully: $option2","k_0i1bjah":"$option1 recalled a message","k_1qzxh9q":"Call duration: $option3","k_0wrgmom":"[Voice Call]:$option1","k_06ix2f0":"[Video Call]:$option2","k_08o3z5w":"[File] $option1","k_0ezbepg":"$option2[Someone@me]","k_1ccnht1":"$option2[@all]","k_1k3arsw":"Admin ($option2/10)","k_1d4golg":"Group members ($option1 members)","k_1bg69nt":"$option1 members","k_00gjqxj":"Status: $option1","k_0c29cxr":"$option1 messages are found","k_1twk5rz":"Chat history with $option1","k_18o68ro":"Allow ","k_1onpf8u":" to access your camera to take photos, record videos, and make video calls.","k_17irga5":" to access your microphone to send voice messages, record videos, and make voice/video calls.","k_0572kc4":" to access your photos to send images and videos.","k_0slykws":" to access your album to save images and videos.","k_119pkcd":" to access your files to view, select and send files in a chat.","k_03c49qt":"Authorize now","k_0nt2uyg":"Back to the bottom","k_04l16at":"$option1 new messages","k_13p3w93":"Someone @ me","k_18w5uk6":"@ all","k_0jmujgh":"You are receiving other files","k_12s5ept":"Message details","k_0mxa4f4":"$option1 read","k_061tue3":"$option2 unread","k_1vn4xq1":"remove $adminMember from admin","k_0e35hsw":"Please allow us to use your camera to capture photos and videos sending to your friends and make video calls.","k_0dj6yr7":"Please allow us to use your microphone for sending voice message, make video/audio calls.","k_003qnsl":"Save","k_0s3rtpw":"Please allow us to access the media and files on your devices, in order to select and send to your friend, or save from them.","k_0tezv85":" Would like to access $option2","k_002rety":" permission. ","k_0gqewd3":"Later","k_03eq4s1":"Authorize Now","k_18qjstb":"Transfer Group","k_0on1aj2":"$option2 messages @ me","k_09j4izl":"[Someone @ me] ","k_1oqtjw0":"[@ all] ","k_1x5a9vb":"This is: $option1","k_14n31e7":"Add Group","k_08nc5j1":"Group type: $option1","k_1josu12":"$option1 group joining request(s)","k_0n2x5s0":"Verification message: $option2","k_03c1nx0":"Agreed","k_03aw9w8":"Rejected","k_038ryos":"Handle now","k_0gw8pum":"Add Group","k_1gcvfrj":"Please fill in the remarks","k_002v9zj":"确认","k_10oqrki":"轻触拍照","k_0f8b3ws":"加载失败","k_11cm5lm":"手动聚焦","k_002uzrd":"预览","k_003qkn3":"录像","k_003k6a7":"拍照","k_0bqpqco":"拍照按钮","k_1626ozl":"停止录像","k_003lvmu":"前置","k_003lued":"后置","k_003lwzh":"外置","k_002qzi3":"关闭","k_003pufb":"自动","k_0apm0ze":"拍照时闪光","k_157zog5":"始终闪光","k_0cfyqhy":"$option1 画面预览","k_0phctlz":"闪光模式: $option2","k_02vfqe0":"切换至 $option3 摄像头","k_0f0y9ex":"说话时间太短","k_0ln70tk":"无法打开URL","k_11a3jdv":"轻触拍照,长按摄像","k_1k18miv":"请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。","k_1fu9ahv":"全员禁言状态","k_0gmwbnd":"全员禁言中","k_0got2zr":"您被禁言","k_0y9jck8":"你必须自定义search bar,并处理点击跳转","k_0yum3tv":"如使用自定义区域,请在profileWidgetBuilder传入对应组件","k_09kalj0":"清空聊天记录","k_14j5iul":"删除并退出","k_125ru1w":"解散该群","k_0jtutmw":"退出后不会接收到此群聊消息","k_0jtzmqa":"解散后不会接收到此群聊消息","k_0r8fi93":"好友添加成功","k_02qw14e":"好友申请已发出","k_0n3md5x":"当前用户在黑名单","k_094phq4":"好友添加失败","k_129scag":"好友删除成功","k_129uzfn":"好友删除失败","k_1666isy":"清除好友","k_1679vrd":"加为好友","k_1ualc52":"看看对方带来的数据是啥","k_0szluvp":"设置对方在线状态","k_0f4rnf8":"该用户已是好友","k_1tdkom4":"您已是群成员","k_1p2lyuz":"对方正在输入中...","k_1g8wfpy":"...共$option1人","k_12rv9vw":"回应详情","k_0havgi0":"[查看详情 >>](${linkMessage.link})","k_0n9p7g8":"群组不存在","k_1tdh5vn":"您不是群成员","k_0h1q57v":"暂无群成员","k_0y5drq1":"[查看详情 >>]($option1)","k_03pjp61":"[表情消息]","k_1jpvzul":"[自定义消息]","k_03u3bh1":"[文件消息]","k_1odsnsw":"[群消息]","k_03sel4t":"[图片消息]","k_03sfw3r":"[位置消息]","k_03xpuwq":"[合并消息]","k_07ycxwo":"[没有元素]","k_03rc9vz":"[文本消息]","k_046uopf":"[视频消息]","k_0ehmsun":"设备存储空间不足,建议清理,以获得更好使用体验","k_003kmos":"图片","k_002s86q":"视频","k_06bk5ei":"视频消息仅限 mp4 格式","k_13opfxf":"Web网页端不支持搜索","k_1i0o0y2":"暂时仅限 Android/iOS 端","k_045dtzl":"$option1的聊天记录","k_0t0131u":"群资料信息","k_18ok8xz":"消息接收方式","k_03ax3ks":"群资料","k_0sqvoqo":"将 $option1 设置为管理员","k_1gbg1v8":"将 $option1 取消管理员","k_17k64g4":"群聊创建成功!","k_05mn217":"暂未安装表情包插件,如需使用表情相关功能,请根据本文档安装:https://cloud.tencent.com/document/product/269/70746","k_14j17nz":"暂无表情包","k_0fvjexh":"正在下载中","k_1cdagzz":"已加入待下载队列,其他文件下载中","k_0g4vojc":"开始下载","k_1g32es3":"[调皮]@2x.png","k_1g8qorz":"[爱你]@2x.png","k_1g4hmx6":"[爱情]@2x.png","k_1g6b558":"[爱心]@2x.png","k_1g3m4su":"[傲慢]@2x.png","k_1g2jym7":"[白眼]@2x.png","k_0cgkxuw":"[棒棒糖]@2x.png","k_1g48br2":"[抱抱]@2x.png","k_1g49ol8":"[抱拳]@2x.png","k_1g0ras3":"[爆筋]@2x.png","k_1ghy881":"[鄙视]@2x.png","k_1g86bmv":"[闭嘴]@2x.png","k_1g1xs1p":"[鞭炮]@2x.png","k_1g8i6ri":"[便便]@2x.png","k_1g2u5kf":"[擦汗]@2x.png","k_1g60uwh":"[彩带]@2x.png","k_1g1o0d0":"[彩球]@2x.png","k_1g6a6yq":"[菜刀]@2x.png","k_1g6vqo2":"[差劲]@2x.png","k_1g0kvjc":"[钞票]@2x.png","k_1g65x7e":"[车厢]@2x.png","k_0e1tjol":"[打哈欠]@2x.png","k_1g65n58":"[大兵]@2x.png","k_1g7se7o":"[大哭]@2x.png","k_1g03868":"[蛋糕]@2x.png","k_1h8nm66":"[刀]@2x.png","k_1g3dlpi":"[得意]@2x.png","k_1g3u434":"[灯泡]@2x.png","k_1giuqs7":"[凋谢]@2x.png","k_1g8r0r9":"[多云]@2x.png","k_1g7k6i1":"[发呆]@2x.png","k_1g44zsp":"[发抖]@2x.png","k_1g5l96i":"[飞机]@2x.png","k_1g7wsqj":"[飞吻]@2x.png","k_1g49luq":"[奋斗]@2x.png","k_1gixbsm":"[风车]@2x.png","k_1g6cqbq":"[尴尬]@2x.png","k_1g6jbw5":"[勾引]@2x.png","k_1g3lwo1":"[鼓掌]@2x.png","k_1g13nkj":"[害羞]@2x.png","k_1g0mt47":"[憨笑]@2x.png","k_0bxujkf":"[红灯笼]@2x.png","k_0hhaeh8":"[红双喜]@2x.png","k_1g0jnts":"[坏笑]@2x.png","k_1g46g9c":"[挥手]@2x.png","k_1g4vi9g":"[回头]@2x.png","k_1gf7hes":"[饥饿]@2x.png","k_1g6mvsm":"[激动]@2x.png","k_1gku5mf":"[街舞]@2x.png","k_1g4hidg":"[惊恐]@2x.png","k_1gjbrtu":"[惊讶]@2x.png","k_1g6sand":"[咖啡]@2x.png","k_1g4s8rj":"[磕头]@2x.png","k_1g1wn34":"[可爱]@2x.png","k_1g3l0wd":"[可怜]@2x.png","k_1ggaon9":"[抠鼻]@2x.png","k_1ggvcb0":"[骷髅]@2x.png","k_1h8yqjt":"[酷]@2x.png","k_0jac97i":"[快哭了]@2x.png","k_1h8oiby":"[困]@2x.png","k_1g0s5hg":"[蜡烛]@2x.png","k_1g1iuer":"[篮球]@2x.png","k_1g2xjfi":"[冷汗]@2x.png","k_0s5oyqw":"[礼品袋]@2x.png","k_1g1qqvf":"[礼物]@2x.png","k_1g2slew":"[流汗]@2x.png","k_1g3z9xx":"[流泪]@2x.png","k_1g6pabn":"[麻将]@2x.png","k_0pkaxul":"[麦克风]@2x.png","k_1g7m0zj":"[猫咪]@2x.png","k_0ibvtpo":"[么么哒]@2x.png","k_1g1hoh1":"[玫瑰]@2x.png","k_1gfzeow":"[米饭]@2x.png","k_1g5l15p":"[面条]@2x.png","k_1g2hfa6":"[奶瓶]@2x.png","k_1gix9pj":"[难过]@2x.png","k_1giqn6g":"[闹钟]@2x.png","k_1h8kd64":"[怒]@2x.png","k_1g0vui9":"[怄火]@2x.png","k_1g1jsj7":"[皮球]@2x.png","k_1ghdluw":"[啤酒]@2x.png","k_1gl6ec7":"[瓢虫]@2x.png","k_1g7gg5p":"[撇嘴]@2x.png","k_1g8psin":"[乒乓]@2x.png","k_1gjzu3p":"[汽车]@2x.png","k_1h8mr0k":"[强]@2x.png","k_1g45y2n":"[敲打]@2x.png","k_1gkaxsl":"[青蛙]@2x.png","k_0jcfnoo":"[糗大了]@2x.png","k_1g4njy1":"[拳头]@2x.png","k_1h8mqr3":"[弱]@2x.png","k_1h926fg":"[色]@2x.png","k_1g6rtbq":"[沙发]@2x.png","k_1giirh6":"[删除]@2x.png","k_1g14ny9":"[闪电]@2x.png","k_1g6bmsr":"[胜利]@2x.png","k_1g1rytx":"[示爱]@2x.png","k_1g52fbz":"[手枪]@2x.png","k_1h90dam":"[衰]@2x.png","k_1gigiae":"[睡觉]@2x.png","k_1gijchz":"[太阳]@2x.png","k_1g1sgji":"[跳绳]@2x.png","k_1gjwuri":"[跳跳]@2x.png","k_1g0juhk":"[偷笑]@2x.png","k_1h8nzla":"[吐]@2x.png","k_1g6cv0i":"[委屈]@2x.png","k_1g46l5g":"[握手]@2x.png","k_1g2pgkd":"[西瓜]@2x.png","k_1ging9p":"[下雨]@2x.png","k_1h8nzil":"[吓]@2x.png","k_1g7q7wr":"[献吻]@2x.png","k_1gl6uum":"[香蕉]@2x.png","k_1g23fys":"[象棋]@2x.png","k_0j75rdh":"[心碎了]@2x.png","k_1g6ajj2":"[信封]@2x.png","k_1g21prz":"[熊猫]@2x.png","k_1h8octi":"[嘘]@2x.png","k_1h91zox":"[药]@2x.png","k_1ghttfl":"[疑问]@2x.png","k_1ghk7sz":"[阴险]@2x.png","k_0gl37zz":"[右车头]@2x.png","k_0ifkj1p":"[右哼哼]@2x.png","k_0g1yh2e":"[右太极]@2x.png","k_1g9dkfc":"[雨伞]@2x.png","k_1g8jl88":"[月亮]@2x.png","k_1h8lhqj":"[晕]@2x.png","k_1gi9x2q":"[再见]@2x.png","k_1g6dwwv":"[炸弹]@2x.png","k_1fzmkfi":"[折磨]@2x.png","k_1g6jbiw":"[纸巾]@2x.png","k_1ggjnwu":"[咒骂]@2x.png","k_1g4qlq8":"[猪头]@2x.png","k_1g1lqzz":"[抓狂]@2x.png","k_1g80j3u":"[转圈]@2x.png","k_1g0z55s":"[龇牙]@2x.png","k_1g3ju6v":"[钻戒]@2x.png","k_0gl51l6":"[左车头]@2x.png","k_0iflllk":"[左哼哼]@2x.png","k_0g1y3ir":"[左太极]@2x.png","k_026hiq5":"消息列表加载中","k_003tu8k":"爱你","k_003myvp":"傲慢","k_003kddw":"白眼","k_039yfhv":"棒棒糖","k_003nu3p":"抱抱","k_003nijr":"抱拳","k_003mg88":"爆筋","k_002v17e":"鄙视","k_003qhy4":"闭嘴","k_003l5fq":"鞭炮","k_003uacl":"便便","k_003oq1g":"擦汗","k_003qvey":"彩带","k_003jci7":"彩球","k_003pyu1":"菜刀","k_003q97d":"差劲","k_003po5d":"车厢","k_03eadb2":"打哈欠","k_003pnuf":"大兵","k_003kg57":"蛋糕","k_003mxkt":"得意","k_003onu3":"灯泡","k_002uv8s":"凋谢","k_003kqy0":"调皮","k_003tyum":"多云","k_003pv9u":"发呆","k_036o6mu":"发抖t","k_003nogx":"飞机","k_003q7wg":"飞吻","k_003m0jd":"奋斗","k_002ult9":"风车","k_003r8gt":"尴尬","k_003qy4u":"勾引","k_003mnoa":"鼓掌","k_003lmw8":"害羞","k_003mb30":"憨笑","k_03bj41g":"红灯笼","k_03dxw2f":"红双喜","k_003mk57":"坏笑","k_003nmvf":"挥手","k_003r2i7":"回头","k_002s6f3":"饥饿","k_003qd0t":"激动","k_002vgi4":"街舞","k_003nz33":"惊恐","k_002wh4p":"惊讶","k_003ozpu":"咖啡","k_003qvs4":"磕头","k_003l3wb":"可爱","k_003nuwm":"可怜","k_002rw1q":"抠鼻","k_002tujb":"骷髅","k_00030eq":"酷","k_03i8ath":"快哭了","k_000421h":"困","k_003l5i7":"蜡烛","k_003j72g":"篮球","k_003ofwl":"冷汗","k_02mw65v":"礼品袋","k_003ku40":"礼物","k_003ookz":"流汗","k_003on72":"流泪","k_003rjy0":"麻将","k_003q2f8":"猫咪","k_03et393":"么么哒","k_003j7j2":"玫瑰","k_002sr0b":"米饭","k_003nnza":"面条","k_003jef9":"奶瓶","k_002umn0":"难过","k_002rjib":"闹钟","k_0003zcn":"怒","k_003jzwq":"怄火","k_003j4js":"皮球","k_002r5ir":"啤酒","k_002ubu4":"瓢虫","k_003ppo6":"撇嘴","k_003ty3o":"乒乓","k_002vxwe":"汽车","k_00043hb":"强","k_003nmbo":"敲打","k_002tfhq":"青蛙","k_03i7lrn":"糗大了","k_003r03m":"拳头","k_00043h0":"弱","k_000345z":"色","k_003qmp9":"沙发","k_003it8a":"闪电","k_003pxow":"胜利","k_003kw8e":"示爱","k_003n99g":"手枪","k_00035cl":"衰","k_002vl3h":"睡觉","k_002rgqk":"太阳","k_003m9d1":"跳绳","k_002vobp":"跳跳","k_003mkoz":"偷笑","k_00041px":"吐","k_003rjh5":"委屈","k_003j36u":"西瓜","k_002re92":"下雨","k_00041py":"吓","k_003q06o":"献吻","k_002ubjp":"香蕉","k_003o2tr":"象棋","k_03ie6pa":"心碎了","k_003rao5":"信封","k_003l3us":"熊猫","k_000424d":"嘘","k_00033yi":"药","k_002qtyy":"疑问","k_002qe0o":"阴险","k_03gu7us":"右车头","k_03ere8m":"右哼哼","k_003uqk3":"雨伞","k_003tzdv":"月亮","k_0003z00":"晕","k_002vdrd":"再见","k_003ra1w":"炸弹","k_003lcad":"折磨","k_003q7sz":"纸巾","k_002thn9":"咒骂","k_003qx7f":"猪头","k_003l044":"抓狂","k_003qg4h":"转圈","k_003kb97":"龇牙","k_03gu53l":"左车头","k_03erd1f":"左哼哼","k_003nyvl":"爱情","k_003r85z":"爱心","k_003mk8j":"钞票","k_003pwfj":"大哭","k_00042w5":"刀","k_003nmtr":"握手","k_03c529p":"右太极","k_003n4mk":"钻戒","k_03c5488":"左太极","k_1llp7tu":"该用户不存在","k_0tbyqyb":"加载中…","k_0td1p3f":"保存中…","k_1klqdh1":"仅限汉字、英文、数字和下划线","k_03el5lp":"未填写","k_1ui0gai":"搜索指定内容","k_003nvk2":"消息","k_03agld7":"群提示","k_0elt0kw":"添加群聊","k_0s3sgel":"移出黑名单","k_1qqgjra":"$option3条未读消息","k_0uubyjr":"以下为未读消息","k_16as7eq":"表情回应","k_003s12u":"回复","k_003s38r":"更多","k_002wkr3":"翻译","k_13g4hxv":"翻译完成","k_003molk":"表情","k_165bbw6":"消息历史","k_13sqc0z":"清除消息","k_0glns86":"删除会话","k_13s99rx":"清空消息","k_11vsa3j":"退出群组","k_11vvszp":"解散群组","k_15i9w72":"群管理员","k_0p3espj":"设置备注名","k_118sw9v":"立即搜索","k_0h20hg5":"视频通话","k_0h22snw":"语音通话","k_003lz6t":"对方","k_1xf4yre":"发送给$option1","k_003por5":"截图","k_1rw7s82":" 访问相册中视频权限,以正常使用发送视频等功能。","k_003rcwm":"打开","k_1698c42":"在访达中打开","k_066fxsz":"查看文件夹","k_0k432y2":"无法发送,包含文件夹","k_002wb4y":"会话","k_0od4qyh":"视频文件异常","k_1bfkxg9":"不支持 0KB 文件的传输","k_0vvsw7g":"文件处理异常","k_06e224q":"[消息被管理员撤回]","k_1u1mjcl":"[消息被撤回]","k_1qcqxea":"选择多个会话","k_1qgmc20":"选择一个会话","k_1d8nx6f":"在新窗口中打开","k_1hz05ax":"正在下载原始资源,请稍候..."} \ No newline at end of file +{"k_1fdhj9g":"This version does not support the message","k_06pujtm":"Accept all friend requests","k_0gyhkp5":"Require approval for friend requests","k_121ruco":"Reject all friend requests","k_05nspni":"Custom field","k_03fchyy":"Group profile photo","k_03i9mfe":"Group introduction","k_03agq58":"Group name","k_039xqny":"Group notification","k_003tr0a":"Group owner","k_002wddw":"Mute","k_0got6f7":"Unmute","k_1uaqed6":"[Custom]","k_0z2z7rx":"[Voice]","k_0y39ngu":"[Emoji]","k_0y1a2my":"[Image]","k_0z4fib8":"[Video]","k_0y24mcg":"[Location]","k_0pewpd1":"[Chat history]","k_13s8d9p":"Unknown message","k_003qkx2":"Calendar","k_003n2pz":"Camera","k_03idjo0":"Contact","k_003ltgm":"Location","k_02k3k86":"Mic","k_003pm7l":"Album","k_15ao57x":"Album write","k_164m3jd":"Local storage","k_03r6qyx":"We need your approval to get information.","k_02noktt":"Reject","k_00043x4":"Agree","k_003qzac":"Yesterday","k_003r39d":"2 days ago","k_03fqp9o":"Sun","k_03ibg5h":"Mon","k_03i7hu1":"Tue","k_03iaiks":"Wed","k_03el9pa":"Thu","k_03i7ok1":"Fri","k_03efxyg":"Sat","k_003q7ba":"Afternoon","k_003q7bb":"Morning","k_003pu3h":"Now","k_002rflt":"Delete","k_1don84v":"Failed to locate the original message","k_003q5fi":"Copy","k_003prq0":"Forward","k_002r1h2":"Multiple-choice","k_003j708":"Reference","k_003pqpr":"Recall","k_03ezhho":"Copied","k_11ctfsz":"Not implemented","k_1hbjg5g":"[Group system message]","k_03tvswb":"[Unknown message]","k_155cj23":"You've recalled a message.","k_0gapun3":"Edit it again","k_0003z7x":"You","k_002wfe4":"Read","k_002wjlg":"Unread","k_003nevv":"Cancel","k_001nmhu":"Open with another app","k_105682d":"Failed to load the image","k_0pytyeu":"Image saved successfully","k_0akceel":"Failed to save the image","k_003rk1s":"Save","k_04a0awq":"[Voice message]","k_105c3y3":"Failed to load the video","k_176rzr7":"Chat history","k_002r305":"Send","k_003n8b0":"Shoot","k_003tnp0":"File","k_0ylosxn":"Custom message","k_0jhdhtp":"Sending failed. The video cannot exceed 100 MB.","k_0am7r68":"Slide up to cancel","k_13dsw4l":"Release to cancel","k_15jl6qw":"Too short","k_0gx7vl6":"Press and hold to talk","k_15dlafd":"One-by-one forward","k_15dryxy":"Combine and forward","k_1eyhieh":"Are you sure you want to delete the selected message?","k_118prbn":"Search globally","k_003kv3v":"Search","k_17fmlyf":"Clear chat","k_0dhesoz":"Unpin from top","k_002sk7x":"Pin to top","k_003ll77":"Draft","k_003kfai":"Unknown","k_13dq4an":"Automatic approval","k_0l13cde":"Admin approval","k_11y8c6a":"Disallow group joining","k_1kvyskd":"Modification failed due to network disconnection","k_16payqf":"Group joining mode","k_0vzvn8r":"Modify group name","k_003rzap":"OK","k_038lh6u":"Group management","k_0k5wyiy":"Set admin","k_0goiuwk":"Mute all","k_1g889xx":"If you mute all, only the group owner and admin can speak.","k_0wlrefq":"Add group members to mute","k_0goox5g":"Mute","k_08daijh":"Admin role canceled successfully","k_0k5u935":"Add admin","k_003ngex":"Complete","k_03enyx5":"Group member","k_03erpei":"Admin","k_0qi9tno":"Group owner and admin","k_0uj7208":"Failed to view the group members due to network disconnection","k_0ef2a12":"Modify my nickname in group","k_1aajych":"2–20 characters, including digits, letters, and underscores","k_137pab5":"My nickname in group","k_0ivim6d":"No group notice","k_03eq6cn":"Group notice","k_002vxya":"Modify","k_03gu05e":"Chat room","k_03b4f3p":"Meeting group","k_03avj1p":"Public group","k_03asq2g":"Work group","k_03b3hbi":"Unknown group","k_03es1ox":"Group type","k_003mz1i":"Agree","k_003lpre":"Reject","k_003qk66":"Profile photo","k_003lhvk":"Nickname","k_003ps50":"Account","k_15lx52z":"Status","k_003qgkp":"Gender","k_003m6hr":"Date of birth","k_0003v6a":"Male","k_00043x2":"Female","k_03bcjkv":"Not set","k_11s0gdz":"Modify nickname","k_0p3j4sd":"Allows only letters, digits, and underscores","k_15lyvdt":"Modify status","k_0vylzjp":"None","k_1hs7ese":"Modify it later","k_03exjk7":"Remarks","k_0s3skfd":"Add to blocklist","k_17fpl3y":"Pin chat to top","k_0p3b31s":"Modify remarks","k_0003y9x":"None","k_11zgnfs":"Profile","k_1tez2xl":"No status","k_0vjj2kp":"Group chat history","k_003n2rp":"Select","k_1m9exwh":"Recent contacts","k_119nwqr":"The input cannot be empty","k_0pzwbmg":"Video saved successfully","k_0aktupv":"Failed to save the video","k_1yemzyd":"Received a message","k_13sajrj":"Emoji message","k_13sjeb7":"File message","k_0yd2ft8":"Group notification","k_13s7mxn":"Image message","k_13satlt":"Location message","k_00bbtsx":"Combined message","k_13sqwu4":"Voice message","k_13sqjjp":"Video message","k_03iqsh4":" $s to ","k_191t5n4":"$opUserNickName changed ","k_1pg6aoj":"$opUserNickName quit group chat","k_1f6zt3v":"Invite $invitedMemberString to the group","k_0y7zd07":"Remove $invitedMemberString from the group","k_1d5mshh":"User $joinedMemberString joined the group","k_0yenqf0":"$userName was","k_0spotql":"Set $adminMember as admin","k_0pg5zzj":"System message: $operationType","k_1c7z88n":"[File] $fileName","k_1c3us5n":"The current group does not support @all","k_11k579v":"Invalid statements detected","k_0qba4ns":" attempted to access your $yoursItem","k_0oozw9x":"$diffMinutes minutes ago","k_13hzn00":"$yesterday, yesterday","k_0n9pyxz":"The user does not exist","k_1bjwemh":"Search by user ID","k_02owlq8":"My user ID: $userID","k_1wu8h4x":"Me: $showName","k_16758qw":"Add friend","k_1shx4d9":"Status: $selfSignature","k_0i553x0":"Enter verification information","k_031ocwx":"Enter remarks and list","k_003ojje":"Remarks","k_003lsav":"List","k_167bdvq":"My friends","k_156b4ut":"Friend request sent","k_1loix7s":"Group type: $groupType","k_1lqbsib":"The group chat does not exist","k_03h153m":"Search by group ID","k_0oxak3r":"Group request sent","k_1uh417q":"$displayName recalled a message","k_1aszp2k":"Are you sure you want to send the message again?","k_0h1ygf8":"Call initiated","k_0h169j0":"Call canceled","k_0h13jjk":"Call accepted","k_0h19hfx":"Call rejected","k_0obi9lh":"No answer","k_0ohzb9l":"Call duration: $callTime","k_0y9u662":"$appName currently does not support this file type. You can use another app to open and preview the file.","k_1ht1b80":"Receiving","k_0d5z4m5":"Select reminder receiver","k_1665ltg":"Initiate call","k_003kthh":"Photo","k_119ucng":"The image cannot be empty","k_0w9x8gw":"Selected successfully: $successPath","k_1np495n":"$messageString[Someone@me]","k_1m797yi":"$messageString[@all]","k_1uaov41":"Search for chat content","k_0bxm97s":"Admin ($adminNum/10)","k_0jayw3z":"Group members ($groupMemberNum members)","k_0h1svv1":"Delete group member","k_0h1g636":"Add group member","k_01yfa4o":"$memberCount members","k_0hpukyx":"View more group members","k_0qtsar0":"Mute notifications","k_03xd79d":"Status: $signature","k_1m9dftc":"All contacts","k_0em4gyz":"All group chats","k_002twmj":"Group chat","k_09kga0d":"More chat history","k_1ui5lzi":"$count messages are found","k_09khmso":"Related chat records","k_1kevf4k":"Chat history with $receiver","k_03ignw6":"All","k_03icaxo":"Custom","k_1969986":"[Voice Call]:$callingLastMsgShow","k_1960dlr":"[Video Call]:$callingLastMsgShow","k_1qbg9xc":"$option8 to ","k_1wq5ubm":"$option7 changed ","k_0y5pu80":"$option6 quit group chat","k_0nl7cmd":"Invite $option5 to the group","k_1ju5iqw":"Remove $option4 from the group","k_1ovt677":"User $option3 joined the group","k_0k05b8b":"$option2 was ","k_0wm4xeb":"System message: $option2","k_0nbq9v3":"Call duration: $option2","k_0i1kf53":"[File] $option2","k_1gnnby6":" attempted to access your $option2","k_1wh4atg":"$option2 minutes ago","k_07sh7g1":"$option2, yesterday","k_1pj8xzh":"My user ID: $option2","k_0py1evo":"Status: $option2","k_1kvj4i2":"$option2 recalled a message","k_1v0lbpp":"$option2 currently does not support this file type. You can use another app to open and preview the file.","k_0torwfz":"Selected successfully: $option2","k_0i1bjah":"$option1 recalled a message","k_1qzxh9q":"Call duration: $option3","k_0wrgmom":"[Voice Call]:$option1","k_06ix2f0":"[Video Call]:$option2","k_08o3z5w":"[File] $option1","k_0ezbepg":"$option2[Someone@me]","k_1ccnht1":"$option2[@all]","k_1k3arsw":"Admin ($option2/10)","k_1d4golg":"Group members ($option1 members)","k_1bg69nt":"$option1 members","k_00gjqxj":"Status: $option1","k_0c29cxr":"$option1 messages are found","k_1twk5rz":"Chat history with $option1","k_18o68ro":"Allow ","k_1onpf8u":" to access your camera to take photos, record videos, and make video calls.","k_17irga5":" to access your microphone to send voice messages, record videos, and make voice/video calls.","k_0572kc4":" to access your photos to send images and videos.","k_0slykws":" to access your album to save images and videos.","k_119pkcd":" to access your files to view, select and send files in a chat.","k_03c49qt":"Authorize now","k_0nt2uyg":"Back to the bottom","k_04l16at":"$option1 new messages","k_13p3w93":"Someone @ me","k_18w5uk6":"@ all","k_0jmujgh":"You are receiving other files","k_12s5ept":"Message details","k_0mxa4f4":"$option1 read","k_061tue3":"$option2 unread","k_1vn4xq1":"remove $adminMember from admin","k_0e35hsw":"Please allow us to use your camera to capture photos and videos sending to your friends and make video calls.","k_0dj6yr7":"Please allow us to use your microphone for sending voice message, make video/audio calls.","k_003qnsl":"Save","k_0s3rtpw":"Please allow us to access the media and files on your devices, in order to select and send to your friend, or save from them.","k_0tezv85":" Would like to access $option2","k_002rety":" permission. ","k_0gqewd3":"Later","k_03eq4s1":"Authorize Now","k_18qjstb":"Transfer Group","k_0on1aj2":"$option2 messages @ me","k_09j4izl":"[Someone @ me] ","k_1oqtjw0":"[@ all] ","k_1x5a9vb":"This is: $option1","k_14n31e7":"Add Group","k_08nc5j1":"Group type: $option1","k_1josu12":"$option1 group joining request(s)","k_0n2x5s0":"Verification message: $option2","k_03c1nx0":"Agreed","k_03aw9w8":"Rejected","k_038ryos":"Handle now","k_0gw8pum":"Add Group","k_1gcvfrj":"Please fill in the remarks","k_002v9zj":"确认","k_10oqrki":"轻触拍照","k_0f8b3ws":"加载失败","k_11cm5lm":"手动聚焦","k_002uzrd":"预览","k_003qkn3":"录像","k_003k6a7":"拍照","k_0bqpqco":"拍照按钮","k_1626ozl":"停止录像","k_003lvmu":"前置","k_003lued":"后置","k_003lwzh":"外置","k_002qzi3":"关闭","k_003pufb":"自动","k_0apm0ze":"拍照时闪光","k_157zog5":"始终闪光","k_0cfyqhy":"$option1 画面预览","k_0phctlz":"闪光模式: $option2","k_02vfqe0":"切换至 $option3 摄像头","k_0f0y9ex":"说话时间太短","k_0ln70tk":"无法打开URL","k_11a3jdv":"轻触拍照,长按摄像","k_1k18miv":"请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。","k_1fu9ahv":"全员禁言状态","k_0gmwbnd":"全员禁言中","k_0got2zr":"您被禁言","k_0y9jck8":"你必须自定义search bar,并处理点击跳转","k_0yum3tv":"如使用自定义区域,请在profileWidgetBuilder传入对应组件","k_09kalj0":"清空聊天记录","k_14j5iul":"删除并退出","k_125ru1w":"解散该群","k_0jtutmw":"退出后不会接收到此群聊消息","k_0jtzmqa":"解散后不会接收到此群聊消息","k_0r8fi93":"好友添加成功","k_02qw14e":"好友申请已发出","k_0n3md5x":"当前用户在黑名单","k_094phq4":"好友添加失败","k_129scag":"好友删除成功","k_129uzfn":"好友删除失败","k_1666isy":"清除好友","k_1679vrd":"加为好友","k_1ualc52":"看看对方带来的数据是啥","k_0szluvp":"设置对方在线状态","k_0f4rnf8":"该用户已是好友","k_1tdkom4":"您已是群成员","k_1p2lyuz":"对方正在输入中...","k_1g8wfpy":"...共$option1人","k_12rv9vw":"回应详情","k_0havgi0":"[查看详情 >>](${linkMessage.link})","k_0n9p7g8":"群组不存在","k_1tdh5vn":"您不是群成员","k_0h1q57v":"暂无群成员","k_0y5drq1":"[查看详情 >>]($option1)","k_03pjp61":"[表情消息]","k_1jpvzul":"[自定义消息]","k_03u3bh1":"[文件消息]","k_1odsnsw":"[群消息]","k_03sel4t":"[图片消息]","k_03sfw3r":"[位置消息]","k_03xpuwq":"[合并消息]","k_07ycxwo":"[没有元素]","k_03rc9vz":"[文本消息]","k_046uopf":"[视频消息]","k_0ehmsun":"设备存储空间不足,建议清理,以获得更好使用体验","k_003kmos":"图片","k_002s86q":"视频","k_06bk5ei":"视频消息仅限 mp4 格式","k_13opfxf":"Web网页端不支持搜索","k_1i0o0y2":"暂时仅限 Android/iOS 端","k_045dtzl":"$option1的聊天记录","k_0t0131u":"群资料信息","k_18ok8xz":"消息接收方式","k_03ax3ks":"群资料","k_0sqvoqo":"将 $option1 设置为管理员","k_1gbg1v8":"将 $option1 取消管理员","k_17k64g4":"群聊创建成功!","k_05mn217":"暂未安装表情包插件,如需使用表情相关功能,请根据本文档安装:https://cloud.tencent.com/document/product/269/70746","k_14j17nz":"暂无表情包","k_0fvjexh":"正在下载中","k_1cdagzz":"已加入待下载队列,其他文件下载中","k_0g4vojc":"开始下载","k_1g32es3":"[调皮]@2x.png","k_1g8qorz":"[爱你]@2x.png","k_1g4hmx6":"[爱情]@2x.png","k_1g6b558":"[爱心]@2x.png","k_1g3m4su":"[傲慢]@2x.png","k_1g2jym7":"[白眼]@2x.png","k_0cgkxuw":"[棒棒糖]@2x.png","k_1g48br2":"[抱抱]@2x.png","k_1g49ol8":"[抱拳]@2x.png","k_1g0ras3":"[爆筋]@2x.png","k_1ghy881":"[鄙视]@2x.png","k_1g86bmv":"[闭嘴]@2x.png","k_1g1xs1p":"[鞭炮]@2x.png","k_1g8i6ri":"[便便]@2x.png","k_1g2u5kf":"[擦汗]@2x.png","k_1g60uwh":"[彩带]@2x.png","k_1g1o0d0":"[彩球]@2x.png","k_1g6a6yq":"[菜刀]@2x.png","k_1g6vqo2":"[差劲]@2x.png","k_1g0kvjc":"[钞票]@2x.png","k_1g65x7e":"[车厢]@2x.png","k_0e1tjol":"[打哈欠]@2x.png","k_1g65n58":"[大兵]@2x.png","k_1g7se7o":"[大哭]@2x.png","k_1g03868":"[蛋糕]@2x.png","k_1h8nm66":"[刀]@2x.png","k_1g3dlpi":"[得意]@2x.png","k_1g3u434":"[灯泡]@2x.png","k_1giuqs7":"[凋谢]@2x.png","k_1g8r0r9":"[多云]@2x.png","k_1g7k6i1":"[发呆]@2x.png","k_1g44zsp":"[发抖]@2x.png","k_1g5l96i":"[飞机]@2x.png","k_1g7wsqj":"[飞吻]@2x.png","k_1g49luq":"[奋斗]@2x.png","k_1gixbsm":"[风车]@2x.png","k_1g6cqbq":"[尴尬]@2x.png","k_1g6jbw5":"[勾引]@2x.png","k_1g3lwo1":"[鼓掌]@2x.png","k_1g13nkj":"[害羞]@2x.png","k_1g0mt47":"[憨笑]@2x.png","k_0bxujkf":"[红灯笼]@2x.png","k_0hhaeh8":"[红双喜]@2x.png","k_1g0jnts":"[坏笑]@2x.png","k_1g46g9c":"[挥手]@2x.png","k_1g4vi9g":"[回头]@2x.png","k_1gf7hes":"[饥饿]@2x.png","k_1g6mvsm":"[激动]@2x.png","k_1gku5mf":"[街舞]@2x.png","k_1g4hidg":"[惊恐]@2x.png","k_1gjbrtu":"[惊讶]@2x.png","k_1g6sand":"[咖啡]@2x.png","k_1g4s8rj":"[磕头]@2x.png","k_1g1wn34":"[可爱]@2x.png","k_1g3l0wd":"[可怜]@2x.png","k_1ggaon9":"[抠鼻]@2x.png","k_1ggvcb0":"[骷髅]@2x.png","k_1h8yqjt":"[酷]@2x.png","k_0jac97i":"[快哭了]@2x.png","k_1h8oiby":"[困]@2x.png","k_1g0s5hg":"[蜡烛]@2x.png","k_1g1iuer":"[篮球]@2x.png","k_1g2xjfi":"[冷汗]@2x.png","k_0s5oyqw":"[礼品袋]@2x.png","k_1g1qqvf":"[礼物]@2x.png","k_1g2slew":"[流汗]@2x.png","k_1g3z9xx":"[流泪]@2x.png","k_1g6pabn":"[麻将]@2x.png","k_0pkaxul":"[麦克风]@2x.png","k_1g7m0zj":"[猫咪]@2x.png","k_0ibvtpo":"[么么哒]@2x.png","k_1g1hoh1":"[玫瑰]@2x.png","k_1gfzeow":"[米饭]@2x.png","k_1g5l15p":"[面条]@2x.png","k_1g2hfa6":"[奶瓶]@2x.png","k_1gix9pj":"[难过]@2x.png","k_1giqn6g":"[闹钟]@2x.png","k_1h8kd64":"[怒]@2x.png","k_1g0vui9":"[怄火]@2x.png","k_1g1jsj7":"[皮球]@2x.png","k_1ghdluw":"[啤酒]@2x.png","k_1gl6ec7":"[瓢虫]@2x.png","k_1g7gg5p":"[撇嘴]@2x.png","k_1g8psin":"[乒乓]@2x.png","k_1gjzu3p":"[汽车]@2x.png","k_1h8mr0k":"[强]@2x.png","k_1g45y2n":"[敲打]@2x.png","k_1gkaxsl":"[青蛙]@2x.png","k_0jcfnoo":"[糗大了]@2x.png","k_1g4njy1":"[拳头]@2x.png","k_1h8mqr3":"[弱]@2x.png","k_1h926fg":"[色]@2x.png","k_1g6rtbq":"[沙发]@2x.png","k_1giirh6":"[删除]@2x.png","k_1g14ny9":"[闪电]@2x.png","k_1g6bmsr":"[胜利]@2x.png","k_1g1rytx":"[示爱]@2x.png","k_1g52fbz":"[手枪]@2x.png","k_1h90dam":"[衰]@2x.png","k_1gigiae":"[睡觉]@2x.png","k_1gijchz":"[太阳]@2x.png","k_1g1sgji":"[跳绳]@2x.png","k_1gjwuri":"[跳跳]@2x.png","k_1g0juhk":"[偷笑]@2x.png","k_1h8nzla":"[吐]@2x.png","k_1g6cv0i":"[委屈]@2x.png","k_1g46l5g":"[握手]@2x.png","k_1g2pgkd":"[西瓜]@2x.png","k_1ging9p":"[下雨]@2x.png","k_1h8nzil":"[吓]@2x.png","k_1g7q7wr":"[献吻]@2x.png","k_1gl6uum":"[香蕉]@2x.png","k_1g23fys":"[象棋]@2x.png","k_0j75rdh":"[心碎了]@2x.png","k_1g6ajj2":"[信封]@2x.png","k_1g21prz":"[熊猫]@2x.png","k_1h8octi":"[嘘]@2x.png","k_1h91zox":"[药]@2x.png","k_1ghttfl":"[疑问]@2x.png","k_1ghk7sz":"[阴险]@2x.png","k_0gl37zz":"[右车头]@2x.png","k_0ifkj1p":"[右哼哼]@2x.png","k_0g1yh2e":"[右太极]@2x.png","k_1g9dkfc":"[雨伞]@2x.png","k_1g8jl88":"[月亮]@2x.png","k_1h8lhqj":"[晕]@2x.png","k_1gi9x2q":"[再见]@2x.png","k_1g6dwwv":"[炸弹]@2x.png","k_1fzmkfi":"[折磨]@2x.png","k_1g6jbiw":"[纸巾]@2x.png","k_1ggjnwu":"[咒骂]@2x.png","k_1g4qlq8":"[猪头]@2x.png","k_1g1lqzz":"[抓狂]@2x.png","k_1g80j3u":"[转圈]@2x.png","k_1g0z55s":"[龇牙]@2x.png","k_1g3ju6v":"[钻戒]@2x.png","k_0gl51l6":"[左车头]@2x.png","k_0iflllk":"[左哼哼]@2x.png","k_0g1y3ir":"[左太极]@2x.png","k_026hiq5":"消息列表加载中","k_003tu8k":"爱你","k_003myvp":"傲慢","k_003kddw":"白眼","k_039yfhv":"棒棒糖","k_003nu3p":"抱抱","k_003nijr":"抱拳","k_003mg88":"爆筋","k_002v17e":"鄙视","k_003qhy4":"闭嘴","k_003l5fq":"鞭炮","k_003uacl":"便便","k_003oq1g":"擦汗","k_003qvey":"彩带","k_003jci7":"彩球","k_003pyu1":"菜刀","k_003q97d":"差劲","k_003po5d":"车厢","k_03eadb2":"打哈欠","k_003pnuf":"大兵","k_003kg57":"蛋糕","k_003mxkt":"得意","k_003onu3":"灯泡","k_002uv8s":"凋谢","k_003kqy0":"调皮","k_003tyum":"多云","k_003pv9u":"发呆","k_036o6mu":"发抖t","k_003nogx":"飞机","k_003q7wg":"飞吻","k_003m0jd":"奋斗","k_002ult9":"风车","k_003r8gt":"尴尬","k_003qy4u":"勾引","k_003mnoa":"鼓掌","k_003lmw8":"害羞","k_003mb30":"憨笑","k_03bj41g":"红灯笼","k_03dxw2f":"红双喜","k_003mk57":"坏笑","k_003nmvf":"挥手","k_003r2i7":"回头","k_002s6f3":"饥饿","k_003qd0t":"激动","k_002vgi4":"街舞","k_003nz33":"惊恐","k_002wh4p":"惊讶","k_003ozpu":"咖啡","k_003qvs4":"磕头","k_003l3wb":"可爱","k_003nuwm":"可怜","k_002rw1q":"抠鼻","k_002tujb":"骷髅","k_00030eq":"酷","k_03i8ath":"快哭了","k_000421h":"困","k_003l5i7":"蜡烛","k_003j72g":"篮球","k_003ofwl":"冷汗","k_02mw65v":"礼品袋","k_003ku40":"礼物","k_003ookz":"流汗","k_003on72":"流泪","k_003rjy0":"麻将","k_003q2f8":"猫咪","k_03et393":"么么哒","k_003j7j2":"玫瑰","k_002sr0b":"米饭","k_003nnza":"面条","k_003jef9":"奶瓶","k_002umn0":"难过","k_002rjib":"闹钟","k_0003zcn":"怒","k_003jzwq":"怄火","k_003j4js":"皮球","k_002r5ir":"啤酒","k_002ubu4":"瓢虫","k_003ppo6":"撇嘴","k_003ty3o":"乒乓","k_002vxwe":"汽车","k_00043hb":"强","k_003nmbo":"敲打","k_002tfhq":"青蛙","k_03i7lrn":"糗大了","k_003r03m":"拳头","k_00043h0":"弱","k_000345z":"色","k_003qmp9":"沙发","k_003it8a":"闪电","k_003pxow":"胜利","k_003kw8e":"示爱","k_003n99g":"手枪","k_00035cl":"衰","k_002vl3h":"睡觉","k_002rgqk":"太阳","k_003m9d1":"跳绳","k_002vobp":"跳跳","k_003mkoz":"偷笑","k_00041px":"吐","k_003rjh5":"委屈","k_003j36u":"西瓜","k_002re92":"下雨","k_00041py":"吓","k_003q06o":"献吻","k_002ubjp":"香蕉","k_003o2tr":"象棋","k_03ie6pa":"心碎了","k_003rao5":"信封","k_003l3us":"熊猫","k_000424d":"嘘","k_00033yi":"药","k_002qtyy":"疑问","k_002qe0o":"阴险","k_03gu7us":"右车头","k_03ere8m":"右哼哼","k_003uqk3":"雨伞","k_003tzdv":"月亮","k_0003z00":"晕","k_002vdrd":"再见","k_003ra1w":"炸弹","k_003lcad":"折磨","k_003q7sz":"纸巾","k_002thn9":"咒骂","k_003qx7f":"猪头","k_003l044":"抓狂","k_003qg4h":"转圈","k_003kb97":"龇牙","k_03gu53l":"左车头","k_03erd1f":"左哼哼","k_003nyvl":"爱情","k_003r85z":"爱心","k_003mk8j":"钞票","k_003pwfj":"大哭","k_00042w5":"刀","k_003nmtr":"握手","k_03c529p":"右太极","k_003n4mk":"钻戒","k_03c5488":"左太极","k_1llp7tu":"该用户不存在","k_0tbyqyb":"加载中…","k_0td1p3f":"保存中…","k_1klqdh1":"仅限汉字、英文、数字和下划线","k_03el5lp":"未填写","k_1ui0gai":"搜索指定内容","k_003nvk2":"消息","k_03agld7":"群提示","k_0elt0kw":"添加群聊","k_0s3sgel":"移出黑名单","k_1qqgjra":"$option3条未读消息","k_0uubyjr":"以下为未读消息","k_16as7eq":"表情回应","k_003s12u":"回复","k_003s38r":"更多","k_002wkr3":"翻译","k_13g4hxv":"翻译完成","k_003molk":"表情","k_165bbw6":"消息历史","k_13sqc0z":"清除消息","k_0glns86":"删除会话","k_13s99rx":"清空消息","k_11vsa3j":"退出群组","k_11vvszp":"解散群组","k_15i9w72":"群管理员","k_0p3espj":"设置备注名","k_118sw9v":"立即搜索","k_0h20hg5":"视频通话","k_0h22snw":"语音通话","k_003lz6t":"对方","k_1xf4yre":"发送给$option1","k_003por5":"截图","k_1rw7s82":" 访问相册中视频权限,以正常使用发送视频等功能。","k_003rcwm":"打开","k_1698c42":"在访达中打开","k_066fxsz":"查看文件夹","k_0k432y2":"无法发送,包含文件夹","k_002wb4y":"会话","k_0od4qyh":"视频文件异常","k_1bfkxg9":"不支持 0KB 文件的传输","k_0vvsw7g":"文件处理异常","k_06e224q":"[消息被管理员撤回]","k_1u1mjcl":"[消息被撤回]","k_1qcqxea":"选择多个会话","k_1qgmc20":"选择一个会话","k_1d8nx6f":"在新窗口中打开","k_1hz05ax":"正在下载原始资源,请稍候...","k_002robo":"清除"} \ No newline at end of file diff --git a/lib/i18n/strings_zh-Hans.i18n.json b/lib/i18n/strings_zh-Hans.i18n.json index eac5acd..a2937e0 100644 --- a/lib/i18n/strings_zh-Hans.i18n.json +++ b/lib/i18n/strings_zh-Hans.i18n.json @@ -1,701 +1 @@ -{ - "k_1yemzyd": "收到一条消息", - "k_0ylosxn": "自定义消息", - "k_13sajrj": "表情消息", - "k_13sjeb7": "文件消息", - "k_0yd2ft8": "群提示消息", - "k_13s7mxn": "图片消息", - "k_13satlt": "位置消息", - "k_00bbtsx": "合并转发消息", - "k_13sqwu4": "语音消息", - "k_13sqjjp": "视频消息", - "k_1fdhj9g": "该版本不支持此消息", - "k_06pujtm": "同意任何用户添加好友", - "k_0gyhkp5": "需要验证", - "k_121ruco": "拒绝任何人加好友", - "k_05nspni": "自定义字段", - "k_03fchyy": "群头像", - "k_03i9mfe": "群简介", - "k_03agq58": "群名称", - "k_039xqny": "群通知", - "k_003tr0a": "群主", - "k_03iqsh4": "$s为 ", - "k_191t5n4": "$opUserNickName修改", - "k_1pg6aoj": "$opUserNickName退出群聊", - "k_1f6zt3v": "邀请$invitedMemberString加入群组", - "k_0y7zd07": "将$invitedMemberString踢出群组", - "k_03c49qt": "去授权", - "k_1d5mshh": "用户$joinedMemberString加入了群聊", - "k_002wddw": "禁言", - "k_0got6f7": "解除禁言", - "k_0yenqf0": "$userName 被", - "k_0spotql": "将 $adminMember 设置为管理员", - "k_0pg5zzj": "系统消息 $operationType", - "k_0ohzb9l": "通话时间:$callTime", - "k_1uaqed6": "[自定义]", - "k_0z2z7rx": "[语音]", - "k_0y39ngu": "[表情]", - "k_1c7z88n": "[文件] $fileName", - "k_0y1a2my": "[图片]", - "k_0z4fib8": "[视频]", - "k_0y24mcg": "[位置]", - "k_0pewpd1": "[聊天记录]", - "k_13s8d9p": "未知消息", - "k_1c3us5n": "当前群组不支持@全体成员", - "k_11k579v": "发言中有非法语句", - "k_003qkx2": "日历", - "k_003n2pz": "相机", - "k_03idjo0": "联系人", - "k_003ltgm": "位置", - "k_02k3k86": "麦克风", - "k_003pm7l": "相册", - "k_15ao57x": "相册写入", - "k_164m3jd": "本地存储", - "k_0qba4ns": "想访问您的$yoursItem", - "k_03r6qyx": "我们需要您的同意才能获取信息", - "k_02noktt": "不允许", - "k_00043x4": "好", - "k_003qzac": "昨天", - "k_003r39d": "前天", - "k_03fqp9o": "星期天", - "k_03ibg5h": "星期一", - "k_03i7hu1": "星期二", - "k_03iaiks": "星期三", - "k_03el9pa": "星期四", - "k_03i7ok1": "星期五", - "k_03efxyg": "星期六", - "k_0oozw9x": "$diffMinutes 分钟前", - "k_003q7ba": "下午", - "k_003q7bb": "上午", - "k_003pu3h": "现在", - "k_13hzn00": "昨天 $yesterday", - "k_0n9pyxz": "用户不存在", - "k_1bjwemh": "搜索用户 ID", - "k_003kv3v": "搜索", - "k_02owlq8": "我的用户ID: $userID", - "k_1wu8h4x": "我是: $showName", - "k_16758qw": "添加好友", - "k_1shx4d9": "个性签名: $selfSignature", - "k_0i553x0": "填写验证信息", - "k_031ocwx": "请填写备注和分组", - "k_003ojje": "备注", - "k_003lsav": "分组", - "k_167bdvq": "我的好友", - "k_156b4ut": "好友申请已发送", - "k_002r305": "发送", - "k_03gu05e": "聊天室", - "k_03b4f3p": "会议群", - "k_03avj1p": "公开群", - "k_03asq2g": "工作群", - "k_03b3hbi": "未知群", - "k_1loix7s": "群类型: $groupType", - "k_1lqbsib": "该群聊不存在", - "k_03h153m": "搜索群ID", - "k_0oxak3r": "群申请已发送", - "k_002rflt": "删除", - "k_1don84v": "无法定位到原消息", - "k_003q5fi": "复制", - "k_003prq0": "转发", - "k_002r1h2": "多选", - "k_003j708": "引用", - "k_003pqpr": "撤回", - "k_03ezhho": "已复制", - "k_11ctfsz": "暂未实现", - "k_1hbjg5g": "[群系统消息]", - "k_03tvswb": "[未知消息]", - "k_155cj23": "您撤回了一条消息,", - "k_0gapun3": "重新编辑", - "k_1uh417q": "$displayName撤回了一条消息", - "k_1aszp2k": "您确定要重发这条消息么?", - "k_003rzap": "确定", - "k_003nevv": "取消", - "k_0003z7x": "您", - "k_002wfe4": "已读", - "k_002wjlg": "未读", - "k_0h1ygf8": "发起通话", - "k_0h169j0": "取消通话", - "k_0h13jjk": "接受通话", - "k_0h19hfx": "拒绝通话", - "k_0obi9lh": "超时未接听", - "k_0y9u662": "“$appName”暂不可以打开此类文件,你可以使用其他应用打开并预览", - "k_001nmhu": "用其他应用打开", - "k_1ht1b80": "正在接收中", - "k_105682d": "图片加载失败", - "k_0pytyeu": "图片保存成功", - "k_0akceel": "图片保存失败", - "k_003rk1s": "保存", - "k_04a0awq": "[语音消息]", - "k_105c3y3": "视频加载失败", - "k_176rzr7": "聊天记录", - "k_0d5z4m5": "选择提醒人", - "k_003ngex": "完成", - "k_1665ltg": "发起呼叫", - "k_003n8b0": "拍摄", - "k_003kthh": "照片", - "k_003tnp0": "文件", - "k_0jhdhtp": "发送失败,视频不能大于100MB", - "k_119ucng": "图片不能为空", - "k_0w9x8gw": "选择成功$successPath", - "k_13dsw4l": "松开取消", - "k_0am7r68": "手指上滑,取消发送", - "k_15jl6qw": "说话时间太短!", - "k_0gx7vl6": "按住说话", - "k_15dlafd": "逐条转发", - "k_15dryxy": "合并转发", - "k_1eyhieh": "确定删除已选消息", - "k_17fmlyf": "清除聊天", - "k_0dhesoz": "取消置顶", - "k_002sk7x": "置顶", - "k_003ll77": "草稿", - "k_03icaxo": "自定义", - "k_1969986": "[语音通话]:$callingLastMsgShow", - "k_1960dlr": "[视频通话]:$callingLastMsgShow", - "k_1np495n": "$messageString[有人@我]", - "k_1m797yi": "$messageString[@所有人]", - "k_1uaov41": "查找聊天内容", - "k_003kfai": "未知", - "k_13dq4an": "自动审批", - "k_0l13cde": "管理员审批", - "k_11y8c6a": "禁止加群", - "k_1kvyskd": "无网络连接,无法修改", - "k_16payqf": "加群方式", - "k_0vzvn8r": "修改群名称", - "k_038lh6u": "群管理", - "k_0k5wyiy": "设置管理员", - "k_0goiuwk": "全员禁言", - "k_1g889xx": "全员禁言开启后,只允许群主和管理员发言。", - "k_0wlrefq": "添加需要禁言的群成员", - "k_0goox5g": "设置禁言", - "k_08daijh": "成功取消管理员身份", - "k_0bxm97s": "管理员 ($adminNum/10)", - "k_0k5u935": "添加管理员", - "k_03enyx5": "群成员", - "k_0jayw3z": "群成员($groupMemberNum人)", - "k_0h1svv1": "删除群成员", - "k_0h1g636": "添加群成员", - "k_0uj7208": "无网络连接,无法查看群成员", - "k_01yfa4o": "$memberCount人", - "k_0hpukyx": "查看更多群成员", - "k_0qtsar0": "消息免打扰", - "k_0ef2a12": "修改我的群昵称", - "k_1aajych": "仅限中文、字母、数字和下划线,2-20个字", - "k_137pab5": "我的群昵称", - "k_0ivim6d": "暂无群公告", - "k_03eq6cn": "群公告", - "k_002vxya": "编辑", - "k_17fpl3y": "置顶聊天", - "k_03es1ox": "群类型", - "k_003mz1i": "同意", - "k_003lpre": "拒绝", - "k_003qk66": "头像", - "k_003lhvk": "昵称", - "k_003ps50": "账号", - "k_15lx52z": "个性签名", - "k_003qgkp": "性别", - "k_003m6hr": "生日", - "k_0003v6a": "男", - "k_00043x2": "女", - "k_03bcjkv": "未设置", - "k_11s0gdz": "修改昵称", - "k_0p3j4sd": "仅限中字、字母、数字和下划线", - "k_15lyvdt": "修改签名", - "k_0vylzjp": "这个人很懒,什么也没写", - "k_1hs7ese": "等上线再改这个", - "k_03exjk7": "备注名", - "k_0s3skfd": "加入黑名单", - "k_0p3b31s": "修改备注名", - "k_0003y9x": "无", - "k_11zgnfs": "个人资料", - "k_03xd79d": "个性签名: $signature", - "k_1tez2xl": "暂无个性签名", - "k_118prbn": "全局搜索", - "k_1m9dftc": "全部联系人", - "k_0em4gyz": "全部群聊", - "k_002twmj": "群聊", - "k_09kga0d": "更多聊天记录", - "k_1ui5lzi": "$count条相关聊天记录", - "k_09khmso": "相关聊天记录", - "k_1kevf4k": "与$receiver的聊天记录", - "k_0vjj2kp": "群聊的聊天记录", - "k_003n2rp": "选择", - "k_03ignw6": "所有人", - "k_03erpei": "管理员", - "k_0qi9tno": "群主、管理员", - "k_1m9exwh": "最近联系人", - "k_119nwqr": "输入不能为空", - "k_0pzwbmg": "视频保存成功", - "k_0aktupv": "视频保存失败", - "k_1qbg9xc": "$option8为 ", - "k_1wq5ubm": "$option7修改", - "k_0y5pu80": "$option6退出群聊", - "k_0nl7cmd": "邀请$option5加入群组", - "k_1ju5iqw": "将$option4踢出群组", - "k_1ovt677": "用户$option3加入了群聊", - "k_0k05b8b": "$option2 被", - "k_0wm4xeb": "系统消息 $option2", - "k_0nbq9v3": "通话时间:$option2", - "k_0i1kf53": "[文件] $option2", - "k_1wh4atg": "$option2 分钟前", - "k_07sh7g1": "昨天 $option2", - "k_1pj8xzh": "我的用户ID: $option2", - "k_0py1evo": "个性签名: $option2", - "k_1kvj4i2": "$option2撤回了一条消息", - "k_1v0lbpp": "“$option2”暂不可以打开此类文件,你可以使用其他应用打开并预览", - "k_0torwfz": "选择成功$option2", - "k_0i1bjah": "$option1撤回了一条消息", - "k_1qzxh9q": "通话时间:$option3", - "k_0wrgmom": "[语音通话]:$option1", - "k_06ix2f0": "[视频通话]:$option2", - "k_08o3z5w": "[文件] $option1", - "k_0ezbepg": "$option2[有人@我]", - "k_1ccnht1": "$option2[@所有人]", - "k_1k3arsw": "管理员 ($option2/10)", - "k_1d4golg": "群成员($option1人)", - "k_1bg69nt": "$option1人", - "k_00gjqxj": "个性签名: $option1", - "k_0c29cxr": "$option1条相关聊天记录", - "k_1twk5rz": "与$option1的聊天记录", - "k_1vn4xq1": "将 $adminMember 取消管理员", - "k_0e35hsw": "为方便您将所拍摄的照片或视频发送给朋友,以及进行视频通话,请允许我们访问摄像头进行拍摄照片和视频。", - "k_0dj6yr7": "为方便您发送语音消息、拍摄视频以及音视频通话,请允许我们使用麦克风进行录音。", - "k_003qnsl": "存储", - "k_0s3rtpw": "为方便您查看和选择相册里的图片视频发送给朋友,以及保存内容到设备,请允许我们访问您设备上的照片、媒体内容。", - "k_0tezv85": " 申请获取$option2", - "k_002rety": "权限", - "k_18o68ro": "需要授予", - "k_1onpf8u": " 相机权限,以正常使用拍摄图片视频、视频通话等功能。", - "k_17irga5": " 麦克风权限,以正常使用发送语音消息、拍摄视频、音视频通话等功能。", - "k_0572kc4": " 访问照片权限,以正常使用发送图片、视频等功能。", - "k_0slykws": " 访问相册写入权限,以正常使用存储图片、视频等功能。", - "k_119pkcd": " 文件读写权限,以正常使用在聊天功能中的图片查看、选择能力和发送文件的能力。", - "k_0gqewd3": "以后再说", - "k_03eq4s1": "去开启", - "k_0nt2uyg": "回到最新位置", - "k_04l16at": "$option1条新消息", - "k_13p3w93": "有人@我", - "k_18w5uk6": "@所有人", - "k_0jmujgh": "其他文件正在接收中", - "k_12s5ept": "消息详情", - "k_0mxa4f4": "$option1人已读", - "k_061tue3": "$option2人未读", - "k_18qjstb": "转让群主", - "k_0on1aj2": "有$option2条@我消息", - "k_09j4izl": "[有人@我] ", - "k_1oqtjw0": "[@所有人] ", - "k_1x5a9vb": "我是: $option1", - "k_14n31e7": "进群请求", - "k_08nc5j1": "群类型: $option1", - "k_1josu12": "$option1 条入群请求", - "k_0n2x5s0": "验证消息: $option2", - "k_03c1nx0": "已同意", - "k_03aw9w8": "已拒绝", - "k_038ryos": "去处理", - "k_0gw8pum": "进群申请", - "k_1gcvfrj": "请填写备注", - "k_002v9zj": "确认", - "k_10oqrki": "轻触拍照", - "k_0f8b3ws": "加载失败", - "k_11cm5lm": "手动聚焦", - "k_002uzrd": "预览", - "k_003qkn3": "录像", - "k_003k6a7": "拍照", - "k_0bqpqco": "拍照按钮", - "k_1626ozl": "停止录像", - "k_003lvmu": "前置", - "k_003lued": "后置", - "k_003lwzh": "外置", - "k_002qzi3": "关闭", - "k_003pufb": "自动", - "k_0apm0ze": "拍照时闪光", - "k_157zog5": "始终闪光", - "k_0cfyqhy": "$option1 画面预览", - "k_0phctlz": "闪光模式: $option2", - "k_02vfqe0": "切换至 $option3 摄像头", - "k_0f0y9ex": "说话时间太短", - "k_0ln70tk": "无法打开URL", - "k_11a3jdv": "轻触拍照,长按摄像", - "k_1k18miv": "请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。", - "k_1fu9ahv": "全员禁言状态", - "k_0gmwbnd": "全员禁言中", - "k_0got2zr": "您被禁言", - "k_0y9jck8": "你必须自定义search bar,并处理点击跳转", - "k_0yum3tv": "如使用自定义区域,请在profileWidgetBuilder传入对应组件", - "k_09kalj0": "清空聊天记录", - "k_14j5iul": "删除并退出", - "k_125ru1w": "解散该群", - "k_0jtutmw": "退出后不会接收到此群聊消息", - "k_0jtzmqa": "解散后不会接收到此群聊消息", - "k_0r8fi93": "好友添加成功", - "k_02qw14e": "好友申请已发出", - "k_0n3md5x": "当前用户在黑名单", - "k_094phq4": "好友添加失败", - "k_129scag": "好友删除成功", - "k_129uzfn": "好友删除失败", - "k_1666isy": "清除好友", - "k_1679vrd": "加为好友", - "k_1ualc52": "看看对方带来的数据是啥", - "k_0szluvp": "设置对方在线状态", - "k_0f4rnf8": "该用户已是好友", - "k_1tdkom4": "您已是群成员", - "k_1p2lyuz": "对方正在输入中...", - "k_1g8wfpy": "...共$option1人", - "k_12rv9vw": "回应详情", - "k_0havgi0": "[查看详情 >>](${linkMessage.link})", - "k_0n9p7g8": "群组不存在", - "k_1tdh5vn": "您不是群成员", - "k_0h1q57v": "暂无群成员", - "k_0y5drq1": "[查看详情 >>]($option1)", - "k_03pjp61": "[表情消息]", - "k_1jpvzul": "[自定义消息]", - "k_03u3bh1": "[文件消息]", - "k_1odsnsw": "[群消息]", - "k_03sel4t": "[图片消息]", - "k_03sfw3r": "[位置消息]", - "k_03xpuwq": "[合并消息]", - "k_07ycxwo": "[没有元素]", - "k_03rc9vz": "[文本消息]", - "k_046uopf": "[视频消息]", - "k_0ehmsun": "设备存储空间不足,建议清理,以获得更好使用体验", - "k_003kmos": "图片", - "k_002s86q": "视频", - "k_06bk5ei": "视频消息仅限 mp4 格式", - "k_13opfxf": "Web网页端不支持搜索", - "k_1i0o0y2": "暂时仅限 Android/iOS 端", - "k_045dtzl": "$option1的聊天记录", - "k_0t0131u": "群资料信息", - "k_18ok8xz": "消息接收方式", - "k_03ax3ks": "群资料", - "k_0sqvoqo": "将 $option1 设置为管理员", - "k_1gbg1v8": "将 $option1 取消管理员", - "k_17k64g4": "群聊创建成功!", - "k_05mn217": "暂未安装表情包插件,如需使用表情相关功能,请根据本文档安装:https://cloud.tencent.com/document/product/269/70746", - "k_14j17nz": "暂无表情包", - "k_1gnnby6": " 想访问您的$option2", - "k_0fvjexh": "正在下载中", - "k_1cdagzz": "已加入待下载队列,其他文件下载中", - "k_0g4vojc": "开始下载", - "k_1g32es3": "[调皮]@2x.png", - "k_1g8qorz": "[爱你]@2x.png", - "k_1g4hmx6": "[爱情]@2x.png", - "k_1g6b558": "[爱心]@2x.png", - "k_1g3m4su": "[傲慢]@2x.png", - "k_1g2jym7": "[白眼]@2x.png", - "k_0cgkxuw": "[棒棒糖]@2x.png", - "k_1g48br2": "[抱抱]@2x.png", - "k_1g49ol8": "[抱拳]@2x.png", - "k_1g0ras3": "[爆筋]@2x.png", - "k_1ghy881": "[鄙视]@2x.png", - "k_1g86bmv": "[闭嘴]@2x.png", - "k_1g1xs1p": "[鞭炮]@2x.png", - "k_1g8i6ri": "[便便]@2x.png", - "k_1g2u5kf": "[擦汗]@2x.png", - "k_1g60uwh": "[彩带]@2x.png", - "k_1g1o0d0": "[彩球]@2x.png", - "k_1g6a6yq": "[菜刀]@2x.png", - "k_1g6vqo2": "[差劲]@2x.png", - "k_1g0kvjc": "[钞票]@2x.png", - "k_1g65x7e": "[车厢]@2x.png", - "k_0e1tjol": "[打哈欠]@2x.png", - "k_1g65n58": "[大兵]@2x.png", - "k_1g7se7o": "[大哭]@2x.png", - "k_1g03868": "[蛋糕]@2x.png", - "k_1h8nm66": "[刀]@2x.png", - "k_1g3dlpi": "[得意]@2x.png", - "k_1g3u434": "[灯泡]@2x.png", - "k_1giuqs7": "[凋谢]@2x.png", - "k_1g8r0r9": "[多云]@2x.png", - "k_1g7k6i1": "[发呆]@2x.png", - "k_1g44zsp": "[发抖]@2x.png", - "k_1g5l96i": "[飞机]@2x.png", - "k_1g7wsqj": "[飞吻]@2x.png", - "k_1g49luq": "[奋斗]@2x.png", - "k_1gixbsm": "[风车]@2x.png", - "k_1g6cqbq": "[尴尬]@2x.png", - "k_1g6jbw5": "[勾引]@2x.png", - "k_1g3lwo1": "[鼓掌]@2x.png", - "k_1g13nkj": "[害羞]@2x.png", - "k_1g0mt47": "[憨笑]@2x.png", - "k_0bxujkf": "[红灯笼]@2x.png", - "k_0hhaeh8": "[红双喜]@2x.png", - "k_1g0jnts": "[坏笑]@2x.png", - "k_1g46g9c": "[挥手]@2x.png", - "k_1g4vi9g": "[回头]@2x.png", - "k_1gf7hes": "[饥饿]@2x.png", - "k_1g6mvsm": "[激动]@2x.png", - "k_1gku5mf": "[街舞]@2x.png", - "k_1g4hidg": "[惊恐]@2x.png", - "k_1gjbrtu": "[惊讶]@2x.png", - "k_1g6sand": "[咖啡]@2x.png", - "k_1g4s8rj": "[磕头]@2x.png", - "k_1g1wn34": "[可爱]@2x.png", - "k_1g3l0wd": "[可怜]@2x.png", - "k_1ggaon9": "[抠鼻]@2x.png", - "k_1ggvcb0": "[骷髅]@2x.png", - "k_1h8yqjt": "[酷]@2x.png", - "k_0jac97i": "[快哭了]@2x.png", - "k_1h8oiby": "[困]@2x.png", - "k_1g0s5hg": "[蜡烛]@2x.png", - "k_1g1iuer": "[篮球]@2x.png", - "k_1g2xjfi": "[冷汗]@2x.png", - "k_0s5oyqw": "[礼品袋]@2x.png", - "k_1g1qqvf": "[礼物]@2x.png", - "k_1g2slew": "[流汗]@2x.png", - "k_1g3z9xx": "[流泪]@2x.png", - "k_1g6pabn": "[麻将]@2x.png", - "k_0pkaxul": "[麦克风]@2x.png", - "k_1g7m0zj": "[猫咪]@2x.png", - "k_0ibvtpo": "[么么哒]@2x.png", - "k_1g1hoh1": "[玫瑰]@2x.png", - "k_1gfzeow": "[米饭]@2x.png", - "k_1g5l15p": "[面条]@2x.png", - "k_1g2hfa6": "[奶瓶]@2x.png", - "k_1gix9pj": "[难过]@2x.png", - "k_1giqn6g": "[闹钟]@2x.png", - "k_1h8kd64": "[怒]@2x.png", - "k_1g0vui9": "[怄火]@2x.png", - "k_1g1jsj7": "[皮球]@2x.png", - "k_1ghdluw": "[啤酒]@2x.png", - "k_1gl6ec7": "[瓢虫]@2x.png", - "k_1g7gg5p": "[撇嘴]@2x.png", - "k_1g8psin": "[乒乓]@2x.png", - "k_1gjzu3p": "[汽车]@2x.png", - "k_1h8mr0k": "[强]@2x.png", - "k_1g45y2n": "[敲打]@2x.png", - "k_1gkaxsl": "[青蛙]@2x.png", - "k_0jcfnoo": "[糗大了]@2x.png", - "k_1g4njy1": "[拳头]@2x.png", - "k_1h8mqr3": "[弱]@2x.png", - "k_1h926fg": "[色]@2x.png", - "k_1g6rtbq": "[沙发]@2x.png", - "k_1giirh6": "[删除]@2x.png", - "k_1g14ny9": "[闪电]@2x.png", - "k_1g6bmsr": "[胜利]@2x.png", - "k_1g1rytx": "[示爱]@2x.png", - "k_1g52fbz": "[手枪]@2x.png", - "k_1h90dam": "[衰]@2x.png", - "k_1gigiae": "[睡觉]@2x.png", - "k_1gijchz": "[太阳]@2x.png", - "k_1g1sgji": "[跳绳]@2x.png", - "k_1gjwuri": "[跳跳]@2x.png", - "k_1g0juhk": "[偷笑]@2x.png", - "k_1h8nzla": "[吐]@2x.png", - "k_1g6cv0i": "[委屈]@2x.png", - "k_1g46l5g": "[握手]@2x.png", - "k_1g2pgkd": "[西瓜]@2x.png", - "k_1ging9p": "[下雨]@2x.png", - "k_1h8nzil": "[吓]@2x.png", - "k_1g7q7wr": "[献吻]@2x.png", - "k_1gl6uum": "[香蕉]@2x.png", - "k_1g23fys": "[象棋]@2x.png", - "k_0j75rdh": "[心碎了]@2x.png", - "k_1g6ajj2": "[信封]@2x.png", - "k_1g21prz": "[熊猫]@2x.png", - "k_1h8octi": "[嘘]@2x.png", - "k_1h91zox": "[药]@2x.png", - "k_1ghttfl": "[疑问]@2x.png", - "k_1ghk7sz": "[阴险]@2x.png", - "k_0gl37zz": "[右车头]@2x.png", - "k_0ifkj1p": "[右哼哼]@2x.png", - "k_0g1yh2e": "[右太极]@2x.png", - "k_1g9dkfc": "[雨伞]@2x.png", - "k_1g8jl88": "[月亮]@2x.png", - "k_1h8lhqj": "[晕]@2x.png", - "k_1gi9x2q": "[再见]@2x.png", - "k_1g6dwwv": "[炸弹]@2x.png", - "k_1fzmkfi": "[折磨]@2x.png", - "k_1g6jbiw": "[纸巾]@2x.png", - "k_1ggjnwu": "[咒骂]@2x.png", - "k_1g4qlq8": "[猪头]@2x.png", - "k_1g1lqzz": "[抓狂]@2x.png", - "k_1g80j3u": "[转圈]@2x.png", - "k_1g0z55s": "[龇牙]@2x.png", - "k_1g3ju6v": "[钻戒]@2x.png", - "k_0gl51l6": "[左车头]@2x.png", - "k_0iflllk": "[左哼哼]@2x.png", - "k_0g1y3ir": "[左太极]@2x.png", - "k_026hiq5": "消息列表加载中", - "k_003tu8k": "爱你", - "k_003myvp": "傲慢", - "k_003kddw": "白眼", - "k_039yfhv": "棒棒糖", - "k_003nu3p": "抱抱", - "k_003nijr": "抱拳", - "k_003mg88": "爆筋", - "k_002v17e": "鄙视", - "k_003qhy4": "闭嘴", - "k_003l5fq": "鞭炮", - "k_003uacl": "便便", - "k_003oq1g": "擦汗", - "k_003qvey": "彩带", - "k_003jci7": "彩球", - "k_003pyu1": "菜刀", - "k_003q97d": "差劲", - "k_003po5d": "车厢", - "k_03eadb2": "打哈欠", - "k_003pnuf": "大兵", - "k_003kg57": "蛋糕", - "k_003mxkt": "得意", - "k_003onu3": "灯泡", - "k_002uv8s": "凋谢", - "k_003kqy0": "调皮", - "k_003tyum": "多云", - "k_003pv9u": "发呆", - "k_036o6mu": "发抖t", - "k_003nogx": "飞机", - "k_003q7wg": "飞吻", - "k_003m0jd": "奋斗", - "k_002ult9": "风车", - "k_003r8gt": "尴尬", - "k_003qy4u": "勾引", - "k_003mnoa": "鼓掌", - "k_003lmw8": "害羞", - "k_003mb30": "憨笑", - "k_03bj41g": "红灯笼", - "k_03dxw2f": "红双喜", - "k_003mk57": "坏笑", - "k_003nmvf": "挥手", - "k_003r2i7": "回头", - "k_002s6f3": "饥饿", - "k_003qd0t": "激动", - "k_002vgi4": "街舞", - "k_003nz33": "惊恐", - "k_002wh4p": "惊讶", - "k_003ozpu": "咖啡", - "k_003qvs4": "磕头", - "k_003l3wb": "可爱", - "k_003nuwm": "可怜", - "k_002rw1q": "抠鼻", - "k_002tujb": "骷髅", - "k_00030eq": "酷", - "k_03i8ath": "快哭了", - "k_000421h": "困", - "k_003l5i7": "蜡烛", - "k_003j72g": "篮球", - "k_003ofwl": "冷汗", - "k_02mw65v": "礼品袋", - "k_003ku40": "礼物", - "k_003ookz": "流汗", - "k_003on72": "流泪", - "k_003rjy0": "麻将", - "k_003q2f8": "猫咪", - "k_03et393": "么么哒", - "k_003j7j2": "玫瑰", - "k_002sr0b": "米饭", - "k_003nnza": "面条", - "k_003jef9": "奶瓶", - "k_002umn0": "难过", - "k_002rjib": "闹钟", - "k_0003zcn": "怒", - "k_003jzwq": "怄火", - "k_003j4js": "皮球", - "k_002r5ir": "啤酒", - "k_002ubu4": "瓢虫", - "k_003ppo6": "撇嘴", - "k_003ty3o": "乒乓", - "k_002vxwe": "汽车", - "k_00043hb": "强", - "k_003nmbo": "敲打", - "k_002tfhq": "青蛙", - "k_03i7lrn": "糗大了", - "k_003r03m": "拳头", - "k_00043h0": "弱", - "k_000345z": "色", - "k_003qmp9": "沙发", - "k_003it8a": "闪电", - "k_003pxow": "胜利", - "k_003kw8e": "示爱", - "k_003n99g": "手枪", - "k_00035cl": "衰", - "k_002vl3h": "睡觉", - "k_002rgqk": "太阳", - "k_003m9d1": "跳绳", - "k_002vobp": "跳跳", - "k_003mkoz": "偷笑", - "k_00041px": "吐", - "k_003rjh5": "委屈", - "k_003j36u": "西瓜", - "k_002re92": "下雨", - "k_00041py": "吓", - "k_003q06o": "献吻", - "k_002ubjp": "香蕉", - "k_003o2tr": "象棋", - "k_03ie6pa": "心碎了", - "k_003rao5": "信封", - "k_003l3us": "熊猫", - "k_000424d": "嘘", - "k_00033yi": "药", - "k_002qtyy": "疑问", - "k_002qe0o": "阴险", - "k_03gu7us": "右车头", - "k_03ere8m": "右哼哼", - "k_003uqk3": "雨伞", - "k_003tzdv": "月亮", - "k_0003z00": "晕", - "k_002vdrd": "再见", - "k_003ra1w": "炸弹", - "k_003lcad": "折磨", - "k_003q7sz": "纸巾", - "k_002thn9": "咒骂", - "k_003qx7f": "猪头", - "k_003l044": "抓狂", - "k_003qg4h": "转圈", - "k_003kb97": "龇牙", - "k_03gu53l": "左车头", - "k_03erd1f": "左哼哼", - "k_003nyvl": "爱情", - "k_003r85z": "爱心", - "k_003mk8j": "钞票", - "k_003pwfj": "大哭", - "k_00042w5": "刀", - "k_003nmtr": "握手", - "k_03c529p": "右太极", - "k_003n4mk": "钻戒", - "k_03c5488": "左太极", - "k_1llp7tu": "该用户不存在", - "k_0tbyqyb": "加载中…", - "k_0td1p3f": "保存中…", - "k_1klqdh1": "仅限汉字、英文、数字和下划线", - "k_03el5lp": "未填写", - "k_1ui0gai": "搜索指定内容", - "k_003nvk2": "消息", - "k_03agld7": "群提示", - "k_0elt0kw": "添加群聊", - "k_0s3sgel": "移出黑名单", - "k_1qqgjra": "$option3条未读消息", - "k_0uubyjr": "以下为未读消息", - "k_16as7eq": "表情回应", - "k_003s12u": "回复", - "k_003s38r": "更多", - "k_002wkr3": "翻译", - "k_13g4hxv": "翻译完成", - "k_003molk": "表情", - "k_165bbw6": "消息历史", - "k_13sqc0z": "清除消息", - "k_0glns86": "删除会话", - "k_13s99rx": "清空消息", - "k_11vsa3j": "退出群组", - "k_11vvszp": "解散群组", - "k_15i9w72": "群管理员", - "k_0p3espj": "设置备注名", - "k_118sw9v": "立即搜索", - "k_0h20hg5": "视频通话", - "k_0h22snw": "语音通话", - "k_003lz6t": "对方", - "k_1xf4yre": "发送给$option1", - "k_003por5": "截图", - "k_1rw7s82": " 访问相册中视频权限,以正常使用发送视频等功能。", - "k_003rcwm": "打开", - "k_1698c42": "在访达中打开", - "k_066fxsz": "查看文件夹", - "k_0k432y2": "无法发送,包含文件夹", - "k_002wb4y": "会话", - "k_0od4qyh": "视频文件异常", - "k_1bfkxg9": "不支持 0KB 文件的传输", - "k_0vvsw7g": "文件处理异常", - "k_06e224q": "[消息被管理员撤回]", - "k_1u1mjcl": "[消息被撤回]", - "k_1qcqxea": "选择多个会话", - "k_1qgmc20": "选择一个会话", - "k_1d8nx6f": "在新窗口中打开", - "k_1hz05ax": "正在下载原始资源,请稍候..." -} \ No newline at end of file +{"k_1yemzyd":"收到一条消息","k_0ylosxn":"自定义消息","k_13sajrj":"表情消息","k_13sjeb7":"文件消息","k_0yd2ft8":"群提示消息","k_13s7mxn":"图片消息","k_13satlt":"位置消息","k_00bbtsx":"合并转发消息","k_13sqwu4":"语音消息","k_13sqjjp":"视频消息","k_1fdhj9g":"该版本不支持此消息","k_06pujtm":"同意任何用户添加好友","k_0gyhkp5":"需要验证","k_121ruco":"拒绝任何人加好友","k_05nspni":"自定义字段","k_03fchyy":"群头像","k_03i9mfe":"群简介","k_03agq58":"群名称","k_039xqny":"群通知","k_003tr0a":"群主","k_03iqsh4":"$s为 ","k_191t5n4":"$opUserNickName修改","k_1pg6aoj":"$opUserNickName退出群聊","k_1f6zt3v":"邀请$invitedMemberString加入群组","k_0y7zd07":"将$invitedMemberString踢出群组","k_03c49qt":"去授权","k_1d5mshh":"用户$joinedMemberString加入了群聊","k_002wddw":"禁言","k_0got6f7":"解除禁言","k_0yenqf0":"$userName 被","k_0spotql":"将 $adminMember 设置为管理员","k_0pg5zzj":"系统消息 $operationType","k_0ohzb9l":"通话时间:$callTime","k_1uaqed6":"[自定义]","k_0z2z7rx":"[语音]","k_0y39ngu":"[表情]","k_1c7z88n":"[文件] $fileName","k_0y1a2my":"[图片]","k_0z4fib8":"[视频]","k_0y24mcg":"[位置]","k_0pewpd1":"[聊天记录]","k_13s8d9p":"未知消息","k_1c3us5n":"当前群组不支持@全体成员","k_11k579v":"发言中有非法语句","k_003qkx2":"日历","k_003n2pz":"相机","k_03idjo0":"联系人","k_003ltgm":"位置","k_02k3k86":"麦克风","k_003pm7l":"相册","k_15ao57x":"相册写入","k_164m3jd":"本地存储","k_0qba4ns":"想访问您的$yoursItem","k_03r6qyx":"我们需要您的同意才能获取信息","k_02noktt":"不允许","k_00043x4":"好","k_003qzac":"昨天","k_003r39d":"前天","k_03fqp9o":"星期天","k_03ibg5h":"星期一","k_03i7hu1":"星期二","k_03iaiks":"星期三","k_03el9pa":"星期四","k_03i7ok1":"星期五","k_03efxyg":"星期六","k_0oozw9x":"$diffMinutes 分钟前","k_003q7ba":"下午","k_003q7bb":"上午","k_003pu3h":"现在","k_13hzn00":"昨天 $yesterday","k_0n9pyxz":"用户不存在","k_1bjwemh":"搜索用户 ID","k_003kv3v":"搜索","k_02owlq8":"我的用户ID: $userID","k_1wu8h4x":"我是: $showName","k_16758qw":"添加好友","k_1shx4d9":"个性签名: $selfSignature","k_0i553x0":"填写验证信息","k_031ocwx":"请填写备注和分组","k_003ojje":"备注","k_003lsav":"分组","k_167bdvq":"我的好友","k_156b4ut":"好友申请已发送","k_002r305":"发送","k_03gu05e":"聊天室","k_03b4f3p":"会议群","k_03avj1p":"公开群","k_03asq2g":"工作群","k_03b3hbi":"未知群","k_1loix7s":"群类型: $groupType","k_1lqbsib":"该群聊不存在","k_03h153m":"搜索群ID","k_0oxak3r":"群申请已发送","k_002rflt":"删除","k_1don84v":"无法定位到原消息","k_003q5fi":"复制","k_003prq0":"转发","k_002r1h2":"多选","k_003j708":"引用","k_003pqpr":"撤回","k_03ezhho":"已复制","k_11ctfsz":"暂未实现","k_1hbjg5g":"[群系统消息]","k_03tvswb":"[未知消息]","k_155cj23":"您撤回了一条消息,","k_0gapun3":"重新编辑","k_1uh417q":"$displayName撤回了一条消息","k_1aszp2k":"您确定要重发这条消息么?","k_003rzap":"确定","k_003nevv":"取消","k_0003z7x":"您","k_002wfe4":"已读","k_002wjlg":"未读","k_0h1ygf8":"发起通话","k_0h169j0":"取消通话","k_0h13jjk":"接受通话","k_0h19hfx":"拒绝通话","k_0obi9lh":"超时未接听","k_0y9u662":"“$appName”暂不可以打开此类文件,你可以使用其他应用打开并预览","k_001nmhu":"用其他应用打开","k_1ht1b80":"正在接收中","k_105682d":"图片加载失败","k_0pytyeu":"图片保存成功","k_0akceel":"图片保存失败","k_003rk1s":"保存","k_04a0awq":"[语音消息]","k_105c3y3":"视频加载失败","k_176rzr7":"聊天记录","k_0d5z4m5":"选择提醒人","k_003ngex":"完成","k_1665ltg":"发起呼叫","k_003n8b0":"拍摄","k_003kthh":"照片","k_003tnp0":"文件","k_0jhdhtp":"发送失败,视频不能大于100MB","k_119ucng":"图片不能为空","k_0w9x8gw":"选择成功$successPath","k_13dsw4l":"松开取消","k_0am7r68":"手指上滑,取消发送","k_15jl6qw":"说话时间太短!","k_0gx7vl6":"按住说话","k_15dlafd":"逐条转发","k_15dryxy":"合并转发","k_1eyhieh":"确定删除已选消息","k_17fmlyf":"清除聊天","k_0dhesoz":"取消置顶","k_002sk7x":"置顶","k_003ll77":"草稿","k_03icaxo":"自定义","k_1969986":"[语音通话]:$callingLastMsgShow","k_1960dlr":"[视频通话]:$callingLastMsgShow","k_1np495n":"$messageString[有人@我]","k_1m797yi":"$messageString[@所有人]","k_1uaov41":"查找聊天内容","k_003kfai":"未知","k_13dq4an":"自动审批","k_0l13cde":"管理员审批","k_11y8c6a":"禁止加群","k_1kvyskd":"无网络连接,无法修改","k_16payqf":"加群方式","k_0vzvn8r":"修改群名称","k_038lh6u":"群管理","k_0k5wyiy":"设置管理员","k_0goiuwk":"全员禁言","k_1g889xx":"全员禁言开启后,只允许群主和管理员发言。","k_0wlrefq":"添加需要禁言的群成员","k_0goox5g":"设置禁言","k_08daijh":"成功取消管理员身份","k_0bxm97s":"管理员 ($adminNum/10)","k_0k5u935":"添加管理员","k_03enyx5":"群成员","k_0jayw3z":"群成员($groupMemberNum人)","k_0h1svv1":"删除群成员","k_0h1g636":"添加群成员","k_0uj7208":"无网络连接,无法查看群成员","k_01yfa4o":"$memberCount人","k_0hpukyx":"查看更多群成员","k_0qtsar0":"消息免打扰","k_0ef2a12":"修改我的群昵称","k_1aajych":"仅限中文、字母、数字和下划线,2-20个字","k_137pab5":"我的群昵称","k_0ivim6d":"暂无群公告","k_03eq6cn":"群公告","k_002vxya":"编辑","k_17fpl3y":"置顶聊天","k_03es1ox":"群类型","k_003mz1i":"同意","k_003lpre":"拒绝","k_003qk66":"头像","k_003lhvk":"昵称","k_003ps50":"账号","k_15lx52z":"个性签名","k_003qgkp":"性别","k_003m6hr":"生日","k_0003v6a":"男","k_00043x2":"女","k_03bcjkv":"未设置","k_11s0gdz":"修改昵称","k_0p3j4sd":"仅限中字、字母、数字和下划线","k_15lyvdt":"修改签名","k_0vylzjp":"这个人很懒,什么也没写","k_1hs7ese":"等上线再改这个","k_03exjk7":"备注名","k_0s3skfd":"加入黑名单","k_0p3b31s":"修改备注名","k_0003y9x":"无","k_11zgnfs":"个人资料","k_03xd79d":"个性签名: $signature","k_1tez2xl":"暂无个性签名","k_118prbn":"全局搜索","k_1m9dftc":"全部联系人","k_0em4gyz":"全部群聊","k_002twmj":"群聊","k_09kga0d":"更多聊天记录","k_1ui5lzi":"$count条相关聊天记录","k_09khmso":"相关聊天记录","k_1kevf4k":"与$receiver的聊天记录","k_0vjj2kp":"群聊的聊天记录","k_003n2rp":"选择","k_03ignw6":"所有人","k_03erpei":"管理员","k_0qi9tno":"群主、管理员","k_1m9exwh":"最近联系人","k_119nwqr":"输入不能为空","k_0pzwbmg":"视频保存成功","k_0aktupv":"视频保存失败","k_1qbg9xc":"$option8为 ","k_1wq5ubm":"$option7修改","k_0y5pu80":"$option6退出群聊","k_0nl7cmd":"邀请$option5加入群组","k_1ju5iqw":"将$option4踢出群组","k_1ovt677":"用户$option3加入了群聊","k_0k05b8b":"$option2 被","k_0wm4xeb":"系统消息 $option2","k_0nbq9v3":"通话时间:$option2","k_0i1kf53":"[文件] $option2","k_1wh4atg":"$option2 分钟前","k_07sh7g1":"昨天 $option2","k_1pj8xzh":"我的用户ID: $option2","k_0py1evo":"个性签名: $option2","k_1kvj4i2":"$option2撤回了一条消息","k_1v0lbpp":"“$option2”暂不可以打开此类文件,你可以使用其他应用打开并预览","k_0torwfz":"选择成功$option2","k_0i1bjah":"$option1撤回了一条消息","k_1qzxh9q":"通话时间:$option3","k_0wrgmom":"[语音通话]:$option1","k_06ix2f0":"[视频通话]:$option2","k_08o3z5w":"[文件] $option1","k_0ezbepg":"$option2[有人@我]","k_1ccnht1":"$option2[@所有人]","k_1k3arsw":"管理员 ($option2/10)","k_1d4golg":"群成员($option1人)","k_1bg69nt":"$option1人","k_00gjqxj":"个性签名: $option1","k_0c29cxr":"$option1条相关聊天记录","k_1twk5rz":"与$option1的聊天记录","k_1vn4xq1":"将 $adminMember 取消管理员","k_0e35hsw":"为方便您将所拍摄的照片或视频发送给朋友,以及进行视频通话,请允许我们访问摄像头进行拍摄照片和视频。","k_0dj6yr7":"为方便您发送语音消息、拍摄视频以及音视频通话,请允许我们使用麦克风进行录音。","k_003qnsl":"存储","k_0s3rtpw":"为方便您查看和选择相册里的图片视频发送给朋友,以及保存内容到设备,请允许我们访问您设备上的照片、媒体内容。","k_0tezv85":" 申请获取$option2","k_002rety":"权限","k_18o68ro":"需要授予","k_1onpf8u":" 相机权限,以正常使用拍摄图片视频、视频通话等功能。","k_17irga5":" 麦克风权限,以正常使用发送语音消息、拍摄视频、音视频通话等功能。","k_0572kc4":" 访问照片权限,以正常使用发送图片、视频等功能。","k_0slykws":" 访问相册写入权限,以正常使用存储图片、视频等功能。","k_119pkcd":" 文件读写权限,以正常使用在聊天功能中的图片查看、选择能力和发送文件的能力。","k_0gqewd3":"以后再说","k_03eq4s1":"去开启","k_0nt2uyg":"回到最新位置","k_04l16at":"$option1条新消息","k_13p3w93":"有人@我","k_18w5uk6":"@所有人","k_0jmujgh":"其他文件正在接收中","k_12s5ept":"消息详情","k_0mxa4f4":"$option1人已读","k_061tue3":"$option2人未读","k_18qjstb":"转让群主","k_0on1aj2":"有$option2条@我消息","k_09j4izl":"[有人@我] ","k_1oqtjw0":"[@所有人] ","k_1x5a9vb":"我是: $option1","k_14n31e7":"进群请求","k_08nc5j1":"群类型: $option1","k_1josu12":"$option1 条入群请求","k_0n2x5s0":"验证消息: $option2","k_03c1nx0":"已同意","k_03aw9w8":"已拒绝","k_038ryos":"去处理","k_0gw8pum":"进群申请","k_1gcvfrj":"请填写备注","k_002v9zj":"确认","k_10oqrki":"轻触拍照","k_0f8b3ws":"加载失败","k_11cm5lm":"手动聚焦","k_002uzrd":"预览","k_003qkn3":"录像","k_003k6a7":"拍照","k_0bqpqco":"拍照按钮","k_1626ozl":"停止录像","k_003lvmu":"前置","k_003lued":"后置","k_003lwzh":"外置","k_002qzi3":"关闭","k_003pufb":"自动","k_0apm0ze":"拍照时闪光","k_157zog5":"始终闪光","k_0cfyqhy":"$option1 画面预览","k_0phctlz":"闪光模式: $option2","k_02vfqe0":"切换至 $option3 摄像头","k_0f0y9ex":"说话时间太短","k_0ln70tk":"无法打开URL","k_11a3jdv":"轻触拍照,长按摄像","k_1k18miv":"请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。","k_1fu9ahv":"全员禁言状态","k_0gmwbnd":"全员禁言中","k_0got2zr":"您被禁言","k_0y9jck8":"你必须自定义search bar,并处理点击跳转","k_0yum3tv":"如使用自定义区域,请在profileWidgetBuilder传入对应组件","k_09kalj0":"清空聊天记录","k_14j5iul":"删除并退出","k_125ru1w":"解散该群","k_0jtutmw":"退出后不会接收到此群聊消息","k_0jtzmqa":"解散后不会接收到此群聊消息","k_0r8fi93":"好友添加成功","k_02qw14e":"好友申请已发出","k_0n3md5x":"当前用户在黑名单","k_094phq4":"好友添加失败","k_129scag":"好友删除成功","k_129uzfn":"好友删除失败","k_1666isy":"清除好友","k_1679vrd":"加为好友","k_1ualc52":"看看对方带来的数据是啥","k_0szluvp":"设置对方在线状态","k_0f4rnf8":"该用户已是好友","k_1tdkom4":"您已是群成员","k_1p2lyuz":"对方正在输入中...","k_1g8wfpy":"...共$option1人","k_12rv9vw":"回应详情","k_0havgi0":"[查看详情 >>](${linkMessage.link})","k_0n9p7g8":"群组不存在","k_1tdh5vn":"您不是群成员","k_0h1q57v":"暂无群成员","k_0y5drq1":"[查看详情 >>]($option1)","k_03pjp61":"[表情消息]","k_1jpvzul":"[自定义消息]","k_03u3bh1":"[文件消息]","k_1odsnsw":"[群消息]","k_03sel4t":"[图片消息]","k_03sfw3r":"[位置消息]","k_03xpuwq":"[合并消息]","k_07ycxwo":"[没有元素]","k_03rc9vz":"[文本消息]","k_046uopf":"[视频消息]","k_0ehmsun":"设备存储空间不足,建议清理,以获得更好使用体验","k_003kmos":"图片","k_002s86q":"视频","k_06bk5ei":"视频消息仅限 mp4 格式","k_13opfxf":"Web网页端不支持搜索","k_1i0o0y2":"暂时仅限 Android/iOS 端","k_045dtzl":"$option1的聊天记录","k_0t0131u":"群资料信息","k_18ok8xz":"消息接收方式","k_03ax3ks":"群资料","k_0sqvoqo":"将 $option1 设置为管理员","k_1gbg1v8":"将 $option1 取消管理员","k_17k64g4":"群聊创建成功!","k_05mn217":"暂未安装表情包插件,如需使用表情相关功能,请根据本文档安装:https://cloud.tencent.com/document/product/269/70746","k_14j17nz":"暂无表情包","k_1gnnby6":" 想访问您的$option2","k_0fvjexh":"正在下载中","k_1cdagzz":"已加入待下载队列,其他文件下载中","k_0g4vojc":"开始下载","k_1g32es3":"[调皮]@2x.png","k_1g8qorz":"[爱你]@2x.png","k_1g4hmx6":"[爱情]@2x.png","k_1g6b558":"[爱心]@2x.png","k_1g3m4su":"[傲慢]@2x.png","k_1g2jym7":"[白眼]@2x.png","k_0cgkxuw":"[棒棒糖]@2x.png","k_1g48br2":"[抱抱]@2x.png","k_1g49ol8":"[抱拳]@2x.png","k_1g0ras3":"[爆筋]@2x.png","k_1ghy881":"[鄙视]@2x.png","k_1g86bmv":"[闭嘴]@2x.png","k_1g1xs1p":"[鞭炮]@2x.png","k_1g8i6ri":"[便便]@2x.png","k_1g2u5kf":"[擦汗]@2x.png","k_1g60uwh":"[彩带]@2x.png","k_1g1o0d0":"[彩球]@2x.png","k_1g6a6yq":"[菜刀]@2x.png","k_1g6vqo2":"[差劲]@2x.png","k_1g0kvjc":"[钞票]@2x.png","k_1g65x7e":"[车厢]@2x.png","k_0e1tjol":"[打哈欠]@2x.png","k_1g65n58":"[大兵]@2x.png","k_1g7se7o":"[大哭]@2x.png","k_1g03868":"[蛋糕]@2x.png","k_1h8nm66":"[刀]@2x.png","k_1g3dlpi":"[得意]@2x.png","k_1g3u434":"[灯泡]@2x.png","k_1giuqs7":"[凋谢]@2x.png","k_1g8r0r9":"[多云]@2x.png","k_1g7k6i1":"[发呆]@2x.png","k_1g44zsp":"[发抖]@2x.png","k_1g5l96i":"[飞机]@2x.png","k_1g7wsqj":"[飞吻]@2x.png","k_1g49luq":"[奋斗]@2x.png","k_1gixbsm":"[风车]@2x.png","k_1g6cqbq":"[尴尬]@2x.png","k_1g6jbw5":"[勾引]@2x.png","k_1g3lwo1":"[鼓掌]@2x.png","k_1g13nkj":"[害羞]@2x.png","k_1g0mt47":"[憨笑]@2x.png","k_0bxujkf":"[红灯笼]@2x.png","k_0hhaeh8":"[红双喜]@2x.png","k_1g0jnts":"[坏笑]@2x.png","k_1g46g9c":"[挥手]@2x.png","k_1g4vi9g":"[回头]@2x.png","k_1gf7hes":"[饥饿]@2x.png","k_1g6mvsm":"[激动]@2x.png","k_1gku5mf":"[街舞]@2x.png","k_1g4hidg":"[惊恐]@2x.png","k_1gjbrtu":"[惊讶]@2x.png","k_1g6sand":"[咖啡]@2x.png","k_1g4s8rj":"[磕头]@2x.png","k_1g1wn34":"[可爱]@2x.png","k_1g3l0wd":"[可怜]@2x.png","k_1ggaon9":"[抠鼻]@2x.png","k_1ggvcb0":"[骷髅]@2x.png","k_1h8yqjt":"[酷]@2x.png","k_0jac97i":"[快哭了]@2x.png","k_1h8oiby":"[困]@2x.png","k_1g0s5hg":"[蜡烛]@2x.png","k_1g1iuer":"[篮球]@2x.png","k_1g2xjfi":"[冷汗]@2x.png","k_0s5oyqw":"[礼品袋]@2x.png","k_1g1qqvf":"[礼物]@2x.png","k_1g2slew":"[流汗]@2x.png","k_1g3z9xx":"[流泪]@2x.png","k_1g6pabn":"[麻将]@2x.png","k_0pkaxul":"[麦克风]@2x.png","k_1g7m0zj":"[猫咪]@2x.png","k_0ibvtpo":"[么么哒]@2x.png","k_1g1hoh1":"[玫瑰]@2x.png","k_1gfzeow":"[米饭]@2x.png","k_1g5l15p":"[面条]@2x.png","k_1g2hfa6":"[奶瓶]@2x.png","k_1gix9pj":"[难过]@2x.png","k_1giqn6g":"[闹钟]@2x.png","k_1h8kd64":"[怒]@2x.png","k_1g0vui9":"[怄火]@2x.png","k_1g1jsj7":"[皮球]@2x.png","k_1ghdluw":"[啤酒]@2x.png","k_1gl6ec7":"[瓢虫]@2x.png","k_1g7gg5p":"[撇嘴]@2x.png","k_1g8psin":"[乒乓]@2x.png","k_1gjzu3p":"[汽车]@2x.png","k_1h8mr0k":"[强]@2x.png","k_1g45y2n":"[敲打]@2x.png","k_1gkaxsl":"[青蛙]@2x.png","k_0jcfnoo":"[糗大了]@2x.png","k_1g4njy1":"[拳头]@2x.png","k_1h8mqr3":"[弱]@2x.png","k_1h926fg":"[色]@2x.png","k_1g6rtbq":"[沙发]@2x.png","k_1giirh6":"[删除]@2x.png","k_1g14ny9":"[闪电]@2x.png","k_1g6bmsr":"[胜利]@2x.png","k_1g1rytx":"[示爱]@2x.png","k_1g52fbz":"[手枪]@2x.png","k_1h90dam":"[衰]@2x.png","k_1gigiae":"[睡觉]@2x.png","k_1gijchz":"[太阳]@2x.png","k_1g1sgji":"[跳绳]@2x.png","k_1gjwuri":"[跳跳]@2x.png","k_1g0juhk":"[偷笑]@2x.png","k_1h8nzla":"[吐]@2x.png","k_1g6cv0i":"[委屈]@2x.png","k_1g46l5g":"[握手]@2x.png","k_1g2pgkd":"[西瓜]@2x.png","k_1ging9p":"[下雨]@2x.png","k_1h8nzil":"[吓]@2x.png","k_1g7q7wr":"[献吻]@2x.png","k_1gl6uum":"[香蕉]@2x.png","k_1g23fys":"[象棋]@2x.png","k_0j75rdh":"[心碎了]@2x.png","k_1g6ajj2":"[信封]@2x.png","k_1g21prz":"[熊猫]@2x.png","k_1h8octi":"[嘘]@2x.png","k_1h91zox":"[药]@2x.png","k_1ghttfl":"[疑问]@2x.png","k_1ghk7sz":"[阴险]@2x.png","k_0gl37zz":"[右车头]@2x.png","k_0ifkj1p":"[右哼哼]@2x.png","k_0g1yh2e":"[右太极]@2x.png","k_1g9dkfc":"[雨伞]@2x.png","k_1g8jl88":"[月亮]@2x.png","k_1h8lhqj":"[晕]@2x.png","k_1gi9x2q":"[再见]@2x.png","k_1g6dwwv":"[炸弹]@2x.png","k_1fzmkfi":"[折磨]@2x.png","k_1g6jbiw":"[纸巾]@2x.png","k_1ggjnwu":"[咒骂]@2x.png","k_1g4qlq8":"[猪头]@2x.png","k_1g1lqzz":"[抓狂]@2x.png","k_1g80j3u":"[转圈]@2x.png","k_1g0z55s":"[龇牙]@2x.png","k_1g3ju6v":"[钻戒]@2x.png","k_0gl51l6":"[左车头]@2x.png","k_0iflllk":"[左哼哼]@2x.png","k_0g1y3ir":"[左太极]@2x.png","k_026hiq5":"消息列表加载中","k_003tu8k":"爱你","k_003myvp":"傲慢","k_003kddw":"白眼","k_039yfhv":"棒棒糖","k_003nu3p":"抱抱","k_003nijr":"抱拳","k_003mg88":"爆筋","k_002v17e":"鄙视","k_003qhy4":"闭嘴","k_003l5fq":"鞭炮","k_003uacl":"便便","k_003oq1g":"擦汗","k_003qvey":"彩带","k_003jci7":"彩球","k_003pyu1":"菜刀","k_003q97d":"差劲","k_003po5d":"车厢","k_03eadb2":"打哈欠","k_003pnuf":"大兵","k_003kg57":"蛋糕","k_003mxkt":"得意","k_003onu3":"灯泡","k_002uv8s":"凋谢","k_003kqy0":"调皮","k_003tyum":"多云","k_003pv9u":"发呆","k_036o6mu":"发抖t","k_003nogx":"飞机","k_003q7wg":"飞吻","k_003m0jd":"奋斗","k_002ult9":"风车","k_003r8gt":"尴尬","k_003qy4u":"勾引","k_003mnoa":"鼓掌","k_003lmw8":"害羞","k_003mb30":"憨笑","k_03bj41g":"红灯笼","k_03dxw2f":"红双喜","k_003mk57":"坏笑","k_003nmvf":"挥手","k_003r2i7":"回头","k_002s6f3":"饥饿","k_003qd0t":"激动","k_002vgi4":"街舞","k_003nz33":"惊恐","k_002wh4p":"惊讶","k_003ozpu":"咖啡","k_003qvs4":"磕头","k_003l3wb":"可爱","k_003nuwm":"可怜","k_002rw1q":"抠鼻","k_002tujb":"骷髅","k_00030eq":"酷","k_03i8ath":"快哭了","k_000421h":"困","k_003l5i7":"蜡烛","k_003j72g":"篮球","k_003ofwl":"冷汗","k_02mw65v":"礼品袋","k_003ku40":"礼物","k_003ookz":"流汗","k_003on72":"流泪","k_003rjy0":"麻将","k_003q2f8":"猫咪","k_03et393":"么么哒","k_003j7j2":"玫瑰","k_002sr0b":"米饭","k_003nnza":"面条","k_003jef9":"奶瓶","k_002umn0":"难过","k_002rjib":"闹钟","k_0003zcn":"怒","k_003jzwq":"怄火","k_003j4js":"皮球","k_002r5ir":"啤酒","k_002ubu4":"瓢虫","k_003ppo6":"撇嘴","k_003ty3o":"乒乓","k_002vxwe":"汽车","k_00043hb":"强","k_003nmbo":"敲打","k_002tfhq":"青蛙","k_03i7lrn":"糗大了","k_003r03m":"拳头","k_00043h0":"弱","k_000345z":"色","k_003qmp9":"沙发","k_003it8a":"闪电","k_003pxow":"胜利","k_003kw8e":"示爱","k_003n99g":"手枪","k_00035cl":"衰","k_002vl3h":"睡觉","k_002rgqk":"太阳","k_003m9d1":"跳绳","k_002vobp":"跳跳","k_003mkoz":"偷笑","k_00041px":"吐","k_003rjh5":"委屈","k_003j36u":"西瓜","k_002re92":"下雨","k_00041py":"吓","k_003q06o":"献吻","k_002ubjp":"香蕉","k_003o2tr":"象棋","k_03ie6pa":"心碎了","k_003rao5":"信封","k_003l3us":"熊猫","k_000424d":"嘘","k_00033yi":"药","k_002qtyy":"疑问","k_002qe0o":"阴险","k_03gu7us":"右车头","k_03ere8m":"右哼哼","k_003uqk3":"雨伞","k_003tzdv":"月亮","k_0003z00":"晕","k_002vdrd":"再见","k_003ra1w":"炸弹","k_003lcad":"折磨","k_003q7sz":"纸巾","k_002thn9":"咒骂","k_003qx7f":"猪头","k_003l044":"抓狂","k_003qg4h":"转圈","k_003kb97":"龇牙","k_03gu53l":"左车头","k_03erd1f":"左哼哼","k_003nyvl":"爱情","k_003r85z":"爱心","k_003mk8j":"钞票","k_003pwfj":"大哭","k_00042w5":"刀","k_003nmtr":"握手","k_03c529p":"右太极","k_003n4mk":"钻戒","k_03c5488":"左太极","k_1llp7tu":"该用户不存在","k_0tbyqyb":"加载中…","k_0td1p3f":"保存中…","k_1klqdh1":"仅限汉字、英文、数字和下划线","k_03el5lp":"未填写","k_1ui0gai":"搜索指定内容","k_003nvk2":"消息","k_03agld7":"群提示","k_0elt0kw":"添加群聊","k_0s3sgel":"移出黑名单","k_1qqgjra":"$option3条未读消息","k_0uubyjr":"以下为未读消息","k_16as7eq":"表情回应","k_003s12u":"回复","k_003s38r":"更多","k_002wkr3":"翻译","k_13g4hxv":"翻译完成","k_003molk":"表情","k_165bbw6":"消息历史","k_13sqc0z":"清除消息","k_0glns86":"删除会话","k_13s99rx":"清空消息","k_11vsa3j":"退出群组","k_11vvszp":"解散群组","k_15i9w72":"群管理员","k_0p3espj":"设置备注名","k_118sw9v":"立即搜索","k_0h20hg5":"视频通话","k_0h22snw":"语音通话","k_003lz6t":"对方","k_1xf4yre":"发送给$option1","k_003por5":"截图","k_1rw7s82":" 访问相册中视频权限,以正常使用发送视频等功能。","k_003rcwm":"打开","k_1698c42":"在访达中打开","k_066fxsz":"查看文件夹","k_0k432y2":"无法发送,包含文件夹","k_002wb4y":"会话","k_0od4qyh":"视频文件异常","k_1bfkxg9":"不支持 0KB 文件的传输","k_0vvsw7g":"文件处理异常","k_06e224q":"[消息被管理员撤回]","k_1u1mjcl":"[消息被撤回]","k_1qcqxea":"选择多个会话","k_1qgmc20":"选择一个会话","k_1d8nx6f":"在新窗口中打开","k_1hz05ax":"正在下载原始资源,请稍候...","k_002robo":"清除"} \ No newline at end of file diff --git a/lib/i18n/strings_zh-Hant.i18n.json b/lib/i18n/strings_zh-Hant.i18n.json index 3128188..a98f134 100644 --- a/lib/i18n/strings_zh-Hant.i18n.json +++ b/lib/i18n/strings_zh-Hant.i18n.json @@ -1 +1,702 @@ -{"k_1yemzyd":"收到一條訊息","k_0ylosxn":"自定義訊息","k_13sajrj":"貼圖訊息","k_13sjeb7":"檔案訊息","k_0yd2ft8":"群提示訊息","k_13s7mxn":"圖片訊息","k_13satlt":"位置訊息","k_00bbtsx":"合並轉發訊息","k_13sqwu4":"語音訊息","k_13sqjjp":"影片","k_1fdhj9g":"該版本不支持此訊息","k_06pujtm":"同意任何用戶添加好友","k_0gyhkp5":"需要驗證","k_121ruco":"拒絕任何人加好友","k_05nspni":"自定義字段","k_03fchyy":"群頭像","k_03i9mfe":"群簡介","k_03agq58":"群名稱","k_039xqny":"群通知","k_003tr0a":"群主","k_03iqsh4":"$s為 ","k_191t5n4":"$opUserNickName修改","k_1pg6aoj":"$opUserNickName退出群組","k_1f6zt3v":"邀請$invitedMemberString加入群組","k_0y7zd07":"將$invitedMemberString踢出群組","k_03c49qt":"去授權","k_1d5mshh":"用戶$joinedMemberString加入了群組","k_002wddw":"禁言","k_0got6f7":"解除禁言","k_0yenqf0":"$userName 被","k_0spotql":"將 $adminMember 設置為管理員","k_0pg5zzj":"系統訊息 $operationType","k_0ohzb9l":"通話時間:$callTime","k_1uaqed6":"[自定義]","k_0z2z7rx":"[語音]","k_0y39ngu":"[貼圖]","k_1c7z88n":"[檔案] $fileName","k_0y1a2my":"[圖片]","k_0z4fib8":"[影片]","k_0y24mcg":"[位置]","k_0pewpd1":"[聊天記錄]","k_13s8d9p":"未知訊息","k_1c3us5n":"當前群組不支持@全體成員","k_11k579v":"發言中有非法語句","k_003qkx2":"日歷","k_003n2pz":"相機","k_03idjo0":"聯絡人","k_003ltgm":"位置","k_02k3k86":"咪高風","k_003pm7l":"相冊","k_15ao57x":"相冊寫入","k_164m3jd":"本地存儲","k_0qba4ns":"想訪問您的$yoursItem","k_03r6qyx":"我們需要您的同意才能獲取信息","k_02noktt":"不允許","k_00043x4":"好","k_003qzac":"昨天","k_003r39d":"前天","k_03fqp9o":"星期天","k_03ibg5h":"星期一","k_03i7hu1":"星期二","k_03iaiks":"星期三","k_03el9pa":"星期四","k_03i7ok1":"星期五","k_03efxyg":"星期六","k_0oozw9x":"$diffMinutes 分鐘前","k_003q7ba":"下午","k_003q7bb":"上午","k_003pu3h":"現在","k_13hzn00":"昨天 $yesterday","k_0n9pyxz":"用戶不存在","k_1bjwemh":"搜尋用戶 ID","k_003kv3v":"搜尋","k_02owlq8":"我的用戶ID: $userID","k_1wu8h4x":"我是: $showName","k_16758qw":"添加好友","k_1shx4d9":"個性簽名: $selfSignature","k_0i553x0":"填寫驗證信息","k_031ocwx":"請填寫備註和分組","k_003ojje":"備註","k_003lsav":"分組","k_167bdvq":"我的好友","k_156b4ut":"好友申請已發送","k_002r305":"發送","k_03gu05e":"聊天室","k_03b4f3p":"會議群","k_03avj1p":"公開群","k_03asq2g":"工作群","k_03b3hbi":"未知群","k_1loix7s":"群類型: $groupType","k_1lqbsib":"該群組不存在","k_03h153m":"搜尋群ID","k_0oxak3r":"群申請已發送","k_002rflt":"刪除","k_1don84v":"無法定位到原訊息","k_003q5fi":"復製","k_003prq0":"轉發","k_002r1h2":"多選","k_003j708":"引用","k_003pqpr":"回收","k_03ezhho":"已復製","k_11ctfsz":"暫未實現","k_1hbjg5g":"[群系統訊息]","k_03tvswb":"[未知訊息]","k_155cj23":"您回收了一條訊息,","k_0gapun3":"重新編輯","k_1uh417q":"$displayName回收了一條訊息","k_1aszp2k":"您確定要重發這條訊息麽?","k_003rzap":"確定","k_003nevv":"取消","k_0003z7x":"您","k_002wfe4":"已讀","k_002wjlg":"未讀","k_0h1ygf8":"發起通話","k_0h169j0":"取消通話","k_0h13jjk":"接受通話","k_0h19hfx":"拒絕通話","k_0obi9lh":"超時未接聽","k_0y9u662":"「$appName」暫不可以開啟此類檔案,你可以使用其他應用開啟並預覽","k_001nmhu":"用其他應用開啟","k_1ht1b80":"正在接收中","k_105682d":"圖片載入失敗","k_0pytyeu":"圖片保存成功","k_0akceel":"圖片保存失敗","k_003rk1s":"保存","k_04a0awq":"[語音訊息]","k_105c3y3":"影片載入失敗","k_176rzr7":"聊天記錄","k_0d5z4m5":"選擇提醒人","k_003ngex":"完成","k_1665ltg":"發起呼叫","k_003n8b0":"拍攝","k_003kthh":"照片","k_003tnp0":"檔案","k_0jhdhtp":"發送失敗,影片不能大於100MB","k_119ucng":"圖片不能為空","k_0w9x8gw":"選擇成功$successPath","k_13dsw4l":"松開取消","k_0am7r68":"手指上滑,取消發送","k_15jl6qw":"說話時間太短!","k_0gx7vl6":"按住說話","k_15dlafd":"逐條轉發","k_15dryxy":"合並轉發","k_1eyhieh":"確定刪除已選訊息","k_17fmlyf":"清除聊天","k_0dhesoz":"取消置頂","k_002sk7x":"置頂","k_003ll77":"草稿","k_03icaxo":"自定義","k_1969986":"[語音通話]:$callingLastMsgShow","k_1960dlr":"[視訊通話]:$callingLastMsgShow","k_1np495n":"$messageString[有人@我]","k_1m797yi":"$messageString[@所有人]","k_1uaov41":"查找聊天內容","k_003kfai":"未知","k_13dq4an":"自動審批","k_0l13cde":"管理員審批","k_11y8c6a":"禁止加群","k_1kvyskd":"無網絡連接,無法修改","k_16payqf":"加群方式","k_0vzvn8r":"修改群名稱","k_038lh6u":"群管理","k_0k5wyiy":"設置管理員","k_0goiuwk":"全員禁言","k_1g889xx":"全員禁言開啟後,只允許群主和管理員發言。","k_0wlrefq":"添加需要禁言的群成員","k_0goox5g":"設置禁言","k_08daijh":"成功取消管理員身份","k_0bxm97s":"管理員 ($adminNum/10)","k_0k5u935":"添加管理員","k_03enyx5":"群成員","k_0jayw3z":"群成員($groupMemberNum人)","k_0h1svv1":"刪除群成員","k_0h1g636":"添加群成員","k_0uj7208":"無網絡連接,無法查看群成員","k_01yfa4o":"$memberCount人","k_0hpukyx":"查看更多群成員","k_0qtsar0":"訊息免打擾","k_0ef2a12":"修改我的群昵稱","k_1aajych":"僅限中文、字母、數字和下劃線,2-20個字","k_137pab5":"我的群昵稱","k_0ivim6d":"暫無群公告","k_03eq6cn":"群公告","k_002vxya":"編輯","k_17fpl3y":"置頂聊天","k_03es1ox":"群類型","k_003mz1i":"同意","k_003lpre":"拒絕","k_003qk66":"頭像","k_003lhvk":"昵稱","k_003ps50":"賬號","k_15lx52z":"個性簽名","k_003qgkp":"性別","k_003m6hr":"生日","k_0003v6a":"男","k_00043x2":"女","k_03bcjkv":"未設置","k_11s0gdz":"修改昵稱","k_0p3j4sd":"僅限中字、字母、數字和下劃線","k_15lyvdt":"修改簽名","k_0vylzjp":"這個人很懶,什麽也沒寫","k_1hs7ese":"等上線再改這個","k_03exjk7":"備註名","k_0s3skfd":"加入黑名單","k_0p3b31s":"修改備註名","k_0003y9x":"無","k_11zgnfs":"個人資料","k_03xd79d":"個性簽名: $signature","k_1tez2xl":"暫無個性簽名","k_118prbn":"全局搜尋","k_1m9dftc":"全部聯絡人","k_0em4gyz":"全部群組","k_002twmj":"群組","k_09kga0d":"更多聊天記錄","k_1ui5lzi":"$count條相關聊天記錄","k_09khmso":"相關聊天記錄","k_1kevf4k":"與$receiver的聊天記錄","k_0vjj2kp":"群組的聊天記錄","k_003n2rp":"選擇","k_03ignw6":"所有人","k_03erpei":"管理員","k_0qi9tno":"群主、管理員","k_1m9exwh":"最近聯絡人","k_119nwqr":"輸入不能為空","k_0pzwbmg":"影片保存成功","k_0aktupv":"影片保存失敗","k_1qbg9xc":"$option8為 ","k_1wq5ubm":"$option7修改","k_0y5pu80":"$option6退出群組","k_0nl7cmd":"邀請$option5加入群組","k_1ju5iqw":"將$option4踢出群組","k_1ovt677":"用戶$option3加入了群組","k_0k05b8b":"$option2 被","k_0wm4xeb":"系統訊息 $option2","k_0nbq9v3":"通話時間:$option2","k_0i1kf53":"[檔案] $option2","k_1gnnby6":"想訪問您的$option2","k_1wh4atg":"$option2 分鐘前","k_07sh7g1":"昨天 $option2","k_1pj8xzh":"我的用戶ID: $option2","k_0py1evo":"個性簽名: $option2","k_1kvj4i2":"$option2回收了一條訊息","k_1v0lbpp":"「$option2」暫不可以開啟此類檔案,你可以使用其他應用開啟並預覽","k_0torwfz":"選擇成功$option2","k_0i1bjah":"$option1回收了一條訊息","k_1qzxh9q":"通話時間:$option3","k_0wrgmom":"[語音通話]:$option1","k_06ix2f0":"[視訊通話]:$option2","k_08o3z5w":"[檔案] $option1","k_0ezbepg":"$option2[有人@我]","k_1ccnht1":"$option2[@所有人]","k_1k3arsw":"管理員 ($option2/10)","k_1d4golg":"群成員($option1人)","k_1bg69nt":"$option1人","k_00gjqxj":"個性簽名: $option1","k_0c29cxr":"$option1條相關聊天記錄","k_1twk5rz":"與$option1的聊天記錄","k_1vn4xq1":"將 $adminMember 取消管理員","k_0e35hsw":"為方便您將所拍攝的照片或影片發送給朋友,以及進行視訊通話,請允許我們訪問攝像頭進行拍攝照片和影片。","k_0dj6yr7":"為方便您發送語音訊息、拍攝影片以及音視訊通話,請允許我們使用咪高風進行錄音。","k_003qnsl":"存儲","k_0s3rtpw":"為方便您查看和選擇相冊裏的圖片影片發送給朋友,以及保存內容到設備,請允許我們訪問您設備上的照片、媒體內容。","k_0tezv85":" 申請獲取$option2","k_002rety":"權限","k_18o68ro":"需要授予","k_1onpf8u":" 相機權限,以正常使用拍攝圖片/影片、視訊通話等功能。","k_17irga5":" 咪高風權限,以正常使用發送語音訊息、拍攝影片、音視訊通話等功能。","k_0572kc4":" 訪問照片權限,以正常使用發送圖片、影片等功能。","k_0slykws":" 訪問相冊寫入權限,以正常使用存儲圖片、影片等功能。","k_119pkcd":" 檔案讀寫權限,以正常使用在聊天功能中的圖片查看、選擇能力和發送檔案的能力。","k_0gqewd3":"以後再說","k_03eq4s1":"去開啟","k_0nt2uyg":"回到最新位置","k_04l16at":"$option1條新訊息","k_13p3w93":"有人@我","k_18w5uk6":"@所有人","k_0jmujgh":"其他檔案正在接收中","k_12s5ept":"訊息詳情","k_0mxa4f4":"$option1人已讀","k_061tue3":"$option2人未讀","k_18qjstb":"轉讓群主","k_0on1aj2":"有$option2條@我訊息","k_09j4izl":"[有人@我] ","k_1oqtjw0":"[@所有人] ","k_1x5a9vb":"我是: $option1","k_14n31e7":"進群請求","k_08nc5j1":"群類型: $option1","k_1josu12":"$option1 條入群請求","k_0n2x5s0":"驗證消息: $option2","k_03c1nx0":"已同意","k_03aw9w8":"已拒絕","k_038ryos":"去處理","k_0gw8pum":"進群申請","k_1gcvfrj":"請填寫備註名","k_002v9zj":"确认","k_10oqrki":"轻触拍照","k_0f8b3ws":"加载失败","k_11cm5lm":"手动聚焦","k_002uzrd":"预览","k_003qkn3":"录像","k_003k6a7":"拍照","k_0bqpqco":"拍照按钮","k_1626ozl":"停止录像","k_003lvmu":"前置","k_003lued":"后置","k_003lwzh":"外置","k_002qzi3":"关闭","k_003pufb":"自动","k_0apm0ze":"拍照时闪光","k_157zog5":"始终闪光","k_0cfyqhy":"$option1 画面预览","k_0phctlz":"闪光模式: $option2","k_02vfqe0":"切换至 $option3 摄像头","k_0f0y9ex":"说话时间太短","k_0ln70tk":"无法打开URL","k_11a3jdv":"轻触拍照,长按摄像","k_1k18miv":"请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。","k_1fu9ahv":"全员禁言状态","k_0gmwbnd":"全员禁言中","k_0got2zr":"您被禁言","k_0y9jck8":"你必须自定义search bar,并处理点击跳转","k_0yum3tv":"如使用自定义区域,请在profileWidgetBuilder传入对应组件","k_09kalj0":"清空聊天记录","k_14j5iul":"删除并退出","k_125ru1w":"解散该群","k_0jtutmw":"退出后不会接收到此群聊消息","k_0jtzmqa":"解散后不会接收到此群聊消息","k_0r8fi93":"好友添加成功","k_02qw14e":"好友申请已发出","k_0n3md5x":"当前用户在黑名单","k_094phq4":"好友添加失败","k_129scag":"好友删除成功","k_129uzfn":"好友删除失败","k_1666isy":"清除好友","k_1679vrd":"加为好友","k_1ualc52":"看看对方带来的数据是啥","k_0szluvp":"设置对方在线状态","k_0f4rnf8":"该用户已是好友","k_1tdkom4":"您已是群成员","k_1p2lyuz":"对方正在输入中...","k_1g8wfpy":"...共$option1人","k_12rv9vw":"回应详情","k_0havgi0":"[查看详情 >>](${linkMessage.link})","k_0n9p7g8":"群组不存在","k_1tdh5vn":"您不是群成员","k_0h1q57v":"暂无群成员","k_0y5drq1":"[查看详情 >>]($option1)","k_03pjp61":"[表情消息]","k_1jpvzul":"[自定义消息]","k_03u3bh1":"[文件消息]","k_1odsnsw":"[群消息]","k_03sel4t":"[图片消息]","k_03sfw3r":"[位置消息]","k_03xpuwq":"[合并消息]","k_07ycxwo":"[没有元素]","k_03rc9vz":"[文本消息]","k_046uopf":"[视频消息]","k_0ehmsun":"设备存储空间不足,建议清理,以获得更好使用体验","k_003kmos":"图片","k_002s86q":"视频","k_06bk5ei":"视频消息仅限 mp4 格式","k_13opfxf":"Web网页端不支持搜索","k_1i0o0y2":"暂时仅限 Android/iOS 端","k_045dtzl":"$option1的聊天记录","k_0t0131u":"群资料信息","k_18ok8xz":"消息接收方式","k_03ax3ks":"群资料","k_0sqvoqo":"将 $option1 设置为管理员","k_1gbg1v8":"将 $option1 取消管理员","k_17k64g4":"群聊创建成功!","k_05mn217":"暂未安装表情包插件,如需使用表情相关功能,请根据本文档安装:https://cloud.tencent.com/document/product/269/70746","k_14j17nz":"暂无表情包","k_0fvjexh":"正在下载中","k_1cdagzz":"已加入待下载队列,其他文件下载中","k_0g4vojc":"开始下载","k_1g32es3":"[调皮]@2x.png","k_1g8qorz":"[爱你]@2x.png","k_1g4hmx6":"[爱情]@2x.png","k_1g6b558":"[爱心]@2x.png","k_1g3m4su":"[傲慢]@2x.png","k_1g2jym7":"[白眼]@2x.png","k_0cgkxuw":"[棒棒糖]@2x.png","k_1g48br2":"[抱抱]@2x.png","k_1g49ol8":"[抱拳]@2x.png","k_1g0ras3":"[爆筋]@2x.png","k_1ghy881":"[鄙视]@2x.png","k_1g86bmv":"[闭嘴]@2x.png","k_1g1xs1p":"[鞭炮]@2x.png","k_1g8i6ri":"[便便]@2x.png","k_1g2u5kf":"[擦汗]@2x.png","k_1g60uwh":"[彩带]@2x.png","k_1g1o0d0":"[彩球]@2x.png","k_1g6a6yq":"[菜刀]@2x.png","k_1g6vqo2":"[差劲]@2x.png","k_1g0kvjc":"[钞票]@2x.png","k_1g65x7e":"[车厢]@2x.png","k_0e1tjol":"[打哈欠]@2x.png","k_1g65n58":"[大兵]@2x.png","k_1g7se7o":"[大哭]@2x.png","k_1g03868":"[蛋糕]@2x.png","k_1h8nm66":"[刀]@2x.png","k_1g3dlpi":"[得意]@2x.png","k_1g3u434":"[灯泡]@2x.png","k_1giuqs7":"[凋谢]@2x.png","k_1g8r0r9":"[多云]@2x.png","k_1g7k6i1":"[发呆]@2x.png","k_1g44zsp":"[发抖]@2x.png","k_1g5l96i":"[飞机]@2x.png","k_1g7wsqj":"[飞吻]@2x.png","k_1g49luq":"[奋斗]@2x.png","k_1gixbsm":"[风车]@2x.png","k_1g6cqbq":"[尴尬]@2x.png","k_1g6jbw5":"[勾引]@2x.png","k_1g3lwo1":"[鼓掌]@2x.png","k_1g13nkj":"[害羞]@2x.png","k_1g0mt47":"[憨笑]@2x.png","k_0bxujkf":"[红灯笼]@2x.png","k_0hhaeh8":"[红双喜]@2x.png","k_1g0jnts":"[坏笑]@2x.png","k_1g46g9c":"[挥手]@2x.png","k_1g4vi9g":"[回头]@2x.png","k_1gf7hes":"[饥饿]@2x.png","k_1g6mvsm":"[激动]@2x.png","k_1gku5mf":"[街舞]@2x.png","k_1g4hidg":"[惊恐]@2x.png","k_1gjbrtu":"[惊讶]@2x.png","k_1g6sand":"[咖啡]@2x.png","k_1g4s8rj":"[磕头]@2x.png","k_1g1wn34":"[可爱]@2x.png","k_1g3l0wd":"[可怜]@2x.png","k_1ggaon9":"[抠鼻]@2x.png","k_1ggvcb0":"[骷髅]@2x.png","k_1h8yqjt":"[酷]@2x.png","k_0jac97i":"[快哭了]@2x.png","k_1h8oiby":"[困]@2x.png","k_1g0s5hg":"[蜡烛]@2x.png","k_1g1iuer":"[篮球]@2x.png","k_1g2xjfi":"[冷汗]@2x.png","k_0s5oyqw":"[礼品袋]@2x.png","k_1g1qqvf":"[礼物]@2x.png","k_1g2slew":"[流汗]@2x.png","k_1g3z9xx":"[流泪]@2x.png","k_1g6pabn":"[麻将]@2x.png","k_0pkaxul":"[麦克风]@2x.png","k_1g7m0zj":"[猫咪]@2x.png","k_0ibvtpo":"[么么哒]@2x.png","k_1g1hoh1":"[玫瑰]@2x.png","k_1gfzeow":"[米饭]@2x.png","k_1g5l15p":"[面条]@2x.png","k_1g2hfa6":"[奶瓶]@2x.png","k_1gix9pj":"[难过]@2x.png","k_1giqn6g":"[闹钟]@2x.png","k_1h8kd64":"[怒]@2x.png","k_1g0vui9":"[怄火]@2x.png","k_1g1jsj7":"[皮球]@2x.png","k_1ghdluw":"[啤酒]@2x.png","k_1gl6ec7":"[瓢虫]@2x.png","k_1g7gg5p":"[撇嘴]@2x.png","k_1g8psin":"[乒乓]@2x.png","k_1gjzu3p":"[汽车]@2x.png","k_1h8mr0k":"[强]@2x.png","k_1g45y2n":"[敲打]@2x.png","k_1gkaxsl":"[青蛙]@2x.png","k_0jcfnoo":"[糗大了]@2x.png","k_1g4njy1":"[拳头]@2x.png","k_1h8mqr3":"[弱]@2x.png","k_1h926fg":"[色]@2x.png","k_1g6rtbq":"[沙发]@2x.png","k_1giirh6":"[删除]@2x.png","k_1g14ny9":"[闪电]@2x.png","k_1g6bmsr":"[胜利]@2x.png","k_1g1rytx":"[示爱]@2x.png","k_1g52fbz":"[手枪]@2x.png","k_1h90dam":"[衰]@2x.png","k_1gigiae":"[睡觉]@2x.png","k_1gijchz":"[太阳]@2x.png","k_1g1sgji":"[跳绳]@2x.png","k_1gjwuri":"[跳跳]@2x.png","k_1g0juhk":"[偷笑]@2x.png","k_1h8nzla":"[吐]@2x.png","k_1g6cv0i":"[委屈]@2x.png","k_1g46l5g":"[握手]@2x.png","k_1g2pgkd":"[西瓜]@2x.png","k_1ging9p":"[下雨]@2x.png","k_1h8nzil":"[吓]@2x.png","k_1g7q7wr":"[献吻]@2x.png","k_1gl6uum":"[香蕉]@2x.png","k_1g23fys":"[象棋]@2x.png","k_0j75rdh":"[心碎了]@2x.png","k_1g6ajj2":"[信封]@2x.png","k_1g21prz":"[熊猫]@2x.png","k_1h8octi":"[嘘]@2x.png","k_1h91zox":"[药]@2x.png","k_1ghttfl":"[疑问]@2x.png","k_1ghk7sz":"[阴险]@2x.png","k_0gl37zz":"[右车头]@2x.png","k_0ifkj1p":"[右哼哼]@2x.png","k_0g1yh2e":"[右太极]@2x.png","k_1g9dkfc":"[雨伞]@2x.png","k_1g8jl88":"[月亮]@2x.png","k_1h8lhqj":"[晕]@2x.png","k_1gi9x2q":"[再见]@2x.png","k_1g6dwwv":"[炸弹]@2x.png","k_1fzmkfi":"[折磨]@2x.png","k_1g6jbiw":"[纸巾]@2x.png","k_1ggjnwu":"[咒骂]@2x.png","k_1g4qlq8":"[猪头]@2x.png","k_1g1lqzz":"[抓狂]@2x.png","k_1g80j3u":"[转圈]@2x.png","k_1g0z55s":"[龇牙]@2x.png","k_1g3ju6v":"[钻戒]@2x.png","k_0gl51l6":"[左车头]@2x.png","k_0iflllk":"[左哼哼]@2x.png","k_0g1y3ir":"[左太极]@2x.png","k_026hiq5":"消息列表加载中","k_003tu8k":"爱你","k_003myvp":"傲慢","k_003kddw":"白眼","k_039yfhv":"棒棒糖","k_003nu3p":"抱抱","k_003nijr":"抱拳","k_003mg88":"爆筋","k_002v17e":"鄙视","k_003qhy4":"闭嘴","k_003l5fq":"鞭炮","k_003uacl":"便便","k_003oq1g":"擦汗","k_003qvey":"彩带","k_003jci7":"彩球","k_003pyu1":"菜刀","k_003q97d":"差劲","k_003po5d":"车厢","k_03eadb2":"打哈欠","k_003pnuf":"大兵","k_003kg57":"蛋糕","k_003mxkt":"得意","k_003onu3":"灯泡","k_002uv8s":"凋谢","k_003kqy0":"调皮","k_003tyum":"多云","k_003pv9u":"发呆","k_036o6mu":"发抖t","k_003nogx":"飞机","k_003q7wg":"飞吻","k_003m0jd":"奋斗","k_002ult9":"风车","k_003r8gt":"尴尬","k_003qy4u":"勾引","k_003mnoa":"鼓掌","k_003lmw8":"害羞","k_003mb30":"憨笑","k_03bj41g":"红灯笼","k_03dxw2f":"红双喜","k_003mk57":"坏笑","k_003nmvf":"挥手","k_003r2i7":"回头","k_002s6f3":"饥饿","k_003qd0t":"激动","k_002vgi4":"街舞","k_003nz33":"惊恐","k_002wh4p":"惊讶","k_003ozpu":"咖啡","k_003qvs4":"磕头","k_003l3wb":"可爱","k_003nuwm":"可怜","k_002rw1q":"抠鼻","k_002tujb":"骷髅","k_00030eq":"酷","k_03i8ath":"快哭了","k_000421h":"困","k_003l5i7":"蜡烛","k_003j72g":"篮球","k_003ofwl":"冷汗","k_02mw65v":"礼品袋","k_003ku40":"礼物","k_003ookz":"流汗","k_003on72":"流泪","k_003rjy0":"麻将","k_003q2f8":"猫咪","k_03et393":"么么哒","k_003j7j2":"玫瑰","k_002sr0b":"米饭","k_003nnza":"面条","k_003jef9":"奶瓶","k_002umn0":"难过","k_002rjib":"闹钟","k_0003zcn":"怒","k_003jzwq":"怄火","k_003j4js":"皮球","k_002r5ir":"啤酒","k_002ubu4":"瓢虫","k_003ppo6":"撇嘴","k_003ty3o":"乒乓","k_002vxwe":"汽车","k_00043hb":"强","k_003nmbo":"敲打","k_002tfhq":"青蛙","k_03i7lrn":"糗大了","k_003r03m":"拳头","k_00043h0":"弱","k_000345z":"色","k_003qmp9":"沙发","k_003it8a":"闪电","k_003pxow":"胜利","k_003kw8e":"示爱","k_003n99g":"手枪","k_00035cl":"衰","k_002vl3h":"睡觉","k_002rgqk":"太阳","k_003m9d1":"跳绳","k_002vobp":"跳跳","k_003mkoz":"偷笑","k_00041px":"吐","k_003rjh5":"委屈","k_003j36u":"西瓜","k_002re92":"下雨","k_00041py":"吓","k_003q06o":"献吻","k_002ubjp":"香蕉","k_003o2tr":"象棋","k_03ie6pa":"心碎了","k_003rao5":"信封","k_003l3us":"熊猫","k_000424d":"嘘","k_00033yi":"药","k_002qtyy":"疑问","k_002qe0o":"阴险","k_03gu7us":"右车头","k_03ere8m":"右哼哼","k_003uqk3":"雨伞","k_003tzdv":"月亮","k_0003z00":"晕","k_002vdrd":"再见","k_003ra1w":"炸弹","k_003lcad":"折磨","k_003q7sz":"纸巾","k_002thn9":"咒骂","k_003qx7f":"猪头","k_003l044":"抓狂","k_003qg4h":"转圈","k_003kb97":"龇牙","k_03gu53l":"左车头","k_03erd1f":"左哼哼","k_003nyvl":"爱情","k_003r85z":"爱心","k_003mk8j":"钞票","k_003pwfj":"大哭","k_00042w5":"刀","k_003nmtr":"握手","k_03c529p":"右太极","k_003n4mk":"钻戒","k_03c5488":"左太极","k_1llp7tu":"该用户不存在","k_0tbyqyb":"加载中…","k_0td1p3f":"保存中…","k_1klqdh1":"仅限汉字、英文、数字和下划线","k_03el5lp":"未填写","k_1ui0gai":"搜索指定内容","k_003nvk2":"消息","k_03agld7":"群提示","k_0elt0kw":"添加群聊","k_0s3sgel":"移出黑名单","k_1qqgjra":"$option3条未读消息","k_0uubyjr":"以下为未读消息","k_16as7eq":"表情回应","k_003s12u":"回复","k_003s38r":"更多","k_002wkr3":"翻译","k_13g4hxv":"翻译完成","k_003molk":"表情","k_165bbw6":"消息历史","k_13sqc0z":"清除消息","k_0glns86":"删除会话","k_13s99rx":"清空消息","k_11vsa3j":"退出群组","k_11vvszp":"解散群组","k_15i9w72":"群管理员","k_0p3espj":"设置备注名","k_118sw9v":"立即搜索","k_0h20hg5":"视频通话","k_0h22snw":"语音通话","k_003lz6t":"对方","k_1xf4yre":"发送给$option1","k_003por5":"截图","k_1rw7s82":" 访问相册中视频权限,以正常使用发送视频等功能。","k_003rcwm":"打开","k_1698c42":"在访达中打开","k_066fxsz":"查看文件夹","k_0k432y2":"无法发送,包含文件夹","k_002wb4y":"会话","k_0od4qyh":"视频文件异常","k_1bfkxg9":"不支持 0KB 文件的传输","k_0vvsw7g":"文件处理异常","k_06e224q":"[消息被管理员撤回]","k_1u1mjcl":"[消息被撤回]","k_1qcqxea":"选择多个会话","k_1qgmc20":"选择一个会话","k_1d8nx6f":"在新窗口中打开","k_1hz05ax":"正在下载原始资源,请稍候..."} \ No newline at end of file +{ + "k_1yemzyd": "收到一條訊息", + "k_0ylosxn": "自定義訊息", + "k_13sajrj": "貼圖訊息", + "k_13sjeb7": "檔案訊息", + "k_0yd2ft8": "群提示訊息", + "k_13s7mxn": "圖片訊息", + "k_13satlt": "位置訊息", + "k_00bbtsx": "合並轉發訊息", + "k_13sqwu4": "語音訊息", + "k_13sqjjp": "影片", + "k_1fdhj9g": "該版本不支持此訊息", + "k_06pujtm": "同意任何用戶添加好友", + "k_0gyhkp5": "需要驗證", + "k_121ruco": "拒絕任何人加好友", + "k_05nspni": "自定義字段", + "k_03fchyy": "群頭像", + "k_03i9mfe": "群簡介", + "k_03agq58": "群名稱", + "k_039xqny": "群通知", + "k_003tr0a": "群主", + "k_03iqsh4": "$s為 ", + "k_191t5n4": "$opUserNickName修改", + "k_1pg6aoj": "$opUserNickName退出群組", + "k_1f6zt3v": "邀請$invitedMemberString加入群組", + "k_0y7zd07": "將$invitedMemberString踢出群組", + "k_03c49qt": "去授權", + "k_1d5mshh": "用戶$joinedMemberString加入了群組", + "k_002wddw": "禁言", + "k_0got6f7": "解除禁言", + "k_0yenqf0": "$userName 被", + "k_0spotql": "將 $adminMember 設置為管理員", + "k_0pg5zzj": "系統訊息 $operationType", + "k_0ohzb9l": "通話時間:$callTime", + "k_1uaqed6": "[自定義]", + "k_0z2z7rx": "[語音]", + "k_0y39ngu": "[貼圖]", + "k_1c7z88n": "[檔案] $fileName", + "k_0y1a2my": "[圖片]", + "k_0z4fib8": "[影片]", + "k_0y24mcg": "[位置]", + "k_0pewpd1": "[聊天記錄]", + "k_13s8d9p": "未知訊息", + "k_1c3us5n": "當前群組不支持@全體成員", + "k_11k579v": "發言中有非法語句", + "k_003qkx2": "日歷", + "k_003n2pz": "相機", + "k_03idjo0": "聯絡人", + "k_003ltgm": "位置", + "k_02k3k86": "咪高風", + "k_003pm7l": "相冊", + "k_15ao57x": "相冊寫入", + "k_164m3jd": "本地存儲", + "k_0qba4ns": "想訪問您的$yoursItem", + "k_03r6qyx": "我們需要您的同意才能獲取信息", + "k_02noktt": "不允許", + "k_00043x4": "好", + "k_003qzac": "昨天", + "k_003r39d": "前天", + "k_03fqp9o": "星期天", + "k_03ibg5h": "星期一", + "k_03i7hu1": "星期二", + "k_03iaiks": "星期三", + "k_03el9pa": "星期四", + "k_03i7ok1": "星期五", + "k_03efxyg": "星期六", + "k_0oozw9x": "$diffMinutes 分鐘前", + "k_003q7ba": "下午", + "k_003q7bb": "上午", + "k_003pu3h": "現在", + "k_13hzn00": "昨天 $yesterday", + "k_0n9pyxz": "用戶不存在", + "k_1bjwemh": "搜尋用戶 ID", + "k_003kv3v": "搜尋", + "k_02owlq8": "我的用戶ID: $userID", + "k_1wu8h4x": "我是: $showName", + "k_16758qw": "添加好友", + "k_1shx4d9": "個性簽名: $selfSignature", + "k_0i553x0": "填寫驗證信息", + "k_031ocwx": "請填寫備註和分組", + "k_003ojje": "備註", + "k_003lsav": "分組", + "k_167bdvq": "我的好友", + "k_156b4ut": "好友申請已發送", + "k_002r305": "發送", + "k_03gu05e": "聊天室", + "k_03b4f3p": "會議群", + "k_03avj1p": "公開群", + "k_03asq2g": "工作群", + "k_03b3hbi": "未知群", + "k_1loix7s": "群類型: $groupType", + "k_1lqbsib": "該群組不存在", + "k_03h153m": "搜尋群ID", + "k_0oxak3r": "群申請已發送", + "k_002rflt": "刪除", + "k_1don84v": "無法定位到原訊息", + "k_003q5fi": "復製", + "k_003prq0": "轉發", + "k_002r1h2": "多選", + "k_003j708": "引用", + "k_003pqpr": "回收", + "k_03ezhho": "已復製", + "k_11ctfsz": "暫未實現", + "k_1hbjg5g": "[群系統訊息]", + "k_03tvswb": "[未知訊息]", + "k_155cj23": "您回收了一條訊息,", + "k_0gapun3": "重新編輯", + "k_1uh417q": "$displayName回收了一條訊息", + "k_1aszp2k": "您確定要重發這條訊息麽?", + "k_003rzap": "確定", + "k_003nevv": "取消", + "k_0003z7x": "您", + "k_002wfe4": "已讀", + "k_002wjlg": "未讀", + "k_0h1ygf8": "發起通話", + "k_0h169j0": "取消通話", + "k_0h13jjk": "接受通話", + "k_0h19hfx": "拒絕通話", + "k_0obi9lh": "超時未接聽", + "k_0y9u662": "「$appName」暫不可以開啟此類檔案,你可以使用其他應用開啟並預覽", + "k_001nmhu": "用其他應用開啟", + "k_1ht1b80": "正在接收中", + "k_105682d": "圖片載入失敗", + "k_0pytyeu": "圖片保存成功", + "k_0akceel": "圖片保存失敗", + "k_003rk1s": "保存", + "k_04a0awq": "[語音訊息]", + "k_105c3y3": "影片載入失敗", + "k_176rzr7": "聊天記錄", + "k_0d5z4m5": "選擇提醒人", + "k_003ngex": "完成", + "k_1665ltg": "發起呼叫", + "k_003n8b0": "拍攝", + "k_003kthh": "照片", + "k_003tnp0": "檔案", + "k_0jhdhtp": "發送失敗,影片不能大於100MB", + "k_119ucng": "圖片不能為空", + "k_0w9x8gw": "選擇成功$successPath", + "k_13dsw4l": "松開取消", + "k_0am7r68": "手指上滑,取消發送", + "k_15jl6qw": "說話時間太短!", + "k_0gx7vl6": "按住說話", + "k_15dlafd": "逐條轉發", + "k_15dryxy": "合並轉發", + "k_1eyhieh": "確定刪除已選訊息", + "k_17fmlyf": "清除聊天", + "k_0dhesoz": "取消置頂", + "k_002sk7x": "置頂", + "k_003ll77": "草稿", + "k_03icaxo": "自定義", + "k_1969986": "[語音通話]:$callingLastMsgShow", + "k_1960dlr": "[視訊通話]:$callingLastMsgShow", + "k_1np495n": "$messageString[有人@我]", + "k_1m797yi": "$messageString[@所有人]", + "k_1uaov41": "查找聊天內容", + "k_003kfai": "未知", + "k_13dq4an": "自動審批", + "k_0l13cde": "管理員審批", + "k_11y8c6a": "禁止加群", + "k_1kvyskd": "無網絡連接,無法修改", + "k_16payqf": "加群方式", + "k_0vzvn8r": "修改群名稱", + "k_038lh6u": "群管理", + "k_0k5wyiy": "設置管理員", + "k_0goiuwk": "全員禁言", + "k_1g889xx": "全員禁言開啟後,只允許群主和管理員發言。", + "k_0wlrefq": "添加需要禁言的群成員", + "k_0goox5g": "設置禁言", + "k_08daijh": "成功取消管理員身份", + "k_0bxm97s": "管理員 ($adminNum/10)", + "k_0k5u935": "添加管理員", + "k_03enyx5": "群成員", + "k_0jayw3z": "群成員($groupMemberNum人)", + "k_0h1svv1": "刪除群成員", + "k_0h1g636": "添加群成員", + "k_0uj7208": "無網絡連接,無法查看群成員", + "k_01yfa4o": "$memberCount人", + "k_0hpukyx": "查看更多群成員", + "k_0qtsar0": "訊息免打擾", + "k_0ef2a12": "修改我的群昵稱", + "k_1aajych": "僅限中文、字母、數字和下劃線,2-20個字", + "k_137pab5": "我的群昵稱", + "k_0ivim6d": "暫無群公告", + "k_03eq6cn": "群公告", + "k_002vxya": "編輯", + "k_17fpl3y": "置頂聊天", + "k_03es1ox": "群類型", + "k_003mz1i": "同意", + "k_003lpre": "拒絕", + "k_003qk66": "頭像", + "k_003lhvk": "昵稱", + "k_003ps50": "賬號", + "k_15lx52z": "個性簽名", + "k_003qgkp": "性別", + "k_003m6hr": "生日", + "k_0003v6a": "男", + "k_00043x2": "女", + "k_03bcjkv": "未設置", + "k_11s0gdz": "修改昵稱", + "k_0p3j4sd": "僅限中字、字母、數字和下劃線", + "k_15lyvdt": "修改簽名", + "k_0vylzjp": "這個人很懶,什麽也沒寫", + "k_1hs7ese": "等上線再改這個", + "k_03exjk7": "備註名", + "k_0s3skfd": "加入黑名單", + "k_0p3b31s": "修改備註名", + "k_0003y9x": "無", + "k_11zgnfs": "個人資料", + "k_03xd79d": "個性簽名: $signature", + "k_1tez2xl": "暫無個性簽名", + "k_118prbn": "全局搜尋", + "k_1m9dftc": "全部聯絡人", + "k_0em4gyz": "全部群組", + "k_002twmj": "群組", + "k_09kga0d": "更多聊天記錄", + "k_1ui5lzi": "$count條相關聊天記錄", + "k_09khmso": "相關聊天記錄", + "k_1kevf4k": "與$receiver的聊天記錄", + "k_0vjj2kp": "群組的聊天記錄", + "k_003n2rp": "選擇", + "k_03ignw6": "所有人", + "k_03erpei": "管理員", + "k_0qi9tno": "群主、管理員", + "k_1m9exwh": "最近聯絡人", + "k_119nwqr": "輸入不能為空", + "k_0pzwbmg": "影片保存成功", + "k_0aktupv": "影片保存失敗", + "k_1qbg9xc": "$option8為 ", + "k_1wq5ubm": "$option7修改", + "k_0y5pu80": "$option6退出群組", + "k_0nl7cmd": "邀請$option5加入群組", + "k_1ju5iqw": "將$option4踢出群組", + "k_1ovt677": "用戶$option3加入了群組", + "k_0k05b8b": "$option2 被", + "k_0wm4xeb": "系統訊息 $option2", + "k_0nbq9v3": "通話時間:$option2", + "k_0i1kf53": "[檔案] $option2", + "k_1gnnby6": "想訪問您的$option2", + "k_1wh4atg": "$option2 分鐘前", + "k_07sh7g1": "昨天 $option2", + "k_1pj8xzh": "我的用戶ID: $option2", + "k_0py1evo": "個性簽名: $option2", + "k_1kvj4i2": "$option2回收了一條訊息", + "k_1v0lbpp": "「$option2」暫不可以開啟此類檔案,你可以使用其他應用開啟並預覽", + "k_0torwfz": "選擇成功$option2", + "k_0i1bjah": "$option1回收了一條訊息", + "k_1qzxh9q": "通話時間:$option3", + "k_0wrgmom": "[語音通話]:$option1", + "k_06ix2f0": "[視訊通話]:$option2", + "k_08o3z5w": "[檔案] $option1", + "k_0ezbepg": "$option2[有人@我]", + "k_1ccnht1": "$option2[@所有人]", + "k_1k3arsw": "管理員 ($option2/10)", + "k_1d4golg": "群成員($option1人)", + "k_1bg69nt": "$option1人", + "k_00gjqxj": "個性簽名: $option1", + "k_0c29cxr": "$option1條相關聊天記錄", + "k_1twk5rz": "與$option1的聊天記錄", + "k_1vn4xq1": "將 $adminMember 取消管理員", + "k_0e35hsw": "為方便您將所拍攝的照片或影片發送給朋友,以及進行視訊通話,請允許我們訪問攝像頭進行拍攝照片和影片。", + "k_0dj6yr7": "為方便您發送語音訊息、拍攝影片以及音視訊通話,請允許我們使用咪高風進行錄音。", + "k_003qnsl": "存儲", + "k_0s3rtpw": "為方便您查看和選擇相冊裏的圖片影片發送給朋友,以及保存內容到設備,請允許我們訪問您設備上的照片、媒體內容。", + "k_0tezv85": " 申請獲取$option2", + "k_002rety": "權限", + "k_18o68ro": "需要授予", + "k_1onpf8u": " 相機權限,以正常使用拍攝圖片/影片、視訊通話等功能。", + "k_17irga5": " 咪高風權限,以正常使用發送語音訊息、拍攝影片、音視訊通話等功能。", + "k_0572kc4": " 訪問照片權限,以正常使用發送圖片、影片等功能。", + "k_0slykws": " 訪問相冊寫入權限,以正常使用存儲圖片、影片等功能。", + "k_119pkcd": " 檔案讀寫權限,以正常使用在聊天功能中的圖片查看、選擇能力和發送檔案的能力。", + "k_0gqewd3": "以後再說", + "k_03eq4s1": "去開啟", + "k_0nt2uyg": "回到最新位置", + "k_04l16at": "$option1條新訊息", + "k_13p3w93": "有人@我", + "k_18w5uk6": "@所有人", + "k_0jmujgh": "其他檔案正在接收中", + "k_12s5ept": "訊息詳情", + "k_0mxa4f4": "$option1人已讀", + "k_061tue3": "$option2人未讀", + "k_18qjstb": "轉讓群主", + "k_0on1aj2": "有$option2條@我訊息", + "k_09j4izl": "[有人@我] ", + "k_1oqtjw0": "[@所有人] ", + "k_1x5a9vb": "我是: $option1", + "k_14n31e7": "進群請求", + "k_08nc5j1": "群類型: $option1", + "k_1josu12": "$option1 條入群請求", + "k_0n2x5s0": "驗證消息: $option2", + "k_03c1nx0": "已同意", + "k_03aw9w8": "已拒絕", + "k_038ryos": "去處理", + "k_0gw8pum": "進群申請", + "k_1gcvfrj": "請填寫備註名", + "k_002v9zj": "确认", + "k_10oqrki": "轻触拍照", + "k_0f8b3ws": "加载失败", + "k_11cm5lm": "手动聚焦", + "k_002uzrd": "预览", + "k_003qkn3": "录像", + "k_003k6a7": "拍照", + "k_0bqpqco": "拍照按钮", + "k_1626ozl": "停止录像", + "k_003lvmu": "前置", + "k_003lued": "后置", + "k_003lwzh": "外置", + "k_002qzi3": "关闭", + "k_003pufb": "自动", + "k_0apm0ze": "拍照时闪光", + "k_157zog5": "始终闪光", + "k_0cfyqhy": "$option1 画面预览", + "k_0phctlz": "闪光模式: $option2", + "k_02vfqe0": "切换至 $option3 摄像头", + "k_0f0y9ex": "说话时间太短", + "k_0ln70tk": "无法打开URL", + "k_11a3jdv": "轻触拍照,长按摄像", + "k_1k18miv": "请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。", + "k_1fu9ahv": "全员禁言状态", + "k_0gmwbnd": "全员禁言中", + "k_0got2zr": "您被禁言", + "k_0y9jck8": "你必须自定义search bar,并处理点击跳转", + "k_0yum3tv": "如使用自定义区域,请在profileWidgetBuilder传入对应组件", + "k_09kalj0": "清空聊天记录", + "k_14j5iul": "删除并退出", + "k_125ru1w": "解散该群", + "k_0jtutmw": "退出后不会接收到此群聊消息", + "k_0jtzmqa": "解散后不会接收到此群聊消息", + "k_0r8fi93": "好友添加成功", + "k_02qw14e": "好友申请已发出", + "k_0n3md5x": "当前用户在黑名单", + "k_094phq4": "好友添加失败", + "k_129scag": "好友删除成功", + "k_129uzfn": "好友删除失败", + "k_1666isy": "清除好友", + "k_1679vrd": "加为好友", + "k_1ualc52": "看看对方带来的数据是啥", + "k_0szluvp": "设置对方在线状态", + "k_0f4rnf8": "该用户已是好友", + "k_1tdkom4": "您已是群成员", + "k_1p2lyuz": "对方正在输入中...", + "k_1g8wfpy": "...共$option1人", + "k_12rv9vw": "回应详情", + "k_0havgi0": "[查看详情 >>](${linkMessage.link})", + "k_0n9p7g8": "群组不存在", + "k_1tdh5vn": "您不是群成员", + "k_0h1q57v": "暂无群成员", + "k_0y5drq1": "[查看详情 >>]($option1)", + "k_03pjp61": "[表情消息]", + "k_1jpvzul": "[自定义消息]", + "k_03u3bh1": "[文件消息]", + "k_1odsnsw": "[群消息]", + "k_03sel4t": "[图片消息]", + "k_03sfw3r": "[位置消息]", + "k_03xpuwq": "[合并消息]", + "k_07ycxwo": "[没有元素]", + "k_03rc9vz": "[文本消息]", + "k_046uopf": "[视频消息]", + "k_0ehmsun": "设备存储空间不足,建议清理,以获得更好使用体验", + "k_003kmos": "图片", + "k_002s86q": "视频", + "k_06bk5ei": "视频消息仅限 mp4 格式", + "k_13opfxf": "Web网页端不支持搜索", + "k_1i0o0y2": "暂时仅限 Android/iOS 端", + "k_045dtzl": "$option1的聊天记录", + "k_0t0131u": "群资料信息", + "k_18ok8xz": "消息接收方式", + "k_03ax3ks": "群资料", + "k_0sqvoqo": "将 $option1 设置为管理员", + "k_1gbg1v8": "将 $option1 取消管理员", + "k_17k64g4": "群聊创建成功!", + "k_05mn217": "暂未安装表情包插件,如需使用表情相关功能,请根据本文档安装:https://cloud.tencent.com/document/product/269/70746", + "k_14j17nz": "暂无表情包", + "k_0fvjexh": "正在下载中", + "k_1cdagzz": "已加入待下载队列,其他文件下载中", + "k_0g4vojc": "开始下载", + "k_1g32es3": "[调皮]@2x.png", + "k_1g8qorz": "[爱你]@2x.png", + "k_1g4hmx6": "[爱情]@2x.png", + "k_1g6b558": "[爱心]@2x.png", + "k_1g3m4su": "[傲慢]@2x.png", + "k_1g2jym7": "[白眼]@2x.png", + "k_0cgkxuw": "[棒棒糖]@2x.png", + "k_1g48br2": "[抱抱]@2x.png", + "k_1g49ol8": "[抱拳]@2x.png", + "k_1g0ras3": "[爆筋]@2x.png", + "k_1ghy881": "[鄙视]@2x.png", + "k_1g86bmv": "[闭嘴]@2x.png", + "k_1g1xs1p": "[鞭炮]@2x.png", + "k_1g8i6ri": "[便便]@2x.png", + "k_1g2u5kf": "[擦汗]@2x.png", + "k_1g60uwh": "[彩带]@2x.png", + "k_1g1o0d0": "[彩球]@2x.png", + "k_1g6a6yq": "[菜刀]@2x.png", + "k_1g6vqo2": "[差劲]@2x.png", + "k_1g0kvjc": "[钞票]@2x.png", + "k_1g65x7e": "[车厢]@2x.png", + "k_0e1tjol": "[打哈欠]@2x.png", + "k_1g65n58": "[大兵]@2x.png", + "k_1g7se7o": "[大哭]@2x.png", + "k_1g03868": "[蛋糕]@2x.png", + "k_1h8nm66": "[刀]@2x.png", + "k_1g3dlpi": "[得意]@2x.png", + "k_1g3u434": "[灯泡]@2x.png", + "k_1giuqs7": "[凋谢]@2x.png", + "k_1g8r0r9": "[多云]@2x.png", + "k_1g7k6i1": "[发呆]@2x.png", + "k_1g44zsp": "[发抖]@2x.png", + "k_1g5l96i": "[飞机]@2x.png", + "k_1g7wsqj": "[飞吻]@2x.png", + "k_1g49luq": "[奋斗]@2x.png", + "k_1gixbsm": "[风车]@2x.png", + "k_1g6cqbq": "[尴尬]@2x.png", + "k_1g6jbw5": "[勾引]@2x.png", + "k_1g3lwo1": "[鼓掌]@2x.png", + "k_1g13nkj": "[害羞]@2x.png", + "k_1g0mt47": "[憨笑]@2x.png", + "k_0bxujkf": "[红灯笼]@2x.png", + "k_0hhaeh8": "[红双喜]@2x.png", + "k_1g0jnts": "[坏笑]@2x.png", + "k_1g46g9c": "[挥手]@2x.png", + "k_1g4vi9g": "[回头]@2x.png", + "k_1gf7hes": "[饥饿]@2x.png", + "k_1g6mvsm": "[激动]@2x.png", + "k_1gku5mf": "[街舞]@2x.png", + "k_1g4hidg": "[惊恐]@2x.png", + "k_1gjbrtu": "[惊讶]@2x.png", + "k_1g6sand": "[咖啡]@2x.png", + "k_1g4s8rj": "[磕头]@2x.png", + "k_1g1wn34": "[可爱]@2x.png", + "k_1g3l0wd": "[可怜]@2x.png", + "k_1ggaon9": "[抠鼻]@2x.png", + "k_1ggvcb0": "[骷髅]@2x.png", + "k_1h8yqjt": "[酷]@2x.png", + "k_0jac97i": "[快哭了]@2x.png", + "k_1h8oiby": "[困]@2x.png", + "k_1g0s5hg": "[蜡烛]@2x.png", + "k_1g1iuer": "[篮球]@2x.png", + "k_1g2xjfi": "[冷汗]@2x.png", + "k_0s5oyqw": "[礼品袋]@2x.png", + "k_1g1qqvf": "[礼物]@2x.png", + "k_1g2slew": "[流汗]@2x.png", + "k_1g3z9xx": "[流泪]@2x.png", + "k_1g6pabn": "[麻将]@2x.png", + "k_0pkaxul": "[麦克风]@2x.png", + "k_1g7m0zj": "[猫咪]@2x.png", + "k_0ibvtpo": "[么么哒]@2x.png", + "k_1g1hoh1": "[玫瑰]@2x.png", + "k_1gfzeow": "[米饭]@2x.png", + "k_1g5l15p": "[面条]@2x.png", + "k_1g2hfa6": "[奶瓶]@2x.png", + "k_1gix9pj": "[难过]@2x.png", + "k_1giqn6g": "[闹钟]@2x.png", + "k_1h8kd64": "[怒]@2x.png", + "k_1g0vui9": "[怄火]@2x.png", + "k_1g1jsj7": "[皮球]@2x.png", + "k_1ghdluw": "[啤酒]@2x.png", + "k_1gl6ec7": "[瓢虫]@2x.png", + "k_1g7gg5p": "[撇嘴]@2x.png", + "k_1g8psin": "[乒乓]@2x.png", + "k_1gjzu3p": "[汽车]@2x.png", + "k_1h8mr0k": "[强]@2x.png", + "k_1g45y2n": "[敲打]@2x.png", + "k_1gkaxsl": "[青蛙]@2x.png", + "k_0jcfnoo": "[糗大了]@2x.png", + "k_1g4njy1": "[拳头]@2x.png", + "k_1h8mqr3": "[弱]@2x.png", + "k_1h926fg": "[色]@2x.png", + "k_1g6rtbq": "[沙发]@2x.png", + "k_1giirh6": "[删除]@2x.png", + "k_1g14ny9": "[闪电]@2x.png", + "k_1g6bmsr": "[胜利]@2x.png", + "k_1g1rytx": "[示爱]@2x.png", + "k_1g52fbz": "[手枪]@2x.png", + "k_1h90dam": "[衰]@2x.png", + "k_1gigiae": "[睡觉]@2x.png", + "k_1gijchz": "[太阳]@2x.png", + "k_1g1sgji": "[跳绳]@2x.png", + "k_1gjwuri": "[跳跳]@2x.png", + "k_1g0juhk": "[偷笑]@2x.png", + "k_1h8nzla": "[吐]@2x.png", + "k_1g6cv0i": "[委屈]@2x.png", + "k_1g46l5g": "[握手]@2x.png", + "k_1g2pgkd": "[西瓜]@2x.png", + "k_1ging9p": "[下雨]@2x.png", + "k_1h8nzil": "[吓]@2x.png", + "k_1g7q7wr": "[献吻]@2x.png", + "k_1gl6uum": "[香蕉]@2x.png", + "k_1g23fys": "[象棋]@2x.png", + "k_0j75rdh": "[心碎了]@2x.png", + "k_1g6ajj2": "[信封]@2x.png", + "k_1g21prz": "[熊猫]@2x.png", + "k_1h8octi": "[嘘]@2x.png", + "k_1h91zox": "[药]@2x.png", + "k_1ghttfl": "[疑问]@2x.png", + "k_1ghk7sz": "[阴险]@2x.png", + "k_0gl37zz": "[右车头]@2x.png", + "k_0ifkj1p": "[右哼哼]@2x.png", + "k_0g1yh2e": "[右太极]@2x.png", + "k_1g9dkfc": "[雨伞]@2x.png", + "k_1g8jl88": "[月亮]@2x.png", + "k_1h8lhqj": "[晕]@2x.png", + "k_1gi9x2q": "[再见]@2x.png", + "k_1g6dwwv": "[炸弹]@2x.png", + "k_1fzmkfi": "[折磨]@2x.png", + "k_1g6jbiw": "[纸巾]@2x.png", + "k_1ggjnwu": "[咒骂]@2x.png", + "k_1g4qlq8": "[猪头]@2x.png", + "k_1g1lqzz": "[抓狂]@2x.png", + "k_1g80j3u": "[转圈]@2x.png", + "k_1g0z55s": "[龇牙]@2x.png", + "k_1g3ju6v": "[钻戒]@2x.png", + "k_0gl51l6": "[左车头]@2x.png", + "k_0iflllk": "[左哼哼]@2x.png", + "k_0g1y3ir": "[左太极]@2x.png", + "k_026hiq5": "消息列表加载中", + "k_003tu8k": "爱你", + "k_003myvp": "傲慢", + "k_003kddw": "白眼", + "k_039yfhv": "棒棒糖", + "k_003nu3p": "抱抱", + "k_003nijr": "抱拳", + "k_003mg88": "爆筋", + "k_002v17e": "鄙视", + "k_003qhy4": "闭嘴", + "k_003l5fq": "鞭炮", + "k_003uacl": "便便", + "k_003oq1g": "擦汗", + "k_003qvey": "彩带", + "k_003jci7": "彩球", + "k_003pyu1": "菜刀", + "k_003q97d": "差劲", + "k_003po5d": "车厢", + "k_03eadb2": "打哈欠", + "k_003pnuf": "大兵", + "k_003kg57": "蛋糕", + "k_003mxkt": "得意", + "k_003onu3": "灯泡", + "k_002uv8s": "凋谢", + "k_003kqy0": "调皮", + "k_003tyum": "多云", + "k_003pv9u": "发呆", + "k_036o6mu": "发抖t", + "k_003nogx": "飞机", + "k_003q7wg": "飞吻", + "k_003m0jd": "奋斗", + "k_002ult9": "风车", + "k_003r8gt": "尴尬", + "k_003qy4u": "勾引", + "k_003mnoa": "鼓掌", + "k_003lmw8": "害羞", + "k_003mb30": "憨笑", + "k_03bj41g": "红灯笼", + "k_03dxw2f": "红双喜", + "k_003mk57": "坏笑", + "k_003nmvf": "挥手", + "k_003r2i7": "回头", + "k_002s6f3": "饥饿", + "k_003qd0t": "激动", + "k_002vgi4": "街舞", + "k_003nz33": "惊恐", + "k_002wh4p": "惊讶", + "k_003ozpu": "咖啡", + "k_003qvs4": "磕头", + "k_003l3wb": "可爱", + "k_003nuwm": "可怜", + "k_002rw1q": "抠鼻", + "k_002tujb": "骷髅", + "k_00030eq": "酷", + "k_03i8ath": "快哭了", + "k_000421h": "困", + "k_003l5i7": "蜡烛", + "k_003j72g": "篮球", + "k_003ofwl": "冷汗", + "k_02mw65v": "礼品袋", + "k_003ku40": "礼物", + "k_003ookz": "流汗", + "k_003on72": "流泪", + "k_003rjy0": "麻将", + "k_003q2f8": "猫咪", + "k_03et393": "么么哒", + "k_003j7j2": "玫瑰", + "k_002sr0b": "米饭", + "k_003nnza": "面条", + "k_003jef9": "奶瓶", + "k_002umn0": "难过", + "k_002rjib": "闹钟", + "k_0003zcn": "怒", + "k_003jzwq": "怄火", + "k_003j4js": "皮球", + "k_002r5ir": "啤酒", + "k_002ubu4": "瓢虫", + "k_003ppo6": "撇嘴", + "k_003ty3o": "乒乓", + "k_002vxwe": "汽车", + "k_00043hb": "强", + "k_003nmbo": "敲打", + "k_002tfhq": "青蛙", + "k_03i7lrn": "糗大了", + "k_003r03m": "拳头", + "k_00043h0": "弱", + "k_000345z": "色", + "k_003qmp9": "沙发", + "k_003it8a": "闪电", + "k_003pxow": "胜利", + "k_003kw8e": "示爱", + "k_003n99g": "手枪", + "k_00035cl": "衰", + "k_002vl3h": "睡觉", + "k_002rgqk": "太阳", + "k_003m9d1": "跳绳", + "k_002vobp": "跳跳", + "k_003mkoz": "偷笑", + "k_00041px": "吐", + "k_003rjh5": "委屈", + "k_003j36u": "西瓜", + "k_002re92": "下雨", + "k_00041py": "吓", + "k_003q06o": "献吻", + "k_002ubjp": "香蕉", + "k_003o2tr": "象棋", + "k_03ie6pa": "心碎了", + "k_003rao5": "信封", + "k_003l3us": "熊猫", + "k_000424d": "嘘", + "k_00033yi": "药", + "k_002qtyy": "疑问", + "k_002qe0o": "阴险", + "k_03gu7us": "右车头", + "k_03ere8m": "右哼哼", + "k_003uqk3": "雨伞", + "k_003tzdv": "月亮", + "k_0003z00": "晕", + "k_002vdrd": "再见", + "k_003ra1w": "炸弹", + "k_003lcad": "折磨", + "k_003q7sz": "纸巾", + "k_002thn9": "咒骂", + "k_003qx7f": "猪头", + "k_003l044": "抓狂", + "k_003qg4h": "转圈", + "k_003kb97": "龇牙", + "k_03gu53l": "左车头", + "k_03erd1f": "左哼哼", + "k_003nyvl": "爱情", + "k_003r85z": "爱心", + "k_003mk8j": "钞票", + "k_003pwfj": "大哭", + "k_00042w5": "刀", + "k_003nmtr": "握手", + "k_03c529p": "右太极", + "k_003n4mk": "钻戒", + "k_03c5488": "左太极", + "k_1llp7tu": "该用户不存在", + "k_0tbyqyb": "加载中…", + "k_0td1p3f": "保存中…", + "k_1klqdh1": "仅限汉字、英文、数字和下划线", + "k_03el5lp": "未填写", + "k_1ui0gai": "搜索指定内容", + "k_003nvk2": "消息", + "k_03agld7": "群提示", + "k_0elt0kw": "添加群聊", + "k_0s3sgel": "移出黑名单", + "k_1qqgjra": "$option3条未读消息", + "k_0uubyjr": "以下为未读消息", + "k_16as7eq": "表情回应", + "k_003s12u": "回复", + "k_003s38r": "更多", + "k_002wkr3": "翻译", + "k_13g4hxv": "翻译完成", + "k_003molk": "表情", + "k_165bbw6": "消息历史", + "k_13sqc0z": "清除消息", + "k_0glns86": "删除会话", + "k_13s99rx": "清空消息", + "k_11vsa3j": "退出群组", + "k_11vvszp": "解散群组", + "k_15i9w72": "群管理员", + "k_0p3espj": "设置备注名", + "k_118sw9v": "立即搜索", + "k_0h20hg5": "视频通话", + "k_0h22snw": "语音通话", + "k_003lz6t": "对方", + "k_1xf4yre": "发送给$option1", + "k_003por5": "截图", + "k_1rw7s82": " 访问相册中视频权限,以正常使用发送视频等功能。", + "k_003rcwm": "打开", + "k_1698c42": "在访达中打开", + "k_066fxsz": "查看文件夹", + "k_0k432y2": "无法发送,包含文件夹", + "k_002wb4y": "会话", + "k_0od4qyh": "视频文件异常", + "k_1bfkxg9": "不支持 0KB 文件的传输", + "k_0vvsw7g": "文件处理异常", + "k_06e224q": "[消息被管理员撤回]", + "k_1u1mjcl": "[消息被撤回]", + "k_1qcqxea": "选择多个会话", + "k_1qgmc20": "选择一个会话", + "k_1d8nx6f": "在新窗口中打开", + "k_1hz05ax": "正在下载原始资源,请稍候...", + "k_002robo": "清除" +} \ No newline at end of file diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list.dart index 5ec20fa..871c32b 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list.dart @@ -334,7 +334,7 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState onClick; - MessageHoverControlItem( - {required this.name, required this.icon, required this.onClick}); + MessageHoverControlItem({required this.name, required this.icon, required this.onClick}); } class MessageItemBuilder { @@ -140,11 +138,7 @@ class MessageToolTipItem { final String iconImageAsset; final VoidCallback onClick; - MessageToolTipItem( - {required this.label, - required this.id, - required this.iconImageAsset, - required this.onClick}); + MessageToolTipItem({required this.label, required this.id, required this.iconImageAsset, required this.onClick}); } class ToolTipsConfig { @@ -170,12 +164,10 @@ class ToolTipsConfig { final bool showTranslation; /// A builder for additional custom items. We recommend using `additionalMessageToolTips` instead of this field since version 2.0, as you only need to provide the data rather than the whole widget. This makes usage easier and you don't need to worry about the UI display. - final Widget? Function(V2TimMessage message, Function() closeTooltip, - [Key? key, BuildContext? context])? additionalItemBuilder; + final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])? additionalItemBuilder; /// A list of additional message tooltip menu items, provided with the data only. We recommend using this field instead of the previous `additionalItemBuilder`. - List Function( - V2TimMessage message, Function() closeTooltip)? additionalMessageToolTips; + List Function(V2TimMessage message, Function() closeTooltip)? additionalMessageToolTips; ToolTipsConfig( {this.showDeleteMessage = true, @@ -186,8 +178,7 @@ class ToolTipsConfig { this.showCopyMessage = true, this.showForwardMessage = true, this.additionalMessageToolTips, - @Deprecated( - "Please use `additionalMessageToolTips` instead. You are now only expected to specify the data, rather than providing a whole widget. This makes usage easier, as you no longer need to worry about the UI display.") + @Deprecated("Please use `additionalMessageToolTips` instead. You are now only expected to specify the data, rather than providing a whole widget. This makes usage easier, as you no longer need to worry about the UI display.") this.additionalItemBuilder}); } @@ -196,12 +187,10 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { final V2TimMessage message; /// tap remote user avatar callback function - final void Function(String userID, TapDownDetails tapDetails)? - onTapForOthersPortrait; + final void Function(String userID, TapDownDetails tapDetails)? onTapForOthersPortrait; /// secondary tap remote user avatar callback function - final void Function(String userID, TapDownDetails tapDetails)? - onSecondaryTapForOthersPortrait; + final void Function(String userID, TapDownDetails tapDetails)? onSecondaryTapForOthersPortrait; /// the function use for reply message, when click replied message can scroll to it. final Function? onScrollToIndex; @@ -210,8 +199,7 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { final Function? onScrollToIndexBegin; /// the callback for long press event, except myself avatar - final Function(String? userId, String? nickName)? - onLongPressForOthersHeadPortrait; + final Function(String? userId, String? nickName)? onLongPressForOthersHeadPortrait; /// message item builder, works for customize all message types and row layout. final MessageItemBuilder? messageItemBuilder; @@ -237,8 +225,7 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { /// Auto mention user when send reply message final bool allowAtUserWhenReply; - @Deprecated( - "Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") + @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") /// allow show user nick name final bool showNickName; @@ -259,19 +246,16 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { final EdgeInsetsGeometry? textPadding; /// avatar builder - final Widget Function(BuildContext context, V2TimMessage message)? - userAvatarBuilder; + final Widget Function(BuildContext context, V2TimMessage message)? userAvatarBuilder; /// theme info for message and avatar final MessageThemeData? themeData; /// builder for nick name row - final Widget Function(BuildContext context, V2TimMessage message)? - topRowBuilder; + final Widget Function(BuildContext context, V2TimMessage message)? topRowBuilder; /// builder for bottom raw which under message content - final Widget Function(BuildContext context, V2TimMessage message)? - bottomRowBuilder; + final Widget Function(BuildContext context, V2TimMessage message)? bottomRowBuilder; // open MessageReaction final bool? isUseMessageReaction; @@ -292,9 +276,7 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { const TIMUIKitHistoryMessageListItem( {Key? key, required this.message, - @Deprecated( - "Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") - this.showNickName = false, + @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") this.showNickName = false, this.onScrollToIndex, this.onScrollToIndexBegin, this.onTapForOthersPortrait, @@ -333,9 +315,7 @@ class TipsActionItem extends TIMUIKitStatelessWidget { final String icon; final String? package; - TipsActionItem( - {Key? key, required this.label, required this.icon, this.package}) - : super(key: key); + TipsActionItem({Key? key, required this.label, required this.icon, this.package}) : super(key: key); @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { @@ -363,15 +343,12 @@ class TipsActionItem extends TIMUIKitStatelessWidget { } } -class _TIMUIKItHistoryMessageListItemState - extends TIMUIKitState - with TickerProviderStateMixin { +class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState with TickerProviderStateMixin { SuperTooltip? tooltip; // ignore: unused_field final MessageService _messageService = serviceLocator(); - final TUISelfInfoViewModel selfInfoModel = - serviceLocator(); + final TUISelfInfoViewModel selfInfoModel = serviceLocator(); final TUIThemeViewModel themeModel = serviceLocator(); // bool isChecked = false; @@ -384,15 +361,10 @@ class _TIMUIKItHistoryMessageListItemState } bool isReplyMessage(V2TimMessage message) { - final hasCustomData = - message.cloudCustomData != null && message.cloudCustomData != ""; + final hasCustomData = message.cloudCustomData != null && message.cloudCustomData != ""; if (hasCustomData) { try { - final CloudCustomData messageCloudCustomData = CloudCustomData.fromJson( - json.decode( - TencentUtils.checkString(message.cloudCustomData) != null - ? message.cloudCustomData! - : "{}")); + final CloudCustomData messageCloudCustomData = CloudCustomData.fromJson(json.decode(TencentUtils.checkString(message.cloudCustomData) != null ? message.cloudCustomData! : "{}")); if (messageCloudCustomData.messageReply != null) { MessageRepliedData.fromJson(messageCloudCustomData.messageReply!); return true; @@ -405,8 +377,7 @@ class _TIMUIKItHistoryMessageListItemState return false; } - (bool isRevoke, bool isRevokeByAdmin) isRevokeMessage( - V2TimMessage message, TUIChatSeparateViewModel model) { + (bool isRevoke, bool isRevokeByAdmin) isRevokeMessage(V2TimMessage message, TUIChatSeparateViewModel model) { if (message.status == 6) { return (true, false); } else if (model.chatConfig.isGroupAdminRecallEnabled) { @@ -422,11 +393,9 @@ class _TIMUIKItHistoryMessageListItemState return (false, false); } - Widget _messageItemBuilder( - V2TimMessage messageItem, TUIChatSeparateViewModel model) { + Widget _messageItemBuilder(V2TimMessage messageItem, TUIChatSeparateViewModel model) { final msgType = messageItem.elemType; - final isShowJump = (model.jumpMsgID == messageItem.msgID) && - (messageItem.msgID?.isNotEmpty ?? false); + final isShowJump = (model.jumpMsgID == messageItem.msgID) && (messageItem.msgID?.isNotEmpty ?? false); final MessageItemBuilder? messageItemBuilder = widget.messageItemBuilder; final isFromSelf = messageItem.isSelf ?? true; void clearJump() { @@ -437,14 +406,13 @@ class _TIMUIKItHistoryMessageListItemState switch (msgType) { case MessageElemType.V2TIM_ELEM_TYPE_CUSTOM: - final customWidget = - messageItemBuilder?.customMessageItemBuilder != null - ? messageItemBuilder!.customMessageItemBuilder!( - messageItem, - isShowJump, - () => model.jumpMsgID = "", - ) - : null; + final customWidget = messageItemBuilder?.customMessageItemBuilder != null + ? messageItemBuilder!.customMessageItemBuilder!( + messageItem, + isShowJump, + () => model.jumpMsgID = "", + ) + : null; return customWidget ?? TIMUIKitCustomElem( message: messageItem, @@ -482,14 +450,13 @@ class _TIMUIKItHistoryMessageListItemState ); case MessageElemType.V2TIM_ELEM_TYPE_TEXT: if (isReplyMessage(messageItem)) { - final customWidget = - messageItemBuilder?.textReplyMessageItemBuilder != null - ? messageItemBuilder!.textReplyMessageItemBuilder!( - messageItem, - isShowJump, - () => model.jumpMsgID = "", - ) - : null; + final customWidget = messageItemBuilder?.textReplyMessageItemBuilder != null + ? messageItemBuilder!.textReplyMessageItemBuilder!( + messageItem, + isShowJump, + () => model.jumpMsgID = "", + ) + : null; return customWidget ?? TIMUIKitReplyElem( message: messageItem, @@ -565,14 +532,13 @@ class _TIMUIKItHistoryMessageListItemState isShowMessageReaction: widget.isUseMessageReaction, ); case MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS: - final customWidget = - messageItemBuilder?.groupTipsMessageItemBuilder != null - ? messageItemBuilder!.groupTipsMessageItemBuilder!( - messageItem, - isShowJump, - () => model.jumpMsgID = "", - ) - : null; + final customWidget = messageItemBuilder?.groupTipsMessageItemBuilder != null + ? messageItemBuilder!.groupTipsMessageItemBuilder!( + messageItem, + isShowJump, + () => model.jumpMsgID = "", + ) + : null; return customWidget ?? Text(TIM_t("[群系统消息]")); case MessageElemType.V2TIM_ELEM_TYPE_IMAGE: final customWidget = messageItemBuilder?.imageMessageItemBuilder != null @@ -608,24 +574,22 @@ class _TIMUIKItHistoryMessageListItemState isShowMessageReaction: widget.isUseMessageReaction, ); case MessageElemType.V2TIM_ELEM_TYPE_LOCATION: - final customWidget = - messageItemBuilder?.locationMessageItemBuilder != null - ? messageItemBuilder!.locationMessageItemBuilder!( - messageItem, - isShowJump, - () => model.jumpMsgID = "", - ) - : null; + final customWidget = messageItemBuilder?.locationMessageItemBuilder != null + ? messageItemBuilder!.locationMessageItemBuilder!( + messageItem, + isShowJump, + () => model.jumpMsgID = "", + ) + : null; return customWidget ?? Text(TIM_t("[位置]")); case MessageElemType.V2TIM_ELEM_TYPE_MERGER: - final customWidget = - messageItemBuilder?.mergerMessageItemBuilder != null - ? messageItemBuilder!.mergerMessageItemBuilder!( - messageItem, - isShowJump, - () => model.jumpMsgID = "", - ) - : null; + final customWidget = messageItemBuilder?.mergerMessageItemBuilder != null + ? messageItemBuilder!.mergerMessageItemBuilder!( + messageItem, + isShowJump, + () => model.jumpMsgID = "", + ) + : null; return customWidget ?? TIMUIKitMergerElem( messageItemBuilder: messageItemBuilder, @@ -644,11 +608,7 @@ class _TIMUIKItHistoryMessageListItemState Widget _groupTipsMessageBuilder(TUIChatSeparateViewModel model) { final messageItem = widget.message; - return Container( - padding: const EdgeInsets.only(bottom: 20), - child: TIMUIKitGroupTipsElem( - groupTipsElem: messageItem.groupTipsElem!, - groupMemberList: model.groupMemberList ?? [])); + return Container(padding: const EdgeInsets.only(bottom: 20), child: TIMUIKitGroupTipsElem(groupTipsElem: messageItem.groupTipsElem!, groupMemberList: model.groupMemberList ?? [])); } Widget _selfRevokeEditMessageBuilder(theme, TUIChatSeparateViewModel model) { @@ -664,8 +624,7 @@ class _TIMUIKItHistoryMessageListItemState text: TIM_t("重新编辑"), recognizer: TapGestureRecognizer() ..onTap = () { - widget.textFieldController - ?.setTextField(widget.message.textElem?.text ?? ""); + widget.textFieldController?.setTextField(widget.message.textElem?.text ?? ""); }, style: TextStyle(color: theme.primaryColor), ) @@ -682,15 +641,12 @@ class _TIMUIKItHistoryMessageListItemState )); } - Widget _timeDividerBuilder( - theme, int timeStamp, TUIChatSeparateViewModel model) { + Widget _timeDividerBuilder(theme, int timeStamp, TUIChatSeparateViewModel model) { return Container( alignment: Alignment.center, margin: const EdgeInsets.symmetric(vertical: 20), child: Text( - model.chatConfig.timeDividerConfig?.timestampParser != null - ? (model.chatConfig.timeDividerConfig?.timestampParser!(timeStamp))! - : TimeAgo().getTimeForMessage(timeStamp), + model.chatConfig.timeDividerConfig?.timestampParser != null ? (model.chatConfig.timeDividerConfig?.timestampParser!(timeStamp))! : TimeAgo().getTimeForMessage(1709740800), style: widget.themeData?.timelineTextStyle ?? TextStyle( fontSize: 12, @@ -714,10 +670,7 @@ class _TIMUIKItHistoryMessageListItemState width: 100, child: Container( decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - const Color(0x00C0E1FF), - theme.primaryColor ?? CommonColor.lightPrimaryColor - ]), + gradient: LinearGradient(colors: [const Color(0x00C0E1FF), theme.primaryColor ?? CommonColor.lightPrimaryColor]), )), ), ), @@ -749,8 +702,7 @@ class _TIMUIKItHistoryMessageListItemState ); } - bool isRevocable(int timestamp) => - (DateTime.now().millisecondsSinceEpoch / 1000).ceil() - timestamp < 120; + bool isRevocable(int timestamp) => (DateTime.now().millisecondsSinceEpoch / 1000).ceil() - timestamp < 120; // TODO : 继续看这里 @@ -771,38 +723,21 @@ class _TIMUIKItHistoryMessageListItemState final screenHeight = MediaQuery.of(context).size.height; final screenWidth = MediaQuery.of(context).size.width; - final isDesktopScreen = - TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; - final isLongMessage = - context.size!.height + 350 > screenHeight && !(isDesktopScreen); - final tapDetails = - (isDesktopScreen || isLongMessage) ? (details ?? _tapDetails) : details; + final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; + final isLongMessage = context.size!.height + 350 > screenHeight && !(isDesktopScreen); + final tapDetails = (isDesktopScreen || isLongMessage) ? (details ?? _tapDetails) : details; final isSelf = message.isSelf ?? true; - final targetWidth = - min(MediaQuery.of(context).size.width * 0.84, 350).toDouble(); - final double dx = !isSelf - ? min(tapDetails?.globalPosition.dx ?? targetWidth, - screenWidth - targetWidth) - : max(tapDetails?.globalPosition.dx ?? targetWidth, targetWidth) - .toDouble(); - final double dy = min( - tapDetails?.globalPosition.dy ?? MediaQuery.of(context).size.height, - MediaQuery.of(context).size.height - 320) - .toDouble(); + final targetWidth = min(MediaQuery.of(context).size.width * 0.84, 350).toDouble(); + final double dx = !isSelf ? min(tapDetails?.globalPosition.dx ?? targetWidth, screenWidth - targetWidth) : max(tapDetails?.globalPosition.dx ?? targetWidth, targetWidth).toDouble(); + final double dy = min(tapDetails?.globalPosition.dy ?? MediaQuery.of(context).size.height, MediaQuery.of(context).size.height - 320).toDouble(); final finalTapDetail = tapDetails != null ? TapDownDetails( globalPosition: Offset(dx, dy), ) : null; - initTools( - context: c, - model: model, - isShowMoreSticker: isShowMoreSticker, - details: finalTapDetail, - theme: theme, - isFromWideToolTip: isFromWideTooltip); + initTools(context: c, model: model, isShowMoreSticker: isShowMoreSticker, details: finalTapDetail, theme: theme, isFromWideToolTip: isFromWideTooltip); tooltip!.show(c, targetCenter: finalTapDetail?.globalPosition); } @@ -815,26 +750,15 @@ class _TIMUIKItHistoryMessageListItemState } } - Future> _modifySticker( - int sticker) async { + Future> _modifySticker(int sticker) async { return await Future.delayed(const Duration(milliseconds: 50), () async { return await MessageReactionUtils.clickOnSticker(widget.message, sticker); }); } - initTools( - {BuildContext? context, - bool isLongMessage = false, - required TUIChatSeparateViewModel model, - TUITheme? theme, - bool? isShowMoreSticker, - TapDownDetails? details, - bool? isFromWideToolTip}) { - final isUseMessageReaction = widget.message.elemType == 2 - ? false - : model.chatConfig.isUseMessageReaction; - final isDesktopScreen = - TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; + initTools({BuildContext? context, bool isLongMessage = false, required TUIChatSeparateViewModel model, TUITheme? theme, bool? isShowMoreSticker, TapDownDetails? details, bool? isFromWideToolTip}) { + final isUseMessageReaction = widget.message.elemType == 2 ? false : model.chatConfig.isUseMessageReaction; + final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; final isSelf = widget.message.isSelf ?? true; double arrowTipDistance = 30; double arrowBaseWidth = 10; @@ -843,8 +767,7 @@ class _TIMUIKItHistoryMessageListItemState TooltipDirection popupDirection = TooltipDirection.up; double? left; double? right; - SelectEmojiPanelPosition selectEmojiPanelPosition = - SelectEmojiPanelPosition.down; + SelectEmojiPanelPosition selectEmojiPanelPosition = SelectEmojiPanelPosition.down; if (context != null) { RenderBox? box = _key.currentContext?.findRenderObject() as RenderBox?; if (details != null && box != null) { @@ -867,9 +790,7 @@ class _TIMUIKItHistoryMessageListItemState Offset offset = box.localToGlobal(Offset.zero); double boxWidth = box.size.width; if (isSelf) { - right = screenWidth - - offset.dx - - ((isUseMessageReaction) ? boxWidth : (boxWidth / 1.3)); + right = screenWidth - offset.dx - ((isUseMessageReaction) ? boxWidth : (boxWidth / 1.3)); } else { left = offset.dx; } @@ -881,8 +802,7 @@ class _TIMUIKItHistoryMessageListItemState popupDirection = TooltipDirection.down; } } - arrowTipDistance = (context.size!.height / 2).roundToDouble() + - (isLongMessage ? -120 : 10); + arrowTipDistance = (context.size!.height / 2).roundToDouble() + (isLongMessage ? -120 : 10); } } @@ -903,8 +823,7 @@ class _TIMUIKItHistoryMessageListItemState showCloseButton: ShowCloseButton.none, touchThroughAreaShape: ClipAreaShape.rectangle, content: TIMUIKitMessageTooltip( - iSUseDefaultHoverBar: model.chatConfig.isUseMessageHoverBarOnDesktop && - widget.customMessageHoverBarOnDesktop == null, + iSUseDefaultHoverBar: model.chatConfig.isUseMessageHoverBarOnDesktop && widget.customMessageHoverBarOnDesktop == null, model: model, groupMemberInfo: widget.groupMemberInfo, isShowMoreSticker: isShowMoreSticker ?? false, @@ -912,8 +831,7 @@ class _TIMUIKItHistoryMessageListItemState isUseMessageReaction: isUseMessageReaction, message: widget.message, allowAtUserWhenReply: widget.allowAtUserWhenReply, - onLongPressForOthersHeadPortrait: - widget.onLongPressForOthersHeadPortrait, + onLongPressForOthersHeadPortrait: widget.onLongPressForOthersHeadPortrait, selectEmojiPanelPosition: selectEmojiPanelPosition, onCloseTooltip: () => tooltip?.close(), onSelectSticker: (int value) { @@ -924,8 +842,7 @@ class _TIMUIKItHistoryMessageListItemState ); } - Widget _getMessageItemBuilder(V2TimMessage message, int? messageStatues, - TUIChatSeparateViewModel model) { + Widget _getMessageItemBuilder(V2TimMessage message, int? messageStatues, TUIChatSeparateViewModel model) { final messageBuilder = _messageItemBuilder; return messageBuilder(widget.message, model); @@ -986,8 +903,7 @@ class _TIMUIKItHistoryMessageListItemState return isvote; } - List getMessageHoverControlBar( - TUIChatSeparateViewModel model, TUITheme theme) { + List getMessageHoverControlBar(TUIChatSeparateViewModel model, TUITheme theme) { return [ if (widget.isUseMessageReaction ?? false) MessageHoverControlItem( @@ -998,8 +914,7 @@ class _TIMUIKItHistoryMessageListItemState color: hexToColor("8f959e"), ), onClick: (details) { - _onOpenToolTip( - context, widget.message, model, theme, details, true, true); + _onOpenToolTip(context, widget.message, model, theme, details, true, true); }, ), if (widget.toolTipsConfig?.showReplyMessage ?? true) @@ -1013,21 +928,14 @@ class _TIMUIKItHistoryMessageListItemState onClick: (_) { model.repliedMessage = widget.message; final isSelf = widget.message.isSelf ?? true; - final isGroup = - TencentUtils.checkString(widget.message.groupID) != null; - final isAtWhenReply = !isSelf && - isGroup && - widget.allowAtUserWhenReply && - widget.onLongPressForOthersHeadPortrait != null; + final isGroup = TencentUtils.checkString(widget.message.groupID) != null; + final isAtWhenReply = !isSelf && isGroup && widget.allowAtUserWhenReply && widget.onLongPressForOthersHeadPortrait != null; /// If replying to a self message, do not add a at tag, only requestFocus. - widget.onLongPressForOthersHeadPortrait!( - !isAtWhenReply ? null : widget.message.sender, - !isAtWhenReply ? null : widget.message.nickName); + widget.onLongPressForOthersHeadPortrait!(!isAtWhenReply ? null : widget.message.sender, !isAtWhenReply ? null : widget.message.nickName); }, ), - if ((widget.toolTipsConfig?.showForwardMessage ?? true) && - !isVoteMessage(widget.message)) + if ((widget.toolTipsConfig?.showForwardMessage ?? true) && !isVoteMessage(widget.message)) MessageHoverControlItem( name: TIM_t("转发"), icon: Icon( @@ -1067,8 +975,7 @@ class _TIMUIKItHistoryMessageListItemState color: hexToColor("8f959e"), ), onClick: (details) { - _onOpenToolTip( - context, widget.message, model, theme, details, true, false); + _onOpenToolTip(context, widget.message, model, theme, details, true, false); }, ), ...?model.chatConfig.additionalDesktopMessageHoverBarItem @@ -1078,47 +985,24 @@ class _TIMUIKItHistoryMessageListItemState _onMsgSendFailIconTap(V2TimMessage message, TUIChatSeparateViewModel model) { final convID = model.conversationID; final convType = model.conversationType; - MessageUtils.handleMessageError( - model.reSendFailMessage( - message: message, - convType: convType ?? ConvType.c2c, - convID: convID), - context); + MessageUtils.handleMessageError(model.reSendFailMessage(message: message, convType: convType ?? ConvType.c2c, convID: convID), context); } - Widget renderHoverTipAndReadStatus( - TUIChatSeparateViewModel model, - bool isSelf, - V2TimMessage message, - bool isPeerRead, - TUITheme theme, - bool isDownloadWaiting) { - final isDesktopScreen = - TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; - final customHoverBar = widget.customMessageHoverBarOnDesktop != null - ? widget.customMessageHoverBarOnDesktop!(message) - : null; + Widget renderHoverTipAndReadStatus(TUIChatSeparateViewModel model, bool isSelf, V2TimMessage message, bool isPeerRead, TUITheme theme, bool isDownloadWaiting) { + final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; + final customHoverBar = widget.customMessageHoverBarOnDesktop != null ? widget.customMessageHoverBarOnDesktop!(message) : null; - final wideHoverTipList = (model.chatConfig.isUseMessageHoverBarOnDesktop && - customHoverBar == null) - ? getMessageHoverControlBar(model, theme) - : []; + final wideHoverTipList = (model.chatConfig.isUseMessageHoverBarOnDesktop && customHoverBar == null) ? getMessageHoverControlBar(model, theme) : []; - final lastItemName = - wideHoverTipList.isNotEmpty ? wideHoverTipList.last.name : ""; + final lastItemName = wideHoverTipList.isNotEmpty ? wideHoverTipList.last.name : ""; return Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.end, children: [ - if (isDesktopScreen && - isShowWideToolTip && - customHoverBar == null && - !((widget.message.elemType == 6 && isDownloadWaiting))) + if (isDesktopScreen && isShowWideToolTip && customHoverBar == null && !((widget.message.elemType == 6 && isDownloadWaiting))) Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(4), - border: Border.all(color: hexToColor("d9dde0"), width: 1)), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(4), border: Border.all(color: hexToColor("d9dde0"), width: 1)), margin: const EdgeInsets.symmetric(horizontal: 4), child: Row( children: wideHoverTipList @@ -1150,17 +1034,12 @@ class _TIMUIKItHistoryMessageListItemState .toList(), ), ), - if (isDesktopScreen && isShowWideToolTip && customHoverBar != null) - customHoverBar, - if (!isDesktopScreen || - (model.chatConfig.isUseMessageHoverBarOnDesktop && - customHoverBar == null && - !isShowWideToolTip)) + if (isDesktopScreen && isShowWideToolTip && customHoverBar != null) customHoverBar, + if (!isDesktopScreen || (model.chatConfig.isUseMessageHoverBarOnDesktop && customHoverBar == null && !isShowWideToolTip)) const SizedBox( height: 24, ), - if (isSelf && - message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_FAIL) + if (isSelf && message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_FAIL) Container( padding: const EdgeInsets.only(bottom: 3), margin: const EdgeInsets.only(right: 6), @@ -1177,24 +1056,20 @@ class _TIMUIKItHistoryMessageListItemState widget.showMessageReadRecipt && model.conversationType == ConvType.c2c && isSelf && - (message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_SUCC || - message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING)) + (message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_SUCC || message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING)) Container( padding: const EdgeInsets.only(bottom: 3), margin: const EdgeInsets.only(right: 6), child: Text( isPeerRead ? TIM_t("已读") : TIM_t("未读"), - style: TextStyle( - color: theme.chatMessageItemUnreadStatusTextColor, - fontSize: 12), + style: TextStyle(color: theme.chatMessageItemUnreadStatusTextColor, fontSize: 12), ), ), if (model.chatConfig.isShowGroupReadingStatus && model.chatConfig.isShowGroupMessageReadReceipt && model.conversationType == ConvType.group && isSelf && - (message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_SUCC || - message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING)) + (message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_SUCC || message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING)) TIMUIKitMessageReadReceipt( messageItem: widget.message, onTapAvatar: widget.onTapForOthersPortrait, @@ -1205,16 +1080,13 @@ class _TIMUIKItHistoryMessageListItemState @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { - final TUIChatSeparateViewModel model = - Provider.of(context); - final isDownloadWaiting = context.select( - (value) => value.isWaiting(widget.message.msgID ?? "")); + final TUIChatSeparateViewModel model = Provider.of(context); + final isDownloadWaiting = context.select((value) => value.isWaiting(widget.message.msgID ?? "")); final TUITheme theme = value.theme; final message = widget.message; final msgType = message.elemType; final isSelf = message.isSelf ?? true; - final isGroupTipsMsg = - msgType == MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS; + final isGroupTipsMsg = msgType == MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS; final revokeStatus = isRevokeMessage(message, model); final isRevokedMsg = revokeStatus.$1; @@ -1224,14 +1096,10 @@ class _TIMUIKItHistoryMessageListItemState final isLatestDivider = msgType == 101; final isPeerRead = message.isPeerRead ?? false; final isGroupMessage = model.conversationType == ConvType.group; - final bool isRevokeEditable = - widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT; - final isShowNickNameForSelf = - isGroupMessage && model.chatConfig.isShowSelfNameInGroup; - final isShowNickNameForOthers = - isGroupMessage && model.chatConfig.isShowOthersNameInGroup; - final isDesktopScreen = - TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; + final bool isRevokeEditable = widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT; + final isShowNickNameForSelf = isGroupMessage && model.chatConfig.isShowSelfNameInGroup; + final isShowNickNameForOthers = isGroupMessage && model.chatConfig.isShowOthersNameInGroup; + final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; if (isTimeDivider) { return _timeDividerBuilder(theme, message.timestamp ?? 0, model); } @@ -1246,8 +1114,7 @@ class _TIMUIKItHistoryMessageListItemState if (isGroupTipsMsg) { if (widget.messageItemBuilder?.groupTipsMessageItemBuilder != null) { - final groupTipsMessage = - widget.messageItemBuilder!.groupTipsMessageItemBuilder!( + final groupTipsMessage = widget.messageItemBuilder!.groupTipsMessageItemBuilder!( message, (model.jumpMsgID == message.msgID), clearJump, @@ -1258,16 +1125,8 @@ class _TIMUIKItHistoryMessageListItemState } if (isRevokedMsg) { - final displayName = isAdminRevoke - ? TIM_t("管理员") - : (isSelf - ? TIM_t("您") - : TencentUtils.checkString(message.nickName) ?? - TencentUtils.checkString(message.sender) ?? - message.userID); - return isSelf && isRevokeEditable && isRevocable(message.timestamp!) - ? _selfRevokeEditMessageBuilder(theme, model) - : _revokedMessageBuilder(theme, displayName ?? ""); + final displayName = isAdminRevoke ? TIM_t("管理员") : (isSelf ? TIM_t("您") : TencentUtils.checkString(message.nickName) ?? TencentUtils.checkString(message.sender) ?? message.userID); + return isSelf && isRevokeEditable && isRevocable(message.timestamp!) ? _selfRevokeEditMessageBuilder(theme, model) : _revokedMessageBuilder(theme, displayName ?? ""); } // 使用自定义行 @@ -1296,8 +1155,7 @@ class _TIMUIKItHistoryMessageListItemState children: [ if (model.isMultiSelect) Container( - margin: - EdgeInsets.only(right: 12, top: 10, left: isSelf ? 16 : 0), + margin: EdgeInsets.only(right: 12, top: 10, left: isSelf ? 16 : 0), child: CheckBoxButton( isChecked: model.multiSelectedMessageList.contains(message), onChanged: (value) { @@ -1312,16 +1170,14 @@ class _TIMUIKItHistoryMessageListItemState Expanded( child: MouseRegion( onEnter: (_) { - if (isDesktopScreen && - model.chatConfig.isUseMessageHoverBarOnDesktop) { + if (isDesktopScreen && model.chatConfig.isUseMessageHoverBarOnDesktop) { setState(() { isShowWideToolTip = true; }); } }, onExit: (_) { - if (isDesktopScreen && - model.chatConfig.isUseMessageHoverBarOnDesktop) { + if (isDesktopScreen && model.chatConfig.isUseMessageHoverBarOnDesktop) { Tooltip.dismissAllToolTips(); Future.delayed(const Duration(milliseconds: 100), () { setState(() { @@ -1331,12 +1187,10 @@ class _TIMUIKItHistoryMessageListItemState } }, child: GestureDetector( - behavior: - model.isMultiSelect ? HitTestBehavior.translucent : null, + behavior: model.isMultiSelect ? HitTestBehavior.translucent : null, onTap: () { if (model.isMultiSelect) { - final checked = - model.multiSelectedMessageList.contains(message); + final checked = model.multiSelectedMessageList.contains(message); if (checked) { model.removeFromMultiSelectedMessageList(message); } else { @@ -1348,79 +1202,59 @@ class _TIMUIKItHistoryMessageListItemState }, child: Row( crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: isSelf - ? MainAxisAlignment.end - : MainAxisAlignment.start, + mainAxisAlignment: isSelf ? MainAxisAlignment.end : MainAxisAlignment.start, children: [ if (!isSelf && widget.showAvatar) GestureDetector( onLongPress: () { - if (widget.onLongPressForOthersHeadPortrait != - null) {} + if (widget.onLongPressForOthersHeadPortrait != null) {} if (model.chatConfig.isAllowLongPressAvatarToAt) { - widget.onLongPressForOthersHeadPortrait!( - message.sender, message.nickName); + widget.onLongPressForOthersHeadPortrait!(message.sender, message.nickName); } }, onTapDown: isDesktopScreen ? (details) { - if (widget.onTapForOthersPortrait != null && - widget.allowAvatarTap) { - widget.onTapForOthersPortrait!( - message.sender ?? "", details); + if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) { + widget.onTapForOthersPortrait!(message.sender ?? "", details); } } : null, onTap: isDesktopScreen ? null : () { - if (widget.onTapForOthersPortrait != null && - widget.allowAvatarTap) { - widget.onTapForOthersPortrait!( - message.sender ?? "", TapDownDetails()); + if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) { + widget.onTapForOthersPortrait!(message.sender ?? "", TapDownDetails()); } }, onSecondaryTap: isDesktopScreen ? null : () { - if (widget.onSecondaryTapForOthersPortrait != - null && - widget.allowAvatarTap) { - widget.onSecondaryTapForOthersPortrait!( - message.sender ?? "", TapDownDetails()); + if (widget.onSecondaryTapForOthersPortrait != null && widget.allowAvatarTap) { + widget.onSecondaryTapForOthersPortrait!(message.sender ?? "", TapDownDetails()); } }, onSecondaryTapDown: isDesktopScreen ? (details) { - if (widget.onSecondaryTapForOthersPortrait != - null && - widget.allowAvatarTap) { - widget.onSecondaryTapForOthersPortrait!( - message.sender ?? "", details); + if (widget.onSecondaryTapForOthersPortrait != null && widget.allowAvatarTap) { + widget.onSecondaryTapForOthersPortrait!(message.sender ?? "", details); } } : null, child: widget.userAvatarBuilder != null ? widget.userAvatarBuilder!(context, message) : Container( - margin: (isSelf && isShowNickNameForSelf) || - (!isSelf && isShowNickNameForOthers) - ? const EdgeInsets.only(top: 2) - : null, + margin: (isSelf && isShowNickNameForSelf) || (!isSelf && isShowNickNameForOthers) ? const EdgeInsets.only(top: 2) : null, child: SizedBox( width: 40, height: 40, child: Avatar( faceUrl: message.faceUrl ?? "", - showName: - MessageUtils.getDisplayName(message), + showName: MessageUtils.getDisplayName(message), ), ), ), ), - if (isSelf && - widget.message.elemType == 6 && - isDownloadWaiting) + if (isSelf && widget.message.elemType == 6 && isDownloadWaiting) Container( margin: const EdgeInsets.only(top: 46, right: 10), child: LoadingAnimationWidget.threeArchedCircle( @@ -1429,102 +1263,55 @@ class _TIMUIKItHistoryMessageListItemState ), ), Container( - margin: widget.showAvatar - ? (isSelf - ? const EdgeInsets.only(right: 13) - : const EdgeInsets.only(left: 13)) - : null, + margin: widget.showAvatar ? (isSelf ? const EdgeInsets.only(right: 13) : const EdgeInsets.only(left: 13)) : null, child: Column( - crossAxisAlignment: isSelf - ? CrossAxisAlignment.end - : CrossAxisAlignment.start, + crossAxisAlignment: isSelf ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [ - if ((isSelf && isShowNickNameForSelf) || - (!isSelf && isShowNickNameForOthers)) + if ((isSelf && isShowNickNameForSelf) || (!isSelf && isShowNickNameForOthers)) widget.topRowBuilder != null ? widget.topRowBuilder!(context, message) : Container( margin: const EdgeInsets.only(bottom: 4), child: ConstrainedBox( - constraints: BoxConstraints( - maxWidth: MediaQuery.of(context) - .size - .width / - 1.7), + constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width / 1.7), child: Text( MessageUtils.getDisplayName(message), overflow: TextOverflow.ellipsis, - style: widget.themeData - ?.nickNameTextStyle ?? - TextStyle( - fontSize: 12, - color: theme.weakTextColor), + style: widget.themeData?.nickNameTextStyle ?? TextStyle(fontSize: 12, color: theme.weakTextColor), ), )), Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ - if (isSelf) - renderHoverTipAndReadStatus( - model, - isSelf, - message, - isPeerRead, - theme, - isDownloadWaiting), + if (isSelf) renderHoverTipAndReadStatus(model, isSelf, message, isPeerRead, theme, isDownloadWaiting), Container( constraints: BoxConstraints( maxWidth: constraints.maxWidth * 0.77, ), child: Builder(builder: (context) { return Column( - crossAxisAlignment: - (message.isSelf ?? true) - ? CrossAxisAlignment.end - : CrossAxisAlignment.start, + crossAxisAlignment: (message.isSelf ?? true) ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [ GestureDetector( - child: IgnorePointer( - ignoring: model.isMultiSelect, - child: _getMessageItemBuilder( - message, - message.status, - model)), + child: IgnorePointer(ignoring: model.isMultiSelect, child: _getMessageItemBuilder(message, message.status, model)), onSecondaryTapDown: (details) { if (widget.onLongPress != null) { - widget.onLongPress!( - context, message); + widget.onLongPress!(context, message); return; } if (!PlatformUtils().isMobile) { if (widget.allowLongPress) { - _onOpenToolTip( - context, - message, - model, - theme, - details, - false, - false); + _onOpenToolTip(context, message, model, theme, details, false, false); } } }, onLongPress: () { if (widget.onLongPress != null) { - widget.onLongPress!( - context, message); + widget.onLongPress!(context, message); return; } - if (widget.allowLongPress && - !isDesktopScreen) { - _onOpenToolTip( - context, - message, - model, - theme, - null, - false, - false); + if (widget.allowLongPress && !isDesktopScreen) { + _onOpenToolTip(context, message, model, theme, null, false, false); } }, onTapDown: (details) { @@ -1533,10 +1320,8 @@ class _TIMUIKItHistoryMessageListItemState ), TIMUIKitTextTranslationElem( message: message, - isUseDefaultEmoji: - widget.isUseDefaultEmoji, - customEmojiStickerList: - widget.customEmojiStickerList, + isUseDefaultEmoji: widget.isUseDefaultEmoji, + customEmojiStickerList: widget.customEmojiStickerList, isFromSelf: message.isSelf ?? true, isShowJump: false, clearJump: () {}, @@ -1545,35 +1330,16 @@ class _TIMUIKItHistoryMessageListItemState ); }), ), - if (!isSelf && - message.elemType == - MessageElemType.V2TIM_ELEM_TYPE_SOUND && - message.localCustomInt != null && - message.localCustomInt != - HistoryMessageDartConstant.read) - Padding( - padding: const EdgeInsets.only( - left: 5, bottom: 12), - child: Icon(Icons.circle, - color: theme.cautionColor, size: 10)), - if (!isSelf) - renderHoverTipAndReadStatus( - model, - isSelf, - message, - isPeerRead, - theme, - isDownloadWaiting), + if (!isSelf && message.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND && message.localCustomInt != null && message.localCustomInt != HistoryMessageDartConstant.read) + Padding(padding: const EdgeInsets.only(left: 5, bottom: 12), child: Icon(Icons.circle, color: theme.cautionColor, size: 10)), + if (!isSelf) renderHoverTipAndReadStatus(model, isSelf, message, isPeerRead, theme, isDownloadWaiting), ], ), - if (widget.bottomRowBuilder != null) - widget.bottomRowBuilder!(context, message) + if (widget.bottomRowBuilder != null) widget.bottomRowBuilder!(context, message) ], ), ), - if (!isSelf && - widget.message.elemType == 6 && - isDownloadWaiting) + if (!isSelf && widget.message.elemType == 6 && isDownloadWaiting) Container( margin: const EdgeInsets.only(top: 46, left: 10), child: LoadingAnimationWidget.threeArchedCircle( @@ -1589,16 +1355,11 @@ class _TIMUIKItHistoryMessageListItemState height: 40, child: InkWell( onTapDown: (details) { - if (widget.onTapForOthersPortrait != null && - widget.allowAvatarTap) { - widget.onTapForOthersPortrait!( - message.sender ?? "", details); + if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) { + widget.onTapForOthersPortrait!(message.sender ?? "", details); } }, - child: Avatar( - faceUrl: message.faceUrl ?? "", - showName: - MessageUtils.getDisplayName(message)), + child: Avatar(faceUrl: message.faceUrl ?? "", showName: MessageUtils.getDisplayName(message)), ), ), ], diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart index ccf7701..2036954 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart @@ -2,38 +2,40 @@ import 'dart:async'; import 'dart:convert'; -import 'package:crypto/crypto.dart'; -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:http/http.dart' as http; -import 'package:open_file/open_file.dart'; -import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; -import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart'; -import 'package:tencent_cloud_chat_uikit/ui/widgets/wide_popup.dart'; -import 'package:universal_html/html.dart' as html; import 'dart:io'; import 'dart:math'; import 'dart:typed_data'; + import 'package:cached_network_image/cached_network_image.dart'; +import 'package:collection/collection.dart'; +import 'package:crypto/crypto.dart'; +import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; +import 'package:open_file/open_file.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; import 'package:tencent_cloud_chat_uikit/ui/widgets/image_screen.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/wide_popup.dart'; import 'package:transparent_image/transparent_image.dart'; -import 'package:image_gallery_saver/image_gallery_saver.dart'; +import 'package:universal_html/html.dart' as html; import 'package:url_launcher/url_launcher.dart'; -import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart'; class TIMUIKitImageElem extends StatefulWidget { final V2TimMessage message; @@ -43,15 +45,7 @@ class TIMUIKitImageElem extends StatefulWidget { final bool? isShowMessageReaction; final TUIChatSeparateViewModel chatModel; - const TIMUIKitImageElem( - {required this.message, - this.isShowJump = false, - required this.chatModel, - this.clearJump, - this.isFrom, - Key? key, - this.isShowMessageReaction}) - : super(key: key); + const TIMUIKitImageElem({required this.message, this.isShowJump = false, required this.chatModel, this.clearJump, this.isFrom, Key? key, this.isShowMessageReaction}) : super(key: key); @override State createState() => _TIMUIKitImageElem(); @@ -71,9 +65,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { String getOriginImgURL() { // 实际拿的是原图 - V2TimImage? img = MessageUtils.getImageFromImgList( - widget.message.imageElem!.imageList, - HistoryMessageDartConstant.oriImgPrior); + V2TimImage? img = MessageUtils.getImageFromImgList(widget.message.imageElem!.imageList, HistoryMessageDartConstant.oriImgPrior); return img == null ? widget.message.imageElem!.path! : img.url!; } @@ -122,8 +114,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { final http.Response r = await http.get(Uri.parse(imageUrl)); final data = r.bodyBytes; final base64data = base64Encode(data); - final a = - html.AnchorElement(href: 'data:image/jpeg;base64,$base64data'); + final a = html.AnchorElement(href: 'data:image/jpeg;base64,$base64data'); a.download = md5.convert(utf8.encode(imageUrl)).toString(); a.click(); a.remove(); @@ -134,8 +125,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { } if (PlatformUtils().isIOS) { - if (!await Permissions.checkPermission( - context, Permission.photosAddOnly.value, theme!, false)) { + if (!await Permissions.checkPermission(context, Permission.photosAddOnly.value, theme!, false)) { return; } } else { @@ -170,8 +160,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { if (model.getMessageProgress(widget.message.msgID) == 100) { String savePath; - if (widget.message.imageElem!.path != null && - widget.message.imageElem!.path != '') { + if (widget.message.imageElem!.path != null && widget.message.imageElem!.path != '') { savePath = widget.message.imageElem!.path!; } else { savePath = model.getFileMessageLocation(widget.message.msgID); @@ -182,36 +171,21 @@ class _TIMUIKitImageElem extends TIMUIKitState { if (PlatformUtils().isIOS) { if (result['isSuccess']) { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("图片保存成功"), - infoCode: 6660406)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存成功"), infoCode: 6660406)); } else { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("图片保存失败"), - infoCode: 6660407)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存失败"), infoCode: 6660407)); } } else { if (result != null) { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("图片保存成功"), - infoCode: 6660406)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存成功"), infoCode: 6660406)); } else { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("图片保存失败"), - infoCode: 6660407)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存失败"), infoCode: 6660407)); } } return; } } else { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("the message is downloading"), - infoCode: -1)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("the message is downloading"), infoCode: -1)); } return; } @@ -220,27 +194,15 @@ class _TIMUIKitImageElem extends TIMUIKitState { if (PlatformUtils().isIOS) { if (result['isSuccess']) { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("图片保存成功"), - infoCode: 6660406)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存成功"), infoCode: 6660406)); } else { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("图片保存失败"), - infoCode: 6660407)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存失败"), infoCode: 6660407)); } } else { if (result != null) { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("图片保存成功"), - infoCode: 6660406)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存成功"), infoCode: 6660406)); } else { - onTIMCallback(TIMCallback( - type: TIMCallbackType.INFO, - infoRecommendText: TIM_t("图片保存失败"), - infoCode: 6660407)); + onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存失败"), infoCode: 6660407)); } } return; @@ -261,8 +223,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { if (!isWeb && filePath != null && File(filePath).existsSync()) { imageUrl = filePath; isAssetBool = true; - } else if (localUrl != null && - (!isWeb && File(localUrl).existsSync())) { + } else if (localUrl != null && (!isWeb && File(localUrl).existsSync())) { imageUrl = localUrl; isAssetBool = true; } else { @@ -280,19 +241,13 @@ class _TIMUIKitImageElem extends TIMUIKitState { ); } } catch (e) { - onTIMCallback(TIMCallback( - infoCode: 6660414, - infoRecommendText: TIM_t("正在下载中"), - type: TIMCallbackType.INFO)); + onTIMCallback(TIMCallback(infoCode: 6660414, infoRecommendText: TIM_t("正在下载中"), type: TIMCallbackType.INFO)); return; } } V2TimImage? getImageFromList(V2TimImageTypesEnum imgType) { - V2TimImage? img = MessageUtils.getImageFromImgList( - widget.message.imageElem!.imageList, - HistoryMessageDartConstant.imgPriorMap[imgType] ?? - HistoryMessageDartConstant.oriImgPrior); + V2TimImage? img = MessageUtils.getImageFromImgList(widget.message.imageElem!.imageList, HistoryMessageDartConstant.imgPriorMap[imgType] ?? HistoryMessageDartConstant.oriImgPrior); return img; } @@ -316,26 +271,18 @@ class _TIMUIKitImageElem extends TIMUIKitState { )); bool checkIfDownloadSuccess() { - final localUrl = TencentUtils.checkString( - model.getFileMessageLocation(widget.message.msgID)) ?? - widget.message.imageElem!.imageList![0]!.localUrl; - return TencentUtils.checkString(localUrl) != null && - File(localUrl!).existsSync(); + final localUrl = TencentUtils.checkString(model.getFileMessageLocation(widget.message.msgID)) ?? widget.message.imageElem!.imageList![0]!.localUrl; + return TencentUtils.checkString(localUrl) != null && File(localUrl!).existsSync(); } _onClickOpenImageInNewWindow() { - final localUrl = TencentUtils.checkString( - model.getFileMessageLocation(widget.message.msgID)) ?? - widget.message.imageElem!.imageList![0]!.localUrl; + final localUrl = TencentUtils.checkString(model.getFileMessageLocation(widget.message.msgID)) ?? widget.message.imageElem!.imageList![0]!.localUrl; Future.delayed(const Duration(milliseconds: 0), () async { final isDownloaded = checkIfDownloadSuccess(); if (isDownloaded) { launchDesktopFile(localUrl ?? ""); } else { - onTIMCallback(TIMCallback( - infoCode: 6660414, - infoRecommendText: TIM_t("正在下载原始资源,请稍候..."), - type: TIMCallbackType.INFO)); + onTIMCallback(TIMCallback(infoCode: 6660414, infoRecommendText: TIM_t("正在下载原始资源,请稍候..."), type: TIMCallbackType.INFO)); } }); } @@ -344,27 +291,14 @@ class _TIMUIKitImageElem extends TIMUIKitState { double? positionRadio, String? originImgUrl, }) { - final localUrl = TencentUtils.checkString( - model.getFileMessageLocation(widget.message.msgID)) ?? - widget.message.imageElem!.imageList![0]!.localUrl; + final localUrl = TencentUtils.checkString(model.getFileMessageLocation(widget.message.msgID)) ?? widget.message.imageElem!.imageList![0]!.localUrl; if (checkIfDownloadSuccess()) { - TUIKitWidePopup.showMedia( - aspectRatio: positionRadio, - context: context, - mediaLocalPath: localUrl ?? "", - onClickOrigin: () => _onClickOpenImageInNewWindow()); + TUIKitWidePopup.showMedia(aspectRatio: positionRadio, context: context, mediaLocalPath: localUrl ?? "", onClickOrigin: () => _onClickOpenImageInNewWindow()); } else { if (TencentUtils.checkString(originImgUrl) != null) { - TUIKitWidePopup.showMedia( - aspectRatio: positionRadio, - context: context, - mediaURL: originImgUrl, - onClickOrigin: () => _onClickOpenImageInNewWindow()); + TUIKitWidePopup.showMedia(aspectRatio: positionRadio, context: context, mediaURL: originImgUrl, onClickOrigin: () => _onClickOpenImageInNewWindow()); } else { - onTIMCallback(TIMCallback( - infoCode: 6660414, - infoRecommendText: TIM_t("正在下载中"), - type: TIMCallbackType.INFO)); + onTIMCallback(TIMCallback(infoCode: 6660414, infoRecommendText: TIM_t("正在下载中"), type: TIMCallbackType.INFO)); } } } @@ -431,10 +365,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { } } else { if (PlatformUtils().isDesktop) { - TUIKitWidePopup.showMedia( - mediaLocalPath: imgPath, - context: context, - onClickOrigin: () => launchDesktopFile(imgPath ?? "")); + TUIKitWidePopup.showMedia(mediaLocalPath: imgPath, context: context, onClickOrigin: () => launchDesktopFile(imgPath ?? "")); } else { Navigator.of(context).push( PageRouteBuilder( @@ -452,107 +383,56 @@ class _TIMUIKitImageElem extends TIMUIKitState { } } - Widget _renderAllImage( - {dynamic heroTag, - required TUITheme theme, - bool isNetworkImage = false, - String? webPath, - V2TimImage? originalImg, - V2TimImage? smallImg, - String? smallLocalPath, - String? originLocalPath}) { + Widget _renderAllImage({dynamic heroTag, required TUITheme theme, bool isNetworkImage = false, String? webPath, V2TimImage? originalImg, V2TimImage? smallImg, String? smallLocalPath, String? originLocalPath}) { Widget getImageWidget() { if (isNetworkImage) { return Hero( tag: heroTag, child: PlatformUtils().isWeb - ? Image.network(webPath ?? smallImg?.url ?? originalImg!.url!, - fit: BoxFit.contain) + ? Image.network(webPath ?? smallImg?.url ?? originalImg!.url!, fit: BoxFit.contain) : CachedNetworkImage( alignment: Alignment.topCenter, imageUrl: webPath ?? smallImg?.url ?? originalImg!.url!, - errorWidget: (context, error, stackTrace) => - errorPage(theme), + errorWidget: (context, error, stackTrace) => errorPage(theme), fit: BoxFit.contain, cacheKey: smallImg?.uuid ?? originalImg!.uuid, - placeholder: (context, url) => - Image(image: MemoryImage(kTransparentImage)), + placeholder: (context, url) => Image(image: MemoryImage(kTransparentImage)), fadeInDuration: const Duration(milliseconds: 0), )); } else { - final imgPath = (TencentUtils.checkString(smallLocalPath) != null - ? smallLocalPath - : originLocalPath)!; - return Hero( - tag: heroTag, - child: Image.file(File(imgPath), fit: BoxFit.contain)); + final imgPath = (TencentUtils.checkString(smallLocalPath) != null ? smallLocalPath : originLocalPath)!; + return Hero(tag: heroTag, child: Image.file(File(imgPath), fit: BoxFit.contain)); } } return GestureDetector( onTap: () => onClickImage( - theme: theme, - heroTag: heroTag, - isNetworkImage: isNetworkImage, - imgUrl: webPath ?? smallImg?.url ?? originalImg?.url ?? "", - imgPath: (TencentUtils.checkString(originLocalPath) != null - ? originLocalPath - : smallLocalPath) ?? - ""), + theme: theme, heroTag: heroTag, isNetworkImage: isNetworkImage, imgUrl: webPath ?? smallImg?.url ?? originalImg?.url ?? "", imgPath: (TencentUtils.checkString(originLocalPath) != null ? originLocalPath : smallLocalPath) ?? ""), child: getImageWidget(), ); } void initImages() async { - if (!PlatformUtils().isWeb && - TencentUtils.checkString(widget.message.msgID) != null) { - if (widget.message.imageElem?.imageList == null || - widget.message.imageElem!.imageList!.isEmpty) { - final response = await _messageService.getMessageOnlineUrl( - msgID: widget.message.msgID!); + final zeroImageLocal = TencentUtils.checkString(widget.message.imageElem?.imageList?.firstWhereOrNull((element) => element?.type == 0)?.localUrl); + final oneImageLocal = TencentUtils.checkString(widget.message.imageElem?.imageList?.firstWhereOrNull((element) => element?.type == 1)?.localUrl); + final twoImageLocal = TencentUtils.checkString(widget.message.imageElem?.imageList?.firstWhereOrNull((element) => element?.type == 2)?.localUrl); + + if (!PlatformUtils().isWeb && TencentUtils.checkString(widget.message.msgID) != null) { + if ((widget.message.imageElem?.imageList) == null || widget.message.imageElem!.imageList!.isEmpty) { + final response = await _messageService.getMessageOnlineUrl(msgID: widget.message.msgID!); final elem = response.data; if (elem != null && elem.imageElem != null) { widget.message.imageElem = elem.imageElem; } } - if (widget.message.imageElem?.imageList == null || - widget.message.imageElem!.imageList!.isEmpty || - TencentUtils.checkString( - widget.message.imageElem?.imageList?[0]?.localUrl) == - null || - !File(widget.message.imageElem!.imageList![0]!.localUrl!) - .existsSync()) { - _messageService.downloadMessage( - msgID: widget.message.msgID!, - messageType: 3, - imageType: 0, - isSnapshot: false); + if (oneImageLocal == null || !File(oneImageLocal).existsSync()) { + _messageService.downloadMessage(msgID: widget.message.msgID!, messageType: 3, imageType: 1, isSnapshot: false); } - if (widget.message.imageElem?.imageList == null || - widget.message.imageElem!.imageList!.length < 2 && - TencentUtils.checkString( - widget.message.imageElem?.imageList?[1]?.localUrl) == - null || - !File(widget.message.imageElem!.imageList![1]!.localUrl!) - .existsSync()) { - _messageService.downloadMessage( - msgID: widget.message.msgID!, - messageType: 3, - imageType: 1, - isSnapshot: false); + if (twoImageLocal == null || !File(twoImageLocal).existsSync()) { + _messageService.downloadMessage(msgID: widget.message.msgID!, messageType: 3, imageType: 2, isSnapshot: false); } - if (widget.message.imageElem?.imageList != null || - widget.message.imageElem!.imageList!.length < 3 || - TencentUtils.checkString( - widget.message.imageElem?.imageList?[2]?.localUrl) == - null || - !File(widget.message.imageElem!.imageList![2]!.localUrl!) - .existsSync()) { - _messageService.downloadMessage( - msgID: widget.message.msgID!, - messageType: 3, - imageType: 2, - isSnapshot: false); + if (zeroImageLocal == null || !File(zeroImageLocal).existsSync()) { + _messageService.downloadMessage(msgID: widget.message.msgID!, messageType: 3, imageType: 0, isSnapshot: false); } } } @@ -566,33 +446,18 @@ class _TIMUIKitImageElem extends TIMUIKitState { bool isNeedShowLocalPath() { final current = (DateTime.now().millisecondsSinceEpoch / 1000).ceil(); final timeStamp = widget.message.timestamp ?? current; - return (widget.message.isSelf ?? true) && - (isSent || current - timeStamp < 300); + return (widget.message.isSelf ?? true) && (isSent || current - timeStamp < 300); } - Widget? _renderImage(dynamic heroTag, TUITheme theme, - {V2TimImage? originalImg, V2TimImage? smallImg}) { + Widget? _renderImage(dynamic heroTag, TUITheme theme, {V2TimImage? originalImg, V2TimImage? smallImg}) { if (PlatformUtils().isWeb && widget.message.imageElem!.path != null) { // Displaying on Web only - return _renderAllImage( - heroTag: heroTag, - theme: theme, - isNetworkImage: true, - smallImg: smallImg, - originalImg: originalImg, - webPath: widget.message.imageElem!.path); + return _renderAllImage(heroTag: heroTag, theme: theme, isNetworkImage: true, smallImg: smallImg, originalImg: originalImg, webPath: widget.message.imageElem!.path); } try { - if ((isNeedShowLocalPath() && - widget.message.imageElem!.path != null && - widget.message.imageElem!.path!.isNotEmpty && - File(widget.message.imageElem!.path!).existsSync())) { - return _renderAllImage( - smallLocalPath: widget.message.imageElem!.path!, - heroTag: heroTag, - theme: theme, - originLocalPath: widget.message.imageElem!.path!); + if ((isNeedShowLocalPath() && widget.message.imageElem!.path != null && widget.message.imageElem!.path!.isNotEmpty && File(widget.message.imageElem!.path!).existsSync())) { + return _renderAllImage(smallLocalPath: widget.message.imageElem!.path!, heroTag: heroTag, theme: theme, originLocalPath: widget.message.imageElem!.path!); } } catch (e) { // ignore: avoid_print @@ -600,35 +465,17 @@ class _TIMUIKitImageElem extends TIMUIKitState { } try { - if ((TencentUtils.checkString(smallImg?.localUrl) != null && - File((smallImg?.localUrl!)!).existsSync()) || - (TencentUtils.checkString(originalImg?.localUrl) != null && - File((originalImg?.localUrl!)!).existsSync())) { - return _renderAllImage( - smallLocalPath: smallImg?.localUrl ?? "", - heroTag: heroTag, - theme: theme, - originLocalPath: originalImg?.localUrl); + if ((TencentUtils.checkString(smallImg?.localUrl) != null && File((smallImg?.localUrl!)!).existsSync()) || (TencentUtils.checkString(originalImg?.localUrl) != null && File((originalImg?.localUrl!)!).existsSync())) { + return _renderAllImage(smallLocalPath: smallImg?.localUrl ?? "", heroTag: heroTag, theme: theme, originLocalPath: originalImg?.localUrl); } } catch (e) { // ignore: avoid_print outputLogger.i(e); - return _renderAllImage( - heroTag: heroTag, - theme: theme, - isNetworkImage: true, - smallImg: smallImg, - originalImg: originalImg); + return _renderAllImage(heroTag: heroTag, theme: theme, isNetworkImage: true, smallImg: smallImg, originalImg: originalImg); } - if ((smallImg?.url ?? originalImg?.url) != null && - (smallImg?.url ?? originalImg?.url)!.isNotEmpty) { - return _renderAllImage( - heroTag: heroTag, - theme: theme, - isNetworkImage: true, - smallImg: smallImg, - originalImg: originalImg); + if ((smallImg?.url ?? originalImg?.url) != null && (smallImg?.url ?? originalImg?.url)!.isNotEmpty) { + return _renderAllImage(heroTag: heroTag, theme: theme, isNetworkImage: true, smallImg: smallImg, originalImg: originalImg); } return errorDisplay(context, theme); @@ -640,10 +487,8 @@ class _TIMUIKitImageElem extends TIMUIKitState { if (widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING) { isSent = true; } - final isDesktopScreen = - TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; - final heroTag = - "${widget.message.msgID ?? widget.message.id ?? widget.message.timestamp ?? DateTime.now().millisecondsSinceEpoch}${widget.isFrom}"; + final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop; + final heroTag = "${widget.message.msgID ?? widget.message.id ?? widget.message.timestamp ?? DateTime.now().millisecondsSinceEpoch}${widget.isFrom}"; V2TimImage? originalImg = getImageFromList(V2TimImageTypesEnum.original); V2TimImage? smallImg = getImageFromList(V2TimImageTypesEnum.small); @@ -654,16 +499,14 @@ class _TIMUIKitImageElem extends TIMUIKitState { isFromSelf: widget.message.isSelf ?? true, isShowMessageReaction: widget.isShowMessageReaction ?? true, message: widget.message, - child: LayoutBuilder( - builder: (BuildContext context, BoxConstraints constraints) { + child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { return ConstrainedBox( constraints: BoxConstraints( maxWidth: constraints.maxWidth * (isDesktopScreen ? 0.4 : 0.5), minWidth: 64, maxHeight: 256, ), - child: _renderImage(heroTag, theme, - originalImg: originalImg, smallImg: smallImg), + child: _renderImage(heroTag, theme, originalImg: originalImg, smallImg: smallImg), ); })); } @@ -672,9 +515,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { class ImageClipper extends CustomClipper { @override RRect getClip(Size size) { - return RRect.fromRectAndRadius( - Rect.fromLTWH(0, 0, size.width, min(size.height, 256)), - const Radius.circular(5)); + return RRect.fromRectAndRadius(Rect.fromLTWH(0, 0, size.width, min(size.height, 256)), const Radius.circular(5)); } @override diff --git a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart index 4a74fac..952860a 100644 --- a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart +++ b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/chat_life_cycle.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.dart'; @@ -24,10 +25,10 @@ import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/at_member_panel.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_send_file.dart'; + import 'TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; import 'TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; import 'TIMUIKItMessageList/tim_uikit_history_message_list_container.dart'; -import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitChat extends StatefulWidget { int startTime = 0; @@ -53,8 +54,7 @@ class TIMUIKitChat extends StatefulWidget { final ConvType? conversationType; /// use for customize avatar - final Widget Function(BuildContext context, V2TimMessage message)? - userAvatarBuilder; + final Widget Function(BuildContext context, V2TimMessage message)? userAvatarBuilder; /// Use for show conversation name. /// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually. @@ -64,11 +64,9 @@ class TIMUIKitChat extends StatefulWidget { final void Function(String userID, TapDownDetails tapDetails)? onTapAvatar; /// Avatar and name in message reaction secondary tap callback. - final void Function(String userID, TapDownDetails tapDetails)? - onSecondaryTapAvatar; + final void Function(String userID, TapDownDetails tapDetails)? onSecondaryTapAvatar; - @Deprecated( - "Nickname will not shows in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") + @Deprecated("Nickname will not shows in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") /// Should show the nick name. final bool showNickName; @@ -80,12 +78,10 @@ class TIMUIKitChat extends StatefulWidget { final bool showTotalUnReadCount; /// Deprecated("Please use [extraTipsActionItemBuilder] instead") - final Widget? Function(V2TimMessage message, Function() closeTooltip, - [Key? key, BuildContext? context])? exteraTipsActionItemBuilder; + final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])? exteraTipsActionItemBuilder; /// The builder for extra tips action. - final Widget? Function(V2TimMessage message, Function() closeTooltip, - [Key? key, BuildContext? context])? extraTipsActionItemBuilder; + final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])? extraTipsActionItemBuilder; /// The text of draft shows in TextField. /// [Recommend]: You can specify this field with the draftText from V2TimConversation. @@ -176,13 +172,10 @@ class TIMUIKitChat extends StatefulWidget { this.conversationShowName, this.abstractMessageBuilder, this.onTapAvatar, - @Deprecated( - "Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") - this.showNickName = false, + @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") this.showNickName = false, this.showTotalUnReadCount = false, this.messageItemBuilder, - @Deprecated("Please use [extraTipsActionItemBuilder] instead") - this.exteraTipsActionItemBuilder, + @Deprecated("Please use [extraTipsActionItemBuilder] instead") this.exteraTipsActionItemBuilder, this.extraTipsActionItemBuilder, this.draftText, this.textFieldHintText, @@ -216,30 +209,24 @@ class TIMUIKitChat extends StatefulWidget { class _TUIChatState extends TIMUIKitState { TUIChatSeparateViewModel model = TUIChatSeparateViewModel(); - final TUISelfInfoViewModel selfInfoViewModel = - serviceLocator(); + final TUISelfInfoViewModel selfInfoViewModel = serviceLocator(); final TUIThemeViewModel themeViewModel = serviceLocator(); - final TUIConversationViewModel conversationViewModel = - serviceLocator(); - TIMUIKitInputTextFieldController textFieldController = - TIMUIKitInputTextFieldController(); + final TUIConversationViewModel conversationViewModel = serviceLocator(); + TIMUIKitInputTextFieldController textFieldController = TIMUIKitInputTextFieldController(); bool isInit = false; - final TUIChatGlobalModel chatGlobalModel = - serviceLocator(); + final TUIChatGlobalModel chatGlobalModel = serviceLocator(); bool _dragging = false; final GlobalKey alignKey = GlobalKey(); final GlobalKey listContainerKey = GlobalKey(); late AutoScrollController autoController = AutoScrollController( - viewportBoundaryGetter: () => - Rect.fromLTRB(0, 0, 0, MediaQuery.of(context).padding.bottom), + viewportBoundaryGetter: () => Rect.fromLTRB(0, 0, 0, MediaQuery.of(context).padding.bottom), axis: Axis.vertical, ); late AutoScrollController atMemberPanelScroll = AutoScrollController( - viewportBoundaryGetter: () => - Rect.fromLTRB(0, 0, 0, MediaQuery.of(context).padding.bottom), + viewportBoundaryGetter: () => Rect.fromLTRB(0, 0, 0, MediaQuery.of(context).padding.bottom), axis: Axis.vertical, ); @@ -304,11 +291,7 @@ class _TUIChatState extends TIMUIKitState { updateDraft() async { final isTopic = widget.conversation.conversationID.contains("@TOPIC#"); if (isTopic) { - final topicInfoList = await TencentImSDKPlugin.v2TIMManager - .getGroupManager() - .getTopicInfoList( - groupID: widget.groupID!, - topicIDList: [widget.conversation.conversationID]); + final topicInfoList = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getTopicInfoList(groupID: widget.groupID!, topicIDList: [widget.conversation.conversationID]); final topicInfo = topicInfoList.data?.first.topicInfo; final draftText = topicInfo?.draftText; if (TencentUtils.checkString(draftText) != null) { @@ -333,8 +316,7 @@ class _TUIChatState extends TIMUIKitState { crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - TIM_t_para("{{option1}} 条入群请求", "$option1 条入群请求")( - option1: option1), + TIM_t_para("{{option1}} 条入群请求", "$option1 条入群请求")(option1: option1), style: const TextStyle( fontSize: 12, ), @@ -353,17 +335,11 @@ class _TUIChatState extends TIMUIKitState { } String _getTitle() { - return TencentUtils.checkString(widget.conversationShowName) ?? - widget.conversation.showName ?? - "Chat"; + return TencentUtils.checkString(widget.conversationShowName) ?? widget.conversation.showName ?? "Chat"; } String _getConvID() { - return TencentUtils.checkString(widget.conversationID) ?? - (widget.conversation.type == 1 - ? widget.conversation.userID - : widget.conversation.groupID) ?? - ""; + return TencentUtils.checkString(widget.conversationID) ?? (widget.conversation.type == 1 ? widget.conversation.userID : widget.conversation.groupID) ?? ""; } ConvType _getConvType() { @@ -373,8 +349,7 @@ class _TUIChatState extends TIMUIKitState { @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { final TUITheme theme = value.theme; - final closePanel = - OptimizeUtils.throttle((_) => textFieldController.hideAllPanel(), 60); + final closePanel = OptimizeUtils.throttle((_) => textFieldController.hideAllPanel(), 60); final isBuild = isInit; isInit = true; @@ -393,35 +368,29 @@ class _TUIChatState extends TIMUIKitState { Provider(create: (_) => widget.config), ], builder: (context, model, w) { - final TUIChatGlobalModel chatGlobalModel = - Provider.of(context, listen: true); + final TUIChatGlobalModel chatGlobalModel = Provider.of(context, listen: true); widget.controller?.model = model; widget.controller?.textFieldController = textFieldController; widget.controller?.scrollController = autoController; List filteredApplicationList = []; - if (widget.conversationType == ConvType.group && - widget.onDealWithGroupApplication != null) { - filteredApplicationList = - chatGlobalModel.groupApplicationList.where((item) { - return (item.groupID == widget.conversationID) && - item.handleStatus == 0; + if (widget.conversationType == ConvType.group && widget.onDealWithGroupApplication != null) { + filteredApplicationList = chatGlobalModel.groupApplicationList.where((item) { + return (item.groupID == widget.conversationID) && item.handleStatus == 0; }).toList(); } final selfUserID = selfInfoViewModel.loginInfo?.userID; - final TUIGroupListenerModel groupListenerModel = - Provider.of(context, listen: true); + final TUIGroupListenerModel groupListenerModel = Provider.of(context, listen: true); final NeedUpdate? needUpdate = groupListenerModel.needUpdate; - if (needUpdate != null && - needUpdate.groupID == widget.conversationID) { + if (needUpdate != null && needUpdate.groupID == widget.conversationID) { groupListenerModel.needUpdate = null; switch (needUpdate.updateType) { case UpdateType.groupInfo: model.loadGroupInfo(_getConvID()); break; case UpdateType.memberList: - if(widget.groupMemberList == null){ + if (widget.groupMemberList == null) { model.loadGroupMemberList(groupID: _getConvID()); } model.loadGroupInfo(_getConvID()); @@ -432,24 +401,13 @@ class _TUIChatState extends TIMUIKitState { } List customImageSmallPngEmojiPackages = []; - if (widget.config?.stickerPanelConfig?.customStickerPackages != - null && - widget.config!.stickerPanelConfig!.customStickerPackages - .isNotEmpty) { - customImageSmallPngEmojiPackages = widget - .config!.stickerPanelConfig!.customStickerPackages - .where((element) => element.isEmoji == true) - .map((e) { - return CustomEmojiFaceData( - name: e.name, - isEmoji: true, - icon: e.menuItem.url ?? "", - list: e.stickerList.map((e) => e.url ?? "").toList()); + if (widget.config?.stickerPanelConfig?.customStickerPackages != null && widget.config!.stickerPanelConfig!.customStickerPackages.isNotEmpty) { + customImageSmallPngEmojiPackages = widget.config!.stickerPanelConfig!.customStickerPackages.where((element) => element.isEmoji == true).map((e) { + return CustomEmojiFaceData(name: e.name, isEmoji: true, icon: e.menuItem.url ?? "", list: e.stickerList.map((e) => e.url ?? "").toList()); }).toList(); } if (customImageSmallPngEmojiPackages.isEmpty) { - customImageSmallPngEmojiPackages - .addAll(widget.customEmojiStickerList); + customImageSmallPngEmojiPackages.addAll(widget.customEmojiStickerList); } return GestureDetector( @@ -464,21 +422,14 @@ class _TUIChatState extends TIMUIKitState { config: widget.appBarConfig, conversationShowName: _getTitle(), conversationID: _getConvID(), - showC2cMessageEditStatus: - widget.config?.showC2cMessageEditStatus ?? true, + showC2cMessageEditStatus: widget.config?.showC2cMessageEditStatus ?? true, ) : null, body: DropTarget( onDragDone: (detail) { setState(() { _dragging = false; - sendFileWithConfirmation( - files: detail.files, - conversation: widget.conversation, - conversationType: _getConvType(), - model: model, - theme: theme, - context: context); + sendFileWithConfirmation(files: detail.files, conversation: widget.conversation, conversationType: _getConvType(), model: model, theme: theme, context: context); }); }, onDragEntered: (detail) { @@ -497,9 +448,7 @@ class _TUIChatState extends TIMUIKitState { crossAxisAlignment: CrossAxisAlignment.start, children: [ if (widget.customAppBar != null) widget.customAppBar!, - if (filteredApplicationList.isNotEmpty) - _renderJoinGroupApplication( - filteredApplicationList.length, theme), + if (filteredApplicationList.isNotEmpty) _renderJoinGroupApplication(filteredApplicationList.length, theme), if (widget.topFixWidget != null) widget.topFixWidget!, Expanded( child: Container( @@ -510,45 +459,31 @@ class _TUIChatState extends TIMUIKitState { child: Listener( onPointerMove: closePanel, child: TIMUIKitHistoryMessageListContainer( - customMessageHoverBarOnDesktop: - widget.customMessageHoverBarOnDesktop, + customMessageHoverBarOnDesktop: widget.customMessageHoverBarOnDesktop, conversation: widget.conversation, - groupMemberInfo: model.groupMemberList - ?.firstWhere( - (element) => - element?.userID == selfUserID, - orElse: () => null), + groupMemberInfo: model.groupMemberList?.firstWhere((element) => element?.userID == selfUserID, orElse: () => null), textFieldController: textFieldController, - customEmojiStickerList: - widget.customEmojiStickerList, - isUseDefaultEmoji: - widget.config!.isUseDefaultEmoji, + customEmojiStickerList: widget.customEmojiStickerList, + isUseDefaultEmoji: widget.config!.isUseDefaultEmoji, key: listContainerKey, isAllowScroll: true, userAvatarBuilder: widget.userAvatarBuilder, toolTipsConfig: widget.toolTipsConfig, groupAtInfoList: widget.groupAtInfoList, tongueItemBuilder: widget.tongueItemBuilder, - onLongPressForOthersHeadPortrait: - (String? userId, String? nickName) { - textFieldController.longPressToAt( - nickName, userId); + onLongPressForOthersHeadPortrait: (String? userId, String? nickName) { + textFieldController.longPressToAt(nickName, userId); }, - mainHistoryListConfig: - widget.mainHistoryListConfig, + mainHistoryListConfig: widget.mainHistoryListConfig, initFindingMsg: widget.initFindingMsg, - extraTipsActionItemBuilder: - widget.extraTipsActionItemBuilder ?? - widget.exteraTipsActionItemBuilder, + extraTipsActionItemBuilder: widget.extraTipsActionItemBuilder ?? widget.exteraTipsActionItemBuilder, conversationType: _getConvType(), scrollController: autoController, - onSecondaryTapAvatar: - widget.onSecondaryTapAvatar, + onSecondaryTapAvatar: widget.onSecondaryTapAvatar, onTapAvatar: widget.onTapAvatar, // ignore: deprecated_member_use_from_same_package showNickName: widget.showNickName, - messageItemBuilder: - widget.messageItemBuilder, + messageItemBuilder: widget.messageItemBuilder, conversationID: _getConvID(), ), )), @@ -565,47 +500,26 @@ class _TUIChatState extends TIMUIKitState { : TIMUIKitInputTextField( chatConfig: widget.config, groupID: widget.groupID, - atMemberPanelScroll: - atMemberPanelScroll, - groupType: - widget.conversation.groupType, - currentConversation: - widget.conversation, + atMemberPanelScroll: atMemberPanelScroll, + groupType: widget.conversation.groupType, + currentConversation: widget.conversation, model: model, controller: textFieldController, - customEmojiStickerList: - customImageSmallPngEmojiPackages, - isUseDefaultEmoji: - widget.config!.isUseDefaultEmoji, - customStickerPanel: - widget.customStickerPanel, - morePanelConfig: - widget.morePanelConfig, + customEmojiStickerList: customImageSmallPngEmojiPackages, + isUseDefaultEmoji: widget.config!.isUseDefaultEmoji, + customStickerPanel: widget.customStickerPanel, + morePanelConfig: widget.morePanelConfig, scrollController: autoController, conversationID: _getConvID(), conversationType: _getConvType(), - initText: TencentUtils.checkString( - widget.draftText) ?? + initText: TencentUtils.checkString(widget.draftText) ?? (PlatformUtils().isWeb - ? TencentUtils.checkString( - conversationViewModel - .getWebDraft( - conversationID: widget - .conversation - .conversationID)) - : TencentUtils.checkString( - widget.conversation - .draftText)), + ? TencentUtils.checkString(conversationViewModel.getWebDraft(conversationID: widget.conversation.conversationID)) + : TencentUtils.checkString(widget.conversation.draftText)), hintText: widget.textFieldHintText, - showMorePanel: widget.config - ?.isAllowShowMorePanel ?? - true, - showSendAudio: widget.config - ?.isAllowSoundMessage ?? - true, - showSendEmoji: widget - .config?.isAllowEmojiPanel ?? - true, + showMorePanel: widget.config?.isAllowShowMorePanel ?? true, + showSendAudio: widget.config?.isAllowSoundMessage ?? true, + showSendEmoji: widget.config?.isAllowEmojiPanel ?? true, )); }, selector: (c, model) { @@ -620,8 +534,7 @@ class _TUIChatState extends TIMUIKitState { ), AtMemberPanel( atMemberPanelScroll: atMemberPanelScroll, - onSelectMember: (member) => - textFieldController.handleAtMember(member), + onSelectMember: (member) => textFieldController.handleAtMember(member), ) ], ), @@ -634,14 +547,12 @@ class _TUIChatState extends TIMUIKitState { class TIMUIKitChatProviderScope extends StatelessWidget { final TUIChatGlobalModel globalModel = serviceLocator(); TUIChatSeparateViewModel? model; - final TUIGroupListenerModel groupListenerModel = - serviceLocator(); + final TUIGroupListenerModel groupListenerModel = serviceLocator(); final TUIThemeViewModel themeViewModel = serviceLocator(); final Widget? child; /// You could get the model from here, and transfer it to other widget from TUIKit. - final Widget Function(BuildContext, TUIChatSeparateViewModel, Widget?) - builder; + final Widget Function(BuildContext, TUIChatSeparateViewModel, Widget?) builder; final List? providers; /// `TIMUIKitChatController` needs to be provided if you use it outside. @@ -712,16 +623,13 @@ class TIMUIKitChatProviderScope extends StatelessWidget { preGroupMemberList: groupMemberList, groupID: groupID, ); - model?.showC2cMessageEditStatus = (conversationType == ConvType.c2c - ? config?.showC2cMessageEditStatus ?? true - : false); + model?.showC2cMessageEditStatus = (conversationType == ConvType.c2c ? config?.showC2cMessageEditStatus ?? true : false); loadData(); } loadData() { // if (model!.haveMoreData) { - model!.loadChatRecord( - count: kIsWeb ? 15 : HistoryMessageDartConstant.getCount); + model!.loadChatRecord(count: kIsWeb ? 15 : HistoryMessageDartConstant.getCount); // } } diff --git a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart index c5912d2..4e9a79d 100644 --- a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart @@ -245,7 +245,7 @@ class _TIMUIKitConversationState extends TIMUIKitState { }, backgroundColor: theme.conversationItemSliderClearBgColor ?? CommonColor.primaryColor, foregroundColor: theme.conversationItemSliderTextColor, - label: TIM_t("清除聊天"), + label: TIM_t("清除"), spacing: 0, autoClose: true, ), diff --git a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart index 0ae5faf..bc7ddb9 100644 --- a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart +++ b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart @@ -4,12 +4,10 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/common_utils.dart'; - import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; - -import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class TIMUIKitLastMsg extends StatefulWidget { @@ -18,13 +16,7 @@ class TIMUIKitLastMsg extends StatefulWidget { final BuildContext context; final double fontSize; - const TIMUIKitLastMsg( - {Key? key, - this.lastMsg, - required this.groupAtInfoList, - required this.context, - this.fontSize = 14.0}) - : super(key: key); + const TIMUIKitLastMsg({Key? key, this.lastMsg, required this.groupAtInfoList, required this.context, this.fontSize = 14.0}) : super(key: key); @override State createState() => _TIMUIKitLastMsgState(); @@ -42,8 +34,7 @@ class _TIMUIKitLastMsgState extends TIMUIKitState { @override void didUpdateWidget(covariant TIMUIKitLastMsg oldWidget) { super.didUpdateWidget(oldWidget); - if ((oldWidget.lastMsg?.msgID != widget.lastMsg?.msgID) || - (oldWidget.lastMsg?.id != widget.lastMsg?.id)) { + if ((oldWidget.lastMsg?.msgID != widget.lastMsg?.msgID) || (oldWidget.lastMsg?.id != widget.lastMsg?.id) || (oldWidget.lastMsg?.status != widget.lastMsg?.status)) { _getMsgElem(); } } @@ -72,15 +63,10 @@ class _TIMUIKitLastMsgState extends TIMUIKitState { final isAdminRevoke = revokeStatus.$2; if (isRevokedMessage) { final isSelf = widget.lastMsg!.isSelf ?? true; - final option1 = isAdminRevoke - ? TIM_t("管理员") - : (isSelf - ? TIM_t("您") - : widget.lastMsg!.nickName ?? widget.lastMsg?.sender); + final option1 = isAdminRevoke ? TIM_t("管理员") : (isSelf ? TIM_t("您") : widget.lastMsg!.nickName ?? widget.lastMsg?.sender); if (mounted) { setState(() { - groupTipsAbstractText = TIM_t_para( - "{{option1}}撤回了一条消息", "$option1撤回了一条消息")(option1: option1); + groupTipsAbstractText = TIM_t_para("{{option1}}撤回了一条消息", "$option1撤回了一条消息")(option1: option1); }); } } else { @@ -93,8 +79,7 @@ class _TIMUIKitLastMsgState extends TIMUIKitState { } } - Future _getLastMsgShowText( - V2TimMessage? message, BuildContext context) async { + Future _getLastMsgShowText(V2TimMessage? message, BuildContext context) async { final msgType = message!.elemType; switch (msgType) { case MessageElemType.V2TIM_ELEM_TYPE_CUSTOM: @@ -107,11 +92,9 @@ class _TIMUIKitLastMsgState extends TIMUIKitState { return TIM_t("[表情]"); case MessageElemType.V2TIM_ELEM_TYPE_FILE: final option1 = widget.lastMsg!.fileElem!.fileName; - return TIM_t_para("[文件] {{option1}}", "[文件] $option1")( - option1: option1); + return TIM_t_para("[文件] {{option1}}", "[文件] $option1")(option1: option1); case MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS: - return await MessageUtils.groupTipsMessageAbstract( - widget.lastMsg!.groupTipsElem!, []); + return await MessageUtils.groupTipsMessageAbstract(widget.lastMsg!.groupTipsElem!, []); case MessageElemType.V2TIM_ELEM_TYPE_IMAGE: return TIM_t("[图片]"); case MessageElemType.V2TIM_ELEM_TYPE_VIDEO: @@ -159,19 +142,16 @@ class _TIMUIKitLastMsgState extends TIMUIKitState { margin: const EdgeInsets.only(right: 2), child: icon, ), - if (widget.groupAtInfoList.isNotEmpty) - Text(_getAtMessage(), - style: TextStyle( - color: theme.cautionColor, fontSize: widget.fontSize)), - if(TencentUtils.checkString(groupTipsAbstractText) != null)Expanded( - child: Text( - groupTipsAbstractText, - softWrap: true, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - height: 1, color: theme.weakTextColor, fontSize: widget.fontSize), - )), + if (widget.groupAtInfoList.isNotEmpty) Text(_getAtMessage(), style: TextStyle(color: theme.cautionColor, fontSize: widget.fontSize)), + if (TencentUtils.checkString(groupTipsAbstractText) != null) + Expanded( + child: Text( + groupTipsAbstractText, + softWrap: true, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle(height: 1, color: theme.weakTextColor, fontSize: widget.fontSize), + )), ]); } } diff --git a/pubspec.lock b/pubspec.lock index fb57864..4fe8ebf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -851,6 +851,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + mime_type: + dependency: transitive + description: + name: mime_type + sha256: "2ad6e67d3d2de9ac0f8ef5352d998fd103cb21351ae8c02fb0c78b079b37d275" + url: "https://pub.dev" + source: hosted + version: "1.0.0" nested: dependency: transitive description: @@ -935,50 +943,50 @@ packages: dependency: "direct main" description: name: path_provider - sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.1.2" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" url: "https://pub.dev" source: hosted - version: "2.0.27" + version: "2.2.2" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3" + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.2" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57 + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 url: "https://pub.dev" source: hosted - version: "2.1.11" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" + sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" url: "https://pub.dev" source: hosted - version: "2.0.6" + version: "2.1.1" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96" + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.2.1" permission_handler: dependency: "direct main" description: @@ -1292,42 +1300,34 @@ packages: dependency: transitive description: name: tencent_chat_i18n_tool - sha256: "0ee982e814bedd0aea4751b972901c6cfcfb224cfeb8e13ae02e43c0b8a58bbc" + sha256: d1e68f06a0cf8372eebd9a6b0f01f57e68b569cf909756ee6bdbbe625688debd url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" tencent_cloud_chat_sdk: dependency: transitive description: name: tencent_cloud_chat_sdk - sha256: "7dbb354209eca61f2c816c8ba7c1b1282dd5fb7e090135186bde56c89d976110" + sha256: a78f1f20dc9ebe40aee1bbb47da097780028434d77e97774fbe733debb21e18e url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "7.7.5296" tencent_cloud_uikit_core: dependency: "direct main" description: name: tencent_cloud_uikit_core - sha256: "5624654c52a230111cbcfcaa648b9c6e3ee877018f16bc5eec076b639655a191" + sha256: "7ddb2c034e5f832261ba268957e282b7c2e738acb1d21aa40c62dad4eaa433ea" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.5.2" tencent_im_base: dependency: "direct main" description: name: tencent_im_base - sha256: "52a99ef1c9dbd219530cf6f96a9891ab316f789b9b2c11634e0002d0a0f0f63c" + sha256: "035d97d24bebb87654700d4afc8227de8721a259ef5d0195f3207cb0eb0cdc7a" url: "https://pub.dev" source: hosted - version: "3.1.0" - tencent_im_sdk_plugin_platform_interface: - dependency: transitive - description: - name: tencent_im_sdk_plugin_platform_interface - sha256: "3b39f19fcc2306c7cbdabe79e532bbb7feade695630f5373308a52703ece482c" - url: "https://pub.dev" - source: hosted - version: "1.0.0" + version: "3.3.775296" tencent_keyboard_visibility: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index e087925..e0d092c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: tencent_cloud_chat_uikit description: A powerful chat UI component library and business logic for Tencent Cloud Chat, creating seamless in-app chat modules for delightful user experiences. -version: 2.5.0 +version: 2.5.1 homepage: https://trtc.io/products/chat?utm_source=gfs&utm_medium=link&utm_campaign=%E6%B8%A0%E9%81%93&_channel_track_key=k6WgfCKn repository: https://github.com/TencentCloud/chat-uikit-flutter documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html @@ -62,7 +62,7 @@ dependencies: open_file: ^3.3.2 tencent_keyboard_visibility: ^1.0.1 tim_ui_kit_sticker_plugin: ^3.1.0 - tencent_im_base: ^3.1.0 + tencent_im_base: ^3.3.775296 fc_native_video_thumbnail: any path: ^1.8.1 tencent_cloud_uikit_core: ^1.2.1