From 459e5ca10867d25752fa2bccbee9c7440d21cc4d Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Wed, 19 Jul 2023 16:14:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B6=88=E6=81=AF=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E6=8F=90=E7=A4=BA=E8=AF=AD=E5=92=8C=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._uikit_chat_history_message_list_item.dart | 23 ++- .../tim_uikit_text_field.dart | 166 +++++++++++++++++- .../app/chat/TIMUIKitChat/tim_uikit_chat.dart | 35 +++- circle_app/lib/app/chat/view.dart | 2 +- .../app/circle/widgets/info_list_view.dart | 2 +- circle_app/lib/main.dart | 13 +- 6 files changed, 218 insertions(+), 23 deletions(-) diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart index fd7c755..baf863c 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_item.dart @@ -405,7 +405,7 @@ class _TIMUIKItHistoryMessageListItemState return Column( children: [ Container( - height: info.containsKey('city') ? 175.sp : 135.sp, + // height: info.containsKey('city') ? 175.sp : 135.sp, width: Get.width, margin: EdgeInsets.only(left: isFromSelf ? 16 : 0, right: isFromSelf ? 0 : 16), decoration: BoxDecoration( @@ -414,6 +414,10 @@ class _TIMUIKItHistoryMessageListItemState image: AssetImage( getCircleImage('pic_bg'), ))), + constraints: BoxConstraints( + maxHeight: 175.sp, + minHeight: 135.sp + ), child: Column( children: [ Container( @@ -446,10 +450,12 @@ class _TIMUIKItHistoryMessageListItemState ), if (info.containsKey('both_interests')) Container( - margin: EdgeInsets.only(top: 16.sp), + + margin: EdgeInsets.only(top: 16.sp,right: 16.sp), child: Row( children: [ Container( + margin: EdgeInsets.only(right: 5.sp), width: 3, height: 3, @@ -457,12 +463,17 @@ class _TIMUIKItHistoryMessageListItemState borderRadius: BorderRadius.circular(1.5), color: Color(0xFF00FFF4)), ), - Text( - info['both_interests'], - style: TextStyle( + Container( + width:Get.width - 80.sp, + child: Text( + info['both_interests'], + style: TextStyle( color: Colors.white, fontSize: 14.sp, - fontWeight: FontWeight.w500), + fontWeight: FontWeight.w500,), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), ) ], ), diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart index 14963a6..e796d2a 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field.dart @@ -1,6 +1,8 @@ import 'dart:async'; +import 'dart:convert'; import 'dart:math'; import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart'; +import 'package:circle_app/main.dart'; import 'package:circle_app/util/util.dart'; import 'package:diff_match_patch/diff_match_patch.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_setting_model.dart'; @@ -25,7 +27,6 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField enum MuteStatus { none, me, all } - GlobalKey<_InputTextFieldState> myInputTextFieldState = GlobalKey(); class TIMInputTextField extends StatefulWidget { @@ -45,7 +46,7 @@ class TIMInputTextField extends StatefulWidget { final AutoScrollController? atMemberPanelScroll; /// hint text for textField widget - final String? hintText; + String? hintText; /// config for more pannel final MorePanelConfig? morePanelConfig; @@ -83,12 +84,12 @@ class TIMInputTextField extends StatefulWidget { final String? groupType; - const TIMInputTextField( + TIMInputTextField( {Key? key, required this.conversationID, required this.conversationType, this.initText, - this.hintText, + required this.hintText, this.scrollController, this.morePanelConfig, this.customStickerPanel, @@ -122,6 +123,8 @@ class _InputTextFieldState extends TIMUIKitState { bool isAddingAtSearchWords = false; double inputWidth = 900; + String hintText = '说些什么吧~'; + Map memberInfoMap = {}; late TextEditingController textEditingController; @@ -257,6 +260,45 @@ class _InputTextFieldState extends TIMUIKitState { lastText = ""; final text = textEditingController.text.trim(); final convType = widget.conversationType; + + if (text.isEmpty) { + if (hintText.contains('说些什么吧~')) { + showToast('请输入消息内容后发送'); + return; + } else { + if ((widget.currentConversation.lastMessage?.customElem ?? null) != + null) { + if (widget.currentConversation.lastMessage?.customElem!.extension == + 'cardData') { + sendHiText(); + } + } else { + var result = await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .getC2CHistoryMessageList( + userID: widget.currentConversation.userID!, + count: 1, + lastMsgID: null, + ); + + if (result.code == 0 && (result.data?.isNotEmpty ?? false)) { + V2TimMessage msg = result.data!.last!; + + if (msg.customElem != null) { + if (msg.customElem!.extension == 'cardData') { + Map info = jsonDecode(msg.customElem!.data!); + sendHiTextMsg(info['guide_text']); + } + } + } else { + showToast('请输入消息内容后发送'); + } + } + + return; + } + } + if (text.isNotEmpty && text != zeroWidthSpace) { if (widget.model.repliedMessage != null) { MessageUtils.handleMessageError( @@ -288,7 +330,28 @@ class _InputTextFieldState extends TIMUIKitState { } else { showToast('请输入消息内容'); } -} + } + + sendHiText() async { + Map info = + jsonDecode(widget.currentConversation.lastMessage!.customElem!.data!); + sendHiTextMsg(info['guide_text']); + // var result = await widget.model.sendTextMessage( + // text: info['guide_text'], + // convID: widget.conversationID, + // convType: ConvType.c2c); + // + // hintText = '说些什么吧~'; + // setState(() {}); + } + + sendHiTextMsg(String text) async { + var result = await widget.model.sendTextMessage( + text: text, convID: widget.conversationID, convType: ConvType.c2c); + + hintText = '说些什么吧~'; + setState(() {}); + } void goDownBottom() { if (globalModel.getMessageListPosition(widget.conversationID) == @@ -547,6 +610,7 @@ class _InputTextFieldState extends TIMUIKitState { @override void initState() { super.initState(); + checkHintText(); if (PlatformUtils().isWeb || PlatformUtils().isDesktop) { focusNode = FocusNode( onKey: (node, event) { @@ -752,6 +816,7 @@ class _InputTextFieldState extends TIMUIKitState { return LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { inputWidth = constraints.maxWidth; + return TUIKitScreenUtils.getDeviceWidget( defaultWidget: TIMTextFieldLayoutNarrow( onEmojiSubmitted: onEmojiSubmitted, @@ -760,13 +825,54 @@ class _InputTextFieldState extends TIMUIKitState { addStickerToText: addStickerToText, customStickerPanel: widget.customStickerPanel, forbiddenText: forbiddenText, + onChanged: (text) async { + if (widget.onChanged != null) { + widget.onChanged!(text); + } - onChanged: widget.onChanged, + if (!hintText!.contains('说些什么吧~') && text.isNotEmpty) { + if ((widget.currentConversation.lastMessage + ?.customElem ?? + null) != + null) { + if (widget.currentConversation.lastMessage + ?.customElem!.extension == + 'cardData') { + hintText = '说些什么吧~'; + setState(() { + + }); + } + } else { + var result = await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .getC2CHistoryMessageList( + userID: widget.currentConversation.userID!, + count: 1, + lastMsgID: null, + ); + + if (result.code == 0 && + (result.data?.isNotEmpty ?? false)) { + V2TimMessage msg = result.data!.last!; + + if (msg.customElem != null) { + if (msg.customElem!.extension == 'cardData') { + hintText = '说些什么吧~'; + setState(() { + + }); + } + } + } + } + } + }, backgroundColor: widget.backgroundColor, morePanelConfig: widget.morePanelConfig, repliedMessage: value, currentCursor: currentCursor, - hintText: widget.hintText, + hintText: hintText, isUseDefaultEmoji: widget.isUseDefaultEmoji, languageType: languageType, textEditingController: textEditingController, @@ -801,7 +907,7 @@ class _InputTextFieldState extends TIMUIKitState { morePanelConfig: widget.morePanelConfig, repliedMessage: value, currentCursor: currentCursor, - hintText: widget.hintText, + hintText: hintText, isUseDefaultEmoji: widget.isUseDefaultEmoji, languageType: languageType, textEditingController: textEditingController, @@ -827,4 +933,48 @@ class _InputTextFieldState extends TIMUIKitState { }), selector: (c, model) => model.repliedMessage); } + + checkHintText() async { + if (hintText!.contains('说些')) { + if ((widget.currentConversation.lastMessage?.customElem ?? null) != + null) { + if (widget.currentConversation.lastMessage?.customElem!.extension == + 'cardData') { + Map info = jsonDecode( + widget.currentConversation.lastMessage!.customElem!.data!); + hintText = info['guide_text']; + setState(() { + + }); + } + } else if (widget.currentConversation.lastMessage == null) { + getConverstationLastInfo(); + } + } + } + + getConverstationLastInfo() async { + // 拉取单聊历史消息 +// 首次拉取,lastMsgID 设置为 null +// 再次拉取时,lastMsgID 可以使用返回的消息列表中的最后一条消息的id + var result = await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .getC2CHistoryMessageList( + userID: widget.currentConversation.userID!, + count: 1, + lastMsgID: null, + ); + + if (result.code == 0 && (result.data?.isNotEmpty ?? false)) { + V2TimMessage msg = result.data!.last!; + + if (msg.customElem != null) { + if (msg.customElem!.extension == 'cardData') { + Map info = jsonDecode(msg.customElem!.data!); + hintText = info['guide_text']; + setState(() {}); + } + } + } + } } diff --git a/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart b/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart index d946c9b..1ef475e 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/tim_uikit_chat.dart @@ -4,6 +4,7 @@ import 'package:circle_app/components/func_widget.dart'; import 'package:desktop_drop/desktop_drop.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; @@ -315,6 +316,11 @@ class _TUIChatState extends TIMUIKitState { return widget.conversation.type == 1 ? ConvType.c2c : ConvType.group; } + + String _getTotalUnReadCount(int unreadCount) { + return unreadCount < 99 ? unreadCount.toString() : "99+"; + } + @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { final TUITheme theme = value.theme; @@ -376,7 +382,32 @@ class _TUIChatState extends TIMUIKitState { child: Scaffold( backgroundColor: Colors.transparent, resizeToAvoidBottomInset: false, - appBar:widget.customAppBar!, + appBar:PreferredSize( + preferredSize: const Size.fromHeight(48.0), + child: Stack( + alignment: Alignment.centerLeft, + children: [ + widget.customAppBar!, + chatGlobalModel.totalUnReadCount > 0 ? Positioned(left: 40.sp,bottom: 12.sp,child: Container( + // width: 22, + height: 22, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(11), + color: theme.cautionColor, + ), + constraints: BoxConstraints( + maxWidth: 30, + minWidth: 22, + ), + child: + Text(_getTotalUnReadCount(chatGlobalModel.totalUnReadCount),style: TextStyle(color: Colors.white,fontSize: 12.sp),), + )) : Container() + ], + ), + + + ), body: DropTarget( onDragDone: (detail) { setState(() { @@ -484,7 +515,7 @@ class _TUIChatState extends TIMUIKitState { scrollController: autoController, conversationID: _getConvID(), conversationType: _getConvType(), - hintText: '最近心情怎么样?', + hintText: '说些什么吧~', showMorePanel: widget.config ?.isAllowShowMorePanel ?? true, diff --git a/circle_app/lib/app/chat/view.dart b/circle_app/lib/app/chat/view.dart index 179d8fe..c213c4e 100644 --- a/circle_app/lib/app/chat/view.dart +++ b/circle_app/lib/app/chat/view.dart @@ -99,7 +99,7 @@ class _ChatPageState extends State { ), userAvatarBuilder: (BuildContext context, V2TimMessage message) { - return avatarWidget(message.faceUrl ?? 'http://qiniuyun.ikuayou.com/avatar/default/default_header.png'); + return avatarWidget((message.faceUrl?.isNotEmpty ?? false) ? message.faceUrl! : 'http://qiniuyun.ikuayou.com/avatar/default/default_header.png'); }, ); diff --git a/circle_app/lib/app/circle/widgets/info_list_view.dart b/circle_app/lib/app/circle/widgets/info_list_view.dart index 66b0792..f50ea33 100644 --- a/circle_app/lib/app/circle/widgets/info_list_view.dart +++ b/circle_app/lib/app/circle/widgets/info_list_view.dart @@ -176,7 +176,7 @@ class _InfoListViewState extends State with AutomaticKeepAliveClie var data = await DioManager.instance.get( url: "/up-service/callout/${bean.id}/chat",); if (data["code"] == 200) { - pushChatPage(data['data']['account_id'],data['data']['account_id'], bean.user!.nickname!); + pushChatPage(data['data']['account_id'].toString().split("_").last,data['data']['account_id'], bean.user!.nickname!); } } diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index 4ce22ca..b94f53d 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -69,7 +69,7 @@ createCustomMsg(String userId,String imId) async { if (data['data']['both_cities'] != null) { List city = data['data']['both_cities']; if (city.isNotEmpty) { - desc = '· 你们都在$city留下过足迹'; + desc = '你们都在$city留下过足迹'; } } if (data['data']['both_interests'] != null) { @@ -79,9 +79,9 @@ createCustomMsg(String userId,String imId) async { circleList.add(element['title']); }); if (circleList.isNotEmpty) { - info['both_interests'] = '· 你们有${circleList.length}个共同的圈子:${circleList.join('、')}'; + info['both_interests'] = '你们有${circleList.length}个共同的圈子:${circleList.join('、')}'; if (desc.isEmpty) { - desc = '· 你们有${circleList.length}个共同的圈子:${circleList.join('、')}'; + desc = '你们有${circleList.length}个共同的圈子:${circleList.join('、')}'; } } } @@ -91,6 +91,7 @@ createCustomMsg(String userId,String imId) async { info['my'] = data['data']['my'] ?? ''; info['myInterests'] = data['data']['myInterests'] ?? []; info['user'] = data['data']['user']; + info['guide_text'] = data['data']['guide_text'] ?? '请问现在有空吗?'; await sendCustomMsg(imId, jsonEncode(info), desc); return true; } @@ -102,13 +103,13 @@ createCustomMsg(String userId,String imId) async { //发送文本消息 -sendTextMsg(String userId) async { +sendTextMsg(String userId,{String content = '看看这次缘分匹配到哪位小可爱呢?'}) async { // 创建文本消息 V2TimValueCallback createTextMessageRes = await TencentImSDKPlugin.v2TIMManager .getMessageManager() .createTextMessage( - text: '看看这次缘分匹配到哪位小可爱呢?', // 文本信息 + text: content, // 文本信息 ); if (createTextMessageRes.code == 0) { // 文本信息创建成功 @@ -123,7 +124,9 @@ sendTextMsg(String userId) async { .sendMessage(id: id!, receiver: userId, groupID: ''); if (sendMessageRes.code == 0) { // 发送成功 + return true; } + return false; } // V2TimValueCallback createCustomMessageRes = // await TencentImSDKPlugin.v2TIMManager