diff --git a/CHANGELOG.md b/CHANGELOG.md index bce7ea9..d1b630d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ +## 1.7.0 + +* Addition: Support for quickly navigating to the first unread message in a group chat with more than 20 new unread messages, using the dynamic tongue located in the top right corner of the screen. This feature allows for swift movement through the messages, regardless of their quantity. +* Addition: Customize the border radius for all avatars is now supported. You can set the default avatar border radius using `defaultAvatarBorderRadius` in `TIMUIKitConfig`. +* Optimization: The delete button on the sticker sending panel has been improved for better usability. +* Optimization: Some English labels on the screen have been updated to better reflect local expressions. +* Fix: An issue causing errors when sending a large number of stickers has been resolved. +* Fix: Some errors that were occurring in the sticker panel have been addressed. + ## 1.6.2 -* Optimize: Remove `fluttertoast`. +* Optimization: Remove `fluttertoast`. * Fix: An issue that caused errors when sending files without extensions. ## 1.6.1 @@ -10,24 +19,23 @@ ## 1.6.0 -* Add: `scrollToConversation` on `TIMUIKitConversationController`. You can now easily navigate to a specific conversation in the conversation list and move to the next unread conversation by double-clicking the tab bar, [refers to our sample app](https://github.com/TencentCloud/chat-demo-flutter/blob/main/lib/src/conversation.dart). -* Optimize: The performance of the history message list while scrolling over a large distance. +* Addition: `scrollToConversation` on `TIMUIKitConversationController`. You can now easily navigate to a specific conversation in the conversation list and move to the next unread conversation by double-clicking the tab bar, [refers to our sample app](https://github.com/TencentCloud/chat-demo-flutter/blob/main/lib/src/conversation.dart). +* Optimization: The performance of the history message list while scrolling over a large distance. ## 1.5.0+1 -* Fix: Video message oversize. +* Fix: An issue with video messages being oversize. ## 1.5.0 -* Add: New configuration `defaultAvatarAssetPath` on global `TIMUIKitConfig`, aiming to define the default avatar. -* Add: Supports Flutter 3.7.0. +* Addition: New configuration `defaultAvatarAssetPath` on global `TIMUIKitConfig` to define the default avatar. +* Addition: Supports Flutter 3.7.0. * Fix: `chatBgColor` configuration. ## 1.4.0 -* Add: Text translation. Long press the text messages and choose `Translate`. This function can be turn off by `showTranslation` from `ToolTipsConfig`. -* Optimize: The long press pop-up location. -* Optimize: Keyboard pop-up event. +* Addition: Text translation. Long press the text messages to choose `Translate`, which can be turned off by `showTranslation` from `ToolTipsConfig`. +* Optimization: The long press pop-up location and keyboard pop-up event. ## 1.3.2 @@ -35,129 +43,128 @@ ## 1.3.1 -* Optimize: Improve performance. +* Optimization: Improve performance. ## 1.3.0 -* Fix: Group tips not shows the nickname or remarks when transferring group owner. -* Optimize: Remove the confirmation pop-up before opening the file. +* Fix: A bug where group tips were not showing the nickname or remarks when transferring group owner. +* Optimization: Remove the confirmation pop-up before opening the file. ## 1.2.0 -* Fix: The issue of input area not showing, when switching from recording to keyboard, on `TIMUIKitChat`. -* Fix: Only the first receiver can receive the merged multiple forward messages. -* Optimize: `MessageItemBuilder` can now be used for shows on the merger message screen. +* Fix: An issue where the input area was not showing when switching from recording to keyboard on `TIMUIKitChat`. +* Fix: An issue where only the first receiver could receive the merged multiple forward messages. +* Optimization: `MessageItemBuilder` can now be used for shows on the merger message screen. ## 1.1.0 And 1.1.0+1 -* Add: Supports two new languages, Japanese and Korean. -* Add: Supports adding new other languages, apart from our default ones, including English, Chinese(Simplified and Traditional), Japanese and Korean, or modifying the translations, refers to [this documentation](https://www.tencentcloud.com/document/product/1047/52154?from=pub). -* Add: Sticker plug-in has been embedded in TUIKit by default. Now we support three types of stickers, Unicode Emoji, small image emoji and big image stickers, the usage has been optimized, refers to [this documentation](https://www.tencentcloud.com/document/product/1047/52227?from=pub). -* Optimize: Themes, more customization. -* Optimize: The animation of the input area, keyboard, sticker panel and the more panel. -* Optimize: Emoji, both Unicode and small images, can be inserted to any position in text messages. -* Optimize: Avatar in profile can be previewed with a large image. -* Optimize: UserID in profile can be copied. -* Optimize: Several UI details, including `TIMUIKitAddFriend`, `TIMUIKitAddGroup`, `TIMUIKitGroupProfile` and `TIMUIKitProfile`. -* Optimize: `TIMUIKitGroupProfile` and `TIMUIKitProfile` can update automatically after `ID` changed. -* Optimize: New loading animation when downloading the image/video on `TIMUIKitGroupChat`. -* Fix: Some bugs. +* Addition: We have added support for two new languages - Japanese and Korean. +* Addition: You can now add other languages apart from our default ones, such as English, Chinese (Simplified and Traditional), Japanese, and Korean. You can also modify the translations using the instructions provided in [this documentation](https://www.tencentcloud.com/document/product/1047/52154?from=pub). +* Addition: The sticker plug-in is now embedded in TUIKit by default. We support three types of stickers - Unicode Emoji, small image emoji, and big image stickers. You can refer to [this documentation](https://www.tencentcloud.com/document/product/1047/52227?from=pub) for optimized usage. +* Optimization: Themes are now more customizable. +* Optimization: We have optimized the animation of the input area, keyboard, sticker panel, and more panel. +* Optimization: You can now insert both Unicode and small image emojis at any position in text messages. +* Optimization: You can now preview profile avatars with a large image by clicking it, and copy UserIDs in profile. +* Optimization: We have improved several UI details, including `TIMUIKitAddFriend`, `TIMUIKitAddGroup`, `TIMUIKitGroupProfile`, and `TIMUIKitProfile`. +* Optimization: `TIMUIKitGroupProfile` and `TIMUIKitProfile` can now update automatically after the `ID` is changed. +* Optimization: We have added a new loading animation when downloading images or videos on `TIMUIKitGroupChat`. +* Fix: We have fixed some bugs. ## 1.0.1 -* Modify: Remove `groupTRTCTipsItemBuilder` from `MessageItemBuilder`, please use `customMessageItemBuilder` instead. -* Modify: Remove default rendering for calling messages, you can choose to use the default widgets, `CallMessageItem` and `GroupCallMessageItem`, from our call plugin `tim_ui_kit_calling_plugin` directly. Refer to the [Demo](https://github.com/TencentCloud/chat-demo-flutter/tree/main/lib/utils/custom_message/custom_message_element.dart). +* Modification: Remove `groupTRTCTipsItemBuilder` from `MessageItemBuilder`, please use `customMessageItemBuilder` instead. +* Modification: Remove default rendering for calling messages, you can choose to use the default widgets, `CallMessageItem` and `GroupCallMessageItem`, from our call plugin `tim_ui_kit_calling_plugin` directly. Refer to the [Demo](https://github.com/TencentCloud/chat-demo-flutter/tree/main/lib/utils/custom_message/custom_message_element.dart). ## 1.0.0 -* Add: Support adding Flutter module to Native APP, for details, please refer to [this documentation](https://www.tencentcloud.com/document/product/1047/51456?from=pub) to implement. -* Add: Customize sticker and Emoji for text messages. For details, please refer to [this documentation](https://cloud.tencent.com/document/product/269/80882) to modify. -* Optimize: The loading duration for history message list, especially with lots of media and file messages. -* Optimize: More panel area supports scroll. -* Optimize: Load latest messages when scrolling back to bottom with more fluency. -* Modify: It is required to provide the call record widget to `messageItemBuilder` => `customMessageItemBuilder` of `TIMUIKitChat`. You can choose to use the default widget, `CallMessageItem`, from our call plugin `tim_ui_kit_calling_plugin` directly. Refer to the [Demo](https://github.com/TencentCloud/chat-demo-flutter/tree/main/lib/utils/custom_message/custom_message_element.dart). -* Fix: The amount of photos from the album on Android. -* Fix: The out of bounds for long text in the group profile info card. -* Fix: Some bugs. +* Addition: We have added support for adding Flutter module to Native APP. For implementation details, please refer to [this documentation](https://www.tencentcloud.com/document/product/1047/51456?from=pub). +* Addition: You can now customize stickers and emojis for text messages. For more information, please refer to [this documentation](https://cloud.tencent.com/document/product/269/80882). +* Optimization: We have improved the loading duration for history message lists, especially those with lots of media and file messages. +* Optimization: More panel area now supports scrolling. +* Optimization: We have made loading latest messages when scrolling back to the bottom smoother. +* Modification: It is now required to provide the call record widget to `messageItemBuilder` => `customMessageItemBuilder` of `TIMUIKitChat`. You can choose to use the default widget, `CallMessageItem`, from our call plugin `tim_ui_kit_calling_plugin` directly. Please refer to the [Demo](https://github.com/TencentCloud/chat-demo-flutter/tree/main/lib/utils/custom_message/custom_message_element.dart). +* Fix: We have fixed the issue with the number of photos from the album on Android. +* Fix: We have fixed the issue with long text going out of bounds in the group profile info card. +* Fix: We have resolved some bugs. -> **Please pay more attention to the second line and sixth line**, that some modifications are required, otherwise the module of sticker / emoji / call records will not work. +> **Please note that modifications are required for the second and sixth lines**. Otherwise, the modules for stickers/emojis/call records will not work. ## 0.1.8 -* Optimize: File batch downloading queue, allow click multiple file messages once. -* Optimize: Group list widgets can be updated automatically. -* Optimize: Camera capture supports relatively lower performance devices, adjusting resolution automatically. -* Optimize: Supports customize the color and text style of the app bar, especially on TIMUIKitChat widget. -* Fix: Friend remark or nickname can not show on group tips. -* Fix: Crash on video playing. +* Optimization: File batch downloading queue now allows clicking on multiple file messages at once. +* Optimization: Group list widgets are now automatically updated. +* Optimization: Camera capture now supports relatively lower performance devices and adjusts resolution automatically. +* Optimization: Supports customization of the color and text style of the app bar, especially on TIMUIKitChat widget. +* Fix: Friend remark or nickname no longer fails to show on group tips. +* Fix: Resolved a crash when playing videos. * Fix: Several bugs. ## 0.1.7 -* Add: Big and RAW images supported, especially for those captured from the latest version of iOS and iPhone 14 Pro series, compress and format before sending automatically. -* Optimize: Performance and stability, especially for history message list and launching. -* Optimize: Makes initializing the `TIMUIKitChat` an idempotent operation. -* Optimize: Load latest messages when scrolling back to bottom. -* Optimize: Supports Flutter both 2.x and 3.x series. -* Fix: The issue of select photos permission. +* Addition: Big and RAW images are now supported, especially for those captured from the latest version of iOS and iPhone 14 Pro series, with automatic compression and formatting before sending. +* Optimization: Improved performance and stability, especially for the history message list and launching. +* Optimization: Initializing the `TIMUIKitChat` is now an idempotent operation. +* Optimization: Loads the latest messages when scrolling back to the bottom. +* Optimization: Supports Flutter both 2.x and 3.x series. +* Fix: Resolved an issue with select photos permission. * Fix: Several bugs. ## 0.1.5 -* Add: Web supports. Now, you could implement TUIKit on iOS/Android/Web platforms. -* Add: Disk storage checking after log in, and controls in `config` of `init`. -* Add: `timeDividerConfig`, `notificationAndroidSound`, `isSupportMarkdownForTextMessage` and `onTapLink` to `TIMUIKitChatConfig`. -* Remove: The default Emoji list, due to the copyright issues. You can provide your own sticker list to the panel by [tim_ui_kit_sticker_plugin](https://pub.dev/packages/tim_ui_kit_sticker_plugin). -* Optimize: You could now choose to disable Markdown parsing for text messages. -* Optimize: You could now choose to disable the shows for @ message in conversation list. -* Optimize: You could now return `null` for `notificationExt`/`notificationBody` in `TIMUIKitChatConfig` and `messageRowBuilder` in `MessageItemBuilder`, to use default value up to your needs in the specific case, means you can control whether or not using customized setting based on the provided situation, without the necessary to re-define the same logic as the TUIKit in your code. -* Optimize: Supports multiple lines for text messages. -* Optimize: Rebuild and improve the experience of `TIMUIKitChat`. While, `TIMUIKitChatController` needs to be specified to `controller` here, like how we shows in [Demo](https://github.com/TencentCloud/tc-chat-demo-flutter/lib/src/chat.dart). +* Addition: Web support is now available, allowing TUIKit to be implemented on iOS/Android/Web platforms. +* Addition: Disk storage checking is now performed after login, with controls available in `config` of `init`. +* Addition: `timeDividerConfig`, `notificationAndroidSound`, `isSupportMarkdownForTextMessage`, and `onTapLink` are added to `TIMUIKitChatConfig`. +* Remove: The default Emoji list has been removed due to copyright issues. You can provide your own sticker list to the panel using [tim_ui_kit_sticker_plugin](https://pub.dev/packages/tim_ui_kit_sticker_plugin). +* Optimization: You can now choose to disable Markdown parsing for text messages. +* Optimization: You can now choose to disable shows for @ messages in the conversation list. +* Optimization: You can now return `null` for `notificationExt`/`notificationBody` in `TIMUIKitChatConfig` and `messageRowBuilder` in `MessageItemBuilder` to use default values based on your needs in a specific case. This means you can control whether to use customized settings based on the provided situation, without having to redefine the same logic as TUIKit in your code. +* Optimization: Supports multiple lines for text messages. +* Optimization: Rebuilt and improved the experience of `TIMUIKitChat`. Note that `TIMUIKitChatController` needs to be specified to `controller`, as shown in the [Demo](https://github.com/TencentCloud/tc-chat-demo-flutter/lib/src/chat.dart). * Fix: Several bugs. ## 0.1.3 -* Add: User inputting status. -* Add: Message reactions, with sticker. -* Add: User online status. +* Addition: User inputting status is now available. +* Addition: Message reactions with emoji/stickers are now available. +* Addition: User online status is now available. ## 0.1.2 -* Upgrade: flutter_record_plugin_plus to 0.0.4. +* Upgrade: flutter_record_plugin_plus to version 0.0.4. ## 0.1.1 -* Add: Lifecycle hooks for the main widgets, referring to the parameter description for details. -* Add: Mute status display for group chat on the chat page. -* Add: URL enrichment for text messages. -* Add: Callback for global information (Flutter Error, Tips for Reminds, API Error) and you can display toast up to your needs. -* Optimize: Image preview displaying. -* Rebuild: TUIKitGroupProfile and TUIKitProfile, simplified usage. +* Addition: Lifecycle hooks are now available for the main widgets, referring to the parameter description for details. +* Addition: Mute status display is now available for group chat on the chat page. +* Addition: URL enrichment is now available for text messages. +* Addition: Callback for global information (Flutter Error, Tips for Reminds, API Error), and you can display toast as needed. +* Optimization: Image preview display has been improved. +* Rebuilt: TUIKitGroupProfile and TUIKitProfile have been simplified for ease of use. ## 0.1.0-bugfix -* Upgrade: Tencent IM SDK. +* Upgrade: Tencent IM Native SDK. ## 0.1.0 -* Add: Atomization widgets for TIMUIKitChat. -* Add: Updating the UI when the message has been modified. -* Add: The application page for joining the group. -* Add: `updateMessage` API, users can refresh the view after modifying the local message. -* Add: Support for Traditional Chinese. -* Add: Customization for conversation list item. +* Addition: Atomization widgets for TIMUIKitChat. +* Addition: Updating the UI when the message has been modified. +* Addition: The application page for joining the group. +* Addition: `updateMessage` API, users can refresh the view after modifying the local message. +* Addition: Support for Traditional Chinese. +* Addition: Customization for conversation list item. ## 0.0.9 -* Add: Offline push along with [tim_ui_kit_push_plugin](https://pub.dev/packages/tim_ui_kit_push_plugin). +* Addition: Offline push along with [tim_ui_kit_push_plugin](https://pub.dev/packages/tim_ui_kit_push_plugin). * Adapt: Flutter 3.0.0. -* Optimize: Local preview of multimedia files. +* Optimization: Local preview of multimedia files. ## 0.0.8 -* Add: Group read receipt module. -* Add: Little tongue on the message list. -* Add: Examples. +* Addition: Group read receipt module. +* Addition: Little tongue on the message list. +* Addition: Examples. * Fix: Several bugs. ## 0.0.7 @@ -166,37 +173,37 @@ ## 0.0.6 -* Add: New `sendMessage` method to the controller `TIMUIKitChatController` for TIMUIKitChat. -* Add: Configuration for TIMUIKitChat, which can control the functions for TIMUIKitChat components. +* Addition: New `sendMessage` method to the controller `TIMUIKitChatController` for TIMUIKitChat. +* Addition: Configuration for TIMUIKitChat, which can control the functions for TIMUIKitChat components. * Support: Customized for more panel customized ability to TIMUIKitChat. -* Optimize: User authorization standardized. +* Optimization: User authorization standardized. ## 0.0.5 -* Add: Several new customized configs, includes, appBarConfig, morePanelConfig, and removed appBarActions config. -* Optimize: Image preview displaying. +* Addition: Several new customized configs, includes, appBarConfig, morePanelConfig, and removed appBarActions config. +* Optimization: Image preview displaying. * Upgrade: Tencent IM SDK. * Fix: The issue of conversation item duplication for TIMUIKitConversation. ## 0.0.4 -* Optimize: TIMUIKitChat, especially for media files selector. -* Optimize: Previewing of image messages, video messages. -* Optimize: Theme color. -* Optimize: UI for search components. +* Optimization: TIMUIKitChat, especially for media files selector. +* Optimization: Previewing of image messages, video messages. +* Optimization: Theme color. +* Optimization: UI for search components. * Upgrade: Tencent IM SDK. ## 0.0.3 -* Add: TIMUIKitSearch and TIMUIKitSearchMsgDetail, supports searching both in conversation and globally. -* Add: TIMUIKitAddFriend. -* Add: TIMUIKitAddGroup. -* Add: Theme style configuration. -* Optimize: Internationalization. +* Addition: TIMUIKitSearch and TIMUIKitSearchMsgDetail, supports searching both in conversation and globally. +* Addition: TIMUIKitAddFriend. +* Addition: TIMUIKitAddGroup. +* Addition: Theme style configuration. +* Optimization: Internationalization. ## 0.0.2 -* Optimize: TIMUIKitChat. +* Optimization: TIMUIKitChat. * Fix: Bugs on Internationalization. ## 0.0.1 diff --git a/doc/社交场景最佳实践.md b/doc/社交场景最佳实践.md index c0b41db..118f1d6 100644 --- a/doc/社交场景最佳实践.md +++ b/doc/社交场景最佳实践.md @@ -50,7 +50,7 @@ | 会话列表用户在线状态 | 通讯录用户在线状态 | |---------|---------| -| | | +| | | #### 获取用户在线状态 @@ -72,7 +72,7 @@ | 通讯录 | |---------| -| | +| | ### 好友关系 @@ -147,10 +147,6 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群 群组资料是指单个群组维度的属性,包括群名称、简介、公告、群主等,以及群组维度自定义字段。 -| Meeting 群 | Public 群 | -|---------|---------| -| | | - ##### 获取群资料 在客户端上,可调用 [`getGroupsInfo`](https://comm.qq.com/im/doc/flutter/zh/SDKAPI/Api/V2TIMGroupManager/getGroupsInfo.html) 方法,获取特定群组资料详情。 @@ -187,7 +183,7 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群 | 会话列表 | |---------| -| | +| | #### 获取会话列表 @@ -217,9 +213,9 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群 置顶状态会存储在服务器,切换终端设备后,置顶状态会同步到新设备上。 -| 置顶的会话,注意最上方 “Yifan” 会话 | +| 置顶的会话,注意最上方第一条 | |---------| -| | +| | 置顶会话,通过客户端 [`pinConversation`](https://comm.qq.com/im/doc/flutter/zh/SDKAPI/Api/V2TIMConversationManager/pinConversation.html) 即可。 @@ -260,7 +256,7 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群 | 引用回复文本 | [表情回应](https://cloud.tencent.com/document/product/269/85906) | |---------|---------| -| | | +| | | #### 引用回复文本 @@ -296,7 +292,7 @@ Public群,类似QQ群。创建后群主可指定群管理员,用户搜索群 | 发送表情回应 [TUIKit](https://cloud.tencent.com/document/product/269/85906) | 表情回应详情 [TUIKit](https://cloud.tencent.com/document/product/269/85906) | |---------|---------| -| | | +| | | **下面介绍实施细节:** @@ -346,7 +342,7 @@ messageReactions: [ | 全局搜索 | 会话内搜索 | |---------|---------| -| | | +| | | ### 转发消息 @@ -354,7 +350,7 @@ messageReactions: [ | 合并转发消息 | 合并消息详细内容 | |---------|---------| -| | | +| | | 逐条转发消息,需要先在客户端调用 [`createForwardMessage`](https://comm.qq.com/im/doc/flutter/zh/SDKAPI/Api/V2TIMMessageManager/createForwardMessage.html) 方法创建一条和原消息内容完全一样的转发消息,再调用 [`sendMessage`](https://comm.qq.com/im/doc/flutter/zh/SDKAPI/Api/V2TIMMessageManager/sendMessage.html) 方法把转发消息发送出去。 @@ -378,7 +374,7 @@ messageReactions: [ | 消息翻译 | |---------| -| | +| | 对于文本类型的消息,您可在客户端上调用 [`translateText`](https://im.sdk.qcloud.com/doc/zh-cn/classcom_1_1tencent_1_1imsdk_1_1v2_1_1V2TIMMessageManager.html#a1e1806c27bc7b76a3b816492ed9cbe5c) 方法,将待翻译文本列表和目标语言传至我们的服务端。原语言可由您自行判断,也可由我们判断。 @@ -392,7 +388,7 @@ messageReactions: [ | 单聊,[TUIKit](https://cloud.tencent.com/document/product/269/85905)中以文字承载 | 群聊,[TUIKit](https://cloud.tencent.com/document/product/269/85905)中以圆圈承载 | |---------|---------| -| | | +| | | 是否启用此功能,可根据您的社交业务需求决定。 @@ -413,7 +409,7 @@ messageReactions: [ | 已读 群成员 | 未读 群成员 | |---------|---------| -| | | +| | | ### 群内@消息 @@ -423,7 +419,7 @@ messageReactions: [ | 监听 @ 字符选择群成员 | 编辑群 @ 消息发送 | 收到群 @ 消息 | |---------|---------|---------| -| | | | +| | | | >? 图一:在聊天界面监听到输入框输入 "@" 字符后,可跳转到群成员选择界面,选择需要 @ 的群成员。 >图二:在群成员选择完成后,重新返回聊天界面,继续编辑群 @ 消息发送。 @@ -443,7 +439,7 @@ messageReactions: [ | 电脑端 | 手机移动端 | |---------|---------| -| | | +| | | ### 更多丰富的消息形态 @@ -504,7 +500,7 @@ messageReactions: [ 特别是对于社交场景下的用户们,他们一定有很多想法想要交流与诉说。 -因此,我们也强烈推荐您,再继承我们的音视频通话能力,一步到位,完成一对一或多人群组的音频/视频通话,并且支持离线唤起能力。 +因此,我们也强烈推荐您,再集成我们的音视频通话能力,一步到位,完成一对一或多人群组的音频/视频通话,并且支持离线唤起能力。 [详情可查看此文档](https://cloud.tencent.com/document/product/269/84296)。 diff --git a/example/lib/TIMUIKitChatExample.dart b/example/lib/TIMUIKitChatExample.dart index 770beab..baeed5c 100644 --- a/example/lib/TIMUIKitChatExample.dart +++ b/example/lib/TIMUIKitChatExample.dart @@ -38,14 +38,12 @@ class TIMUIKitChatExample extends StatelessWidget { GroupReceiptAllowType.public ], ), - conversationID: _getConversationID() ?? "10040818", - // Please fill in here according to the actual cleaning - conversationShowName: selectedConversation?.showName ?? - selectedConversation?.userID ?? - selectedConversation?.groupID ?? - "Test Chat", - // Please fill in here according to the actual cleaning - conversationType: ConvType.values[selectedConversation?.type ?? 1], + conversation: selectedConversation ?? + V2TimConversation( + conversationID: "c2c_10040818", + userID: "10040818", + showName: "Test Chat", + type: 1), appBarConfig: AppBar( actions: [ IconButton( diff --git a/example/pubspec.lock b/example/pubspec.lock index 7fe82be..8f6a22c 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201" + sha256: "569ddca58d535e601dd1584afa117710abc999d036c0cd2c51777fb257df78e8" url: "https://pub.dev" source: hosted - version: "52.0.0" + version: "53.0.0" adaptive_action_sheet: dependency: transitive description: @@ -21,10 +21,10 @@ packages: dependency: transitive description: name: analyzer - sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4 + sha256: "10927c4b7c7c88b1adbca278c3d5531db92e2f4b4abf04e2919a800af965f3f5" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" archive: dependency: "direct main" description: @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: args - sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611" + sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" async: dependency: transitive description: @@ -245,10 +245,10 @@ packages: dependency: transitive description: name: extended_image - sha256: "5854d0d05ee0c687d1852af9db05f15cfe058520fa56f417075705c5bce965d4" + sha256: a6b738d9b8d5513be72c545cc3e9c5c451fbee77c8db3cbec7c32ae85b82fb93 url: "https://pub.dev" source: hosted - version: "6.4.0" + version: "6.4.1" extended_image_library: dependency: transitive description: @@ -359,10 +359,10 @@ packages: dependency: transitive description: name: flutter_markdown - sha256: "818cf6c28377ba2c91ed283c96fd712e9c175dd2d2488eb7fc93b6afb9ad2e08" + sha256: "7b25c10de1fea883f3c4f9b8389506b54053cd00807beab69fd65c8653a2711f" url: "https://pub.dev" source: hosted - version: "0.6.13+1" + version: "0.6.14" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -481,18 +481,18 @@ packages: dependency: transitive description: name: image_picker - sha256: f98d76672d309c8b7030c323b3394669e122d52b307d2bbd8d06bd70f5b2aabe + sha256: d39cc12402dab8365fe5b5370e64694ae0223d675c36b15ff0490b7cc3d32551 url: "https://pub.dev" source: hosted - version: "0.8.6+1" + version: "0.8.6+2" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: b1cbfec0f5aef427a18eb573f5445af8c9c568626bf3388553e40c263d3f7368 + sha256: "385f12ee9c7288575572c7873a332016ec45ebd092e1c2f6bd421b4a9ad21f1d" url: "https://pub.dev" source: hosted - version: "0.8.5+5" + version: "0.8.5+6" image_picker_for_web: dependency: transitive description: @@ -505,10 +505,10 @@ packages: dependency: transitive description: name: image_picker_ios - sha256: "8ffb14b43713d7c43fb21299cc18181cc5b39bd3ea1cc427a085c6400fe5aa52" + sha256: "884ed71165bc01ffe1b0b7813e6fa17e1e9442da974656f99b79a292371303d6" url: "https://pub.dev" source: hosted - version: "0.8.6+7" + version: "0.8.6+8" image_picker_platform_interface: dependency: transitive description: @@ -585,10 +585,10 @@ packages: dependency: transitive description: name: markdown - sha256: c2b81e184067b41d0264d514f7cdaa2c02d38511e39d6521a1ccc238f6d7b3f2 + sha256: b3c60dee8c2af50ad0e6e90cceba98e47718a6ee0a7a6772c77846a0cc21f78b url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "7.0.1" matcher: dependency: transitive description: @@ -745,10 +745,10 @@ packages: dependency: transitive description: name: path_provider_linux - sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.1.8" path_provider_platform_interface: dependency: transitive description: @@ -1062,33 +1062,33 @@ packages: dependency: transitive description: name: tencent_cloud_chat_sdk - sha256: "3b3349dec74f60cff9cd85cb865c41d60afb472b451f5124f2e8318df037cc7f" + sha256: "32b7e40c5a1682b3ee85daa73504af3d0d4e60a93472b279591e769b15b4861c" url: "https://pub.dev" source: hosted - version: "5.0.8" + version: "5.0.9" tencent_cloud_chat_uikit: dependency: "direct main" description: path: ".." relative: true source: path - version: "1.6.2" + version: "1.7.0" tencent_extended_text: dependency: transitive description: name: tencent_extended_text - sha256: "27a2f7ee58ada480e295102471f1733a7402178a239d0c80a7aa33a134c641ef" + sha256: cf0d283c01a9e63f75666d8b5b1cabd463e18e51802bf1d093d7a65bd369b3d4 url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.2+1" tencent_extended_text_field: dependency: transitive description: name: tencent_extended_text_field - sha256: d311c240983dbf78e31b58f91e425920a40d6564942813e692a3419bf5c9deb0 + sha256: daa10f3775bfac1cc841b34275c2746ced7764f3b77222a93edb4c13bad1209b url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.1+2" tencent_extended_text_library: dependency: transitive description: @@ -1101,26 +1101,26 @@ packages: dependency: transitive description: name: tencent_im_base - sha256: bbd2d70c82b018ce86c421f0b4eb02f650456d0bbd7ea5558110139c7b04c4b4 + sha256: b5917ff0bae7c31d52f54932349fc400d3752719a1c5a2f0209258f85c7a6c07 url: "https://pub.dev" source: hosted - version: "1.0.21" + version: "1.0.26" tencent_im_sdk_plugin_platform_interface: dependency: transitive description: name: tencent_im_sdk_plugin_platform_interface - sha256: "5dd3e957e7db00e3d785978b4b163e36376b9c5a481ed4f5d746876f1e408b62" + sha256: "7aff6a8495eae3efc3aed1ed944bab7a0ce7eb1035d09b3f3d7974bcb3d8b137" url: "https://pub.dev" source: hosted - version: "0.3.11" + version: "0.3.12" tencent_im_sdk_plugin_web: dependency: "direct main" description: name: tencent_im_sdk_plugin_web - sha256: "4bc10531473c83f1d5c644a8aee88149464b80908c965ea7c4f402a2e99336d6" + sha256: d83a2370398948bccdc3fa4aae33840bcee62d78faa288823a02d9e0e4ab677f url: "https://pub.dev" source: hosted - version: "0.3.6" + version: "0.3.7" tencent_keyboard_visibility: dependency: transitive description: @@ -1133,10 +1133,10 @@ packages: dependency: transitive description: name: tencent_open_file - sha256: d60878fe1e5a1317607851d81ad78f395b8411418587de16cf1cd48cb662aa18 + sha256: "98cbffe55e3245a308fbf76e18c9a0f808e534c624bc1a1cc0a00bd63a418290" url: "https://pub.dev" source: hosted - version: "4.0.9" + version: "4.0.9+1" tencent_super_tooltip: dependency: transitive description: @@ -1149,10 +1149,10 @@ packages: dependency: transitive description: name: tencent_wechat_camera_picker - sha256: "8f95b435c7a12a9221f00fe4354fb9c0f9313d79cc09ddb5902b7b418185092d" + sha256: "6a6fd12d61ad2ef17273a226a165fe0b5e3ef5c7e49779de38503e4f4b6e3ef1" url: "https://pub.dev" source: hosted - version: "3.6.5+1" + version: "3.6.5+2" term_glyph: dependency: transitive description: @@ -1173,18 +1173,18 @@ packages: dependency: transitive description: name: tim_ui_kit_sticker_plugin - sha256: "5f6ec1c713718b185f920629024a4d135eead61b3735287dc80950710e2daa33" + sha256: cd5d6e2380deaf73e420602bbfe3da36c0f3253adc531f76e139efec80671175 url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" transparent_image: dependency: transitive description: name: transparent_image - sha256: e566a616922a781489f4d91cc939b1b3203b6e4a093317805f2f82f0bb0f8dec + sha256: e8991d955a2094e197ca24c645efec2faf4285772a4746126ca12875e54ca02f url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" tuple: dependency: transitive description: @@ -1205,18 +1205,18 @@ packages: dependency: transitive description: name: universal_html - sha256: "5ff50b7c14d201421cf5230ec389a0591c4deb5c817c9d7ccca3b26fe5f31e34" + sha256: b5061c64c7c863c12e46279e032976f1c274f927fb3589b52b5928dcd2d52f7c url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.0.9" universal_io: dependency: transitive description: name: universal_io - sha256: "79f78ddad839ee3aae3ec7c01eb4575faf0d5c860f8e5223bc9f9c17f7f03cef" + sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d" url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.2.0" url_launcher: dependency: transitive description: @@ -1413,10 +1413,10 @@ packages: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 url: "https://pub.dev" source: hosted - version: "0.2.0+3" + version: "1.0.0" xml: dependency: transitive description: 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 fd4582c..9584351 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 @@ -1,16 +1,11 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; - +import 'dart:math'; import 'package:flutter/cupertino.dart'; - -// ignore: unnecessary_import -import 'package:flutter/foundation.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:path_provider/path_provider.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; -import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/models/link_preview_content.dart'; -import 'package:tencent_im_base/tencent_im_base.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/chat_life_cycle.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_model_tools.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; @@ -20,9 +15,13 @@ import 'package:tencent_cloud_chat_uikit/data_services/message/message_services. import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; -import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; import 'package:uuid/uuid.dart'; +enum LoadDirection { + previous, + latest +} + class TUIChatSeparateViewModel extends ChangeNotifier { final FriendshipServices _friendshipServices = serviceLocator(); @@ -39,6 +38,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { String conversationID = ""; ConvType? conversationType; bool haveMoreData = false; + bool haveMoreLatestData = false; String _currentSelectedMsgId = ""; String _editRevokedMsg = ""; GroupReceiptAllowType? _groupType; @@ -202,18 +202,76 @@ class TUIChatSeparateViewModel extends ChangeNotifier { _isInit = true; } + Future loadListForSpecificMessage({ + required int seq, + }) async { + List msgList = []; + 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) + ); + msgList = previousResponse?.messageList ?? []; + haveMoreData = !(previousResponse?.isFinished ?? false); + + // final latestResponse = await _messageService.getHistoryMessageListWithComplete( + // count: 20, + // getType: HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_NEWER_MSG, + // userID: conversationType == ConvType.c2c ? conversationID : null, + // groupID: conversationType == ConvType.group ? conversationID : null, + // lastMsgSeq: max(seq - 1, 0) + // ); + // msgList = [...(latestResponse?.messageList.reversed ?? []), ...msgList]; + haveMoreLatestData = true; + globalModel.setMessageListPosition(conversationID, HistoryMessagePosition.notShowLatest); + + msgList = await lifeCycle?.didGetHistoricalMessageList(msgList) ?? msgList; + msgList.insert(0, V2TimMessage( + userID: '', + isSelf: false, + elemType: 101, + msgID: msgList[0].msgID, + seq: msgList[0].seq, + timestamp: 9999 + )); + globalModel.setMessageList(conversationID, msgList, + needResetNewMessageCount: false); + + if (chatConfig.isShowGroupReadingStatus && + conversationType == ConvType.group) { + _getMsgReadReceipt(msgList); + } + if (chatConfig.isReportGroupReadingStatus && + conversationType == ConvType.group) { + _setMsgReadReceipt(msgList); + } + + return haveMoreData; + } + Future loadData({ - HistoryMsgGetTypeEnum getType = - HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG, + HistoryMsgGetTypeEnum? getType, int lastMsgSeq = -1, required int count, String? lastMsgID, + LoadDirection direction = LoadDirection.previous, }) async { - haveMoreData = false; + // TODO: 这个函数写的也太复杂了,现在就先不动了,到时候2.0大版本得彻底改造下QAQ + if(direction == LoadDirection.latest){ + haveMoreLatestData = false; + }else{ + haveMoreData = false; + } final currentHistoryMsgList = globalModel.messageListMap[conversationID]; final response = await _messageService.getHistoryMessageListWithComplete( count: count, - getType: getType, + getType: getType ?? (direction == LoadDirection.previous + ? HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG + : HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_NEWER_MSG), userID: conversationType == ConvType.c2c ? conversationID : null, groupID: conversationType == ConvType.group ? conversationID : null, lastMsgID: lastMsgID, @@ -221,9 +279,19 @@ class TUIChatSeparateViewModel extends ChangeNotifier { if (response == null) { return false; } + if (lastMsgID != null && currentHistoryMsgList != null) { - final messageList = response.messageList; - final newList = [...currentHistoryMsgList, ...messageList]; + List messageList = response.messageList; + List newList = []; + + if(direction == LoadDirection.latest){ + globalModel.receivedNewMessageCount = globalModel.receivedMessageListCount + messageList.length; + messageList = messageList.reversed.toList(); + newList = [...messageList, ...currentHistoryMsgList]; + }else{ + newList = [...currentHistoryMsgList, ...messageList]; + } + final List msgList = await lifeCycle?.didGetHistoricalMessageList(newList) ?? newList; globalModel.setMessageList(conversationID, msgList, @@ -234,28 +302,26 @@ class TUIChatSeparateViewModel extends ChangeNotifier { response.messageList; if (globalModel.loadingMessage[conversationID] != null) { if (globalModel.loadingMessage[conversationID]!.isNotEmpty) { - messageList = [ - ...?globalModel.loadingMessage[conversationID], - ...messageList - ]; + if(direction == LoadDirection.previous){ + messageList = [ + ...?globalModel.loadingMessage[conversationID], + ...messageList + ]; + }else{ + messageList = messageList.reversed.toList(); + messageList = [ + ...messageList, + ...?globalModel.loadingMessage[conversationID], + ]; + } } else { globalModel.loadingMessage.remove(conversationID); } } globalModel.setMessageList(conversationID, messageList, needResetNewMessageCount: false); - // The messages in first screen } - haveMoreData = !response.isFinished; - // if (response.isEmpty || - // (!PlatformUtils().isWeb && response.length < count) || - // (PlatformUtils().isWeb && response.length < min(count, 20))) { - // haveMoreData = false; - // } else { - // haveMoreData = true; - // } - // notifyListeners(); if (chatConfig.isShowGroupReadingStatus && conversationType == ConvType.group && response.messageList.isNotEmpty) { @@ -266,6 +332,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier { response.messageList.isNotEmpty) { _setMsgReadReceipt(response.messageList); } + + if(direction == LoadDirection.latest){ + haveMoreLatestData = !response.isFinished; + if(!haveMoreLatestData){ + globalModel.setMessageListPosition(conversationID, HistoryMessagePosition.inTwoScreen); + } + }else{ + haveMoreData = !response.isFinished; + } return haveMoreData; } @@ -322,6 +397,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { markMessageAsRead() async { globalModel.unreadCountForConversation = 0; + // globalModel.receivedNewMessageCount = 0; if (conversationType == ConvType.c2c) { return _messageService.markC2CMessageAsRead(userID: conversationID); } @@ -455,7 +531,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { }) : "", ); - if (isEditStatusMessage == false) { + if (isEditStatusMessage == false && globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { globalModel.updateMessage( sendMsgRes, convID, id, convType, groupType, setInputField); } @@ -493,13 +569,16 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(conversationID, currentHistoryMsgList); - notifyListeners(); + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { + currentHistoryMsgList = [ + lifeCycleMsg ?? messageInfoWithSender, + ...currentHistoryMsgList + ]; + globalModel.setMessageList(conversationID, currentHistoryMsgList); + notifyListeners(); + } + return _sendMessage( convID: convID, id: textATMessageInfo.id as String, @@ -528,13 +607,16 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(conversationID, currentHistoryMsgList); - notifyListeners(); + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { + currentHistoryMsgList = [ + lifeCycleMsg ?? messageInfoWithSender, + ...currentHistoryMsgList + ]; + globalModel.setMessageList(conversationID, currentHistoryMsgList); + + notifyListeners(); + } return _sendMessage( convID: convID, id: textATMessageInfo.id as String, @@ -564,12 +646,14 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(conversationID, currentHistoryMsgList); - notifyListeners(); + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { + currentHistoryMsgList = [ + lifeCycleMsg ?? messageInfoWithSender, + ...currentHistoryMsgList + ]; + globalModel.setMessageList(conversationID, currentHistoryMsgList); + notifyListeners(); + } return _sendMessage( convID: convID, id: textMessageInfo.id as String, @@ -601,13 +685,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(conversationID, currentHistoryMsgList); + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { + currentHistoryMsgList = [ + lifeCycleMsg ?? messageInfoWithSender, + ...currentHistoryMsgList + ]; + globalModel.setMessageList(conversationID, currentHistoryMsgList); - notifyListeners(); + notifyListeners(); + } return _sendMessage( convID: convID, id: soundMessageInfo.id as String, @@ -777,6 +863,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest){ currentHistoryMsgList = [ lifeCycleMsg ?? messageInfoWithSender, ...currentHistoryMsgList @@ -784,6 +871,7 @@ class TUIChatSeparateViewModel extends ChangeNotifier { globalModel.setMessageList(conversationID, currentHistoryMsgList); notifyListeners(); + } return _sendMessage( convID: convID, messageInfo: lifeCycleMsg ?? messageInfoWithSender, @@ -821,13 +909,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(conversationID, currentHistoryMsgList); + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { + currentHistoryMsgList = [ + lifeCycleMsg ?? messageInfoWithSender, + ...currentHistoryMsgList + ]; + globalModel.setMessageList(conversationID, currentHistoryMsgList); - notifyListeners(); + notifyListeners(); + } return _sendMessage( convID: convID, messageInfo: lifeCycleMsg ?? messageInfoWithSender, @@ -864,13 +954,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(conversationID, currentHistoryMsgList); + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { + currentHistoryMsgList = [ + lifeCycleMsg ?? messageInfoWithSender, + ...currentHistoryMsgList + ]; + globalModel.setMessageList(conversationID, currentHistoryMsgList); - notifyListeners(); + notifyListeners(); + } return _sendMessage( convID: convID, messageInfo: lifeCycleMsg ?? messageInfoWithSender, @@ -903,13 +995,15 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(conversationID, currentHistoryMsgList); + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest) { + currentHistoryMsgList = [ + lifeCycleMsg ?? messageInfoWithSender, + ...currentHistoryMsgList + ]; + globalModel.setMessageList(conversationID, currentHistoryMsgList); - notifyListeners(); + notifyListeners(); + } return _sendMessage( convID: convID, id: locationMessageInfo.id as String, @@ -1109,13 +1203,17 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return null; } } - currentHistoryMsgList = [ - lifeCycleMsg ?? messageInfoWithSender, - ...currentHistoryMsgList - ]; - globalModel.setMessageList(conversationID, currentHistoryMsgList); - notifyListeners(); + if(globalModel.getMessageListPosition(conversationID) != HistoryMessagePosition.notShowLatest){ + currentHistoryMsgList = [ + lifeCycleMsg ?? messageInfoWithSender, + ...currentHistoryMsgList + ]; + globalModel.setMessageList(conversationID, currentHistoryMsgList); + notifyListeners(); + } + + return _sendMessage( convID: convID, id: textMessageInfo.id as String, @@ -1279,16 +1377,9 @@ class TUIChatSeparateViewModel extends ChangeNotifier { } showLatestUnread() { - // List currentMsgList = getOriginMessageList(); - // currentMsgList = [ - // ...?globalModel.tempMessageListMap[conversationID], - // ...currentMsgList - // ]; markMessageAsRead(); globalModel.setMessageListPosition( conversationID, HistoryMessagePosition.bottom); - // globalModel.setTempMessageList(conversationID, []); - // globalModel.setMessageList(conversationID, currentMsgList); } @override 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 225a313..fbbd5cf 100644 --- a/lib/business_logic/view_models/tui_chat_global_model.dart +++ b/lib/business_logic/view_models/tui_chat_global_model.dart @@ -18,7 +18,7 @@ import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; enum ConvType { none, c2c, group } -enum HistoryMessagePosition { bottom, inTwoScreen, awayTwoScreen } +enum HistoryMessagePosition { bottom, inTwoScreen, awayTwoScreen, notShowLatest } class CurrentConversation { final String conversationID; @@ -182,6 +182,10 @@ class TUIChatGlobalModel extends ChangeNotifier with TIMUIKitClass { return _receivedNewMessageCount; } + set receivedNewMessageCount(int value) { + _receivedNewMessageCount = value; + } + int get unreadCountForConversation => _unreadCountForConversation; List get groupApplicationList => @@ -596,7 +600,11 @@ class TUIChatGlobalModel extends ChangeNotifier with TIMUIKitClass { _checkFromUserisActive(msgComing); final convID = newMsg.userID ?? newMsg.groupID; if (convID != null && convID == currentSelectedConv) { - if (getMessageListPosition(convID) == HistoryMessagePosition.bottom && + final position = getMessageListPosition(convID); + if(position == HistoryMessagePosition.notShowLatest){ + return; + } + if (position == HistoryMessagePosition.bottom && unreadCountForConversation == 0) { markMessageAsRead( convID: convID, diff --git a/lib/data_services/core/tim_uikit_config.dart b/lib/data_services/core/tim_uikit_config.dart index f316bc1..d347edf 100644 --- a/lib/data_services/core/tim_uikit_config.dart +++ b/lib/data_services/core/tim_uikit_config.dart @@ -1,3 +1,5 @@ +import 'package:flutter/cupertino.dart'; + class TIMUIKitConfig { /// Control if show online status of friends or contacts. /// This only works with [Ultimate Edition]. @@ -13,8 +15,12 @@ class TIMUIKitConfig { /// The asset path of the default avatar image. final String? defaultAvatarAssetPath; + /// The configuration of border radius for all the avatar shows in TUIKit. + final BorderRadius? defaultAvatarBorderRadius; + const TIMUIKitConfig({ this.defaultAvatarAssetPath, + this.defaultAvatarBorderRadius, this.isCheckDiskStorageSpace = true, this.isShowOnlineStatus = true, }); diff --git a/lib/i18n/strings.i18n.json b/lib/i18n/strings.i18n.json index 5aff174..689dba7 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_002wkr3":"翻译","k_13g4hxv":"翻译完成"} \ 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_002wkr3":"翻译","k_13g4hxv":"翻译完成","k_1qqgjra":"$option3条未读消息","k_0uubyjr":"以下为未读消息"} \ 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 a721046..72463e1 100644 --- a/lib/i18n/strings_zh-Hans.i18n.json +++ b/lib/i18n/strings_zh-Hans.i18n.json @@ -660,5 +660,7 @@ "k_003nvk2": "消息", "k_03agld7": "群提示", "k_002wkr3": "翻译", - "k_13g4hxv": "翻译完成" + "k_13g4hxv": "翻译完成", + "k_1qqgjra": "$option3条未读消息", + "k_0uubyjr": "以下为未读消息" } \ 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 79b57fb..d36d77a 100644 --- a/lib/i18n/strings_zh-Hant.i18n.json +++ b/lib/i18n/strings_zh-Hant.i18n.json @@ -1 +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_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_002wkr3":"翻译","k_13g4hxv":"翻译完成"} \ 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_002wkr3":"翻译","k_13g4hxv":"翻译完成","k_1qqgjra":"$option3条未读消息","k_0uubyjr":"以下为未读消息"} \ No newline at end of file diff --git a/lib/ui/controller/tim_uikit_chat_controller.dart b/lib/ui/controller/tim_uikit_chat_controller.dart index 20c90ea..2152058 100644 --- a/lib/ui/controller/tim_uikit_chat_controller.dart +++ b/lib/ui/controller/tim_uikit_chat_controller.dart @@ -25,6 +25,7 @@ class TIMUIKitChatController { int lastMsgSeq = -1, required int count, String? lastMsgID, + LoadDirection direction = LoadDirection.previous }) async { return await model?.loadData( count: count, diff --git a/lib/ui/utils/message.dart b/lib/ui/utils/message.dart index 7d4f973..0a28527 100644 --- a/lib/ui/utils/message.dart +++ b/lib/ui/utils/message.dart @@ -100,10 +100,10 @@ class MessageUtils { } } - static String? _getOpUserNick(V2TimGroupMemberInfo opUser) { - return TencentUtils.checkString(opUser.friendRemark) ?? - TencentUtils.checkString(opUser.nickName) ?? - TencentUtils.checkString(opUser.userID); + static String? _getOpUserNick(V2TimGroupMemberInfo? opUser) { + return TencentUtils.checkString(opUser?.friendRemark) ?? + TencentUtils.checkString(opUser?.nickName) ?? + TencentUtils.checkString(opUser?.userID) ?? ""; } static String? _getMemberNickName(V2TimGroupMemberInfo e) { diff --git a/lib/ui/utils/optimize_utils.dart b/lib/ui/utils/optimize_utils.dart index f19fced..7cc4351 100644 --- a/lib/ui/utils/optimize_utils.dart +++ b/lib/ui/utils/optimize_utils.dart @@ -14,6 +14,19 @@ class OptimizeUtils { }; } + static multiThrottle(Function func, int milliseconds) { + bool enable = true; + return (val1, val2) { + if (enable == true) { + enable = false; + Future.delayed(Duration(milliseconds: milliseconds), () { + enable = true; + func(val1, val2); + }); + } + }; + } + static debounce( Function func, [ Duration delay = const Duration(milliseconds: 100), diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart index a76c86c..56babcc 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart @@ -8,6 +8,7 @@ enum MessageListTongueType { none, toLatest, showUnread, + showPrevious, atMe, atAll, } @@ -31,8 +32,11 @@ class TIMUIKitHistoryMessageListTongue extends TIMUIKitStatelessWidget { /// total amount of messages at me final String atNum; + final int previousCount; + TIMUIKitHistoryMessageListTongue({ Key? key, + required this.previousCount, required this.valueType, required this.onClick, required this.unreadCount, @@ -51,6 +55,7 @@ class TIMUIKitHistoryMessageListTongue extends TIMUIKitStatelessWidget { unreadCount: unreadCount, valueType: valueType, atNum: atNum, + previousCount: previousCount, ); } return valueType != MessageListTongueType.none ? tongueItem : Container(); diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue_container.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue_container.dart index 624c5f1..e03eea7 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue_container.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue_container.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_im_base/tencent_im_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'; @@ -17,15 +18,17 @@ class TIMUIKitHistoryMessageListTongueContainer extends StatefulWidget { final Function(String targetSeq) scrollToIndexBySeq; final AutoScrollController scrollController; final TUIChatSeparateViewModel model; + final V2TimConversation conversation; - const TIMUIKitHistoryMessageListTongueContainer( - {Key? key, - this.tongueItemBuilder, - this.groupAtInfoList, - required this.scrollToIndexBySeq, - required this.scrollController, - required this.model}) - : super(key: key); + const TIMUIKitHistoryMessageListTongueContainer({ + Key? key, + this.tongueItemBuilder, + this.groupAtInfoList, + required this.conversation, + required this.scrollToIndexBySeq, + required this.scrollController, + required this.model, + }) : super(key: key); @override State createState() => @@ -37,6 +40,7 @@ class _TIMUIKitHistoryMessageListTongueContainerState bool isFinishJumpToAt = false; List? groupAtInfoList = []; final TUIChatGlobalModel globalModel = serviceLocator(); + bool isClickShowPrevious = false; @override void initState() { @@ -55,29 +59,22 @@ class _TIMUIKitHistoryMessageListTongueContainerState scrollHandler() { final screenHeight = MediaQuery.of(context).size.height; - if (widget.scrollController.offset <= 0.0 && - widget.model.getConversationUnreadCount() != 0) { - // final double originalHeight = - // widget.scrollController.position.extentAfter; + final offset = widget.scrollController.offset; + final conversationUnreadCount = widget.model.getConversationUnreadCount(); + if (offset <= 0.0 && + conversationUnreadCount != 0) { widget.model.showLatestUnread(); - // Future.delayed(const Duration(milliseconds: 500), () { - // if (widget.scrollController.position.maxScrollExtent > originalHeight) { - // final animateToPosition = - // widget.scrollController.position.maxScrollExtent - originalHeight; - // widget.scrollController.jumpTo(animateToPosition); - // } - // }); } if (widget.scrollController.offset <= widget.scrollController.position.minScrollExtent && - !widget.scrollController.position.outOfRange) { + !widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) { changePositionState(HistoryMessagePosition.bottom); } else if (widget.scrollController.offset <= screenHeight * 1.6 && widget.scrollController.offset > 0 && - !widget.scrollController.position.outOfRange) { + !widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) { changePositionState(HistoryMessagePosition.inTwoScreen); } else if (widget.scrollController.offset > screenHeight * 1.6 && - !widget.scrollController.position.outOfRange) { + !widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) { changePositionState(HistoryMessagePosition.awayTwoScreen); } } @@ -88,6 +85,11 @@ class _TIMUIKitHistoryMessageListTongueContainerState MessageListTongueType _getTongueValueType( List? groupAtInfoList) { + + if(globalModel.getMessageListPosition(widget.model.conversationID) == + HistoryMessagePosition.notShowLatest){ + return MessageListTongueType.none; + } if (groupAtInfoList != null && groupAtInfoList.isNotEmpty && !isFinishJumpToAt) { @@ -98,6 +100,10 @@ class _TIMUIKitHistoryMessageListTongueContainerState } } + if ((widget.conversation.unreadCount ?? 0) > 20 && !isClickShowPrevious) { + return MessageListTongueType.showPrevious; + } + if (globalModel.unreadCountForConversation > 0) { return MessageListTongueType.showUnread; } @@ -121,12 +127,20 @@ class _TIMUIKitHistoryMessageListTongueContainerState return Selector>( builder: (context, value, child) { return Positioned( - bottom: 16, + bottom: _getTongueValueType(groupAtInfoList) != + MessageListTongueType.showPrevious + ? 16 + : null, + top: _getTongueValueType(groupAtInfoList) == + MessageListTongueType.showPrevious + ? 16 + : null, right: 16, child: TIMUIKitHistoryMessageListTongue( + previousCount: widget.conversation.unreadCount ?? 0, tongueItemBuilder: widget.tongueItemBuilder, unreadCount: globalModel.unreadCountForConversation, - onClick: () { + onClick: () async { if (groupAtInfoList != null && groupAtInfoList!.isNotEmpty) { if (groupAtInfoList?.length == 1) { widget.scrollToIndexBySeq(groupAtInfoList![0]!.seq); @@ -138,8 +152,26 @@ class _TIMUIKitHistoryMessageListTongueContainerState } else { widget.scrollToIndexBySeq(groupAtInfoList!.removeAt(0)!.seq); } - } - if (value.item1 == HistoryMessagePosition.awayTwoScreen || + } else if ((widget.conversation.unreadCount ?? 0) > 20 && !isClickShowPrevious) { + try{ + isClickShowPrevious = true; + final String? lastSeqString = + widget.conversation.lastMessage?.seq; + final int? lastSeq = + TencentUtils.checkString(lastSeqString) != null + ? int.parse(lastSeqString!) + : null; + final int? previousCount = widget.conversation.unreadCount; + if (lastSeq != null && previousCount != null) { + final targetSeq = lastSeq - previousCount; + await widget.model.loadListForSpecificMessage(seq: targetSeq); + // widget.scrollToIndexBySeq((targetSeq + 1).toString()); + } + }catch(e){ + // TODO: 这里后续加个弹窗提示客户,找消息失败了 + } + // widget.model.loadListForSpecificMessage(seq: count); + } else if (value.item1 == HistoryMessagePosition.awayTwoScreen || globalModel.unreadCountForConversation > 0) { widget.model.showLatestUnread(); widget.scrollController.animateTo( diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_tongue_item.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_tongue_item.dart index e23b9c1..6c83348 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_tongue_item.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_tongue_item.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; - - import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; @@ -21,10 +19,13 @@ class TIMUIKitTongueItem extends TIMUIKitStatelessWidget { /// total amount of messages at me final String atNum; - TIMUIKitTongueItem({ + final int previousCount; + + TIMUIKitTongueItem( { Key? key, required this.onClick, required this.valueType, + required this.previousCount, required this.unreadCount, required this.atNum, }) : super(key: key); @@ -32,11 +33,14 @@ class TIMUIKitTongueItem extends TIMUIKitStatelessWidget { Map textType(BuildContext context) { final option1 = unreadCount.toString(); final option2 = atNum.toString(); + final option3 = previousCount.toString(); final String atMeString = option2 != "" ? TIM_t_para("有{{option2}}条@我消息", "有$option2条@我消息")(option2: option2) : TIM_t("有人@我"); return { + MessageListTongueType.showPrevious: + TIM_t_para("{{option3}}条未读消息", "$option3条未读消息")(option3: option3), MessageListTongueType.toLatest: TIM_t("回到最新位置"), MessageListTongueType.showUnread: TIM_t_para("{{option1}}条新消息", "$option1条新消息")(option1: option1), @@ -50,6 +54,7 @@ class TIMUIKitTongueItem extends TIMUIKitStatelessWidget { MessageListTongueType.showUnread: Icons.arrow_downward_outlined, MessageListTongueType.atMe: Icons.arrow_upward_outlined, MessageListTongueType.atAll: Icons.arrow_upward_outlined, + MessageListTongueType.showPrevious: Icons.arrow_upward_outlined, }; @override @@ -71,7 +76,7 @@ class TIMUIKitTongueItem extends TIMUIKitStatelessWidget { ), padding: const EdgeInsets.all(10), // width: 112, - height: 37, + // height: 37, child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, 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 ee0ac66..f5f0dbb 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 @@ -76,7 +76,7 @@ class TIMUIKitHistoryMessageList extends StatefulWidget { final V2TimMessage? initFindingMsg; /// use for load more message - final Future Function(String?, [int?]) onLoadMore; + final Future Function(String?, LoadDirection direction, [int?]) onLoadMore; /// configuration for list view final TIMUIKitHistoryMessageListConfig? mainHistoryListConfig; @@ -85,6 +85,8 @@ class TIMUIKitHistoryMessageList extends StatefulWidget { final bool isAllowScroll; + final V2TimConversation conversation; + const TIMUIKitHistoryMessageList( {Key? key, required this.model, @@ -96,7 +98,8 @@ class TIMUIKitHistoryMessageList extends StatefulWidget { this.groupAtInfoList, this.initFindingMsg, this.isAllowScroll = true, - this.mainHistoryListConfig}) + this.mainHistoryListConfig, + required this.conversation}) : super(key: key); @override @@ -123,7 +126,7 @@ class _TIMUIKitHistoryMessageListState initFinding() async { if (widget.initFindingMsg != null) { - await widget.onLoadMore(null); + await widget.onLoadMore(null, LoadDirection.previous); setState(() { findingMsg = widget.initFindingMsg!; }); @@ -216,7 +219,7 @@ class _TIMUIKitHistoryMessageListState // if the target message not in current message list, load more findingMsg = targetMsg; final lastMsgId = _getMessageId(widget.messageList.length - 1); - widget.onLoadMore(lastMsgId, singleLoadAmount); + widget.onLoadMore(lastMsgId, LoadDirection.previous, singleLoadAmount); } else { showCantFindMsg(); } @@ -270,7 +273,7 @@ class _TIMUIKitHistoryMessageListState if (widget.model.haveMoreData) { findingSeq = targetSeq; widget.onLoadMore( - _getMessageId(widget.messageList.length - 1), singleLoadAmount); + _getMessageId(widget.messageList.length - 1), LoadDirection.previous, singleLoadAmount); } else { showCantFindMsg(); } @@ -336,12 +339,17 @@ class _TIMUIKitHistoryMessageListState .sublist(unreadMessageList.length, messageList.length) .toList(); - final throteFunction = OptimizeUtils.throttle((index) async { + final throteFunction = OptimizeUtils.multiThrottle((index, LoadDirection direction) async { final msgID = - TIMUIKitChatUtils.getMessageIDWithinIndex(messageList, index); - await widget.onLoadMore(msgID); + TIMUIKitChatUtils.getMessageIDWithinIndex(readMessageList, index); + await widget.onLoadMore(msgID, direction); }, 20); + final throteFunctionWithMsgID = OptimizeUtils.multiThrottle((msgID, LoadDirection direction) async { + await widget.onLoadMore(msgID, direction); + }, 200); + + if (findingMsg != null) { _onScrollToIndex(findingMsg!); } else if (findingSeq != "") { @@ -349,7 +357,7 @@ class _TIMUIKitHistoryMessageListState } String getMessageIdentifier(V2TimMessage? message, int index) { - return "${message?.msgID} - ${message?.timestamp} - ${message?.seq}"; + return "${message?.msgID} - ${message?.timestamp} - ${message?.seq} -${message?.id}"; } return Container( @@ -390,6 +398,9 @@ class _TIMUIKitHistoryMessageListState delegate: SliverChildBuilderDelegate( (BuildContext context, int index) { final messageItem = unreadMessageList[index]; + if(index == unreadMessageList.length - 1 && widget.model.haveMoreLatestData == true){ + throteFunctionWithMsgID(messageItem?.msgID ?? "", LoadDirection.latest); + } return AutoScrollTag( controller: _autoScrollController, index: -index, @@ -430,7 +441,7 @@ class _TIMUIKitHistoryMessageListState final messageItem = readMessageList[index]; if (index == readMessageList.length - 1) { if (widget.model.haveMoreData) { - throteFunction(index); + throteFunction(index, LoadDirection.previous); return Column( children: [ LoadingAnimationWidget.staggeredDotsWave( @@ -458,6 +469,9 @@ class _TIMUIKitHistoryMessageListState ); } } + if(index == 0 && widget.model.haveMoreLatestData == true && globalModel.receivedMessageListCount < 10){ + throteFunction(index, LoadDirection.latest); + } return AutoScrollTag( controller: _autoScrollController, index: -index, @@ -484,11 +498,13 @@ class _TIMUIKitHistoryMessageListState (element) => getMessageIdentifier(element, 0) == data); return index > -1 ? index : null; - })), + } + )), ), ], ), TIMUIKitHistoryMessageListTongueContainer( + conversation: widget.conversation, model: widget.model, scrollController: _autoScrollController, scrollToIndexBySeq: _onScrollToIndexBySeq, diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart index 1565945..d626b6f 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart @@ -597,6 +597,57 @@ class _TIMUIKItHistoryMessageListItemState ); } + Widget _latestDividerBuilder(TUITheme theme) { + return Container( + alignment: Alignment.center, + margin: const EdgeInsets.symmetric(vertical: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + margin: const EdgeInsets.only(right: 20), + child: SizedBox( + height: 1, + width: 100, + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + const Color(0x00C0E1FF), + theme.primaryColor ?? CommonColor.lightPrimaryColor + ]), + ) + ), + ), + ), + Text( + TIM_t("以下为未读消息"), + style: widget.themeData?.timelineTextStyle ?? + TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: theme.primaryColor, + ), + ), + Container( + margin: const EdgeInsets.only(left: 20), + child: SizedBox( + height: 1, + width: 100, + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient(colors: [ + theme.primaryColor ?? CommonColor.primaryColor, + const Color(0x00C0E1FF), + ]), + ) + ), + ), + ), + ], + ), + ); + } + bool isRevokable(int timestamp) => (DateTime.now().millisecondsSinceEpoch / 1000).ceil() - timestamp < 120; @@ -820,6 +871,7 @@ class _TIMUIKItHistoryMessageListItemState msgType == MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS; final isRevokedMsg = msgStatus == 6; final isTimeDivider = msgType == 11; + final isLatestDivider = msgType == 101; final isPeerRead = message.isPeerRead ?? false; final isGroupMessage = model.conversationType == ConvType.group; final bool isRevokeEditable = @@ -831,6 +883,9 @@ class _TIMUIKItHistoryMessageListItemState if (isTimeDivider) { return _timeDividerBuilder(theme, message.timestamp ?? 0, model); } + if(isLatestDivider){ + return _latestDividerBuilder(theme); + } void clearJump() { Future.delayed(const Duration(milliseconds: 100), () { model.jumpMsgID = ""; @@ -941,8 +996,6 @@ class _TIMUIKItHistoryMessageListItemState width: 40, height: 40, child: Avatar( - borderRadius: - widget.themeData?.avatarBorderRadius, faceUrl: message.faceUrl ?? "", showName: MessageUtils.getDisplayName(message), @@ -1146,8 +1199,6 @@ class _TIMUIKItHistoryMessageListItemState } }, child: Avatar( - borderRadius: - widget.themeData?.avatarBorderRadius, faceUrl: message.faceUrl ?? "", showName: MessageUtils.getDisplayName(message)), diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list_container.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list_container.dart index 9b286c7..838b933 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list_container.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list_container.dart @@ -67,6 +67,8 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget { final bool isAllowScroll; + final V2TimConversation conversation; + const TIMUIKitHistoryMessageListContainer({ Key? key, this.itemBuilder, @@ -89,6 +91,7 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget { this.isUseDefaultEmoji = false, this.customEmojiStickerList = const [], this.textFieldController, + required this.conversation, }) : super(key: key); @override @@ -102,10 +105,12 @@ class _TIMUIKitHistoryMessageListContainerState List historyMessageList = []; - Future requestForData(String? lastMsgID, TUIChatSeparateViewModel model, + Future requestForData(String? lastMsgID, LoadDirection direction, TUIChatSeparateViewModel model, [int? count]) async { - if (model.haveMoreData) { + print("requestForData $lastMsgID $direction"); + if ((direction == LoadDirection.previous && model.haveMoreData) || (direction == LoadDirection.latest && model.haveMoreLatestData)) { await model.loadData( + direction: direction, count: count ?? (kIsWeb ? 15 : HistoryMessageDartConstant.getCount), lastMsgID: lastMsgID); } @@ -139,6 +144,7 @@ class _TIMUIKitHistoryMessageListContainerState conversationID: model.conversationID, builder: (context, messageList, child) { return TIMUIKitHistoryMessageList( + conversation: widget.conversation, model: model, isAllowScroll: widget.isAllowScroll, controller: _historyMessageListController, @@ -172,8 +178,8 @@ class _TIMUIKitHistoryMessageListContainerState tongueItemBuilder: widget.tongueItemBuilder, initFindingMsg: widget.initFindingMsg, messageList: messageList, - onLoadMore: (String? a, [int? b]) async { - return await requestForData(a, model, b); + onLoadMore: (String? a, LoadDirection direction, [int? b]) async { + return await requestForData(a, direction, model, b); }, ); }, diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart index 7453b32..02df70d 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart @@ -363,6 +363,7 @@ class _InputTextFieldState extends TIMUIKitState { goDownBottom(); } setSendButton(); + currentCursor = null; } // index为emoji的index,data为baseurl+name @@ -435,6 +436,9 @@ class _InputTextFieldState extends TIMUIKitState { } void goDownBottom() { + if(globalModel.getMessageListPosition(widget.conversationID) == HistoryMessagePosition.notShowLatest){ + return; + } Future.delayed(const Duration(milliseconds: 50), () { try { if (widget.scrollController != null) { diff --git a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart index 42c7c2b..7f4bbf1 100644 --- a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart +++ b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart @@ -30,21 +30,26 @@ class TIMUIKitChat extends StatefulWidget { /// You have to provide this before using it after tencent_cloud_chat_uikit 0.1.4. final TIMUIKitChatController? controller; + /// [Update] It is suggested to provide the `V2TimConversation` once directly, since tencent_cloud_chat_uikit 1.5.0. + /// `conversationID` / `conversationType` / `groupAtInfoList` / `conversationShowName` are not necessary to be provided, unless you want to cover these fields manually. + final V2TimConversation conversation; + /// The ID of the Group that the topic belongs to, only need for topic. final String? groupID; - /// Conversation id, use for get history message list. - final String conversationID; + /// Conversation id, use for load history message list. + /// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually. + final String? conversationID; - /// Conversation type. - final ConvType conversationType; + /// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually. + final ConvType? conversationType; /// use for customize avatar final Widget Function(BuildContext context, V2TimMessage message)? userAvatarBuilder; - /// Use for show conversation name. - final String conversationShowName; + /// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually. + final String? conversationShowName; /// Avatar and name in message reaction tap callback. final void Function(String userID)? onTapAvatar; @@ -94,6 +99,7 @@ class TIMUIKitChat extends StatefulWidget { final TongueItemBuilder? tongueItemBuilder; /// The `groupAtInfoList` from `V2TimConversation`. + /// This field is not necessary to be provided, when `conversation` is provided, unless you want to cover this field manually. final List? groupAtInfoList; /// The configuration for the whole `TIMUIKitChat` widget. @@ -133,9 +139,9 @@ class TIMUIKitChat extends StatefulWidget { TIMUIKitChat( {Key? key, this.groupID, - required this.conversationID, - required this.conversationType, - required this.conversationShowName, + this.conversationID, + this.conversationType, + 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") @@ -162,7 +168,8 @@ class TIMUIKitChat extends StatefulWidget { this.lifeCycle, this.topFixWidget = const SizedBox(), this.textFieldBuilder, - this.customEmojiStickerList = const []}) + this.customEmojiStickerList = const [], + required this.conversation}) : super(key: key) { startTime = DateTime.now().millisecondsSinceEpoch; } @@ -187,6 +194,24 @@ class _TUIChatState extends TIMUIKitState { axis: Axis.vertical, ); + String _getTitle() { + 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) ?? + ""; + } + + ConvType _getConvType() { + return widget.conversation.type == 1 ? ConvType.c2c : ConvType.group; + } + @override void initState() { super.initState(); @@ -221,7 +246,7 @@ class _TUIChatState extends TIMUIKitState { child: GestureDetector( onTap: () { if (widget.onDealWithGroupApplication != null) { - widget.onDealWithGroupApplication!(widget.conversationID); + widget.onDealWithGroupApplication!(_getConvID()); } }, child: Row( @@ -260,8 +285,8 @@ class _TUIChatState extends TIMUIKitState { model: model, groupID: widget.groupID, textFieldController: textFieldController, - conversationID: widget.conversationID, - conversationType: widget.conversationType, + conversationID: _getConvID(), + conversationType: _getConvType(), lifeCycle: widget.lifeCycle, config: widget.config, isBuild: isBuild, @@ -274,11 +299,11 @@ class _TUIChatState extends TIMUIKitState { widget.controller?.model = model; List filteredApplicationList = []; - if (widget.conversationType == ConvType.group && + if (_getConvType() == ConvType.group && widget.onDealWithGroupApplication != null) { filteredApplicationList = chatGlobalModel.groupApplicationList.where((item) { - return (item.groupID == widget.conversationID) && + return (item.groupID == _getConvID()) && item.handleStatus == 0; }).toList(); } @@ -287,15 +312,15 @@ class _TUIChatState extends TIMUIKitState { Provider.of(context, listen: true); final NeedUpdate? needUpdate = groupListenerModel.needUpdate; if (needUpdate != null && - needUpdate.groupID == widget.conversationID) { + needUpdate.groupID == _getConvID()) { groupListenerModel.needUpdate = null; switch (needUpdate.updateType) { case UpdateType.groupInfo: - model.loadGroupInfo(widget.conversationID); + model.loadGroupInfo(_getConvID()); break; case UpdateType.memberList: - model.loadGroupMemberList(groupID: widget.conversationID); - model.loadGroupInfo(widget.conversationID); + model.loadGroupMemberList(groupID: _getConvID()); + model.loadGroupInfo(_getConvID()); break; default: break; @@ -319,8 +344,8 @@ class _TUIChatState extends TIMUIKitState { appBar: TIMUIKitAppBar( showTotalUnReadCount: widget.showTotalUnReadCount, config: widget.appBarConfig, - conversationShowName: widget.conversationShowName, - conversationID: widget.conversationID, + conversationShowName: _getTitle(), + conversationID: _getConvID(), showC2cMessageEditStaus: widget.config?.showC2cMessageEditStaus ?? true, ), @@ -337,6 +362,7 @@ class _TUIChatState extends TIMUIKitState { child: Listener( onPointerMove: closePanel, child: TIMUIKitHistoryMessageListContainer( + conversation: widget.conversation, textFieldController: textFieldController, customEmojiStickerList: widget.customEmojiStickerList, @@ -351,7 +377,7 @@ class _TUIChatState extends TIMUIKitState { tongueItemBuilder: widget.tongueItemBuilder, onLongPressForOthersHeadPortrait: (String? userId, String? nickName) { - if (widget.conversationType != ConvType.c2c) { + if (_getConvType() != ConvType.c2c) { textFieldController.longPressToAt( nickName, userId); } @@ -362,20 +388,20 @@ class _TUIChatState extends TIMUIKitState { extraTipsActionItemBuilder: widget.extraTipsActionItemBuilder ?? widget.exteraTipsActionItemBuilder, - conversationType: widget.conversationType, + conversationType: _getConvType(), scrollController: autoController, onTapAvatar: widget.onTapAvatar, // ignore: deprecated_member_use_from_same_package showNickName: widget.showNickName, messageItemBuilder: widget.messageItemBuilder, - conversationID: widget.conversationID, + conversationID: _getConvID(), ), ))), Selector( builder: (context, value, child) { return value ? MultiSelectPanel( - conversationType: widget.conversationType, + conversationType: _getConvType(), ) : (widget.textFieldBuilder != null ? widget.textFieldBuilder!(context) @@ -390,8 +416,8 @@ class _TUIChatState extends TIMUIKitState { widget.customStickerPanel, morePanelConfig: widget.morePanelConfig, scrollController: autoController, - conversationID: widget.conversationID, - conversationType: widget.conversationType, + conversationID: _getConvID(), + conversationType: _getConvType(), initText: widget.draftText, hintText: widget.textFieldHintText, showMorePanel: diff --git a/lib/ui/widgets/avatar.dart b/lib/ui/widgets/avatar.dart index aaca9e9..888ffa2 100644 --- a/lib/ui/widgets/avatar.dart +++ b/lib/ui/widgets/avatar.dart @@ -13,8 +13,8 @@ class Avatar extends TIMUIKitStatelessWidget { final String faceUrl; final String showName; final bool isFromLocalAsset; - final CoreServicesImpl coreService = serviceLocator(); final BorderRadius? borderRadius; + final CoreServicesImpl coreService = serviceLocator(); final V2TimUserStatus? onlineStatus; final int? type; // 1 c2c 2 group final bool isShowBigWhenClick; @@ -25,10 +25,10 @@ class Avatar extends TIMUIKitStatelessWidget { {Key? key, required this.faceUrl, this.onlineStatus, - required this.showName, + this.borderRadius, + required this.showName, this.isShowBigWhenClick = false, this.isFromLocalAsset = false, - this.borderRadius, this.type = 1}) : super(key: key); @@ -133,14 +133,14 @@ class Avatar extends TIMUIKitStatelessWidget { child: Hero( tag: faceUrl, child: ClipRRect( - borderRadius: borderRadius ?? BorderRadius.circular(4.8), + borderRadius: borderRadius ?? selfInfoViewModel.globalConfig?.defaultAvatarBorderRadius ?? BorderRadius.circular(4.8), child: getImageWidget(context, theme), ), ), ), if (!isShowBigWhenClick) ClipRRect( - borderRadius: borderRadius ?? BorderRadius.circular(4.8), + borderRadius: borderRadius ?? selfInfoViewModel.globalConfig?.defaultAvatarBorderRadius ?? BorderRadius.circular(4.8), child: getImageWidget(context, theme), ), if (onlineStatus?.statusType != null && onlineStatus?.statusType != 0) diff --git a/pubspec.lock b/pubspec.lock index 5562102..754acb8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201" + sha256: "569ddca58d535e601dd1584afa117710abc999d036c0cd2c51777fb257df78e8" url: "https://pub.dev" source: hosted - version: "52.0.0" + version: "53.0.0" adaptive_action_sheet: dependency: "direct main" description: @@ -21,18 +21,18 @@ packages: dependency: transitive description: name: analyzer - sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4 + sha256: "10927c4b7c7c88b1adbca278c3d5531db92e2f4b4abf04e2919a800af965f3f5" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.5.0" args: dependency: transitive description: name: args - sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611" + sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" async: dependency: transitive description: @@ -77,10 +77,10 @@ packages: dependency: transitive description: name: build_resolvers - sha256: "7c35a3a7868626257d8aee47b51c26b9dba11eaddf3431117ed2744951416aab" + sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" build_runner: dependency: "direct dev" description: @@ -309,10 +309,10 @@ packages: dependency: "direct main" description: name: extended_image - sha256: "5854d0d05ee0c687d1852af9db05f15cfe058520fa56f417075705c5bce965d4" + sha256: a6b738d9b8d5513be72c545cc3e9c5c451fbee77c8db3cbec7c32ae85b82fb93 url: "https://pub.dev" source: hosted - version: "6.4.0" + version: "6.4.1" extended_image_library: dependency: transitive description: @@ -423,10 +423,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "818cf6c28377ba2c91ed283c96fd712e9c175dd2d2488eb7fc93b6afb9ad2e08" + sha256: "7b25c10de1fea883f3c4f9b8389506b54053cd00807beab69fd65c8653a2711f" url: "https://pub.dev" source: hosted - version: "0.6.13+1" + version: "0.6.14" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -564,18 +564,18 @@ packages: dependency: "direct main" description: name: image_picker - sha256: f98d76672d309c8b7030c323b3394669e122d52b307d2bbd8d06bd70f5b2aabe + sha256: d39cc12402dab8365fe5b5370e64694ae0223d675c36b15ff0490b7cc3d32551 url: "https://pub.dev" source: hosted - version: "0.8.6+1" + version: "0.8.6+2" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: b1cbfec0f5aef427a18eb573f5445af8c9c568626bf3388553e40c263d3f7368 + sha256: "385f12ee9c7288575572c7873a332016ec45ebd092e1c2f6bd421b4a9ad21f1d" url: "https://pub.dev" source: hosted - version: "0.8.5+5" + version: "0.8.5+6" image_picker_for_web: dependency: transitive description: @@ -588,10 +588,10 @@ packages: dependency: transitive description: name: image_picker_ios - sha256: "8ffb14b43713d7c43fb21299cc18181cc5b39bd3ea1cc427a085c6400fe5aa52" + sha256: "884ed71165bc01ffe1b0b7813e6fa17e1e9442da974656f99b79a292371303d6" url: "https://pub.dev" source: hosted - version: "0.8.6+7" + version: "0.8.6+8" image_picker_platform_interface: dependency: transitive description: @@ -676,10 +676,10 @@ packages: dependency: transitive description: name: markdown - sha256: c2b81e184067b41d0264d514f7cdaa2c02d38511e39d6521a1ccc238f6d7b3f2 + sha256: b3c60dee8c2af50ad0e6e90cceba98e47718a6ee0a7a6772c77846a0cc21f78b url: "https://pub.dev" source: hosted - version: "6.0.1" + version: "7.0.1" matcher: dependency: transitive description: @@ -836,10 +836,10 @@ packages: dependency: transitive description: name: path_provider_linux - sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.1.8" path_provider_platform_interface: dependency: transitive description: @@ -1177,26 +1177,26 @@ packages: dependency: transitive description: name: tencent_cloud_chat_sdk - sha256: "3b3349dec74f60cff9cd85cb865c41d60afb472b451f5124f2e8318df037cc7f" + sha256: "32b7e40c5a1682b3ee85daa73504af3d0d4e60a93472b279591e769b15b4861c" url: "https://pub.dev" source: hosted - version: "5.0.8" + version: "5.0.9" tencent_extended_text: dependency: "direct main" description: name: tencent_extended_text - sha256: "27a2f7ee58ada480e295102471f1733a7402178a239d0c80a7aa33a134c641ef" + sha256: cf0d283c01a9e63f75666d8b5b1cabd463e18e51802bf1d093d7a65bd369b3d4 url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.2+1" tencent_extended_text_field: dependency: "direct main" description: name: tencent_extended_text_field - sha256: d311c240983dbf78e31b58f91e425920a40d6564942813e692a3419bf5c9deb0 + sha256: daa10f3775bfac1cc841b34275c2746ced7764f3b77222a93edb4c13bad1209b url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.1+2" tencent_extended_text_library: dependency: transitive description: @@ -1209,18 +1209,18 @@ packages: dependency: "direct main" description: name: tencent_im_base - sha256: bbd2d70c82b018ce86c421f0b4eb02f650456d0bbd7ea5558110139c7b04c4b4 + sha256: b5917ff0bae7c31d52f54932349fc400d3752719a1c5a2f0209258f85c7a6c07 url: "https://pub.dev" source: hosted - version: "1.0.21" + version: "1.0.26" tencent_im_sdk_plugin_platform_interface: dependency: transitive description: name: tencent_im_sdk_plugin_platform_interface - sha256: "5dd3e957e7db00e3d785978b4b163e36376b9c5a481ed4f5d746876f1e408b62" + sha256: "7aff6a8495eae3efc3aed1ed944bab7a0ce7eb1035d09b3f3d7974bcb3d8b137" url: "https://pub.dev" source: hosted - version: "0.3.11" + version: "0.3.12" tencent_keyboard_visibility: dependency: "direct main" description: @@ -1233,10 +1233,10 @@ packages: dependency: "direct main" description: name: tencent_open_file - sha256: d60878fe1e5a1317607851d81ad78f395b8411418587de16cf1cd48cb662aa18 + sha256: "98cbffe55e3245a308fbf76e18c9a0f808e534c624bc1a1cc0a00bd63a418290" url: "https://pub.dev" source: hosted - version: "4.0.9" + version: "4.0.9+1" tencent_super_tooltip: dependency: "direct main" description: @@ -1249,10 +1249,10 @@ packages: dependency: "direct main" description: name: tencent_wechat_camera_picker - sha256: "8f95b435c7a12a9221f00fe4354fb9c0f9313d79cc09ddb5902b7b418185092d" + sha256: "6a6fd12d61ad2ef17273a226a165fe0b5e3ef5c7e49779de38503e4f4b6e3ef1" url: "https://pub.dev" source: hosted - version: "3.6.5+1" + version: "3.6.5+2" term_glyph: dependency: transitive description: @@ -1265,10 +1265,10 @@ packages: dependency: "direct main" description: name: tim_ui_kit_sticker_plugin - sha256: "5f6ec1c713718b185f920629024a4d135eead61b3735287dc80950710e2daa33" + sha256: cd5d6e2380deaf73e420602bbfe3da36c0f3253adc531f76e139efec80671175 url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" timing: dependency: transitive description: @@ -1281,10 +1281,10 @@ packages: dependency: "direct main" description: name: transparent_image - sha256: e566a616922a781489f4d91cc939b1b3203b6e4a093317805f2f82f0bb0f8dec + sha256: e8991d955a2094e197ca24c645efec2faf4285772a4746126ca12875e54ca02f url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" tuple: dependency: "direct main" description: @@ -1305,18 +1305,18 @@ packages: dependency: "direct main" description: name: universal_html - sha256: "5ff50b7c14d201421cf5230ec389a0591c4deb5c817c9d7ccca3b26fe5f31e34" + sha256: b5061c64c7c863c12e46279e032976f1c274f927fb3589b52b5928dcd2d52f7c url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "2.0.9" universal_io: dependency: transitive description: name: universal_io - sha256: "79f78ddad839ee3aae3ec7c01eb4575faf0d5c860f8e5223bc9f9c17f7f03cef" + sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d" url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.2.0" url_launcher: dependency: "direct main" description: @@ -1521,10 +1521,10 @@ packages: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 url: "https://pub.dev" source: hosted - version: "0.2.0+3" + version: "1.0.0" xml: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 91fd8b1..0d93290 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: tencent_cloud_chat_uikit description: Chat UI components library and basic chat business logic for Tencent Cloud Chat, helping you build In-APP Chat module easily. -version: 1.6.2 +version: 1.7.0 homepage: https://www.tencentcloud.com/products/im?from=pub repository: https://github.com/TencentCloud/chat-uikit-flutter documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html @@ -60,7 +60,7 @@ dependencies: url_launcher: ^6.1.4 universal_html: ^2.0.8 link_preview_generator: ^1.2.0 - tencent_im_base: ^1.0.21 + tencent_im_base: ^1.0.26 disk_space: ^0.2.1 http: ^0.13.5 crypto: ^3.0.2 @@ -69,7 +69,7 @@ dependencies: uuid: ^3.0.6 tencent_open_file: ^4.0.9 tencent_keyboard_visibility: ^1.0.1 - tim_ui_kit_sticker_plugin: ^1.1.1 + tim_ui_kit_sticker_plugin: ^1.2.0 dev_dependencies: flutter_lints: ^1.0.0