diff --git a/CHANGELOG.md b/CHANGELOG.md index f5ef3e0..9be230a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,22 @@ +## 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) 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. + +> **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. + ## 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, adjust resolution 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. @@ -10,7 +24,7 @@ ## 0.1.7 -* Add: Big and RAW images supports, especially for those captured from latest version of iOS and iPhone 14 Pro series, compress and format before sending automatically. +* 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. @@ -23,12 +37,12 @@ * 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 provided your own sticker list to panel by [tim_ui_kit_sticker_plugin](https://pub.dev/packages/tim_ui_kit_sticker_plugin). +* 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/TIMSDK/blob/master/Flutter/Demo/im-flutter-uikit/lib/src/chat.dart). +* 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). * Fix: Several bugs. ## 0.1.3 diff --git a/README.md b/README.md index 03534b3..9988a98 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,122 @@ +

- - Tencent Chat Logo + + Tencent Chat Logo

-

Tencent Cloud IM Chat UIKIt

+

Tencent Cloud Chat UIKIt

+ +

Globally interconnected In-App Chat, user profile and relationship chains and offline push.

+
+

More languages: - 简体中文-快速入门 - 简体中文-README + 简体中文-快速入门 + 简体中文-README

+
![](https://qcloudimg.tencent-cloud.cn/raw/193ec650f17da6bb33edf5df5d978091.png)

- TUIKit has Chat SDK, UI components and basic business logic inside. You can choose our pure Chat SDK tencent_im_sdk_plugin if you tend to build the UI yourself. + TUIKit has Chat SDK, UI components and basic business logic inside. You can choose our pure Chat SDK tencent-cloud-chat-sdk if you tend to build the UI yourself.

+ + +
+ +## Experience DEMO + +You can experience our Chat and Voice/Video Call modules via the following demos. + +**Those following versions of demo has been build by the same Flutter project with our SDKs and extensions.** + + + + + + + + + + +
Mobile APPWEB - H5
[Recommend] iOS/Android APP
Scan for the Web DEMO
+ +**Also, taking a look of the screenshots of TUIKit from [here](https://www.tencentcloud.com/document/product/1047/50059?from=pub) are suggested.** ## Introduction to TUIKit -TUIKit is a set of official UI components for Tencent Cloud IM Chat SDK, with chat business logic around it. It provides components such as the conversation, chat, relationship chain, and group. +[TUIKit](https://www.tencentcloud.com/document/product/1047/50059?from=pub) is a set of official UI components for Tencent Cloud Chat SDK, with chat business logic around it. It provides components such as the conversation, chat, relationship chain, and group. You can use these UI components to build your APP with the In-APP chat module quickly and easily. ![img](https://qcloudimg.tencent-cloud.cn/raw/f140dd76be01a65abfb7e6ba2bf50ed5.png) -Currently, Flutter TUIKit contains the following main components: +Currently, Flutter [TUIKit](https://www.tencentcloud.com/document/product/1047/50059?from=pub) contains the following main components: -- [TIMUIKitCore](https://www.tencentcloud.com/document/product/1047/46297#timuikitcore): Core entry -- [TIMUIKitConversation](https://www.tencentcloud.com/document/product/1047/46297#timuikitconversation): Conversation list -- [TIMUIKitChat](https://www.tencentcloud.com/document/product/1047/46297#timuikitchat): Chat module, includes historical message list and message sending area, with some other features like message reaction and URL preview, etc. -- [TIMUIKitContact](https://www.tencentcloud.com/document/product/1047/46297#timuikitcontact): Contacts list -- [TIMUIKitProfile](https://www.tencentcloud.com/document/product/1047/46297#timuikitprofile): User profile and relationship management -- [TIMUIKitGroupProfile](https://www.tencentcloud.com/document/product/1047/46297#timuikitgroupprofile): Group profile and management -- [TIMUIKitGroup](https://www.tencentcloud.com/document/product/1047/46297#timuikitgroup): The list of group self joined -- [TIMUIKitBlackList](https://www.tencentcloud.com/document/product/1047/46297#timuikitblacklist): The list of user been blocked -- [TIMUIKitNewContact](https://www.tencentcloud.com/document/product/1047/46297#timuikitnewcontact): New contacts application list -- [TIMUIKitSearch](https://pub.dev/documentation/tim_ui_kit/latest/ui_views_TIMUIKitSearch_tim_uikit_search/TIMUIKitSearch-class.html): Search globally -- [TIMUIKitSearchMsgDetail](https://pub.dev/documentation/tim_ui_kit/latest/ui_views_TIMUIKitSearch_tim_uikit_search_msg_detail/TIMUIKitSearchMsgDetail-class.html): Search in specific conversation +- [TIMUIKitCore](https://comm.qq.com/im/doc/flutter/en/TUIKit/TIMUIKitCore/readme.html): Core entry +- [TIMUIKitConversation](https://www.tencentcloud.com/document/product/1047/50059?from=pub#timuikitconversation): Conversation list +- [TIMUIKitChat](https://www.tencentcloud.com/document/product/1047/50059?from=pub#timuikitchat): Chat module, includes historical message list and message sending area, with some other features like message reaction and URL preview, etc. +- [TIMUIKitContact](https://www.tencentcloud.com/document/product/1047/50059?from=pub#relationship-chain-components): Contacts list +- [TIMUIKitProfile](https://www.tencentcloud.com/document/product/1047/50059?from=pub#timuikitprofile): User profile and relationship management +- [TIMUIKitGroupProfile](https://www.tencentcloud.com/document/product/1047/50059?from=pub#timuikitgroupprofile): Group profile and management +- [TIMUIKitGroup](https://www.tencentcloud.com/document/product/1047/50059?from=pub#relationship-chain-components): The list of group self joined +- [TIMUIKitBlackList](https://www.tencentcloud.com/document/product/1047/50059?from=pub#relationship-chain-components): The list of user been blocked +- [TIMUIKitNewContact](https://www.tencentcloud.com/document/product/1047/50059?from=pub#relationship-chain-components): New contacts application list +- [TIMUIKitSearch](https://www.tencentcloud.com/document/product/1047/50036?from=pub): Search globally +- [TIMUIKitSearchMsgDetail](https://www.tencentcloud.com/document/product/1047/50036?from=pub): Search in specific conversation Also, there are some other useful components and widgets, that can help to build your APP, and meet your business needs, including group entry application list and group member list, etc. -For the source code of the project in the figure above, see [im-flutter-uikit](https://github.com/tencentyun/TIMSDK/tree/master/Flutter/Demo/im-flutter-uikit). The project is open source and can be used directly. +For the source code of the project in the figure above, see [im-flutter-uikit](https://github.com/TencentCloud/tc-chat-demo-flutter). The project is open source and can be used directly. ## Supported Platforms @@ -61,33 +126,35 @@ For the source code of the project in the figure above, see [im-flutter-uikit](h ## Get Started -**[Please refer this documents](https://www.tencentcloud.com/document/product/1047/45907), for a completed and detailed get started guide.** +**[Please refer this documents](https://www.tencentcloud.com/document/product/1047/45907?from=pub), for a completed and detailed get started guide.** ## Directions -The following guide describes how to use Flutter TUIKit to build a simple IM APP quickly. +The following guide describes how to use Flutter TUIKit to build a simple Chat APP quickly. **You may refer to the appendix, if willing to know about the detail and parameter for each widgets.** +> If you tend to add this Flutter [TUIKit](https://www.tencentcloud.com/document/product/1047/50059?from=pub) to your existing application directly, you may refer to [this documentation](https://www.tencentcloud.com/document/product/1047/51456). Add the Flutter module to your existing app, coding once and deploying to all platforms. It could reduce your workload, to adding chat and call modules to your existing, to a large extent. + ### Step 0. Create two accounts for testing -[Signed up](https://www.tencentcloud.com/document/product/378/17985) and [log in](https://www.tencentcloud.com/document/product/378/36004) to the [Tencent IM console](https://console.tencentcloud.com/im). +[Signed up](https://www.tencentcloud.com/document/product/378/17985?from=pub) and [log in](https://www.tencentcloud.com/document/product/378/36004?from=pub) to the [Tencent IM console](https://console.tencentcloud.com/im?from=pub). -[Create an application](https://www.tencentcloud.com/document/product/1047/34577) and enter in. +[Create an application](https://www.tencentcloud.com/document/product/1047/34577?from=pub) and enter in. -Select [Auxiliary Tools](https://console.cloud.tencent.com/im-detail/tool-usersig) > UserSig Generation and Verification on the left sidebar. Generate two pairs of "UserID" and the corresponding "UserSig", and copy the "key" information. [Refer to here.](https://www.tencentcloud.com/document/product/1047/34580#usersig-generation-and-verification) +Select [Auxiliary Tools](https://console.tencentcloud.com/im-detail/tool-usersig?from=pub) > UserSig Generation and Verification on the left sidebar. Generate two pairs of "UserID" and the corresponding "UserSig", and copy the "key" information. [Refer to here.](https://www.tencentcloud.com/document/product/1047/34580?from=pub#usersig-generation-and-verification) Tips: You may create "user1" and "user2" here. > Note: > -> The correct `UserSig` distribution method is to integrate the calculation code of `UserSig` into your server and provide an application-oriented API. When `UserSig` is needed, your application can send a request to the business server for a dynamic `UserSig`. For more information, see [How do I calculate UserSig on the server?](https://www.tencentcloud.com/document/product/1047/34385). +> The correct `UserSig` distribution method is to integrate the calculation code of `UserSig` into your server and provide an application-oriented API. When `UserSig` is needed, your application can send a request to the business server for a dynamic `UserSig`. For more information, see [How do I calculate UserSig on the server?](https://www.tencentcloud.com/document/product/1047/34385?from=pub). ### Step 1. Create a Flutter app and add permission configuration Quickly create a Flutter APP by referring to [Flutter documentation](https://docs.flutter.dev/get-started/install). -TUIKit needs the permissions of shooting/album/recording/network for basic messaging function. You need ti declare in the Native file manually to use the relevant capabilities normally. +TUIKit needs the permissions of shooting/album/recording/network for basic messaging function. You need to declare in the permission manually to use the relevant capabilities normally. #### Android @@ -136,10 +203,10 @@ end ### Step 2. Install dependencies -Add `tim_ui_kit` under `dependencies` in the `pubspec.yaml` file, or run the following command: +Add `tencent_cloud_chat_uikit` under `dependencies` in the `pubspec.yaml` file, or run the following command: ```shell -flutter pub add tim_ui_kit +flutter pub add tencent_cloud_chat_uikit ``` It supports Android and iOS as default, if you are also willing to use it on the Web, please refer to the following guide. @@ -150,19 +217,26 @@ Version of 0.1.4 or later are required for web supports. > If your existing Flutter project does not support Web, run `flutter create .` in the project root directory to add web support. -Download the following two JS files from GitHub, placed in the `web` directory of the project. +Install JS dependencies to `web/` by `npm` or `yarn`. -- [tim-js-friendship.js](https://github.com/TencentCloud/TIMSDK/blob/master/Web/IMSDK/tim-js-friendship.js) -- [Rename this file to `tim-upload-plugin.js`](https://github.com/TencentCloud/TIMSDK/blob/master/Web/IMSDK/tim-upload-plugin/index.js) +```shell +cd web + +npm init + +npm i tim-js-sdk + +npm i tim-upload-plugin +``` Open `web/index.html` , add the following two lines between `` and `` to import them. ```html - - + + ``` -![](https://qcloudimg.tencent-cloud.cn/raw/f88ddfbdc79fb7492f3ce00c2c583246.png) +![](https://qcloudimg.tencent-cloud.cn/raw/a4d25e02c546e0878ba59fcda87f9c76.png) ### Step 3. Initialize TUIKit @@ -172,7 +246,7 @@ Get the instance of TUIKit first by `TIMUIKitCore.getInstance()`, followed by in ```dart /// main.dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); @override @@ -180,7 +254,7 @@ final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); _coreInstance.init( sdkAppID: 0, // Replace 0 with the SDKAppID of your IM application loglevel: LogLevelEnum.V2TIM_LOG_DEBUG, - listener: V2TimSDKListener()); + listener: V2TimSDKListener()); super.initState(); } } @@ -196,13 +270,13 @@ Log in by `_coreInstance.login` . ```dart /// main.dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); _coreInstance.login(userID: userID, userSig: userSig); ``` -Caveat: Importing UserSig to your application is ONLY for Debugging purposes and cannot be applied for the Release version. Before publishing your app, you should generate your UserSig from your server. Refers to: +Caveat: Importing UserSig to your application is ONLY for Debugging purposes and cannot be applied for the Release version. Before publishing your app, you should generate your UserSig from your server. Refers to: ### Step 5. Implementing the conversation list page @@ -215,7 +289,7 @@ The only parameter you need to provide at least is `onTapItem` callback, aimed a ```dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class Conversation extends StatelessWidget { const Conversation({Key? key}) : super(key: key); @@ -255,7 +329,7 @@ It is recommended to provide a `onTapAvatar` callback function, for navigating t ```dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class Chat extends StatelessWidget { final V2TimConversation selectedConversation; @@ -298,7 +372,7 @@ The only parameter you have to provide at least is 'userID', while this componen ```dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class UserProfile extends StatelessWidget { final String userID; @@ -323,13 +397,13 @@ class UserProfile extends StatelessWidget { Now, your app can send/receive messages, show the conversation list, and deal with the contact friendship. -You can use others components from TUIKit continually to implement the complete IM function quickly and easily. +You can use others components from TUIKit continually to implement the complete Chat module quickly and easily. ## FAQs -### Do I need to integrate IM SDK after integrating TUIKit? +### Do I need to integrate Chat SDK after integrating TUIKit? -No. You don't need to integrate IM SDK again. If you want to use IM SDK related APIs, you can get them via `TIMUIKitCore.getSDKInstance()`. This method is recommended to ensure IM SDK version consistency. +No. You don't need to integrate Chat SDK again. If you want to use Chat SDK related APIs, you can get them via `TIMUIKitCore.getSDKInstance()`. This method is recommended to ensure Chat SDK version consistency. ### Why did force quit occur when I sent voice, image, file or other messages? @@ -397,7 +471,7 @@ Please do not hesitate to contact us in the following place, if you have any fur - WhatsApp Group: - QQ Group: 788910197, chat in Chinese -Our Website: +Our Website: --- @@ -408,12 +482,12 @@ Our Website: `TIMUIKitCore` provides two static methods, including `getInstance` and `getSDKInstance`。 - `getInstance`: Used for get the instance of `CoreServicesImpl`. -- `getSDKInstance`: Used for get the instance of IM SDK. +- `getSDKInstance`: Used for get the instance of Chat SDK. `CoreServicesImpl` is the main class of `TUIKit` , providing the methods includes initialization, logging in and out, getting user information, etc. ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); final V2TIMManager _sdkInstance = TIMUIKitCore.getSDKInstance(); @@ -431,7 +505,7 @@ _coreInstance.unInit(); // login _coreInstance.login( userID: 0, // user ID - userSig: "" // [How do I calculate UserSig on the server?](https://www.tencentcloud.com/document/product/1047/34385) + userSig: "" // [How do I calculate UserSig on the server?](https://www.tencentcloud.com/document/product/1047/34385?from=pub) ) // logout @@ -497,13 +571,13 @@ This listener is used to get information including: errors form SDK API / errors Determine the type by `TIMCallbackType`. -> You may refer to our [DEMO](https://github.com/TencentCloud/TIMSDK/blob/master/Flutter/Demo/im-flutter-uikit/lib/src/pages/app.dart) for the codes in this part, and modifying up to your business needs. +> You may refer to our [DEMO](https://github.com/TencentCloud/tc-chat-demo-flutter/lib/src/pages/app.dart) for the codes in this part, and modifying up to your business needs. ##### Errors form SDK API(`TIMCallbackType.API_ERROR`) In this scenario, SDK API original `errorMsg` and `errorCode` are provided. -[Error codes listed here](https://www.tencentcloud.com/document/product/1047/34348) +[Error codes listed here](https://www.tencentcloud.com/document/product/1047/34348?from=pub) #### Errors form Flutter(`TIMCallbackType.FLUTTER_ERROR`) @@ -580,7 +654,7 @@ All info codes are listed below: The corresponding controller: `TIMUIKitConversationController` is also provided. ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final TIMUIKitConversationController _controller = TIMUIKitConversationController(); @@ -644,17 +718,17 @@ Currently supported message parsing: - File message. ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; TIMUIKitChat( lifeCycle: ChatLifeCycle(), // Lifecycle hook for TIMUIKitChat conversationID: "", // User ID or Group ID conversationType: ConversationType, // 1 is c2c chat, 2 is group chat - conversationShowName: "", + conversationShowName: "", appBarActions: [], // appBar operation item, which can be used to jump to the page of group details and personal details, etc. onTapAvatar: _onTapAvatar, // callback function for clicking the avatar, which can be used to jump to the user profile. messageItemBuilder: (MessageItemBuilder) { - // Message item layout constructor, you can choose to customize part of the message type or message row layout. + // Message item layout constructor, you can choose to customize part of the message type or message row layout. }, extraTipsActionItemBuilder: (message) { // The configuration for the menu, opend by long pressed messages @@ -685,10 +759,10 @@ TIMUIKitProfile( profileWidgetBuilder: ProfileWidgetBuilder(), // Customized some kinds of item. profileWidgetsOrder: List, // Determine the vertical sequence for those profile widgets. builder: ( - BuildContext context, - V2TimFriendInfo friendInfo, - V2TimConversation conversation, - int friendType, + BuildContext context, + V2TimFriendInfo friendInfo, + V2TimConversation conversation, + int friendType, bool isMute) { // Customized the whole page. `profileWidgetBuilder` and `profileWidgetsOrder` will no longer works if you define this. }, @@ -704,7 +778,7 @@ TIMUIKitProfile( ```dart TIMUIKitGroupProfile( - groupID: "", + groupID: "", profileWidgetBuilder: GroupProfileWidgetBuilder(), // Customized some kinds of item. profileWidgetsOrder: List, // Determine the vertical sequence for those profile widgets. builder: (BuildContext context, V2TimGroupInfo groupInfo, List groupMemberList){ @@ -750,7 +824,7 @@ TIMUIKitGroup( `TIMUIKitContact` shows the list of contacts. ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; TIMUIKitContact( lifeCycle: FriendListLifeCycle(), // Lifecycle hook for TIMUIKitContact @@ -773,7 +847,7 @@ TIMUIKitContact( `TIMUIKitSearchMsgDetail` is an intra-conversation search component that can search for chat records for a specific conversation. ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; // Search globally TIMUIKitSearch( @@ -789,6 +863,21 @@ TIMUIKitSearchMsgDetail( ); ``` +## What's more + +In addition to Flutter SDK, we have numerous SDKs that covering all platforms. The following platforms can communicate with each other and provide services across devices and platforms. + +| Platform | Introduction | Demo | Download | UI Components library | +| --- | --- | --- | --- | --- | +| Android | Compatible with JDK 1.6 and Android SDK version 14 and later | [Get](https://www.tencentcloud.com/document/product/1047/34279) | [Get](https://github.com/TencentCloud/TIMSDK/tree/master/Android/IMSDK) | [Get](https://www.tencentcloud.com/document/product/1047/50062) | +| iOS | Compatible with iOS 8.0 and later | [Get](https://www.tencentcloud.com/document/product/1047/34279) | [Get](https://github.com/TencentCloud/TIMSDK/tree/master/iOS/IMSDK) | [Get](https://www.tencentcloud.com/document/product/1047/50062) | +| Mac | Compatible with OS X 10.10 and later | - | [Get](https://github.com/TencentCloud/TIMSDK/tree/master/Mac/IMSDK) | - | +| Windows | C and C++ are included. Compatible with Windows 7, Windows 8 and 8.1, and Windows 10. Both 32-bit and 64-bit programs can be connected | - | [Get](https://github.com/TencentCloud/TIMSDK/tree/master/Windows/IMSDK) | - | +| Web | Supports Internet Explorer 11+, Chrome 7+, Firefox 3.6+, Opera 12+ and Safari 6+ | [Get](https://www.tencentcloud.com/document/product/1047/34279) | [Get](https://www.npmjs.com/package/tim-js-sdk) | [Get](https://www.tencentcloud.com/document/product/1047/50061) | +| Unity | Supports 2020.2.7f1c1 or later | - | [Get](https://www.tencentcloud.com/document/product/1047/46263) | - | +| Flutter | Supports Flutter 2 & dart 2.12 and later, deploying to Android, iOS, Web, macOS and Windows. | [Get](https://www.tencentcloud.com/document/product/1047/34279) | Here | [Get](https://pub.dev/packages/tencent_cloud_chat_uikit) | +| Electron | Electron SDK | - | [Get](https://github.com/tencentyun/im_electron_demo) | - | + ## Contact Us Please do not hesitate to contact us in the following place, if you have any further questions or tend to learn more about the use cases. @@ -797,4 +886,4 @@ Please do not hesitate to contact us in the following place, if you have any fur - WhatsApp Group: - QQ Group: 788910197, chat in Chinese -Our Website: \ No newline at end of file +Our Website: \ No newline at end of file diff --git a/README_ZH.md b/README_ZH.md index 370508a..dc39597 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -1,4 +1,4 @@ -[English](https://github.com/TencentCloud/TIMSDK/blob/master/Flutter/IMSDK/tim_ui_kit/README.md) | 简体中文 +[English](https://github.com/TencentCloud/tc-chat-uikit-flutter) | 简体中文 # Flutter TUIKit @@ -54,7 +54,7 @@ TUIKit 是基于 IM SDK 实现的一套 UI 组件,其包含会话、聊天、 基础用法如下,先初始化IM,再登录用户: ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); final V2TIMManager _sdkInstance = TIMUIKitCore.getSDKInstance(); @@ -82,7 +82,7 @@ _coreInstance.login( 通过`TIMCallbackType`确定类型。 -> 这部分的处理逻辑[可参考我们的 DEMO](https://github.com/TencentCloud/TIMSDK/blob/master/Flutter/Demo/im-flutter-uikit/lib/src/pages/app.dart),并根据您的需要,自行修改。 +> 这部分的处理逻辑[可参考我们的 DEMO](https://github.com/TencentCloud/tc-chat-demo-flutter/lib/src/pages/app.dart),并根据您的需要,自行修改。 #### SDK API 错误(`TIMCallbackType.API_ERROR`) @@ -170,19 +170,19 @@ _coreInstance.login( #### 方法 -- **loadData(int count)**: +- **loadData(int count)**: 加载会话列表, count 为单次加载数量 -- **reloadData(int count)**: +- **reloadData(int count)**: 重新加载会话列表, count 为单次加载数量 - **pinConversation({required String conversationID, required bool isPinned})**: 会话置顶 -- **clearHistoryMessage({required V2TimConversation conversation})**: +- **clearHistoryMessage({required V2TimConversation conversation})**: 清除指定会话消息 -- **deleteConversation({required String conversationID})**: +- **deleteConversation({required String conversationID})**: 删除指定会话 -- **setConversationListener({V2TimConversationListener? listener})**: +- **setConversationListener({V2TimConversationListener? listener})**: 添加会话监听器 -- **dipose()**: +- **dipose()**: 销毁 --- @@ -226,19 +226,19 @@ _coreInstance.login( ### TIMUIKitProfileController -- **pinedConversation(bool isPined, String convID)**: +- **pinedConversation(bool isPined, String convID)**: 会话置顶, `isPined` 为是否置顶,`convID` 为需要置顶的会话 ID. -- **addUserToBlackList(bool shouldAdd, String userID)**: +- **addUserToBlackList(bool shouldAdd, String userID)**: 添加用户至黑名单, `shouldAdd`为是否需要添加至黑名单, `userID`为需要被添加到黑名单的用户. -- **changeFriendVerificationMethod(int allowType)**: +- **changeFriendVerificationMethod(int allowType)**: 更改好友验证方式, `0`为"同意任何用户添加好友"、`1`为"需要验证"、`2`为"拒绝任何人加好友". -- **updateRemarks(String userID, String remark)**: +- **updateRemarks(String userID, String remark)**: 更新好友备注, `userID`为被更新的用户 ID, `remark`为备注. -- **loadData**: +- **loadData**: 加载数据 -- **dispose()**: +- **dispose()**: 销毁 -- **addFriend(String userID)**: +- **addFriend(String userID)**: 添加好友,`userID`为被添加好友的用户 ID. --- @@ -285,7 +285,7 @@ _coreInstance.login( [详细用法可参考此文档](https://cloud.tencent.com/document/product/269/79121) ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; // 全局搜索 TIMUIKitSearch( @@ -394,10 +394,10 @@ TIMUIKitSearchMsgDetail( ```dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/controller/tim_uikit_chat_controller.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_chat_controller.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_history_message_list.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart'; class Chat extends StatefulWidget { final V2TimConversation selectedConversation; diff --git a/assets/custom_face_resource/4349/[NO]@2x.png b/assets/custom_face_resource/4349/[NO]@2x.png new file mode 100644 index 0000000..b7ae6d7 Binary files /dev/null and b/assets/custom_face_resource/4349/[NO]@2x.png differ diff --git a/assets/custom_face_resource/4349/[OK]@2x.png b/assets/custom_face_resource/4349/[OK]@2x.png new file mode 100644 index 0000000..e723cb6 Binary files /dev/null and b/assets/custom_face_resource/4349/[OK]@2x.png differ diff --git a/assets/custom_face_resource/4349/[下雨]@2x.png b/assets/custom_face_resource/4349/[下雨]@2x.png new file mode 100644 index 0000000..d049b49 Binary files /dev/null and b/assets/custom_face_resource/4349/[下雨]@2x.png differ diff --git a/assets/custom_face_resource/4349/[么么哒]@2x.png b/assets/custom_face_resource/4349/[么么哒]@2x.png new file mode 100644 index 0000000..f47fa56 Binary files /dev/null and b/assets/custom_face_resource/4349/[么么哒]@2x.png differ diff --git a/assets/custom_face_resource/4349/[乒乓]@2x.png b/assets/custom_face_resource/4349/[乒乓]@2x.png new file mode 100644 index 0000000..56f307d Binary files /dev/null and b/assets/custom_face_resource/4349/[乒乓]@2x.png differ diff --git a/assets/custom_face_resource/4349/[便便]@2x.png b/assets/custom_face_resource/4349/[便便]@2x.png new file mode 100644 index 0000000..adf4cc2 Binary files /dev/null and b/assets/custom_face_resource/4349/[便便]@2x.png differ diff --git a/assets/custom_face_resource/4349/[信封]@2x.png b/assets/custom_face_resource/4349/[信封]@2x.png new file mode 100644 index 0000000..c571ad2 Binary files /dev/null and b/assets/custom_face_resource/4349/[信封]@2x.png differ diff --git a/assets/custom_face_resource/4349/[偷笑]@2x.png b/assets/custom_face_resource/4349/[偷笑]@2x.png new file mode 100644 index 0000000..a303375 Binary files /dev/null and b/assets/custom_face_resource/4349/[偷笑]@2x.png differ diff --git a/assets/custom_face_resource/4349/[傲慢]@2x.png b/assets/custom_face_resource/4349/[傲慢]@2x.png new file mode 100644 index 0000000..34fa967 Binary files /dev/null and b/assets/custom_face_resource/4349/[傲慢]@2x.png differ diff --git a/assets/custom_face_resource/4349/[再见]@2x.png b/assets/custom_face_resource/4349/[再见]@2x.png new file mode 100644 index 0000000..497e464 Binary files /dev/null and b/assets/custom_face_resource/4349/[再见]@2x.png differ diff --git a/assets/custom_face_resource/4349/[冷汗]@2x.png b/assets/custom_face_resource/4349/[冷汗]@2x.png new file mode 100644 index 0000000..137ec0f Binary files /dev/null and b/assets/custom_face_resource/4349/[冷汗]@2x.png differ diff --git a/assets/custom_face_resource/4349/[凋谢]@2x.png b/assets/custom_face_resource/4349/[凋谢]@2x.png new file mode 100644 index 0000000..dd05090 Binary files /dev/null and b/assets/custom_face_resource/4349/[凋谢]@2x.png differ diff --git a/assets/custom_face_resource/4349/[刀]@2x.png b/assets/custom_face_resource/4349/[刀]@2x.png new file mode 100644 index 0000000..ab4fc8d Binary files /dev/null and b/assets/custom_face_resource/4349/[刀]@2x.png differ diff --git a/assets/custom_face_resource/4349/[删除]@2x.png b/assets/custom_face_resource/4349/[删除]@2x.png new file mode 100644 index 0000000..113e20f Binary files /dev/null and b/assets/custom_face_resource/4349/[删除]@2x.png differ diff --git a/assets/custom_face_resource/4349/[勾引]@2x.png b/assets/custom_face_resource/4349/[勾引]@2x.png new file mode 100644 index 0000000..04060f5 Binary files /dev/null and b/assets/custom_face_resource/4349/[勾引]@2x.png differ diff --git a/assets/custom_face_resource/4349/[发呆]@2x.png b/assets/custom_face_resource/4349/[发呆]@2x.png new file mode 100644 index 0000000..d8393d9 Binary files /dev/null and b/assets/custom_face_resource/4349/[发呆]@2x.png differ diff --git a/assets/custom_face_resource/4349/[发抖]@2x.png b/assets/custom_face_resource/4349/[发抖]@2x.png new file mode 100644 index 0000000..094ed1d Binary files /dev/null and b/assets/custom_face_resource/4349/[发抖]@2x.png differ diff --git a/assets/custom_face_resource/4349/[可怜]@2x.png b/assets/custom_face_resource/4349/[可怜]@2x.png new file mode 100644 index 0000000..73963b7 Binary files /dev/null and b/assets/custom_face_resource/4349/[可怜]@2x.png differ diff --git a/assets/custom_face_resource/4349/[可爱]@2x.png b/assets/custom_face_resource/4349/[可爱]@2x.png new file mode 100644 index 0000000..a235324 Binary files /dev/null and b/assets/custom_face_resource/4349/[可爱]@2x.png differ diff --git a/assets/custom_face_resource/4349/[右哼哼]@2x.png b/assets/custom_face_resource/4349/[右哼哼]@2x.png new file mode 100644 index 0000000..e1ca267 Binary files /dev/null and b/assets/custom_face_resource/4349/[右哼哼]@2x.png differ diff --git a/assets/custom_face_resource/4349/[右太极]@2x.png b/assets/custom_face_resource/4349/[右太极]@2x.png new file mode 100644 index 0000000..6b55dfb Binary files /dev/null and b/assets/custom_face_resource/4349/[右太极]@2x.png differ diff --git a/assets/custom_face_resource/4349/[右车头]@2x.png b/assets/custom_face_resource/4349/[右车头]@2x.png new file mode 100644 index 0000000..85fdb86 Binary files /dev/null and b/assets/custom_face_resource/4349/[右车头]@2x.png differ diff --git a/assets/custom_face_resource/4349/[吐]@2x.png b/assets/custom_face_resource/4349/[吐]@2x.png new file mode 100644 index 0000000..0265a28 Binary files /dev/null and b/assets/custom_face_resource/4349/[吐]@2x.png differ diff --git a/assets/custom_face_resource/4349/[吓]@2x.png b/assets/custom_face_resource/4349/[吓]@2x.png new file mode 100644 index 0000000..b03f3b6 Binary files /dev/null and b/assets/custom_face_resource/4349/[吓]@2x.png differ diff --git a/assets/custom_face_resource/4349/[咒骂]@2x.png b/assets/custom_face_resource/4349/[咒骂]@2x.png new file mode 100644 index 0000000..c65faa6 Binary files /dev/null and b/assets/custom_face_resource/4349/[咒骂]@2x.png differ diff --git a/assets/custom_face_resource/4349/[咖啡]@2x.png b/assets/custom_face_resource/4349/[咖啡]@2x.png new file mode 100644 index 0000000..dd595d3 Binary files /dev/null and b/assets/custom_face_resource/4349/[咖啡]@2x.png differ diff --git a/assets/custom_face_resource/4349/[啤酒]@2x.png b/assets/custom_face_resource/4349/[啤酒]@2x.png new file mode 100644 index 0000000..52289b0 Binary files /dev/null and b/assets/custom_face_resource/4349/[啤酒]@2x.png differ diff --git a/assets/custom_face_resource/4349/[嘘]@2x.png b/assets/custom_face_resource/4349/[嘘]@2x.png new file mode 100644 index 0000000..e011a35 Binary files /dev/null and b/assets/custom_face_resource/4349/[嘘]@2x.png differ diff --git a/assets/custom_face_resource/4349/[回头]@2x.png b/assets/custom_face_resource/4349/[回头]@2x.png new file mode 100644 index 0000000..84660e2 Binary files /dev/null and b/assets/custom_face_resource/4349/[回头]@2x.png differ diff --git a/assets/custom_face_resource/4349/[困]@2x.png b/assets/custom_face_resource/4349/[困]@2x.png new file mode 100644 index 0000000..cc0447f Binary files /dev/null and b/assets/custom_face_resource/4349/[困]@2x.png differ diff --git a/assets/custom_face_resource/4349/[坏笑]@2x.png b/assets/custom_face_resource/4349/[坏笑]@2x.png new file mode 100644 index 0000000..36f3c32 Binary files /dev/null and b/assets/custom_face_resource/4349/[坏笑]@2x.png differ diff --git a/assets/custom_face_resource/4349/[多云]@2x.png b/assets/custom_face_resource/4349/[多云]@2x.png new file mode 100644 index 0000000..71d23d6 Binary files /dev/null and b/assets/custom_face_resource/4349/[多云]@2x.png differ diff --git a/assets/custom_face_resource/4349/[大兵]@2x.png b/assets/custom_face_resource/4349/[大兵]@2x.png new file mode 100644 index 0000000..94b0d52 Binary files /dev/null and b/assets/custom_face_resource/4349/[大兵]@2x.png differ diff --git a/assets/custom_face_resource/4349/[大哭]@2x.png b/assets/custom_face_resource/4349/[大哭]@2x.png new file mode 100644 index 0000000..e816c56 Binary files /dev/null and b/assets/custom_face_resource/4349/[大哭]@2x.png differ diff --git a/assets/custom_face_resource/4349/[太阳]@2x.png b/assets/custom_face_resource/4349/[太阳]@2x.png new file mode 100644 index 0000000..a0d229a Binary files /dev/null and b/assets/custom_face_resource/4349/[太阳]@2x.png differ diff --git a/assets/custom_face_resource/4349/[奋斗]@2x.png b/assets/custom_face_resource/4349/[奋斗]@2x.png new file mode 100644 index 0000000..3347c97 Binary files /dev/null and b/assets/custom_face_resource/4349/[奋斗]@2x.png differ diff --git a/assets/custom_face_resource/4349/[奶瓶]@2x.png b/assets/custom_face_resource/4349/[奶瓶]@2x.png new file mode 100644 index 0000000..0d4b8d9 Binary files /dev/null and b/assets/custom_face_resource/4349/[奶瓶]@2x.png differ diff --git a/assets/custom_face_resource/4349/[委屈]@2x.png b/assets/custom_face_resource/4349/[委屈]@2x.png new file mode 100644 index 0000000..3f136dd Binary files /dev/null and b/assets/custom_face_resource/4349/[委屈]@2x.png differ diff --git a/assets/custom_face_resource/4349/[害羞]@2x.png b/assets/custom_face_resource/4349/[害羞]@2x.png new file mode 100644 index 0000000..30a9341 Binary files /dev/null and b/assets/custom_face_resource/4349/[害羞]@2x.png differ diff --git a/assets/custom_face_resource/4349/[尴尬]@2x.png b/assets/custom_face_resource/4349/[尴尬]@2x.png new file mode 100644 index 0000000..62afd7e Binary files /dev/null and b/assets/custom_face_resource/4349/[尴尬]@2x.png differ diff --git a/assets/custom_face_resource/4349/[左哼哼]@2x.png b/assets/custom_face_resource/4349/[左哼哼]@2x.png new file mode 100644 index 0000000..e6f64df Binary files /dev/null and b/assets/custom_face_resource/4349/[左哼哼]@2x.png differ diff --git a/assets/custom_face_resource/4349/[左太极]@2x.png b/assets/custom_face_resource/4349/[左太极]@2x.png new file mode 100644 index 0000000..5a88a56 Binary files /dev/null and b/assets/custom_face_resource/4349/[左太极]@2x.png differ diff --git a/assets/custom_face_resource/4349/[左车头]@2x.png b/assets/custom_face_resource/4349/[左车头]@2x.png new file mode 100644 index 0000000..e05c11c Binary files /dev/null and b/assets/custom_face_resource/4349/[左车头]@2x.png differ diff --git a/assets/custom_face_resource/4349/[差劲]@2x.png b/assets/custom_face_resource/4349/[差劲]@2x.png new file mode 100644 index 0000000..455365a Binary files /dev/null and b/assets/custom_face_resource/4349/[差劲]@2x.png differ diff --git a/assets/custom_face_resource/4349/[弱]@2x.png b/assets/custom_face_resource/4349/[弱]@2x.png new file mode 100644 index 0000000..fe5fbf9 Binary files /dev/null and b/assets/custom_face_resource/4349/[弱]@2x.png differ diff --git a/assets/custom_face_resource/4349/[强]@2x.png b/assets/custom_face_resource/4349/[强]@2x.png new file mode 100644 index 0000000..f4f7a5b Binary files /dev/null and b/assets/custom_face_resource/4349/[强]@2x.png differ diff --git a/assets/custom_face_resource/4349/[彩带]@2x.png b/assets/custom_face_resource/4349/[彩带]@2x.png new file mode 100644 index 0000000..88cd3f0 Binary files /dev/null and b/assets/custom_face_resource/4349/[彩带]@2x.png differ diff --git a/assets/custom_face_resource/4349/[彩球]@2x.png b/assets/custom_face_resource/4349/[彩球]@2x.png new file mode 100644 index 0000000..8a60eed Binary files /dev/null and b/assets/custom_face_resource/4349/[彩球]@2x.png differ diff --git a/assets/custom_face_resource/4349/[得意]@2x.png b/assets/custom_face_resource/4349/[得意]@2x.png new file mode 100644 index 0000000..4027f8c Binary files /dev/null and b/assets/custom_face_resource/4349/[得意]@2x.png differ diff --git a/assets/custom_face_resource/4349/[心碎了]@2x.png b/assets/custom_face_resource/4349/[心碎了]@2x.png new file mode 100644 index 0000000..a11ed0f Binary files /dev/null and b/assets/custom_face_resource/4349/[心碎了]@2x.png differ diff --git a/assets/custom_face_resource/4349/[快哭了]@2x.png b/assets/custom_face_resource/4349/[快哭了]@2x.png new file mode 100644 index 0000000..8f49f69 Binary files /dev/null and b/assets/custom_face_resource/4349/[快哭了]@2x.png differ diff --git a/assets/custom_face_resource/4349/[怄火]@2x.png b/assets/custom_face_resource/4349/[怄火]@2x.png new file mode 100644 index 0000000..7277dae Binary files /dev/null and b/assets/custom_face_resource/4349/[怄火]@2x.png differ diff --git a/assets/custom_face_resource/4349/[怒]@2x.png b/assets/custom_face_resource/4349/[怒]@2x.png new file mode 100644 index 0000000..a4e4a69 Binary files /dev/null and b/assets/custom_face_resource/4349/[怒]@2x.png differ diff --git a/assets/custom_face_resource/4349/[惊恐]@2x.png b/assets/custom_face_resource/4349/[惊恐]@2x.png new file mode 100644 index 0000000..617810a Binary files /dev/null and b/assets/custom_face_resource/4349/[惊恐]@2x.png differ diff --git a/assets/custom_face_resource/4349/[惊讶]@2x.png b/assets/custom_face_resource/4349/[惊讶]@2x.png new file mode 100644 index 0000000..df93544 Binary files /dev/null and b/assets/custom_face_resource/4349/[惊讶]@2x.png differ diff --git a/assets/custom_face_resource/4349/[憨笑]@2x.png b/assets/custom_face_resource/4349/[憨笑]@2x.png new file mode 100644 index 0000000..4c5b4ba Binary files /dev/null and b/assets/custom_face_resource/4349/[憨笑]@2x.png differ diff --git a/assets/custom_face_resource/4349/[手枪]@2x.png b/assets/custom_face_resource/4349/[手枪]@2x.png new file mode 100644 index 0000000..58af826 Binary files /dev/null and b/assets/custom_face_resource/4349/[手枪]@2x.png differ diff --git a/assets/custom_face_resource/4349/[打哈欠]@2x.png b/assets/custom_face_resource/4349/[打哈欠]@2x.png new file mode 100644 index 0000000..14490ce Binary files /dev/null and b/assets/custom_face_resource/4349/[打哈欠]@2x.png differ diff --git a/assets/custom_face_resource/4349/[抓狂]@2x.png b/assets/custom_face_resource/4349/[抓狂]@2x.png new file mode 100644 index 0000000..0556a4d Binary files /dev/null and b/assets/custom_face_resource/4349/[抓狂]@2x.png differ diff --git a/assets/custom_face_resource/4349/[折磨]@2x.png b/assets/custom_face_resource/4349/[折磨]@2x.png new file mode 100644 index 0000000..d9dfd53 Binary files /dev/null and b/assets/custom_face_resource/4349/[折磨]@2x.png differ diff --git a/assets/custom_face_resource/4349/[抠鼻]@2x.png b/assets/custom_face_resource/4349/[抠鼻]@2x.png new file mode 100644 index 0000000..cbc61e8 Binary files /dev/null and b/assets/custom_face_resource/4349/[抠鼻]@2x.png differ diff --git a/assets/custom_face_resource/4349/[抱抱]@2x.png b/assets/custom_face_resource/4349/[抱抱]@2x.png new file mode 100644 index 0000000..828971e Binary files /dev/null and b/assets/custom_face_resource/4349/[抱抱]@2x.png differ diff --git a/assets/custom_face_resource/4349/[抱拳]@2x.png b/assets/custom_face_resource/4349/[抱拳]@2x.png new file mode 100644 index 0000000..95b5ee0 Binary files /dev/null and b/assets/custom_face_resource/4349/[抱拳]@2x.png differ diff --git a/assets/custom_face_resource/4349/[拳头]@2x.png b/assets/custom_face_resource/4349/[拳头]@2x.png new file mode 100644 index 0000000..6d501d3 Binary files /dev/null and b/assets/custom_face_resource/4349/[拳头]@2x.png differ diff --git a/assets/custom_face_resource/4349/[挥手]@2x.png b/assets/custom_face_resource/4349/[挥手]@2x.png new file mode 100644 index 0000000..ad5d3e0 Binary files /dev/null and b/assets/custom_face_resource/4349/[挥手]@2x.png differ diff --git a/assets/custom_face_resource/4349/[握手]@2x.png b/assets/custom_face_resource/4349/[握手]@2x.png new file mode 100644 index 0000000..10a615b Binary files /dev/null and b/assets/custom_face_resource/4349/[握手]@2x.png differ diff --git a/assets/custom_face_resource/4349/[撇嘴]@2x.png b/assets/custom_face_resource/4349/[撇嘴]@2x.png new file mode 100644 index 0000000..d8839f4 Binary files /dev/null and b/assets/custom_face_resource/4349/[撇嘴]@2x.png differ diff --git a/assets/custom_face_resource/4349/[擦汗]@2x.png b/assets/custom_face_resource/4349/[擦汗]@2x.png new file mode 100644 index 0000000..8804e98 Binary files /dev/null and b/assets/custom_face_resource/4349/[擦汗]@2x.png differ diff --git a/assets/custom_face_resource/4349/[敲打]@2x.png b/assets/custom_face_resource/4349/[敲打]@2x.png new file mode 100644 index 0000000..3dfff7b Binary files /dev/null and b/assets/custom_face_resource/4349/[敲打]@2x.png differ diff --git a/assets/custom_face_resource/4349/[晕]@2x.png b/assets/custom_face_resource/4349/[晕]@2x.png new file mode 100644 index 0000000..2bd83a4 Binary files /dev/null and b/assets/custom_face_resource/4349/[晕]@2x.png differ diff --git a/assets/custom_face_resource/4349/[月亮]@2x.png b/assets/custom_face_resource/4349/[月亮]@2x.png new file mode 100644 index 0000000..eb37fb9 Binary files /dev/null and b/assets/custom_face_resource/4349/[月亮]@2x.png differ diff --git a/assets/custom_face_resource/4349/[棒棒糖]@2x.png b/assets/custom_face_resource/4349/[棒棒糖]@2x.png new file mode 100644 index 0000000..4f58458 Binary files /dev/null and b/assets/custom_face_resource/4349/[棒棒糖]@2x.png differ diff --git a/assets/custom_face_resource/4349/[汽车]@2x.png b/assets/custom_face_resource/4349/[汽车]@2x.png new file mode 100644 index 0000000..14363af Binary files /dev/null and b/assets/custom_face_resource/4349/[汽车]@2x.png differ diff --git a/assets/custom_face_resource/4349/[沙发]@2x.png b/assets/custom_face_resource/4349/[沙发]@2x.png new file mode 100644 index 0000000..87d233a Binary files /dev/null and b/assets/custom_face_resource/4349/[沙发]@2x.png differ diff --git a/assets/custom_face_resource/4349/[流汗]@2x.png b/assets/custom_face_resource/4349/[流汗]@2x.png new file mode 100644 index 0000000..d835eeb Binary files /dev/null and b/assets/custom_face_resource/4349/[流汗]@2x.png differ diff --git a/assets/custom_face_resource/4349/[流泪]@2x.png b/assets/custom_face_resource/4349/[流泪]@2x.png new file mode 100644 index 0000000..61dab0a Binary files /dev/null and b/assets/custom_face_resource/4349/[流泪]@2x.png differ diff --git a/assets/custom_face_resource/4349/[激动]@2x.png b/assets/custom_face_resource/4349/[激动]@2x.png new file mode 100644 index 0000000..262b317 Binary files /dev/null and b/assets/custom_face_resource/4349/[激动]@2x.png differ diff --git a/assets/custom_face_resource/4349/[灯泡]@2x.png b/assets/custom_face_resource/4349/[灯泡]@2x.png new file mode 100644 index 0000000..b61a829 Binary files /dev/null and b/assets/custom_face_resource/4349/[灯泡]@2x.png differ diff --git a/assets/custom_face_resource/4349/[炸弹]@2x.png b/assets/custom_face_resource/4349/[炸弹]@2x.png new file mode 100644 index 0000000..62b5736 Binary files /dev/null and b/assets/custom_face_resource/4349/[炸弹]@2x.png differ diff --git a/assets/custom_face_resource/4349/[熊猫]@2x.png b/assets/custom_face_resource/4349/[熊猫]@2x.png new file mode 100644 index 0000000..e4088f8 Binary files /dev/null and b/assets/custom_face_resource/4349/[熊猫]@2x.png differ diff --git a/assets/custom_face_resource/4349/[爆筋]@2x.png b/assets/custom_face_resource/4349/[爆筋]@2x.png new file mode 100644 index 0000000..af054a7 Binary files /dev/null and b/assets/custom_face_resource/4349/[爆筋]@2x.png differ diff --git a/assets/custom_face_resource/4349/[爱你]@2x.png b/assets/custom_face_resource/4349/[爱你]@2x.png new file mode 100644 index 0000000..5be2bd0 Binary files /dev/null and b/assets/custom_face_resource/4349/[爱你]@2x.png differ diff --git a/assets/custom_face_resource/4349/[爱心]@2x.png b/assets/custom_face_resource/4349/[爱心]@2x.png new file mode 100644 index 0000000..4474769 Binary files /dev/null and b/assets/custom_face_resource/4349/[爱心]@2x.png differ diff --git a/assets/custom_face_resource/4349/[爱情]@2x.png b/assets/custom_face_resource/4349/[爱情]@2x.png new file mode 100644 index 0000000..4f2263d Binary files /dev/null and b/assets/custom_face_resource/4349/[爱情]@2x.png differ diff --git a/assets/custom_face_resource/4349/[猪头]@2x.png b/assets/custom_face_resource/4349/[猪头]@2x.png new file mode 100644 index 0000000..535548b Binary files /dev/null and b/assets/custom_face_resource/4349/[猪头]@2x.png differ diff --git a/assets/custom_face_resource/4349/[猫咪]@2x.png b/assets/custom_face_resource/4349/[猫咪]@2x.png new file mode 100644 index 0000000..c0b1a89 Binary files /dev/null and b/assets/custom_face_resource/4349/[猫咪]@2x.png differ diff --git a/assets/custom_face_resource/4349/[献吻]@2x.png b/assets/custom_face_resource/4349/[献吻]@2x.png new file mode 100644 index 0000000..33da041 Binary files /dev/null and b/assets/custom_face_resource/4349/[献吻]@2x.png differ diff --git a/assets/custom_face_resource/4349/[玫瑰]@2x.png b/assets/custom_face_resource/4349/[玫瑰]@2x.png new file mode 100644 index 0000000..faac04b Binary files /dev/null and b/assets/custom_face_resource/4349/[玫瑰]@2x.png differ diff --git a/assets/custom_face_resource/4349/[瓢虫]@2x.png b/assets/custom_face_resource/4349/[瓢虫]@2x.png new file mode 100644 index 0000000..8fcd467 Binary files /dev/null and b/assets/custom_face_resource/4349/[瓢虫]@2x.png differ diff --git a/assets/custom_face_resource/4349/[疑问]@2x.png b/assets/custom_face_resource/4349/[疑问]@2x.png new file mode 100644 index 0000000..72376dd Binary files /dev/null and b/assets/custom_face_resource/4349/[疑问]@2x.png differ diff --git a/assets/custom_face_resource/4349/[白眼]@2x.png b/assets/custom_face_resource/4349/[白眼]@2x.png new file mode 100644 index 0000000..0a8a259 Binary files /dev/null and b/assets/custom_face_resource/4349/[白眼]@2x.png differ diff --git a/assets/custom_face_resource/4349/[皮球]@2x.png b/assets/custom_face_resource/4349/[皮球]@2x.png new file mode 100644 index 0000000..6dcf45e Binary files /dev/null and b/assets/custom_face_resource/4349/[皮球]@2x.png differ diff --git a/assets/custom_face_resource/4349/[睡觉]@2x.png b/assets/custom_face_resource/4349/[睡觉]@2x.png new file mode 100644 index 0000000..aafb55f Binary files /dev/null and b/assets/custom_face_resource/4349/[睡觉]@2x.png differ diff --git a/assets/custom_face_resource/4349/[磕头]@2x.png b/assets/custom_face_resource/4349/[磕头]@2x.png new file mode 100644 index 0000000..817923a Binary files /dev/null and b/assets/custom_face_resource/4349/[磕头]@2x.png differ diff --git a/assets/custom_face_resource/4349/[示爱]@2x.png b/assets/custom_face_resource/4349/[示爱]@2x.png new file mode 100644 index 0000000..7be52ca Binary files /dev/null and b/assets/custom_face_resource/4349/[示爱]@2x.png differ diff --git a/assets/custom_face_resource/4349/[礼品袋]@2x.png b/assets/custom_face_resource/4349/[礼品袋]@2x.png new file mode 100644 index 0000000..5d017c8 Binary files /dev/null and b/assets/custom_face_resource/4349/[礼品袋]@2x.png differ diff --git a/assets/custom_face_resource/4349/[礼物]@2x.png b/assets/custom_face_resource/4349/[礼物]@2x.png new file mode 100644 index 0000000..5b606ff Binary files /dev/null and b/assets/custom_face_resource/4349/[礼物]@2x.png differ diff --git a/assets/custom_face_resource/4349/[篮球]@2x.png b/assets/custom_face_resource/4349/[篮球]@2x.png new file mode 100644 index 0000000..aee5674 Binary files /dev/null and b/assets/custom_face_resource/4349/[篮球]@2x.png differ diff --git a/assets/custom_face_resource/4349/[米饭]@2x.png b/assets/custom_face_resource/4349/[米饭]@2x.png new file mode 100644 index 0000000..2c469a9 Binary files /dev/null and b/assets/custom_face_resource/4349/[米饭]@2x.png differ diff --git a/assets/custom_face_resource/4349/[糗大了]@2x.png b/assets/custom_face_resource/4349/[糗大了]@2x.png new file mode 100644 index 0000000..4373f1b Binary files /dev/null and b/assets/custom_face_resource/4349/[糗大了]@2x.png differ diff --git a/assets/custom_face_resource/4349/[红双喜]@2x.png b/assets/custom_face_resource/4349/[红双喜]@2x.png new file mode 100644 index 0000000..b37d964 Binary files /dev/null and b/assets/custom_face_resource/4349/[红双喜]@2x.png differ diff --git a/assets/custom_face_resource/4349/[红灯笼]@2x.png b/assets/custom_face_resource/4349/[红灯笼]@2x.png new file mode 100644 index 0000000..bb432af Binary files /dev/null and b/assets/custom_face_resource/4349/[红灯笼]@2x.png differ diff --git a/assets/custom_face_resource/4349/[纸巾]@2x.png b/assets/custom_face_resource/4349/[纸巾]@2x.png new file mode 100644 index 0000000..10469fe Binary files /dev/null and b/assets/custom_face_resource/4349/[纸巾]@2x.png differ diff --git a/assets/custom_face_resource/4349/[胜利]@2x.png b/assets/custom_face_resource/4349/[胜利]@2x.png new file mode 100644 index 0000000..ac5cefa Binary files /dev/null and b/assets/custom_face_resource/4349/[胜利]@2x.png differ diff --git a/assets/custom_face_resource/4349/[色]@2x.png b/assets/custom_face_resource/4349/[色]@2x.png new file mode 100644 index 0000000..a45e109 Binary files /dev/null and b/assets/custom_face_resource/4349/[色]@2x.png differ diff --git a/assets/custom_face_resource/4349/[药]@2x.png b/assets/custom_face_resource/4349/[药]@2x.png new file mode 100644 index 0000000..1588f9e Binary files /dev/null and b/assets/custom_face_resource/4349/[药]@2x.png differ diff --git a/assets/custom_face_resource/4349/[菜刀]@2x.png b/assets/custom_face_resource/4349/[菜刀]@2x.png new file mode 100644 index 0000000..69072bb Binary files /dev/null and b/assets/custom_face_resource/4349/[菜刀]@2x.png differ diff --git a/assets/custom_face_resource/4349/[蛋糕]@2x.png b/assets/custom_face_resource/4349/[蛋糕]@2x.png new file mode 100644 index 0000000..279eb79 Binary files /dev/null and b/assets/custom_face_resource/4349/[蛋糕]@2x.png differ diff --git a/assets/custom_face_resource/4349/[蜡烛]@2x.png b/assets/custom_face_resource/4349/[蜡烛]@2x.png new file mode 100644 index 0000000..9f06f3e Binary files /dev/null and b/assets/custom_face_resource/4349/[蜡烛]@2x.png differ diff --git a/assets/custom_face_resource/4349/[街舞]@2x.png b/assets/custom_face_resource/4349/[街舞]@2x.png new file mode 100644 index 0000000..c8045d8 Binary files /dev/null and b/assets/custom_face_resource/4349/[街舞]@2x.png differ diff --git a/assets/custom_face_resource/4349/[衰]@2x.png b/assets/custom_face_resource/4349/[衰]@2x.png new file mode 100644 index 0000000..b055d46 Binary files /dev/null and b/assets/custom_face_resource/4349/[衰]@2x.png differ diff --git a/assets/custom_face_resource/4349/[西瓜]@2x.png b/assets/custom_face_resource/4349/[西瓜]@2x.png new file mode 100644 index 0000000..0d79d2a Binary files /dev/null and b/assets/custom_face_resource/4349/[西瓜]@2x.png differ diff --git a/assets/custom_face_resource/4349/[调皮]@2x.png b/assets/custom_face_resource/4349/[调皮]@2x.png new file mode 100644 index 0000000..11f0646 Binary files /dev/null and b/assets/custom_face_resource/4349/[调皮]@2x.png differ diff --git a/assets/custom_face_resource/4349/[象棋]@2x.png b/assets/custom_face_resource/4349/[象棋]@2x.png new file mode 100644 index 0000000..cf35cad Binary files /dev/null and b/assets/custom_face_resource/4349/[象棋]@2x.png differ diff --git a/assets/custom_face_resource/4349/[跳绳]@2x.png b/assets/custom_face_resource/4349/[跳绳]@2x.png new file mode 100644 index 0000000..17cffd3 Binary files /dev/null and b/assets/custom_face_resource/4349/[跳绳]@2x.png differ diff --git a/assets/custom_face_resource/4349/[跳跳]@2x.png b/assets/custom_face_resource/4349/[跳跳]@2x.png new file mode 100644 index 0000000..b5646c6 Binary files /dev/null and b/assets/custom_face_resource/4349/[跳跳]@2x.png differ diff --git a/assets/custom_face_resource/4349/[车厢]@2x.png b/assets/custom_face_resource/4349/[车厢]@2x.png new file mode 100644 index 0000000..a1276eb Binary files /dev/null and b/assets/custom_face_resource/4349/[车厢]@2x.png differ diff --git a/assets/custom_face_resource/4349/[转圈]@2x.png b/assets/custom_face_resource/4349/[转圈]@2x.png new file mode 100644 index 0000000..2c15311 Binary files /dev/null and b/assets/custom_face_resource/4349/[转圈]@2x.png differ diff --git a/assets/custom_face_resource/4349/[鄙视]@2x.png b/assets/custom_face_resource/4349/[鄙视]@2x.png new file mode 100644 index 0000000..65b1aec Binary files /dev/null and b/assets/custom_face_resource/4349/[鄙视]@2x.png differ diff --git a/assets/custom_face_resource/4349/[酷]@2x.png b/assets/custom_face_resource/4349/[酷]@2x.png new file mode 100644 index 0000000..06d8163 Binary files /dev/null and b/assets/custom_face_resource/4349/[酷]@2x.png differ diff --git a/assets/custom_face_resource/4349/[钞票]@2x.png b/assets/custom_face_resource/4349/[钞票]@2x.png new file mode 100644 index 0000000..7218532 Binary files /dev/null and b/assets/custom_face_resource/4349/[钞票]@2x.png differ diff --git a/assets/custom_face_resource/4349/[钻戒]@2x.png b/assets/custom_face_resource/4349/[钻戒]@2x.png new file mode 100644 index 0000000..787cb6a Binary files /dev/null and b/assets/custom_face_resource/4349/[钻戒]@2x.png differ diff --git a/assets/custom_face_resource/4349/[闪电]@2x.png b/assets/custom_face_resource/4349/[闪电]@2x.png new file mode 100644 index 0000000..84f1526 Binary files /dev/null and b/assets/custom_face_resource/4349/[闪电]@2x.png differ diff --git a/assets/custom_face_resource/4349/[闭嘴]@2x.png b/assets/custom_face_resource/4349/[闭嘴]@2x.png new file mode 100644 index 0000000..d1d3d3b Binary files /dev/null and b/assets/custom_face_resource/4349/[闭嘴]@2x.png differ diff --git a/assets/custom_face_resource/4349/[闹钟]@2x.png b/assets/custom_face_resource/4349/[闹钟]@2x.png new file mode 100644 index 0000000..daade80 Binary files /dev/null and b/assets/custom_face_resource/4349/[闹钟]@2x.png differ diff --git a/assets/custom_face_resource/4349/[阴险]@2x.png b/assets/custom_face_resource/4349/[阴险]@2x.png new file mode 100644 index 0000000..e277198 Binary files /dev/null and b/assets/custom_face_resource/4349/[阴险]@2x.png differ diff --git a/assets/custom_face_resource/4349/[难过]@2x.png b/assets/custom_face_resource/4349/[难过]@2x.png new file mode 100644 index 0000000..35bd8ec Binary files /dev/null and b/assets/custom_face_resource/4349/[难过]@2x.png differ diff --git a/assets/custom_face_resource/4349/[雨伞]@2x.png b/assets/custom_face_resource/4349/[雨伞]@2x.png new file mode 100644 index 0000000..5011da4 Binary files /dev/null and b/assets/custom_face_resource/4349/[雨伞]@2x.png differ diff --git a/assets/custom_face_resource/4349/[青蛙]@2x.png b/assets/custom_face_resource/4349/[青蛙]@2x.png new file mode 100644 index 0000000..4b69277 Binary files /dev/null and b/assets/custom_face_resource/4349/[青蛙]@2x.png differ diff --git a/assets/custom_face_resource/4349/[面条]@2x.png b/assets/custom_face_resource/4349/[面条]@2x.png new file mode 100644 index 0000000..78e8e71 Binary files /dev/null and b/assets/custom_face_resource/4349/[面条]@2x.png differ diff --git a/assets/custom_face_resource/4349/[鞭炮]@2x.png b/assets/custom_face_resource/4349/[鞭炮]@2x.png new file mode 100644 index 0000000..ec12c3e Binary files /dev/null and b/assets/custom_face_resource/4349/[鞭炮]@2x.png differ diff --git a/assets/custom_face_resource/4349/[风车]@2x.png b/assets/custom_face_resource/4349/[风车]@2x.png new file mode 100644 index 0000000..02321c3 Binary files /dev/null and b/assets/custom_face_resource/4349/[风车]@2x.png differ diff --git a/assets/custom_face_resource/4349/[飞吻]@2x.png b/assets/custom_face_resource/4349/[飞吻]@2x.png new file mode 100644 index 0000000..a9a4e16 Binary files /dev/null and b/assets/custom_face_resource/4349/[飞吻]@2x.png differ diff --git a/assets/custom_face_resource/4349/[飞机]@2x.png b/assets/custom_face_resource/4349/[飞机]@2x.png new file mode 100644 index 0000000..f407930 Binary files /dev/null and b/assets/custom_face_resource/4349/[飞机]@2x.png differ diff --git a/assets/custom_face_resource/4349/[饥饿]@2x.png b/assets/custom_face_resource/4349/[饥饿]@2x.png new file mode 100644 index 0000000..5bbd805 Binary files /dev/null and b/assets/custom_face_resource/4349/[饥饿]@2x.png differ diff --git a/assets/custom_face_resource/4349/[香蕉]@2x.png b/assets/custom_face_resource/4349/[香蕉]@2x.png new file mode 100644 index 0000000..b3bde3c Binary files /dev/null and b/assets/custom_face_resource/4349/[香蕉]@2x.png differ diff --git a/assets/custom_face_resource/4349/[骷髅]@2x.png b/assets/custom_face_resource/4349/[骷髅]@2x.png new file mode 100644 index 0000000..c4ee653 Binary files /dev/null and b/assets/custom_face_resource/4349/[骷髅]@2x.png differ diff --git a/assets/custom_face_resource/4349/[麦克风]@2x.png b/assets/custom_face_resource/4349/[麦克风]@2x.png new file mode 100644 index 0000000..0e0ae99 Binary files /dev/null and b/assets/custom_face_resource/4349/[麦克风]@2x.png differ diff --git a/assets/custom_face_resource/4349/[麻将]@2x.png b/assets/custom_face_resource/4349/[麻将]@2x.png new file mode 100644 index 0000000..011d8e2 Binary files /dev/null and b/assets/custom_face_resource/4349/[麻将]@2x.png differ diff --git a/assets/custom_face_resource/4349/[鼓掌]@2x.png b/assets/custom_face_resource/4349/[鼓掌]@2x.png new file mode 100644 index 0000000..18cd1d2 Binary files /dev/null and b/assets/custom_face_resource/4349/[鼓掌]@2x.png differ diff --git a/assets/custom_face_resource/4349/[龇牙]@2x.png b/assets/custom_face_resource/4349/[龇牙]@2x.png new file mode 100644 index 0000000..4fed0fc Binary files /dev/null and b/assets/custom_face_resource/4349/[龇牙]@2x.png differ diff --git a/doc/DETAIL.md b/doc/DETAIL.md index 768b793..2960c6e 100644 --- a/doc/DETAIL.md +++ b/doc/DETAIL.md @@ -5,7 +5,7 @@ `CoreServicesImpl` 为`TIMUIKit` 核心类,包含初始化、登录、登出、获取用户信息等方法。 ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); final V2TIMManager _sdkInstance = TIMUIKitCore.getSDKInstance(); @@ -83,7 +83,7 @@ _coreInstance.setTheme(TUITheme theme: theme) // 设置主题色 `TIMUIKitConversation` 为会话组件,拉取用户会话列表,默认提供一套UI,用户也可自定义会话条目。同时提供对应的`TIMUIKitConversationController`。 ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final TIMUIKitConversationController _controller = TIMUIKitConversationController(); @@ -156,7 +156,7 @@ TIMUIKitConversation( - 文件消息 ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; TIMUIKitChat( conversationID: "", /// 会话ID @@ -286,7 +286,7 @@ TIMUIKitGroup( `TIMUIKitContact` 为联系人组件,提供联系人列表。 ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; TIMUIKitContact( topList: [ diff --git a/doc/FAST_INTEGRATED.md b/doc/FAST_INTEGRATED.md index 36592cc..7001e91 100644 --- a/doc/FAST_INTEGRATED.md +++ b/doc/FAST_INTEGRATED.md @@ -27,10 +27,10 @@ Flutter TIMUIKit 是基于Flutter IM SDK 实现的一套UI组件,其中包含 参考Flutter[文档](https://flutter.cn/docs/get-started/test-drive?tab=terminal)快速创建一个flutter应用。 ### 步骤2: 安装依赖 -在`pubspec.yaml`文件中的`dependencies`下添加`tim_ui_kit`。或者执行如下命令: +在`pubspec.yaml`文件中的`dependencies`下添加`tencent_cloud_chat_uikit`。或者执行如下命令: ``` // step 1: -flutter pub add tim_ui_kit +flutter pub add tencent_cloud_chat_uikit // step 2: flutter pub get @@ -42,7 +42,7 @@ flutter pub get ```dart /// main.dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; void main() { runApp(MyApp()); @@ -161,7 +161,7 @@ class _MyHomePageState extends State { ```dart /// message.dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class Conversation extends StatelessWidget { const Conversation({Key? key}) : super(key: key); diff --git a/doc/README.md b/doc/README.md index f69be76..f99fa51 100644 --- a/doc/README.md +++ b/doc/README.md @@ -5,4 +5,4 @@ TUIKit 是基于 IM SDK 实现的一套 UI 组件,其包含会话、聊天、 ![](https://imgcache.qq.com/operation/dianshi/other/191645543019_.pic.06d8f22e726287c07cf38d362ec40d4deb4799c7.jpg) -- [快速集成文档](https://git.woa.com/29294-22989-29805-29810/im-flutter-uikit/blob/feature/add-doc/package_src/tim_ui_kit/doc/FAST_INTEGRATED.md) +- [快速集成文档](https://git.woa.com/29294-22989-29805-29810/im-flutter-uikit/blob/feature/add-doc/package_src/tencent_cloud_chat_uikit/doc/FAST_INTEGRATED.md) diff --git a/doc/get_start.md b/doc/get_start.md index 0504401..753d8cd 100644 --- a/doc/get_start.md +++ b/doc/get_start.md @@ -147,11 +147,11 @@ TUIKit 是基于腾讯云 IM SDK 的一款 UI 组件库,它提供了一些通 #### 安装IM TUIkit -我们的TUIkit已经内含IM SDK,因此仅需安装`tim_ui_kit`,不需要再安装基础im sdk。 +我们的TUIkit已经内含IM SDK,因此仅需安装`tencent_cloud_chat_uikit`,不需要再安装基础im sdk。 ```shell #在命令行执行: -flutter pub add tim_ui_kit +flutter pub add tencent_cloud_chat_uikit ``` #### 初始化 @@ -162,7 +162,7 @@ flutter pub add tim_ui_kit ```dart /// main.dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); @override @@ -183,7 +183,7 @@ final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); 调用`_coreInstance.login`方法,登录一个测试账户。 ```dart -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); _coreInstance.login(userID: userID, userSig: userSig); @@ -203,7 +203,7 @@ _coreInstance.login(userID: userID, userSig: userSig); ```dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class Conversation extends StatelessWidget { const Conversation({Key? key}) : super(key: key); @@ -244,7 +244,7 @@ return Scaffold( ```dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class Chat extends StatelessWidget { final V2TimConversation selectedConversation; @@ -283,7 +283,7 @@ return TIMUIKitChat( ```dart import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class UserProfile extends StatelessWidget { final String userID; @@ -322,9 +322,9 @@ class UserProfile extends StatelessWidget { [TIMUIKitNewContact](https://intl.cloud.tencent.com/document/product/1047/46297#timuikitnewcontact): 联系人(好友)申请列表。如需在外部显示小红点,可使用 `TIMUIKitUnreadCount` 小红点组件,其会自动挂载监听。 -[TIMUIKitSearch](https://pub.dev/documentation/tim_ui_kit/latest/ui_views_TIMUIKitSearch_tim_uikit_search/TIMUIKitSearch-class.html): 搜索组件,支持全局搜索联系人/群组/聊天记录,也支持在特定会话中搜索聊天记录。两种模式取决于是否传入 `conversation`。 +[TIMUIKitSearch](https://pub.dev/documentation/tencent_cloud_chat_uikit/latest/ui_views_TIMUIKitSearch_tim_uikit_search/TIMUIKitSearch-class.html): 搜索组件,支持全局搜索联系人/群组/聊天记录,也支持在特定会话中搜索聊天记录。两种模式取决于是否传入 `conversation`。 -详细UI插件指南[可参考本文档](https://cloud.tencent.com/document/product/269/70747#timuikitcontact)或[插件README](https://pub.dev/packages/tim_ui_kit)。 +详细UI插件指南[可参考本文档](https://cloud.tencent.com/document/product/269/70747#timuikitcontact)或[插件README](https://pub.dev/packages/tencent_cloud_chat_uikit)。 [](id:part5) diff --git a/doc/混合开发.md b/doc/混合开发.md new file mode 100644 index 0000000..599e798 --- /dev/null +++ b/doc/混合开发.md @@ -0,0 +1,938 @@ +[](id:toc) +通过阅读本文,你可以了解在您现有的 Android / iOS 原生开发项目中,集成腾讯云IM Flutter 的方法。 + +有的时候,使用Flutter重写您现有的应用程序是不现实的。如果您想在现有APP中,使用腾讯云IM的能力,推荐采用混合开发方案,即将Flutter模块,嵌入您的原生开发APP项目中。 + +**可在很大程度上,降低您的工作量,快速在双端原生APP中,植入IM通信能力。** + +![](https://qcloudimg.tencent-cloud.cn/raw/54adc2b0587f9f30d56e96eb6461b969.png) + +## 环境要求 + +| 环境 | 版本 | +|---------|---------| +| Flutter | SDK 最低要求 Flutter 2.2.0版本,TUIKit 集成组件库最低要求 Flutter 2.10.0 版本。| +|Android|Android Studio 3.5及以上版本,App 要求 Android 4.1及以上版本设备。| +|iOS|Xcode 11.0及以上版本,请确保您的项目已设置有效的开发者签名。| +|腾讯云IM SDK|[tencent_im_sdk_plugin](https://pub.dev/packages/tencent_im_sdk_plugin) 5.0 及以上版本, [tencent_cloud_chat_uikit](https://pub.dev/packages/tencent_cloud_chat_uikit) 0.2 及以上版本。| + +## 快速了解 + +
+ +>? +> +> 对于以上的Demo项目,源代码可在我们的[GitHub仓库](https://github.com/TencentCloud/tencentchat-add-flutter-to-app)中找到,欢迎查阅。 + +## 前置知识点 + +开始之前,您需要了解腾讯云IM Flutter SDK及TUIKit的用法;及Flutter-原生混合开发原理。 + +### 腾讯云IM + +#### 总体入门 + +在开始前,您首先需要了解腾讯云IM Flutter的SDK构成及使用方式。 + +主要包括两个SDK:[无UI版本](https://cloud.tencent.com/document/product/269/68823#.E7.AC.AC.E4.BA.94.E9.83.A8.E5.88.86.EF.BC.9A.E8.87.AA.E5.AE.9E.E7.8E.B0-ui-.E9.9B.86.E6.88.90)及[含UI组件库](https://cloud.tencent.com/document/product/269/70747)。本文将以 [含UI组件库(TUIKit)](https://cloud.tencent.com/document/product/269/70747) 为例,介绍混合开发方案。 + +**关于腾讯云IM Flutter详细用法,可从我们的 [快速入门文档](https://cloud.tencent.com/document/product/269/68823) 看起。** + +[](id:modules) + +#### 两个模块 + +腾讯云IM主要有两个部分,包括 Chat聊天模块 和 Call通话模块。 + +Chat聊天模块主要包括消息收发、会话管理、用户关系管理等。 + +Call通话模块主要包括音视频通话,包括一对一通话和群组多人通话。 + +### Flutter 混合开发 + +核心原理是,将 module 形式的Flutter项目,打包成Native端的可执行程序,嵌入Native项目中。因Flutter module可以通用,因此仅需编写一次Flutter module,即可嵌入 Android/iOS APP 中。 + +当您现有应用需要展示腾讯云IM相关页面时,可加载对应用于承载Flutter的Activity(Android)或ViewController(iOS)。 + +当需要两端通信时,如传递当前用户信息,传递音视频通话数据,触发离线推送数据,可采用[Method Channel](https://docs.flutter.dev/development/platform-integration/platform-channels#channels-and-platform-threading)方式进行。触发另一端的方法使用 `invokeMethod`,监听另一端发来的方法调用使用[预挂载的Method Channel监听器](https://docs.flutter.dev/development/platform-integration/platform-channels#executing-channel-handlers-on-background-threads)。 + +[](id:android) + +#### 将 Flutter 模块添加至 Android 项目中 + +[详细学习](https://docs.flutter.dev/development/add-to-app/android/project-setup) + +将Flutter module添加为Gradle中现有应用程序的依赖项。有两种方式可以实现这一点。 + +##### Android方式一:依赖 Android Archive (AAR) + +AAR机制创建通用的Android AAR作为打包Flutter module的中介。如果您经常构建,它会增加一个构建步骤。 + +该选项将Flutter库打包为由AAR和POMS构件组成的通用本地Maven存储库。此选项允许您的团队在不安装Flutter SDK的情况下构建主机应用程序。然后,您可以从本地或远程存储库中分发构件。 + +因此,建议在线上生产环境,使用本方案。 + +**具体步骤:** + +在您的Flutter module中,运行: + +```shell +flutter build aar +``` + +然后,按照屏幕上的说明进行集成。 + +![](https://qcloudimg.tencent-cloud.cn/raw/32e9376de02da10e97a8c54b9ab2b51c.png) + +您的应用程序现在将Flutter模块作为依赖项包括在内。 + +##### Android方式二:依赖Flutter module源代码 + +源代码子项目机制是一个方便的一键构建过程,但需要Flutter SDK。这是Android Studio IDE插件使用的机制。 + +此方式可为您的Android项目和Flutter项目实现一步构建。当您同时处理两个部分并快速迭代时,此选项很方便,但您的团队必须安装Flutter SDK才能构建应用程序。 + +因此,建议在开发测试环境,使用本方案。 + +**具体步骤:** + +将Flutter module作为一个子项目,添加至宿主APP的 `settings.gradle` 中: + +```gradle +// Include the host app project. +include ':app' // assumed existing content +setBinding(new Binding([gradle: this])) // new +evaluate(new File( // new + settingsDir.parentFile, // new + 'tencent_chat_module/.android/include_flutter.groovy' // new +)) // new +``` + +在您应用中的 `app/build.gradle => dependencies` 中引入对Flutter module的 `implementation`: + +```gradle +dependencies { + implementation project(':flutter') +} +``` + +您的应用程序现在将Flutter模块作为依赖项包括在内。 + +[](id:ios) + +#### 将 Flutter 模块添加至 iOS 项目中 + +[详细学习](https://docs.flutter.dev/development/add-to-app/ios/project-setup#embed-the-flutter-module-in-your-existing-application) + +有两种方法可以在现有应用程序中嵌入Flutter。 + +##### iOS方式一:嵌入 CocoaPods 和 Flutter SDK 集成 + +使用CocoaPods依赖项管理器并安装Flutter SDK。这种方法要求每个从事项目工作的开发人员都有一个本地安装的Flutter SDK版本。 + +只需在Xcode中构建您的应用程序,即可自动运行脚本来嵌入您的DART和插件代码。这允许快速迭代最新版本的颤振模块,而无需在Xcode之外运行其他命令。 + +因此,建议在开发测试环境,使用本方案。 + +**具体步骤:** + +将以下代码添加到Podfile中: + +``` +// 上一步构建的Flutter Module的路径 +flutter_chat_application_path = '../tencent_chat_module' + +load File.join(flutter_chat_application_path, '.ios', 'Flutter', 'podhelper.rb') +``` + +对于每个需要嵌入Flutter的[Podfile target](https://guides.cocoapods.org/syntax/podfile.html#target),调用 `install_all_flutter_pods(flutter_chat_application_path)`. + +``` +target 'MyApp' do + install_all_flutter_pods(flutter_chat_application_path) +end +``` + +在Podfile的 `post_install` 块中,调用 `flutter_post_install(installer)`,并完成 [腾讯云IM TUIKit](https://cloud.tencent.com/document/product/269/70747) 所需的权限声明,包括麦克风权限/相机权限/相册权限。 + +``` +post_install do |installer| + flutter_post_install(installer) if defined?(flutter_post_install) + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + target.build_configurations.each do |config| + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + 'PERMISSION_MICROPHONE=1', + 'PERMISSION_CAMERA=1', + 'PERMISSION_PHOTOS=1', + ] + end + end +end +``` + +执行 `pod install`。 +> ? +> +> - 在 `tencent_chat_module/pubspec.yaml` 中更改Flutter插件依赖时,请在Flutter Module目录中运行 `flutter pub get` 以刷新 `podhelper.rb` 脚本读取的插件列表。然后,从您iOS应用程序的根目录,再次执行 `pod install`。 +> - 对于 Apple Silicon 芯片 arm64 架构的 Mac电脑,可能需要执行 `arch -x86_64 pod install --repo-update`。 + +`podhelper.rb` 脚本将您的插件 / `Flutter.framework` / `App.framework` 植入您的项目中。 + +##### iOS方式二:在Xcode中嵌入frameworks + +为Flutter引擎、已编译的DART代码和所有Flutter插件创建框架。手动嵌入框架,并在Xcode中更新现有应用程序的构建设置。 + +通过手动编辑现有的Xcode项目,您可以生成必要的framework并将它们嵌入到应用程序中。如果您的团队成员无法在本地安装Flutter SDK和CocoaPods,或者如果您不想在现有应用程序中使用CocoaPods作为依赖项管理器,则可以这样做。每次你在你的颤动模块中修改代码时,你都必须运行 `flutter build ios-framework`. + +因此,建议在线上环境,使用本方案。 + +**具体步骤:** + +在您的Flutter module中,运行如下代码。 + +下面的示例,假设您想要将framework生成到 `some/path/MyApp/Flutter/`. + +```shell +flutter build ios-framework --output=some/path/MyApp/Flutter/ +``` + +在 Xcode 中将生成的 frameworks 集成到你的既有应用中。例如,你可以在 `some/path/MyApp/Flutter/Release/` 目录拖拽 frameworks 到你的应用 target 编译设置的 General > Frameworks, Libraries, and Embedded Content 下,然后在 Embed 下拉列表中选择 “Embed & Sign”。 + + +## 混合开发选型 + +我们推荐您使用Flutter Module方式进行混合开发集成。 + +在Native原生项目中,构建Flutter引擎,来承载Flutter中的Chat及Call模块。有关两个模块的介绍,[请看此处](#modules)。 + +对于Flutter引擎的创建管理,目前两种方式:单Flutter引擎及多Flutter引擎。 + +| 引擎模式 | 介绍 | 优点 | 缺点 | Demo源码下载 | +|---------|---------|---------|---------|---------| +| [Flutter单引擎](#single) | Chat模块和Call模块在同一个Flutter引擎中承载。 | 方便,所有Flutter代码统一维护。 | 由于Call插件,在有电话呼入时,需要自动展示来电页面。如果在同一个引擎中,需要强制跳转至Flutter所在页面,体验较差。 | [点击下载](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Single%20Flutter%20Engines) | +| [Flutter多引擎](#multiple) | Chat模块和Call模块分别承载于不同的Flutter引擎中,使用Flutter引擎组来统一管理这两个引擎。 | Call插件独立存在于一个Flutter引擎中,独立页面控制,来电时,直接将该页面弹窗即可,不影响用户当前所在页面,体验较好。 | 通话模块无法最小化成浮窗形式。 | [点击下载](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Multiple%20Flutter%20Engines) | + +此外,我们还提供,将腾讯云 IM Native SDK 与 Flutter SDK 结合使用的方案,[适用场景和步骤介绍可查看这里](#native)。[Demo源码下载](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Initialize%20from%20Native)。 + +[](id:multiple) + +## 方案一:Flutter 多引擎方案【推荐】 + +本方案中,Chat 和 Call 模块分别独立于不同的Flutter引擎。 + +使用多个Flutter引擎的优点是,每个实例都是独立的,并维护其自己的内部导航堆栈、UI和应用程序状态。这简化了整个应用程序代码的状态保持责任,并提高了模块化能力。 + +![](https://qcloudimg.tencent-cloud.cn/raw/912d986a5ff57606422455a273a033f3.png) + +在Android和iOS上添加多个Flutter引擎,主要基于一个FlutterEngineGroup类(Android API、iOS API)来构造并管理多个FlutterEngine(Flutter引擎)。 + +在我们的项目中,我们基于一个统一的FlutterEngineGroup,来管理两个FlutterEngine(Flutter引擎),分别用于承载 Chat 和 Calling 模块。 + +[![](https://qcloudimg.tencent-cloud.cn/raw/b622951f776a505e83f843de1f62fffc.png)](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Multiple%20Flutter%20Engines) + +### Flutter Module 开发 + +要将Flutter嵌入到现有应用程序中,请首先创建一个Flutter模块。 + +在您项目的根目录外层,运行 + +``` +cd some/path/ +flutter create --template module tencent_chat_module +``` + +这会在 some/path/tencent_chat_module/ 创建一个 Flutter 模块项目。 在该目录中,您可以运行与在任何其他 Flutter 项目中相同的 Flutter 命令,例如 `flutter run --debug` 或 `flutter build ios`。 您还可以使用 Flutter 和 Dart 插件在 Android Studio, IntelliJ 或 VS Code 中运行该模块。 该项目在嵌入到现有应用程序之前包含模块的单视图示例版本,这对于测试代码的仅 Flutter 部分很有用。 + +`tencent_chat_module` 模块目录结构类似于普通的 Flutter 应用程序: + +``` +tencent_chat_module/ +├── .ios/ +│ ├── Runner.xcworkspace +│ └── Flutter/podhelper.rb +├── lib/ +│ └── main.dart +├── test/ +└── pubspec.yaml +``` + +现在,我们可以在 `lib/` 中,编写代码了。 + +#### 梳理Flutter lib 目录 + +>? +> +> 以下代码结构,仅供参考,您可根据需要灵活组织,以引入腾讯云IM Flutter。 + +在 `lib/` 我们创建三个目录,`call`, `chat`, `common`。分别用于放置通话引擎,IM引擎,及通用model类。 + +``` +tencent_chat_module/ +├── lib/ +│ └── call/ +│ └── chat/ +│ └── common/ +``` + +#### 通用model类模块 + +新建 `common/common_model.dart` 文件,如下所示,新建两个class,用于定义Flutter与原生应用通信规范。 + +```dart +class ChatInfo { + String? sdkappid; + String? userSig; + String? userID; + + ChatInfo.fromJSON(Map json) { + sdkappid = json["sdkappid"].toString(); + userSig = json["userSig"].toString(); + userID = json["userID"].toString(); + } + + Map toMap(){ + final Map map = {}; + if(sdkappid != null){ + map["sdkappid"] = sdkappid!; + } + if(userSig != null){ + map["userSig"] = userSig!; + } + if(userID != null){ + map["userID"] = userID!; + } + return map; + } +} + +class CallInfo{ + String? userID; + String? groupID; + + CallInfo(); + + CallInfo.fromJSON(Map json) { + groupID = json["groupID"].toString(); + userID = json["userID"].toString(); + } + + Map toMap(){ + final Map map = {}; + if(userID != null){ + map["userID"] = userID!; + } + if(groupID != null){ + map["groupID"] = groupID!; + } + return map; + } +} +``` + +#### Chat 模块 + +**首先编写IM引擎。本模块所有代码及文件,均在 `lib/chat` 目录下。** + +1. 新建全局状态管理Model,名为 `model.dart`。 + 该Model用于挂载初始化并管理腾讯云IM Flutter模块,离线推送能力,全局状态管理,维护与Native间通信。 + 是整个Chat模块的核心。 + 详细代码可查看Demo源码。重点关注三个部分: + - Future _handleMessage(MethodCall call): 动态监听 Native 透传来的事件,包括登录信息及点击推送事件。 + - Future handleClickNotification(Map msg): 点击通知处理事件,来自Native透传,从 Map 中取出数据,跳转至对应的子模块,如某个具体会话。 + - Future initChat(): 初始化腾讯云IM/登录腾讯云IM/并完成离线推送的初始化及Token上报。该方法使用线程锁机制,保证同时只能执行一个,并在初始化成功后,不重复执行。 + +> ? +> +> 请根据 [离线推送接入指引](https://cloud.tencent.com/document/product/269/74605),完成厂商离线推送功能接入,才可正常上报推送Token,使用推送功能。 + +2. 新建 `chat_main.dart` 文件,用于Chat模块主入口。 + - 该页面也是Flutter Chat模块的首页。 + - 在Demo中,该页面在未登录前为加载状态,登录后展示会话列表。 + - 此外,还需要在这里,完成 `didChangeAppLifecycleState` 监听与前后台切换事件上报,详情请查看[离线推送插件文档步骤5](https://cloud.tencent.com/document/product/269/74605#.E6.AD.A5.E9.AA.A45.EF.BC.9A.E5.89.8D.E5.90.8E.E5.8F.B0.E5.88.87.E6.8D.A2.E7.9B.91.E5.90.AC.3Ca-id.3D.22step_5.22.3E.3C.2Fa.3E)。 + - 详细代码可查看Demo源码。 + +3. 新建 `push.dart` 文件,用于单例管理 [离线推送插件](https://cloud.tencent.com/document/product/269/74605) 能力。用于获取并上报Token/获取推送权限等操作。详细代码可查看Demo源码。 + +4. 新建 `conversation.dart` 文件,用于承载TUIKit的会话模块组件 `TIMUIKitConversation`。详细代码可查看Demo源码。 + +5. 新建 `chat.dart` 文件,用于承载TUIKit的历史消息列表和发送消息模块组件 `TIMUIKitChat`。 + 该页面还有跳转至 Profile 及 Group Profile 页面的能力。 + 详细代码可查看Demo源码。 + +6. 新建 `user_profile.dart` 文件,用于承载TUIKit的用户信息及关系链管理模块组件 `TIMUIKitProfile`。详细代码可查看Demo源码。 + +7. 新建 `group_profile.dart` 文件,用于承载TUIKit的群信息及群管理模块组件 `TIMUIKitGroupProfile`。详细代码可查看Demo源码。 + +此时,Chat模块已开发完成。最终结构如下: + +``` +tencent_chat_module/ +├── lib/ +│ └── call/ +│ └── chat.dart +│ └── model.dart +│ └── chat_main.dart +│ └── push.dart +│ └── conversation.dart +│ └── user_profile.dart +│ └── group_profile.dart +│ └── chat/ +│ └── common/ +``` + +#### Call 模块 + +该模块用于承载音视频通话能力,该能力由 [音视频通话插件](https://cloud.tencent.com/document/product/269/72485) 提供。 + +该模块的核心是,监听收到新的通话邀请时,通过调用Native方法,自动弹出通话页面;并接受 Chat 模块经由Native转发来的通话请求,主动发起通话。 + +**首先编写IM引擎。本模块所有代码及文件,均在 `lib/call` 目录下。** + +1. 新建全局状态管理Model,名为 `model.dart`。 + 该Model用于挂载初始化并管理 [音视频通话插件](https://cloud.tencent.com/document/product/269/72485),全局状态管理,维护与Native间通信。 + 是整个Call模块的核心。 + 详细代码可查看Demo源码。重点关注两个部分: + - _onRtcListener = TUICallingListener(...): 定义了通话事件的监听器,通过 Method Channel 通知Native层,动态控制 Call 模块所属的 ViewController(iOS)/Activity(Android) 的前端展示与否。 + - Future _handleMessage(MethodCall call): 动态监听 Native 透传来的主动发起通话请求,来自 Call 模块的调用,主动发起通话。 + +2. 新建 `call_main.dart` 文件,用于Call模块主入口。 + 该组件用于注入[音视频通话插件所需绑定的navigatorKey](https://cloud.tencent.com/document/product/269/72485#.E6.AD.A5.E9.AA.A41.EF.BC.9A.E5.BC.95.E5.85.A5-navigatorkey)。 + 详细代码可查看Demo源码。 + + +#### 配置各个Flutter引擎的入口 + +开发完上述三个模块后,现在可完成最终对外暴露的main方法,作为Flutter引擎的入口。 + +1. 默认入口 + +打开 `lib/main.dart` 文件,将 `main()` 方法改成一个空 MaterialApp 即可。 + +该方法作为 Flutter Module 的默认入口,在Flutter多引擎,使用FlutterEngineGroup管理的背景下,如果没有子Flutter Engine不设置任何entry point,这个方法就不会被用到。 + +例如,在我们的场景中,这个默认 `main()` 方法就没有被用上。 + +```dart +void main() { + WidgetsFlutterBinding.ensureInitialized(); + + runApp(MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: Container(), + )); +} +``` + +2. 配置 Chat 模块的入口 + +使用 `@pragma('vm:entry-point')` 注解,将该方法标记为一个 `entry-point` 入口。方法名 `chatMain` 即该入口的名称,在Native中,也使用该名称,创建对应Flutter引擎。 + +使用全局 `ChangeNotifierProvider` 状态管理,维护 `ChatInfoModel` 数据及业务逻辑。 + +```dart +@pragma('vm:entry-point') +void chatMain() { + // This call ensures the Flutter binding has been set up before creating the + // MethodChannel-based model. + WidgetsFlutterBinding.ensureInitialized(); + + final model = ChatInfoModel(); + + runApp( + ChangeNotifierProvider.value( + value: model, + child: const ChatAPP(), + ), + ); +} +``` + +3. 配置 Call 模块的入口 + +同理,该入口命名为 `callMain`。 + +使用全局 `ChangeNotifierProvider` 状态管理,维护 `CallInfoModel` 数据及业务逻辑。 + +```dart +@pragma('vm:entry-point') +void callMain() { + // This call ensures the Flutter binding has been set up before creating the + // MethodChannel-based model. + WidgetsFlutterBinding.ensureInitialized(); + + final model = CallInfoModel(); + + runApp( + ChangeNotifierProvider.value( + value: model, + child: const CallAPP(), + ), + ); +} +``` + +至此,Flutter Module部分,Dart代码编写完成。 + +接下来,开始编写 Native 代码。 + +### iOS Native 开发 + +本文以 Swift 语言为例。 + +>? +> +> 以下代码结构,仅供参考,您可根据需要灵活组织。 + +进入您的iOS项目目录。 + +如果您现有的应用程序,假设叫做 `MyApp`, 还没有Podfile,请按照[CocoaPods入门指南](https://guides.cocoapods.org/using/using-cocoapods.html)将 `Podfile` 添加到项目中。 + +#### 引入 Flutter Module + +请参考[此部分](#ios),将Flutter module引入您的原生应用程序中。建议采用方式一。 + +#### 在 iOS 项目中,管理Flutter引擎 + +![](https://qcloudimg.tencent-cloud.cn/raw/e906c61c593195ca2310d08c1ac4a1f4.png) + +**创建一个 `FlutterEngineGroup` (Flutter 引擎组),统一管理多个引擎实例。** + +在 `AppDelegate.swift` 文件中,添加如下代码: + +```swift +@UIApplicationMain +class AppDelegate: FlutterAppDelegate { + lazy var flutterEngines = FlutterEngineGroup(name: "chat.flutter.tencent", project: nil) + ... +} +``` + +**创建一个用于管理Flutter引擎的单例对象。** + +这个 Swift 单例对象,用于集中管理 Flutter 实例,并方便在项目中各处,直接调用。 + +Demo代码的逻辑是,使用新的路由,承载Chat的ViewController;Call的ViewController,通过present和dismiss动态弹窗维护。 + +新建 `FlutterUtils.swift` 文件,编写代码。本部分详细代码,可查看Demo源码。 + +重点关注: +- private override init(): 初始化各 Flutter 引擎实例,注册Method Channel,监听事件。 +- func reportChatInfo(): 将用户登录信息和SDKAPPID透传至Flutter Module,使Flutter层得以初始化并登录腾讯云IM。 +- func launchCallFunc(): 用于拉起Call的Flutter页面,可被Call模块收到通话邀请触发,也可被Chat模块主动发起通话触发。 +- func triggerNotification(msg: String): 将 iOS Native 层收到的离线推送消息点击事件,及其包含的ext信息,以 JSON String形式,透传至 Flutter 层绑定的监听处理事件。用于处理离线推送点击跳转,例如至对应会话。 + +**监听及转发离线推送点击事件** + +离线推送的初始化/Token上报/点击事件对应的会话跳转处理,已在Flutter Chat模块中进行,因此,Native区域,仅需透传点击通知事件的ext即可。 + +之所以这么做,是因为点击通知事件已在Native被拦截消费,Flutter层无法直接拿到,必须经由Native转发。 + +在 `AppDelegate.swift` 文件中,新增如下代码。具体代码,可以参考Demo源码。 + +![](https://qcloudimg.tencent-cloud.cn/raw/9c816ae4745e5a8d2b9b1d64167e1fc5.png) + +此时,iOS Native层编写完成。 + +### Android Native 开发 + +本文以 Kotlin 语言为例。 + +>? +> +> 以下代码结构,仅供参考,您可根据需要灵活组织。 + +#### 引入 Flutter Module + +请参考[此部分](#android),将Flutter module引入您的原生应用程序中。建议采用方式二。 + +#### 在 Android 项目中,管理Flutter引擎 + +**创建一个用于管理Flutter引擎的单例对象。** + +这个 Kotlin 单例对象,用于集中管理 Flutter 实例,并方便在项目中各处,直接调用。 + +新建 `FlutterUtils.kt` 文件,并定义 `FlutterUtils` 静态类。 + +```kotlin +@SuppressLint("StaticFieldLeak") +object FlutterUtils {} +``` + +**创建 `FlutterEngineGroup` (Flutter 引擎组),统一管理多个引擎实例。** + +在 `FlutterUtils.kt` 文件中,定义一个 `FlutterEngineGroup`,及配套各个Flutter Engine实例和Method Channel,并在初始化时,将其初始化。 + +```kotlin +lateinit var context : Context +lateinit var flutterEngines: FlutterEngineGroup +private lateinit var chatFlutterEngine:FlutterEngine +private lateinit var callFlutterEngine:FlutterEngine + +lateinit var chatMethodChannel: MethodChannel +lateinit var callMethodChannel: MethodChannel + +// 初始化 +flutterEngines = FlutterEngineGroup(context) +... +``` + +**继续完成该用于管理Flutter引擎的单例对象。** + +Demo代码的逻辑是,使用新的路由,承载Chat和Call的Activity。 + +Chat的Activity,由用户主动进入及退出;Call的Activity,由监听器或主动外呼,自动导航进及返回出。 + +重点关注: +- fun init(): 初始化各 Flutter 引擎实例,注册Method Channel,监听事件。 +- fun reportChatInfo(): 将用户登录信息和SDKAPPID透传至Flutter Module,使Flutter层得以初始化并登录腾讯云IM。 +- fun launchCallFunc(): 用于拉起Call的Flutter页面,可被Call模块收到通话邀请触发,也可被Chat模块主动发起通话触发。 +- fun triggerNotification(msg: String): 将 iOS Native 层收到的离线推送消息点击事件,及其包含的ext信息,以 JSON String形式,透传至 Flutter 层绑定的监听处理事件。用于处理离线推送点击跳转,例如至对应会话。 + +本单例 object 的详细代码,可以参考Demo源码。 + +**在 总入口 `MyApplication` 中,初始化上述对象** + +在 `MyApplication.kt` 文件中,将全局context传入单例对象,并执行初始化。 + +```kotlin +class MyApplication : MultiDexApplication() { + + override fun onCreate() { + super.onCreate() + FlutterUtils.context = this // new + FlutterUtils.init() // new + } +} +``` + +**监听及转发离线推送点击事件** + +离线推送的初始化/Token上报/点击事件对应的会话跳转处理,已在Flutter Chat模块中进行,因此,Native区域,仅需透传点击通知事件的ext即可。 + +之所以这么做,是因为点击通知事件已在Native被拦截消费,Flutter层无法直接拿到,必须经由Native转发。 + +> 由于不同厂商的离线推送接入步骤不一致,本文以OPPO为例,全部厂商接入方案,可查看[本文档](https://cloud.tencent.com/document/product/269/75428). + +在腾讯云IM控制台中,新增OPPO的推送证书,`点击后续动作` 选择 `打开应用内指定页面`,`应用内页面` 以 `Activity` 方式,配置一个用于处理离线推送信息的页面,建议为应用首页。如,我们的Demo配置为:`com.tencent.chat.android.MainActivity`. + +![](https://qcloudimg.tencent-cloud.cn/raw/c0f8737ce6fa484479ffc9a1bec6c9c0.png) + +在上方控制台配置的用于离线推送的Activity文件中,新增如下代码。 + +该代码的作用是,当厂商拉起相应Activity时,从Bundle中取出HashMap形式ext信息,触发单例对象中的方法,将这个信息,手动转发至Flutter中。具体代码,可以参考Demo源码。 + +![](https://qcloudimg.tencent-cloud.cn/raw/2ec45c1a8b3bd952bcb86a8095f91515.png) + +此时,Android Native层编写完成。 + + +[](id:single) + +## 方案二:Flutter 单引擎方案 + +本方案,将Chat模块和Call模块,写在同一个Flutter引擎实例中。 + +![](https://qcloudimg.tencent-cloud.cn/raw/c6c52a028f5b86c88babe3074805b295.png) + +这两个模块只能同时出现同时隐藏,仅需维护一个Flutter引擎即可。 + +[![](https://qcloudimg.tencent-cloud.cn/raw/b622951f776a505e83f843de1f62fffc.png)](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Single%20Flutter%20Engines) + +### Flutter Module 开发 + +要将Flutter嵌入到现有应用程序中,请首先创建一个Flutter模块。 + +在您项目的根目录外层,运行 + +``` +cd some/path/ +flutter create --template module tencent_chat_module +``` + +这会在 some/path/tencent_chat_module/ 创建一个 Flutter 模块项目。 在该目录中,您可以运行与在任何其他 Flutter 项目中相同的 Flutter 命令,例如 `flutter run --debug` 或 `flutter build ios`。 您还可以使用 Flutter 和 Dart 插件在 Android Studio, IntelliJ 或 VS Code 中运行该模块。 该项目在嵌入到现有应用程序之前包含模块的单视图示例版本,这对于测试代码的仅 Flutter 部分很有用。 + +`tencent_chat_module` 模块目录结构类似于普通的 Flutter 应用程序: + +``` +tencent_chat_module/ +├── .ios/ +│ ├── Runner.xcworkspace +│ └── Flutter/podhelper.rb +├── lib/ +│ └── main.dart +├── test/ +└── pubspec.yaml +``` + +现在,我们可以在 `lib/` 中,编写代码了。 + +#### main.dart + +修改 `main.dart` 文件,引入[TUIKit](https://cloud.tencent.com/document/product/269/70747), [离线推送插件](https://cloud.tencent.com/document/product/269/74605)及[音视频通话插件](https://cloud.tencent.com/document/product/269/72485)。 + +全局状态,我们的IM SDK及Method Channel与Native通信状态,管理于 `ChatInfoModel` 中。 + +接收到Native传来的用户信息及SDKAPPID后,调用 `_coreInstance.init()` 及 `_coreInstance.login() ` 初始化并登录腾讯云IM。并初始化音视频推送插件及离线推送插件,完成推送Token上报。 + +> ? +> +> 请根据 [离线推送接入指引](https://cloud.tencent.com/document/product/269/74605),完成厂商离线推送功能接入,才可正常上报推送Token,使用推送功能。 + +对于音视频通话插件,需要关注: +- 监听收到新的通话邀请时,通过调用Native方法,让Native检测用户当前是否在本Flutter模块页面,如果不在,需要强制将前端页面调整至本模块,以展示来电页面。 + +对于离线推送插件,需要关注: +- 点击通知处理事件,来自Native透传,从 Map 中取出数据,跳转至对应的子模块,如某个具体会话。 + +完成首页的制作,在未登录时展示加载动画;登录成功后,展示会话列表页面。 + +此外,还需要在这里,完成 `didChangeAppLifecycleState` 监听与前后台切换事件上报,详情请查看[离线推送插件文档步骤5](https://cloud.tencent.com/document/product/269/74605#.E6.AD.A5.E9.AA.A45.EF.BC.9A.E5.89.8D.E5.90.8E.E5.8F.B0.E5.88.87.E6.8D.A2.E7.9B.91.E5.90.AC.3Ca-id.3D.22step_5.22.3E.3C.2Fa.3E)。 + +详细代码可查看Demo源码。 + +#### 其他TUIKit模块引入 + +1. 新建 `push.dart` 文件,用于单例管理 [离线推送插件](https://cloud.tencent.com/document/product/269/74605) 能力。用于获取并上报Token/获取推送权限等操作。详细代码可查看Demo源码。 + +2. 新建 `conversation.dart` 文件,用于承载TUIKit的会话模块组件 `TIMUIKitConversation`。详细代码可查看Demo源码。 + +3. 新建 `chat.dart` 文件,用于承载TUIKit的历史消息列表和发送消息模块组件 `TIMUIKitChat`。 + 该页面还有跳转至 Profile 及 Group Profile 页面的能力。 + 详细代码可查看Demo源码。 + +4. 新建 `user_profile.dart` 文件,用于承载TUIKit的用户信息及关系链管理模块组件 `TIMUIKitProfile`。详细代码可查看Demo源码。 + +5. 新建 `group_profile.dart` 文件,用于承载TUIKit的群信息及群管理模块组件 `TIMUIKitGroupProfile`。详细代码可查看Demo源码。 + +至此,统一的Flutter Module开发完成。 + +### iOS Native 开发 + +本文以 Swift 语言为例。 + +>? +> +> 以下代码结构,仅供参考,您可根据需要灵活组织。 + +进入您的iOS项目目录。 + +如果您现有的应用程序,假设叫做 `MyApp`, 还没有Podfile,请按照[CocoaPods入门指南](https://guides.cocoapods.org/using/using-cocoapods.html)将 `Podfile` 添加到项目中。 + +#### 引入 Flutter Module + +请参考[此部分](#ios),将Flutter module引入您的原生应用程序中。建议采用方式一。 + +#### 在 iOS 项目中,管理Flutter引擎 + +**创建一个FlutterEngine。** + +创建FlutterEngine的适当位置特定于您的主应用程序入口。作为一个例子,我们演示了如何在 `AppDelegate` 中的app启动时创建一个FlutterEngine,并公开为一个属性。 + +```swift +import UIKit +import Flutter +import FlutterPluginRegistrant + +@UIApplicationMain +class AppDelegate: FlutterAppDelegate { // More on the FlutterAppDelegate. + lazy var flutterEngine = FlutterEngine(name: "tencent cloud chat") + + override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Runs the default Dart entrypoint with a default Flutter route. + flutterEngine.run(); + GeneratedPluginRegistrant.register(with: self.flutterEngine); + return super.application(application, didFinishLaunchingWithOptions: launchOptions); + } +} +``` + +**创建一个用于管理Flutter引擎的单例对象。** + +这个 Swift 单例对象,用于集中管理 Flutter Method Channel,并提供一系列与 Flutter Module 通信的方法,方便在项目中各处,直接调用。 + +这些方法包括: +- private override init(): 初始化 Method Channel,并为其绑定事件监听方法。 +- func reportChatInfo(): 将用户登录信息和SDKAPPID透传至Flutter Module,使Flutter层得以初始化并登录腾讯云IM。 +- func launchChatFunc(): 拉起或导航至 Flutter Module 所在 ViewController。 +- func triggerNotification(msg: String): 将 iOS Native 层收到的离线推送消息点击事件,及其包含的ext信息,以 JSON String形式,透传至 Flutter 层绑定的监听处理事件。用于处理离线推送点击跳转,例如至对应会话。 + +详细代码可查看Demo源码。 + +**监听及转发离线推送点击事件** + +离线推送的初始化/Token上报/点击事件对应的会话跳转处理,已在Flutter Chat模块中进行,因此,Native区域,仅需透传点击通知事件的ext即可。 + +之所以这么做,是因为点击通知事件已在Native被拦截消费,Flutter层无法直接拿到,必须经由Native转发。 + +在 `AppDelegate.swift` 文件中,新增如下代码。具体代码,可以参考Demo源码。 + +![](https://qcloudimg.tencent-cloud.cn/raw/0ea48d21696a1e696ab98091983168f9.png) + +此时,iOS Native层编写完成。 + +### Android Native 开发 + +本文以 Kotlin 语言为例。 + +>? +> +> 以下代码结构,仅供参考,您可根据需要灵活组织。 + +#### 引入 Flutter Module + +请参考[此部分](#android),将Flutter module引入您的原生应用程序中。建议采用方式二。 + +#### 在 Android 项目中,管理Flutter引擎 + +**创建一个用于管理Flutter引擎的单例对象。** + +这个 Kotlin 单例对象,用于集中管理 Flutter Method Channel,并提供一系列与 Flutter Module 通信的方法,方便在项目中各处,直接调用。 + +新建 `FlutterUtils.kt` 文件,并定义 `FlutterUtils` 静态类。 + +```kotlin +@SuppressLint("StaticFieldLeak") +object FlutterUtils {} +``` + +**创建一个 `FlutterEngine` (Flutter 引擎)。** + +在 `FlutterUtils.kt` 文件中,定义一个 `FlutterEngine`,并在初始化时,将其初始化。 + +```kotlin +lateinit var context : Context +private lateinit var flutterEngine:FlutterEngine + +// 初始化 +flutterEngine = FlutterEngine(context) +``` + +**继续完成该用于管理Flutter引擎的单例对象。** + +Demo代码的逻辑是,使用新的路由,承载Chat和Call的Activity。 + +Chat的Activity,由用户主动进入及退出;Call的Activity,由监听器或主动外呼,自动导航进及返回出。 + +重点关注: +- fun init(): 初始化 Method Channel,并为其绑定事件监听方法。 +- fun reportChatInfo(): 将用户登录信息和SDKAPPID透传至Flutter Module,使Flutter层得以初始化并登录腾讯云IM。 +- fun launchChatFunc(): 拉起或导航至 Flutter Module 所在 ViewController。 +- fun triggerNotification(msg: String): 将 iOS Native 层收到的离线推送消息点击事件,及其包含的ext信息,以 JSON String形式,透传至 Flutter 层绑定的监听处理事件。用于处理离线推送点击跳转,例如至对应会话。 + +本单例 object 的详细代码,可以参考Demo源码。 + +**在 总入口 `MyApplication` 中,初始化上述对象** + +在 `MyApplication.kt` 文件中,将全局context传入单例对象,并执行初始化。 + +```kotlin +class MyApplication : MultiDexApplication() { + + override fun onCreate() { + super.onCreate() + FlutterUtils.context = this // new + FlutterUtils.init() // new + } +} +``` + +**监听及转发离线推送点击事件** + +离线推送的初始化/Token上报/点击事件对应的会话跳转处理,已在Flutter Chat模块中进行,因此,Native区域,仅需透传点击通知事件的ext即可。 + +之所以这么做,是因为点击通知事件已在Native被拦截消费,Flutter层无法直接拿到,必须经由Native转发。 + +> 由于不同厂商的离线推送接入步骤不一致,本文以OPPO为例,全部厂商接入方案,可查看[本文档](https://cloud.tencent.com/document/product/269/75428). + +在腾讯云IM控制台中,新增OPPO的推送证书,`点击后续动作` 选择 `打开应用内指定页面`,`应用内页面` 以 `Activity` 方式,配置一个用于处理离线推送信息的页面,建议为应用首页。如,我们的Demo配置为:`com.tencent.chat.android.MainActivity`. + +![](https://qcloudimg.tencent-cloud.cn/raw/c0f8737ce6fa484479ffc9a1bec6c9c0.png) + +在上方控制台配置的用于离线推送的Activity文件中,新增如下代码。 + +该代码的作用是,当厂商拉起相应Activity时,从Bundle中取出HashMap形式ext信息,触发单例对象中的方法,将这个信息,手动转发至Flutter中。具体代码,可以参考Demo源码。 + +![](https://qcloudimg.tencent-cloud.cn/raw/2ec45c1a8b3bd952bcb86a8095f91515.png) + +此时,Android Native层编写完成。 + +[](id:native) + +## 附加方案:在 Native 层,初始化并登录腾讯云IM + +有的时候,对于Chat和Call模块能力,您希望对于高频的简单应用场景,能深入嵌入您现有的业务逻辑中。 + +例如对于游戏场景,在对局内,希望能直接发起会话。 + +而您的完整功能Chat模块,使用Flutter实现,仅是您APP中一个重要性较低的子模块,因此不希望一上来就启动一个完整的Flutter Module。 + +这个时候,您可以在Native层调用腾讯云IM Native SDK的初始化及登录方法,此后,便可在您需要的高频简单场景,直接使用腾讯云IM Native SDK,构建 In-App Chat 能力。 + +>? +> 当然,在此种情况下,您也可以选择提前先在 Flutter 初始化并登录腾讯云IM,此时,您将不再需要在 Native 层再次初始化并登录。两端仅需初始化并登录一次,即可在双端都能使用。 + +由于Flutter SDK已自带Native SDK,您不需要在Native层,再次引入,即可直接使用。 + +### Native初始化并登录 + +以 iOS Swift 代码为例,演示如何在 Native 层,初始化并登录。 + +```swift +import ImSDK_Plus + + +func initTencentChat(){ + if(isLoginSuccess == true){ + return + } + let data = V2TIMManager.sharedInstance().initSDK( 您的SDKAPPID , config: nil); + if (data == true){ + V2TIMManager.sharedInstance().login( + chatInfo.userID, + userSig: chatInfo.userSig, + succ: { + self.isLoginSuccess = true + self.reportChatInfo() + }, + fail: onLoginFailed() + ) + } +} +``` + +此后,在 Native 层面,便可直接使用Native SDK,搭建您的业务功能模块。详情可查阅 [iOS 快速入门]() 或 [Android 快速入门](https://cloud.tencent.com/document/product/269/36838)。 + +### 初始化 Flutter TUIKit + +如果您已在 Native 层完成初始化并登录,您不需要再次在 Flutter 层再次执行,但需要调用 TUIKit的 `_coreInstance.setDataFromNative()`,将当前用户信息传入。 + +```dart +final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); +_coreInstance.setDataFromNative(userId: chatInfo?.userID ?? ""); +``` +**更详细代码,请查阅我们的Demo 源码。** + +[![](https://qcloudimg.tencent-cloud.cn/raw/b622951f776a505e83f843de1f62fffc.png)](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Initialize%20from%20Native) + +----- + +至此,腾讯云IM Flutter - Native 混合开发方式已全部介绍完成。 + +您可以基于本文档给出的方案,快速在您现有的原生开发 Android/iOS APP 中,使用 Flutter SDK,使用同一套Flutter代码,快速植入 Chat 和 Call 模块能力。 + +如果您还有任何疑问,欢迎随时联系我们。 + +![](https://qcloudimg.tencent-cloud.cn/raw/eacb194c77a76b5361b2ae983ae63260.png) + + +## Reference + +1. [Integrate a Flutter module into your Android project](https://docs.flutter.dev/development/add-to-app/android/project-setup). +2. [Integrate a Flutter module into your iOS project](https://docs.flutter.dev/development/add-to-app/ios/project-setup). +3. [Adding a Flutter screen to an iOS app](https://docs.flutter.dev/development/add-to-app/ios/add-flutter-screen?tab=no-engine-vc-swift-tab). +4. [Multiple Flutter screens or views](https://docs.flutter.dev/development/add-to-app/multiple-flutters). diff --git a/doc/混合开发_en.md b/doc/混合开发_en.md new file mode 100644 index 0000000..c3c7885 --- /dev/null +++ b/doc/混合开发_en.md @@ -0,0 +1,974 @@ + +If you already have an Android/iOS APP being public online, In-APP chat and call modules may need to be added as your business develops. + +For instance, adding chat modules to video apps to facilitate interaction between viewers; adding chat modules to eshop apps to facilitate communication between customers and merchants; or adding chat modules to music and entertainment apps so that people with the same interests Taste groups, find organizations and communicate. + +Adding the chat module requires the Android/iOS team to develop and access it separately, for your existing application. It not only consumes a lot, but also may cause inconsistent experience and out-of-sync message sending and receiving. + +So, it is recommended to integrate Tencent Cloud Chat with Flutter, coding once and deploying to all platforms, which is really convenient. + +But, it’s sometimes not practical to rewrite your entire application in Flutter all at once. For those situations, Flutter can be integrated into your existing application piecemeal, as a library or module. That module can then be imported into your Android or iOS (currently supported platforms) app to render a part of your app’s UI in Flutter. + +With this solution, you are able to integrate Tencent Cloud Chat Flutter SDKs to your existing Android/iOS application. + +**It could reduce your workload, to adding chat and call modules to your existing, to a large extent.** + +![](https://qcloudimg.tencent-cloud.cn/raw/0a54bc281851a147b0f034a74c6001e5.png) + +## Environment requirements + +| | Version | +|---------|---------| +| Flutter | Flutter 2.2.0 or later for the IM SDK; Flutter 2.10.0 or later for the TUIKit integration component library.| +|Android|Android Studio 3.5 or later; devices with Android 4.1 or later for apps. | +|iOS| Xcode 11.0 or later. Ensure that your project has a valid developer signature. | +|Tencent Cloud Chat Flutter SDK|[tencent_im_sdk_plugin](https://pub.dev/packages/tencent_im_sdk_plugin) 5.0 or later, [tencent_cloud_chat_uikit](https://pub.dev/packages/tencent_cloud_chat_uikit) 0.2 or later. | + +## What you need to know first + +Before starting, you are recommended to know about Tencent Cloud Chat and adding the Flutter module to existing apps. + +### Tencent Cloud Chat + +#### Overall + +Before starting, you are supposed to be familiar with our SDKs, and the basic usage. + +Two main SDKs are included, [non-UI SDK](https://www.tencentcloud.com/document/product/1047/45907#part-5.-self-implementing-integration), and [TUIKit](https://www.tencentcloud.com/document/product/1047/50059). + +In this tutorial, we will mainly develop with TUIKit, with UI library and basic business logic. + +**You could get to know about our SDKs, with [Get Started](https://www.tencentcloud.com/document/product/1047/45907).** + +[](id:modules) + +#### Two modules + +Two main modules are included, Chat and Call. + +Chat module includes, sending and receiving messages, relationship management, etc. + +Call module includes voice call and video call, for both one-to-one call and group call. + +### Adding Flutter to Native APP + +Be simplified, the key of this solution is, embedding the Flutter module to your native application in a subproject. As the cross-platform feature of Flutter, one single Flutter module can be added to both Android and iOS projects. + +To launch a Flutter screen from an existing iOS/Android, you start a [FlutterEngine](https://api.flutter.dev/objcdoc/Classes/FlutterEngine.html) and a FlutterViewController/FlutterActiviy. + +The `FlutterEngine` serves as a host to the Dart VM and your Flutter runtime, and the `FlutterViewController`/`FlutterActivity` attaches to a FlutterEngine to pass input events into Flutter and to display frames rendered by the `FlutterEngine`. + +The `FlutterEngine` may have the same lifespan as your `FlutterViewController`/`FlutterActivity` or outlive your `FlutterViewController`/`FlutterActivity`. + +[Method Channel](https://docs.flutter.dev/development/platform-integration/platform-channels#channels-and-platform-threading) can be used to communicate between Native APP and Flutter module if necessary, like transmitting the current user info, the EXT of offline push and call data. Invoking a method on the method channel, and listening for the invoking with a `MethodCallHandler` being preset. + +[](id:android) + +#### Adding to an Android app + +[Details documentation](https://docs.flutter.dev/development/add-to-app/android/project-setup) + +Adding the Flutter module as a dependency of your existing app in Gradle. There are two ways to achieve this. The AAR mechanism creates generic Android AARs as intermediaries that package your Flutter module. This is good when your downstream app builders don’t want to have the Flutter SDK installed. But, it adds one more build step if you build frequently. + +The source code subproject mechanism is a convenient one-click build process, but requires the Flutter SDK. This is the mechanism used by the Android Studio IDE plugin. + +##### Option A - Depend on the Android Archive (AAR) + +This option packages your Flutter library as a generic local Maven repository composed of AARs and POMs artifacts. + +This option allows your team to build the host app without installing the Flutter SDK. You can then distribute the artifacts from a local or remote repository. + +It's recommended to use this option for the released version. + +**Steps:** + +Run the following command on your Flutter module. + +```shell +flutter build aar +``` + +Then, follow the on-screen instructions to integrate. + +![](https://qcloudimg.tencent-cloud.cn/raw/32e9376de02da10e97a8c54b9ab2b51c.png) + +Your app now includes the Flutter module as a dependency. + +##### Option B - Depend on the module’s source code + +This option enables a one-step build for both your Android project and Flutter project. + +This option is convenient when you work on both parts simultaneously and rapidly iterate, but your team must install the Flutter SDK to build the host app. + +It's recommended to use this option when development and debugging. + +**Steps:** + +Include the Flutter module as a subproject in the host app’s `settings.gradle`: + +```gradle +// Include the host app project. +include ':app' // assumed existing content +setBinding(new Binding([gradle: this])) // new +evaluate(new File( // new +settingsDir.parentFile, // new +'tencent_chat_module/.android/include_flutter.groovy' // new +)) // new +``` + +Introduce an `implementation` dependency on the Flutter module from your app: + +```gradle +dependencies { +implementation project(':flutter') +} +``` + +Your app now includes the Flutter module as a dependency. + +[](id:ios) + +#### Adding to an iOS app + +[Details documentation](https://docs.flutter.dev/development/add-to-app/ios/project-setup#embed-the-flutter-module-in-your-existing-application) + +There are two ways to embed Flutter in your existing application. + +- Use the CocoaPods dependency manager and install Flutter SDK. (Recommended) +- Create frameworks for the Flutter engine, your compiled Dart code, and all Flutter plugins. Manually embed the frameworks, and update your existing application’s build settings in Xcode. + +>? +> Your app does not run on a simulator in Release mode because Flutter does not yet support outputting x86/x86_64 ahead-of-time (AOT) binaries for your Dart code. You can run in Debug mode on a simulator or a real device, and Release on a real device. +> +> To run your app on a simulator follow the instructions in the bottom of section [embed the frameworks](https://docs.flutter.dev/development/add-to-app/ios/project-setup#embed-the-frameworks). + +##### Option A - Embed with CocoaPods and the Flutter SDK + +This method requires every developer working on your project to have a locally installed version of the Flutter SDK. Simply build your application in Xcode to automatically run the script to embed your Dart and plugin code. + +This allows rapid iteration with the most up-to-date version of your Flutter module without running additional commands outside of Xcode. + +It's recommended to use this option when development and debugging. + +**Steps:** + +Add the following lines to your `Podfile`: + +``` +// The path of your Flutter module +flutter_chat_application_path = '../tencent_chat_module' + +load File.join(flutter_chat_application_path, '.ios', 'Flutter', 'podhelper.rb') +``` + +For each [Podfile target](https://guides.cocoapods.org/syntax/podfile.html#target) that needs to embed Flutter, call `install_all_flutter_pods(flutter_application_path)`. + +``` +target 'MyApp' do +install_all_flutter_pods(flutter_chat_application_path) +end +``` + +In the `Podfile`’s `post_install` block, call `flutter_post_install(installer)`, and with the statement of necessary permissions. + +``` +post_install do |installer| +flutter_post_install(installer) if defined?(flutter_post_install) +installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + target.build_configurations.each do |config| + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + 'PERMISSION_MICROPHONE=1', + 'PERMISSION_CAMERA=1', + 'PERMISSION_PHOTOS=1', + ] + end + end +end +``` + +Run `pod install`. + +> ? +> +> - When you change the Flutter plugin dependencies in `tencent_chat_module/pubspec.yaml`, run `flutter pub get` in your Flutter module directory to refresh the list of plugins read by the `podhelper.rb` script. Then, run pod install again from the root directory of your application. +> - You may need to run `arch -x86_64 pod install --repo-update` on the Mac with Apple Silicon, like M1 or M2. + +The `podhelper.rb` script embeds your plugins, `Flutter.framework`, and `App.framework` into your project. + +##### Option B - Embed frameworks in Xcode + +Alternatively, you can generate the necessary frameworks and embed them in your application by manually editing your existing Xcode project. + +You may do this if members of your team can’t locally install Flutter SDK and CocoaPods, or if you don’t want to use CocoaPods as a dependency manager in your existing applications. + +You must run `flutter build ios-framework` every time you make code changes in your Flutter module. + +It's recommended to use this option for the released version. + +**Steps:** + +Run the following command on your Flutter module. + +The following example assumes that you want to generate the frameworks to `some/path/MyApp/Flutter/`. + +```shell +flutter build ios-framework --output=some/path/MyApp/Flutter/ +``` + +Embed and link the generated frameworks into your existing application in Xcode. + +## The mode of adding + +It's recommended to add the Flutter module to your existing application. + +Two modules needed to be added by `FlutterEngine`, Chat and Call. For details, [see here](#modules). + +Two modes of `FlutterEngine` are provided, single `FlutterEngine` or two `FlutterEngine`s with a `FlutterEngineGroup`. + +| Mode | Introduction | Props | Cons | Demo | +|---------|---------|---------|---------|---------| +| [Single FlutterEngine](#single) | Both Chat and Call integrate into one `FlutterEngine` | Convenient | It's required to navigate to the Flutter page, when new call income, to show the call status, which may interrupt the current status, with a relatively bad experience. | [GitHub](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Single%20Flutter%20Engines) | +| [Multiple FlutterEngines](#multiple) | Call and Chat modules located in two separate FlutterEngine | Only the presence of the calling page separately when a new call is incoming is necessary, and dismiss it automatically when call ends, without the navigating of current status, for a better experience. | Minimize for the calling page is not allowed. | [GitHub](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Multiple%20Flutter%20Engines) | + +Additionally, the solution of integrating both Native Chat SDK and Flutter Chat SDK is also provided. For details, [see here](#native), and demo can be found from [GitHub](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Initialize%20from%20Native). + +[](id:multiple) + +## Solution A: Multiple FlutterEngines (Recommended) + +The advantage of using multiple Flutter instances is that each instance is independent and maintains its own internal navigation stack, UI, and application states. This simplifies the overall application code’s responsibility for state keeping and improves modularity. More details on the scenarios motivating the usage of multiple Flutters can be found at docs.flutter.dev/go/multiple-flutters. + +![](https://qcloudimg.tencent-cloud.cn/raw/87cc37d846388fb3c66aab6743cfede2.png) + +The primary API for adding multiple Flutter instances on both Android and iOS is based on a new `FlutterEngineGroup` class to construct `FlutterEngine`s, rather than the `FlutterEngine` constructors used in the [Solution B: Single FlutterEngine](#single). + +Whereas the `FlutterEngine` API was direct and easier to consume, the `FlutterEngine` spawned from the same `FlutterEngineGroup` have the performance advantage of sharing many of the common, reusable resources such as the GPU context, font metrics, and isolate group snapshot, leading to a faster initial rendering latency and lower memory footprint. + +In our project, one single `FlutterEngineGroup` is used to manage the two `FlutterEngine`s, including Chat and Call modules. + +[![](https://qcloudimg.tencent-cloud.cn/raw/9ab7dc1c98627885eea01ddfd1803bb3.png)](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Multiple%20Flutter%20Engines) + +### The development of Flutter module + +To embed Flutter into your existing application, first create a Flutter module. + +From the command line, run: + +``` +cd some/path/ +flutter create --template module tencent_chat_module +``` + +A Flutter module project is created at `some/path/tencent_chat_module/`. From that directory, you can run the same flutter commands you would in any other Flutter project, like `flutter run --debug` or `flutter build ios`. You can also run the module in Android Studio/IntelliJ or VS Code with the Flutter and Dart plugins. This project contains a single-view example version of your module before it’s embedded in your existing application, which is useful for incrementally testing the Flutter-only parts of your code. + +The `tencent_chat_module` module directory structure is similar to a normal Flutter application: + +``` +tencent_chat_module/ +├── .ios/ +│ ├── Runner.xcworkspace +│ └── Flutter/podhelper.rb +├── lib/ +│ └── main.dart +├── test/ +└── pubspec.yaml +``` + +Now, we can code within `lib/`. + +#### The structure of `lib/` + +>? +> +> The following structure and code is for demonstration purposes only, you could modify it to meet your actual needs dynamically. + +Now, let's create three directory within `lib/`, including `call`, `chat` and `common`. Which is used for Call module, Chat module and some common classes separately. + +``` +tencent_chat_module/ +├── lib/ +│ └── call/ +│ └── chat/ +│ └── common/ +``` + +#### Common model classes + +Add the two following classes to a new file, `common/common_model.dart`. Used for definition the communication proxy between native and Flutter. + +```dart +class ChatInfo { +String? sdkappid; +String? userSig; +String? userID; + +ChatInfo.fromJSON(Map json) { + sdkappid = json["sdkappid"].toString(); + userSig = json["userSig"].toString(); + userID = json["userID"].toString(); +} + +Map toMap(){ + final Map map = {}; + if(sdkappid != null){ + map["sdkappid"] = sdkappid!; + } + if(userSig != null){ + map["userSig"] = userSig!; + } + if(userID != null){ + map["userID"] = userID!; + } + return map; +} +} + +class CallInfo{ +String? userID; +String? groupID; + +CallInfo(); + +CallInfo.fromJSON(Map json) { + groupID = json["groupID"].toString(); + userID = json["userID"].toString(); +} + +Map toMap(){ + final Map map = {}; + if(userID != null){ + map["userID"] = userID!; + } + if(groupID != null){ + map["groupID"] = groupID!; + } + return map; +} +} +``` + +#### Chat Module + +**The following files and codes are located in the `lib/chat` directory.** + +1. Create a file, `model.dart`, used as a state container. + This model is used to initialize and maintain the instance of Tencent Cloud Chat, offline line push module, global state, and the communication with native apps. + Is the core of the Chat module. + Detailed implementation can refer to the source code of the demo, while it's recommended to focus on these three functions: + - Future _handleMessage(MethodCall call): Listening for the message call from native app. + - Future handleClickNotification(Map msg): The function invoked by the callback after clicking the notification. + - Future initChat(): Initialize and log in Tencent Cloud Chat SDK and offline push plugin, upload token. This method uses the sync lock mechanism to ensure that only one can be executed at the same time, and after the initialization is successful, it will not be executed repeatedly. + +> ? +> +> Please configure the offline push before uploading the token and use this capability, referring to this [documentation](https://www.tencentcloud.com/document/product/1047/50032). + +2. Create a file, `chat_main.dart`, used as the main entrance of the chat module. + - Also, used as the home page of the chat module. + - It shows the loading status before logged in, followed by the conversation list. + - Besides, the current status of the application needs to be reported to the Tencent Cloud Chat backend upon each foreground/background switch from here. Referring to this [documentation](https://www.tencentcloud.com/document/product/1047/50032#step-5.-listen-for-the-foreground.2Fbackground-switch.3Ca-id.3D.22step_5.22.3E.3C.2Fa.3E). + - Detailed implementation can refer to the source code of the demo. + +3. Create a file, `push.dart`, used for maintaining the [offline push plugin](https://www.tencentcloud.com/document/product/1047/50032). Detailed implementation can refer to the source code of the demo. + +4. Create a file, `conversation.dart`, used for implementing conversation list widget `TIMUIKitConversation`. Detailed implementation can refer to the source code of the demo. + +5. Create a file, `user_profile.dart`, used to implement the user profile widget `TIMUIKitProfile`. Detailed implementation can refer to the source code of the demo. + +6. Create a file, `group_profile.dart`, used to implement group profile widget `TIMUIKitGroupProfile`. Detailed implementation can refer to the source code of the demo. + +7. Create a file, `chat.dart`, used for implementing the history message list and sending messages widget `TIMUIKitChat`. This page can also navigate to `user_profile.dart` and `conversation.dart`.Detailed implementation can refer to the source code of the demo. + +Now, Chat module has been developed, with the following structure: + +``` +tencent_chat_module/ +├── lib/ +│ └── call/ +│ └── chat.dart +│ └── model.dart +│ └── chat_main.dart +│ └── push.dart +│ └── conversation.dart +│ └── user_profile.dart +│ └── group_profile.dart +│ └── chat/ +│ └── common/ +``` + +#### Call Module + +This module is used for voice call and video call, provided by our [calling plugin](https://pub.dev/packages/tim_ui_kit_calling_plugin). + +The key feature of this module is, when receiving the income calling, invoke the method to native requesting show this page; or, initiate a call to others, when receiving the request from Chat module, via native. + +**The following files and codes are located in the `lib/calls` directory.** + +1. Create a file, `model.dart`, used as a state container. + This model is used for initializing and maintaining the instance of [Calling plug-in](https://pub.dev/packages/tim_ui_kit_calling_plugin), global state, and the communication with native apps. + Is the core of the Call module. + Detailed implementation can refer to the source code of the demo, while it's recommended to focus on these three functions: + - _onRtcListener = TUICallingListener(...): The listener of the calling events, notify native to show this page, when receiving a new call. + - Future _handleMessage(MethodCall call): The listener of the method channel call events, mainly used for initiating a call to others, when receiving the request from the Chat module, via native. + +2. Create a file, `call_main.dart`, used as the main entry point of the Call module. +The `navigatorKey` used for the launch calling page is supposed to be added here. + Detailed implementation can refer to the source code of the demo. + +#### Configure the entry point for each modules + +After developing the three parts above, now we can configure the entry point for each module, used as the entrance for FlutterEngine. + +1. Default entry + +Open `lib/main.dart`, modify the default main functions to return an empty `MaterialApp`. + +This function is the entry point, while not being used in this solution. + +As, the name of the entry point is necessary while the creation of a `FlutterEngine`, and we won't create a `FlutterEngine` without a name. + +```dart +void main() { +WidgetsFlutterBinding.ensureInitialized(); + +runApp(MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: Container(), +)); +} +``` + +2. The entry for Chat module + +Use `@pragma('vm:entry-point')` annotation to mark a method as an entry point. The method name `chatMain` is the name of the entry. + +In Native, this name is also used to create the corresponding `FlutterEngine`. + +Use global `ChangeNotifierProvider` status management to maintain `ChatInfoModel` data and business logic. + +```dart +@pragma('vm:entry-point') +void chatMain() { +// This call ensures the Flutter binding has been set up before creating the +// MethodChannel-based model. +WidgetsFlutterBinding.ensureInitialized(); + +final model = ChatInfoModel(); + +runApp( + ChangeNotifierProvider.value( + value: model, + child: const ChatAPP(), + ), +); +} +``` + +3. The entry for Call module + +This entry point is named as `callMain`. + +Use global `ChangeNotifierProvider` status management to maintain `CallInfoModel` data and business logic. + +```dart +@pragma('vm:entry-point') +void callMain() { +// This call ensures the Flutter binding has been set up before creating the +// MethodChannel-based model. +WidgetsFlutterBinding.ensureInitialized(); + +final model = CallInfoModel(); + +runApp( + ChangeNotifierProvider.value( + value: model, + child: const CallAPP(), + ), +); +} +``` + +So far, the Dart code for the Flutter Module has been written. + +Now, let's take a look at the native integration for your existing app. + +### iOS Native development + +Here, we take `Swift` as an example, while `Objective-C` is also available. + +>? +> +> The following structure and code is for demonstration purposes only, you could modify it to meet your actual needs dynamically. + +Open your iOS project within XCode. + +If your existing application (MyApp) doesn’t already have a `Podfile`, follow the [CocoaPods getting started guide](https://guides.cocoapods.org/using/using-cocoapods.html) to add a Podfile to your project. + +#### Import Flutter Module + +Please refer to [this part](#ios), adding the Flutter module to your existing iOS app. + +#### FlutterEngineGroup + +![](https://qcloudimg.tencent-cloud.cn/raw/039ec36a5696f2188f9fa8ab11071210.png) + +**Create a `FlutterEngineGroup` to maintain and manage the `FlutterEngine`s.** + +The proper place to create a `FlutterEngineGroup` is specific to your host app. As an example, we demonstrate creating a `FlutterEngineGroup`, exposed as a property, on app startup in the app delegate. + +Add the following to `AppDelegate.swift`. + +```swift +@UIApplicationMain +class AppDelegate: FlutterAppDelegate { +lazy var flutterEngines = FlutterEngineGroup(name: "chat.flutter.tencent", project: nil) +... +} +``` + +**Create a singleton static object to hold `FlutterEngine`s.** + +This singleton is used for managing those `FlutterEngine`s in one place, and provides methods to the whole project to invoke methods related to the Flutter module. + +The basic implementation logic of the demo is that, using a new navigator for the ViewController of Chat, while `present` and `dismiss` the ViewController of Call automatically. + +Create a new file, `FlutterUtils.swift`, and coding, refer to our demo source code. + +Mainly focus on: + +- private override init(): Initialize each Flutter instance, register method channel events. +- func reportChatInfo(): Report the current user info to the Flutter module, for initialization and login Tencent Cloud Chat SDK. +- func launchCallFunc(): Present the ViewController for Call module, invoked when new call income or user active it manually from Chat module. +- func triggerNotification(msg: String): Transit the data of notification, after the user clicks it, and Chat module may navigate to the corresponding chat page. + +**Listening and transit the notification click event** + +Only transit of the data of notification after clicking is necessary as, the initialization of Push plug-in, uploading token and the navigating for notification clicking events have been done in Flutter Chat module. + +The reason why we need to do this is because the clicking event has been consumed by Native, so it is impossible for the Flutter Push plug-in to receive this event. + +Add the following codes to `AppDelegate.swift`. + +![](https://qcloudimg.tencent-cloud.cn/raw/9c816ae4745e5a8d2b9b1d64167e1fc5.png) + +Now, we finished the implementation for iOS. + +### Android Native Development + +Here, we take `Kotlin` as an example, while `Java` is also available. + +>? +> +> The following structure and code is for demonstration purposes only, you could modify it to meet your actual needs dynamically. + +Open your Android project within Android Studio. + +#### Import Flutter Module + +Please refer to [this part](#android), adding the Flutter module to your existing Android app. + +#### FlutterEngineGroup + +**Create a `FlutterEngineGroup` to maintain and manage the `FlutterEngine`s.** + +The proper place to create a `FlutterEngineGroup` is specific to your host app. As an example, we demonstrate creating a `FlutterEngineGroup`, exposed as a property, on app startup in the app delegate. + +Create a new file, `FlutterUtils.kt`, and define a singleton static object `FlutterUtils`. + +```kotlin +@SuppressLint("StaticFieldLeak") +object FlutterUtils {} +``` + +**Create a `FlutterEngineGroup` to maintain and manage the `FlutterEngine`s.** + +Define a `FlutterEngineGroup`, `FlutterEngine`s and corresponding `MethodChannel`s in `FlutterUtils.kt`. + +```kotlin +lateinit var context : Context +lateinit var flutterEngines: FlutterEngineGroup +private lateinit var chatFlutterEngine:FlutterEngine +private lateinit var callFlutterEngine:FlutterEngine + +lateinit var chatMethodChannel: MethodChannel +lateinit var callMethodChannel: MethodChannel + +// Initialize them +flutterEngines = FlutterEngineGroup(context) +... +``` + +**Further developed for this singleton static object** + +The basic implementation logic of the demo is that, using a new navigator for the `Activity` for both Chat and Chat. + +The `Activity` for Chat is entered and exited by the user, while the `Activity` for Call has been entered and exited automatically, triggered by the listener or making a call manually. + +Mainly focus on: +- fun init(): Initialize each Flutter instance, register method channel events. +- fun reportChatInfo(): Report the current user info to the Flutter module, for initialization and login Tencent Cloud Chat SDK. +- fun launchCallFunc(): Present the `Activity` for Call module, invoked when new call income or user active it manually from Chat module. +- fun triggerNotification(msg: String): Transit the data of notification, after the user clicks it, and Chat module may navigate to the corresponding chat page. + +You can refer to the demo source code for this object. + +**Initialize the singleton static object above from the main entry `MyApplication`.** + +Transit the global context to the singleton static object, and initialize it from `MyApplication.kt`. + +```kotlin +class MyApplication : MultiDexApplication() { + + override fun onCreate() { + super.onCreate() + FlutterUtils.context = this // new + FlutterUtils.init() // new + } +} +``` + +**Listening and transit the notification click event** + +Only transit of the data of notification after clicking is necessary as, the initialization of Push plug-in, uploading token and the navigating for notification clicking events have been done in Flutter Chat module. + +The reason why we need to do this is the clicking event has been consumed by Android Kotlin, so it is impossible for the Flutter Push plug-in to receive this event. + +> Due to the diversity and inconsistency among different manufacturers, we only take OPPO as an example. For the whole manufacturer's support, please refer to this [documentation](https://www.tencentcloud.com/document/product/1047/50032). + +Add a new push certificate to the Tencent Cloud Chat console, Select **Open specified in-app page > activity** for the opening method and enter an activity to receive the notification clicking event with EXT data, it's suggested to set it as the home page or the main entrance. Like, we set `MainActivity` for our demo, `com.tencent.chat.android.MainActivity`. + +![](https://qcloudimg.tencent-cloud.cn/raw/fd384ea1140199113d01a6650c0c8f3d.png) + +Adding the following codes to the `Activity`, set for the console above. + +The EXT data of the notification can be found from `Bundle` when the `Activity` has been launched by the device, when the user clicks the notification. + +You can receive the EXT from `Activity`, and transit them to Flutter. + +You can refer to the demo source code for this capability. + +![](https://qcloudimg.tencent-cloud.cn/raw/2ec45c1a8b3bd952bcb86a8095f91515.png) + +Now, we finished the implementation for Android. + +[](id:single) + +## Solution B: Single FlutterEngine + +In this solution, the Chat module and Call module embed in one single Flutter instance. + +![](https://qcloudimg.tencent-cloud.cn/raw/115b917df15da5d84ea6794774a3b080.png) + +As a result, those modules can only be shown or hidden at the same time. + +[![](https://qcloudimg.tencent-cloud.cn/raw/9ab7dc1c98627885eea01ddfd1803bb3.png)](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Single%20Flutter%20Engines) + +### Flutter Module development + +To embed Flutter into your existing application, first create a Flutter module. + +From the command line, run: + +``` +cd some/path/ +flutter create --template module tencent_chat_module +``` + +A Flutter module project is created at `some/path/tencent_chat_module/`. From that directory, you can run the same flutter commands you would in any other Flutter project, like `flutter run --debug` or `flutter build ios`. You can also run the module in Android Studio/IntelliJ or VS Code with the Flutter and Dart plugins. This project contains a single-view example version of your module before it’s embedded in your existing application, which is useful for incrementally testing the Flutter-only parts of your code. + +The `tencent_chat_module` module directory structure is similar to a normal Flutter application: + +``` +tencent_chat_module/ +├── .ios/ +│ ├── Runner.xcworkspace +│ └── Flutter/podhelper.rb +├── lib/ +│ └── main.dart +├── test/ +└── pubspec.yaml +``` + +Now, we can code within `lib/`. + +#### main.dart + +Modify `main.dart`, integrating [TUIKit](https://www.tencentcloud.com/document/product/1047/50054), [Offline Push plug-in](https://www.tencentcloud.com/document/product/1047/50032) and [Call Plug-in](https://pub.dev/packages/tim_ui_kit_calling_plugin). + +The global state, method channel and our Tencent Cloud Chat SDKs, maintained by `ChatInfoModel`. + +After receiving the login user info from Native, invoke `_coreInstance.init()` and `_coreInstance.login()` to initialize and login the SDK. Also, Call plug-in and Push plug-in need to be initialized. + +> ? +> +> Please configure the offline push before uploading the token and use this capability, referring to this [documentation](https://www.tencentcloud.com/document/product/1047/50032). + +Tips for Call plug-in: +- Listening for the call invitation, when a new call comes, notify Native to launch the Flutter page if not currently located in. + +Tips for Push plug-in: +- The callback event of notification clicking, transmitted from Native, and used for navigating to corresponding chat from EXT data. + +Also, this is used as the home page of the chat module. It shows the loading status before logged in, followed by the conversation list. + +Besides, the current status of the application needs to be reported to the Tencent Cloud Chat backend upon each foreground/background switch from here. Referring to this [documentation](https://www.tencentcloud.com/document/product/1047/50032#step-5.-listen-for-the-foreground.2Fbackground-switch.3Ca-id.3D.22step_5.22.3E.3C.2Fa.3E). + +Detailed implementation can refer to the source code of the demo. + +#### Other widgets from TUIKit + +1. Create a file, `push.dart`, used for maintaining the [offline push plugin](https://www.tencentcloud.com/document/product/1047/50032). Detailed implementation can refer to the source code of the demo. + +2. Create a file, `conversation.dart`, used to implement group profile widget `TIMUIKitGroupProfile`. Detailed implementation can refer to the source code of the demo. + +3. Create a file, `user_profile.dart`, used to implement the user profile widget `TIMUIKitProfile`. Detailed implementation can refer to the source code of the demo. + +4. Create a file, `group_profile.dart`, used to implement group profile widget `TIMUIKitGroupProfile`. Detailed implementation can refer to the source code of the demo. + + +5. Create a file, `chat.dart`, used for implementing the history message list and sending messages widget `TIMUIKitChat`. This page can also navigate to `user_profile.dart` and `conversation.dart`.Detailed implementation can refer to the source code of the demo. + +Now, the Flutter module has been developed. + +### iOS Native development + +Here, we take `Swift` as an example, while `Objective-C` is also available. + +>? +> +> The following structure and code is for demonstration purposes only, you could modify it to meet your actual needs dynamically. + +Open your iOS project within XCode. + +If your existing application (MyApp) doesn’t already have a `Podfile`, follow the [CocoaPods getting started guide](https://guides.cocoapods.org/using/using-cocoapods.html) to add a Podfile to your project. + +#### Import Flutter Module + +Please refer to [this part](#ios), adding the Flutter module to your existing iOS app. + +#### FlutterEngine + +**Create a FlutterEngine.** + +The proper place to create a `FlutterEngine` is specific to your host app. As an example, we demonstrate creating a `FlutterEngine`, exposed as a property, on app startup in the app delegate. + +```swift +import UIKit +import Flutter +import FlutterPluginRegistrant + +@UIApplicationMain +class AppDelegate: FlutterAppDelegate { // More on the FlutterAppDelegate. + lazy var flutterEngine = FlutterEngine(name: "tencent cloud chat") + + override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Runs the default Dart entrypoint with a default Flutter route. + flutterEngine.run(); + GeneratedPluginRegistrant.register(with: self.flutterEngine); + return super.application(application, didFinishLaunchingWithOptions: launchOptions); + } +} +``` + +**Create a singleton static object to manage the FlutterEngine.** + +This singleton is used for managing `FlutterEngine` in one place, and provides methods to the whole project to invoke methods related to the Flutter module. + +The basic implementation logic of the demo is that, using a new navigator for the ViewController of Flutter module, and show or hidden can be handled automatically according to call. + +Create a new file, `FlutterUtils.swift`, and coding, refer to our demo source code. + +Mainly focus on: + +- private override init(): Initialize each Flutter instance, register method channel events. +- func reportChatInfo(): Report the current user info to the Flutter module, for initialization and login Tencent Cloud Chat SDK. +- func launchChatFunc(): Present the ViewController for Flutter module. +- func triggerNotification(msg: String): Transit the data of notification, after the user clicks it, and Chat module may navigate to the corresponding chat page. + +**Listening and transit the notification click event** + +Only transit of the data of notification after clicking is necessary as, the initialization of Push plug-in, uploading token and the navigating for notification clicking events have been done in Flutter Chat module. + +The reason why we need to do this is the clicking event has been consumed by iOS Swift, so it is impossible for the Flutter Push plug-in to receive this event. + +Add the following codes to `AppDelegate.swift`. + +![](https://qcloudimg.tencent-cloud.cn/raw/9c816ae4745e5a8d2b9b1d64167e1fc5.png) + +Now, we finished the implementation for iOS. + +### Android Native Development + +Here, we take `Kotlin` as an example, while `Java` is also available. + +>? +> +> The following structure and code is for demonstration purposes only, you could modify it to meet your actual needs dynamically. + +Open your Android project within Android Studio. + +#### Import Flutter Module + +Please refer to [this part](#android), adding the Flutter module to your existing Android app. + +#### FlutterEngine + +**Create a singleton static object to manage the FlutterEngine.** + +This singleton is used for managing `FlutterEngine` in one place, and provides methods to the whole project to invoke methods related to the Flutter module. + +Create a new file, `FlutterUtils.kt`, and define a singleton static object `FlutterUtils`. + +```kotlin +@SuppressLint("StaticFieldLeak") +object FlutterUtils {} +``` + +**Create a `FlutterEngine`.** + +Define a `FlutterEngine` and corresponding `MethodChannel` in `FlutterUtils.kt`. + +```kotlin +lateinit var context : Context +private lateinit var flutterEngine:FlutterEngine + +// 初始化 +flutterEngine = FlutterEngine(context) +``` + +**Further developed for this singleton static object** + +The basic implementation logic of the demo is that, using a new navigator for the `Activity` of Flutter module, and show or hidden can be handled automatically according to call. + +Mainly focus on: + +- fun init(): Initialize each Flutter instance, register method channel events. +- fun reportChatInfo(): Report the current user info to the Flutter module, for initialization and login Tencent Cloud Chat SDK. +- fun launchChatFunc(): Present the `Activity` for Flutter module. +- fun triggerNotification(msg: String): Transit the data of notification, after the user clicks it, and Chat module may navigate to the corresponding chat page. + +Detailed implementation can refer to the source code of the demo. + +**Initialize the singleton static object above from the main entry `MyApplication`.** + +Transit the global context to the singleton static object, and initialize it from `MyApplication.kt`. + +```kotlin +class MyApplication : MultiDexApplication() { + + override fun onCreate() { + super.onCreate() + FlutterUtils.context = this // new + FlutterUtils.init() // new + } +} +``` + +**Listening and transit the notification click event** + +Only transit of the data of notification after clicking is necessary as, the initialization of Push plug-in, uploading token and the navigating for notification clicking events have been done in Flutter Chat module. + +The reason why we need to do this is the clicking event has been consumed by Android Kotlin, so it is impossible for the Flutter Push plug-in to receive this event. + +> Due to the diversity and inconsistency among different manufacturers, we only take OPPO as an example. For the whole manufacturer's support, please refer to this [documentation](https://www.tencentcloud.com/document/product/1047/50032). + +Add a new push certificate to the Tencent Cloud Chat console, Select **Open specified in-app page > activity** for the opening method and enter an activity to receive the notification clicking event with EXT data, it's suggested to set it as the home page or the main entrance. Like, we set `MainActivity` for our demo, `com.tencent.chat.android.MainActivity`. + +![](https://qcloudimg.tencent-cloud.cn/raw/fd384ea1140199113d01a6650c0c8f3d.png) + +Adding the following codes to the `Activity`, set for the console above. + +The EXT data of the notification can be found from `Bundle` when the `Activity` has been launched by the device, when the user clicks the notification. + +You can receive the EXT from `Activity`, and transit them to Flutter. + +You can refer to the demo source code for this capability. + +![](https://qcloudimg.tencent-cloud.cn/raw/2ec45c1a8b3bd952bcb86a8095f91515.png) + +Now, we finished the implementation for Android. + +[](id:native) + +## Additional solution: Initialize Tencent Cloud Chat from Native + +Sometimes, you may prefer to integrate a chat module to your existing UI without a complex chat page. + +Like, assuming that you have a game, and hope players can chat with each other during the match, without navigating to the full screen chat page. + +Means, you may not wish to launch a complex Flutter engine, before the user switches to the chat page, but hope they can still chat in a small module directly. + +In this case, you are supposed to initialize and login Tencent Cloud Chat with Native SDK. + +>? +> However, you can also choose to initialize and login within Flutter up to your needs. This process should only be executed once, no matter where you execute it. + +It's unnecessary to import Native SDK manually, as our Flutter SDK can help you integrate it. + +### Initialize and login + +Take the iOS Swift code as an example to demonstrate how to initialize and log in at Native. + +```swift +import ImSDK_Plus + + +func initTencentChat(){ + if(isLoginSuccess == true){ + return + } + let data = V2TIMManager.sharedInstance().initSDK( Yours SDKAPPID , config: nil); + if (data == true){ + V2TIMManager.sharedInstance().login( + chatInfo.userID, + userSig: chatInfo.userSig, + succ: { + self.isLoginSuccess = true + self.reportChatInfo() + }, + fail: onLoginFailed() + ) + } +} +``` + +After that, you could use the API provided by Native SDK to implement your chat modules to your existing UI page manually. + +For more information about the Native SDK, please refer to [this documentation](https://www.tencentcloud.com/document/product/1047/47968). + +### Initialize Flutter TUIKit + +The current user info should be provided to Flutter TUIKit, after initialized and logged in from Native, by invoking `_coreInstance.setDataFromNative()`. + +```dart +final CoreServicesImpl _coreInstance = TIMUIKitCore.getInstance(); +_coreInstance.setDataFromNative(userId: chatInfo?.userID ?? ""); +``` + +You can refer to the demo source code for this module. + +[![](https://qcloudimg.tencent-cloud.cn/raw/9ab7dc1c98627885eea01ddfd1803bb3.png)](https://github.com/TencentCloud/tencentchat-add-flutter-to-app/tree/main/Initialize%20from%20Native) + +----- + +That's all you need to add Tencent Cloud Chat to your existing application. + +You can easily add In-App Chat and Voice/Video Call to your application with Flutter. + +If there's anything unclear or you have more ideas, feel free to contact us! + +- Telegram Group: https://t.me/+1doS9AUBmndhNGNl +- WhatsApp Group: https://chat.whatsapp.com/Gfbxk7rQBqc8Rz4pzzP27A +- QQ Group: 788910197, chat in Chinese + +## Reference + +1. [Integrate a Flutter module into your Android project](https://docs.flutter.dev/development/add-to-app/android/project-setup). +2. [Integrate a Flutter module into your iOS project](https://docs.flutter.dev/development/add-to-app/ios/project-setup). +3. [Adding a Flutter screen to an iOS app](https://docs.flutter.dev/development/add-to-app/ios/add-flutter-screen?tab=no-engine-vc-swift-tab). +4. [Multiple Flutter screens or views](https://docs.flutter.dev/development/add-to-app/multiple-flutters). diff --git a/example/lib/TIMUIKitAddFriendExample.dart b/example/lib/TIMUIKitAddFriendExample.dart index bf9386a..22a4428 100644 --- a/example/lib/TIMUIKitAddFriendExample.dart +++ b/example/lib/TIMUIKitAddFriendExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitAddFriendExample extends StatelessWidget { const TIMUIKitAddFriendExample({Key? key}) : super(key: key); diff --git a/example/lib/TIMUIKitAddGroupExample.dart b/example/lib/TIMUIKitAddGroupExample.dart index 3795dee..9906847 100644 --- a/example/lib/TIMUIKitAddGroupExample.dart +++ b/example/lib/TIMUIKitAddGroupExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitAddGroupExample extends StatelessWidget { const TIMUIKitAddGroupExample({Key? key}) : super(key: key); diff --git a/example/lib/TIMUIKitBlackListExample.dart b/example/lib/TIMUIKitBlackListExample.dart index 14b8338..bcbef73 100644 --- a/example/lib/TIMUIKitBlackListExample.dart +++ b/example/lib/TIMUIKitBlackListExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitBlackListExample extends StatelessWidget { const TIMUIKitBlackListExample({Key? key}) : super(key: key); diff --git a/example/lib/TIMUIKitChatExample.dart b/example/lib/TIMUIKitChatExample.dart index a152be3..770beab 100644 --- a/example/lib/TIMUIKitChatExample.dart +++ b/example/lib/TIMUIKitChatExample.dart @@ -3,8 +3,8 @@ import 'package:example/TIMUIKitGroupProfileExample.dart'; import 'package:example/TIMUIKitProfileExample.dart'; import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitChatExample extends StatelessWidget { final V2TimConversation? selectedConversation; @@ -79,7 +79,7 @@ class TIMUIKitChatExample extends StatelessWidget { }, icon: Image.asset( 'images/more.png', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: 34, width: 34, )) diff --git a/example/lib/TIMUIKitContactExample.dart b/example/lib/TIMUIKitContactExample.dart index f72c6dd..3a0b5d3 100644 --- a/example/lib/TIMUIKitContactExample.dart +++ b/example/lib/TIMUIKitContactExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitContactExample extends StatelessWidget { const TIMUIKitContactExample({Key? key}) : super(key: key); diff --git a/example/lib/TIMUIKitConversationExample.dart b/example/lib/TIMUIKitConversationExample.dart index 7fe030c..b0458bc 100644 --- a/example/lib/TIMUIKitConversationExample.dart +++ b/example/lib/TIMUIKitConversationExample.dart @@ -1,6 +1,6 @@ // ignore_for_file: file_names, avoid_print import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart'; import 'TIMUIKitChatExample.dart'; diff --git a/example/lib/TIMUIKitGroupExample.dart b/example/lib/TIMUIKitGroupExample.dart index 7976cc8..8966604 100644 --- a/example/lib/TIMUIKitGroupExample.dart +++ b/example/lib/TIMUIKitGroupExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitGroupExample extends StatelessWidget { const TIMUIKitGroupExample({Key? key}) : super(key: key); diff --git a/example/lib/TIMUIKitGroupProfileExample.dart b/example/lib/TIMUIKitGroupProfileExample.dart index 778d55e..d36aac6 100644 --- a/example/lib/TIMUIKitGroupProfileExample.dart +++ b/example/lib/TIMUIKitGroupProfileExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitGroupProfileExample extends StatelessWidget { final String? groupID; diff --git a/example/lib/TIMUIKitNewContactExample.dart b/example/lib/TIMUIKitNewContactExample.dart index c827a50..7eaa6fb 100644 --- a/example/lib/TIMUIKitNewContactExample.dart +++ b/example/lib/TIMUIKitNewContactExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitNewContactExample extends StatelessWidget { const TIMUIKitNewContactExample({Key? key}) : super(key: key); diff --git a/example/lib/TIMUIKitProfileExample.dart b/example/lib/TIMUIKitProfileExample.dart index b667679..178d86b 100644 --- a/example/lib/TIMUIKitProfileExample.dart +++ b/example/lib/TIMUIKitProfileExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitProfileExample extends StatelessWidget { final String? userID; diff --git a/example/lib/TIMUIKitSearchExample.dart b/example/lib/TIMUIKitSearchExample.dart index abe48cd..d547e53 100644 --- a/example/lib/TIMUIKitSearchExample.dart +++ b/example/lib/TIMUIKitSearchExample.dart @@ -1,7 +1,7 @@ // ignore_for_file: avoid_print, file_names, deprecated_member_use import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitSearchExample extends StatelessWidget { const TIMUIKitSearchExample({Key? key}) : super(key: key); diff --git a/example/lib/main.dart b/example/lib/main.dart index 93f4643..1c0660e 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -5,8 +5,8 @@ import 'package:example/TIMUIKitChatExample.dart'; import 'package:example/TIMUIKitConversationExample.dart'; import 'package:example/TIMUIKitProfileExample.dart'; import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/widgets/toast.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/toast.dart'; import 'TIMUIKitAddFriendExample.dart'; import 'TIMUIKitAddGroupExample.dart'; diff --git a/example/pubspec.lock b/example/pubspec.lock index 64d6bb2..db7d299 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -7,7 +7,7 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "49.0.0" + version: "50.0.0" adaptive_action_sheet: dependency: transitive description: @@ -21,14 +21,14 @@ packages: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "5.2.0" archive: dependency: "direct main" description: name: archive url: "https://pub.dartlang.org" source: hosted - version: "3.3.1" + version: "3.3.5" args: dependency: transitive description: @@ -70,42 +70,42 @@ packages: name: build_config url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" cached_network_image: dependency: transitive description: name: cached_network_image url: "https://pub.dartlang.org" source: hosted - version: "3.2.1" + version: "3.2.2" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "2.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" camera: dependency: transitive description: name: camera url: "https://pub.dartlang.org" source: hosted - version: "0.10.0+3" + version: "0.10.0+4" camera_android: dependency: transitive description: name: camera_android url: "https://pub.dartlang.org" source: hosted - version: "0.10.0+3" + version: "0.10.0+4" camera_avfoundation: dependency: transitive description: @@ -119,7 +119,7 @@ packages: name: camera_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.3.1" camera_web: dependency: transitive description: @@ -175,7 +175,7 @@ packages: name: convert url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.1" cross_file: dependency: transitive description: @@ -238,21 +238,21 @@ packages: name: dotted_border url: "https://pub.dartlang.org" source: hosted - version: "2.0.0+2" + version: "2.0.0+3" extended_image: dependency: transitive description: name: extended_image url: "https://pub.dartlang.org" source: hosted - version: "6.2.1" + version: "6.3.2" extended_image_library: dependency: transitive description: name: extended_image_library url: "https://pub.dartlang.org" source: hosted - version: "3.3.0" + version: "3.4.1" fake_async: dependency: transitive description: @@ -346,7 +346,7 @@ packages: name: flutter_markdown url: "https://pub.dartlang.org" source: hosted - version: "0.6.12" + version: "0.6.13" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -360,14 +360,14 @@ packages: name: flutter_plugin_record_plus url: "https://pub.dartlang.org" source: hosted - version: "0.0.11" + version: "0.0.15" flutter_screenutil: dependency: transitive description: name: flutter_screenutil url: "https://pub.dartlang.org" source: hosted - version: "5.5.4" + version: "5.6.0" flutter_slidable_for_tencent_im: dependency: transitive description: @@ -388,7 +388,7 @@ packages: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "1.1.5" + version: "1.1.6" flutter_test: dependency: "direct dev" description: flutter @@ -405,7 +405,7 @@ packages: name: fluttertoast url: "https://pub.dartlang.org" source: hosted - version: "8.0.9" + version: "8.1.1" get_it: dependency: transitive description: @@ -419,7 +419,7 @@ packages: name: glob url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" globbing: dependency: transitive description: @@ -433,7 +433,7 @@ packages: name: html url: "https://pub.dartlang.org" source: hosted - version: "0.15.0" + version: "0.15.1" http: dependency: transitive description: @@ -454,7 +454,7 @@ packages: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.0.2" i18n: dependency: transitive description: @@ -609,13 +609,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" - open_file: - dependency: transitive - description: - name: open_file - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.1" package_config: dependency: transitive description: @@ -699,7 +692,7 @@ packages: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.20" + version: "2.0.22" path_provider_ios: dependency: transitive description: @@ -748,21 +741,21 @@ packages: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "10.1.0" + version: "10.2.0" permission_handler_android: dependency: transitive description: name: permission_handler_android url: "https://pub.dartlang.org" source: hosted - version: "10.1.0" + version: "10.2.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple url: "https://pub.dartlang.org" source: hosted - version: "9.0.6" + version: "9.0.7" permission_handler_platform_interface: dependency: transitive description: @@ -776,21 +769,21 @@ packages: name: permission_handler_windows url: "https://pub.dartlang.org" source: hosted - version: "0.1.1" + version: "0.1.2" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "5.1.0" photo_manager: dependency: transitive description: name: photo_manager url: "https://pub.dartlang.org" source: hosted - version: "2.4.1" + version: "2.5.0" photo_view: dependency: transitive description: @@ -812,6 +805,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.3" + pointycastle: + dependency: transitive + description: + name: pointycastle + url: "https://pub.dartlang.org" + source: hosted + version: "3.6.2" process: dependency: transitive description: @@ -825,14 +825,14 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.3" + version: "6.0.4" pub_semver: dependency: transitive description: name: pub_semver url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.3" pubspec_parse: dependency: transitive description: @@ -860,7 +860,7 @@ packages: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.27.5" + version: "0.27.7" scroll_to_index: dependency: transitive description: @@ -888,7 +888,7 @@ packages: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.13" + version: "2.0.14" shared_preferences_ios: dependency: transitive description: @@ -949,14 +949,14 @@ packages: name: sqflite url: "https://pub.dartlang.org" source: hosted - version: "2.0.3+1" + version: "2.2.0+3" sqflite_common: dependency: transitive description: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.4.0+2" stack_trace: dependency: transitive description: @@ -977,7 +977,7 @@ packages: name: stream_transform url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.0" string_scanner: dependency: transitive description: @@ -1006,34 +1006,69 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" + tencent_cloud_chat_sdk: + dependency: transitive + description: + name: tencent_cloud_chat_sdk + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.4" + tencent_cloud_chat_uikit: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "1.0.0" + tencent_extended_text: + dependency: transitive + description: + name: tencent_extended_text + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + tencent_extended_text_field: + dependency: transitive + description: + name: tencent_extended_text_field + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + tencent_extended_text_library: + dependency: transitive + description: + name: tencent_extended_text_library + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" tencent_im_base: dependency: transitive description: name: tencent_im_base url: "https://pub.dartlang.org" source: hosted - version: "0.0.52" - tencent_im_sdk_plugin: - dependency: transitive - description: - name: tencent_im_sdk_plugin - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.9" + version: "1.0.2" tencent_im_sdk_plugin_platform_interface: dependency: transitive description: name: tencent_im_sdk_plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "0.3.5" + version: "0.3.9" tencent_im_sdk_plugin_web: dependency: "direct main" description: name: tencent_im_sdk_plugin_web url: "https://pub.dartlang.org" source: hosted - version: "0.3.2" + version: "0.3.5" + tencent_open_file: + dependency: transitive + description: + name: tencent_open_file + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.9" tencent_wechat_camera_picker: dependency: transitive description: @@ -1055,13 +1090,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.12" - tim_ui_kit: - dependency: "direct main" - description: - path: ".." - relative: true - source: path - version: "0.1.8" transparent_image: dependency: transitive description: @@ -1103,14 +1131,14 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.1.6" + version: "6.1.7" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.19" + version: "6.0.22" url_launcher_ios: dependency: transitive description: @@ -1159,7 +1187,7 @@ packages: name: uuid url: "https://pub.dartlang.org" source: hosted - version: "3.0.6" + version: "3.0.7" vector_math: dependency: transitive description: @@ -1173,7 +1201,7 @@ packages: name: video_player url: "https://pub.dartlang.org" source: hosted - version: "2.4.7" + version: "2.4.8" video_player_android: dependency: transitive description: @@ -1250,7 +1278,7 @@ packages: name: watcher url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" wechat_assets_picker: dependency: transitive description: @@ -1287,5 +1315,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" + dart: ">=2.18.0 <3.0.0" + flutter: ">=3.3.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index e895899..4eecb12 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -34,7 +34,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - tim_ui_kit: + tencent_cloud_chat_uikit: path: ../../tim_ui_kit tencent_im_sdk_plugin_web: ^0.3.2 archive: ^3.3.0 diff --git a/lib/base_widgets/tim_ui_kit_base.dart b/lib/base_widgets/tim_ui_kit_base.dart index 813d0ca..6703a01 100644 --- a/lib/base_widgets/tim_ui_kit_base.dart +++ b/lib/base_widgets/tim_ui_kit_base.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; class TUIKitBuildValue { // 这里预留以后可以扩展全局通用能力 diff --git a/lib/base_widgets/tim_ui_kit_class.dart b/lib/base_widgets/tim_ui_kit_class.dart index f743b47..53166ff 100644 --- a/lib/base_widgets/tim_ui_kit_class.dart +++ b/lib/base_widgets/tim_ui_kit_class.dart @@ -1,6 +1,6 @@ import 'package:tencent_im_base/base_widgets/tim_callback.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; class TIMUIKitClass { static final CoreServicesImpl _coreServices = diff --git a/lib/base_widgets/tim_ui_kit_state.dart b/lib/base_widgets/tim_ui_kit_state.dart index 6b9087f..2bc561b 100644 --- a/lib/base_widgets/tim_ui_kit_state.dart +++ b/lib/base_widgets/tim_ui_kit_state.dart @@ -1,10 +1,10 @@ import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; class TIMUIKitState extends TIMState { final CoreServicesImpl _coreServices = serviceLocator(); diff --git a/lib/base_widgets/tim_ui_kit_statelesswidget.dart b/lib/base_widgets/tim_ui_kit_statelesswidget.dart index 554e319..8302020 100644 --- a/lib/base_widgets/tim_ui_kit_statelesswidget.dart +++ b/lib/base_widgets/tim_ui_kit_statelesswidget.dart @@ -1,10 +1,10 @@ import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; class TIMUIKitStatelessWidget extends TIMStatelessWidget { final CoreServicesImpl _coreServices = serviceLocator(); diff --git a/lib/business_logic/life_cycle/add_friend_life_cycle.dart b/lib/business_logic/life_cycle/add_friend_life_cycle.dart index 626fede..00bb273 100644 --- a/lib/business_logic/life_cycle/add_friend_life_cycle.dart +++ b/lib/business_logic/life_cycle/add_friend_life_cycle.dart @@ -1,5 +1,5 @@ import 'package:flutter/cupertino.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class AddFriendLifeCycle { /// Before requesting to add a user as friend or a contact, diff --git a/lib/business_logic/life_cycle/add_group_life_cycle.dart b/lib/business_logic/life_cycle/add_group_life_cycle.dart index 0da982c..6c44c35 100644 --- a/lib/business_logic/life_cycle/add_group_life_cycle.dart +++ b/lib/business_logic/life_cycle/add_group_life_cycle.dart @@ -1,5 +1,5 @@ import 'package:flutter/cupertino.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class AddGroupLifeCycle { /// Before requesting to add or join to a group, diff --git a/lib/business_logic/life_cycle/base_life_cycle.dart b/lib/business_logic/life_cycle/base_life_cycle.dart index d3efc7d..47bb87b 100644 --- a/lib/business_logic/life_cycle/base_life_cycle.dart +++ b/lib/business_logic/life_cycle/base_life_cycle.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_class.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart'; typedef MessageFunction = Future Function(V2TimMessage message); diff --git a/lib/business_logic/life_cycle/block_list_life_cycle.dart b/lib/business_logic/life_cycle/block_list_life_cycle.dart index 13e4616..44029e4 100644 --- a/lib/business_logic/life_cycle/block_list_life_cycle.dart +++ b/lib/business_logic/life_cycle/block_list_life_cycle.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class BlockListLifeCycle { /// Before requesting to delete a user from block list, diff --git a/lib/business_logic/life_cycle/chat_life_cycle.dart b/lib/business_logic/life_cycle/chat_life_cycle.dart index 7a396ec..90a0c9b 100644 --- a/lib/business_logic/life_cycle/chat_life_cycle.dart +++ b/lib/business_logic/life_cycle/chat_life_cycle.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class ChatLifeCycle { /// Before a new message will be added to historical message list from long connection. diff --git a/lib/business_logic/life_cycle/conversation_life_cycle.dart b/lib/business_logic/life_cycle/conversation_life_cycle.dart index ed041d1..289d5c3 100644 --- a/lib/business_logic/life_cycle/conversation_life_cycle.dart +++ b/lib/business_logic/life_cycle/conversation_life_cycle.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class ConversationLifeCycle { /// Before deleting a conversation, or a channel, from the conversation list, diff --git a/lib/business_logic/life_cycle/friend_list_life_cycle.dart b/lib/business_logic/life_cycle/friend_list_life_cycle.dart index b3afdbd..d7bed84 100644 --- a/lib/business_logic/life_cycle/friend_list_life_cycle.dart +++ b/lib/business_logic/life_cycle/friend_list_life_cycle.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class FriendListLifeCycle { /// Before friend list (contacts list) will mount or update to contacts page. diff --git a/lib/business_logic/life_cycle/group_profile_life_cycle.dart b/lib/business_logic/life_cycle/group_profile_life_cycle.dart index 2191a3a..f421962 100644 --- a/lib/business_logic/life_cycle/group_profile_life_cycle.dart +++ b/lib/business_logic/life_cycle/group_profile_life_cycle.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class GroupProfileLifeCycle { /// In this case, you have better navigating to you home page or conversation list page, diff --git a/lib/business_logic/life_cycle/new_contact_life_cycle.dart b/lib/business_logic/life_cycle/new_contact_life_cycle.dart index e8a848c..b754a37 100644 --- a/lib/business_logic/life_cycle/new_contact_life_cycle.dart +++ b/lib/business_logic/life_cycle/new_contact_life_cycle.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class NewContactLifeCycle { /// Before accepting a friend or contact requirement from other user, diff --git a/lib/business_logic/life_cycle/profile_life_cycle.dart b/lib/business_logic/life_cycle/profile_life_cycle.dart index 74f5c16..ffb3f94 100644 --- a/lib/business_logic/life_cycle/profile_life_cycle.dart +++ b/lib/business_logic/life_cycle/profile_life_cycle.dart @@ -1,5 +1,5 @@ import 'package:flutter/cupertino.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/base_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart'; class ProfileLifeCycle { /// Before adding a contact to block list, diff --git a/lib/business_logic/listener_model/tui_group_listener_model.dart b/lib/business_logic/listener_model/tui_group_listener_model.dart index 74206c9..cc4c70e 100644 --- a/lib/business_logic/listener_model/tui_group_listener_model.dart +++ b/lib/business_logic/listener_model/tui_group_listener_model.dart @@ -4,9 +4,9 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; enum UpdateType { groupInfo, memberList, joinApplicationList } diff --git a/lib/business_logic/model/profile_model.dart b/lib/business_logic/model/profile_model.dart index 76a588e..28d9fd3 100644 --- a/lib/business_logic/model/profile_model.dart +++ b/lib/business_logic/model/profile_model.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class UserProfile { late V2TimFriendInfo? friendInfo; diff --git a/lib/business_logic/separate_models/tui_chat_model_tools.dart b/lib/business_logic/separate_models/tui_chat_model_tools.dart index 82c9198..eee084c 100644 --- a/lib/business_logic/separate_models/tui_chat_model_tools.dart +++ b/lib/business_logic/separate_models/tui_chat_model_tools.dart @@ -1,8 +1,8 @@ import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; class TUIChatModelTools { final TUIChatGlobalModel globalModel = serviceLocator(); 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 ba4108b..da86095 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 @@ -8,16 +8,16 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:path_provider/path_provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/chat_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_model_tools.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/constants/history_message_constant.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_chat_config.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'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/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'; class TUIChatSeparateViewModel extends ChangeNotifier { @@ -191,10 +191,10 @@ class TUIChatSeparateViewModel extends ChangeNotifier { globalModel.lifeCycle = lifeCycle; globalModel.setCurrentConversation( CurrentConversation(conversationID, conversationType ?? ConvType.c2c)); - globalModel.setTempMessageList(conversationID, []); globalModel.setMessageListPosition( conversationID, HistoryMessagePosition.bottom); globalModel.setChatConfig(chatConfig); + globalModel.clearRecivedNewMessageCount(); _isInit = true; } @@ -205,23 +205,30 @@ class TUIChatSeparateViewModel extends ChangeNotifier { required int count, String? lastMsgID, }) async { + print(lastMsgID); haveMoreData = false; final currentHistoryMsgList = globalModel.messageListMap[conversationID]; - final response = await _messageService.getHistoryMessageList( + final response = await _messageService.getHistoryMessageListWithComplete( count: count, getType: getType, userID: conversationType == ConvType.c2c ? conversationID : null, groupID: conversationType == ConvType.group ? conversationID : null, lastMsgID: lastMsgID, lastMsgSeq: lastMsgSeq); + if (response == null) { + return false; + } if (lastMsgID != null && currentHistoryMsgList != null) { - final newList = [...currentHistoryMsgList, ...response]; + final messageList = response.messageList; + final newList = [...currentHistoryMsgList, ...messageList]; final List msgList = await lifeCycle?.didGetHistoricalMessageList(newList) ?? newList; - globalModel.setMessageList(conversationID, msgList, needDuration: false); + globalModel.setMessageList(conversationID, msgList, + needResetNewMessageCount: false); } else { List messageList = - await lifeCycle?.didGetHistoricalMessageList(response) ?? response; + await lifeCycle?.didGetHistoricalMessageList(response.messageList) ?? + response.messageList; if (globalModel.loadingMessage[conversationID] != null) { if (globalModel.loadingMessage[conversationID]!.isNotEmpty) { messageList = [ @@ -233,26 +240,28 @@ class TUIChatSeparateViewModel extends ChangeNotifier { } } globalModel.setMessageList(conversationID, messageList, - needDuration: false); + needResetNewMessageCount: false); // The messages in first screen } - if (response.isEmpty || - (!PlatformUtils().isWeb && response.length < count) || - (PlatformUtils().isWeb && response.length < min(count, 20))) { - haveMoreData = false; - } else { - haveMoreData = true; - } + 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.isNotEmpty) { - _getMsgReadReceipt(response); + response.messageList.isNotEmpty) { + _getMsgReadReceipt(response.messageList); } if (chatConfig.isReportGroupReadingStatus && conversationType == ConvType.group && - response.isNotEmpty) { - _setMsgReadReceipt(response); + response.messageList.isNotEmpty) { + _setMsgReadReceipt(response.messageList); } return haveMoreData; } @@ -455,8 +464,8 @@ class TUIChatSeparateViewModel extends ChangeNotifier { return globalModel.messageListMap[conversationID] ?? []; } - List getTempMessageList() { - return globalModel.tempMessageListMap[conversationID] ?? []; + int getConversationUnreadCount() { + return globalModel.unreadCountForConversation; } Future?> sendTextAtMessage( @@ -1246,16 +1255,16 @@ class TUIChatSeparateViewModel extends ChangeNotifier { } showLatestUnread() { - List currentMsgList = getOriginMessageList(); - currentMsgList = [ - ...?globalModel.tempMessageListMap[conversationID], - ...currentMsgList - ]; + // List currentMsgList = getOriginMessageList(); + // currentMsgList = [ + // ...?globalModel.tempMessageListMap[conversationID], + // ...currentMsgList + // ]; markMessageAsRead(); globalModel.setMessageListPosition( conversationID, HistoryMessagePosition.bottom); - globalModel.setTempMessageList(conversationID, []); - globalModel.setMessageList(conversationID, currentMsgList); + // globalModel.setTempMessageList(conversationID, []); + // globalModel.setMessageList(conversationID, currentMsgList); } @override diff --git a/lib/business_logic/separate_models/tui_group_profile_model.dart b/lib/business_logic/separate_models/tui_group_profile_model.dart index f5b0751..f610166 100644 --- a/lib/business_logic/separate_models/tui_group_profile_model.dart +++ b/lib/business_logic/separate_models/tui_group_profile_model.dart @@ -2,13 +2,13 @@ import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/group_profile_life_cycle.dart'; -import 'package:tim_ui_kit/data_services/conversation/conversation_services.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/group_profile_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; class TUIGroupProfileModel extends ChangeNotifier { final CoreServicesImpl _coreServices = serviceLocator(); diff --git a/lib/business_logic/separate_models/tui_profile_view_model.dart b/lib/business_logic/separate_models/tui_profile_view_model.dart index 478d99b..cdb5ee6 100644 --- a/lib/business_logic/separate_models/tui_profile_view_model.dart +++ b/lib/business_logic/separate_models/tui_profile_view_model.dart @@ -2,14 +2,14 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/profile_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/model/profile_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/data_services/conversation/conversation_services.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/profile_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/model/profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; class TUIProfileViewModel extends ChangeNotifier { final ConversationService _conversationService = 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 50741e7..c38c74d 100644 --- a/lib/business_logic/view_models/tui_chat_global_model.dart +++ b/lib/business_logic/view_models/tui_chat_global_model.dart @@ -8,16 +8,18 @@ import 'dart:math'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/chat_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_model_tools.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/constants/history_message_constant.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/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_im_base/base_widgets/tim_callback.dart'; enum ConvType { none, c2c, group } @@ -30,13 +32,13 @@ class CurrentConversation { CurrentConversation(this.conversationID, this.conversationType); } -class TUIChatGlobalModel extends ChangeNotifier { +class TUIChatGlobalModel extends ChangeNotifier with TIMUIKitClass { final MessageService _messageService = serviceLocator(); final GroupServices _groupServices = serviceLocator(); final Map?> _messageListMap = {}; final Map _messageReadReceiptMap = {}; - final Map?> _tempMessageListMap = {}; final Map _messageListProgressMap = {}; + final Map _fileListLocationMap = {}; final Map _preloadImageMap = {}; final Map _historyMessagePositionMap = {}; final List _currentConversationList = []; @@ -52,7 +54,8 @@ class TUIChatGlobalModel extends ChangeNotifier { late V2TimAdvancedMsgListener advancedMsgListener; int _unreadCountForConversation = 0; - int testCount = 0; + // use for generate a new sliver list to show recived messag list + int _recivedNewMessageCount = 0; TIMUIKitChatConfig chatConfig = const TIMUIKitChatConfig(); List? _groupApplicationList; String Function(V2TimMessage message)? _abstractMessageBuilder; @@ -66,27 +69,37 @@ class TUIChatGlobalModel extends ChangeNotifier { TUIChatGlobalModel() { advancedMsgListener = V2TimAdvancedMsgListener( - onRecvC2CReadReceipt: (List receiptList) { - _onReceiveC2CReadReceipt(receiptList); - }, onRecvMessageRevoked: (String msgID) { - onMessageRevoked(msgID); - }, onRecvNewMessage: (V2TimMessage newMsg) { - _onReceiveNewMsg(newMsg); - }, onSendMessageProgress: (V2TimMessage messagae, int progress) { - _onSendMessageProgress(messagae, progress); - }, onRecvMessageReadReceipts: (List receiptList) { - _onReceiveMessageReadReceipts(receiptList); - }, onRecvMessageModified: (V2TimMessage newMsg) { - onMessageModified(newMsg); - }); + onRecvC2CReadReceipt: (List receiptList) { + _onReceiveC2CReadReceipt(receiptList); + }, + onRecvMessageRevoked: (String msgID) { + onMessageRevoked(msgID); + }, + onRecvNewMessage: (V2TimMessage newMsg) { + _onReceiveNewMsg(newMsg); + }, + onSendMessageProgress: (V2TimMessage messagae, int progress) { + _onSendMessageProgress(messagae, progress); + }, + onRecvMessageReadReceipts: (List receiptList) { + _onReceiveMessageReadReceipts(receiptList); + }, + onRecvMessageModified: (V2TimMessage newMsg) { + onMessageModified(newMsg); + }, + onMessageDownloadProgressCallback: + (V2TimMessageDownloadProgress messageProgress) { + onMessageDownloadProgressCallback(messageProgress); + }, + ); // Future.delayed(const Duration(milliseconds: 200)).then((value) => initMessageMapFromLocal()); } bool get isDownloading => _isDownloading; bool get hasWaiting => _waitingDownloadList.isNotEmpty; Map get currentDownLoad => _waitingDownloadList.first; - void addWaitingList(String msgID, String url, String savePath) { - print("add $url to waiting list success"); + void addWaitingList(String msgID) { + print("add to waiting list success"); bool contains = false; for (Map element in _waitingDownloadList) { String msgIDItem = element["msgID"] ?? ""; @@ -100,8 +113,6 @@ class TUIChatGlobalModel extends ChangeNotifier { if (!contains) { _waitingDownloadList.add(Map.from({ "msgID": msgID, - "url": url, - "savePath": savePath, })); // setMessageProgress(msgID, 1); // 有一点进度条,表示等待中 } @@ -119,28 +130,29 @@ class TUIChatGlobalModel extends ChangeNotifier { Map nextDownLoad = _waitingDownloadList.first; String downLoadMsgID = nextDownLoad["msgID"] ?? ""; - String downLoadMsgUrl = nextDownLoad["url"] ?? ""; - String downLoadMsgSavePath = nextDownLoad["savePath"] ?? ""; - if (downLoadMsgID.isEmpty || - downLoadMsgUrl.isEmpty || - downLoadMsgSavePath.isEmpty) { + if (downLoadMsgID.isEmpty) { return; } - print("new download $downLoadMsgSavePath"); - await Dio().download(downLoadMsgUrl, downLoadMsgSavePath, - onReceiveProgress: (recv, total) { - if (total != -1) { - // print((received / total * 100).toStringAsFixed(0) + "%"); - int progrss = (recv / total * 100).ceil(); - if (progrss > 1) { - setMessageProgress(downLoadMsgID, progrss); - } - //you can build progressbar feature too - } - }); + if (_messageListProgressMap[downLoadMsgID] == 100) { + return; + } + // await Dio().download(downLoadMsgUrl, downLoadMsgSavePath, + // onReceiveProgress: (recv, total) { + // if (total != -1) { + // // print((received / total * 100).toStringAsFixed(0) + "%"); + // int progrss = (recv / total * 100).ceil(); + // if (progrss > 1) { + // setMessageProgress(downLoadMsgID, progrss); + // } + // //you can build progressbar feature too + // } + // }); + await _messageService.downloadMessage( + msgID: downLoadMsgID, messageType: 6, imageType: 0, isSnapshot: false); + _isDownloading = true; // startDownloadProcess(context, theme, received); print("start another download"); - downloadFile(); + // downloadFile(); } int getRecevied(msgID) { @@ -171,6 +183,10 @@ class TUIChatGlobalModel extends ChangeNotifier { return _totalUnreadCount; } + int get recivedMessageListCount { + return _recivedNewMessageCount; + } + int get unreadCountForConversation => _unreadCountForConversation; List get groupApplicationList => @@ -179,9 +195,6 @@ class TUIChatGlobalModel extends ChangeNotifier { String Function(V2TimMessage message)? get abstractMessageBuilder => _abstractMessageBuilder; - Map?> get tempMessageListMap => - _tempMessageListMap; - Map get messageReadReceiptMap => _messageReadReceiptMap; @@ -296,7 +309,6 @@ class TUIChatGlobalModel extends ChangeNotifier { count: 10, getType: HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG, userID: conversationType == ConvType.c2c ? conversationID : null, - messageTypeList: [1], groupID: conversationType == ConvType.group ? conversationID : null); if (_messageListMap[conversationID] == null || _messageListMap[conversationID]!.isEmpty) { @@ -368,12 +380,16 @@ class TUIChatGlobalModel extends ChangeNotifier { _totalUnreadCount = 0; _groupApplicationList?.clear(); _totalUnreadCount = 0; + _recivedNewMessageCount = 0; _messageReadReceiptMap.clear(); - _tempMessageListMap.clear(); _messageListProgressMap.clear(); notifyListeners(); } + clearRecivedNewMessageCount() { + _recivedNewMessageCount = 0; + } + _preLoadImage(List msgList) { List needPreViewList = msgList.sublist(0, max(0, min(5, msgList.length - 1))); @@ -411,6 +427,10 @@ class TUIChatGlobalModel extends ChangeNotifier { return _messageListProgressMap[msgID] ?? 0; } + String getFileMessageLocation(String? msgID) { + return _fileListLocationMap[msgID] ?? ''; + } + setMessageProgress(String msgID, int progress) { _messageListProgressMap[msgID] = progress; if (progress > 0 && progress < 100) { @@ -428,7 +448,11 @@ class TUIChatGlobalModel extends ChangeNotifier { return false; }); } + notifyListeners(); + } + setFileMessageLocation(String msgID, String location) { + _fileListLocationMap[msgID] = location; notifyListeners(); } @@ -584,6 +608,7 @@ class TUIChatGlobalModel extends ChangeNotifier { convID: convID, convType: currentSelectedConvType!, ); + _recivedNewMessageCount = 0; final currentMsg = _messageListMap[convID] ?? []; _messageListMap[convID] = [newMsg, ...currentMsg]; notifyListeners(); @@ -599,8 +624,9 @@ class TUIChatGlobalModel extends ChangeNotifier { } else { if (convID == currentSelectedConv) { unreadCountForConversation++; - final currentTempMsg = _tempMessageListMap[convID] ?? []; - _tempMessageListMap[convID] = [newMsg, ...currentTempMsg]; + _recivedNewMessageCount++; + final currentMsg = _messageListMap[convID] ?? []; + _messageListMap[convID] = [newMsg, ...currentMsg]; notifyListeners(); } } @@ -692,6 +718,35 @@ class TUIChatGlobalModel extends ChangeNotifier { print("message progress: $progress"); } + onMessageDownloadProgressCallback( + V2TimMessageDownloadProgress messageProgress) { + if (messageProgress.isFinish) { + setMessageProgress(messageProgress.msgID, 100); + setFileMessageLocation(messageProgress.msgID, messageProgress.path); + downloadFile(); + return; + } + if (messageProgress.isError) { + TIMUIKitClass.onTIMCallback( + TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: + TIM_t("视频保存失败") + ": ${messageProgress.errorCode.toString()}", + infoCode: 6660403), + ); + return; + } + + if (messageProgress.totalSize != -1) { + int progrss = + (messageProgress.currentSize / messageProgress.totalSize * 100) + .ceil(); + if (progrss > 1) { + setMessageProgress(messageProgress.msgID, progrss); + } + } + } + void addAdvancedMsgListener() { _messageService.addAdvancedMsgListener(listener: advancedMsgListener); } @@ -755,10 +810,12 @@ class TUIChatGlobalModel extends ChangeNotifier { messageList = messageList.map((item) { if (item.msgID == msgID) { item.localCustomData = localCustomData; + // item.id = DateTime.now().millisecondsSinceEpoch.toString(); } return item; }).toList(); - setMessageList(conversationID, messageList); + setMessageList(conversationID, messageList, + needResetNewMessageCount: false); return true; } return false; @@ -773,10 +830,12 @@ class TUIChatGlobalModel extends ChangeNotifier { messageList = messageList.map((item) { if (item.msgID == msgID) { item.localCustomInt = HistoryMessageDartConstant.read; + // item.id = DateTime.now().millisecondsSinceEpoch.toString(); } return item; }).toList(); - setMessageList(conversationID, messageList); + setMessageList(conversationID, messageList, + needResetNewMessageCount: false); return true; } return false; @@ -824,20 +883,11 @@ class TUIChatGlobalModel extends ChangeNotifier { } void setMessageList(String conversationID, List messageList, - {bool needDuration = false}) { + {bool needResetNewMessageCount = true}) { _messageListMap[conversationID] = messageList; - if (needDuration) { - Future.delayed(const Duration(milliseconds: 800), () { - notifyListeners(); - }); - } else { - notifyListeners(); + if (needResetNewMessageCount) { + _recivedNewMessageCount = 0; } - } - - void setTempMessageList( - String conversationID, List messageList) { - _tempMessageListMap[conversationID] = messageList; notifyListeners(); } @@ -887,6 +937,25 @@ class TUIChatGlobalModel extends ChangeNotifier { notifyListeners(); } + void updateAsyncMessage( + V2TimMessage message, + String convID, + ) { + message.id = DateTime.now().millisecondsSinceEpoch.toString(); + final activeMessageList = _messageListMap[convID]; + if (activeMessageList == null || activeMessageList.isEmpty) { + return; + } + final msgID = message.msgID; + _messageListMap[currentSelectedConv] = activeMessageList.map((item) { + if (item.msgID == msgID) { + return message; + } + return item; + }).toList(); + notifyListeners(); + } + List? getMessageList(String conversationID) { final list = messageListMap[conversationID]?.reversed.toList() ?? []; final List listWithTimestamp = []; @@ -911,16 +980,15 @@ class TUIChatGlobalModel extends ChangeNotifier { listWithTimestamp.add(V2TimMessage.fromJson(item.toJson())); } } - final returnValue = listWithTimestamp.reversed.toList(); return returnValue; } - HistoryMessagePosition getMessageListPosition(String conversationID) { + HistoryMessagePosition getMessageListPosition(String? conversationID) { final HistoryMessagePosition? position = _historyMessagePositionMap[conversationID]; if (position == null) { - _historyMessagePositionMap[conversationID] = + _historyMessagePositionMap[conversationID ?? currentSelectedConv] = HistoryMessagePosition.bottom; return HistoryMessagePosition.bottom; } else { diff --git a/lib/business_logic/view_models/tui_conversation_view_model.dart b/lib/business_logic/view_models/tui_conversation_view_model.dart index dde0290..4b35131 100644 --- a/lib/business_logic/view_models/tui_conversation_view_model.dart +++ b/lib/business_logic/view_models/tui_conversation_view_model.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/conversation_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/conversation/conversation_services.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/conversation_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; List removeDuplicates( List list, bool Function(T first, T second) isEqual) { @@ -118,9 +118,7 @@ class TUIConversationViewModel extends ChangeNotifier { initConversation() async { clearData(); - if (PlatformUtils().isWeb) { - loadInitConversation(); - } + loadInitConversation(); } Future loadData({required int count}) async { diff --git a/lib/business_logic/view_models/tui_friendship_view_model.dart b/lib/business_logic/view_models/tui_friendship_view_model.dart index 558aaf4..b21e2cc 100644 --- a/lib/business_logic/view_models/tui_friendship_view_model.dart +++ b/lib/business_logic/view_models/tui_friendship_view_model.dart @@ -2,13 +2,13 @@ import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/block_list_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/friend_list_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/new_contact_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/block_list_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/friend_list_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/new_contact_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; class TUIFriendShipViewModel extends ChangeNotifier { final FriendshipServices _friendshipServices = diff --git a/lib/business_logic/view_models/tui_search_view_model.dart b/lib/business_logic/view_models/tui_search_view_model.dart index 092db44..a94886d 100644 --- a/lib/business_logic/view_models/tui_search_view_model.dart +++ b/lib/business_logic/view_models/tui_search_view_model.dart @@ -3,12 +3,12 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/conversation/conversation_services.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; enum KeywordListMatchType { V2TIM_KEYWORD_LIST_MATCH_TYPE_OR, diff --git a/lib/business_logic/view_models/tui_self_info_view_model.dart b/lib/business_logic/view_models/tui_self_info_view_model.dart index 8ded479..4d14fd0 100644 --- a/lib/business_logic/view_models/tui_self_info_view_model.dart +++ b/lib/business_logic/view_models/tui_self_info_view_model.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/data_services/core/tim_uikit_config.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_config.dart'; class TUISelfInfoViewModel extends ChangeNotifier { V2TimUserFullInfo? _loginInfo; diff --git a/lib/business_logic/view_models/tui_theme_view_model.dart b/lib/business_logic/view_models/tui_theme_view_model.dart index 024dab0..bffa6d1 100644 --- a/lib/business_logic/view_models/tui_theme_view_model.dart +++ b/lib/business_logic/view_models/tui_theme_view_model.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; class TUIThemeViewModel extends ChangeNotifier { TUITheme _theme = CommonColor.defaultTheme; diff --git a/lib/data_services/conversation/conversation_services_implements.dart b/lib/data_services/conversation/conversation_services_implements.dart index 0c309e7..db4da49 100644 --- a/lib/data_services/conversation/conversation_services_implements.dart +++ b/lib/data_services/conversation/conversation_services_implements.dart @@ -1,6 +1,6 @@ -import 'package:tim_ui_kit/data_services/conversation/conversation_services.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class ConversationServicesImpl extends ConversationService { diff --git a/lib/data_services/core/core_services.dart b/lib/data_services/core/core_services.dart index b6c1fee..21bf894 100644 --- a/lib/data_services/core/core_services.dart +++ b/lib/data_services/core/core_services.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/data_services/core/tim_uikit_config.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_config.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; enum AppStatus { foreground, background } diff --git a/lib/data_services/core/core_services_implements.dart b/lib/data_services/core/core_services_implements.dart index d6007dc..aeb3a24 100644 --- a/lib/data_services/core/core_services_implements.dart +++ b/lib/data_services/core/core_services_implements.dart @@ -3,21 +3,21 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/listener_model/tui_group_listener_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_conversation_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/core/core_services.dart'; -import 'package:tim_ui_kit/data_services/core/tim_uikit_config.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_config.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; import 'package:disk_space/disk_space.dart'; -import 'package:tim_ui_kit/data_services/core/web_support/uikit_web_support.dart' - if (dart.library.html) 'package:tim_ui_kit/data_services/core/web_support/uikit_web_support_implement.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/web_support/uikit_web_support.dart' + if (dart.library.html) 'package:tencent_cloud_chat_uikit/data_services/core/web_support/uikit_web_support_implement.dart'; typedef EmptyAvatarBuilder = Widget Function(BuildContext context); @@ -134,6 +134,7 @@ class CoreServicesImpl with CoreServices { TIMUIKitConfig? config, required String userId, }) async { + _userID = userId; if (language != null) { Future.delayed(const Duration(milliseconds: 1), () { I18nUtils(null, language); @@ -143,21 +144,9 @@ class CoreServicesImpl with CoreServices { onCallback = onTUIKitCallbackListener; } setGlobalConfig(config); - getUsersInfo(userIDList: [userId]).then((res) => { - if (res.code == 0) - { - _loginInfo = res.data![0], - serviceLocator().setLoginInfo(_loginInfo!), - didLoginSuccess() - } - else - { - callOnCallback(TIMCallback( - type: TIMCallbackType.API_ERROR, - errorCode: res.code, - errorMsg: res.desc)) - } - }); + if (PlatformUtils().isIOS || PlatformUtils().isAndroid) { + didLoginSuccess(); + } } void addInitListener() { diff --git a/lib/data_services/friendShip/friendship_services_implements.dart b/lib/data_services/friendShip/friendship_services_implements.dart index a3d1453..ba50771 100644 --- a/lib/data_services/friendShip/friendship_services_implements.dart +++ b/lib/data_services/friendShip/friendship_services_implements.dart @@ -1,6 +1,6 @@ -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class FriendshipServicesImpl with FriendshipServices { diff --git a/lib/data_services/group/group_services_implement.dart b/lib/data_services/group/group_services_implement.dart index 72c476f..986d58e 100644 --- a/lib/data_services/group/group_services_implement.dart +++ b/lib/data_services/group/group_services_implement.dart @@ -1,7 +1,7 @@ -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/optimize_utils.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class GroupServicesImpl extends GroupServices { diff --git a/lib/data_services/message/message_service_implement.dart b/lib/data_services/message/message_service_implement.dart index c9bee27..e02fd6b 100644 --- a/lib/data_services/message/message_service_implement.dart +++ b/lib/data_services/message/message_service_implement.dart @@ -1,13 +1,79 @@ // ignore_for_file: deprecated_member_use +import 'dart:math'; + import 'package:flutter/foundation.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; class MessageServiceImpl extends MessageService { final CoreServicesImpl _coreService = serviceLocator(); + final Map> messgaeListMap = {}; + final Map> sendingMessage = {}; + + @override + Future getHistoryMessageListV2({ + HistoryMsgGetTypeEnum getType = + HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG, + String? userID, + String? groupID, + int lastMsgSeq = -1, + required int count, + String? lastMsgID, + List? messageTypeList, + }) async { + bool haveMoreData = true; + final res = await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .getHistoryMessageList( + count: count, + getType: getType, + userID: userID, + groupID: groupID, + lastMsgID: lastMsgID, + lastMsgSeq: lastMsgSeq, + messageTypeList: messageTypeList); + final List reponseMessageList = res.data ?? []; + final conversationID = userID ?? groupID; + final cachedMessageList = messgaeListMap[conversationID]; + List commbinedMessageList = []; + // 加载更多 + if (lastMsgID != null && cachedMessageList != null) { + commbinedMessageList = [...cachedMessageList, ...reponseMessageList]; + // 首次加载 + } else { + final bool existSendingMessage = sendingMessage[conversationID] != null && + sendingMessage[conversationID]!.isNotEmpty; + // 存在未发送完成的消息 + if (existSendingMessage) { + commbinedMessageList = [ + ...sendingMessage[conversationID]!, + ...reponseMessageList + ]; + } else { + sendingMessage.remove(conversationID); + commbinedMessageList = reponseMessageList; + } + } + if (res.code != 0) { + _coreService.callOnCallback(TIMCallback( + type: TIMCallbackType.API_ERROR, + errorMsg: res.desc, + errorCode: res.code)); + } + if (reponseMessageList.isEmpty || + (!PlatformUtils().isWeb && reponseMessageList.length < count) || + (PlatformUtils().isWeb && reponseMessageList.length < min(count, 20))) { + haveMoreData = false; + } else { + haveMoreData = true; + } + return MessageListResponse( + haveMoreData: haveMoreData, data: commbinedMessageList); + } @override Future> getHistoryMessageList({ @@ -30,14 +96,45 @@ class MessageServiceImpl extends MessageService { lastMsgID: lastMsgID, lastMsgSeq: lastMsgSeq, messageTypeList: messageTypeList); - final List messageList = res.data ?? []; + final reponseMessageList = res.data ?? []; if (res.code != 0) { _coreService.callOnCallback(TIMCallback( type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code)); } - return messageList; + return reponseMessageList; + } + + @override + Future getHistoryMessageListWithComplete({ + HistoryMsgGetTypeEnum getType = + HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG, + String? userID, + String? groupID, + int lastMsgSeq = -1, + required int count, + String? lastMsgID, + List? messageTypeList, + }) async { + final res = await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .getHistoryMessageListV2( + count: count, + getType: getType, + userID: userID, + groupID: groupID, + lastMsgID: lastMsgID, + lastMsgSeq: lastMsgSeq, + messageTypeList: messageTypeList); + final reponseMessageList = res.data; + if (res.code != 0) { + _coreService.callOnCallback(TIMCallback( + type: TIMCallbackType.API_ERROR, + errorMsg: res.desc, + errorCode: res.code)); + } + return reponseMessageList; } @override @@ -663,4 +760,42 @@ class MessageServiceImpl extends MessageService { } return result; } + + @override + Future> getMessageOnlineUrl( + {required String msgID}) async { + final result = await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .getMessageOnlineUrl(msgID: msgID); + + if (result.code != 0) { + _coreService.callOnCallback(TIMCallback( + type: TIMCallbackType.API_ERROR, + errorMsg: result.desc, + errorCode: result.code)); + } + return result; + } + + @override + Future downloadMessage( + {required String msgID, + required int messageType, + required int imageType, + required bool isSnapshot}) async { + final result = await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .downloadMessage( + msgID: msgID, + messageType: messageType, + imageType: imageType, + isSnapshot: isSnapshot); + if (result.code != 0) { + _coreService.callOnCallback(TIMCallback( + type: TIMCallbackType.API_ERROR, + errorMsg: result.desc, + errorCode: result.code)); + } + return result; + } } diff --git a/lib/data_services/message/message_services.dart b/lib/data_services/message/message_services.dart index 0105c30..666157f 100644 --- a/lib/data_services/message/message_services.dart +++ b/lib/data_services/message/message_services.dart @@ -1,5 +1,11 @@ import 'package:tencent_im_base/tencent_im_base.dart'; +class MessageListResponse { + final bool haveMoreData; + final List data; + MessageListResponse({required this.haveMoreData, required this.data}); +} + abstract class MessageService { Future> getHistoryMessageList({ HistoryMsgGetTypeEnum getType = @@ -12,6 +18,28 @@ abstract class MessageService { List? messageTypeList, }); + Future getHistoryMessageListWithComplete({ + HistoryMsgGetTypeEnum getType = + HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG, + String? userID, + String? groupID, + int lastMsgSeq, + required int count, + String? lastMsgID, + List? messageTypeList, + }); + + Future getHistoryMessageListV2({ + HistoryMsgGetTypeEnum getType = + HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG, + String? userID, + String? groupID, + int lastMsgSeq, + required int count, + String? lastMsgID, + List? messageTypeList, + }); + Future addSimpleMsgListener({ required V2TimSimpleMsgListener listener, }); @@ -165,4 +193,15 @@ abstract class MessageService { Future sendMessageReadReceipts({ required List messageIDList, }); + + Future> getMessageOnlineUrl({ + required String msgID, + }); + + Future downloadMessage({ + required String msgID, + required int messageType, + required int imageType, // 图片类型,仅messageType为图片消息是有效 + required bool isSnapshot, // 是否是视频封面,仅messageType为视频消息是有效 + }); } diff --git a/lib/data_services/services_locatar.dart b/lib/data_services/services_locatar.dart index 5ac374f..04115d8 100644 --- a/lib/data_services/services_locatar.dart +++ b/lib/data_services/services_locatar.dart @@ -1,21 +1,21 @@ import 'package:get_it/get_it.dart'; -import 'package:tim_ui_kit/business_logic/listener_model/tui_group_listener_model.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_model_tools.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_conversation_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/conversation/conversation_services.dart'; -import 'package:tim_ui_kit/data_services/conversation/conversation_services_implements.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services_implements.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/group/group_services_implement.dart'; -import 'package:tim_ui_kit/data_services/message/message_service_implement.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_search_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.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'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services_implement.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_service_implement.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; final serviceLocator = GetIt.instance; bool boolIsInitailized = false; diff --git a/lib/i18n/strings.i18n.json b/lib/i18n/strings.i18n.json index 7538813..28aeb2b 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":"开始下载"} \ 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":"消息列表加载中"} \ 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 ca463ad..310bb26 100644 --- a/lib/i18n/strings_zh-Hans.i18n.json +++ b/lib/i18n/strings_zh-Hans.i18n.json @@ -373,5 +373,145 @@ "k_1gnnby6": " 想访问您的$option2", "k_0fvjexh": "正在下载中", "k_1cdagzz": "已加入待下载队列,其他文件下载中", - "k_0g4vojc": "开始下载" + "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": "消息列表加载中" } \ 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 d096e60..8bc3216 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":"开始下载"} \ 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":"消息列表加载中"} \ No newline at end of file diff --git a/lib/import_proxy/general.dart b/lib/import_proxy/general.dart index a2f39f4..fe8a907 100644 --- a/lib/import_proxy/general.dart +++ b/lib/import_proxy/general.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/import_proxy/import_proxy.dart'; +import 'package:tencent_cloud_chat_uikit/import_proxy/import_proxy.dart'; ImportProxy getImportProxy() => throw UnsupportedError('Cannot create a ImportProxy.'); diff --git a/lib/import_proxy/import_proxy.dart b/lib/import_proxy/import_proxy.dart index 25e395f..7ae5010 100644 --- a/lib/import_proxy/import_proxy.dart +++ b/lib/import_proxy/import_proxy.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/import_proxy/general.dart' +import 'package:tencent_cloud_chat_uikit/import_proxy/general.dart' // ignore: uri_does_not_exist if (dart.library.html) 'platform/web_import.dart' // ignore: uri_does_not_exist diff --git a/lib/import_proxy/platform/native_import.dart b/lib/import_proxy/platform/native_import.dart index a9b5d27..faa0566 100644 --- a/lib/import_proxy/platform/native_import.dart +++ b/lib/import_proxy/platform/native_import.dart @@ -1,5 +1,5 @@ import 'package:flutter_plugin_record_plus/flutter_plugin_record.dart'; -import 'package:tim_ui_kit/import_proxy/import_proxy.dart'; +import 'package:tencent_cloud_chat_uikit/import_proxy/import_proxy.dart'; class NativeImport implements ImportProxy { @override diff --git a/lib/import_proxy/platform/web_import.dart b/lib/import_proxy/platform/web_import.dart index 5a99af9..f639e00 100644 --- a/lib/import_proxy/platform/web_import.dart +++ b/lib/import_proxy/platform/web_import.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/import_proxy/import_proxy.dart'; +import 'package:tencent_cloud_chat_uikit/import_proxy/import_proxy.dart'; class WebImport implements ImportProxy { @override diff --git a/lib/tencent_cloud_chat_uikit.dart b/lib/tencent_cloud_chat_uikit.dart new file mode 100644 index 0000000..94f738f --- /dev/null +++ b/lib/tencent_cloud_chat_uikit.dart @@ -0,0 +1,60 @@ +library tencent_cloud_chat_uikit; + +import 'package:tencent_im_base/tencent_im_base.dart'; + +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'data_services/core/core_services_implements.dart'; +export 'data_services/core/core_services_implements.dart'; + +// Global +export 'ui/utils/tui_theme.dart'; + +// Widgets +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/tim_uikit_profile.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitContact/tim_uikit_contact.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroup/tim_uikit_group.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitBlackList/tim_uikit_black_list.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitNewContact/tim_uikit_new_contact.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitNewContact/tim_uikit_unread_count.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; +export 'package:tencent_cloud_chat_uikit/ui/widgets/unread_message.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitAddFriend/tim_uikit_add_friend.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitAddGroup/tim_uikit_add_group.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_more_panel.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search_msg_detail.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_controller.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroup/tim_uikit_group_application_list.dart'; +export 'package:tencent_im_base/tencent_im_base.dart'; +export 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/models/link_preview_content.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_userinfo_card.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitConversation/tim_ui_kit_conversation_total_unread.dart'; + +// Enum +export 'package:tencent_cloud_chat_uikit/ui/theme/tim_uikit_message_theme.dart'; + +// Controller +export 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_profile_controller.dart'; + +// Config +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; +export 'package:permission_handler/permission_handler.dart'; + +class TIMUIKitCore { + static CoreServicesImpl getInstance() { + setupServiceLocator(); + return serviceLocator(); + } + + static V2TIMManager getSDKInstance() { + return TencentImSDKPlugin.v2TIMManager; + } +} diff --git a/lib/tim_ui_kit.dart b/lib/tim_ui_kit.dart deleted file mode 100644 index fc6cae2..0000000 --- a/lib/tim_ui_kit.dart +++ /dev/null @@ -1,61 +0,0 @@ -library tim_ui_kit; - -import 'package:tencent_im_base/tencent_im_base.dart'; - -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'data_services/core/core_services_implements.dart'; -export 'data_services/core/core_services_implements.dart'; - -// Global -export 'ui/utils/tui_theme.dart'; - -// Widgets -export 'package:tim_ui_kit/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_chat.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitProfile/tim_uikit_profile.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitContact/tim_uikit_contact.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitGroup/tim_uikit_group.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitBlackList/tim_uikit_black_list.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitNewContact/tim_uikit_new_contact.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitNewContact/tim_uikit_unread_count.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; -export 'package:tim_ui_kit/ui/widgets/unread_message.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitAddFriend/tim_uikit_add_friend.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitAddGroup/tim_uikit_add_group.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_more_panel.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search_msg_detail.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_controller.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitGroup/tim_uikit_group_application_list.dart'; -export 'package:tencent_im_base/tencent_im_base.dart'; -export 'package:tim_ui_kit/ui/widgets/link_preview/models/link_preview_content.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_userinfo_card.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitConversation/tim_ui_kit_conversation_total_unread.dart'; - -// Enum - -export 'package:tim_ui_kit/ui/theme/tim_uikit_message_theme.dart'; - -// Controller -export 'package:tim_ui_kit/ui/controller/tim_uikit_profile_controller.dart'; - -// Config -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; -export 'package:permission_handler/permission_handler.dart'; - -class TIMUIKitCore { - static CoreServicesImpl getInstance() { - setupServiceLocator(); - return serviceLocator(); - } - - static V2TIMManager getSDKInstance() { - return TencentImSDKPlugin.v2TIMManager; - } -} diff --git a/lib/ui/controller/tim_uikit_chat_controller.dart b/lib/ui/controller/tim_uikit_chat_controller.dart index aed1b63..20c90ea 100644 --- a/lib/ui/controller/tim_uikit_chat_controller.dart +++ b/lib/ui/controller/tim_uikit_chat_controller.dart @@ -1,10 +1,10 @@ // ignore_for_file: avoid_print import 'package:flutter/cupertino.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitChatController { late TUIChatSeparateViewModel? model; @@ -37,7 +37,7 @@ class TIMUIKitChatController { /// clear the current conversation; /// 销毁 - @Deprecated("No need to dispose after tim_ui_kit 0.1.4") + @Deprecated("No need to dispose after tencent_cloud_chat_uikit 0.1.4") dispose() {} /// clear the history of current conversation; diff --git a/lib/ui/controller/tim_uikit_conversation_controller.dart b/lib/ui/controller/tim_uikit_conversation_controller.dart index a808d12..fe50a09 100644 --- a/lib/ui/controller/tim_uikit_conversation_controller.dart +++ b/lib/ui/controller/tim_uikit_conversation_controller.dart @@ -1,5 +1,5 @@ import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_conversation_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart'; class TIMUIKitConversationController { late TUIConversationViewModel model; diff --git a/lib/ui/controller/tim_uikit_profile_controller.dart b/lib/ui/controller/tim_uikit_profile_controller.dart index 945eb79..8c1ea90 100644 --- a/lib/ui/controller/tim_uikit_profile_controller.dart +++ b/lib/ui/controller/tim_uikit_profile_controller.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_profile_view_model.dart'; -import 'package:tim_ui_kit/ui/widgets/text_input_bottom_sheet.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_profile_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/text_input_bottom_sheet.dart'; class TIMUIKitProfileController { late TUIProfileViewModel model; diff --git a/lib/ui/utils/color.dart b/lib/ui/utils/color.dart index b0dd3fe..5324251 100644 --- a/lib/ui/utils/color.dart +++ b/lib/ui/utils/color.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; Color hexToColor(String hexString) { return Color(int.parse(hexString, radix: 16)).withAlpha(255); diff --git a/lib/ui/utils/constant_data.dart b/lib/ui/utils/constant_data.dart new file mode 100644 index 0000000..a0e6c20 --- /dev/null +++ b/lib/ui/utils/constant_data.dart @@ -0,0 +1,153 @@ +import 'custom_emoji_face_data_class.dart'; + +class ConstData { + static final List emojiList = [ + CustomEmojiFaceData( + name: '4349', + icon: "[调皮]@2x.png", + isEmoji: true, + list: [ + "[爱你]@2x.png", + "[爱情]@2x.png", + "[爱心]@2x.png", + "[傲慢]@2x.png", + "[白眼]@2x.png", + "[棒棒糖]@2x.png", + "[抱抱]@2x.png", + "[抱拳]@2x.png", + "[爆筋]@2x.png", + "[鄙视]@2x.png", + "[闭嘴]@2x.png", + "[鞭炮]@2x.png", + "[便便]@2x.png", + "[擦汗]@2x.png", + "[彩带]@2x.png", + "[彩球]@2x.png", + "[菜刀]@2x.png", + "[差劲]@2x.png", + "[钞票]@2x.png", + "[车厢]@2x.png", + "[打哈欠]@2x.png", + "[大兵]@2x.png", + "[大哭]@2x.png", + "[蛋糕]@2x.png", + "[刀]@2x.png", + "[得意]@2x.png", + "[灯泡]@2x.png", + "[凋谢]@2x.png", + "[调皮]@2x.png", + "[多云]@2x.png", + "[发呆]@2x.png", + "[发抖]@2x.png", + "[飞机]@2x.png", + "[飞吻]@2x.png", + "[奋斗]@2x.png", + "[风车]@2x.png", + "[尴尬]@2x.png", + "[勾引]@2x.png", + "[鼓掌]@2x.png", + "[害羞]@2x.png", + "[憨笑]@2x.png", + "[红灯笼]@2x.png", + "[红双喜]@2x.png", + "[坏笑]@2x.png", + "[挥手]@2x.png", + "[回头]@2x.png", + "[饥饿]@2x.png", + "[激动]@2x.png", + "[街舞]@2x.png", + "[惊恐]@2x.png", + "[惊讶]@2x.png", + "[咖啡]@2x.png", + "[磕头]@2x.png", + "[可爱]@2x.png", + "[可怜]@2x.png", + "[抠鼻]@2x.png", + "[骷髅]@2x.png", + "[酷]@2x.png", + "[快哭了]@2x.png", + "[困]@2x.png", + "[蜡烛]@2x.png", + "[篮球]@2x.png", + "[冷汗]@2x.png", + "[礼品袋]@2x.png", + "[礼物]@2x.png", + "[流汗]@2x.png", + "[流泪]@2x.png", + "[麻将]@2x.png", + "[麦克风]@2x.png", + "[猫咪]@2x.png", + "[么么哒]@2x.png", + "[玫瑰]@2x.png", + "[米饭]@2x.png", + "[面条]@2x.png", + "[奶瓶]@2x.png", + "[难过]@2x.png", + "[闹钟]@2x.png", + "[怒]@2x.png", + "[怄火]@2x.png", + "[皮球]@2x.png", + "[啤酒]@2x.png", + "[瓢虫]@2x.png", + "[撇嘴]@2x.png", + "[乒乓]@2x.png", + "[汽车]@2x.png", + "[强]@2x.png", + "[敲打]@2x.png", + "[青蛙]@2x.png", + "[糗大了]@2x.png", + "[拳头]@2x.png", + "[弱]@2x.png", + "[色]@2x.png", + "[沙发]@2x.png", + "[删除]@2x.png", + "[闪电]@2x.png", + "[胜利]@2x.png", + "[示爱]@2x.png", + "[手枪]@2x.png", + "[衰]@2x.png", + "[睡觉]@2x.png", + "[太阳]@2x.png", + "[跳绳]@2x.png", + "[跳跳]@2x.png", + "[偷笑]@2x.png", + "[吐]@2x.png", + "[委屈]@2x.png", + "[握手]@2x.png", + "[西瓜]@2x.png", + "[下雨]@2x.png", + "[吓]@2x.png", + "[献吻]@2x.png", + "[香蕉]@2x.png", + "[象棋]@2x.png", + "[心碎了]@2x.png", + "[信封]@2x.png", + "[熊猫]@2x.png", + "[嘘]@2x.png", + "[药]@2x.png", + "[疑问]@2x.png", + "[阴险]@2x.png", + "[右车头]@2x.png", + "[右哼哼]@2x.png", + "[右太极]@2x.png", + "[雨伞]@2x.png", + "[月亮]@2x.png", + "[晕]@2x.png", + "[再见]@2x.png", + "[炸弹]@2x.png", + "[折磨]@2x.png", + "[纸巾]@2x.png", + "[咒骂]@2x.png", + "[猪头]@2x.png", + "[抓狂]@2x.png", + "[转圈]@2x.png", + "[龇牙]@2x.png", + "[钻戒]@2x.png", + "[左车头]@2x.png", + "[左哼哼]@2x.png", + "[左太极]@2x.png", + "[NO]@2x.png", + "[OK]@2x.png", + ]) + ]; +} diff --git a/lib/ui/utils/custom_emoji_face_data_class.dart b/lib/ui/utils/custom_emoji_face_data_class.dart new file mode 100644 index 0000000..ccf53a7 --- /dev/null +++ b/lib/ui/utils/custom_emoji_face_data_class.dart @@ -0,0 +1,19 @@ +class CustomEmojiFaceData { + CustomEmojiFaceData( + {required this.name, + required this.icon, + required this.list, + this.isEmoji = false}); + + late String name; + late String icon; + late List list; + late bool isEmoji; + + CustomEmojiFaceData.fromJson(Map json) { + name = json['name']; + icon = json['icon']; + list = json['list']; + isEmoji = json['isEmoji'] ?? false; + } +} diff --git a/lib/ui/utils/custom_sticker.dart b/lib/ui/utils/custom_sticker.dart new file mode 100644 index 0000000..356f80a --- /dev/null +++ b/lib/ui/utils/custom_sticker.dart @@ -0,0 +1,9 @@ +class CustomSticker { + const CustomSticker( + {required this.name, required this.index, this.url, this.unicode}); + + final int? unicode; + final String name; + final int index; + final String? url; +} diff --git a/lib/ui/utils/message.dart b/lib/ui/utils/message.dart index 6e82e79..30785fb 100644 --- a/lib/ui/utils/message.dart +++ b/lib/ui/utils/message.dart @@ -4,67 +4,10 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/constants/history_message_constant.dart'; -import 'package:tim_ui_kit/ui/constants/time.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart'; - -class CallingMessage { - /// 发起邀请方 - String? inviter; - - /// 被邀请方 - List? inviteeList; - - /// videoCall: 语音 audioCall: 视频 - int? callType; - - // 1: 邀请方发起邀请 - // 2: 邀请方取消邀请 - // 3: 被邀请方接受邀请 - // 4: 被邀请方拒绝邀请 - // 5: 邀请超时 - int? actionType; - - /// 邀请ID - String? inviteID; - - /// 通话时间 - int? timeout; - - /// 通话房间 - int? roomID; - - // 通话时间:秒,大于0代表通话时间 - int? callEnd; - // 是否是群组通话 - bool? isGroup; - - CallingMessage( - {this.inviter, - this.actionType, - this.inviteID, - this.inviteeList, - this.timeout, - this.roomID, - this.callType, - this.callEnd, - this.isGroup}); - - CallingMessage.fromJSON(json) { - actionType = json["actionType"]; - timeout = json["timeout"]; - inviter = json["inviter"]; - inviteeList = List.from(json["inviteeList"]); - inviteID = json["inviteID"]; - callType = jsonDecode(json["data"])["cmd"] != null - ? (jsonDecode(json["data"])["cmd"] == "audioCall" ? 1 : 2) - : jsonDecode(json["data"])["call_type"]; - roomID = jsonDecode(json["data"])["room_id"]; - callEnd = jsonDecode(json["data"])["call_end"]; - isGroup = jsonDecode(json["data"])["is_group"]; - } -} +import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; +import 'package:tencent_cloud_chat_uikit/ui/constants/time.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart'; class MessageUtils { // 判断CallingData的方式和Trtc的方法一致 @@ -271,17 +214,17 @@ class MessageUtils { static String handleCustomMessageString(V2TimMessage message) { final customElem = message.customElem; - final callingMessage = TIMUIKitCustomElem.getCallMessage(customElem); + final callingMessage = CallingMessage.getCallMessage(customElem); if (callingMessage != null) { // 如果是结束消息 - final isCallEnd = TIMUIKitCustomElem.isCallEndExist(callingMessage); + final isCallEnd = CallingMessage.isCallEndExist(callingMessage); String? option2 = ""; if (isCallEnd) { - option2 = TIMUIKitCustomElem.getShowTime(callingMessage.callEnd!); + option2 = CallingMessage.getShowTime(callingMessage.callEnd!); } return isCallEnd ? (TIM_t_para("通话时间:{{option2}}", "通话时间:$option2")(option2: option2)) - : (TIMUIKitCustomElem.getActionType(callingMessage.actionType!)); + : (CallingMessage.getActionType(callingMessage.actionType!)); } else { return TIM_t("自定义消息"); } @@ -290,16 +233,16 @@ class MessageUtils { static handleCustomMessage(V2TimMessage message, context) { // 这个函数应该返回String,目前已经切走用不上了,但是不敢删QAQ,就这么留着吧。 final customElem = message.customElem; - final callingMessage = TIMUIKitCustomElem.getCallMessage(customElem); + final callingMessage = CallingMessage.getCallMessage(customElem); if (callingMessage != null) { // 如果是结束消息 - final isCallEnd = TIMUIKitCustomElem.isCallEndExist(callingMessage); + final isCallEnd = CallingMessage.isCallEndExist(callingMessage); final isVoiceCall = callingMessage.callType == 1; String? option2 = ""; if (isCallEnd) { - option2 = TIMUIKitCustomElem.getShowTime(callingMessage.callEnd!); + option2 = CallingMessage.getShowTime(callingMessage.callEnd!); } return Row( @@ -309,7 +252,7 @@ class MessageUtils { padding: const EdgeInsets.only(right: 4), child: Image.asset( isVoiceCall ? "images/voice_call.png" : "images/video_call.png", - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: 16, width: 16, ), @@ -318,7 +261,7 @@ class MessageUtils { ? Text(TIM_t_para("通话时间:{{option2}}", "通话时间:$option2")( option2: option2)) : Text( - TIMUIKitCustomElem.getActionType(callingMessage.actionType!)), + CallingMessage.getActionType(callingMessage.actionType!)), // if (isFromSelf) // Padding( // padding: const EdgeInsets.only(left: 4), @@ -326,7 +269,7 @@ class MessageUtils { // isVoiceCall // ? "images/voice_call.png" // : "images/video_call_self.png", - // package: 'tim_ui_kit', + // package: 'tencent_cloud_chat_uikit', // height: 16, // width: 16, // ), diff --git a/lib/ui/utils/permission.dart b/lib/ui/utils/permission.dart index 3706102..01ec029 100644 --- a/lib/ui/utils/permission.dart +++ b/lib/ui/utils/permission.dart @@ -8,10 +8,10 @@ import 'package:package_info_plus/package_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; class PermissionRequestInfo extends StatefulWidget { final Function removeOverLay; @@ -92,7 +92,7 @@ class _PermissionRequestInfo extends TIMUIKitState width: 50, child: Image.asset( permission?["icon"] ?? "", - package: "tim_ui_kit", + package: "tencent_cloud_chat_uikit", ), ), const SizedBox( diff --git a/lib/ui/utils/shared_theme.dart b/lib/ui/utils/shared_theme.dart index 3297786..f194d1c 100644 --- a/lib/ui/utils/shared_theme.dart +++ b/lib/ui/utils/shared_theme.dart @@ -1,7 +1,7 @@ // ignore_for_file: unused_import import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; // class SharedThemeWidget extends InheritedWidget { // final TUITheme theme; diff --git a/lib/ui/utils/sound_record.dart b/lib/ui/utils/sound_record.dart index a14ad36..c04402e 100644 --- a/lib/ui/utils/sound_record.dart +++ b/lib/ui/utils/sound_record.dart @@ -3,7 +3,7 @@ import 'dart:async'; import 'package:flutter_plugin_record_plus/const/play_state.dart'; import 'package:flutter_plugin_record_plus/const/response.dart'; import 'package:flutter_plugin_record_plus/index.dart'; -import 'package:tim_ui_kit/import_proxy/import_proxy.dart'; +import 'package:tencent_cloud_chat_uikit/import_proxy/import_proxy.dart'; typedef PlayStateListener = void Function(PlayState playState); typedef SoundInterruptListener = void Function(); diff --git a/lib/ui/views/TIMUIKitAddFriend/tim_uikit_add_friend.dart b/lib/ui/views/TIMUIKitAddFriend/tim_uikit_add_friend.dart index 396febd..e18ffb8 100644 --- a/lib/ui/views/TIMUIKitAddFriend/tim_uikit_add_friend.dart +++ b/lib/ui/views/TIMUIKitAddFriend/tim_uikit_add_friend.dart @@ -1,16 +1,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/add_friend_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitAddFriend/tim_uikit_send_application.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/add_friend_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitAddFriend/tim_uikit_send_application.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; class TIMUIKitAddFriend extends StatefulWidget { final bool? isShowDefaultGroup; diff --git a/lib/ui/views/TIMUIKitAddFriend/tim_uikit_send_application.dart b/lib/ui/views/TIMUIKitAddFriend/tim_uikit_send_application.dart index 0270070..f778f3a 100644 --- a/lib/ui/views/TIMUIKitAddFriend/tim_uikit_send_application.dart +++ b/lib/ui/views/TIMUIKitAddFriend/tim_uikit_send_application.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/add_friend_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/add_friend_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class SendApplication extends StatefulWidget { final V2TimUserFullInfo friendInfo; diff --git a/lib/ui/views/TIMUIKitAddGroup/tim_uikit_add_group.dart b/lib/ui/views/TIMUIKitAddGroup/tim_uikit_add_group.dart index d827494..40dedd7 100644 --- a/lib/ui/views/TIMUIKitAddGroup/tim_uikit_add_group.dart +++ b/lib/ui/views/TIMUIKitAddGroup/tim_uikit_add_group.dart @@ -1,15 +1,15 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/add_group_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/data_services/conversation/conversation_services.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitAddGroup/tim_uikit_send_application.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/add_group_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitAddGroup/tim_uikit_send_application.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitAddGroup extends StatefulWidget { /// The life cycle hooks for adding group business logic diff --git a/lib/ui/views/TIMUIKitAddGroup/tim_uikit_send_application.dart b/lib/ui/views/TIMUIKitAddGroup/tim_uikit_send_application.dart index cb5904c..79eb6c4 100644 --- a/lib/ui/views/TIMUIKitAddGroup/tim_uikit_send_application.dart +++ b/lib/ui/views/TIMUIKitAddGroup/tim_uikit_send_application.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/add_group_life_cycle.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/add_group_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class SendJoinGroupApplication extends StatefulWidget { final V2TimGroupInfo groupInfo; diff --git a/lib/ui/views/TIMUIKitBlackList/tim_uikit_black_list.dart b/lib/ui/views/TIMUIKitBlackList/tim_uikit_black_list.dart index 158caeb..77b948b 100644 --- a/lib/ui/views/TIMUIKitBlackList/tim_uikit_black_list.dart +++ b/lib/ui/views/TIMUIKitBlackList/tim_uikit_black_list.dart @@ -1,15 +1,15 @@ import 'package:flutter/material.dart'; import 'package:flutter_slidable_for_tencent_im/flutter_slidable.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/block_list_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/block_list_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; typedef BlackListItemBuilder = Widget Function( BuildContext context, V2TimFriendInfo friendInfo); 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 977121f..a76c86c 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 @@ -1,8 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_tongue_item.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_tongue_item.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; enum MessageListTongueType { none, 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 f0ae5ab..624c5f1 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 @@ -2,12 +2,12 @@ import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; import 'package:tuple/tuple.dart'; class TIMUIKitHistoryMessageListTongueContainer extends StatefulWidget { @@ -55,18 +55,18 @@ class _TIMUIKitHistoryMessageListTongueContainerState scrollHandler() { final screenHeight = MediaQuery.of(context).size.height; - if (widget.scrollController.offset == 0.0 && - widget.model.getTempMessageList().isNotEmpty) { - final double originalHeight = - widget.scrollController.position.extentAfter; + if (widget.scrollController.offset <= 0.0 && + widget.model.getConversationUnreadCount() != 0) { + // final double originalHeight = + // widget.scrollController.position.extentAfter; 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); - } - }); + // 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 && 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 232324d..3d74660 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,12 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; class TIMUIKitTongueItem extends TIMUIKitStatelessWidget { /// the callback after clicking 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 eab3cf7..329b634 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 @@ -5,19 +5,19 @@ import 'package:flutter/material.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:provider/provider.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; // ignore: unused_import -import 'package:tim_ui_kit/ui/utils/optimize_utils.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/utils.dart'; -import 'package:tim_ui_kit/ui/widgets/keepalive_wrapper.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/keepalive_wrapper.dart'; import 'TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; import 'TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue_container.dart'; @@ -83,6 +83,8 @@ class TIMUIKitHistoryMessageList extends StatefulWidget { final TUIChatSeparateViewModel model; + final bool isAllowScroll; + const TIMUIKitHistoryMessageList( {Key? key, required this.model, @@ -93,6 +95,7 @@ class TIMUIKitHistoryMessageList extends StatefulWidget { this.tongueItemBuilder, this.groupAtInfoList, this.initFindingMsg, + this.isAllowScroll = true, this.mainHistoryListConfig}) : super(key: key); @@ -302,13 +305,37 @@ class _TIMUIKitHistoryMessageListState } } + List _getRecivedMessageList(int recivedMessageListCount) { + if (recivedMessageListCount == 0) { + return []; + } + final haveTimeStampMessage = + widget.messageList[recivedMessageListCount]?.elemType == 11; + final endPoint = haveTimeStampMessage + ? recivedMessageListCount + 1 + : recivedMessageListCount; + return widget.messageList.sublist(0, endPoint).toList(); + } + @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { + // center key should generate everytime when build method called. + final GlobalKey centerKey = GlobalKey(); + final theme = value.theme; if (widget.messageList.isEmpty) { return Container(); } + final messageList = widget.messageList; + final globalModel = context.read(); + final unreadCount = globalModel.unreadCountForConversation; + final recivedNewMessageList = globalModel.recivedMessageListCount; + final shouldShowUnreadMessage = unreadCount > 0; + final unreadMessageList = _getRecivedMessageList(recivedNewMessageList); + final readedMessageList = messageList + .sublist(unreadMessageList.length, messageList.length) + .toList(); final throteFunction = OptimizeUtils.throttle((index) async { final msgID = @@ -327,81 +354,123 @@ class _TIMUIKitHistoryMessageListState } return Stack( - alignment: Alignment.center, + alignment: Alignment.topCenter, children: [ - Align( - alignment: Alignment.topCenter, - child: ListView.custom( - key: widget.mainHistoryListConfig?.key, - primary: widget.mainHistoryListConfig?.primary, - physics: widget.mainHistoryListConfig?.physics, + CustomScrollView( + center: shouldShowUnreadMessage ? centerKey : null, + key: widget.mainHistoryListConfig?.key, + primary: widget.mainHistoryListConfig?.primary, + physics: (widget.isAllowScroll == false) + ? const NeverScrollableScrollPhysics() + : widget.mainHistoryListConfig?.physics, + // padding: widget.mainHistoryListConfig?.padding ?? EdgeInsets.zero, + // itemExtent: widget.mainHistoryListConfig?.itemExtent, + // prototypeItem: widget.mainHistoryListConfig?.prototypeItem, + cacheExtent: widget.mainHistoryListConfig?.cacheExtent ?? 1500, + semanticChildCount: widget.mainHistoryListConfig?.semanticChildCount, + dragStartBehavior: widget.mainHistoryListConfig?.dragStartBehavior ?? + DragStartBehavior.start, + keyboardDismissBehavior: + widget.mainHistoryListConfig?.keyboardDismissBehavior ?? + ScrollViewKeyboardDismissBehavior.manual, + restorationId: widget.mainHistoryListConfig?.restorationId, + clipBehavior: + widget.mainHistoryListConfig?.clipBehavior ?? Clip.hardEdge, + reverse: true, + shrinkWrap: !shouldShowUnreadMessage, + controller: _autoScrollController, + slivers: [ + SliverPadding( padding: widget.mainHistoryListConfig?.padding ?? EdgeInsets.zero, - itemExtent: widget.mainHistoryListConfig?.itemExtent, - prototypeItem: widget.mainHistoryListConfig?.prototypeItem, - cacheExtent: widget.mainHistoryListConfig?.cacheExtent ?? 1500, - semanticChildCount: - widget.mainHistoryListConfig?.semanticChildCount, - dragStartBehavior: - widget.mainHistoryListConfig?.dragStartBehavior ?? - DragStartBehavior.start, - keyboardDismissBehavior: - widget.mainHistoryListConfig?.keyboardDismissBehavior ?? - ScrollViewKeyboardDismissBehavior.manual, - restorationId: widget.mainHistoryListConfig?.restorationId, - clipBehavior: - widget.mainHistoryListConfig?.clipBehavior ?? Clip.hardEdge, - reverse: true, - shrinkWrap: widget.mainHistoryListConfig?.shrinkWrap ?? true, - controller: _autoScrollController, - childrenDelegate: SliverChildBuilderDelegate( - (BuildContext context, int index) { - final messageItem = messageList[index]; - if (index == messageList.length - 1) { - if (widget.model.haveMoreData) { - throteFunction(index); - return Column( - children: [ - LoadingAnimationWidget.staggeredDotsWave( - color: theme.weakTextColor ?? Colors.grey, - size: 28, - ), - AutoScrollTag( - controller: _autoScrollController, - index: -index, - key: ValueKey( - getMessageIdentifier(messageItem, index)), - highlightColor: Colors.black.withOpacity(0.1), - child: KeepAliveWrapper( - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 16), - child: - _getMessageItemBuilder(messageItem))), - ), - ], + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + final messageItem = unreadMessageList[index]; + return AutoScrollTag( + controller: _autoScrollController, + index: -index, + key: ValueKey( + getMessageIdentifier(messageItem, index)), + highlightColor: Colors.black.withOpacity(0.1), + child: KeepAliveWrapper( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 16), + child: _getMessageItemBuilder(messageItem))), ); - } - } - return AutoScrollTag( - controller: _autoScrollController, - index: -index, - key: ValueKey(getMessageIdentifier(messageItem, index)), - highlightColor: Colors.black.withOpacity(0.1), - child: KeepAliveWrapper( - child: Container( - padding: - const EdgeInsets.symmetric(horizontal: 16), - child: _getMessageItemBuilder(messageItem))), - ); - }, - childCount: messageList.length, - findChildIndexCallback: (Key key) { - final ValueKey valueKey = key as ValueKey; - final String data = valueKey.value; - final int index = messageList.indexWhere( - (element) => getMessageIdentifier(element, 0) == data); - return index != -1 ? index : null; - })), + }, + childCount: unreadMessageList.length, + findChildIndexCallback: (Key key) { + final ValueKey valueKey = + key as ValueKey; + final String data = valueKey.value; + final int index = unreadMessageList.indexWhere( + (element) => + getMessageIdentifier(element, 0) == data); + return index != -1 ? index : null; + })), + ), + SliverPadding( + padding: EdgeInsets.zero, + key: centerKey, + ), + SliverPadding( + padding: widget.mainHistoryListConfig?.padding ?? EdgeInsets.zero, + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + final messageItem = readedMessageList[index]; + if (index == readedMessageList.length - 1) { + if (widget.model.haveMoreData) { + throteFunction(index); + return Column( + children: [ + LoadingAnimationWidget.staggeredDotsWave( + color: theme.weakTextColor ?? Colors.grey, + size: 28, + ), + AutoScrollTag( + controller: _autoScrollController, + index: -index, + key: ValueKey( + getMessageIdentifier(messageItem, index)), + highlightColor: Colors.black.withOpacity(0.1), + child: KeepAliveWrapper( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 16), + child: _getMessageItemBuilder( + messageItem))), + ), + ], + ); + } + } + return AutoScrollTag( + controller: _autoScrollController, + index: -index, + key: ValueKey( + getMessageIdentifier(messageItem, index)), + highlightColor: Colors.black.withOpacity(0.1), + child: KeepAliveWrapper( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 16), + child: _getMessageItemBuilder(messageItem))), + ); + }, + childCount: readedMessageList.length, + findChildIndexCallback: (Key key) { + final ValueKey valueKey = + key as ValueKey; + final String data = valueKey.value; + final int index = readedMessageList.indexWhere( + (element) => + getMessageIdentifier(element, 0) == data); + return index != -1 ? index : null; + })), + ), + ], ), TIMUIKitHistoryMessageListTongueContainer( model: widget.model, 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 65de3cd..a13fd22 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 @@ -10,32 +10,32 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:provider/provider.dart'; import 'package:super_tooltip/super_tooltip.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/constants/history_message_constant.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/time_ago.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_message_tooltip.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_message_read_receipt.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_trtc_tips_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/ui/widgets/loading.dart'; -import 'package:tim_ui_kit/ui/widgets/radio_button.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/time_ago.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_message_tooltip.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_message_read_receipt.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_trtc_tips_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/loading.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/radio_button.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import '../TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_select_emoji.dart'; @@ -228,6 +228,11 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { // open MessageReaction final bool? isUseMessageReaction; + /// Whether to use the default emoji + final bool isUseDefaultEmoji; + + final customEmojiStickerList; + const TIMUIKitHistoryMessageListItem( {Key? key, required this.message, @@ -253,7 +258,9 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget { this.textPadding, this.topRowBuilder, this.isUseMessageReaction, - this.bottomRowBuilder}) + this.bottomRowBuilder, + this.isUseDefaultEmoji = false, + this.customEmojiStickerList = const []}) : super(key: key); @override @@ -425,6 +432,8 @@ class _TIMUIKItHistoryMessageListItemState backgroundColor: widget.themeData?.messageBackgroundColor, textPadding: widget.textPadding, isShowMessageReaction: widget.isUseMessageReaction, + isUseDefaultEmoji: widget.isUseDefaultEmoji, + customEmojiStickerList: widget.customEmojiStickerList, ); case MessageElemType.V2TIM_ELEM_TYPE_FACE: if (messageItemBuilder?.faceMessageItemBuilder != null) { @@ -765,7 +774,8 @@ class _TIMUIKItHistoryMessageListItemState Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { final TUIChatSeparateViewModel model = Provider.of(context); - final TUIChatGlobalModel globalModel = serviceLocator(); + final isDownloadWaiting = context.select( + (value) => value.isWaiting(widget.message.msgID ?? "")); final TUITheme theme = value.theme; final message = widget.message; final msgType = message.elemType; @@ -776,8 +786,7 @@ class _TIMUIKItHistoryMessageListItemState final isRevokedMsg = msgStatus == 6; final isTimeDivider = msgType == 11; final isPeerRead = message.isPeerRead ?? false; - final isGroupMessage = - widget.message.groupID != null && widget.message.groupID!.isNotEmpty; + final isGroupMessage = model.conversationType == ConvType.group; final bool isRevokeEditable = widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT; final isShowNickNameForSelf = @@ -885,7 +894,7 @@ class _TIMUIKItHistoryMessageListItemState isSelf ? MainAxisAlignment.end : MainAxisAlignment.start, children: [ if (!isSelf && widget.showAvatar) - InkWell( + GestureDetector( onTap: () { if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) { @@ -987,8 +996,8 @@ class _TIMUIKItHistoryMessageListItemState message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING) Container( - padding: const EdgeInsets.only(bottom: 10), - margin: const EdgeInsets.only(right: 4), + padding: const EdgeInsets.only(bottom: 3), + margin: const EdgeInsets.only(right: 6), child: const Loading(), ), if (isSelf && @@ -1059,8 +1068,7 @@ class _TIMUIKItHistoryMessageListItemState ], ), ), - if (widget.message.elemType == 6 && - globalModel.isWaiting(widget.message.msgID ?? "")) + if (widget.message.elemType == 6 && isDownloadWaiting) Container( margin: const EdgeInsets.only(top: 24, left: 6), child: LoadingAnimationWidget.threeArchedCircle( diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_message_tooltip.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_message_tooltip.dart index 9aa4cd8..81402d9 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_message_tooltip.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_message_tooltip.dart @@ -6,15 +6,15 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/screen_utils.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; -import 'package:tim_ui_kit/ui/widgets/forward_message_screen.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/forward_message_screen.dart'; import '../TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_select_emoji.dart'; @@ -168,7 +168,7 @@ class TIMUIKitMessageTooltipState children: [ Image.asset( item["icon"]!, - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', width: 20, height: 20, ), 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 3310553..d340d59 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 @@ -3,16 +3,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/ui/constants/history_message_constant.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; enum LoadingPlace { none, @@ -56,25 +56,36 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget { /// tool tips panel configuration, long press message will show tool tips panel final ToolTipsConfig? toolTipsConfig; - const TIMUIKitHistoryMessageListContainer( - {Key? key, - this.itemBuilder, - this.scrollController, - required this.conversationID, - required this.conversationType, - this.userAvatarBuilder, - this.onLongPressForOthersHeadPortrait, - this.groupAtInfoList, - this.messageItemBuilder, - this.tongueItemBuilder, - this.extraTipsActionItemBuilder, - this.onTapAvatar, - @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") - this.showNickName = true, - this.initFindingMsg, - this.mainHistoryListConfig, - this.toolTipsConfig}) - : super(key: key); + /// Whether to use the default emoji + final bool isUseDefaultEmoji; + + final customEmojiStickerList; + + final bool isAllowScroll; + + const TIMUIKitHistoryMessageListContainer({ + Key? key, + this.itemBuilder, + this.scrollController, + required this.conversationID, + required this.conversationType, + this.userAvatarBuilder, + this.onLongPressForOthersHeadPortrait, + this.groupAtInfoList, + this.messageItemBuilder, + this.tongueItemBuilder, + this.extraTipsActionItemBuilder, + this.isAllowScroll = true, + this.onTapAvatar, + @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") + this.showNickName = true, + this.initFindingMsg, + this.mainHistoryListConfig, + this.toolTipsConfig, + this.isUseDefaultEmoji = false, + this.customEmojiStickerList = const [], + }) : super(key: key); + @override State createState() => _TIMUIKitHistoryMessageListContainerState(); @@ -124,12 +135,15 @@ class _TIMUIKitHistoryMessageListContainerState builder: (context, messageList, child) { return TIMUIKitHistoryMessageList( model: model, + isAllowScroll: widget.isAllowScroll, controller: _historyMessageListController, groupAtInfoList: widget.groupAtInfoList, mainHistoryListConfig: widget.mainHistoryListConfig, itemBuilder: (context, message) { return TIMUIKitHistoryMessageListItem( userAvatarBuilder: widget.userAvatarBuilder, + customEmojiStickerList: widget.customEmojiStickerList, + isUseDefaultEmoji: widget.isUseDefaultEmoji, topRowBuilder: _getTopRowBuilder(model), onScrollToIndex: _historyMessageListController.scrollToIndex, onScrollToIndexBegin: @@ -139,6 +153,7 @@ class _TIMUIKitHistoryMessageListContainerState additionalItemBuilder: widget.extraTipsActionItemBuilder), message: message!, + showAvatar: chatConfig.isShowAvatar, onTapForOthersPortrait: widget.onTapAvatar, messageItemBuilder: widget.messageItemBuilder, onLongPressForOthersHeadPortrait: diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_message_read_receipt.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_message_read_receipt.dart index 5567897..5c9a738 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_message_read_receipt.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_message_read_receipt.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/widgets/message_read_receipt.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/message_read_receipt.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitMessageReadReceipt extends TIMUIKitStatelessWidget { final V2TimMessage messageItem; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/utils.dart b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/utils.dart index 1c52917..20c1a30 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/utils.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKItMessageList/utils.dart @@ -1,4 +1,4 @@ -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; class TIMUIKitChatUtils { static String? getMessageIDWithinIndex( diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar.dart index 446ee83..9143f69 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar.dart @@ -1,16 +1,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/friendShip/friendship_services.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar_title.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar_title.dart'; import 'package:tuple/tuple.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitAppBar extends StatefulWidget implements PreferredSizeWidget { /// Appbar config diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar_title.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar_title.dart index 83db181..08b8450 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar_title.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitAppBar/tim_uikit_appbar_title.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/i18n/i18n_utils.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; class TIMUIKitAppBarTitle extends StatelessWidget { final Widget? title; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_detail.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_detail.dart index ef12c6d..b45a0fd 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_detail.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_detail.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; class TIMUIKitMessageReactionDetail extends StatefulWidget { /// the index of the current emoji sticker diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_select_emoji.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_select_emoji.dart index edf1250..8b11ffc 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_select_emoji.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_select_emoji.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/message_reaction_emoji.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_emoji_panel.dart'; -import 'package:tim_ui_kit/ui/widgets/emoji.dart'; -import 'package:tim_ui_kit/ui/widgets/extended_wrap/extended_wrap.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/message_reaction_emoji.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_emoji_panel.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/emoji.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/extended_wrap/extended_wrap.dart'; enum SelectEmojiPanelPosition { up, down } diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_item.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_item.dart index 163b7b2..e433909 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_item.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_item.dart @@ -3,16 +3,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart'; -import 'package:tim_ui_kit/ui/widgets/extended_wrap/extended_wrap.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/extended_wrap/extended_wrap.dart'; class TIMUIKitMessageReactionShowItem extends TIMUIKitStatelessWidget { /// the unicode of the emoji diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart index 63c02a6..270a9cb 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_detail.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_item.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_detail.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_item.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; class TIMUIKitMessageReactionShowPanel extends TIMUIKitStatelessWidget { /// current message diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart index 89ee654..ee82e42 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_utils.dart @@ -1,11 +1,11 @@ import 'dart:convert'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/message/message_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; class MessageReactionUtils { static final TUISelfInfoViewModel selfInfoModel = diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart index 9e8b41f..da94359 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart @@ -3,11 +3,11 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; class TIMUIKitMessageReactionWrapper extends StatefulWidget { final Widget child; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart index ca9b413..f19041e 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart @@ -1,8 +1,8 @@ -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_tips_elem.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_sound_elem.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_video_elem.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart'; -export 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_reply_elem.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_tips_elem.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_sound_elem.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_video_elem.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart'; +export 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_reply_elem.dart'; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart index 5670dce..a158842 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart @@ -1,44 +1,11 @@ // ignore_for_file: unrelated_type_equality_checks -import 'dart:convert'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/common/extensions.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/common/utils.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; - -class LinkMessage { - String? link; - String? text; - String? businessID; - - LinkMessage.fromJSON(Map json) { - link = json["link"]; - text = json["text"]; - businessID = json["businessID"]; - } -} - -class WebLinkMessage { - String? title; - String? description; - Map? hyperlinks_text; - - WebLinkMessage.fromJSON(Map json) { - title = json["title"]; - description = json["description"]; - hyperlinks_text = json["hyperlinks_text"]; - } -} class TIMUIKitCustomElem extends TIMUIKitStatelessWidget { final V2TimCustomElem? customElem; @@ -62,211 +29,6 @@ class TIMUIKitCustomElem extends TIMUIKitStatelessWidget { this.textPadding, }) : super(key: key); - static CallingMessage? getCallMessage(V2TimCustomElem? customElem) { - try { - if (customElem?.data != null) { - final customMessage = jsonDecode(customElem!.data!); - return CallingMessage.fromJSON(customMessage); - } - return null; - } catch (err) { - return null; - } - } - - static LinkMessage? getLinkMessage(V2TimCustomElem? customElem) { - try { - if (customElem?.data != null) { - final customMessage = jsonDecode(customElem!.data!); - return LinkMessage.fromJSON(customMessage); - } - return null; - } catch (err) { - return null; - } - } - - static WebLinkMessage? getWebLinkMessage(V2TimCustomElem? customElem) { - try { - if (customElem?.extension != null) { - final customMessage = jsonDecode(customElem!.extension!); - return WebLinkMessage.fromJSON(customMessage); - } - return null; - } catch (err) { - return null; - } - } - - static String getActionType(int actionType) { - final actionMessage = { - 1: TIM_t("发起通话"), - 2: TIM_t("取消通话"), - 3: TIM_t("接受通话"), - 4: TIM_t("拒绝通话"), - 5: TIM_t("超时未接听"), - }; - return actionMessage[actionType] ?? ""; - } - - static isCallEndExist(CallingMessage callMsg) { - int? callEnd = callMsg.callEnd; - int? actionType = callMsg.actionType; - if (actionType == 2) return false; - return callEnd == null - ? false - : callEnd > 0 - ? true - : false; - } - - static String twoDigits(int n) { - if (n >= 10) return "$n"; - return "0$n"; - } - - static getShowTime(int seconds) { - int secondsShow = seconds % 60; - int minutsShow = seconds ~/ 60; - return "${twoDigits(minutsShow)}:${twoDigits(secondsShow)}"; - } - - static Future launchWebURL(BuildContext context, String url) async { - try { - await launchUrl( - Uri.parse(url).withScheme, - mode: LaunchMode.externalApplication, - ); - } catch (e) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(TIM_t("无法打开URL"))), // Cannot launch the url - ); - } - } - - Widget _callElemBuilder(BuildContext context) { - final callingMessage = getCallMessage(customElem); - final linkMessage = getLinkMessage(customElem); - final webLinkMessage = getWebLinkMessage(customElem); - - if (callingMessage != null) { - // 如果是结束消息 - final isCallEnd = isCallEndExist(callingMessage); - - final isVoiceCall = callingMessage.callType == 1; - - String? option2 = ""; - if (isCallEnd) { - option2 = getShowTime(callingMessage.callEnd!); - } - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - if (!isFromSelf) - Padding( - padding: const EdgeInsets.only(right: 4), - child: Image.asset( - isVoiceCall ? "images/voice_call.png" : "images/video_call.png", - package: 'tim_ui_kit', - height: 16, - width: 16, - ), - ), - isCallEnd - ? Text(TIM_t_para("通话时间:{{option2}}", "通话时间:$option2")( - option2: option2)) - : Text( - getActionType(callingMessage.actionType!), - style: messageFontStyle, - ), - if (isFromSelf) - Padding( - padding: const EdgeInsets.only(left: 4), - child: Image.asset( - isVoiceCall - ? "images/voice_call.png" - : "images/video_call_self.png", - package: 'tim_ui_kit', - height: 16, - width: 16, - ), - ), - ], - ); - } else if (linkMessage != null) { - final String option1 = linkMessage.link ?? ""; - return Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(linkMessage.text ?? ""), - MarkdownBody( - data: TIM_t_para("[查看详情 >>]({{option1}})", "[查看详情 >>]($option1)")( - option1: option1), - styleSheet: MarkdownStyleSheet.fromTheme(ThemeData( - textTheme: - const TextTheme(bodyText2: TextStyle(fontSize: 16.0)))) - .copyWith( - a: TextStyle(color: LinkUtils.hexToColor("015fff")), - ), - onTapLink: ( - String link, - String? href, - String title, - ) { - LinkUtils.launchURL(context, linkMessage.link ?? ""); - }, - ) - ], - ); - } else if (webLinkMessage != null) { - return Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text.rich(TextSpan( - style: const TextStyle( - fontSize: 16, - ), - children: [ - TextSpan(text: webLinkMessage.title), - TextSpan( - text: webLinkMessage.hyperlinks_text?["key"], - style: const TextStyle( - color: Color.fromRGBO(0, 110, 253, 1), - ), - recognizer: TapGestureRecognizer() - ..onTap = () { - launchWebURL( - context, - webLinkMessage.hyperlinks_text?["value"], - ); - }, - ) - ])), - if (webLinkMessage.description != null && - webLinkMessage.description!.isNotEmpty) - Text( - webLinkMessage.description!, - style: const TextStyle( - fontSize: 16, - ), - ) - ], - ); - } else if (customElem?.data == "group_create") { - return Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(TIM_t(("群聊创建成功!"))), - ], - ); - } else { - return const Text("[自定义]"); - } - } - @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { final theme = value.theme; @@ -293,9 +55,7 @@ class TIMUIKitCustomElem extends TIMUIKitStatelessWidget { constraints: const BoxConstraints(maxWidth: 240), child: Column( children: [ - _callElemBuilder(context), - if (isShowMessageReaction ?? true) - TIMUIKitMessageReactionShowPanel(message: message) + Text(TIM_t("自定义消息")) ], )); } diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart index 042a53e..fed5487 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; class TIMUIKitFaceElem extends StatefulWidget { final String path; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart index dba734f..03b4df6 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart @@ -7,25 +7,25 @@ import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; -import 'package:open_file/open_file.dart'; +import 'package:tencent_open_file/tencent_open_file.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/permission.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_icon.dart'; -import 'package:tim_ui_kit/ui/widgets/textSize.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_icon.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/textSize.dart'; import 'package:url_launcher/url_launcher.dart'; class TIMUIKitFileElem extends StatefulWidget { @@ -82,7 +82,11 @@ class _TIMUIKitFileElemState extends TIMUIKitState { onPressed: () { //关闭对话框并返回true Navigator.of(context).pop(); - OpenFile.open(path); + try { + OpenFile.open(path); + } catch (e) { + print(e); + } }, ), ], @@ -95,16 +99,24 @@ class _TIMUIKitFileElemState extends TIMUIKitState { void initState() { super.initState(); if (!PlatformUtils().isWeb) { - hasFile(); + Future.delayed(const Duration(microseconds: 10), () { + hasFile(); + }); } } Future getSavePath() async { var appDocDir = await getTemporaryDirectory(); - String savePathWithAppPath = appDocDir.path + - '/' + - (widget.message.msgID ?? "") + - widget.fileElem!.fileName!; + // String savePathWithAppPath = appDocDir.path + + // '/' + + // (widget.message.msgID ?? "") + + // widget.fileElem!.fileName!; + // return savePathWithAppPath; + + String savePathWithAppPath = + '/storage/emulated/0/Android/data/com.tencent.flutter.tuikit/cache/' + + (widget.message.msgID ?? "") + + widget.fileElem!.fileName!; return savePathWithAppPath; } @@ -112,11 +124,25 @@ class _TIMUIKitFileElemState extends TIMUIKitState { if (PlatformUtils().isWeb) { return true; } - String savePath = await getSavePath(); + + if (model.getMessageProgress(widget.messageID) == 100) { + String savePath = widget.message.fileElem!.localUrl ?? + model.getFileMessageLocation(widget.messageID); + File f = File(savePath); + if (f.existsSync() && widget.messageID != null) { + filePath = savePath; + // model.setFileMessageLocation(widget.messageID!, filePath); + return true; + } + return false; + } + // String savePath = await getSavePath(); + String savePath = widget.message.fileElem!.localUrl ?? ''; File f = File(savePath); if (f.existsSync() && widget.messageID != null) { filePath = savePath; model.setMessageProgress(widget.messageID!, 100); + // model.setFileMessageLocation(widget.messageID!, filePath); return true; } return false; @@ -135,16 +161,8 @@ class _TIMUIKitFileElemState extends TIMUIKitState { } addUrlToWaitingPath() async { - try { - if (widget.fileElem!.url!.isNotEmpty) { - String savePath = await getSavePath(); - model.addWaitingList( - widget.messageID!, widget.fileElem!.url!, savePath); - print("add path success"); - } - } catch (err) { - // err - } + model.addWaitingList(widget.messageID!); + print("add path success"); } checkIsWaiting() { @@ -167,13 +185,6 @@ class _TIMUIKitFileElemState extends TIMUIKitState { } tryOpenFile(context, theme) async { - if (PlatformUtils().isWeb) { - launchUrl( - Uri.parse(widget.fileElem?.path ?? ""), - mode: LaunchMode.externalApplication, - ); - return; - } if (!await Permissions.checkPermission(context, Permission.storage.value)) { return; } @@ -217,6 +228,13 @@ class _TIMUIKitFileElemState extends TIMUIKitState { } return GestureDetector( onTap: () async { + if (PlatformUtils().isWeb) { + launchUrl( + Uri.parse(widget.fileElem?.path ?? ""), + mode: LaunchMode.externalApplication, + ); + return; + } if (await hasFile()) { if (received == 100) { tryOpenFile(context, theme); @@ -230,7 +248,6 @@ class _TIMUIKitFileElemState extends TIMUIKitState { ), ); } - return; } @@ -286,7 +303,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState { child: LayoutBuilder( builder: (buildContext, boxConstraints) { - return ExtendText( + return CustomText( fileName, width: boxConstraints.maxWidth, style: TextStyle( diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_icon.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_icon.dart index 63fbe47..ebf586a 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_icon.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_icon.dart @@ -2,8 +2,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; class TIMUIKitFileIcon extends TIMUIKitStatelessWidget { final String? fileFormat; @@ -39,7 +39,7 @@ class TIMUIKitFileIcon extends TIMUIKitStatelessWidget { Widget _getFileIcon() { return Image.asset( fileMap[fileFormat?.toLowerCase()] ?? "images/unknown.png", - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', ); } diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_tips_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_tips_elem.dart index d9fecfc..189dce6 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_tips_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_tips_elem.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitGroupTipsElem extends TIMUIKitStatelessWidget { final V2TimGroupTipsElem groupTipsElem; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_trtc_tips_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_trtc_tips_elem.dart index 30d995c..361a1d1 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_trtc_tips_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_group_trtc_tips_elem.dart @@ -4,17 +4,17 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/shared_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/shared_theme.dart'; import '../../../utils/color.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitGroupTrtcTipsElem extends StatefulWidget { final V2TimMessage? customMessage; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart index b2957d7..cb48236 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart @@ -4,7 +4,8 @@ import 'dart:async'; import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:crypto/crypto.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; import 'package:universal_html/html.dart' as html; import 'dart:io'; import 'dart:math'; @@ -17,24 +18,24 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/constants/history_message_constant.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/permission.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; -import 'package:tim_ui_kit/ui/widgets/image_screen.dart'; -import 'package:tim_ui_kit/ui/widgets/toast.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/image_screen.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/toast.dart'; import 'package:transparent_image/transparent_image.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; -import 'package:tim_ui_kit/ui/utils/shared_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/shared_theme.dart'; class TIMUIKitImageElem extends StatefulWidget { final V2TimMessage message; @@ -61,6 +62,7 @@ class TIMUIKitImageElem extends StatefulWidget { class _TIMUIKitImageElem extends TIMUIKitState { double? networkImagePositionRadio; // 加这个字段用于异步获取被安全打击后的兜底图的比例 final TUIChatGlobalModel model = serviceLocator(); + final MessageService _messageService = serviceLocator(); Widget? imageItem; bool isSent = false; @@ -130,7 +132,7 @@ class _TIMUIKitImageElem extends TIMUIKitState { if (PlatformUtils().isIOS) { if (!await Permissions.checkPermission( - context, Permission.photosAddOnly.value)) { + context, Permission.photosAddOnly.value, false)) { return; } } else { @@ -141,23 +143,63 @@ class _TIMUIKitImageElem extends TIMUIKitState { } // 本地资源的情况下 - if (isAsset) { - File file = File(imageUrl); - response = await file.readAsBytes(); - } else { - var res = await Dio() - .get(imageUrl, options: Options(responseType: ResponseType.bytes), - onReceiveProgress: (recv, total) { - if (total != -1) { - model.setMessageProgress( - widget.message.msgID!, (recv / total * 100).ceil()); + if (!isAsset) { + if (widget.message.msgID == null || widget.message.msgID!.isEmpty) { + return; + } + + if (model.getMessageProgress(widget.message.msgID) == 100) { + String savePath; + if (widget.message.imageElem!.path != null && + widget.message.imageElem!.path != '') { + savePath = widget.message.imageElem!.path!; + } else { + savePath = model.getFileMessageLocation(widget.message.msgID); } - }); - response = res.data; + File f = File(savePath); + if (f.existsSync()) { + var result = await ImageGallerySaver.saveFile(savePath); + + if (PlatformUtils().isIOS) { + if (result['isSuccess']) { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("图片保存成功"), + infoCode: 6660406)); + } else { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("图片保存失败"), + infoCode: 6660407)); + } + } else { + if (result != null) { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("图片保存成功"), + infoCode: 6660406)); + } else { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("图片保存失败"), + infoCode: 6660407)); + } + } + return; + } + } else { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("the message is downloading"), + infoCode: -1)); + } + return; } - model.setMessageProgress(widget.message.msgID!, 0); - var result = - await ImageGallerySaver.saveImage(Uint8List.fromList(response)); + // model.setMessageProgress(widget.message.msgID!, 0); + // var result = + // await ImageGallerySaver.saveImage(Uint8List.fromList(response)); + + var result = await ImageGallerySaver.saveFile(imageUrl); if (PlatformUtils().isIOS) { if (result['isSuccess']) { @@ -203,6 +245,25 @@ class _TIMUIKitImageElem extends TIMUIKitState { _saveImageToLocal(context, path, isAsset: true); } else { String imgUrl = getBigPicUrl(); + if (widget.message.imageElem!.imageList![0]!.localUrl != '' && + widget.message.imageElem!.imageList![0]!.localUrl != null) { + File f = File(widget.message.imageElem!.imageList![0]!.localUrl!); + if (f.existsSync()) { + _saveImageToLocal( + context, widget.message.imageElem!.imageList![0]!.localUrl!, + isAsset: true); + return; + } + } + if (widget.message.imageElem!.path != '' && + widget.message.imageElem!.path != null) { + File f = File(widget.message.imageElem!.path!); + if (f.existsSync()) { + _saveImageToLocal(context, widget.message.imageElem!.path!, + isAsset: true); + return; + } + } _saveImageToLocal(context, imgUrl, isAsset: false); } } @@ -298,6 +359,27 @@ class _TIMUIKitImageElem extends TIMUIKitState { @override void initState() { super.initState(); + if (!PlatformUtils().isWeb) { + if ((widget.message.msgID != null && widget.message.msgID != '') && + (widget.message.imageElem!.imageList![0]!.localUrl == null || + widget.message.imageElem!.imageList![0]!.localUrl!.isEmpty)) { + _messageService.downloadMessage( + msgID: widget.message.msgID!, + messageType: 3, + imageType: 0, + isSnapshot: false); + _messageService.downloadMessage( + msgID: widget.message.msgID!, + messageType: 3, + imageType: 1, + isSnapshot: false); + _messageService.downloadMessage( + msgID: widget.message.msgID!, + messageType: 3, + imageType: 2, + isSnapshot: false); + } + } // 先暂时下掉用网络图片计算尺寸比例的feature,在没有找到准确的判断图片是否被打击前 // setOnlineImageRatio(); } @@ -361,21 +443,25 @@ class _TIMUIKitImageElem extends TIMUIKitState { const BoxConstraints(minWidth: 20, minHeight: 20), child: Hero( tag: heroTag, - child: + child: PlatformUtils().isWeb + ? Image.network( + path ?? smallImg?.url ?? originalImg!.url!, fit: BoxFit.contain) + : // Image.network(smallImg?.url ?? ""), CachedNetworkImage( - // width: double.infinity, - alignment: Alignment.topCenter, - imageUrl: path ?? smallImg?.url ?? originalImg!.url!, - // use small image in message list as priority - errorWidget: (context, error, stackTrace) => - errorPage(theme), - fit: BoxFit.contain, - cacheKey: smallImg?.uuid ?? originalImg!.uuid, - placeholder: (context, url) => - Image(image: MemoryImage(kTransparentImage)), - fadeInDuration: const Duration(milliseconds: 0), - )), + // width: double.infinity, + alignment: Alignment.topCenter, + imageUrl: + path ?? smallImg?.url ?? originalImg!.url!, + // use small image in message list as priority + errorWidget: (context, error, stackTrace) => + errorPage(theme), + fit: BoxFit.contain, + cacheKey: smallImg?.uuid ?? originalImg!.uuid, + placeholder: (context, url) => + Image(image: MemoryImage(kTransparentImage)), + fadeInDuration: const Duration(milliseconds: 0), + )), ), ), imageElem: e) diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_reply_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_reply_elem.dart index 1387263..0c1db00 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_reply_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_reply_elem.dart @@ -6,24 +6,24 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart'; -import 'package:tim_ui_kit/ui/utils/shared_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/link_preview_entry.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/models/link_preview_content.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/widgets/link_preview.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/shared_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/link_preview_entry.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/models/link_preview_content.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/widgets/link_preview.dart'; class TIMUIKitReplyElem extends StatefulWidget { final V2TimMessage message; @@ -241,12 +241,20 @@ class _TIMUIKitReplyElemState extends TIMUIKitState { } else { return Text(widget.message.textElem?.text ?? "", softWrap: true, - style: widget.fontStyle ?? const TextStyle(fontSize: 16)); + style: widget.fontStyle ?? + TextStyle( + fontSize: 16, + height: widget.chatModel.chatConfig.textHight, + )); } } else { return Text(widget.message.textElem?.text ?? "", softWrap: true, - style: widget.fontStyle ?? const TextStyle(fontSize: 16)); + style: widget.fontStyle ?? + TextStyle( + fontSize: 16, + height: widget.chatModel.chatConfig.textHight, + )); } } @@ -295,7 +303,7 @@ class _TIMUIKitReplyElemState extends TIMUIKitState { borderRadius: widget.borderRadius ?? borderRadius, ), constraints: - BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.7), + BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.6), child: GestureDetector( onTap: _jumpToRawMsg, child: Column( @@ -336,11 +344,19 @@ class _TIMUIKitReplyElemState extends TIMUIKitState { UrlPreviewType.none) Text(widget.message.textElem?.text ?? "", softWrap: true, - style: widget.fontStyle ?? const TextStyle(fontSize: 16)), + style: widget.fontStyle ?? + TextStyle( + fontSize: 16, + height: widget.chatModel.chatConfig.textHight, + )), if (widget.chatModel.chatConfig.urlPreviewType == UrlPreviewType.onlyHyperlink) textWithLink!( - style: widget.fontStyle ?? const TextStyle(fontSize: 16)), + style: widget.fontStyle ?? + TextStyle( + fontSize: 16, + height: widget.chatModel.chatConfig.textHight, + )), // If the link preview info is available, render the preview card. if (widget.chatModel.chatConfig.urlPreviewType == UrlPreviewType.previewCardAndHyperlink) diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_sound_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_sound_elem.dart index 1c5c001..54d94e2 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_sound_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_sound_elem.dart @@ -3,15 +3,17 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_plugin_record_plus/const/play_state.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/constants/history_message_constant.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/utils/sound_record.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/sound_record.dart'; import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; @@ -58,6 +60,8 @@ class _TIMUIKitSoundElemState extends TIMUIKitState { bool isShowJumpState = false; bool isShining = false; final TUIChatGlobalModel globalModel = serviceLocator(); + final MessageService _messageService = serviceLocator(); + late V2TimSoundElem stateElement = widget.message.soundElem!; _playSound() async { if (!SoundPlayer.isInited) { @@ -79,7 +83,7 @@ class _TIMUIKitSoundElemState extends TIMUIKitState { SoundPlayer.stop(); widget.chatModel.currentSelectedMsgId = ""; } else { - SoundPlayer.play(url: widget.soundElem.url!); + SoundPlayer.play(url: stateElement.url!); widget.chatModel.currentSelectedMsgId = widget.msgID; // SoundPlayer.setSoundInterruptListener(() { // // setState(() { @@ -89,6 +93,30 @@ class _TIMUIKitSoundElemState extends TIMUIKitState { } } + downloadMessageDetailAndSave() async { + if (widget.message.msgID != null && widget.message.msgID != '') { + if (widget.message.soundElem!.url == null || + widget.message.soundElem!.url == '') { + final response = await _messageService.getMessageOnlineUrl( + msgID: widget.message.msgID!); + widget.message.soundElem = response.data!.soundElem; + Future.delayed(const Duration(microseconds: 10), () { + setState(() => stateElement = response.data!.soundElem!); + }); + } + if (!PlatformUtils().isWeb) { + if (widget.message.soundElem!.localUrl == null || + widget.message.soundElem!.localUrl == '') { + _messageService.downloadMessage( + msgID: widget.message.msgID!, + messageType: 4, + imageType: 0, + isSnapshot: false); + } + } + } + } + @override void didUpdateWidget(oldWidget) { super.didUpdateWidget(oldWidget); @@ -107,6 +135,7 @@ class _TIMUIKitSoundElemState extends TIMUIKitState { // SoundPlayer.removeSoundInterruptListener(); } }); + downloadMessageDetailAndSave(); } @override @@ -121,8 +150,8 @@ class _TIMUIKitSoundElemState extends TIMUIKitState { double _getSoundLen() { double soundLen = 32; - if (widget.soundElem.duration != null) { - final realSoundLen = widget.soundElem.duration!; + if (stateElement.duration != null) { + final realSoundLen = stateElement.duration!; int sdLen = 32; if (realSoundLen > 10) { sdLen = 12 * charLen + ((realSoundLen - 10) * charLen / 0.5).floor(); @@ -209,19 +238,19 @@ class _TIMUIKitSoundElemState extends TIMUIKitState { ? [ Container(width: _getSoundLen()), Text( - "''${widget.soundElem.duration} ", + "''${stateElement.duration} ", style: widget.fontStyle, ), isPlaying ? Image.asset( 'images/play_voice_send.gif', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', width: 16, height: 16, ) : Image.asset( 'images/voice_send.png', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', width: 16, height: 16, ), @@ -230,7 +259,7 @@ class _TIMUIKitSoundElemState extends TIMUIKitState { isPlaying ? Image.asset( 'images/play_voice_receive.gif', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', width: 16, height: 16, ) @@ -238,10 +267,10 @@ class _TIMUIKitSoundElemState extends TIMUIKitState { 'images/voice_receive.png', width: 16, height: 16, - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', ), Text( - " ${widget.soundElem.duration}''", + " ${stateElement.duration}''", style: widget.fontStyle, ), Container(width: _getSoundLen()), diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart index 89a4543..0ffbb1c 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart @@ -1,14 +1,16 @@ import 'dart:async'; import 'dart:convert'; +import 'package:tencent_extended_text/extended_text.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/link_preview_entry.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/widgets/link_preview.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/DefaultSpecialTextSpanBuilder.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/link_preview_entry.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/widgets/link_preview.dart'; import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; class TIMUIKitTextElem extends StatefulWidget { @@ -22,6 +24,8 @@ class TIMUIKitTextElem extends StatefulWidget { final EdgeInsetsGeometry? textPadding; final TUIChatSeparateViewModel chatModel; final bool? isShowMessageReaction; + final bool isUseDefaultEmoji; + final List customEmojiStickerList; const TIMUIKitTextElem( {Key? key, @@ -34,7 +38,9 @@ class TIMUIKitTextElem extends StatefulWidget { this.isShowMessageReaction, this.backgroundColor, this.textPadding, - required this.chatModel}) + required this.chatModel, + this.isUseDefaultEmoji = false, + this.customEmojiStickerList = const []}) : super(key: key); @override @@ -155,9 +161,12 @@ class _TIMUIKitTextElemState extends TIMUIKitState { Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { final theme = value.theme; final textWithLink = LinkPreviewEntry.getHyperlinksText( - widget.message, - widget.chatModel.chatConfig.isSupportMarkdownForTextMessage, - widget.chatModel.chatConfig.onTapLink); + widget.message, + widget.chatModel.chatConfig.isSupportMarkdownForTextMessage, + widget.chatModel.chatConfig.onTapLink, + widget.isUseDefaultEmoji, + widget.customEmojiStickerList, + ); final borderRadius = widget.isFromSelf ? const BorderRadius.only( topLeft: Radius.circular(10), @@ -195,7 +204,7 @@ class _TIMUIKitTextElemState extends TIMUIKitState { borderRadius: widget.borderRadius ?? borderRadius, ), constraints: - BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.7), + BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.6), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -203,10 +212,22 @@ class _TIMUIKitTextElemState extends TIMUIKitState { // You can render the widget from extension directly, with a [TextStyle] optionally. widget.chatModel.chatConfig.urlPreviewType != UrlPreviewType.none ? textWithLink!( - style: widget.fontStyle ?? const TextStyle(fontSize: 16)) - : Text(widget.message.textElem?.text ?? "", + style: widget.fontStyle ?? + TextStyle( + fontSize: 16, + textBaseline: TextBaseline.ideographic, + height: widget.chatModel.chatConfig.textHight)) + : ExtendedText(widget.message.textElem?.text ?? "", softWrap: true, - style: widget.fontStyle ?? const TextStyle(fontSize: 16)), + style: widget.fontStyle ?? + TextStyle( + fontSize: 16, + height: widget.chatModel.chatConfig.textHight), + specialTextSpanBuilder: DefaultSpecialTextSpanBuilder( + isUseDefaultEmoji: widget.isUseDefaultEmoji, + customEmojiStickerList: widget.customEmojiStickerList, + showAtBackground: true, + )), // If the link preview info is available, render the preview card. if (_renderPreviewWidget() != null && widget.chatModel.chatConfig.urlPreviewType == diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_video_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_video_elem.dart index 37415ae..af66269 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_video_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_video_elem.dart @@ -6,16 +6,19 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; -import 'package:tim_ui_kit/ui/widgets/video_screen.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_wrapper.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/video_screen.dart'; import 'package:transparent_image/transparent_image.dart'; class TIMUIKitVideoElem extends StatefulWidget { @@ -40,6 +43,9 @@ class TIMUIKitVideoElem extends StatefulWidget { } class _TIMUIKitVideoElemState extends TIMUIKitState { + final TUIChatGlobalModel globalModel = serviceLocator(); + final MessageService _messageService = serviceLocator(); + late V2TimVideoElem stateElement = widget.message.videoElem!; Widget errorDisplay(TUITheme? theme) { return Container( decoration: BoxDecoration( @@ -67,9 +73,27 @@ class _TIMUIKitVideoElemState extends TIMUIKitState { ); } - Widget generateSnapshot(TUITheme theme) { - if (widget.message.videoElem!.snapshotUrl == null && - widget.message.videoElem!.snapshotUrl == null) { + Widget generateSnapshot(TUITheme theme, int height) { + if (!PlatformUtils().isWeb) { + final current = (DateTime.now().millisecondsSinceEpoch / 1000).ceil(); + final timeStamp = widget.message.timestamp ?? current; + if (current - timeStamp < 300) { + if (stateElement!.snapshotPath != null && + stateElement!.snapshotPath != '') { + File imgF = File(stateElement!.snapshotPath!); + bool isExist = imgF.existsSync(); + if (isExist) { + return Image.file(File(stateElement!.snapshotPath!), + fit: BoxFit.fitWidth); + } + } + } + } + + if ((stateElement!.snapshotUrl == null || + stateElement!.snapshotUrl == '') && + (stateElement!.snapshotPath == null || + stateElement!.snapshotPath == '')) { return Container( decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(5)), @@ -77,7 +101,7 @@ class _TIMUIKitVideoElemState extends TIMUIKitState { width: 1, color: Colors.black12, )), - height: 100, + height: double.parse(height.toString()), child: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -91,25 +115,59 @@ class _TIMUIKitVideoElemState extends TIMUIKitState { ), ); } - return (!kIsWeb && widget.message.videoElem!.snapshotUrl == null || + return (!kIsWeb && stateElement!.snapshotUrl == null || widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING) - ? Image.file(File(widget.message.videoElem!.snapshotPath!), - fit: BoxFit.fitWidth) + ? (stateElement!.snapshotPath!.isNotEmpty + ? Image.file(File(stateElement!.snapshotPath!), + fit: BoxFit.fitWidth) + : Image.file(File(stateElement!.localSnapshotUrl!), + fit: BoxFit.fitWidth)) : (kIsWeb || - widget.message.videoElem?.localSnapshotUrl == null || - widget.message.videoElem?.localSnapshotUrl == "") - ? CachedNetworkImage( - placeholder: (context, url) => - Image(image: MemoryImage(kTransparentImage)), - cacheKey: widget.message.videoElem!.UUID, - fit: BoxFit.fitWidth, - imageUrl: widget.message.videoElem!.snapshotUrl!, - errorWidget: (context, url, error) => errorDisplay(theme), - ) - : Image.file(File(widget.message.videoElem!.localSnapshotUrl!), + stateElement?.localSnapshotUrl == null || + stateElement?.localSnapshotUrl == "") + ? Image.network(stateElement!.snapshotUrl!, fit: BoxFit.fitWidth) + : Image.file(File(stateElement!.localSnapshotUrl!), fit: BoxFit.fitWidth); } + downloadMessageDetailAndSave() async { + if (widget.message.msgID != null && widget.message.msgID != '') { + if (widget.message.videoElem!.videoUrl == null || + widget.message.videoElem!.videoUrl == '') { + final response = await _messageService.getMessageOnlineUrl( + msgID: widget.message.msgID!); + widget.message.videoElem = response.data!.videoElem; + Future.delayed(const Duration(microseconds: 10), () { + setState(() => stateElement = response.data!.videoElem!); + }); + } + if (!PlatformUtils().isWeb) { + if (widget.message.videoElem!.localVideoUrl == null || + widget.message.videoElem!.localVideoUrl == '') { + _messageService.downloadMessage( + msgID: widget.message.msgID!, + messageType: 5, + imageType: 0, + isSnapshot: false); + } + if (widget.message.videoElem!.localSnapshotUrl == null || + widget.message.videoElem!.localSnapshotUrl == '') { + _messageService.downloadMessage( + msgID: widget.message.msgID!, + messageType: 5, + imageType: 0, + isSnapshot: true); + } + } + } + } + + @override + void initState() { + super.initState(); + downloadMessageDetailAndSave(); + } + @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { final theme = value.theme; @@ -124,6 +182,7 @@ class _TIMUIKitVideoElemState extends TIMUIKitState { pageBuilder: (_, __, ___) => VideoScreen( message: widget.message, heroTag: heroTag, + videoElement: stateElement, ), ), ); @@ -143,14 +202,13 @@ class _TIMUIKitVideoElemState extends TIMUIKitState { borderRadius: const BorderRadius.all(Radius.circular(5)), child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) { - double positionRadio = 1.0; - if (widget.message.videoElem?.snapshotWidth != null && - widget.message.videoElem?.snapshotHeight != null && - widget.message.videoElem?.snapshotWidth != 0 && - widget.message.videoElem?.snapshotHeight != 0) { - positionRadio = - (widget.message.videoElem!.snapshotWidth! / - widget.message.videoElem!.snapshotHeight!); + double positionRadio = 0.56; + if (stateElement?.snapshotWidth != null && + stateElement?.snapshotHeight != null && + stateElement?.snapshotWidth != 0 && + stateElement?.snapshotHeight != 0) { + positionRadio = (stateElement!.snapshotWidth! / + stateElement!.snapshotHeight!); } return ConstrainedBox( @@ -165,10 +223,8 @@ class _TIMUIKitVideoElemState extends TIMUIKitState { aspectRatio: positionRadio, child: Stack( children: [ - if (widget.message.videoElem!.snapshotUrl != - null || - widget.message.videoElem!.snapshotUrl != - null) + if (stateElement!.snapshotUrl != null || + stateElement!.snapshotUrl != null) AspectRatio( aspectRatio: positionRadio, child: Container( @@ -178,20 +234,27 @@ class _TIMUIKitVideoElemState extends TIMUIKitState { ), Row( children: [ - Expanded(child: generateSnapshot(theme)) + Expanded( + child: generateSnapshot( + theme, + stateElement!.snapshotHeight ?? + 100)) ], ), if (widget.message.status != MessageStatus .V2TIM_MSG_STATUS_SENDING && - widget.message.videoElem!.videoPath != - null || - widget.message.videoElem!.videoUrl != null) + (stateElement!.snapshotUrl != null || + stateElement!.snapshotPath != + null) && + stateElement!.videoPath != null || + stateElement!.videoUrl != null) Positioned.fill( // alignment: Alignment.center, child: Center( child: Image.asset('images/play.png', - package: 'tim_ui_kit', height: 64)), + package: 'tencent_cloud_chat_uikit', + height: 64)), ), Positioned( right: 10, diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart index b71ccac..b62a3ff 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart @@ -2,13 +2,13 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/merger_message_screen.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/merger_message_screen.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; @@ -68,16 +68,12 @@ class TIMUIKitMergerElemState extends TIMUIKitState { _handleTap(BuildContext context, TUIChatSeparateViewModel model) async { try { if (widget.messageID != "") { - final mergerMessageList = - await model.downloadMergerMessage(widget.messageID); - if (mergerMessageList != null) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => MergerMessageScreen( - model: model, messageList: mergerMessageList), - )); - } + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MergerMessageScreen( + model: model, msgID: widget.messageID), + )); } } catch (e) { onTIMCallback(TIMCallback( diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/DefaultSpecialTextSpanBuilder.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/DefaultSpecialTextSpanBuilder.dart new file mode 100644 index 0000000..18c3874 --- /dev/null +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/DefaultSpecialTextSpanBuilder.dart @@ -0,0 +1,43 @@ +import 'package:tencent_extended_text_field/extended_text_field.dart'; +import 'package:flutter/material.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/custom_emoji_face_data_class.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/http_text.dart'; + +import 'emoji_text.dart'; + +class DefaultSpecialTextSpanBuilder extends SpecialTextSpanBuilder { + DefaultSpecialTextSpanBuilder({ + this.isUseDefaultEmoji = false, + this.customEmojiStickerList = const [], + this.showAtBackground = false, + }); + + /// whether show background for @somebody + final bool showAtBackground; + + final bool isUseDefaultEmoji; + + final List customEmojiStickerList; + + @override + SpecialText? createSpecialText(String flag, + {TextStyle? textStyle, + SpecialTextGestureTapCallback? onTap, + int? index}) { + if (flag == '') { + return null; + } + + ///index is end index of start flag, so text start index should be index-(flag.length-1) + if (isStart(flag, EmojiText.flag)) { + return EmojiText(textStyle, + start: index! - (EmojiText.flag.length - 1), + isUseDefaultEmoji: isUseDefaultEmoji, + customEmojiStickerList: customEmojiStickerList); + } else if (isStart(flag, HttpText.flag)) { + return HttpText(textStyle, onTap, + start: index! - (HttpText.flag.length - 1)); + } + return null; + } +} diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/emoji_text.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/emoji_text.dart new file mode 100644 index 0000000..84724c1 --- /dev/null +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/emoji_text.dart @@ -0,0 +1,107 @@ + +import 'package:flutter/material.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/constant_data.dart'; +import 'package:tencent_extended_text/extended_text.dart'; + +///emoji/image text +class EmojiText extends SpecialText { + EmojiText(TextStyle? textStyle, + {this.start, + this.isUseDefaultEmoji = false, + this.customEmojiStickerList = const []}) + : super(EmojiText.flag, ']', textStyle); + static const String flag = '['; + final int? start; + final bool isUseDefaultEmoji; + final customEmojiStickerList; + @override + InlineSpan finishText() { + final String key = toString(); + + if (EmojiUitl( + isUseDefaultEmoji: isUseDefaultEmoji, + customEmojiStickerList: customEmojiStickerList) + .instance + .emojiMap + .containsKey(key)) { + double size = 16; + + final TextStyle ts = textStyle!; + if (ts.fontSize != null) { + size = ts.fontSize! * 1.15; + } + + if (isUseDefaultEmoji == true) { + return ImageSpan( + AssetImage( + EmojiUitl( + isUseDefaultEmoji: isUseDefaultEmoji, + customEmojiStickerList: customEmojiStickerList) + .instance + .emojiMap[key]!, + package: "tencent_im_base"), + actualText: key, + imageWidth: size, + imageHeight: size, + start: start!, + // fit: BoxFit.cover, + margin: const EdgeInsets.all(0)); + } else { + return ImageSpan( + AssetImage(EmojiUitl( + isUseDefaultEmoji: isUseDefaultEmoji, + customEmojiStickerList: customEmojiStickerList) + .instance + .emojiMap[key]!), + actualText: key, + imageWidth: size, + imageHeight: size, + start: start!, + // fit: BoxFit.cover, + margin: const EdgeInsets.all(0)); + } + } + + return TextSpan(text: toString(), style: textStyle); + } +} + +class EmojiUitl { + EmojiUitl( + {this.isUseDefaultEmoji = false, this.customEmojiStickerList = const []}); + EmojiUitl._(this.isUseDefaultEmoji, this.customEmojiStickerList) { + RegExp exp = RegExp(r"([\u4e00-\u9fa5]+|[a-zA-Z]+)"); + if (isUseDefaultEmoji == true) { + for (int i = 0; i < ConstData.emojiList.length; i++) { + for (int j = 0; j < ConstData.emojiList[i].list.length; j++) { + var emojiPngNameMatch = + exp.firstMatch(ConstData.emojiList[i].list[j]); + String? emojiName = emojiPngNameMatch![0]; + _emojiMap['[$emojiName]'] = + '$_emojiFilePath/${ConstData.emojiList[i].name}/[$emojiName]@2x.png'; + } + } + } else { + for (int i = 0; i < customEmojiStickerList.length; i++) { + for (int j = 0; j < customEmojiStickerList[i].list.length; j++) { + var emojiPngNameMatch = + exp.firstMatch(customEmojiStickerList[i].list[j]); + String? emojiName = emojiPngNameMatch![0]; + _emojiMap['[$emojiName]'] = + '$_emojiFilePath/${customEmojiStickerList[i].name}/[$emojiName]@2x.png'; + } + } + } + } + final List customEmojiStickerList; + final bool isUseDefaultEmoji; + final Map _emojiMap = {}; + + Map get emojiMap => _emojiMap; + + final String _emojiFilePath = 'assets/custom_face_resource'; + // EmojiUitl? _instance; + static EmojiUitl? _instance; + EmojiUitl get instance => + _instance ??= EmojiUitl._(isUseDefaultEmoji, customEmojiStickerList); +} diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/http_text.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/http_text.dart new file mode 100644 index 0000000..3b5ef32 --- /dev/null +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/http_text.dart @@ -0,0 +1,45 @@ + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/common/utils.dart'; +import 'package:tencent_extended_text/extended_text.dart'; + +class HttpText extends SpecialText { + HttpText(TextStyle? textStyle, SpecialTextGestureTapCallback? onTap, + {this.start}) + : super(flag, flag, textStyle, onTap: onTap); + static const String flag = '\$'; + final int? start; + @override + InlineSpan finishText() { + final String text = getContent(); + + return SpecialTextSpan( + text: text, + actualText: toString(), + start: start!, + + ///caret can move into special text + deleteAll: true, + style: TextStyle(color: LinkUtils.hexToColor("015fff")), + recognizer: TapGestureRecognizer() + ..onTap = () { + if (onTap != null) { + onTap!(toString()); + } + }); + } +} + +List dollarList = [ + '\$Dota2\$', + '\$Dota2 Ti9\$', + '\$CN dota best dota\$', + '\$Flutter\$', + '\$CN dev best dev\$', + '\$UWP\$', + '\$Nevermore\$', + '\$FlutterCandies\$', + '\$ExtendedImage\$', + '\$ExtendedText\$', +]; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_at_text.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_at_text.dart index 71497d2..80bb3d2 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_at_text.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_at_text.dart @@ -1,15 +1,15 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart'; -import 'package:tim_ui_kit/ui/widgets/group_member_list.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/group_member_list.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class AtText extends StatefulWidget { final String? groupID; @@ -114,7 +114,7 @@ class _AtTextState extends TIMUIKitState { constraints: const BoxConstraints(), icon: Image.asset( 'images/arrow_back.png', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: 34, width: 34, ), diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_call_invite_list.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_call_invite_list.dart index a3fd044..3410b53 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_call_invite_list.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_call_invite_list.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart'; -import 'package:tim_ui_kit/ui/widgets/group_member_list.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/group_member_list.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class SelectCallInviter extends StatefulWidget { final String? groupID; diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_emoji_panel.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_emoji_panel.dart index 83ef129..e6555cc 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_emoji_panel.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_emoji_panel.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/constants/emoji.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/constants/emoji.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/widgets/emoji.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/emoji.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/common/extensions.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/common/extensions.dart'; import 'package:url_launcher/url_launcher.dart'; class EmojiPanel extends TIMUIKitStatelessWidget { diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_more_panel.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_more_panel.dart index 9e3df9e..6adb9f9 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_more_panel.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_more_panel.dart @@ -13,24 +13,24 @@ import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; import 'package:tencent_wechat_camera_picker/tencent_wechat_camera_picker.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/permission.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/intl_camer_picker.dart'; -import 'package:tim_ui_kit/ui/widgets/toast.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/intl_camer_picker.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/toast.dart'; import 'package:video_thumbnail/video_thumbnail.dart' as video_thumbnail; import 'package:wechat_assets_picker/wechat_assets_picker.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/utils/shared_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/shared_theme.dart'; import 'package:universal_html/html.dart' as html; class MorePanelConfig { @@ -109,7 +109,7 @@ class _MorePanelState extends TIMUIKitState { borderRadius: BorderRadius.all(Radius.circular(5))), child: SvgPicture.asset( "images/screen.svg", - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: 64, width: 64, ), @@ -130,7 +130,7 @@ class _MorePanelState extends TIMUIKitState { borderRadius: BorderRadius.all(Radius.circular(5))), child: SvgPicture.asset( "images/photo.svg", - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: 64, width: 64, ), @@ -151,7 +151,7 @@ class _MorePanelState extends TIMUIKitState { borderRadius: BorderRadius.all(Radius.circular(5))), child: SvgPicture.asset( "images/photo.svg", - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: 64, width: 64, ), @@ -188,7 +188,7 @@ class _MorePanelState extends TIMUIKitState { borderRadius: BorderRadius.all(Radius.circular(5))), child: SvgPicture.asset( "images/file.svg", - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: 64, width: 64, ), @@ -471,43 +471,45 @@ class _MorePanelState extends TIMUIKitState { top: BorderSide(width: 1, color: Colors.grey.shade300), ), ), - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 23), + padding: const EdgeInsets.only(top: 20, left: 20, right: 20), width: screenWidth, - child: Wrap( - spacing: (screenWidth - (23 * 2) - 64 * 4) / 3, - runSpacing: 20, - children: itemList(model) - .map((item) => InkWell( - onTap: () { - if (item.onTap != null) { - item.onTap!(context); - } - }, - child: widget.morePanelConfig?.actionBuilder != null - ? widget.morePanelConfig?.actionBuilder!(item) - : SizedBox( - height: 94, - width: 64, - child: Column( - children: [ - Container( - height: 64, - width: 64, - margin: const EdgeInsets.only(bottom: 4), - decoration: const BoxDecoration( - borderRadius: - BorderRadius.all(Radius.circular(5))), - child: item.icon, - ), - Text( - item.title, - style: TextStyle( - fontSize: 12, color: theme.darkTextColor), - ) - ], - ), - ))) - .toList(), + child: SingleChildScrollView( + child: Wrap( + spacing: (screenWidth - (23 * 2) - 64 * 4) / 3, + runSpacing: 20, + children: itemList(model) + .map((item) => InkWell( + onTap: () { + if (item.onTap != null) { + item.onTap!(context); + } + }, + child: widget.morePanelConfig?.actionBuilder != null + ? widget.morePanelConfig?.actionBuilder!(item) + : SizedBox( + height: 94, + width: 64, + child: Column( + children: [ + Container( + height: 64, + width: 64, + margin: const EdgeInsets.only(bottom: 4), + decoration: const BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(5))), + child: item.icon, + ), + Text( + item.title, + style: TextStyle( + fontSize: 12, color: theme.darkTextColor), + ) + ], + ), + ))) + .toList(), + ), ), ); } diff --git a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart index 6e03316..d0c7737 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart @@ -8,18 +8,18 @@ import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/permission.dart'; -import 'package:tim_ui_kit/ui/utils/sound_record.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/toast.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/sound_record.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/toast.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class SendSoundMessage extends StatefulWidget { /// conversation ID 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 aeca4b2..e7f9675 100644 --- a/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart +++ b/lib/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart @@ -1,27 +1,34 @@ import 'dart:async'; +import 'package:tencent_extended_text_field/extended_text_field.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; import 'package:provider/provider.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_conversation_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_at_text.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_emoji_panel.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart'; +import 'package:tencent_extended_text_field/extended_text_field.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_at_text.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_emoji_panel.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; -import 'package:tim_ui_kit/ui/utils/permission.dart'; +import '../../../utils/constant_data.dart'; +import '../../../utils/custom_emoji_face_data_class.dart'; +import '../../../utils/custom_sticker.dart'; +import 'special_text/DefaultSpecialTextSpanBuilder.dart'; +import 'special_text/emoji_text.dart'; enum MuteStatus { none, me, all } @@ -64,12 +71,20 @@ class TIMUIKitInputTextField extends StatefulWidget { final TUIChatSeparateViewModel model; + /// Whether to use the default emoji + final bool isUseDefaultEmoji; + + final List customEmojiStickerList; + /// sticker panel customiziation final Widget Function( - {void Function() sendTextMessage, - void Function(int index, String data) sendFaceMessage, - void Function() deleteText, - void Function(int unicode) addText})? customStickerPanel; + {void Function() sendTextMessage, + void Function(int index, String data) sendFaceMessage, + void Function() deleteText, + void Function(int unicode) addText, + void Function(String singleEmojiName) addCustomEmojiText, + List defaultCustomEmojiStickerList})? + customStickerPanel; const TIMUIKitInputTextField( {Key? key, @@ -86,6 +101,8 @@ class TIMUIKitInputTextField extends StatefulWidget { this.backgroundColor, this.controller, this.onChanged, + this.isUseDefaultEmoji = false, + this.customEmojiStickerList = const [], required this.model}) : super(key: key); @@ -147,7 +164,17 @@ class _InputTextFieldState extends TIMUIKitState { textEditingController.text = "$oldText$newText"; // handleSetDraftText(); }, - ) + addCustomEmojiText: ((String singleEmojiName) { + RegExp exp = RegExp(r"([\u4e00-\u9fa5]+|[a-zA-Z]+)"); + var emojiPngNameMatch = exp.firstMatch(singleEmojiName); + String? emojiName = emojiPngNameMatch![0]; + final oldText = textEditingController.text; + final newText = '[$emojiName]'; + textEditingController.text = "$oldText$newText"; + setSendButton(); + }), + defaultCustomEmojiStickerList: + widget.isUseDefaultEmoji ? ConstData.emojiList : []) : EmojiPanel(onTapEmoji: (unicode) { final oldText = textEditingController.text; final newText = String.fromCharCode(unicode); @@ -248,10 +275,11 @@ class _InputTextFieldState extends TIMUIKitState { final text = "${MessageUtils.getDisplayName(widget.model.repliedMessage!)}:${widget.model.abstractMessageBuilder != null ? widget.model.abstractMessageBuilder!(widget.model.repliedMessage!) : MessageUtils.getAbstractMessage(widget.model.repliedMessage!)}"; return Container( - color: hexToColor("EBF0F6"), + color: widget.backgroundColor ?? hexToColor("f5f5f6"), alignment: Alignment.centerLeft, padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), child: Row( + crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( @@ -260,21 +288,20 @@ class _InputTextFieldState extends TIMUIKitState { softWrap: true, maxLines: 3, overflow: TextOverflow.ellipsis, - style: TextStyle(color: hexToColor("8F96A0"), fontSize: 14), + style: TextStyle(color: hexToColor("8f959e"), fontSize: 14), ), ), + const SizedBox( + width: 16, + ), InkWell( onTap: () { widget.model.repliedMessage = null; }, - child: SizedBox( - height: 18, - width: 18, - child: Image.asset( - 'images/clear.png', - package: 'tim_ui_kit', - ), - ), + child: Icon( + Icons.clear, + color: hexToColor("8f959e"), + size: 18), ) ], ), @@ -340,6 +367,7 @@ class _InputTextFieldState extends TIMUIKitState { setSendButton(); } +// index为emoji的index,data为baseurl+name onCustomEmojiFaceSubmitted(int index, String data) { final convType = widget.conversationType; if (widget.model.repliedMessage != null) { @@ -716,7 +744,7 @@ class _InputTextFieldState extends TIMUIKitState { children: [ _buildRepliedMessage(value), Container( - color: widget.backgroundColor ?? hexToColor("f7f6f6"), + color: widget.backgroundColor ?? hexToColor("f5f5f6"), child: SafeArea( child: Column( children: [ @@ -766,7 +794,7 @@ class _InputTextFieldState extends TIMUIKitState { showSendSoundText ? 'images/keyboard.svg' : 'images/voice.svg', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', color: const Color.fromRGBO(68, 68, 68, 1), height: 28, width: 28, @@ -784,12 +812,13 @@ class _InputTextFieldState extends TIMUIKitState { conversationID: widget.conversationID, conversationType: widget.conversationType) - : TextField( - onChanged: debounceFunc, + : ExtendedTextField( + // selectionControls: + // _defaultTextSelectionControls, maxLines: 4, minLines: 1, - controller: textEditingController, focusNode: focusNode, + onChanged: debounceFunc, onTap: () { goDownBottom(); setState(() { @@ -816,7 +845,15 @@ class _InputTextFieldState extends TIMUIKitState { filled: true, isDense: true, hintText: widget.hintText ?? ''), - ), + controller: textEditingController, + specialTextSpanBuilder: + DefaultSpecialTextSpanBuilder( + isUseDefaultEmoji: + widget.isUseDefaultEmoji, + customEmojiStickerList: + widget.customEmojiStickerList, + showAtBackground: true, + )), ), if (forbiddenText == null) const SizedBox( @@ -839,7 +876,7 @@ class _InputTextFieldState extends TIMUIKitState { showEmojiPanel ? 'images/keyboard.svg' : 'images/face.svg', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', color: const Color.fromRGBO(68, 68, 68, 1), height: 28, @@ -864,7 +901,7 @@ class _InputTextFieldState extends TIMUIKitState { color: hexToColor("5c6168"), size: 32) : SvgPicture.asset( 'images/add.svg', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', color: const Color.fromRGBO(68, 68, 68, 1), height: 28, diff --git a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart index c9f1f11..03db957 100644 --- a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart +++ b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart @@ -5,32 +5,33 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/chat_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/listener_model/tui_group_listener_model.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/constants/history_message_constant.dart'; -import 'package:tim_ui_kit/ui/controller/tim_uikit_chat_controller.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/frame.dart'; -import 'package:tim_ui_kit/ui/utils/optimize_utils.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart'; - +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/chat_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; +import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_chat_controller.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/frame.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart'; +import '../../utils/custom_emoji_face_data_class.dart'; +import '../../utils/custom_sticker.dart'; import 'TIMUIKItMessageList/TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; import 'TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; import 'TIMUIKItMessageList/tim_uikit_history_message_list_container.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitChat extends StatefulWidget { int startTime = 0; int endTime = 0; /// The chat controller you tend to used. - /// You have to provide this before using it after tim_ui_kit 0.1.4. + /// You have to provide this before using it after tencent_cloud_chat_uikit 0.1.4. final TIMUIKitChatController? controller; /// The ID of the Group that the topic belongs to, only need for topic. @@ -118,49 +119,55 @@ class TIMUIKitChat extends StatefulWidget { /// The top fixed widget. final Widget? topFixWidget; + final List customEmojiStickerList; + /// Custom emoji panel. final Widget Function( - {void Function() sendTextMessage, - void Function(int index, String data) sendFaceMessage, - void Function() deleteText, - void Function(int unicode) addText})? customStickerPanel; + {void Function() sendTextMessage, + void Function(int index, String data) sendFaceMessage, + void Function() deleteText, + void Function(int unicode) addText, + void Function(String singleEmojiName) addCustomEmojiText, + List defaultCustomEmojiStickerList})? + customStickerPanel; /// Custom text field final Widget Function(BuildContext context)? textFieldBuilder; - TIMUIKitChat({ - Key? key, - this.groupID, - required this.conversationID, - required this.conversationType, - required this.conversationShowName, - this.abstractMessageBuilder, - this.onTapAvatar, - @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") - this.showNickName = false, - this.showTotalUnReadCount = false, - this.messageItemBuilder, - @Deprecated("Please use [extraTipsActionItemBuilder] instead") - this.exteraTipsActionItemBuilder, - this.extraTipsActionItemBuilder, - this.draftText, - this.textFieldHintText, - this.initFindingMsg, - this.userAvatarBuilder, - this.appBarConfig, - this.controller, - this.morePanelConfig, - this.customStickerPanel, - this.config = const TIMUIKitChatConfig(), - this.tongueItemBuilder, - this.groupAtInfoList, - this.mainHistoryListConfig, - this.onDealWithGroupApplication, - this.toolTipsConfig, - this.lifeCycle, - this.topFixWidget = const SizedBox(), - this.textFieldBuilder, - }) : super(key: key) { + TIMUIKitChat( + {Key? key, + this.groupID, + required this.conversationID, + required this.conversationType, + required this.conversationShowName, + this.abstractMessageBuilder, + this.onTapAvatar, + @Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") + this.showNickName = false, + this.showTotalUnReadCount = false, + this.messageItemBuilder, + @Deprecated("Please use [extraTipsActionItemBuilder] instead") + this.exteraTipsActionItemBuilder, + this.extraTipsActionItemBuilder, + this.draftText, + this.textFieldHintText, + this.initFindingMsg, + this.userAvatarBuilder, + this.appBarConfig, + this.controller, + this.morePanelConfig, + this.customStickerPanel, + this.config = const TIMUIKitChatConfig(), + this.tongueItemBuilder, + this.groupAtInfoList, + this.mainHistoryListConfig, + this.onDealWithGroupApplication, + this.toolTipsConfig, + this.lifeCycle, + this.topFixWidget = const SizedBox(), + this.textFieldBuilder, + this.customEmojiStickerList = const []}) + : super(key: key) { startTime = DateTime.now().millisecondsSinceEpoch; } @@ -175,6 +182,9 @@ class _TUIChatState extends TIMUIKitState { TIMUIKitInputTextFieldController(); bool isInit = false; + final GlobalKey alignKey = GlobalKey(); + final GlobalKey listContainerKey = GlobalKey(); + late AutoScrollController autoController = AutoScrollController( viewportBoundaryGetter: () => Rect.fromLTRB(0, 0, 0, MediaQuery.of(context).padding.bottom), @@ -296,6 +306,17 @@ class _TUIChatState extends TIMUIKitState { } } + final alignBox = + alignKey.currentContext?.findRenderObject() as RenderBox?; + final alignHeight = alignBox?.size.height ?? 0; + + final listContainerBox = + listContainerKey.currentContext?.findRenderObject() as RenderBox?; + final listContainerBoxHeight = listContainerBox?.size.height ?? 0; + + print( + 'hjkadshjghajklsdhfjklsahgjkl: alignBox${alignHeight},listContainerBox${listContainerBoxHeight}, isAllow:${(!(listContainerBoxHeight < alignHeight))}'); + return GestureDetector( onTap: () { textFieldController.hideAllPanel(); @@ -317,10 +338,18 @@ class _TUIChatState extends TIMUIKitState { if (widget.topFixWidget != null) widget.topFixWidget!, Expanded( child: Align( + key: alignKey, alignment: Alignment.topCenter, child: Listener( onPointerMove: closePanel, child: TIMUIKitHistoryMessageListContainer( + customEmojiStickerList: + widget.customEmojiStickerList, + isUseDefaultEmoji: + widget.config!.isUseDefaultEmoji, + key: listContainerKey, + isAllowScroll: + (!(listContainerBoxHeight < alignHeight)), userAvatarBuilder: widget.userAvatarBuilder, toolTipsConfig: widget.toolTipsConfig, groupAtInfoList: widget.groupAtInfoList, @@ -358,6 +387,10 @@ class _TUIChatState extends TIMUIKitState { : TIMUIKitInputTextField( model: model, controller: textFieldController, + customEmojiStickerList: + widget.customEmojiStickerList, + isUseDefaultEmoji: + widget.config!.isUseDefaultEmoji, customStickerPanel: widget.customStickerPanel, morePanelConfig: widget.morePanelConfig, diff --git a/lib/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart b/lib/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart index 3515e27..be2bef1 100644 --- a/lib/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart +++ b/lib/ui/views/TIMUIKitChat/tim_uikit_chat_config.dart @@ -1,5 +1,5 @@ -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; enum GroupReceptAllowType { work, public, meeting } @@ -90,6 +90,9 @@ class TIMUIKitChatConfig { /// The notification sound in Android devices. final String notificationAndroidSound; + ///Used to set the line height of text messages + final double textHight; + /// The body content shows in push notification. /// Returning `null` means using default body in this case. final String? Function( @@ -132,37 +135,46 @@ class TIMUIKitChatConfig { /// The default action is opening the link with the default browser of system. final void Function(String url)? onTapLink; - const TIMUIKitChatConfig({ - this.onTapLink, - this.timeDividerConfig, - this.faceURIPrefix, - this.faceURISuffix, - this.isAtWhenReply = true, - this.notificationAndroidSound = "", - this.isSupportMarkdownForTextMessage = false, - this.notificationExt, - this.isUseMessageReaction = true, - this.isShowSelfNameInGroup = false, - @Deprecated("Please use [isShowGroupReadingStatus] instead") - this.isShowGroupMessageReadReceipt = true, - this.upperRecallTime = 120, - this.isShowOthersNameInGroup = true, - this.urlPreviewType = UrlPreviewType.onlyHyperlink, - this.notificationBody, - this.notificationOPPOChannelID = "", - this.notificationTitle = "", - this.notificationIOSSound = "", - this.isAllowSoundMessage = true, - @Deprecated("Please use [groupReadReceiptPermissionList] instead") - this.groupReadReceiptPermisionList, - this.groupReadReceiptPermissionList, - this.isAllowEmojiPanel = true, - this.isAllowShowMorePanel = true, - this.isShowReadingStatus = true, - this.isAllowLongPressMessage = true, - this.isAllowClickAvatar = true, - this.isShowGroupReadingStatus = true, - this.isReportGroupReadingStatus = true, - this.showC2cMessageEditStaus = true, - }); + /// Whether to use the default emoji + final bool isUseDefaultEmoji; + + /// Is show avatar on history message list. + /// [Default]: true. + final bool isShowAvatar; + + const TIMUIKitChatConfig( + {this.onTapLink, + this.timeDividerConfig, + this.faceURIPrefix, + this.faceURISuffix, + this.textHight = 1.0, + this.isAtWhenReply = true, + this.notificationAndroidSound = "", + this.isSupportMarkdownForTextMessage = false, + this.notificationExt, + this.isUseMessageReaction = true, + this.isShowAvatar = true, + this.isShowSelfNameInGroup = false, + @Deprecated("Please use [isShowGroupReadingStatus] instead") + this.isShowGroupMessageReadReceipt = true, + this.upperRecallTime = 120, + this.isShowOthersNameInGroup = true, + this.urlPreviewType = UrlPreviewType.onlyHyperlink, + this.notificationBody, + this.notificationOPPOChannelID = "", + this.notificationTitle = "", + this.notificationIOSSound = "", + this.isAllowSoundMessage = true, + @Deprecated("Please use [groupReadReceiptPermissionList] instead") + this.groupReadReceiptPermisionList, + this.groupReadReceiptPermissionList, + this.isAllowEmojiPanel = true, + this.isAllowShowMorePanel = true, + this.isShowReadingStatus = true, + this.isAllowLongPressMessage = true, + this.isAllowClickAvatar = true, + this.isShowGroupReadingStatus = true, + this.isReportGroupReadingStatus = true, + this.showC2cMessageEditStaus = true, + this.isUseDefaultEmoji = false}); } diff --git a/lib/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart b/lib/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart index 78c757f..f477653 100644 --- a/lib/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart +++ b/lib/ui/views/TIMUIKitChat/tim_uikit_multi_select_panel.dart @@ -1,15 +1,15 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/forward_message_screen.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/forward_message_screen.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class MultiSelectPanel extends TIMUIKitStatelessWidget { final ConvType conversationType; @@ -50,7 +50,7 @@ class MultiSelectPanel extends TIMUIKitStatelessWidget { children: [ IconButton( icon: Image.asset('images/forward.png', - package: 'tim_ui_kit', color: Colors.white), + package: 'tencent_cloud_chat_uikit', color: Colors.white), iconSize: 40, onPressed: () { _handleForwardMessage(context, false, model); @@ -64,7 +64,7 @@ class MultiSelectPanel extends TIMUIKitStatelessWidget { children: [ IconButton( icon: Image.asset('images/merge_forward.png', - package: 'tim_ui_kit', color: Colors.white), + package: 'tencent_cloud_chat_uikit', color: Colors.white), iconSize: 40, onPressed: () { _handleForwardMessage(context, true, model); @@ -80,7 +80,7 @@ class MultiSelectPanel extends TIMUIKitStatelessWidget { children: [ IconButton( icon: Image.asset('images/delete.png', - package: 'tim_ui_kit', color: Colors.white), + package: 'tencent_cloud_chat_uikit', color: Colors.white), iconSize: 40, onPressed: () { showCupertinoModalPopup( diff --git a/lib/ui/views/TIMUIKitContact/tim_uikit_contact.dart b/lib/ui/views/TIMUIKitContact/tim_uikit_contact.dart index 68ec23c..2e1651e 100644 --- a/lib/ui/views/TIMUIKitContact/tim_uikit_contact.dart +++ b/lib/ui/views/TIMUIKitContact/tim_uikit_contact.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/friend_list_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/friend_list_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; -export 'package:tim_ui_kit/ui/widgets/contact_list.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +export 'package:tencent_cloud_chat_uikit/ui/widgets/contact_list.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitContact extends StatefulWidget { /// the callback after clicking contact item diff --git a/lib/ui/views/TIMUIKitConversation/tim_ui_kit_conversation_total_unread.dart b/lib/ui/views/TIMUIKitConversation/tim_ui_kit_conversation_total_unread.dart index 728198e..7b3abe2 100644 --- a/lib/ui/views/TIMUIKitConversation/tim_ui_kit_conversation_total_unread.dart +++ b/lib/ui/views/TIMUIKitConversation/tim_ui_kit_conversation_total_unread.dart @@ -2,11 +2,11 @@ import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_conversation_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/widgets/unread_message.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/unread_message.dart'; typedef unreadCountBuilder = Widget Function(int unreadCount); diff --git a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart index 80bd036..5289642 100644 --- a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation.dart @@ -2,19 +2,19 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:flutter_slidable_for_tencent_im/flutter_slidable.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/conversation_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_conversation_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/controller/tim_uikit_conversation_controller.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitConversation/tim_uikit_conversation_item.dart'; -import 'package:tim_ui_kit/ui/widgets/customize_ball_pulse_header.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/conversation_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_conversation_controller.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitConversation/tim_uikit_conversation_item.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/customize_ball_pulse_header.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; typedef ConversationItemBuilder = Widget Function( diff --git a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_draft_text.dart b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_draft_text.dart index eb5b713..a592757 100644 --- a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_draft_text.dart +++ b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_draft_text.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.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_cloud_chat_uikit/ui/utils/tui_theme.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class TIMUIKitDraftText extends TIMUIKitStatelessWidget { diff --git a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_item.dart b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_item.dart index ebdd319..c94a3a7 100644 --- a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_item.dart +++ b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_item.dart @@ -2,15 +2,15 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/time_ago.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitConversation/tim_uikit_conversation_draft_text.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/ui/widgets/unread_message.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/time_ago.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitConversation/tim_uikit_conversation_draft_text.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/unread_message.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; typedef LastMessageBuilder = Widget Function( V2TimMessage? lastMsg, List groupAtInfoList); diff --git a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart index 9ec23f1..31b0822 100644 --- a/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart +++ b/lib/ui/views/TIMUIKitConversation/tim_uikit_conversation_last_msg.dart @@ -4,13 +4,13 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_custom_elem.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class TIMUIKitLastMsg extends TIMUIKitStatelessWidget { @@ -36,42 +36,29 @@ class TIMUIKitLastMsg extends TIMUIKitStatelessWidget { return _getLastMsgShowText(lastMsg, context); } - static LinkMessage? getLinkMessage(V2TimCustomElem? customElem) { - try { - if (customElem?.data != null) { - final customMessage = jsonDecode(customElem!.data!); - return LinkMessage.fromJSON(customMessage); - } - return null; - } catch (err) { - return null; - } - } - static String handleCustomMessage(V2TimMessage message) { final customElem = message.customElem; - final callingMessage = TIMUIKitCustomElem.getCallMessage(customElem); - final linkMessage = getLinkMessage(customElem); + final callingMessage = CallingMessage.getCallMessage(customElem); String customLastMsgShow = TIM_t("[自定义]"); if (customElem?.data == "group_create") { customLastMsgShow = TIM_t("群聊创建成功!"); } if (callingMessage != null) { // 如果是结束消息 - final isCallEnd = TIMUIKitCustomElem.isCallEndExist(callingMessage); + final isCallEnd = CallingMessage.isCallEndExist(callingMessage); final isVoiceCall = callingMessage.callType == 1; String? callTime = ""; if (isCallEnd) { - callTime = TIMUIKitCustomElem.getShowTime(callingMessage.callEnd!); + callTime = CallingMessage.getShowTime(callingMessage.callEnd!); } final option3 = callTime; customLastMsgShow = isCallEnd ? TIM_t_para("通话时间:{{option3}}", "通话时间:$option3")(option3: option3) - : TIMUIKitCustomElem.getActionType(callingMessage.actionType!); + : CallingMessage.getActionType(callingMessage.actionType!); final option1 = customLastMsgShow; final option2 = customLastMsgShow; @@ -80,8 +67,6 @@ class TIMUIKitLastMsg extends TIMUIKitStatelessWidget { option1: option1) : TIM_t_para("[视频通话]:{{option2}}", "[视频通话]:$option2")( option2: option2); - } else if (linkMessage != null && linkMessage.text != null) { - customLastMsgShow = linkMessage.text!; } return customLastMsgShow; } diff --git a/lib/ui/views/TIMUIKitGroup/tim_uikit_group.dart b/lib/ui/views/TIMUIKitGroup/tim_uikit_group.dart index 5cf7546..8c77129 100644 --- a/lib/ui/views/TIMUIKitGroup/tim_uikit_group.dart +++ b/lib/ui/views/TIMUIKitGroup/tim_uikit_group.dart @@ -3,15 +3,15 @@ import 'package:flutter/material.dart'; import 'package:lpinyin/lpinyin.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/listener_model/tui_group_listener_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/ui/widgets/az_list_view.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/az_list_view.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; typedef GroupItemBuilder = Widget Function( BuildContext context, V2TimGroupInfo groupInfo); diff --git a/lib/ui/views/TIMUIKitGroup/tim_uikit_group_application_list.dart b/lib/ui/views/TIMUIKitGroup/tim_uikit_group_application_list.dart index cf34eb7..e39fef8 100644 --- a/lib/ui/views/TIMUIKitGroup/tim_uikit_group_application_list.dart +++ b/lib/ui/views/TIMUIKitGroup/tim_uikit_group_application_list.dart @@ -1,16 +1,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/group/group_services.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; typedef GroupApplicationItemBuilder = Widget Function( diff --git a/lib/ui/views/TIMUIKitGroup/tim_uikit_group_application_list_item.dart b/lib/ui/views/TIMUIKitGroup/tim_uikit_group_application_list_item.dart index a1f7037..f1723d3 100644 --- a/lib/ui/views/TIMUIKitGroup/tim_uikit_group_application_list_item.dart +++ b/lib/ui/views/TIMUIKitGroup/tim_uikit_group_application_list_item.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; enum ApplicationStatus { none, diff --git a/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_add_group_member.dart b/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_add_group_member.dart index 5197a10..ec3efb9 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_add_group_member.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_add_group_member.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/contact_list.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/contact_list.dart'; class AddGroupMemberPage extends StatefulWidget { final TUIGroupProfileModel model; diff --git a/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_delete_group_member.dart b/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_delete_group_member.dart index 82b5893..558751b 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_delete_group_member.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_delete_group_member.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/group_member_list.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/group_member_list.dart'; class DeleteGroupMemberPage extends StatefulWidget { final TUIGroupProfileModel model; diff --git a/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_group_member_list.dart b/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_group_member_list.dart index 7d7abf6..49eebf0 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_group_member_list.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/group_member/tui_group_member_list.dart @@ -3,14 +3,14 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart'; -import 'package:tim_ui_kit/ui/widgets/group_member_list.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/group_member_list.dart'; class GroupProfileMemberListPage extends StatefulWidget { List memberList; diff --git a/lib/ui/views/TIMUIKitGroupProfile/shared_data_widget.dart b/lib/ui/views/TIMUIKitGroupProfile/shared_data_widget.dart index 7f1ddd7..bc195ad 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/shared_data_widget.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/shared_data_widget.dart @@ -1,5 +1,5 @@ import 'package:flutter/cupertino.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; class SharedDataWidget extends InheritedWidget { final TUIGroupProfileModel model; diff --git a/lib/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart b/lib/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart index f50ea18..ce286e1 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart @@ -1,19 +1,19 @@ import 'package:flutter/material.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/group_profile_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/listener_model/tui_group_listener_model.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/group_profile_widget.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_profile_widget.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_manage.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_notification.dart'; -export 'package:tim_ui_kit/ui/widgets/transimit_group_owner_select.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/group_profile_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/group_profile_widget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_profile_widget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_manage.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_notification.dart'; +export 'package:tencent_cloud_chat_uikit/ui/widgets/transimit_group_owner_select.dart'; typedef GroupProfileBuilder = Widget Function(BuildContext context, V2TimGroupInfo groupInfo, List groupMemberList); diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart index 180893e..d8d5c34 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/optimize_utils.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class GroupMemberSearchTextField extends TIMUIKitStatelessWidget { diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_profile_widget.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_profile_widget.dart index cc01b63..610a1bb 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_profile_widget.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_profile_widget.dart @@ -1,16 +1,16 @@ import 'package:flutter/cupertino.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_search_msg.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_add_opt.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_detail_card.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_manage.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_member_tile.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_message_disturb.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_name_card.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_notification.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_pin_conversation.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_type.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_search_msg.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_add_opt.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_detail_card.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_manage.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_member_tile.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_message_disturb.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_name_card.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_notification.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_pin_conversation.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_type.dart'; class TIMUIKitGroupProfileWidget { static Widget detailCard( diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_search_msg.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_search_msg.dart index a09fc60..55e9eab 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_search_msg.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_search_msg.dart @@ -2,18 +2,18 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search.dart'; -import 'package:tim_ui_kit/data_services/conversation/conversation_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/shared_data_widget.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/shared_data_widget.dart'; class GroupProfileGroupSearch extends TIMUIKitStatelessWidget { GroupProfileGroupSearch({Key? key, required this.onJumpToSearch}) diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_add_opt.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_add_opt.dart index 564f2d5..26b4b58 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_add_opt.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_add_opt.dart @@ -2,12 +2,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class GroupProfileAddOpt extends TIMUIKitStatelessWidget { GroupProfileAddOpt({Key? key}) : super(key: key); diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart index dc7e18c..8e28906 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_button_area.dart @@ -1,12 +1,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/controller/tim_uikit_chat_controller.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_chat_controller.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; class GroupProfileButtonArea extends TIMUIKitStatelessWidget { final String groupID; diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_detail_card.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_detail_card.dart index 2ab9297..95d9727 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_detail_card.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_detail_card.dart @@ -1,13 +1,13 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class GroupProfileDetailCard extends TIMUIKitStatelessWidget { final V2TimGroupInfo groupInfo; @@ -143,6 +143,9 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget { color: Colors.white, padding: const EdgeInsets.only(top: 12, bottom: 12, left: 16), child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( width: 48, @@ -156,33 +159,27 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget { Expanded( child: Container( margin: const EdgeInsets.only(left: 16), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - showName, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w600), - ), - const SizedBox( - height: 8, - ), - Text("ID: $groupID", - style: TextStyle( - fontSize: 13, color: theme.weakTextColor)) - ], + Text( + showName, + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.w600), ), - Icon( - Icons.keyboard_arrow_right, - color: theme.weakTextColor, - ) + const SizedBox( + height: 8, + ), + Text("ID: $groupID", + style: TextStyle( + fontSize: 13, color: theme.weakTextColor)) ], ), ), + ), + Icon( + Icons.keyboard_arrow_right, + color: theme.weakTextColor, ) ], ), diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_manage.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_manage.dart index b4fdcf4..e78fb0c 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_manage.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_manage.dart @@ -3,17 +3,17 @@ import 'package:flutter/material.dart'; import 'package:flutter_slidable_for_tencent_im/flutter_slidable.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/ui/widgets/radio_button.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/radio_button.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class GroupProfileGroupManage extends TIMUIKitStatelessWidget { final TUIGroupProfileModel model; @@ -112,7 +112,7 @@ class _GroupProfileGroupManagePageState constraints: const BoxConstraints(), icon: Image.asset( 'images/arrow_back.png', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: 34, width: 34, ), diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_member_tile.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_member_tile.dart index 5c60af5..2f348ef 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_member_tile.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_member_tile.dart @@ -3,16 +3,16 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/group_member/tui_add_group_member.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/group_member/tui_delete_group_member.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/group_member/tui_group_member_list.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/group_member/tui_add_group_member.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/group_member/tui_delete_group_member.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/group_member/tui_group_member_list.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class GroupMemberTile extends TIMUIKitStatelessWidget { diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_message_disturb.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_message_disturb.dart index b11ec40..41361f1 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_message_disturb.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_message_disturb.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class GroupMessageDisturb extends TIMUIKitStatelessWidget { GroupMessageDisturb({Key? key}) : super(key: key); diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_name_card.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_name_card.dart index 5aa4e68..7ef15f4 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_name_card.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_name_card.dart @@ -2,13 +2,13 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class GroupProfileNameCard extends TIMUIKitStatelessWidget { GroupProfileNameCard({Key? key}) : super(key: key); diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_notification.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_notification.dart index fb273ab..32638c6 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_notification.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_notification.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class GroupProfileNotification extends TIMUIKitStatelessWidget { GroupProfileNotification({Key? key}) : super(key: key); diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_pin_conversation.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_pin_conversation.dart index 58b76dc..e3605d9 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_pin_conversation.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_pin_conversation.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class GroupPinConversation extends TIMUIKitStatelessWidget { diff --git a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_type.dart b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_type.dart index 1a459a8..da741c6 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_type.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_type.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; class GroupProfileType extends TIMUIKitStatelessWidget { diff --git a/lib/ui/views/TIMUIKitNewContact/tim_uikit_new_contact.dart b/lib/ui/views/TIMUIKitNewContact/tim_uikit_new_contact.dart index 3573a29..0ab7c8b 100644 --- a/lib/ui/views/TIMUIKitNewContact/tim_uikit_new_contact.dart +++ b/lib/ui/views/TIMUIKitNewContact/tim_uikit_new_contact.dart @@ -1,15 +1,15 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/new_contact_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/new_contact_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; typedef NewContactItemBuilder = Widget Function( BuildContext context, V2TimFriendApplication applicationInfo); diff --git a/lib/ui/views/TIMUIKitNewContact/tim_uikit_unread_count.dart b/lib/ui/views/TIMUIKitNewContact/tim_uikit_unread_count.dart index 5d9a2be..177bbea 100644 --- a/lib/ui/views/TIMUIKitNewContact/tim_uikit_unread_count.dart +++ b/lib/ui/views/TIMUIKitNewContact/tim_uikit_unread_count.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/widgets/unread_message.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/unread_message.dart'; class TIMUIKitUnreadCount extends StatefulWidget { final double width; diff --git a/lib/ui/views/TIMUIKitProfile/tim_uikit_profile.dart b/lib/ui/views/TIMUIKitProfile/tim_uikit_profile.dart index 55f6e3c..6bf6e98 100644 --- a/lib/ui/views/TIMUIKitProfile/tim_uikit_profile.dart +++ b/lib/ui/views/TIMUIKitProfile/tim_uikit_profile.dart @@ -1,16 +1,16 @@ import 'package:flutter/material.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/life_cycle/profile_life_cycle.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_profile_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/profile_life_cycle.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_profile_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitProfile/profile_widget.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/profile_widget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart'; typedef OnSelfAvatarTap = void Function(); diff --git a/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart b/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart index b68a972..efbe0f7 100644 --- a/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart +++ b/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_operation_item.dart @@ -1,8 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitOperationItem extends TIMUIKitStatelessWidget { final String operationName; diff --git a/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_userinfo_card.dart b/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_userinfo_card.dart index 2e38d4a..59d3515 100644 --- a/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_userinfo_card.dart +++ b/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_userinfo_card.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; class TIMUIKitProfileUserInfoCard extends TIMUIKitStatelessWidget { /// User info diff --git a/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart b/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart index 9eb713d..7db6fb1 100644 --- a/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart +++ b/lib/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_widget.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_class.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; class TIMUIKitProfileWidget extends TIMUIKitClass { static Widget operationDivider() { diff --git a/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart b/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart index 2ce82e5..350a8bb 100644 --- a/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart +++ b/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; class TIMUIKitSearchFolder extends TIMUIKitStatelessWidget { final String folderName; diff --git a/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_input.dart b/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_input.dart index 2c88c0b..c93477a 100644 --- a/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_input.dart +++ b/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_input.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; class TIMUIKitSearchInput extends StatefulWidget { final ValueChanged onChange; @@ -13,6 +13,7 @@ class TIMUIKitSearchInput extends StatefulWidget { final TextEditingController? controller; final Widget? prefixIcon; final Widget? prefixText; + final bool? isAutoFocus; const TIMUIKitSearchInput({ required this.onChange, @@ -20,6 +21,7 @@ class TIMUIKitSearchInput extends StatefulWidget { this.controller, Key? key, this.prefixIcon, + this.isAutoFocus = true, this.prefixText, }) : super(key: key); @@ -64,7 +66,7 @@ class TIMUIKitSearchInputState extends TIMUIKitState { child: SizedBox( height: 36, child: TextField( - autofocus: true, + autofocus: widget.isAutoFocus ?? true, onChanged: (value) async { final trimValue = value.trim(); final isEmpty = trimValue.isEmpty; diff --git a/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart b/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart index fa431e6..e05feb8 100644 --- a/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart +++ b/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitSearchItem extends TIMUIKitStatelessWidget { final String faceUrl; diff --git a/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart b/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart index cd925d4..3ad05af 100644 --- a/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart +++ b/lib/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart @@ -1,9 +1,9 @@ // ignore_for_file: file_names import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitSearchShowALl extends TIMUIKitStatelessWidget { final String textShow; diff --git a/lib/ui/views/TIMUIKitSearch/tim_uikit_search.dart b/lib/ui/views/TIMUIKitSearch/tim_uikit_search.dart index 146e59e..ec84c26 100644 --- a/lib/ui/views/TIMUIKitSearch/tim_uikit_search.dart +++ b/lib/ui/views/TIMUIKitSearch/tim_uikit_search.dart @@ -1,17 +1,17 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_search_view_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search_friend.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_input.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search_group.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search_msg.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search_not_support.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search_friend.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_input.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search_group.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search_msg.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search_not_support.dart'; class TIMUIKitSearch extends StatefulWidget { /// the callback after clicking the conversation item @@ -30,6 +30,8 @@ class TIMUIKitSearch extends StatefulWidget { final Function(V2TimConversation conversation, String initKeyword)? onEnterSearchInConversation; + final bool? isAutoFocus; + const TIMUIKitSearch( {required this.onTapConversation, Key? key, @@ -37,6 +39,7 @@ class TIMUIKitSearch extends StatefulWidget { this.conversation, @Deprecated("You are supposed to use [onEnterSearchInConversation], though the effects are the same.") this.onEnterConversation, + this.isAutoFocus = true, this.onEnterSearchInConversation}) : super(key: key); @@ -88,6 +91,7 @@ class TIMUIKitSearchState extends TIMUIKitState { children: [ TIMUIKitSearchInput( key: inputTextField, + isAutoFocus: widget.isAutoFocus, onChange: (String value) { model.searchByKey(value); }, diff --git a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_friend.dart b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_friend.dart index 33fc7df..85d314d 100644 --- a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_friend.dart +++ b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_friend.dart @@ -4,15 +4,15 @@ import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_search_view_model.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitSearchFriend extends StatefulWidget { List friendResultList; diff --git a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_group.dart b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_group.dart index 505dd38..962e70e 100644 --- a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_group.dart +++ b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_group.dart @@ -4,15 +4,15 @@ import 'dart:math'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_search_view_model.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitSearchGroup extends StatefulWidget { List groupList; diff --git a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_msg.dart b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_msg.dart index 2575483..2d4ae79 100644 --- a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_msg.dart +++ b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_msg.dart @@ -2,16 +2,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_search_view_model.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search_msg_detail.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search_msg_detail.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class TIMUIKitSearchMsg extends TIMUIKitStatelessWidget { List msgList; diff --git a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_msg_detail.dart b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_msg_detail.dart index 64bbae6..38f0417 100644 --- a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_msg_detail.dart +++ b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_msg_detail.dart @@ -1,16 +1,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_input.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_search_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_input.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_showAll.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitSearch/tim_uikit_search_not_support.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/tim_uikit_search_not_support.dart'; class TIMUIKitSearchMsgDetail extends StatefulWidget { /// Conversation need search @@ -22,8 +22,11 @@ class TIMUIKitSearchMsgDetail extends StatefulWidget { /// the callback after clicking each conversation message item final Function(V2TimConversation, V2TimMessage?) onTapConversation; + final bool? isAutoFocus; + const TIMUIKitSearchMsgDetail( {Key? key, + this.isAutoFocus = true, required this.currentConversation, required this.keyword, required this.onTapConversation}) @@ -162,6 +165,7 @@ class TIMUIKitSearchMsgDetailState body: Column( children: [ TIMUIKitSearchInput( + isAutoFocus: widget.isAutoFocus, onChange: (String value) { updateMsgResult(value, true); }, diff --git a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_not_support.dart b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_not_support.dart index 9326f1a..bb703f3 100644 --- a/lib/ui/views/TIMUIKitSearch/tim_uikit_search_not_support.dart +++ b/lib/ui/views/TIMUIKitSearch/tim_uikit_search_not_support.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; class TIMUIKitSearchNotSupport extends TIMUIKitStatelessWidget { TIMUIKitSearchNotSupport({Key? key}) : super(key: key); @@ -49,7 +49,7 @@ class TIMUIKitSearchNotSupport extends TIMUIKitStatelessWidget { bottom: 0, child: Image.asset( "images/logo_bottom.png", - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', fit: BoxFit.fitWidth, width: MediaQuery.of(context).size.width, ), diff --git a/lib/ui/widgets/avatar.dart b/lib/ui/widgets/avatar.dart index 413fe88..07da086 100644 --- a/lib/ui/widgets/avatar.dart +++ b/lib/ui/widgets/avatar.dart @@ -1,12 +1,12 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class Avatar extends TIMUIKitStatelessWidget { final String faceUrl; @@ -30,10 +30,10 @@ class Avatar extends TIMUIKitStatelessWidget { Widget defaultAvatar() { if (type == 1) { return Image.asset('images/default_c2c_head.png', - package: 'tim_ui_kit'); + package: 'tencent_cloud_chat_uikit'); } else { return Image.asset('images/default_group_head.png', - package: 'tim_ui_kit'); + package: 'tencent_cloud_chat_uikit'); } } diff --git a/lib/ui/widgets/az_list_view.dart b/lib/ui/widgets/az_list_view.dart index 9f86fbc..48e7301 100644 --- a/lib/ui/widgets/az_list_view.dart +++ b/lib/ui/widgets/az_list_view.dart @@ -1,10 +1,10 @@ import 'package:azlistview/azlistview.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class AZListViewContainer extends StatefulWidget { final List? memberList; diff --git a/lib/ui/widgets/center_loading.dart b/lib/ui/widgets/center_loading.dart index 5a0ae00..aac3080 100644 --- a/lib/ui/widgets/center_loading.dart +++ b/lib/ui/widgets/center_loading.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class CenterLoading extends TIMUIKitStatelessWidget { CenterLoading({Key? key, this.messageID}) : super(key: key); @@ -21,7 +21,7 @@ class CenterLoading extends TIMUIKitStatelessWidget { builder: (context, w) { final progress = Provider.of(context) .getMessageProgress(messageID); - return progress == 0 + return (progress == 0 || progress == 100) ? Container() : Center( child: CircularProgressIndicator( diff --git a/lib/ui/widgets/center_play_button.dart b/lib/ui/widgets/center_play_button.dart index 87ccaa9..ffe7fa2 100644 --- a/lib/ui/widgets/center_play_button.dart +++ b/lib/ui/widgets/center_play_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.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'; class CenterPlayButton extends TIMUIKitStatelessWidget { CenterPlayButton({ @@ -27,7 +27,7 @@ class CenterPlayButton extends TIMUIKitStatelessWidget { child: GestureDetector( child: IconButton( iconSize: 86, - icon: Image.asset('images/play.png', package: 'tim_ui_kit'), + icon: Image.asset('images/play.png', package: 'tencent_cloud_chat_uikit'), onPressed: onPressed, ), ), diff --git a/lib/ui/widgets/contact_list.dart b/lib/ui/widgets/contact_list.dart index 586710d..7f2453c 100644 --- a/lib/ui/widgets/contact_list.dart +++ b/lib/ui/widgets/contact_list.dart @@ -2,15 +2,15 @@ import 'package:azlistview/azlistview.dart'; import 'package:flutter/material.dart'; import 'package:lpinyin/lpinyin.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_friendship_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/ui/widgets/az_list_view.dart'; -import 'package:tim_ui_kit/ui/widgets/radio_button.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/az_list_view.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/radio_button.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class ContactList extends StatefulWidget { final List contactList; diff --git a/lib/ui/widgets/customize_ball_pulse_header.dart b/lib/ui/widgets/customize_ball_pulse_header.dart index 7f51e85..20f04c9 100644 --- a/lib/ui/widgets/customize_ball_pulse_header.dart +++ b/lib/ui/widgets/customize_ball_pulse_header.dart @@ -4,8 +4,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; /// 球脉冲Header class CustomizeBallPulseHeader extends Header { diff --git a/lib/ui/widgets/extended_wrap/extended_wrap.dart b/lib/ui/widgets/extended_wrap/extended_wrap.dart index 8049c79..4f6cfda 100644 --- a/lib/ui/widgets/extended_wrap/extended_wrap.dart +++ b/lib/ui/widgets/extended_wrap/extended_wrap.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; -import 'package:tim_ui_kit/ui/widgets/extended_wrap/extended_render_wrap.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/extended_wrap/extended_render_wrap.dart'; class ExtendedWrap extends MultiChildRenderObjectWidget { /// Creates a wrap layout. diff --git a/lib/ui/widgets/forward_message_screen.dart b/lib/ui/widgets/forward_message_screen.dart index 553e35b..4706e63 100644 --- a/lib/ui/widgets/forward_message_screen.dart +++ b/lib/ui/widgets/forward_message_screen.dart @@ -1,15 +1,15 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_chat_global_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_self_info_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/widgets/recent_conversation_list.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/recent_conversation_list.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class ForwardMessageScreen extends StatefulWidget { final bool isMergerForward; diff --git a/lib/ui/widgets/group_member_list.dart b/lib/ui/widgets/group_member_list.dart index e1ac749..fa843a6 100644 --- a/lib/ui/widgets/group_member_list.dart +++ b/lib/ui/widgets/group_member_list.dart @@ -6,16 +6,16 @@ import 'package:flutter_slidable_for_tencent_im/flutter_slidable.dart'; import 'package:lpinyin/lpinyin.dart'; import 'package:provider/provider.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/optimize_utils.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/ui/widgets/az_list_view.dart'; -import 'package:tim_ui_kit/ui/widgets/radio_button.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/az_list_view.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/radio_button.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class GroupProfileMemberList extends StatefulWidget { final List memberList; diff --git a/lib/ui/widgets/image_hero.dart b/lib/ui/widgets/image_hero.dart index e011864..3fe7ed6 100644 --- a/lib/ui/widgets/image_hero.dart +++ b/lib/ui/widgets/image_hero.dart @@ -1,7 +1,7 @@ import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; /// make hero better when slide out class HeroWidget extends StatefulWidget { diff --git a/lib/ui/widgets/image_screen.dart b/lib/ui/widgets/image_screen.dart index 51a2a70..b593dc7 100644 --- a/lib/ui/widgets/image_screen.dart +++ b/lib/ui/widgets/image_screen.dart @@ -3,11 +3,11 @@ import 'dart:math'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/ui/widgets/center_loading.dart'; -import 'package:tim_ui_kit/ui/widgets/gestured_image.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; -import 'package:tim_ui_kit/ui/widgets/image_hero.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/center_loading.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/gestured_image.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/image_hero.dart'; typedef DoubleClickAnimationListener = void Function(); @@ -245,7 +245,7 @@ class _ImageScreenState extends TIMUIKitState child: IconButton( icon: Image.asset( 'images/close.png', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', ), iconSize: 30, onPressed: close, @@ -256,7 +256,7 @@ class _ImageScreenState extends TIMUIKitState child: IconButton( icon: Image.asset( 'images/download.png', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', ), iconSize: 30, onPressed: widget.downloadFn, diff --git a/lib/ui/widgets/link_preview/common/utils.dart b/lib/ui/widgets/link_preview/common/utils.dart index c867321..e15a15a 100644 --- a/lib/ui/widgets/link_preview/common/utils.dart +++ b/lib/ui/widgets/link_preview/common/utils.dart @@ -2,9 +2,9 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:link_preview_generator/link_preview_generator.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/common/extensions.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/link_preview_entry.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/models/link_preview_content.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/common/extensions.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/link_preview_entry.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/models/link_preview_content.dart'; import 'package:url_launcher/url_launcher.dart'; class LinkUtils { @@ -27,6 +27,7 @@ class LinkUtils { /// Launch URL static Future launchURL(BuildContext context, String url) async { + print(url); try { await launchUrl( Uri.parse(url).withScheme, diff --git a/lib/ui/widgets/link_preview/link_preview_entry.dart b/lib/ui/widgets/link_preview/link_preview_entry.dart index 5347a3c..1dbe49c 100644 --- a/lib/ui/widgets/link_preview/link_preview_entry.dart +++ b/lib/ui/widgets/link_preview/link_preview_entry.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/common/utils.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/widgets/link_preview.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/widgets/link_text.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/common/utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/widgets/link_preview.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/widgets/link_text.dart'; import 'models/link_preview_content.dart'; @@ -10,7 +10,9 @@ class LinkPreviewEntry { /// get the text message with hyperlinks static LinkPreviewText? getHyperlinksText( V2TimMessage message, bool isMarkdown, - [Function(String)? onLinkTap]) { + [Function(String)? onLinkTap, + bool isUseDefaultEmoji = false, + List customEmojiStickerList = const []]) { final String? messageText = message.textElem!.text; if (messageText == null) { @@ -22,7 +24,11 @@ class LinkPreviewEntry { ? LinkTextMarkdown( messageText: messageText, style: style, onLinkTap: onLinkTap) : LinkText( - messageText: messageText, style: style, onLinkTap: onLinkTap); + messageText: messageText, + style: style, + onLinkTap: onLinkTap, + isUseDefaultEmoji: isUseDefaultEmoji, + customEmojiStickerList: customEmojiStickerList); }; } diff --git a/lib/ui/widgets/link_preview/widgets/link_preview.dart b/lib/ui/widgets/link_preview/widgets/link_preview.dart index 6894ed4..b4eba55 100644 --- a/lib/ui/widgets/link_preview/widgets/link_preview.dart +++ b/lib/ui/widgets/link_preview/widgets/link_preview.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/common/utils.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/models/link_preview_content.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/common/utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/models/link_preview_content.dart'; class LinkPreviewWidget extends TIMStatelessWidget { final LinkPreviewModel linkPreview; diff --git a/lib/ui/widgets/link_preview/widgets/link_text.dart b/lib/ui/widgets/link_preview/widgets/link_text.dart index d3cbf8a..bd8bd3a 100644 --- a/lib/ui/widgets/link_preview/widgets/link_text.dart +++ b/lib/ui/widgets/link_preview/widgets/link_text.dart @@ -1,8 +1,10 @@ +import 'package:tencent_extended_text/extended_text.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:tencent_im_base/base_widgets/tim_stateless_widget.dart'; -import 'package:tim_ui_kit/ui/widgets/link_preview/common/utils.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/special_text/DefaultSpecialTextSpanBuilder.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/link_preview/common/utils.dart'; class LinkTextMarkdown extends TIMStatelessWidget { /// Callback for when link is tapped @@ -53,12 +55,22 @@ class LinkText extends TIMStatelessWidget { /// text style for default words final TextStyle? style; + final bool isUseDefaultEmoji; + + final customEmojiStickerList; + const LinkText( - {Key? key, required this.messageText, this.onLinkTap, this.style}) + {Key? key, + required this.messageText, + this.onLinkTap, + this.style, + this.isUseDefaultEmoji = false, + this.customEmojiStickerList = const []}) : super(key: key); - List _getContentSpan(String text, BuildContext context) { + String _getContentSpan(String text, BuildContext context) { List _contentList = []; + String contentData = ''; Iterable matches = LinkUtils.urlReg.allMatches(text); @@ -69,14 +81,16 @@ class LinkText extends TIMStatelessWidget { index = match.end; } if (index < match.start) { - String a = text.substring(index + 1, match.start); + String a = text.substring(index, match.start); index = match.end; + contentData += a; _contentList.add( TextSpan(text: a), ); } if (LinkUtils.urlReg.hasMatch(c)) { + contentData += '\$' + c + '\$'; _contentList.add(TextSpan( text: c, style: TextStyle(color: LinkUtils.hexToColor("015fff")), @@ -90,6 +104,7 @@ class LinkText extends TIMStatelessWidget { } })); } else { + contentData += c; _contentList.add( TextSpan(text: c, style: style ?? const TextStyle(fontSize: 16.0)), ); @@ -97,19 +112,38 @@ class LinkText extends TIMStatelessWidget { } if (index < text.length) { String a = text.substring(index, text.length); + contentData += a; _contentList.add( TextSpan(text: a, style: style ?? const TextStyle(fontSize: 16.0)), ); } - return _contentList; + return contentData; } @override Widget timBuild(BuildContext context) { - return Text.rich( - TextSpan(children: [..._getContentSpan(messageText, context)]), - style: style ?? const TextStyle(fontSize: 16.0), - ); + return + // Text.rich( + // TextSpan(children: [..._getContentSpan(messageText, context)]), + // style: style ?? const TextStyle(fontSize: 16.0), + // ); + ExtendedText(_getContentSpan(messageText, context), softWrap: true, + onSpecialTextTap: (dynamic parameter) { + if (parameter.toString().startsWith('\$')) { + if (onLinkTap != null) { + onLinkTap!((parameter.toString()).replaceAll('\$', '')); + } else { + LinkUtils.launchURL( + context, (parameter.toString()).replaceAll('\$', '')); + } + } + }, + style: style ?? const TextStyle(fontSize: 16.0), + specialTextSpanBuilder: DefaultSpecialTextSpanBuilder( + isUseDefaultEmoji: isUseDefaultEmoji, + customEmojiStickerList: customEmojiStickerList, + showAtBackground: true, + )); } } diff --git a/lib/ui/widgets/loading.dart b/lib/ui/widgets/loading.dart index 602b9d7..b5eb3e7 100644 --- a/lib/ui/widgets/loading.dart +++ b/lib/ui/widgets/loading.dart @@ -41,7 +41,7 @@ class _LoadingState extends State with TickerProviderStateMixin { turns: Tween(begin: .0, end: .9).animate(_animationController), child: Image.asset( "images/message_sending.png", - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', height: widget.width, width: widget.height, ), diff --git a/lib/ui/widgets/merger_message_screen.dart b/lib/ui/widgets/merger_message_screen.dart index 11d8e1b..4593b64 100644 --- a/lib/ui/widgets/merger_message_screen.dart +++ b/lib/ui/widgets/merger_message_screen.dart @@ -1,35 +1,61 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_theme_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/main.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; -class MergerMessageScreen extends TIMUIKitStatelessWidget { - final List messageList; +class MergerMessageScreen extends StatefulWidget { final TUIChatSeparateViewModel model; + final String msgID; MergerMessageScreen( - {Key? key, required this.model, required this.messageList}) + {Key? key, required this.model, required this.msgID}) : super(key: key); + @override + State createState() => MergerMessageScreenState(); +} + +class MergerMessageScreenState extends TIMUIKitState { + final MessageService _messageService = serviceLocator(); + + List messageList = []; + + @override + initState() { + super.initState(); + initMessageList(); + } + + void initMessageList() async { + final mergerMessageList = await _messageService.downloadMergerMessage(msgID: widget.msgID); + setState(() { + messageList = mergerMessageList ?? []; + }); + } + bool isReplyMessage(V2TimMessage message) { final hasCustomData = message.cloudCustomData != null && message.cloudCustomData != ""; if (hasCustomData) { try { final CloudCustomData messageCloudCustomData = - CloudCustomData.fromJson(json.decode(message.cloudCustomData!)); + CloudCustomData.fromJson(json.decode(message.cloudCustomData!)); if (messageCloudCustomData.messageReply != null) { MessageRepliedData.fromJson(messageCloudCustomData.messageReply!); return true; @@ -51,7 +77,7 @@ class MergerMessageScreen extends TIMUIKitStatelessWidget { return Text(TIM_t("[自定义]")); case MessageElemType.V2TIM_ELEM_TYPE_SOUND: return TIMUIKitSoundElem( - chatModel: model, + chatModel: widget.model, isShowMessageReaction: false, message: message, soundElem: message.soundElem!, @@ -62,7 +88,7 @@ class MergerMessageScreen extends TIMUIKitStatelessWidget { if (isReplyMessage(message)) { return TIMUIKitReplyElem( isShowMessageReaction: false, - chatModel: model, + chatModel: widget.model, message: message, scrollToIndex: () {}, clearJump: () {}); @@ -73,17 +99,17 @@ class MergerMessageScreen extends TIMUIKitStatelessWidget { softWrap: true, style: const TextStyle(fontSize: 16), ); - // return Text(message.textElem!.text!); + // return Text(message.textElem!.text!); case MessageElemType.V2TIM_ELEM_TYPE_FACE: return TIMUIKitFaceElem( - model: model, + model: widget.model, isShowJump: false, isShowMessageReaction: false, path: message.faceElem?.data ?? "", message: message); case MessageElemType.V2TIM_ELEM_TYPE_FILE: return TIMUIKitFileElem( - chatModel: model, + chatModel: widget.model, isShowMessageReaction: false, message: message, messageID: message.msgID, @@ -92,7 +118,7 @@ class MergerMessageScreen extends TIMUIKitStatelessWidget { isShowJump: false); case MessageElemType.V2TIM_ELEM_TYPE_IMAGE: return TIMUIKitImageElem( - chatModel: model, + chatModel: widget.model, isShowMessageReaction: false, message: message, isFrom: "merger", @@ -100,12 +126,13 @@ class MergerMessageScreen extends TIMUIKitStatelessWidget { ); case MessageElemType.V2TIM_ELEM_TYPE_VIDEO: return TIMUIKitVideoElem(message, - chatModel: model, isFrom: "merger", isShowMessageReaction: false); + chatModel: widget.model, + isFrom: "merger", isShowMessageReaction: false); case MessageElemType.V2TIM_ELEM_TYPE_LOCATION: return Text(TIM_t("[位置]")); case MessageElemType.V2TIM_ELEM_TYPE_MERGER: return TIMUIKitMergerElem( - model: model, + model: widget.model, isShowJump: false, isShowMessageReaction: false, message: message, @@ -181,7 +208,21 @@ class MergerMessageScreen extends TIMUIKitStatelessWidget { iconTheme: const IconThemeData( color: Colors.white, )), - body: Padding( + body: messageList.isEmpty ? Row(children: [ + Expanded(child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + LoadingAnimationWidget.staggeredDotsWave( + color: theme.weakTextColor ?? Colors.grey, + size: 48, + ), + const SizedBox(height: 20), + Text(TIM_t("消息列表加载中")) + ], + )) + ],) : Padding( padding: const EdgeInsets.all(16), child: ListView.builder( shrinkWrap: true, diff --git a/lib/ui/widgets/message_read_receipt.dart b/lib/ui/widgets/message_read_receipt.dart index ee64eb2..ae074c8 100644 --- a/lib/ui/widgets/message_read_receipt.dart +++ b/lib/ui/widgets/message_read_receipt.dart @@ -2,22 +2,22 @@ import 'package:flutter/material.dart'; // ignore: unused_import import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_chat_separate_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/message.dart'; -import 'package:tim_ui_kit/ui/utils/time_ago.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_sound_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_video_elem.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/time_ago.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_face_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_file_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_image_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_sound_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_video_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class MessageReadReceipt extends StatefulWidget { final V2TimMessage messageItem; diff --git a/lib/ui/widgets/radio_button.dart b/lib/ui/widgets/radio_button.dart index 49e5e5d..c8c997d 100644 --- a/lib/ui/widgets/radio_button.dart +++ b/lib/ui/widgets/radio_button.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class CheckBoxButton extends TIMUIKitStatelessWidget { final bool isChecked; diff --git a/lib/ui/widgets/recent_conversation_list.dart b/lib/ui/widgets/recent_conversation_list.dart index b1a402f..03f69c9 100644 --- a/lib/ui/widgets/recent_conversation_list.dart +++ b/lib/ui/widgets/recent_conversation_list.dart @@ -1,15 +1,15 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/view_models/tui_conversation_view_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/ui/widgets/avatar.dart'; -import 'package:tim_ui_kit/ui/widgets/az_list_view.dart'; -import 'package:tim_ui_kit/ui/widgets/radio_button.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/az_list_view.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/radio_button.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class RecentForwardList extends StatefulWidget { final bool isMultiSelect; diff --git a/lib/ui/widgets/textSize.dart b/lib/ui/widgets/textSize.dart index 02e1afc..bea01da 100644 --- a/lib/ui/widgets/textSize.dart +++ b/lib/ui/widgets/textSize.dart @@ -15,8 +15,8 @@ class TextSize { } } -class ExtendText extends StatefulWidget { - const ExtendText( +class CustomText extends StatefulWidget { + const CustomText( this.text, { Key? key, required this.width, @@ -53,10 +53,10 @@ class ExtendText extends StatefulWidget { final TextHeightBehavior? textHeightBehavior; @override - State createState() => _ExtendTextState(); + State createState() => _ExtendTextState(); } -class _ExtendTextState extends State { +class _ExtendTextState extends State { String? text; countTextSize() { TextStyle style = widget.style ?? const TextStyle(fontSize: 14); diff --git a/lib/ui/widgets/text_input_bottom_sheet.dart b/lib/ui/widgets/text_input_bottom_sheet.dart index 237c5c9..44c575a 100644 --- a/lib/ui/widgets/text_input_bottom_sheet.dart +++ b/lib/ui/widgets/text_input_bottom_sheet.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:tencent_im_base/tencent_im_base.dart'; -import 'package:tim_ui_kit/data_services/core/core_services_implements.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; class TextInputBottomSheet { static showTextInputBottomSheet(BuildContext context, String title, diff --git a/lib/ui/widgets/transimit_group_owner_select.dart b/lib/ui/widgets/transimit_group_owner_select.dart index 9b8cd77..f31f59a 100644 --- a/lib/ui/widgets/transimit_group_owner_select.dart +++ b/lib/ui/widgets/transimit_group_owner_select.dart @@ -1,14 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/business_logic/separate_models/tui_group_profile_model.dart'; -import 'package:tim_ui_kit/data_services/services_locatar.dart'; -import 'package:tim_ui_kit/tim_ui_kit.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart'; -import 'package:tim_ui_kit/ui/widgets/group_member_list.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_group_profile_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_member_search.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/group_member_list.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class SelectTransimitOwner extends StatefulWidget { final String? groupID; diff --git a/lib/ui/widgets/unread_message.dart b/lib/ui/widgets/unread_message.dart index cd42108..97c00df 100644 --- a/lib/ui/widgets/unread_message.dart +++ b/lib/ui/widgets/unread_message.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/color.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/color.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class UnreadMessage extends TIMUIKitStatelessWidget { final int unreadCount; diff --git a/lib/ui/widgets/video_custom_control.dart b/lib/ui/widgets/video_custom_control.dart index ad460f5..0c815d5 100644 --- a/lib/ui/widgets/video_custom_control.dart +++ b/lib/ui/widgets/video_custom_control.dart @@ -7,12 +7,12 @@ import 'package:chewie/src/helpers/utils.dart'; import 'package:chewie/src/animated_play_pause.dart'; import 'package:chewie/src/material/material_progress_bar.dart'; import 'package:flutter/material.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_statelesswidget.dart'; -import 'package:tim_ui_kit/ui/utils/tui_theme.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/tui_theme.dart'; import 'package:video_player/video_player.dart'; import 'center_play_button.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class VideoCustomControls extends StatefulWidget { const VideoCustomControls({required this.downloadFn, Key? key}) @@ -131,7 +131,7 @@ class _VideoCustomControlsState extends TIMUIKitState IconButton( icon: Image.asset( 'images/close.png', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', ), iconSize: 30, onPressed: () { @@ -145,7 +145,7 @@ class _VideoCustomControlsState extends TIMUIKitState IconButton( icon: Image.asset( 'images/download.png', - package: 'tim_ui_kit', + package: 'tencent_cloud_chat_uikit', ), iconSize: 30, onPressed: widget.downloadFn, diff --git a/lib/ui/widgets/video_screen.dart b/lib/ui/widgets/video_screen.dart index 890c8ce..1cbd179 100644 --- a/lib/ui/widgets/video_screen.dart +++ b/lib/ui/widgets/video_screen.dart @@ -12,22 +12,30 @@ import 'package:flutter/services.dart'; import 'package:image_gallery_saver/image_gallery_saver.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; +import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:universal_html/html.dart' as html; import 'package:chewie/chewie.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_state.dart'; -import 'package:tim_ui_kit/ui/utils/permission.dart'; -import 'package:tim_ui_kit/ui/utils/platform.dart'; -import 'package:tim_ui_kit/ui/widgets/video_custom_control.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/permission.dart'; +import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; +import 'package:tencent_cloud_chat_uikit/ui/widgets/video_custom_control.dart'; import 'package:video_player/video_player.dart'; -import 'package:tim_ui_kit/base_widgets/tim_ui_kit_base.dart'; +import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; class VideoScreen extends StatefulWidget { - const VideoScreen({required this.message, required this.heroTag, Key? key}) + const VideoScreen( + {required this.message, + required this.heroTag, + required this.videoElement, + Key? key}) : super(key: key); final V2TimMessage message; final dynamic heroTag; + final V2TimVideoElem videoElement; @override State createState() => _VideoScreenState(); @@ -38,6 +46,8 @@ class _VideoScreenState extends TIMUIKitState { late ChewieController chewieController; GlobalKey slidePagekey = GlobalKey(); + final MessageService _messageService = serviceLocator(); + final TUIChatGlobalModel model = serviceLocator(); bool isInit = false; @override initState() { @@ -88,9 +98,57 @@ class _VideoScreenState extends TIMUIKitState { } String savePath = videoUrl; if (!isAsset) { - var appDocDir = await getTemporaryDirectory(); - savePath = appDocDir.path + "/temp.mp4"; - await Dio().download(videoUrl, savePath); + // var appDocDir = await getTemporaryDirectory(); + // savePath = appDocDir.path + "/temp.mp4"; + // await Dio().download(videoUrl, savePath); + + if (widget.message.msgID == null || widget.message.msgID!.isEmpty) { + return; + } + if (model.getMessageProgress(widget.message.msgID) == 100) { + String savePath; + if (widget.message.videoElem!.localVideoUrl != null && + widget.message.videoElem!.localVideoUrl != '') { + savePath = widget.message.videoElem!.localVideoUrl!; + } else { + savePath = model.getFileMessageLocation(widget.message.msgID); + } + File f = File(savePath); + if (f.existsSync()) { + var result = await ImageGallerySaver.saveFile(savePath); + if (PlatformUtils().isIOS) { + if (result['isSuccess']) { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("视频保存成功"), + infoCode: 6660402)); + } else { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("视频保存失败"), + infoCode: 6660403)); + } + } else { + if (result != null) { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("视频保存成功"), + infoCode: 6660402)); + } else { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("视频保存失败"), + infoCode: 6660403)); + } + } + } + } else { + onTIMCallback(TIMCallback( + type: TIMCallbackType.INFO, + infoRecommendText: TIM_t("the message is downloading"), + infoCode: -1)); + } + return; } var result = await ImageGallerySaver.saveFile(savePath); if (PlatformUtils().isIOS) { @@ -121,18 +179,35 @@ class _VideoScreenState extends TIMUIKitState { } void _saveVideo() { - if (widget.message.videoElem!.videoUrl == null) { - _saveNetworkVideo(context, widget.message.videoElem!.videoPath!, + if (PlatformUtils().isWeb) { + _saveNetworkVideo(context, widget.videoElement!.videoPath!, isAsset: true); - } else { - _saveNetworkVideo(context, widget.message.videoElem!.videoUrl!, - isAsset: false); + return; } + if (widget.videoElement!.videoPath != '' && + widget.videoElement!.videoPath != null) { + File f = File(widget.videoElement!.videoPath!); + if (f.existsSync()) { + _saveNetworkVideo(context, widget.videoElement!.videoPath!, + isAsset: true); + return; + } + } + if (widget.videoElement!.localVideoUrl != '' && + widget.videoElement!.localVideoUrl != null) { + File f = File(widget.videoElement!.localVideoUrl!); + if (f.existsSync()) { + _saveNetworkVideo(context, widget.videoElement!.localVideoUrl!, + isAsset: true); + return; + } + } + _saveNetworkVideo(context, widget.videoElement!.videoUrl!, isAsset: false); } double getVideoHeight() { - double height = widget.message.videoElem!.snapshotHeight!.toDouble(); - double width = widget.message.videoElem!.snapshotWidth!.toDouble(); + double height = widget.videoElement!.snapshotHeight!.toDouble(); + double width = widget.videoElement!.snapshotWidth!.toDouble(); // 横图 if (width > height) { return height * 1.3; @@ -141,8 +216,8 @@ class _VideoScreenState extends TIMUIKitState { } double getVideoWidth() { - double height = widget.message.videoElem!.snapshotHeight!.toDouble(); - double width = widget.message.videoElem!.snapshotWidth!.toDouble(); + double height = widget.videoElement!.snapshotHeight!.toDouble(); + double width = widget.videoElement!.snapshotWidth!.toDouble(); // 横图 if (width > height) { return width * 1.3; @@ -152,19 +227,65 @@ class _VideoScreenState extends TIMUIKitState { setVideoMessage() async { // Using local path while sending - VideoPlayerController player = widget.message.videoElem!.videoUrl == null || - widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING - ? VideoPlayerController.file(File( - widget.message.videoElem!.videoPath!, - )) - : (widget.message.videoElem?.localVideoUrl == null || - widget.message.videoElem?.localVideoUrl == "") + // VideoPlayerController player = widget.message.videoElem!.videoUrl == null || + // widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING + // ? VideoPlayerController.file(File( + // widget.message.videoElem!.videoPath!, + // )) + // : (widget.message.videoElem?.localVideoUrl == null || + // widget.message.videoElem?.localVideoUrl == "") + // ? VideoPlayerController.network( + // widget.message.videoElem!.videoUrl!, + // ) + // : VideoPlayerController.file(File( + // widget.message.videoElem!.localVideoUrl!, + // )); + if (!PlatformUtils().isWeb) { + if (widget.message.msgID != null || widget.message.msgID != '') { + if (model.getMessageProgress(widget.message.msgID) == 100) { + String savePath; + if (widget.message.videoElem!.localVideoUrl != null && + widget.message.videoElem!.localVideoUrl != '') { + savePath = widget.message.videoElem!.localVideoUrl!; + } else { + savePath = model.getFileMessageLocation(widget.message.msgID); + } + File f = File(savePath); + if (f.existsSync()) { + widget.videoElement!.localVideoUrl = + model.getFileMessageLocation(widget.message.msgID); + } + } + } + } + + VideoPlayerController player = PlatformUtils().isWeb + ? ((widget.videoElement!.videoPath != null && + widget.videoElement!.videoPath!.isNotEmpty) || + widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING ? VideoPlayerController.network( - widget.message.videoElem!.videoUrl!, + widget.videoElement!.videoPath!, ) - : VideoPlayerController.file(File( - widget.message.videoElem!.localVideoUrl!, - )); + : (widget.videoElement?.localVideoUrl == null || + widget.videoElement?.localVideoUrl == "") + ? VideoPlayerController.network( + widget.videoElement!.videoUrl!, + ) + : VideoPlayerController.network( + widget.videoElement!.localVideoUrl!, + )) + : (widget.videoElement!.videoPath != null && + widget.videoElement!.videoPath!.isNotEmpty) || + widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING + ? VideoPlayerController.file(File(widget.videoElement!.videoPath!)) + : (widget.videoElement?.localVideoUrl == null || + widget.videoElement?.localVideoUrl == "") + ? VideoPlayerController.network( + widget.videoElement!.videoUrl!, + ) + : VideoPlayerController.file(File( + widget.videoElement!.localVideoUrl!, + )); await player.initialize(); WidgetsBinding.instance?.addPostFrameCallback((_) { double w = getVideoWidth(); @@ -187,10 +308,8 @@ class _VideoScreenState extends TIMUIKitState { @override didUpdateWidget(oldWidget) { - if (oldWidget.message.videoElem!.videoUrl != - widget.message.videoElem!.videoUrl || - oldWidget.message.videoElem!.videoPath != - widget.message.videoElem!.videoPath) { + if (oldWidget.videoElement!.videoUrl != widget.videoElement!.videoUrl || + oldWidget.videoElement!.videoPath != widget.videoElement!.videoPath) { setVideoMessage(); } super.didUpdateWidget(oldWidget); diff --git a/pubspec.lock b/pubspec.lock index c42ab3a..3dfbbf1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: _fe_analyzer_shared url: "https://pub.dartlang.org" source: hosted - version: "49.0.0" + version: "50.0.0" adaptive_action_sheet: dependency: "direct main" description: @@ -21,7 +21,7 @@ packages: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "5.1.0" + version: "5.2.0" args: dependency: transitive description: @@ -56,7 +56,7 @@ packages: name: build_config url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.1.1" build_daemon: dependency: transitive description: @@ -70,21 +70,21 @@ packages: name: build_resolvers url: "https://pub.dartlang.org" source: hosted - version: "2.0.10" + version: "2.1.0" build_runner: dependency: "direct dev" description: name: build_runner url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "2.3.2" build_runner_core: dependency: transitive description: name: build_runner_core url: "https://pub.dartlang.org" source: hosted - version: "7.2.4" + version: "7.2.7" built_collection: dependency: transitive description: @@ -98,42 +98,42 @@ packages: name: built_value url: "https://pub.dartlang.org" source: hosted - version: "8.4.1" + version: "8.4.2" cached_network_image: dependency: "direct main" description: name: cached_network_image url: "https://pub.dartlang.org" source: hosted - version: "3.2.1" + version: "3.2.2" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "2.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" camera: dependency: transitive description: name: camera url: "https://pub.dartlang.org" source: hosted - version: "0.10.0+3" + version: "0.10.0+4" camera_android: dependency: transitive description: name: camera_android url: "https://pub.dartlang.org" source: hosted - version: "0.10.0+3" + version: "0.10.0+4" camera_avfoundation: dependency: transitive description: @@ -147,7 +147,7 @@ packages: name: camera_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.2.2" + version: "2.3.1" camera_web: dependency: transitive description: @@ -210,7 +210,7 @@ packages: name: convert url: "https://pub.dartlang.org" source: hosted - version: "3.0.2" + version: "3.1.1" cross_file: dependency: transitive description: @@ -273,21 +273,21 @@ packages: name: dotted_border url: "https://pub.dartlang.org" source: hosted - version: "2.0.0+2" + version: "2.0.0+3" extended_image: dependency: "direct main" description: name: extended_image url: "https://pub.dartlang.org" source: hosted - version: "6.2.1" + version: "6.3.2" extended_image_library: dependency: transitive description: name: extended_image_library url: "https://pub.dartlang.org" source: hosted - version: "3.3.0" + version: "3.4.1" fast_i18n: dependency: "direct dev" description: @@ -381,7 +381,7 @@ packages: name: flutter_markdown url: "https://pub.dartlang.org" source: hosted - version: "0.6.12" + version: "0.6.13" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -395,14 +395,14 @@ packages: name: flutter_plugin_record_plus url: "https://pub.dartlang.org" source: hosted - version: "0.0.11" + version: "0.0.15" flutter_screenutil: dependency: "direct main" description: name: flutter_screenutil url: "https://pub.dartlang.org" source: hosted - version: "5.5.4" + version: "5.6.0" flutter_slidable_for_tencent_im: dependency: "direct main" description: @@ -423,7 +423,7 @@ packages: name: flutter_svg url: "https://pub.dartlang.org" source: hosted - version: "1.1.5" + version: "1.1.6" flutter_web_plugins: dependency: transitive description: flutter @@ -435,14 +435,14 @@ packages: name: fluttertoast url: "https://pub.dartlang.org" source: hosted - version: "8.0.9" + version: "8.1.1" frontend_server_client: dependency: transitive description: name: frontend_server_client url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "3.1.0" get_it: dependency: "direct main" description: @@ -456,7 +456,7 @@ packages: name: glob url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" globbing: dependency: transitive description: @@ -470,14 +470,14 @@ packages: name: graphs url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.2.0" html: dependency: transitive description: name: html url: "https://pub.dartlang.org" source: hosted - version: "0.15.0" + version: "0.15.1" http: dependency: "direct main" description: @@ -505,7 +505,7 @@ packages: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "4.0.1" + version: "4.0.2" i18n: dependency: "direct main" description: @@ -667,13 +667,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" - open_file: - dependency: "direct main" - description: - name: open_file - url: "https://pub.dartlang.org" - source: hosted - version: "3.2.1" package_config: dependency: transitive description: @@ -757,7 +750,7 @@ packages: name: path_provider_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.20" + version: "2.0.22" path_provider_ios: dependency: transitive description: @@ -806,21 +799,21 @@ packages: name: permission_handler url: "https://pub.dartlang.org" source: hosted - version: "10.1.0" + version: "10.2.0" permission_handler_android: dependency: transitive description: name: permission_handler_android url: "https://pub.dartlang.org" source: hosted - version: "10.1.0" + version: "10.2.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple url: "https://pub.dartlang.org" source: hosted - version: "9.0.6" + version: "9.0.7" permission_handler_platform_interface: dependency: transitive description: @@ -834,21 +827,21 @@ packages: name: permission_handler_windows url: "https://pub.dartlang.org" source: hosted - version: "0.1.1" + version: "0.1.2" petitparser: dependency: transitive description: name: petitparser url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "5.1.0" photo_manager: dependency: transitive description: name: photo_manager url: "https://pub.dartlang.org" source: hosted - version: "2.4.1" + version: "2.5.0" photo_view: dependency: "direct main" description: @@ -890,14 +883,14 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.3" + version: "6.0.4" pub_semver: dependency: transitive description: name: pub_semver url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.3" pubspec_parse: dependency: transitive description: @@ -925,7 +918,7 @@ packages: name: rxdart url: "https://pub.dartlang.org" source: hosted - version: "0.27.5" + version: "0.27.7" scroll_to_index: dependency: "direct main" description: @@ -953,7 +946,7 @@ packages: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.13" + version: "2.0.14" shared_preferences_ios: dependency: transitive description: @@ -1009,7 +1002,7 @@ packages: name: shelf_web_socket url: "https://pub.dartlang.org" source: hosted - version: "1.0.2" + version: "1.0.3" sky_engine: dependency: transitive description: flutter @@ -1021,21 +1014,21 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.9.1" + version: "1.9.0" sqflite: dependency: transitive description: name: sqflite url: "https://pub.dartlang.org" source: hosted - version: "2.0.3+1" + version: "2.2.0+3" sqflite_common: dependency: transitive description: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.4.0+2" stack_trace: dependency: transitive description: @@ -1049,14 +1042,14 @@ packages: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.0" stream_transform: dependency: transitive description: name: stream_transform url: "https://pub.dartlang.org" source: hosted - version: "2.0.1" + version: "2.1.0" string_scanner: dependency: transitive description: @@ -1085,27 +1078,55 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" + tencent_cloud_chat_sdk: + dependency: transitive + description: + name: tencent_cloud_chat_sdk + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.4" + tencent_extended_text: + dependency: "direct main" + description: + name: tencent_extended_text + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + tencent_extended_text_field: + dependency: "direct main" + description: + name: tencent_extended_text_field + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + tencent_extended_text_library: + dependency: transitive + description: + name: tencent_extended_text_library + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" tencent_im_base: dependency: "direct main" description: name: tencent_im_base url: "https://pub.dartlang.org" source: hosted - version: "0.0.52" - tencent_im_sdk_plugin: - dependency: transitive - description: - name: tencent_im_sdk_plugin - url: "https://pub.dartlang.org" - source: hosted - version: "4.1.9" + version: "1.0.2" tencent_im_sdk_plugin_platform_interface: dependency: transitive description: name: tencent_im_sdk_plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "0.3.5" + version: "0.3.9" + tencent_open_file: + dependency: "direct main" + description: + name: tencent_open_file + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.9" tencent_wechat_camera_picker: dependency: "direct main" description: @@ -1168,14 +1189,14 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.1.6" + version: "6.1.7" url_launcher_android: dependency: transitive description: name: url_launcher_android url: "https://pub.dartlang.org" source: hosted - version: "6.0.19" + version: "6.0.22" url_launcher_ios: dependency: transitive description: @@ -1224,7 +1245,7 @@ packages: name: uuid url: "https://pub.dartlang.org" source: hosted - version: "3.0.6" + version: "3.0.7" vector_math: dependency: transitive description: @@ -1238,7 +1259,7 @@ packages: name: video_player url: "https://pub.dartlang.org" source: hosted - version: "2.4.7" + version: "2.4.8" video_player_android: dependency: transitive description: @@ -1315,7 +1336,7 @@ packages: name: watcher url: "https://pub.dartlang.org" source: hosted - version: "1.0.1" + version: "1.0.2" web_socket_channel: dependency: transitive description: @@ -1359,5 +1380,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" + dart: ">=2.18.0 <3.0.0" + flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index 07bd89c..e7fda21 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,9 +1,10 @@ -name: tim_ui_kit -description: TUIKit is a set of UI components implemented based on the Chat SDK, which includes functions such as IM, conversation, chat, search, relationship chain, group, and audio and video call. -version: 0.1.8 -homepage: https://www.tencentcloud.com/products/im -repository: https://github.com/TencentCloud/TIMSDK/tree/master/Flutter/IMSDK/tim_ui_kit +name: tencent_cloud_chat_uikit +description: UI components library and basic chat business logic for Tencent Cloud Chat service, helping you build In-APP Chat module easily. +version: 1.0.0 +homepage: https://www.tencentcloud.com/products/im?from=pub +repository: https://github.com/TencentCloud/tc-chat-uikit-flutter documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html +# publish_to: none platforms: android: ios: @@ -26,12 +27,11 @@ dependencies: flutter_svg: ^1.0.0 image_picker: ^0.8.5+3 file_picker: ^4.6.1 - open_file: ^3.2.1 super_tooltip: ^1.0.1 video_player: ^2.4.2 chewie: ^1.3.2 flutter_slidable_for_tencent_im: ^1.4.0 - flutter_plugin_record_plus: ^0.0.11 + flutter_plugin_record_plus: ^0.0.15 azlistview: ^2.0.0 lpinyin: ^2.0.3 transparent_image: ^2.0.0 @@ -48,13 +48,13 @@ dependencies: json_annotation: ^4.4.0 js: ^0.6.3 scroll_to_index: ^2.1.1 - wechat_assets_picker: ^7.0.2 -# tencent_wechat_camera_picker: -# path: /Users/wangrunlin/Documents/GitHub/tencent_flutter_wechat_camera_picker + wechat_assets_picker: ^7.2.0 tencent_wechat_camera_picker: ^3.6.2+5 flutter_easyrefresh: ^2.2.1 flutter_spinkit: ^5.1.0 extended_image: ^6.0.2+1 + tencent_extended_text_field: ^1.0.0 + tencent_extended_text: ^1.0.0 package_info_plus: ^1.4.0 loading_animation_widget: ^1.1.0+3 permission_handler: ^10.0.0 @@ -64,16 +64,14 @@ dependencies: url_launcher: ^6.1.4 universal_html: ^2.0.8 link_preview_generator: ^1.2.0 - tencent_im_base: ^0.0.52 + tencent_im_base: ^1.0.2 disk_space: ^0.2.1 http: ^0.13.5 crypto: ^3.0.2 - -# tencent_im_base: -# path: /Users/wangrunlin/Documents/GitHub/im-flutter-base collection: ^1.15.0 flutter_image_compress: ^1.1.3 uuid: ^3.0.6 + tencent_open_file: ^4.0.9 dev_dependencies: flutter_lints: ^1.0.0 @@ -89,6 +87,7 @@ flutter: uses-material-design: true assets: - images/ + - assets/custom_face_resource/4349/ # To add assets to your package, add an assets section, like this: # assets: