From b9664e13a8bad62a72b11363748c8c5a65bfe11f Mon Sep 17 00:00:00 2001 From: CYH <13923927013@163.com> Date: Wed, 29 Nov 2023 10:09:14 +0700 Subject: [PATCH] =?UTF-8?q?=E9=80=9F=E8=81=8A=E6=8E=A8=E8=8D=90=EF=BC=8C?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E6=89=93=E6=8B=9B=E5=91=BC=EF=BC=8C=E5=88=86?= =?UTF-8?q?=E4=BA=AB=E5=9C=88=E5=AD=90=EF=BC=8C=E8=AE=B8=E6=84=BF=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- circle_app/assets/images/home/im_more.png | Bin 0 -> 850 bytes circle_app/assets/images/msg/hello.png | Bin 0 -> 4271 bytes circle_app/assets/images/msg/share_circle.png | Bin 0 -> 3901 bytes circle_app/assets/images/msg/wish.png | Bin 0 -> 3177 bytes circle_app/ios/Info.plist | 40 ++ ..._uikit_chat_history_message_list_item.dart | 15 + .../tim_uikit_text_field.dart | 70 +++- .../tim_uikit_text_field_layout/narrow.dart | 326 ++++++++++----- circle_app/lib/app/chat/view.dart | 4 +- .../chat/widget/chat_circle_share_dialog.dart | 215 ++++++++++ .../lib/app/chat/widget/chat_gift_pannel.dart | 5 +- .../chat/widget/chat_msg_get_gift_item.dart | 115 +++++ .../app/chat/widget/chat_msg_gift_item.dart | 4 +- .../widget/chat_msg_invent_wish_item.dart | 95 +++++ .../chat/widget/chat_msg_wish_info_item.dart | 126 ++++++ circle_app/lib/app/chat/widget/gift.dart | 105 +++-- .../lib/app/chat/widget/send_gift_dialog.dart | 203 +++++++++ .../lib/app/chat/widget/svg_dialog.dart | 55 +++ .../lib/app/chat/widget/wish_dialog.dart | 286 +++++++++++++ circle_app/lib/app/circle/logic.dart | 9 +- .../lib/app/circle/widgets/vicinity.dart | 2 + circle_app/lib/app/externalshare/logic.dart | 5 +- circle_app/lib/app/externalshare/view.dart | 14 +- circle_app/lib/app/home/binding.dart | 2 + circle_app/lib/app/home/logic.dart | 44 +- circle_app/lib/app/likelist/logic.dart | 17 +- circle_app/lib/app/likelist/view.dart | 27 +- circle_app/lib/app/login/login/view.dart | 73 ++-- circle_app/lib/app/minefragment/view.dart | 6 +- .../tim_uikit_conversation.dart | 8 +- circle_app/lib/app/msg/logic.dart | 119 +++++- circle_app/lib/app/msg/view.dart | 224 +++++++--- circle_app/lib/app/my_circle/logic.dart | 22 +- circle_app/lib/app/my_circle/view.dart | 10 +- circle_app/lib/app/quick/binding.dart | 10 + circle_app/lib/app/quick/logic.dart | 51 +++ circle_app/lib/app/quick/view.dart | 393 ++++++++++++++++++ circle_app/lib/main.dart | 191 --------- circle_app/lib/network/api.dart | 24 ++ circle_app/lib/network/dio_manager.dart | 18 +- circle_app/lib/router/app_pages.dart | 7 +- circle_app/lib/router/app_routers.dart | 2 +- circle_app/lib/util/util.dart | 244 +++++++++++ circle_app/pubspec.lock | 32 ++ circle_app/pubspec.yaml | 4 + 45 files changed, 2720 insertions(+), 502 deletions(-) create mode 100644 circle_app/assets/images/home/im_more.png create mode 100644 circle_app/assets/images/msg/hello.png create mode 100644 circle_app/assets/images/msg/share_circle.png create mode 100644 circle_app/assets/images/msg/wish.png create mode 100644 circle_app/ios/Info.plist create mode 100644 circle_app/lib/app/chat/widget/chat_circle_share_dialog.dart create mode 100644 circle_app/lib/app/chat/widget/chat_msg_get_gift_item.dart create mode 100644 circle_app/lib/app/chat/widget/chat_msg_invent_wish_item.dart create mode 100644 circle_app/lib/app/chat/widget/chat_msg_wish_info_item.dart create mode 100644 circle_app/lib/app/chat/widget/send_gift_dialog.dart create mode 100644 circle_app/lib/app/chat/widget/svg_dialog.dart create mode 100644 circle_app/lib/app/chat/widget/wish_dialog.dart create mode 100644 circle_app/lib/app/quick/binding.dart create mode 100644 circle_app/lib/app/quick/logic.dart create mode 100644 circle_app/lib/app/quick/view.dart diff --git a/circle_app/assets/images/home/im_more.png b/circle_app/assets/images/home/im_more.png new file mode 100644 index 0000000000000000000000000000000000000000..762b340682852e7f7f47f0e370a016c8e6a2403e GIT binary patch literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^Q6S901|%(3I5IIXFiU#6IEGZjy}j<+;TI^u{^6tG zMV_BhUS7*|QWd3xBD_{;&YYs=J2AyICq*oHvdB^mdCt~Nn>PlEooecxdgBDsO3mKN z_jiit73*F9e`dxW+wXh6-@7?u_mBUtUgo~DIsbWH^}C(l=WSoz-GLKGDV_hk^w`ei zYrnOB?8%*L{dmspzQ^39d7@XoEczGn>Q1k~i}E{Bx0iojwcxzX$kSC578w)P&3Ul_`K6BobPLK81mYgssn)Z6vjIh;P zk403omoB?-`nP`PiNG&WOI}NHH}C7X`h9bO(Obn&2dnpcU*C4v^Ls}z|HSuPU;ir| zmi^4Lb9HI0^_Cl5hI_lOYJB3zW zeK^s2&Fl1@-rlbXG5yQ-ZH`!dSfSkEd&ZQHHt~(mpWi<5z?${h#rIchnUc@A3D?Jz zbcuz1wYsbBu>S6{dq?NN{t_qU)u3y*t(e75&gx-kCblFRI$SE@ic-NxSi*5?fUG|cX=Tmjc16gM4#%z!+%S-b@7pPfT)_=d- z`p2*FkNggc>XP}#4sfSPvi)-7-=o4(e$Wx*)UQA4wSz8e3ca~&{@RW)Zbu^HnP;g# z3_T~k=-z7hK|7nFdF^J^-@O%q+x{P&_iYkq^!B8+eP_CQUj33xwC@vt6dasi-L9R) zR@(3Oh=1CD7WKUn+P@9h{#h0oHRawAzVmE$)<2f`&dKs-ACG$og&F02-nz?=`@ZQ` z^W*31g{ylyY7Rda_%!Xstz(B5R0~g3j_?dO+}XeJlDmL)Va>jCYmM@9=bzl9=yS|g zIBe(l=a+5nFZjIb!EW)Ezjd$v-ZW6_c`NqMuJiF-tLZqCWXH2p^3u&7JS84ntiZg& N;OXk;vd$@?2>=cCvCRMg literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/hello.png b/circle_app/assets/images/msg/hello.png new file mode 100644 index 0000000000000000000000000000000000000000..bf00d244281f2987e75dab66cfbe5a9dba8b892b GIT binary patch literal 4271 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 literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/share_circle.png b/circle_app/assets/images/msg/share_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..ecfc8316ea58b5c1e0a5b28b931f56bdc0d1ee56 GIT binary patch literal 3901 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 LNkvXXu0mjfA4H*% literal 0 HcmV?d00001 diff --git a/circle_app/assets/images/msg/wish.png b/circle_app/assets/images/msg/wish.png new file mode 100644 index 0000000000000000000000000000000000000000..84d076d14027bc2572af954e08152e5aac6b498d GIT binary patch literal 3177 zcmV-v43_hWP)Px>BS}O-RA@u(nhB5`WfjMNuX|=^c6PFx&2ADxge4G37J?=SEONyHC7R*WI&Oa==2e zyAXJl%Ix&?@%_Jd{oi{ne8faPVtDx&@L*|NRrd$(0*(-on+EH-L#AO>Jqx%BC<1$m z$Wwy>dME+U1D3amp6TXm+h+Lg#H``GTSN}n5&B*3XK_BLf9`&`nxZce8ZVQ`W|_Z&{IQkF&Eb!dmH@aBxC7{zeRWQoM>rgIa7vzg!RN*WMb4U@W$e~& z88|^i{<0+i9t9Yq8hyoiJxuAS(}TX8k`>E*=FKhe%`+Mp+vZe(Q$*y3Ed}s@t7S&c zJEx#K?UP{Yv^wd0IpB|1l=N%or)6}TQ;7lpeoFvsgyT_Q{QT)9#(mbM#$1T%nBID2L1zdi-;ZHtTJdOt*YMwP6u}B2LdY*jd+|ZB3?hv@AoMK4p>#~83y!9pbmHj z_%-k^tBim-z!OF{fnDP+$bK<`dql)~Uz<$^1Mo257GNJ>wuqctTfM3t3>d+Fv{|GdO|J9d2K>pVI(3cbOIuxnwmO$#jzd$@(bb+W6@^zTK0BlnEG$%5Frk$( zN%w;TSXFm0lHbSQ%s>AM{8l9FT7;si=EI>$@BZ&j)_6+XiWSwkBWq+!Ve6F3{ZmFV zZ$+NNThffK`v3rr0h|YXzlJHE9#}WStkit-bP<`iF5rD1TB+ThFCk+#v2IokG(sg% zrj5z4C|BX?NzIH-4Y5h9YI~eREq_`W_lG#*8XX)Bd=5A%hGVVRS%CFlLk%Bz?@GF> z0j`7{oj6{F$nBp7fy$by(wGz$?AJ=`Py$xfmYDR92aNX~1-#Uk38|`SxFe>C7Kx2W zEREYbdmeGeD!Qv0hU1!Y!%t9ORoaIqnXyZjE1vA(%8n*l(?g`;7|3kE24DtY@4kMz zE+bIYvw|0+oHorkL@WEZ04i=fs^dwAK$DU?crT z361zq5D}XT^-Ap5Mgi{>k({cU8C&nlh=eh%f0{|3{MRmW)c{8vRD-BCjb=%qp36RL z)!?$K81SnjhBIOa0iPJRSFaP1=^N1KleQ6N0U~m(s%GMdZPanEm`Cq@>ipGOs01R8 zs3@W}&LM=~qaX(s)#e`AL~~~7H2gQG2CJHc#jdaT1^~i$IIIl3;esON zVlDOB*+xMk;I%CalqwSnP%I>p1G*iGIf!|q!K_qm8jY@w3Td&w| z{2Fj5FcYwJ6w2y~vb5Xd&63Zug3qdo>gy#>tTIv&o!Q%LwgRT zrt2tdM;bojhbfG{T=aA|okgFlD~wLLj7q!OQs>AgGA`qWxs1seo9z{A{aPdcPa8wr zU%)mZvA&cw*UZGsM7eWGnY&*q)0y`v`ASs@DPk?3+Rf8R;iCN-*|8(-7tYxt zV$H$zq+fuewW;-)Z0G8iF88?R);v9>fTZi#G~3qNOCDlN4PDhH{NFh&tJ{ro<*w7J zc!eMiP_aqJY}wew5juXJzzFL6`9+p5w@?;YPOtsjkwDb~PBx`XY8q@5*v1t9C zOgh%Gm5TRUzU?ge-1zLxV@p7(h%=h5DrWRKRQS(Np*ZJ54bW0${Yz%l4Oj3XNxd~A7zxew$t>4>CU z)40%*akZ_l}O=$=F9F}%)9T?Hzgn?{h+ft}1o=+GMyUR*f!RM`_vbq%TQkT!` zd5=mUTJZx}T~v||7oPR-J+SB<`sLbMe{E}aoxYY)k&s;*HH%F> z%-43*7+WA3RAH+&k)1!4Wb&jW4ViF@EQrn!5nIQ*%KO%EpCD%8<3hmd;(D(N`JRBq zk9aJ7%%|tg0LOB*i-<+NNj6!->po3Yx3vLSJQcJlzg1Ch zlb`^B2i07}t4-WG!A*f1zD2yA*qc4pH@gS8cT?))%?`MashbDen8hGWiv8R^t=VVq zc9<2cE2cdI_flN`nI<0wtOn1Eh;>soNd^q?Car1!Fa8+t0B-IF;@1BM2HP))s5{dq P00000NkvXXu0mjfw#f)| literal 0 HcmV?d00001 diff --git a/circle_app/ios/Info.plist b/circle_app/ios/Info.plist new file mode 100644 index 0000000..e35fb11 --- /dev/null +++ b/circle_app/ios/Info.plist @@ -0,0 +1,40 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + weixin + CFBundleURLSchemes + + wxab2387c2198f01e1 + + + + LSApplicationQueriesSchemes + + weixinULAPI + weixin + wechat + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsArbitraryLoadsInWebContent + + + UIViewControllerBasedStatusBarAppearance + + io.flutter.embedded_views_preview + + UIApplicationSupportsIndirectInputEvents + + + 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 2f6848a..7384595 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 @@ -4,7 +4,9 @@ import 'dart:math'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_chat_text_elem.dart'; import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitMessageItem/tim_uikit_merger_message_elem.dart'; +import 'package:circle_app/app/chat/widget/chat_msg_invent_wish_item.dart'; import 'package:circle_app/app/chat/widget/chat_msg_partner_item.dart'; +import 'package:circle_app/app/chat/widget/chat_msg_wish_info_item.dart'; import 'package:circle_app/router/app_routers.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/cupertino.dart'; @@ -46,6 +48,7 @@ import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart'; import '../../../../common/Widgets/text_more.dart'; import '../../../circle/logic.dart'; +import '../../widget/chat_msg_get_gift_item.dart'; import '../TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_chat_gift_elem.dart'; import '../TIMUIKitMessageItem/TIMUIKitMessageReaction/tim_uikit_message_reaction_select_emoji.dart'; @@ -425,6 +428,18 @@ class _TIMUIKItHistoryMessageListItemState ); } + if (messageItem.customElem?.extension?.contains('getGiftData') ?? false) { + return ChatMsgGetGiftItem(messageItem); + } + + if (messageItem.customElem?.extension?.contains('getInventWishData') ?? false) { + return ChatMsgInventWishItem(messageItem); + } + + if (messageItem.customElem?.extension?.contains('getWishData') ?? false) { + return ChatMsgWishInfoItem(messageItem); + } + if (messageItem.customElem?.extension?.contains('sendVip') ?? false) { return ChatMsgPartnerItem(messageItem); } 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 317e53f..e6aeecc 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 @@ -7,6 +7,7 @@ import 'package:circle_app/network/api.dart'; import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/util/util.dart'; import 'package:diff_match_patch/diff_match_patch.dart'; +import 'package:get/get.dart'; import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_setting_model.dart'; import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart'; @@ -28,6 +29,7 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField 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_text_field_layout/wide.dart'; +import '../../../../common/Widgets/open_vip_tip/view.dart'; import '../../../../util/eventBus.dart'; enum MuteStatus { none, me, all } @@ -126,6 +128,7 @@ class _InputTextFieldState extends TIMUIKitState { String languageType = ""; int? currentCursor; bool isAddingAtSearchWords = false; + bool imStatusOK = false; double inputWidth = 900; String hintText = '说些什么吧~'; @@ -260,15 +263,49 @@ class _InputTextFieldState extends TIMUIKitState { return userList; } -bool isSendLoging = false; + + Future checkImStatus() async { + var data = + await DioManager.instance.get(url: Api.imstate); + + int code = data['code']; + if (code == 200) { + imStatusOK = true; + } else { + if (code == 21201) { + Get.bottomSheet( + Scaffold( + backgroundColor: Colors.transparent, + body: Open_vip_tipPage(true), + ), + isScrollControlled: true, + enableDrag: false); + } + showOKToast(data['msg']); + imStatusOK = false; + } + return imStatusOK; + } + + + bool isSendLoging = false; onSubmitted() async { - if(isSendLoging){ + if (isSendLoging) { return; } if (isBlack) { showOKToast("您已将对方拉黑,请移除黑名单后在发送消息~"); return; } + + + bool isOK = await checkImStatus(); + + if (!isOK) { + return; + } + + lastText = ""; String text = textEditingController.text.trim(); final convType = widget.conversationType; @@ -312,7 +349,6 @@ bool isSendLoging = false; } if (text.isNotEmpty && text != zeroWidthSpace) { - if (widget.model.repliedMessage != null) { MessageUtils.handleMessageError( widget.model.sendReplyMessage( @@ -345,14 +381,15 @@ bool isSendLoging = false; if (words.isEmpty) { MessageUtils.handleMessageError( widget.model.sendTextMessage( - text: text, convID: widget.conversationID, convType: convType), + text: text, + convID: widget.conversationID, + convType: convType), context); } else { textEditingController.text = text; showOKToast('含违规词汇,无法发送'); return; } - } textEditingController.clear(); currentCursor = null; @@ -420,7 +457,7 @@ bool isSendLoging = false; affinity: TextAffinity.downstream, offset: widget.model.editRevokedMsg.length)); widget.model.editRevokedMsg = ""; - Future.delayed(Duration(milliseconds: 300),() { + Future.delayed(Duration(milliseconds: 300), () { focusNode.requestFocus(); }); } @@ -736,19 +773,18 @@ bool isSendLoging = false; (appLocale == AppLocale.zhHans || appLocale == AppLocale.zhHant) ? 'zh' : 'en'; - if(null==commentBlackEvent){ - commentBlackEvent = EventBusManager.on().listen((event) { - if(event.userId == widget.currentConversation.userID!){ + if (null == commentBlackEvent) { + commentBlackEvent = + EventBusManager.on().listen((event) { + if (event.userId == widget.currentConversation.userID!) { isBlack = event.isBlack; } }); getBlack(); } - - - } - StreamSubscription? commentBlackEvent =null; + + StreamSubscription? commentBlackEvent = null; bool isBlack = false; getBlack() async { @@ -768,9 +804,6 @@ bool isSendLoging = false; } } - - - @override void didUpdateWidget(TIMInputTextField oldWidget) { super.didUpdateWidget(oldWidget); @@ -782,7 +815,6 @@ bool isSendLoging = false; textEditingController.clear(); } } - } @override @@ -790,12 +822,11 @@ bool isSendLoging = false; // handleSetDraftText(); widget.model.removeListener(onModelChanged); focusNode.dispose(); - if(null!=commentBlackEvent){ + if (null != commentBlackEvent) { print("TIMInputTextField解绑"); EventBusManager.cancelSubscription(commentBlackEvent!); } - super.dispose(); } @@ -903,7 +934,6 @@ bool isSendLoging = false; addStickerToText: addStickerToText, customStickerPanel: widget.customStickerPanel, forbiddenText: forbiddenText, - onChanged: (text) async { if (widget.onChanged != null) { widget.onChanged!(text); diff --git a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart index 407b144..eee9dd8 100644 --- a/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart +++ b/circle_app/lib/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_layout/narrow.dart @@ -5,8 +5,11 @@ import 'dart:math'; import 'dart:typed_data'; import 'package:circle_app/app/chat/TIMUIKitChat/TIMUIKitTextField/tim_uikit_send_sound_message.dart'; +import 'package:circle_app/app/chat/widget/send_gift_dialog.dart'; +import 'package:circle_app/app/chat/widget/wish_dialog.dart'; import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/common/Widgets/open_vip_tip/view.dart'; +import 'package:circle_app/common/colors/app_color.dart'; import 'package:circle_app/network/api.dart'; import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/util/util.dart'; @@ -38,6 +41,7 @@ import 'package:video_thumbnail/video_thumbnail.dart'; import '../../../../../util/eventBus.dart'; import '../../../../call_out/logic.dart'; +import '../../../widget/chat_circle_share_dialog.dart'; import '../../../widget/chat_gift_pannel.dart'; GlobalKey<_TIMTextFieldLayoutNarrowState> TIMnarrowTextFieldKey = GlobalKey(); @@ -158,11 +162,13 @@ class TIMTextFieldLayoutNarrow extends StatefulWidget { class _TIMTextFieldLayoutNarrowState extends TIMUIKitState { - final TUISettingModel settingModel = serviceLocator(); final ImagePicker _picker = ImagePicker(); bool isVip = false; + + bool imStatusOK = false; + bool showMore = false; bool showMoreButton = true; bool showSendSoundText = false; @@ -465,9 +471,9 @@ class _TIMTextFieldLayoutNarrowState _buildRepliedMessage(widget.repliedMessage), Stack( children: [ - - Container( + margin: EdgeInsets.only( + top: showKeyboard || showEmojiPanel ? 0 : 50.sp), decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular( @@ -481,7 +487,7 @@ class _TIMTextFieldLayoutNarrowState children: [ Container( padding: - EdgeInsets.symmetric(vertical: 8, horizontal: 12.sp), + EdgeInsets.symmetric(vertical: 8, horizontal: 12.sp), constraints: const BoxConstraints(minHeight: 30), child: Row( children: [ @@ -556,7 +562,7 @@ class _TIMTextFieldLayoutNarrowState }); } else { var data = - await Permission.microphone.request(); + await Permission.microphone.request(); if (data.isGranted) { setState(() { showEmojiPanel = false; @@ -577,7 +583,9 @@ class _TIMTextFieldLayoutNarrowState width: 25.sp, ), ), - SizedBox(width: 10.sp,), + SizedBox( + width: 10.sp, + ), Stack( children: [ Container( @@ -587,103 +595,102 @@ class _TIMTextFieldLayoutNarrowState padding: EdgeInsets.symmetric( vertical: 8, horizontal: 12.sp), constraints: - const BoxConstraints(minHeight: 30), + const BoxConstraints(minHeight: 30), decoration: BoxDecoration( color: Color(0x1AFFFFFF), borderRadius: BorderRadius.circular(26.sp), ), child: Row( children: [ - if (widget.forbiddenText == null) Expanded( child: showSendSoundText ? TIMSendSoundMessage( - onDownBottom: - widget.goDownBottom, - conversationID: - widget.conversationID, - conversationType: - widget.conversationType) + onDownBottom: + widget.goDownBottom, + conversationID: + widget.conversationID, + conversationType: + widget.conversationType) : KeyboardVisibility( - child: ExtendedTextField( - style: TextStyle( - color: Colors.white, - fontSize: 14.sp), - maxLines: 4, - minLines: 1, - focusNode: widget.focusNode, - onChanged: debounceFunc, - onTap: () { - showKeyboard = true; - widget.goDownBottom(); - setState(() { - showEmojiPanel = false; - showMore = false; - }); - }, - keyboardType: - TextInputType.multiline, - textInputAction: - PlatformUtils() - .isAndroid - ? TextInputAction - .newline - : TextInputAction - .send, - onEditingComplete: () { - widget.onSubmitted(); - if (showKeyboard) { - widget.focusNode - .requestFocus(); + child: ExtendedTextField( + style: TextStyle( + color: Colors.white, + fontSize: 14.sp), + maxLines: 4, + minLines: 1, + focusNode: widget.focusNode, + onChanged: debounceFunc, + onTap: () { + showKeyboard = true; + widget.goDownBottom(); + setState(() { + showEmojiPanel = false; + showMore = false; + }); + }, + keyboardType: + TextInputType.multiline, + textInputAction: + PlatformUtils() + .isAndroid + ? TextInputAction + .newline + : TextInputAction + .send, + onEditingComplete: () { + widget.onSubmitted(); + if (showKeyboard) { + widget.focusNode + .requestFocus(); + } + setState(() { + if (widget + .textEditingController + .text + .isEmpty) { + showMoreButton = true; + } + }); + }, + textAlignVertical: + TextAlignVertical.top, + decoration: InputDecoration( + border: InputBorder.none, + hintStyle: TextStyle( + fontSize: 14.sp, + color: + Color(0xB3FFFFFF), + ), + hintText: widget.hintText, + fillColor: + Colors.transparent, + filled: true, + isDense: true, + ), + controller: widget + .textEditingController, + specialTextSpanBuilder: + PlatformUtils().isWeb + ? null + : DefaultSpecialTextSpanBuilder( + isUseDefaultEmoji: + widget + .isUseDefaultEmoji, + customEmojiStickerList: + widget + .customEmojiStickerList, + showAtBackground: + true, + )), + onChanged: (bool visibility) { + if (showKeyboard != + visibility) { + setState(() { + showKeyboard = visibility; + }); } - setState(() { - if (widget - .textEditingController - .text - .isEmpty) { - showMoreButton = true; - } - }); - }, - textAlignVertical: - TextAlignVertical.top, - decoration: InputDecoration( - border: InputBorder.none, - hintStyle: TextStyle( - fontSize: 14.sp, - color: - Color(0xB3FFFFFF), - ), - hintText: widget.hintText, - fillColor: - Colors.transparent, - filled: true, - isDense: true, - ), - controller: widget - .textEditingController, - specialTextSpanBuilder: - PlatformUtils().isWeb - ? null - : DefaultSpecialTextSpanBuilder( - isUseDefaultEmoji: - widget - .isUseDefaultEmoji, - customEmojiStickerList: - widget - .customEmojiStickerList, - showAtBackground: - true, - )), - onChanged: (bool visibility) { - if (showKeyboard != - visibility) { - setState(() { - showKeyboard = visibility; - }); - } - }), + }), ), if (widget.forbiddenText == null) const SizedBox( @@ -704,7 +711,6 @@ class _TIMTextFieldLayoutNarrowState ), ], )), - ], ), if (widget.forbiddenText == null) @@ -735,11 +741,15 @@ class _TIMTextFieldLayoutNarrowState Container( height: 40.sp, width: Get.width, - margin: EdgeInsets.only(bottom: showEmojiPanel ? Platform.isIOS ? 0.sp : 10.sp : 0), + margin: EdgeInsets.only( + bottom: showEmojiPanel + ? Platform.isIOS + ? 0.sp + : 10.sp + : 0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - GestureDetector( onTap: () { if (isBlack) { @@ -749,7 +759,7 @@ class _TIMTextFieldLayoutNarrowState getImageFile(); }, child: - Image.asset(getMsgImage('photo'), width: 40.sp), + Image.asset(getMsgImage('photo'), width: 40.sp), ), GestureDetector( onTap: () { @@ -803,9 +813,9 @@ class _TIMTextFieldLayoutNarrowState AnimatedContainer( duration: Duration( milliseconds: - (showKeyboard && PlatformUtils().isAndroid) - ? 200 - : 340), + (showKeyboard && PlatformUtils().isAndroid) + ? 200 + : 340), curve: Curves.fastOutSlowIn, height: max(_getBottomHeight(), 0.0), // child: ListView( @@ -817,7 +827,7 @@ class _TIMTextFieldLayoutNarrowState ), ), Positioned( - bottom:0, + bottom: 0, child: AnimatedContainer( duration: Duration( milliseconds: (showKeyboard && PlatformUtils().isAndroid) @@ -832,12 +842,106 @@ class _TIMTextFieldLayoutNarrowState ), ), ), + if (!showKeyboard && !showEmojiPanel) + Positioned( + top: 0, + child: Container( + padding: EdgeInsets.only(left: 10.sp, right: 10.sp), + height: 50.sp, + width: Get.width, + child: Row( + children: [ + chatActionWidget('hello', '打招呼', () async { + var reulst = await DioManager.instance.get(url: Api.msgRandOne); + String text = reulst['data']; + var result = await widget.model.sendTextMessage( + text: text, convID: widget.conversationID, convType: ConvType.c2c); + }), + chatActionWidget('wish', '许个愿', () { + Get.bottomSheet( + WishDialog( + accId: widget.userId!, + ), + isScrollControlled: true, + enableDrag: false); + }), + chatActionWidget('share_circle', '分享圈子', () { + Get.bottomSheet( + ChatCircleShareDialog( + accId: widget.userId!, + ), + isScrollControlled: true, + enableDrag: false); + }), + ], + ), + ), + ) ], ) ], ); } + chatActionWidget(String img, String action, GestureTapCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Container( + width: 80.sp, + height: 28.sp, + margin: EdgeInsets.only(right: 4.sp), + alignment: Alignment.center, + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(14.sp)), + child: Container( + decoration: BoxDecoration( + color: Color(0xFF423055), + borderRadius: BorderRadius.circular(14.sp)), + margin: EdgeInsets.all(1.sp), + alignment: Alignment.center, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + getMsgImage(img), + width: 20.sp, + ), + SizedBox( + width: 2.sp, + ), + Text( + action, + style: TextStyle(color: Colors.white, fontSize: 13.sp), + ) + ], + )), + ), + ); + } + + Future checkImStatus() async { + var data = await DioManager.instance.get(url: Api.imstate); + + int code = data['code']; + if (code == 200) { + imStatusOK = true; + } else { + if (code == 21201) { + Get.bottomSheet( + Scaffold( + backgroundColor: Colors.transparent, + body: Open_vip_tipPage(true), + ), + isScrollControlled: true, + enableDrag: false); + } + showOKToast(data['msg']); + imStatusOK = false; + } + return imStatusOK; + } + Future checkVipStatus(int plate) async { var data = await DioManager.instance.get(url: Api.getIsVips + plate.toString()); @@ -871,6 +975,12 @@ class _TIMTextFieldLayoutNarrowState return; } + isOK = await checkImStatus(); + + if (!isOK) { + return; + } + await requestStoragePermission(); XFile? pickedFile; @@ -878,8 +988,7 @@ class _TIMTextFieldLayoutNarrowState try { pickedFile = await _picker.pickVideo( - source: imageSource, maxDuration: const Duration(seconds: 30) - ); + source: imageSource, maxDuration: const Duration(seconds: 30)); if (pickedFile == null) { return; } @@ -947,6 +1056,11 @@ class _TIMTextFieldLayoutNarrowState Future getImageFile() async { bool isOK = await checkVipStatus(3); + if (!isOK) { + return; + } + isOK = await checkImStatus(); + if (!isOK) { return; } @@ -973,12 +1087,17 @@ class _TIMTextFieldLayoutNarrowState if (!isOK) { return; } - await requestStoragePermission(); + isOK = await checkImStatus(); + + if (!isOK) { + return; + } + await requestStoragePermission(); try { final XFile? pickedFile = await _picker.pickImage( source: ImageSource.camera, ); - if(null==pickedFile){ + if (null == pickedFile) { return; } widget.model.sendImageMessage( @@ -1005,7 +1124,6 @@ class _TIMTextFieldLayoutNarrowState } } - _handleCameraAndMic() async { // // 请求权限 // Map permissions = await PermissionHandler().requestPermissions( diff --git a/circle_app/lib/app/chat/view.dart b/circle_app/lib/app/chat/view.dart index 34c14bc..98854cb 100644 --- a/circle_app/lib/app/chat/view.dart +++ b/circle_app/lib/app/chat/view.dart @@ -1,5 +1,6 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:circle_app/app/chat/TIMUIKitChat/tim_uikit_chat.dart'; +import 'package:circle_app/app/chat/widget/send_gift_dialog.dart'; import 'package:circle_app/app/minefragment/logic.dart'; import 'package:circle_app/components/my_app_bar.dart'; import 'package:circle_app/main.dart'; @@ -58,6 +59,7 @@ class _ChatPageState extends State { messageInfo: event.createCustomMessageRes?.data?.messageInfo); if (sendMessageRes!.code == 0) { // 发送成功 + showOKToast('发送成功'); sendMessageRes.data?.customElem?.data; //自定义data sendMessageRes.data?.customElem?.desc; //自定义desc sendMessageRes.data?.customElem?.extension; //自定义extension @@ -168,7 +170,7 @@ class _ChatPageState extends State { ], ), customAppBar:MyAppBar( - centerTitle: con.showName != null ? con.showName! : '', + centerTitle: con != null ? con.showName! : '', actionWdiget: GestureDetector( onTap: () async{ var data = await Get.toNamed(AppRoutes.UserInfoActivity,arguments: con.userID.toString().split('_').last,preventDuplicates: false); diff --git a/circle_app/lib/app/chat/widget/chat_circle_share_dialog.dart b/circle_app/lib/app/chat/widget/chat_circle_share_dialog.dart new file mode 100644 index 0000000..e03ec49 --- /dev/null +++ b/circle_app/lib/app/chat/widget/chat_circle_share_dialog.dart @@ -0,0 +1,215 @@ +import 'dart:convert'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../network/api.dart'; +import '../../../network/dio_manager.dart'; +import '../../../util/util.dart'; +import '../../circle/logic.dart'; + +class ChatCircleShareDialog extends StatefulWidget { + String accId; + ChatCircleShareDialog({super.key,required this.accId}); + + + @override + _ChatCircleShareDialogState createState() => + new _ChatCircleShareDialogState(); + +} + +class _ChatCircleShareDialogState extends State { + // TODO: add state variables and methods + + int page = 1; + bool isMore = true; + InterestsBean circle = InterestsBean(lists: []); + ScrollController scrollController = ScrollController(); + + @override + void dispose() { + // TODO: implement dispose + super.dispose(); + scrollController.dispose(); + } + + @override + void initState() { + // TODO: implement initState + super.initState(); + scrollController.addListener(() { + if (scrollController.position.pixels == + scrollController.position.maxScrollExtent) { + if (isMore) { + page = page + 1; + loadData(); + } + } + }); + loadData(); + } + + + + loadData() async { + var data = await DioManager.instance + .get(url: Api.getMyCircleInterests, params: {"page": page,'page_size':20}); + + var bean = BaseResponse.fromJson( + data, (data) => InterestsBean.fromJson(data)); + + circle = bean.data!; + if (circle.lists.length < 20) { + isMore = false; + } + setState(() { + + }); + } + + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return GestureDetector( + onTap: () { + Get.back(); + }, + child: Scaffold( + backgroundColor: Colors.transparent, + body: Column( + children: [ + Expanded(child: Container()), + Container( + height:Get.height * 0.5, + color: Color(0xFF423055), + child: circle.lists.isEmpty + ? !isMore + ? noResultWidget() + : loaddingWidget(isMore) + : ListView.builder( + controller: scrollController, + itemBuilder: (context, index) { + if (index == circle.lists.length) { + return loaddingWidget(isMore); + } + var bean = circle.lists[index]; + + return circleInfoItemWidget( + circle.lists[index]); + }, + itemCount: circle.lists.length + 1, + ), + ) + ], + ), + + ), + ); + } + + + circleInfoItemWidget(Circle bean) { + + return Container( + margin: EdgeInsets.only(top: 10.sp, left: 10.sp, right: 10.sp), + child: Column( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(10.sp), + child: Container( + padding: EdgeInsets.only(left: 12.sp, right: 12.sp), + height: 72.sp, + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.fill, + image: AssetImage(getCircleImage('top_circle_bg')))), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 42.sp, + height: 42.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(1.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: CachedNetworkImage( + imageUrl: bean.image, + width: 40.sp, + height: 40.sp, + memCacheHeight: 40, + memCacheWidth: 40, + fit: BoxFit.cover), + ), + ), + Expanded( + child: Container( + padding: EdgeInsets.only(left: 8.sp, top: 12.sp), + // alignment: Alignment., + height: 72.sp, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + bean.title, + style: TextStyle( + color: Colors.white, + fontSize: 18.sp, + fontWeight: FontWeight.w600), + ), + SizedBox( + height: 4.sp, + ), + Text( + '${convertToTenThousand(bean.viewTotal)}人看过', + textAlign: TextAlign.left, + style: TextStyle( + color: const Color(0xff03FEFB), + fontSize: 12.sp, + ), + ), + ], + ), + )), + GestureDetector( + //分享圈子 + onTap: () async { + sendCircleCustomMsg(widget.accId, jsonEncode(bean.toJson()), '分享[${bean.title}]'); + }, + child: Stack( + alignment: Alignment.center, + children: [ + Image.asset( + getCircleImage('add'), + width: 77.sp, + ), + Text( + '立即分享', + style: TextStyle( + color: Colors.white, fontSize: 12.sp), + ) + ], + )) + ], + ), + )), + ], + ), + ); + } +} diff --git a/circle_app/lib/app/chat/widget/chat_gift_pannel.dart b/circle_app/lib/app/chat/widget/chat_gift_pannel.dart index 72851ad..dd6b688 100644 --- a/circle_app/lib/app/chat/widget/chat_gift_pannel.dart +++ b/circle_app/lib/app/chat/widget/chat_gift_pannel.dart @@ -13,8 +13,9 @@ import 'partner_option.dart'; class ChatGiftPannel extends StatefulWidget { String accid; + String giftId; int selectedIndex; - ChatGiftPannel({Key? key,required this.accid,this.selectedIndex = 0}) : super(key: key); + ChatGiftPannel({Key? key,required this.accid,this.selectedIndex = 0, this.giftId = ''}) : super(key: key); @override State createState() => _ChatGiftPannelState(); @@ -142,7 +143,7 @@ class _ChatGiftPannelState extends State child: TabBarView( controller: tabController, children: [ - Gift(widget.accid,), + Gift(widget.accid,widget.giftId), PartnerOption(accid: widget.accid), ], )) diff --git a/circle_app/lib/app/chat/widget/chat_msg_get_gift_item.dart b/circle_app/lib/app/chat/widget/chat_msg_get_gift_item.dart new file mode 100644 index 0000000..f1fcfdf --- /dev/null +++ b/circle_app/lib/app/chat/widget/chat_msg_get_gift_item.dart @@ -0,0 +1,115 @@ +import 'dart:convert'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:circle_app/common/colors/app_color.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; + +import 'chat_gift_pannel.dart'; + +class ChatMsgGetGiftItem extends StatelessWidget { + V2TimMessage message; + // TODO: add state variables, methods and constructor params + ChatMsgGetGiftItem(this.message); + + @override + Widget build(BuildContext context) { + + Map giftData = jsonDecode(message.customElem!.data!); + double price = giftData['price']; + // "msg" -> "{\"giftImageUrl\":\"http://qiniuyun.ikuayou.com/live/gifts/2.png\",\"giftName\":\"舔狗楷模\",\"gmtNotice\":\"2023-0..." + // TODO: add widget build method + return GestureDetector( + onTap: () { + if (!(message.isSelf ?? false)) { + showGiftPannel(); + } + }, + child: Container( + width: 203.sp, + child: Column( + children: [ + Container( + height: 80.sp, + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(8.sp)), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(left: 10.sp), + child: CachedNetworkImage( + imageUrl: giftData['icon'], + width: 60.sp, + height: 60.sp, + )), + Expanded( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + // color: Colors.red, + // alignment: Alignment.center, + child: Text( + '求您送我${giftData['name']}', + style: TextStyle( + color: Color(0xFFF7FAFA), fontSize: 14.sp), + overflow: TextOverflow.ellipsis, + ), + ), + SizedBox( + height: 8.sp, + ), + Container( + child: Text( + '价值${price.toInt()}小票', + style: TextStyle( + color: Color(0xFFF7FAFA), fontSize: 14.sp), + overflow: TextOverflow.ellipsis, + ), + ) + ], + ), + ), + ) + ], + ), + ), + message.isSelf! ? Container() : GestureDetector( + onTap: () { + showGiftPannel(); + }, + child: Container( + height: 30.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.sp), + gradient: const LinearGradient( + colors: [ + Color(0xFF9457FE), + Color(0xFFCF4CFF), + ], + ), + ), + child: Text('满足TA,让感情升升温',style: TextStyle(color: Colors.white),), + ), + ) + ], + ), + ), + ); + } + + showGiftPannel() { + Get.bottomSheet( + ChatGiftPannel( + accid: message.sender!.toString(), + ), + isScrollControlled: false, + enableDrag: false, + ); + } +} diff --git a/circle_app/lib/app/chat/widget/chat_msg_gift_item.dart b/circle_app/lib/app/chat/widget/chat_msg_gift_item.dart index bce12d9..3892662 100644 --- a/circle_app/lib/app/chat/widget/chat_msg_gift_item.dart +++ b/circle_app/lib/app/chat/widget/chat_msg_gift_item.dart @@ -20,7 +20,7 @@ class ChatMsgGiftItem extends StatelessWidget { // "msg" -> "{\"giftImageUrl\":\"http://qiniuyun.ikuayou.com/live/gifts/2.png\",\"giftName\":\"舔狗楷模\",\"gmtNotice\":\"2023-0..." // TODO: add widget build method return Container( - width: 203.sp, + width: MediaQuery.of(context).size.width * 0.6, color: Colors.black87, child: Column( children: [ @@ -45,7 +45,7 @@ class ChatMsgGiftItem extends StatelessWidget { ), SizedBox(height: 8.sp,), Container( - child: Text('价值${giftData['totalPrice']}豆子',style: TextStyle(color: Color(0xFFF7FAFA),fontSize: 14.sp),overflow: TextOverflow.ellipsis,), + child: Text('价值${giftData['totalPrice']}小票',style: TextStyle(color: Color(0xFFF7FAFA),fontSize: 14.sp),overflow: TextOverflow.ellipsis,), ) ], ), diff --git a/circle_app/lib/app/chat/widget/chat_msg_invent_wish_item.dart b/circle_app/lib/app/chat/widget/chat_msg_invent_wish_item.dart new file mode 100644 index 0000000..808f006 --- /dev/null +++ b/circle_app/lib/app/chat/widget/chat_msg_invent_wish_item.dart @@ -0,0 +1,95 @@ +import 'dart:convert'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; + +import '../../../common/colors/app_color.dart'; +import 'chat_gift_pannel.dart'; + +class ChatMsgInventWishItem extends StatelessWidget { + V2TimMessage message; + // TODO: add state variables, methods and constructor params + ChatMsgInventWishItem(this.message); + + @override + Widget build(BuildContext context) { + Map giftData = jsonDecode(message.customElem!.data!); + // TODO: add widget build method + return GestureDetector( + onTap: () { + if (!(message.isSelf ?? false)) { + showGiftPannel(giftData['id'].toString()); + } + }, + child: Container( + width: MediaQuery.of(context).size.width * 0.6, + child: Column( + children: [ + Container( + height: 80.sp, + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(8.sp)), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(left: 10.sp), + child: CachedNetworkImage( + imageUrl: giftData['icon'], + width: 60.sp, + height: 60.sp, + )), + Expanded( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + // color: Colors.red, + // alignment: Alignment.center, + child: Text( + '邀请你许个愿', + style: TextStyle( + color: Color(0xFFF7FAFA), fontSize: 14.sp), + overflow: TextOverflow.ellipsis, + ), + ), + SizedBox( + height: 8.sp, + ), + Container( + child: Text( + '我可以考虑满足你哦~', + style: TextStyle( + color: Color(0xFFF7FAFA), fontSize: 13.sp), + overflow: TextOverflow.ellipsis, + ), + ) + ], + ), + ), + ) + ], + ), + ), + ], + ), + ), + ); + } + + showGiftPannel(String giftId) { + Get.bottomSheet( + ChatGiftPannel( + accid: message.sender!.toString(), + giftId: giftId, + ), + isScrollControlled: false, + enableDrag: false, + ); + } + +} diff --git a/circle_app/lib/app/chat/widget/chat_msg_wish_info_item.dart b/circle_app/lib/app/chat/widget/chat_msg_wish_info_item.dart new file mode 100644 index 0000000..5ac098c --- /dev/null +++ b/circle_app/lib/app/chat/widget/chat_msg_wish_info_item.dart @@ -0,0 +1,126 @@ +import 'dart:convert'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; + +import '../../../common/colors/app_color.dart'; +import 'chat_gift_pannel.dart'; + +class ChatMsgWishInfoItem extends StatelessWidget { + + V2TimMessage message; + // TODO: add state variables, methods and constructor params + ChatMsgWishInfoItem(this.message); + + @override + Widget build(BuildContext context) { + Map giftData = jsonDecode(message.customElem!.data!); + // TODO: add widget build method + return GestureDetector( + onTap: () { + if (!(message.isSelf ?? false)) { + showGiftPannel(giftData['id'].toString()); + } + }, + child: Container( + width: MediaQuery.of(context).size.width * 0.6, + child: Column( + children: [ + Container( + height: 80.sp, + decoration: BoxDecoration( + gradient: message.isSelf! ? AppColor.mainVerLinearGradient : LinearGradient(colors: [Color(0xFF493E5C),Color(0xFF493E5C)]), + borderRadius: BorderRadius.circular(8.sp)), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(left: 10.sp), + child: CachedNetworkImage( + imageUrl: giftData['icon'], + width: 60.sp, + height: 60.sp, + )), + Expanded( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + // color: Colors.red, + // alignment: Alignment.center, + child: Text( + '许愿:想要', + style: TextStyle( + color: Color(0xFFF7FAFA), fontSize: 14.sp), + overflow: TextOverflow.ellipsis, + ), + ), + Text( + giftData['name'], + style: TextStyle( + color: AppColor.mainColor, fontSize: 14.sp), + overflow: TextOverflow.ellipsis, + ), + + ], + ), + SizedBox( + height: 8.sp, + ), + Container( + child: Text( + '感恩:${giftData['option']}', + style: TextStyle( + color: Color(0xFFF7FAFA), fontSize: 14.sp), + overflow: TextOverflow.ellipsis, + ), + ) + ], + ), + ), + ) + ], + ), + ), + message.isSelf! + ? Container() + : GestureDetector( + onTap: () { + showGiftPannel(giftData['id'].toString()); + }, + child: Container( + height: 30.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.sp), + gradient: AppColor.mainVerLinearGradient), + child: Text( + '满足TA', + style: TextStyle(color: Colors.white), + ), + ), + ) + ], + ), + ), + ); + } + + showGiftPannel(String giftId) { + Get.bottomSheet( + ChatGiftPannel( + accid: message.sender!.toString(), + giftId: giftId, + ), + isScrollControlled: false, + enableDrag: false, + ); + } + +} diff --git a/circle_app/lib/app/chat/widget/gift.dart b/circle_app/lib/app/chat/widget/gift.dart index 111c05a..2c2e2c2 100644 --- a/circle_app/lib/app/chat/widget/gift.dart +++ b/circle_app/lib/app/chat/widget/gift.dart @@ -1,3 +1,6 @@ +import 'dart:convert'; + +import 'package:circle_app/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -8,22 +11,24 @@ import 'package:circle_app/network/api.dart'; import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/util/util.dart'; +import '../../../common/Widgets/RechargeScreenDialog.dart'; import '../../../common/Widgets/base_tip_widget.dart'; class Gift extends StatefulWidget { String accid; - Gift(this.accid, {super.key}); + String giftId; + Gift(this.accid,this.giftId, {super.key}); @override _GiftState createState() => _GiftState(); } class _GiftState extends State { - var livePlatform = MethodChannel('com.flutter.liveView'); List giftList = []; String giftId = ''; String tipStr = ''; + String balanceTipStr = '充值'; String incomeBalance = ''; @@ -37,10 +42,26 @@ class _GiftState extends State { void initState() { // TODO: implement initState super.initState(); + giftId = widget.giftId; loadGiftData(); getAsset(); } + gelectThirdItem() async { + var data = await DioManager.getInstance().get(url: Api.walletRechargeSelectItem); + if (data['code'] == 200) { + // "walletRechargeSelectItemBos" -> [_GrowableList] + List response =data['data']['priceConfs']; + + incomeBalance = data['data']['balance'].toString(); + // List walletRechargeSelectItemBos = []; + AssetsDataDataPriceConfs info = AssetsDataDataPriceConfs.fromJson(response.last); + balanceTipStr = info.remark!.isNotEmpty ? '首冲最高赠送' + info.remark!.split('送').last + '>' : '充值>'; + } + + } + + @override Widget build(BuildContext context) { return Stack( @@ -102,7 +123,7 @@ class _GiftState extends State { }); }, child: Text( - '充值>', + balanceTipStr, style: TextStyle( color: AppColor.mainColor, fontSize: 12.sp, @@ -117,32 +138,33 @@ class _GiftState extends State { }, child: Container( height: 27.sp, - decoration: BoxDecoration( - color: Color(0xFF3E3D4C), - borderRadius: BorderRadius.circular(13.5.sp)), child: Row( children: [ - SizedBox( - width: 18.sp, - ), - Text( - '${giftCount}', - style: TextStyle( - color: Color(0xFFF7FAFA), - fontSize: 12.sp, - fontWeight: FontWeight.w500), - ), - SizedBox( - width: 10.sp, - ), - const Icon( - Icons.arrow_drop_down, - color: Colors.white, - size: 20, - ), - SizedBox( - width: 8.sp, + GestureDetector( + onTap: () { + if (giftId.isEmpty) { + showOKToast('请选择您想求送的礼物'); + } else { + sendGetGiftData(); + } + }, + child: Container( + width: 56.sp, + height: 27.sp, + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(13.5.sp)), + alignment: Alignment.center, + child: Text( + '求送', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + fontWeight: FontWeight.w500), + ), + ), ), + SizedBox(width: 8,), GestureDetector( onTap: () { if (giftId.isEmpty) { @@ -166,7 +188,7 @@ class _GiftState extends State { fontWeight: FontWeight.w500), ), ), - ) + ), ], ), ), @@ -184,6 +206,11 @@ class _GiftState extends State { ); } + void sendGetGiftData() async { + var info = giftList[0][selectedIndex]; + sendGetGiftCustomMsg(widget.accid, jsonEncode(info), '求您送我${info['name']}'); + } + void sendGiftData() async { var result = await DioManager.instance.post(url: Api.sendGift,params: {'accid':widget.accid,'giftId':giftId,'num':giftCount,'toUserId':widget.accid!.split('_').last}); @@ -203,6 +230,10 @@ class _GiftState extends State { List dataList = result['data']; List giftItemData = []; for (int i = 0; i < dataList.length; i++) { + var info = dataList[i]; + if (info['id'] == giftId) { + selectedIndex = i; + } giftItemData.add(dataList[i]); if (i % 7 == 0 && i != 0) { List temp = []; @@ -220,7 +251,7 @@ class _GiftState extends State { if (jsonMap['code'] == 200) { incomeBalance = jsonMap['data']['balance'].toString(); - + await gelectThirdItem(); setState(() {}); } } @@ -228,14 +259,15 @@ class _GiftState extends State { giftGridWidget(List info) { return Container( width: Get.width, - height: 245.sp, + // color: Colors.red, + height: 255.sp, padding: EdgeInsets.only(left: 16.sp, right: 16.sp), child: GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 4, - crossAxisSpacing: 8.0.sp, - mainAxisSpacing: 8.0.sp, - childAspectRatio: 0.7, + crossAxisSpacing: 0.0.sp, + mainAxisSpacing: 0.sp, + childAspectRatio: (Get.width - 32.sp) / 4 / 127.5.sp , ), itemCount: info.length, // Replace with the actual item count @@ -262,7 +294,8 @@ class _GiftState extends State { setState(() {}); }, child: Container( - height: 105.sp, + height: 127.5.sp, + // color: Colors.red, // decoration: BoxDecoration( // image: DecorationImage( // image: AssetImage(getMsgImage('gift_bg'),), @@ -276,14 +309,14 @@ class _GiftState extends State { child: Stack( fit: StackFit.expand, children: [ - isSelected ? Image.asset(getMsgImage('gift_bg')) : Container(), + isSelected ? Image.asset(getMsgImage('gift_bg'),) : Container(), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.network( info['icon'], - width: 48.sp, - height: 48.sp, + width: 70.sp, + height: 70.sp, ), Text(info['name'], style: TextStyle( diff --git a/circle_app/lib/app/chat/widget/send_gift_dialog.dart b/circle_app/lib/app/chat/widget/send_gift_dialog.dart new file mode 100644 index 0000000..2848d23 --- /dev/null +++ b/circle_app/lib/app/chat/widget/send_gift_dialog.dart @@ -0,0 +1,203 @@ +import 'package:circle_app/common/colors/app_color.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; + +import '../../../common/Widgets/base_tip_widget.dart'; +import '../../../network/api.dart'; +import '../../../network/dio_manager.dart'; +import '../../../util/util.dart'; + +class SendGiftDialog extends StatefulWidget { + String accid; + + SendGiftDialog({super.key,required this.accid}); + @override + _SendGiftDialogState createState() => new _SendGiftDialogState(); + +} + +class _SendGiftDialogState extends State { + // TODO: add state variables and methods + List giftList = []; + String giftId = ''; + String withStr = ''; + int selectedIndex = -1; + + + @override + void initState() { + // TODO: implement initState + super.initState(); + loadGiftData(); + } + + void loadGiftData() async { + var result = await DioManager.instance.get(url: Api.giftList); + if (result['code'] == 200) { + giftList = result['data']; + setState(() {}); + } + } + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return Scaffold( + backgroundColor: Colors.transparent, + body: Center( + child: Container( + height: 255.sp, + margin: EdgeInsets.only(left: 15.sp,right: 15.sp), + padding: EdgeInsets.only(left: 15.sp,right: 15.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.sp), + gradient: LinearGradient(colors: [Color(0xFF4C3E5F),Color(0xFF324140)]), + border: GradientBoxBorder( + gradient: + AppColor.mainVerLinearGradient, + width: 1.sp, + ), + ), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(top: 18.sp), + child: Text( + '今天找TA聊天的人有点多哦,为了避免打扰你需要赠送个礼物给TA才能继续聊天哈~', + style: TextStyle(color: Colors.white, fontSize: 15.sp), + ), + ), + Container( + height: 102.sp, + margin: EdgeInsets.only(top: 12.sp,), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.sp), + gradient: LinearGradient( + colors: [Color(0xFF132B40), Color(0xFF251240)])), + child: giftGridWidget(), + ), + Container( + margin: EdgeInsets.only(top: 25.sp,), + padding: EdgeInsets.only(left: 15.sp, right: 15.sp), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Get.back(); + }, + child: Container( + height: 42.sp, + width: 136.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + color: Color(0x26FFFFFF) + ), + alignment: Alignment.center, + child: Text( + '放弃', + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ), + ), + ), + GestureDetector( + onTap: () async { + if (selectedIndex < 0) { + showOKToast('请选择一个礼物'); + return; + } + var result = await DioManager.instance.post(url: Api.sendGift,params: {'accid':widget.accid,'giftId':giftId,'num':1,'toUserId':widget.accid!.split('_').last}); + if (result['code'] == 200) { + showOKToast('赠送成功'); + Get.back(); + } else if (result['code'] == 31201) { + showOKToast(result['msg']); + showRechargeScreenDialog(); + } + + }, + child: Container( + height: 42.sp, + width: 136.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + gradient: AppColor.mainVerLinearGradient + ), + child: Text( + '赠送', + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ), + ), + ), + ], + ), + ) + ], + ), + ), + ), + ); + } + + + giftGridWidget() { + return Container( + width: Get.width, + height: 102.sp, + padding: + EdgeInsets.only(left: 10.sp, right: 10.sp, top: 10.sp, bottom: 10.sp), + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: giftList.length, + itemBuilder: (context, index) { + // Replace the placeholders with the actual item widgets + return giftItemWidget(giftList[index], index); + }, + ), + ); + } + + giftItemWidget(Map info, int index) { + bool isSelected = giftId.contains(info['id'].toString()); + double price = info['price']; + + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + selectedIndex = index; + giftId = info['id'].toString(); + // tipStr = info['topHours'] != null ? info['topHours'].toString() : ''; + setState(() {}); + }, + child: Container( + height: 78.sp, + width: 78.sp, + child: Stack( + fit: StackFit.expand, + children: [ + isSelected ? Image.asset(getMsgImage('gift_bg')) : Container(), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.network( + info['icon'], + width: 65.sp, + height: 65.sp, + ), + ], + ) + ], + ), + ), + ); + } +} diff --git a/circle_app/lib/app/chat/widget/svg_dialog.dart b/circle_app/lib/app/chat/widget/svg_dialog.dart new file mode 100644 index 0000000..4108b0f --- /dev/null +++ b/circle_app/lib/app/chat/widget/svg_dialog.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:svgaplayer_flutter/parser.dart'; +import 'package:svgaplayer_flutter/player.dart'; + +class SvgDialog extends StatefulWidget { + String url; + SvgDialog({Key? key,required this.url}) : super(key: key); + + @override + _SvgDialogState createState() => _SvgDialogState(); +} + +class _SvgDialogState extends State + with SingleTickerProviderStateMixin { + late SVGAAnimationController animationController; + + @override + void initState() { + animationController = SVGAAnimationController(vsync: this); + loadAnimation(); + super.initState(); + } + + @override + void dispose() { + this.animationController.dispose(); + super.dispose(); + } + + void loadAnimation() async { + final videoItem = await SVGAParser.shared.decodeFromURL( + widget.url); + animationController.videoItem = videoItem; + animationController + .forward() // Try to use .forward() .reverse() + .whenComplete(() { + Get.back(); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.transparent, + body: RSizedBox( + width: Get.width, + height: Get.height, + child: SVGAImage(animationController,fit: BoxFit.cover,), + ), + ); + } +} diff --git a/circle_app/lib/app/chat/widget/wish_dialog.dart b/circle_app/lib/app/chat/widget/wish_dialog.dart new file mode 100644 index 0000000..702fa33 --- /dev/null +++ b/circle_app/lib/app/chat/widget/wish_dialog.dart @@ -0,0 +1,286 @@ +import 'dart:convert'; + +import 'package:circle_app/common/colors/app_color.dart'; +import 'package:circle_app/util/util.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_pickers/pickers.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../network/api.dart'; +import '../../../network/dio_manager.dart'; +import '../../circle/view.dart'; + +class WishDialog extends StatefulWidget { + String accId; + + WishDialog({super.key, required this.accId}); + @override + _WishDialogState createState() => new _WishDialogState(); +} + +class _WishDialogState extends State { + // TODO: add state variables and methods + List giftList = []; + String giftId = ''; + String withStr = ''; + int selectedIndex = -1; + + List optionList = [ + '分享一张本人照片', + '给你我的联系方式', + '来一场浪漫的约会', + '来一次真诚的告白', + '玩一个刺激的游戏', + '透露一个小秘密', + '一起聊天半小时' + ]; + + @override + void initState() { + // TODO: implement initState + super.initState(); + loadGiftData(); + } + + void loadGiftData() async { + var result = await DioManager.instance.get(url: Api.giftList); + if (result['code'] == 200) { + giftList = result['data']; + setState(() {}); + } + } + + giftGridWidget() { + return Container( + width: Get.width, + height: 102.sp, + padding: + EdgeInsets.only(left: 10.sp, right: 10.sp, top: 10.sp, bottom: 10.sp), + child: ListView.builder( + scrollDirection: Axis.horizontal, + itemCount: giftList.length, + itemBuilder: (context, index) { + // Replace the placeholders with the actual item widgets + return giftItemWidget(giftList[index], index); + }, + ), + ); + } + + giftItemWidget(Map info, int index) { + bool isSelected = giftId.contains(info['id'].toString()); + double price = info['price']; + + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + selectedIndex = index; + giftId = info['id'].toString(); + // tipStr = info['topHours'] != null ? info['topHours'].toString() : ''; + setState(() {}); + }, + child: Container( + height: 78.sp, + width: 78.sp, + child: Stack( + fit: StackFit.expand, + children: [ + isSelected ? Image.asset(getMsgImage('gift_bg')) : Container(), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.network( + info['icon'], + width: 65.sp, + height: 65.sp, + ), + ], + ) + ], + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + // TODO: add widget build method + return Scaffold( + backgroundColor: Colors.transparent, + body: Column( + children: [ + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + Get.back(); + }, + child: Container())), + SafeArea( + child: Container( + padding: EdgeInsets.only(left: 15.sp, right: 15.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.sp), + bottomRight: Radius.circular(10.sp)), + color: Color(0xFF423055), + ), + child: Column( + children: [ + Container( + margin: EdgeInsets.only(top: 8.sp, bottom: 15.sp), + width: 30.sp, + height: 3.sp, + decoration: BoxDecoration( + color: Color(0x33FFFFFF), + borderRadius: BorderRadius.circular(1.5.sp)), + ), + Text( + '对方满足你的愿望后要尽快兑现承诺哈,感恩是你们建立稳定关系的保障哦~', + style: TextStyle(color: Colors.white, fontSize: 15.sp), + ), + Container( + height: 102.sp, + margin: EdgeInsets.only(top: 12.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.sp), + gradient: LinearGradient( + colors: [Color(0xFF132B40), Color(0xFF251240)])), + child: giftGridWidget(), + ), + Container( + height: 30.sp, + padding: EdgeInsets.only(left: 10.sp, right: 10.sp), + margin: EdgeInsets.only(top: 12.sp), + decoration: BoxDecoration( + color: Color(0x1AFFFFFF), + borderRadius: BorderRadius.circular(15.sp)), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '选择感恩方式', + style: TextStyle( + color: Color(0xB3FFFFFF), fontSize: 15.sp), + ), + GestureDetector( + onTap: () { + showOptionPiker(withStr); + }, + behavior: HitTestBehavior.opaque, + child: Row( + children: [ + Text( + withStr.isNotEmpty ? withStr : '请选择', + style: TextStyle( + color: withStr.isNotEmpty + ? AppColor.mainColor + : Colors.white, + fontSize: 15.sp), + ), + Image.asset( + getHomeImage('icon_in'), + width: 24.sp, + ) + ], + ), + ) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 12.sp, bottom: 15.sp), + padding: EdgeInsets.only(left: 30.sp, right: 30.sp), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + if (selectedIndex < 0) { + showOKToast('请选择一个礼物'); + return; + } + var info = giftList[selectedIndex]; + + sendInventWishCustomMsg( + widget.accId, jsonEncode(info), '邀请你许个愿'); + }, + child: Container( + height: 42.sp, + width: 136.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + gradient: AppColor.mainVerLinearGradient, + ), + alignment: Alignment.center, + child: Text( + '邀请对方许愿', + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ), + ), + ), + GestureDetector( + onTap: () { + if (selectedIndex < 0) { + showOKToast('请选择一个礼物'); + return; + } else if (withStr.isEmpty) { + showOKToast('请选择感恩方式'); + return; + } + var info = giftList[selectedIndex]; + info['option'] = withStr; + sendGetWishCustomMsg( + widget.accId, jsonEncode(info), '许愿:想要${info['name']}'); + }, + child: Container( + height: 42.sp, + width: 136.sp, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(21.sp), + gradient: const LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFF7660FF), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + child: Text( + '立即许愿', + style: TextStyle( + color: Colors.white, + fontSize: 16.sp, + fontWeight: FontWeight.w600), + ), + ), + ), + ], + ), + ) + ], + ), + ), + ) + ], + ), + ); + } + + showOptionPiker(String text) { + Pickers.showSinglePicker(context, + pickerStyle: DefaultPickerStyle.dark(), + data: optionList, + selectData: text.isNotEmpty ? text : optionList.first, + onConfirm: (p, position) { + withStr = p; + setState(() {}); + }); + } +} diff --git a/circle_app/lib/app/circle/logic.dart b/circle_app/lib/app/circle/logic.dart index 2c0492d..8c2db5b 100644 --- a/circle_app/lib/app/circle/logic.dart +++ b/circle_app/lib/app/circle/logic.dart @@ -66,8 +66,9 @@ class CircleLogic extends GetxController { initGerder(); getCityList(); - getBanner(); - getNearByList(); + // getBanner(); + // getNearByList(); + EventBusManager.on().listen((event) { myVip = event.vip; @@ -390,7 +391,7 @@ class VicinityItemBean { }); factory VicinityItemBean.fromJson(Map json) { - var interestList = json['interests'] as List; + var interestList = json['interests'] != null ? json['interests'] as List : []; List interests = interestList.map((interest) => Interest.fromJson(interest)).toList(); @@ -416,7 +417,7 @@ class VicinityItemBean { orientationName: json['orientation_name'], bgPicUrl: json['bg_picUrl'], onlineFlag: json['online_flag'], - isOnline: json['isOnline'], + isOnline: json['isOnline'] == 1 || json['isOnline'] == true, ); } } diff --git a/circle_app/lib/app/circle/widgets/vicinity.dart b/circle_app/lib/app/circle/widgets/vicinity.dart index 1f73826..293c9b1 100644 --- a/circle_app/lib/app/circle/widgets/vicinity.dart +++ b/circle_app/lib/app/circle/widgets/vicinity.dart @@ -33,6 +33,8 @@ class _VicinityState extends State with AutomaticKeepAliveClientMixin void initState() { // TODO: implement initState super.initState(); + widget.logic.getBanner(); + widget.logic.getNearByList(); sub = EventBusManager.on().listen((event) { // if (widget.logic.myVip > 0) { _scrollController.animateTo(0, diff --git a/circle_app/lib/app/externalshare/logic.dart b/circle_app/lib/app/externalshare/logic.dart index a1015ef..9b9762e 100644 --- a/circle_app/lib/app/externalshare/logic.dart +++ b/circle_app/lib/app/externalshare/logic.dart @@ -36,9 +36,8 @@ class ExternalshareLogic extends GetxController { showOKToast("请上传图片"); return ; } - String jsonString = jsonEncode(state.imaglist); - var data = await DioManager.instance.post(url:' Api.UPDATE_EXTERNAL_SHARE', params: { - 'picUrl':jsonString + var data = await DioManager.instance.post(url:Api.offSite, params: { + 'picUrl':state.imaglist }); if(data["code"]==200){ Get.back(); diff --git a/circle_app/lib/app/externalshare/view.dart b/circle_app/lib/app/externalshare/view.dart index 1af6fe5..443e677 100644 --- a/circle_app/lib/app/externalshare/view.dart +++ b/circle_app/lib/app/externalshare/view.dart @@ -58,12 +58,12 @@ class ExternalsharePage extends StatelessWidget { ), SizedBox(height: 8.sp), buildRichText( - "1. 站外平台粉丝达到1000人以上,发新动态置顶一天,可获得1000豆子;"), + "1. 站外平台粉丝达到1000人以上,发新动态置顶一天,可获得1000小票;"), SizedBox(height: 8.sp), - buildRichText("2. 邀请海报发到微信朋友圈或QQ动态(删除无效),可获得100豆子;"), + buildRichText("2. 邀请海报发到微信朋友圈或QQ动态(删除无效),可获得100小票;"), SizedBox(height: 8.sp), buildRichText( - "3. 分享到圈内群聊(QQ、微信、B站、快手、抖音、微博、推特或其他平台均有效),群里有多少人点击就获得多少豆子。"), + "3. 分享到圈内群聊(QQ、微信、B站、快手、抖音、微博、推特或其他平台均有效),群里有多少人点击就获得多少小票。"), SizedBox(height: 24.sp), buildRichText("*上传分享截图"), @@ -77,6 +77,9 @@ class ExternalsharePage extends StatelessWidget { gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, // 每行显示的项目数量 + crossAxisSpacing: 10.sp, + mainAxisSpacing: 10.sp, + childAspectRatio: 1.0 ), itemCount: logic.state.imaglist.length < 9 ? logic.state.imaglist.length + 1 @@ -91,10 +94,11 @@ class ExternalsharePage extends StatelessWidget { logic.getImageFile(); }, child: Container( - margin: EdgeInsets.all(5.sp), + child: Image( + fit: BoxFit.cover, image: AssetImage( - getMineImage("icon_img_add")), + getMineImage("icon_img_add"),), ), ), ); diff --git a/circle_app/lib/app/home/binding.dart b/circle_app/lib/app/home/binding.dart index 5cbedcd..5fe8e2e 100644 --- a/circle_app/lib/app/home/binding.dart +++ b/circle_app/lib/app/home/binding.dart @@ -1,4 +1,5 @@ import 'package:circle_app/app/circle/logic.dart'; +import 'package:circle_app/app/msg/logic.dart'; import 'package:get/get.dart'; import '../minefragment/logic.dart'; @@ -9,6 +10,7 @@ class HomeBinding extends Bindings { void dependencies() { Get.lazyPut(() => HomeLogic()); Get.lazyPut(() => CircleLogic()); + Get.lazyPut(() => MsgLogic()); Get.lazyPut(() => MinefragmentLogic()); } } diff --git a/circle_app/lib/app/home/logic.dart b/circle_app/lib/app/home/logic.dart index af7e536..4c6fe74 100644 --- a/circle_app/lib/app/home/logic.dart +++ b/circle_app/lib/app/home/logic.dart @@ -3,17 +3,21 @@ import 'dart:convert'; import 'dart:io'; +import 'package:circle_app/app/chat/widget/svg_dialog.dart'; import 'package:circle_app/app/circle/logic.dart'; import 'package:circle_app/app/like/view.dart'; import 'package:circle_app/app/minefragment/logic.dart'; +import 'package:circle_app/app/msg/logic.dart'; import 'package:circle_app/main.dart'; import 'package:circle_app/network/api.dart'; import 'package:circle_app/network/dio_manager.dart'; import 'package:circle_app/util/util.dart'; +import 'package:event_bus/event_bus.dart'; import 'package:flutter/material.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:get/get.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart'; import 'package:tencent_cloud_chat_uikit/data_services/core/core_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'; @@ -30,7 +34,6 @@ import 'state.dart'; class HomeLogic extends GetxController with WidgetsBindingObserver { late TabController tabController; - int currentIndex = 0; Widget currentPage = Container(); @@ -111,7 +114,7 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { Map jsonData = json.decode(customData); int event = jsonData['event']; Map content = jsonData['content']; - switch(event){ + switch(event) { case 1://关注 String ageMsg = "${content['genderName']}·${content['age']}·${content['roleName']}·${content['orientationName']}"; if(content['isFollow']==1){//互关 @@ -145,16 +148,35 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { .v2TIMMessageManager.addAdvancedMsgListener( listener: V2TimAdvancedMsgListener( onRecvNewMessage: (message) { + getUnreadSize(); print(message); if (message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) { if ( message.customElem?.data != null) { print(message.customElem!.data!); Map jsonData = jsonDecode(message.customElem!.data!); - String event = jsonData['event'].toString(); - if (int.parse(event) == 3) { - showOKToast(message.customElem!.desc!.toString()); - EventBusManager.fire(LikeRefresh()); + if (jsonData.containsKey('event')) { + String event = jsonData['event'].toString(); + if (int.parse(event) == 3) { + showOKToast(message.customElem!.desc!.toString()); + EventBusManager.fire(LikeRefresh()); + } else if (int.parse(event) == 5) { + + // print(jsonData.toString()); + var info = jsonDecode(jsonData['content']); + TencentImSDKPlugin.v2TIMManager.v2ConversationManager.pinConversation(conversationID: 'c2c_' + info['fromImId'], isPinned: info['top'] == 1); + } + } else if (jsonData.containsKey('type')) { + int type = jsonData['type']; + if (type == 1) { + String giftUrl = jsonData['gifUrl']; + if (giftUrl.isNotEmpty) { + Get.bottomSheet(SvgDialog(url: giftUrl),isScrollControlled: true, + enableDrag: false,isDismissible:false); + } + + } } + } } } @@ -312,7 +334,8 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { final logic = Get.put(MinefragmentLogic()); logic.getMode(); } else if (index == 2) { - getUnreadSize(); + final logic = Get.find(); + logic.loadChatData(); } update(); } @@ -373,3 +396,10 @@ class HomeLogic extends GetxController with WidgetsBindingObserver { } } } + + +class conTop { + bool isTop; + String conId; + conTop(this.isTop,this.conId); +} \ No newline at end of file diff --git a/circle_app/lib/app/likelist/logic.dart b/circle_app/lib/app/likelist/logic.dart index a289651..c4933c1 100644 --- a/circle_app/lib/app/likelist/logic.dart +++ b/circle_app/lib/app/likelist/logic.dart @@ -4,6 +4,7 @@ import 'package:pull_to_refresh/pull_to_refresh.dart'; import '../../network/api.dart'; import '../../network/dio_manager.dart'; +import '../../util/eventBus.dart'; import '../../util/util.dart'; import 'state.dart'; @@ -23,9 +24,21 @@ class LikelistLogic extends GetxController { @override void onInit() async { super.onInit(); - var mineLogic = Get.find(); - isVip = mineLogic.isVip.value; + // var mineLogic = Get.find(); + // isVip = mineLogic.isVip.value; + await loadMyInfo(); initList(); + + } + + loadMyInfo() async { + var data = await DioManager.instance.get(url: Api.getUserMine); + var bean = BaseResponse.fromJson( + data, (data) => MineResponseBean.fromJson(data)); + if (bean.isSuccess()) { + isVip = bean.data.user.vip; + update(); + } } initList() async { diff --git a/circle_app/lib/app/likelist/view.dart b/circle_app/lib/app/likelist/view.dart index ed91ff0..e618161 100644 --- a/circle_app/lib/app/likelist/view.dart +++ b/circle_app/lib/app/likelist/view.dart @@ -10,16 +10,39 @@ import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import '../../components/my_app_bar.dart'; +import '../../main.dart'; import '../../router/app_routers.dart'; import '../../util/util.dart'; import 'logic.dart'; -class LikelistPage extends StatelessWidget { +class LikelistPage extends StatefulWidget { LikelistPage({Key? key}) : super(key: key); + @override + State createState() => _LikelistPageState(); +} + +class _LikelistPageState extends State with RouteAware { final logic = Get.find(); + final state = Get.find().state; + @override + void didChangeDependencies() { + // TODO: implement didChangeDependencies + super.didChangeDependencies(); + + /// 路由订阅 + routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute); + } + + @override + void didPopNext() { + // TODO: implement didPopNext + super.didPopNext(); + logic.loadMyInfo(); + } + @override Widget build(BuildContext context) { return GetBuilder(builder: (logic) { @@ -55,7 +78,6 @@ class LikelistPage extends StatelessWidget { }); } - Widget showGd() { double interval = 50; List urlList = []; @@ -413,7 +435,6 @@ class LikelistPage extends StatelessWidget { logic.initList(); } - showRechargeDialog() async { MinefragmentLogic ctr = Get.find(); Get.bottomSheet( diff --git a/circle_app/lib/app/login/login/view.dart b/circle_app/lib/app/login/login/view.dart index 7022ea0..944284d 100644 --- a/circle_app/lib/app/login/login/view.dart +++ b/circle_app/lib/app/login/login/view.dart @@ -1,8 +1,10 @@ +import 'package:circle_app/common/colors/app_color.dart'; import 'package:circle_app/util/util.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; import 'logic.dart'; @@ -59,16 +61,17 @@ class LoginPage extends StatelessWidget { // bottom: 0, child: Container( - width: 280.sp, - height: 60.sp, - decoration: BoxDecoration( - // color: Colors.white60, - borderRadius: - BorderRadius.circular(30.sp), - border: Border.all( - color: Colors.white60, - width: 0.5.sp)), - )), + width: 280.sp, + height: 60.sp, + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(30.sp), + border: GradientBoxBorder( + gradient: + AppColor.mainVerLinearGradient, + width: 1.sp, + ), + ))), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -132,16 +135,18 @@ class LoginPage extends StatelessWidget { // bottom: 0, child: Container( - width: 280.sp, - height: 60.sp, - decoration: BoxDecoration( - // color: Colors.white60, - borderRadius: - BorderRadius.circular(30.sp), - border: Border.all( - color: Colors.white60, - width: 0.5.sp)), - )), + width: 280.sp, + height: 60.sp, + decoration: BoxDecoration( + // color: Colors.white60, + borderRadius: + BorderRadius.circular(30.sp), + border: GradientBoxBorder( + gradient: AppColor + .mainVerLinearGradient, + width: 1.sp, + ), + ))), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -229,16 +234,18 @@ class LoginPage extends StatelessWidget { // bottom: 0, child: Container( - width: 280.sp, - height: 60.sp, - decoration: BoxDecoration( - // color: Colors.white60, - borderRadius: - BorderRadius.circular(30.sp), - border: Border.all( - color: Colors.white60, - width: 0.5.sp)), - )), + width: 280.sp, + height: 60.sp, + decoration: BoxDecoration( + // color: Colors.white60, + borderRadius: + BorderRadius.circular(30.sp), + border: GradientBoxBorder( + gradient: AppColor + .mainVerLinearGradient, + width: 1.sp, + ), + ))), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -280,15 +287,14 @@ class LoginPage extends StatelessWidget { ], ), ), - GestureDetector( onTap: () { logic.loginType = logic.loginType == 0 ? 1 : 0; logic.update(); }, child: Container( - width:280.sp, - margin: EdgeInsets.only(top: 15.sp,right: 0.sp), + width: 280.sp, + margin: EdgeInsets.only(top: 15.sp, right: 0.sp), alignment: Alignment.centerRight, child: Text( logic.loginType == 1 ? '验证码登录' : '密码登录', @@ -297,7 +303,6 @@ class LoginPage extends StatelessWidget { ), ), ), - ], ), ), diff --git a/circle_app/lib/app/minefragment/view.dart b/circle_app/lib/app/minefragment/view.dart index 15e11e6..c7f3e01 100644 --- a/circle_app/lib/app/minefragment/view.dart +++ b/circle_app/lib/app/minefragment/view.dart @@ -165,7 +165,7 @@ class _MinefragmentPageState extends State with RouteAware { return Column( - children: [_myAssetItemView(),_circleItemView(logic),_invienItemView(),_editGoodReviewItemView(), _helpItemView(),_setUpItemView()], + children: [_myAssetItemView(),_circleItemView(logic),_invienItemView(),_shareItemView(),_editGoodReviewItemView(), _helpItemView(),_setUpItemView()], ); } @@ -411,6 +411,10 @@ class _MinefragmentPageState extends State with RouteAware { ), Row( children: [ + Text( + '免费领小票', + style: const TextStyle(color: Colors.white60), + ), Image( image: AssetImage(getHomeImage("icon_in")), width: 24.sp, diff --git a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart index fdc18bd..fdc002c 100644 --- a/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart +++ b/circle_app/lib/app/msg/TIMUIKitConversation/tim_uikit_conversation.dart @@ -1,9 +1,7 @@ import 'dart:convert'; import 'dart:math'; -import 'package:circle_app/util/util.dart'; 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:scroll_to_index/scroll_to_index.dart'; @@ -11,7 +9,6 @@ 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/data_services/core/tim_uikit_wide_modal_operation_key.dart'; import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; @@ -19,7 +16,6 @@ import 'package:tencent_cloud_chat_uikit/ui/controller/tim_uikit_conversation_co import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/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_cloud_chat_uikit/ui/widgets/wide_popup.dart'; @@ -141,6 +137,8 @@ class ConversationItemSlidePanel extends TIMUIKitStatelessWidget { /// A label to display below the [icon]. final String? label; + + @override Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { return SlidableAction( @@ -162,11 +160,11 @@ class _TIMConversationState extends TIMUIKitState { final TUIThemeViewModel themeViewModel = serviceLocator(); // final TUIFriendShipViewModel friendShipViewModel = // serviceLocator(); - bool hasMore = true; @override void initState() { super.initState(); + final controller = getController(); widget.scrollController!.addListener(() { diff --git a/circle_app/lib/app/msg/logic.dart b/circle_app/lib/app/msg/logic.dart index d6923d0..5986dbc 100644 --- a/circle_app/lib/app/msg/logic.dart +++ b/circle_app/lib/app/msg/logic.dart @@ -1,9 +1,13 @@ import 'package:circle_app/app/likelist/logic.dart'; import 'package:circle_app/network/api.dart'; import 'package:circle_app/network/dio_manager.dart'; +import 'package:circle_app/util/util.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import '../../common/Widgets/base_tip_widget.dart'; +import '../circle/logic.dart'; import 'state.dart'; class MsgLogic extends GetxController { @@ -11,12 +15,15 @@ class MsgLogic extends GetxController { List lists = []; ScrollController listScrollController = ScrollController(); + List chatList = []; + + int total = 0; @override void onInit() { // TODO: implement onInit super.onInit(); - + loadChatData(); loadLikeData(); } loadLikeData() async { @@ -32,4 +39,114 @@ class MsgLogic extends GetxController { } update(); } + + void loadChatData() async { + var data = + await DioManager.instance.post(url: Api.recommendQuickChatUser, params: { + 'page':1, + 'pageSize':8 + }); + if (data['code'] == 200) { + total = data['data']['total']; + chatList = data['data']['lists']; + } + + // vicinityList = bean.data.lists; + update(); + } + + + Future queryQuickStart() async { + var data = + await DioManager.getInstance().get(url: Api.queryQuickStart); + if (data["code"] == 200) { + if (data["data"] == 0) { + var data = await DioManager.getInstance() + .get(url: Api.startQuick); + if (data["code"] == 200) { + showOKToast("已开启速聊"); + loadChatData(); + return true; + } else if (data["code"] == 10102) { + showRechargeScreenDialog(); + } + } else if (data["data"] == 1) { + + showOKToast("速聊开启中"); + return false; + } + } + return false; + } + + stopQueryQuick()async{ + var data = + await DioManager.getInstance().get(url: Api.stopQuick); + if (data["code"] == 200) { + showOKToast('操作成功'); + loadChatData(); + } + + } + + Future callOrhers() async { + var data = await DioManager.getInstance().post(url: Api.callOthers); + + if (data["code"] == 200) { + showOKToast("已成功召唤三十人,请耐心等待TA的回复哈~"); + return true; + } else if(data["code"] == 10081){ + showOKToast(data["msg"]); + showRechargeScreenDialog(); + + }else{ + showOKToast(data["msg"]); + } + return false; + } + + + showTipPop() { + Get.bottomSheet( + CupertinoActionSheet( + title: Text( + '上速聊推荐可以让更多人看到你', + style: TextStyle(fontSize: 22.sp), + ), //标题 + //提示内容 + actions: [ + //操作按钮集合 + CupertinoActionSheetAction( + onPressed: () { + Get.back(); + queryQuickStart(); + }, + child: const Text('冲到第一'), + ), + CupertinoActionSheetAction( + onPressed: () { + callOrhers(); + Get.back(); + + }, + child: const Text('一键呼唤三十位您想认识的人'), + ), + CupertinoActionSheetAction( + onPressed: () { + Get.back(); + stopQueryQuick(); + }, + child: const Text('不显示在速聊列表'), + ), + ], + cancelButton: CupertinoActionSheetAction( + //取消按钮 + onPressed: () { + Get.back(); + }, + child: const Text('取消'), + ), + ), + isScrollControlled: true); + } } diff --git a/circle_app/lib/app/msg/view.dart b/circle_app/lib/app/msg/view.dart index 83ab615..ebca571 100644 --- a/circle_app/lib/app/msg/view.dart +++ b/circle_app/lib/app/msg/view.dart @@ -31,7 +31,8 @@ class MsgPage extends StatefulWidget { } class _MsgPageState extends State with AutomaticKeepAliveClientMixin { - final ctr = Get.put(MsgLogic()); + // final ctr = Get.put(MsgLogic()); + final ctr = Get.find(); var logic = Get.find(); void getPipeiData() async { var data = await DioManager.instance @@ -73,10 +74,10 @@ class _MsgPageState extends State with AutomaticKeepAliveClientMixin { return Column( children: [ navigatorItem(controller), - // tipWidget(), - // reconmandWidget(), + tipWidget(), + reconmandWidget(), // Text(controller.state.msg), - Expanded(child: TIMConversation( + Expanded(child: TIMConversation( autoScrollController: logic.scrollController, scrollController: logic.listScrollController, onTapItem: (selectedConv) async{ @@ -246,7 +247,7 @@ class _MsgPageState extends State with AutomaticKeepAliveClientMixin { margin: EdgeInsets.only(top: 18.sp, bottom: 15.sp), padding: EdgeInsets.only(left: 16.sp, right: 12.sp), width: Get.width, - height: 20, + height: 20.sp, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -259,13 +260,7 @@ class _MsgPageState extends State with AutomaticKeepAliveClientMixin { ), GestureDetector( onTap: () async{ - V2TimConversation conv = V2TimConversation( - type: 1, - userID: '10040818', - conversationID: 'c2c_10040818', - showName: '456'); - Get.toNamed(AppRoutes.Chat, arguments: conv); - + Get.toNamed(AppRoutes.Quick); }, child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -279,7 +274,7 @@ class _MsgPageState extends State with AutomaticKeepAliveClientMixin { ).createShader(Offset.zero & bounds.size); }, child: Text( - 'n人等您聊', + '${ctr.total}人等您聊', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, @@ -302,65 +297,176 @@ class _MsgPageState extends State with AutomaticKeepAliveClientMixin { return Container( padding: EdgeInsets.only(left: 16.sp, right: 18.sp), width: Get.width, + height: 80.sp, child: Row( children: [ - Column( - children: [ - Image.asset( - getMsgImage('msg_first'), - width: 50.sp, - ), - SizedBox( - height: 4.sp, - ), - Text( - '抢占第一', - style: TextStyle(color: Colors.white, fontSize: 12.sp), - ), - ], + GestureDetector( + onTap: () { + ctr.showTipPop(); + }, + child: Column( + children: [ + Image.asset( + getMsgImage('msg_first'), + width: 50.sp, + ), + SizedBox( + height: 4.sp, + ), + Text( + '抢占第一', + style: TextStyle(color: Colors.white, fontSize: 12.sp), + ), + ], + ), ), Expanded( - child: SingleChildScrollView( + child: ListView.builder( scrollDirection: Axis.horizontal, - child: Container( - // width: 50.sp * 10, - child: Row( - children: [ - peopleWidget(), - peopleWidget(), - peopleWidget(), - peopleWidget(), - peopleWidget(), - peopleWidget(), - peopleWidget(), - peopleWidget(), - peopleWidget(), - peopleWidget(), - ], - ), - ), + itemBuilder: (contenxt, index) { + if (index == ctr.chatList.length) { + return MoreItem(); + } + return peopleWidget(ctr.chatList[index]); + }, + itemCount: ctr.chatList.length + 1, )) ], ), ); } - peopleWidget() { - return Container( - margin: EdgeInsets.only(left: 18.sp), - child: Column( + Widget MoreItem() { + return GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.Quick); + }, + child: Container( + // width: 68.sp, + margin: EdgeInsets.only(left: 12.sp), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Stack( + children: [ + Center( + child: ClipOval( + child: Container( + color: Colors.black, + width: 50.sp, + height: 50.sp, + ), + ), + ), + Center( + child: ClipOval( + child: Image.asset( + getHomeImage("im_more"), + width: 50.sp, + // height: 48.sp, + ), + ), + ), + ], + ), + SizedBox(height: 4.0.sp), + Center( + child: Text( + "查看更多", + overflow: TextOverflow.ellipsis, + maxLines: 1, + style: TextStyle( + fontSize: 12.0.sp, + color: Colors.white, // Replace with desired text color + ), + ), + ), + ], + ), + ), + ); + } + + + topWidget() { + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () { + ctr.showTipPop(); + }, + child: Container( + margin: EdgeInsets.only(left: 18.sp), + child: Column( + children: [ + Image.asset( + getMsgImage('msg_first'), + width: 50.sp, + ), + SizedBox( + height: 4.sp, + ), + Text( + '抢占第一', + style: TextStyle(color: Colors.white, fontSize: 12.sp), + ), + ], + ), + ), + ); + } + + peopleWidget(Map info) { + return GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.UserInfoActivity,arguments: info['id'].toString()); + }, + child: Stack( + children: [ - Image.asset( - getMsgImage('msg_first'), - width: 50.sp, - ), - SizedBox( - height: 4.sp, - ), - Text( - '抢占第一', - style: TextStyle(color: Colors.white, fontSize: 12.sp), + Container( + margin: EdgeInsets.only(left: 12.sp), + child: Column( + children: [ + Stack( + alignment: Alignment.center, + children: [ + Container( + height: 52.sp, + width: 52.sp, + decoration: BoxDecoration( + gradient: AppColor.mainVerLinearGradient, + borderRadius: BorderRadius.circular(26.sp) + ), + ), + ClipOval( + child: Image.network( + info['avatar'], + fit: BoxFit.cover, + width: 50.sp, + height: 50.sp, + ), + ), + ], + ), + SizedBox( + height: 4.sp, + ), + Text( + info['nickname'] ?? '', + style: TextStyle(color: Colors.white, fontSize: 12.sp), + ), + ], + ), ), + (info['gender'] ?? 0) > 0 + ? Positioned( + bottom: 28.sp, + right: 0.sp, + child: Image.asset( + getMsgImage(getGenderContent(info['gender'])), + height: 15.sp, + ) + ) : Container() ], ), ); diff --git a/circle_app/lib/app/my_circle/logic.dart b/circle_app/lib/app/my_circle/logic.dart index 1cd6d7a..fc5d326 100644 --- a/circle_app/lib/app/my_circle/logic.dart +++ b/circle_app/lib/app/my_circle/logic.dart @@ -11,15 +11,35 @@ class MyCircleLogic extends GetxController { PageController pageController = PageController(initialPage: 1, viewportFraction: 0.8); InterestsBean circle = InterestsBean(lists: []); + ScrollController scrollController = ScrollController(); final CircleState state = CircleState(); int page = 1; bool isMore = true; + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + scrollController.dispose(); + } + @override void onInit() async { super.onInit(); - var data = await DioManager.instance + await loadData(); + scrollController.addListener(() { + if (scrollController.position.pixels == + scrollController.position.maxScrollExtent) { + loadMore(); + } + }); + } + + + + Future loadData() async { + var data = await DioManager.instance .get(url: Api.getMyCircleInterests, params: {"page": page,'page_size':20}); var bean = BaseResponse.fromJson( diff --git a/circle_app/lib/app/my_circle/view.dart b/circle_app/lib/app/my_circle/view.dart index 4220fec..7fd84e5 100644 --- a/circle_app/lib/app/my_circle/view.dart +++ b/circle_app/lib/app/my_circle/view.dart @@ -64,8 +64,12 @@ class _My_circlePageState extends State ? noResultWidget() : loaddingWidget(logic.isMore) : ListView.builder( - // controller: logic.rightCtr, + controller: logic.scrollController, itemBuilder: (context, index) { + if (index == logic.circle.lists.length) { + return loaddingWidget(logic.isMore); + } + var bean = logic.circle.lists[index]; return GestureDetector( behavior: HitTestBehavior.translucent, @@ -77,7 +81,7 @@ class _My_circlePageState extends State child: circleInfoItemWidget( logic.circle.lists[index])); }, - itemCount: logic.circle.lists.length, + itemCount: logic.circle.lists.length + 1, )) // Swiper( // itemBuilder: (BuildContext context, int index) { @@ -286,7 +290,7 @@ class _My_circlePageState extends State SizedBox( height: 30.sp, width: - 30.0.sp + 14.sp * (widgets.length - 1.sp), + 30.0.sp + 15.sp * (widgets.length - 1), child: Stack( alignment: Alignment.center, children: widgets, diff --git a/circle_app/lib/app/quick/binding.dart b/circle_app/lib/app/quick/binding.dart new file mode 100644 index 0000000..16a3806 --- /dev/null +++ b/circle_app/lib/app/quick/binding.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; + +import 'logic.dart'; + +class QuickBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => QuickLogic()); + } +} diff --git a/circle_app/lib/app/quick/logic.dart b/circle_app/lib/app/quick/logic.dart new file mode 100644 index 0000000..76cb6c5 --- /dev/null +++ b/circle_app/lib/app/quick/logic.dart @@ -0,0 +1,51 @@ +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; + +import '../../network/api.dart'; +import '../../network/dio_manager.dart'; + +class QuickLogic extends GetxController { + + final RefreshController refreshController = RefreshController(); + List lists = []; + int page = 1; + int isVip = 0; + bool isLoad = true; + bool isMore = true; + ScrollController scrollController = ScrollController(); + @override + void onInit() { + // TODO: implement onInit + super.onInit(); + initList(); + } + + initList() async { + var data = + await DioManager.instance.post(url: Api.recommendQuickChatUser, params: { + 'page':page, + 'pageSize':20 + }); + if (data['code'] == 200) { + + List list = data['data']['lists']; + if (list.isNotEmpty) { + isLoad = false; + if (page == 1) { + refreshController.refreshCompleted(); + refreshController.loadComplete(); + lists = list; + } else { + lists.addAll(list); + refreshController.loadComplete(); + } + } else { + refreshController.loadNoData(); + isMore = false; + } + } + update(); + } + +} diff --git a/circle_app/lib/app/quick/view.dart b/circle_app/lib/app/quick/view.dart new file mode 100644 index 0000000..f9f9791 --- /dev/null +++ b/circle_app/lib/app/quick/view.dart @@ -0,0 +1,393 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:circle_app/app/msg/logic.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; +import 'package:pull_to_refresh/pull_to_refresh.dart'; + +import '../../common/colors/app_color.dart'; +import '../../components/my_app_bar.dart'; +import '../../router/app_routers.dart'; +import '../../util/util.dart'; +import '../circle/logic.dart'; +import '../userinfo/logic.dart'; +import 'logic.dart'; + +class QuickPage extends StatelessWidget { + QuickPage({Key? key}) : super(key: key); + + final logic = Get.find(); + final ctr = Get.find(); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (logic) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(getBaseImage("bg")), + fit: BoxFit.cover, + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: MyAppBar( + centerTitle: "速聊", + onCenterTitlePressed: (){ + ctr.scrollController.animateTo(0, duration: Duration(milliseconds: 300), curve: Curves.easeInOut); + }, + actionWdiget: const Text( + "一呼百应", + style: TextStyle(color: Colors.white), + ), + onPressed: () { + showTipPop(); + } + ), + body: SafeArea( + child: logic.isLoad + ? loaddingWidget(true) + : logic.lists.isEmpty + ? noResultWidget() + : SmartRefresher( + controller: logic.refreshController, + onRefresh: _onRefresh, + onLoading: _onLoading, + enablePullUp: true, + child: ListView.builder( + controller: ctr.scrollController, + // padding: EdgeInsets.all(10.sp), + itemCount: ctr.lists.length, + itemBuilder: (context, index) { + var info = VicinityItemBean.fromJson(ctr.lists[index]); + + return ListItem(info,index); + // return itemWidget(index,logic.lists[index]); + }, + ), + ), + ), + ), + ); + }); + } + + + + + showTipPop() { + Get.bottomSheet( + CupertinoActionSheet( + title: Text( + '上速聊推荐可以让更多人看到你', + style: TextStyle(fontSize: 22.sp), + ), //标题 + //提示内容 + actions: [ + //操作按钮集合 + CupertinoActionSheetAction( + onPressed: () async { + Get.back(); + // Get.find + var result = await logic.queryQuickStart(); + if (result) { + _onRefresh(); + } + }, + child: Text('冲到第一'), + ), + CupertinoActionSheetAction( + onPressed: () { + logic.callOrhers(); + Get.back(); + + }, + child: Text('一键呼唤三十位您想认识的人'), + ), + CupertinoActionSheetAction( + onPressed: () { + Get.back(); + logic.stopQueryQuick(); + }, + child: Text('不显示在速聊列表'), + ), + ], + cancelButton: CupertinoActionSheetAction( + //取消按钮 + onPressed: () { + Get.back(); + }, + child: Text('取消'), + ), + ), + isScrollControlled: true); + } + + + Widget ListItem(VicinityItemBean item, int index) { + return GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.UserInfoActivity, arguments: item.id.toString()); + }, + child: Container( + margin: EdgeInsets.only(top: 10.sp), + // padding: EdgeInsets.only( left: 8.sp, right: 8.sp), + width: Get.width, + // height: 210.sp + (item.images.isNotEmpty ? 98.sp : 0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.sp), + border: GradientBoxBorder( + + gradient: + AppColor.mainVerLinearGradient, + width: 1.sp, + ), + ), + child: Stack( + children: [ + Container( + margin: EdgeInsets.only(top: 1.sp, left: 1.sp, right: 1.sp), + child: ClipRRect( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.sp), + topRight: Radius.circular(10.sp), + ), + child: Image( + image: AssetImage(getCircleImage("icon_list_null")), + width: Get.width, + fit: BoxFit.fill, + height: 92.sp, + ) + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only(right: 2.sp), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(top: 6.sp, left: 8.sp), + width: 88.sp, + height: 88.sp, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + gradient: const LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Color(0xFF71F3F2), + Color(0xFFF558FF), + ], + stops: [0.0365, 0.9427], + ), + ), + padding: EdgeInsets.all(2.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.network(item.avatarThumb, + width: 88.sp, height: 88.sp, fit: BoxFit.cover), + ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 6.sp, left: 9.sp), + child: Row( + children: [ + Text( + item.nickname, + style: TextStyle( + fontWeight: FontWeight.bold, + color: const Color.fromRGBO(247, 250, 250, 1.0), + fontSize: 16.sp, + ), + ), + SizedBox(width: 8.sp), + if (item.gender != null) + _buildInfoRow(item), + const Spacer(), + ], + ), + ), + Container( + // color: Colors.red, + // height: 55.sp, // 设置固定高度 + constraints: BoxConstraints( + maxHeight: 55.sp + ), + width: Get.width, + margin: EdgeInsets.symmetric(horizontal: 8.0), + child: Align( + alignment: Alignment.centerLeft, // 文本左对齐,垂直居中 + child: Text( + item.signature ?? '暂时还没有签名哦~', + maxLines: 2, + style: TextStyle(color: Colors.white, fontSize: 18.sp), + overflow: TextOverflow.ellipsis, + ), + ), + ), + if (item.interests.isNotEmpty) + Container( + margin: EdgeInsets.only(left: 8.sp, right: 3.sp,bottom: 5.sp), + child: _buildInterestsListView(item.interests)), + + if (item.images.isNotEmpty) + Container( + height: 98,margin: EdgeInsets.only(top: 6.sp,left: 10.sp,right: 10.sp,bottom: 10.sp), + + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + for (int i = 0; i < item.images.length; i++) + GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.Swiper, + arguments: { + 'imaglist': item.images, + 'index': i + }); + }, + child: ListAlbumItem(item.images[i], i)), + ], + ), + ), + ), + ]), + ], + )), + ); + } + + Widget ListAlbumItem(String item, int index) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 2.sp), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.sp), + child: CachedNetworkImage( + width: 88.sp, + height: 88.sp, + fit: BoxFit.cover, + imageUrl: item + "?imageView2/1/w/176/h/176/q/75", + ), + ), + ); + } + + Widget _buildInfoRow(var item) { + String ageMsg = + getAgeCOntent(item!.gender, item!.age, item!.role, item!.orientation); + return Row( + children: [ + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + gradient: const LinearGradient( + colors: [ + Color.fromRGBO(141, 255, 248, 1.0), + Color.fromRGBO(181, 211, 255, 1.0), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + padding: EdgeInsets.only( + top: 2.sp, + bottom: 2.sp, + left: 10.sp, + right: 10.sp, + ), + child: Text( + ageMsg, + style: const TextStyle( + color: Colors.black, + fontSize: 10, + ), + ), + ), + const SizedBox(width: 6), + if (item.vip > 0) + Image( + image: AssetImage(getBaseImage(item.vip == 1 ? "vip" : 'year_vip')), + width: 44.sp, + height: 18.sp, + ), + ], + ); + } + + Widget _buildInterestsListView(List interests) { + return Align( + alignment: Alignment.centerLeft, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: [ + for (int index = 0; index < interests.length; index++) + GestureDetector( + onTap: () { + Get.toNamed(AppRoutes.Signal_circle_list, + arguments: interests[index].id); + }, + child: Container( + margin: EdgeInsets.only(right: 11.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), + gradient: const LinearGradient( + colors: [ + Color(0xFF06F9FA), + Color(0xFFDC5BFD), + ], + ), + color: const Color(0xFF392D53), + ), + child: Container( + margin: EdgeInsets.all(1.sp), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17.0), + color: const Color(0xFF392D53), + ), + child: Padding( + padding: EdgeInsets.only( + top: 2.sp, + bottom: 2.sp, + left: 15.sp, + right: 15.sp, + ), + child: Center( + child: Text( + interests[index].title, + style: const TextStyle( + fontSize: 13.0, + color: Colors.white, + ), + ), + ), + ), + ), + ), + ), + ], + ), + ), + ); + } + + void _onRefresh() async { + ctr.page = 1; + ctr.initList(); + } + + void _onLoading() async { + ctr.page = ctr.page + 1; + ctr.initList(); + } +} diff --git a/circle_app/lib/main.dart b/circle_app/lib/main.dart index 756ea5a..87d5bee 100644 --- a/circle_app/lib/main.dart +++ b/circle_app/lib/main.dart @@ -152,197 +152,6 @@ void uploadBuzIDAndToken() async { } } -initPush() { - // final TimUiKitPushPlugin cPush = TimUiKitPushPlugin( - // isUseGoogleFCM: true, // 中国大陆版无此参数 - // ); - // cPush.init( - // pushClickAction: pushClickAction, // 单击通知后的事件回调,会在STEP6讲解 - // appInfo: PushConfig.appInfo, // 传入STEP1做的appInfo - // ); -} - -//跳转发消息页面 -pushChatPage(String userId, String imId, String userName) { - var con = V2TimConversation( - conversationID: "c2c_$imId", userID: imId, showName: userName, type: 1); - Get.toNamed(AppRoutes.Chat, arguments: con); - createCustomMsg(userId, imId); -} - -createCustomMsg(String userId, String imId) async { - //通过会话ID获取指定会话列表 - V2TimValueCallback> - getConversationListByConversaionIdsRes = await TencentImSDKPlugin - .v2TIMManager - .getConversationManager() - .getConversationListByConversaionIds( - conversationIDList: ["c2c_$imId"]); //需要获取会话列表数据的会话id列表 - if (getConversationListByConversaionIdsRes.code == 0 && - getConversationListByConversaionIdsRes.data!.isEmpty) { - //获取资料,然后发送自定义卡片消息 - var data = await DioManager.instance.get( - url: 'msg-service/user/$userId/chat/card', - ); - if (data['code'] == 200) { - String desc = ''; - String cityStr = ''; - Map info = {}; - - if (data['data']['both_interests'] != null) { - List both_interests = data['data']['both_interests']; - List circleList = []; - both_interests.forEach((element) { - circleList.add(element['title']); - }); - if (circleList.isNotEmpty) { - info['both_interests'] = - '你们有${circleList.length}个共同的圈子:${circleList.join('、')}'; - if (desc.isEmpty) { - desc = '你们有${circleList.length}个共同的圈子:${circleList.join('、')}'; - } - } - } - - if (data['data']['both_cities'] != null) { - List city = data['data']['both_cities']; - print('城市' + city.toString()); - if (city.isNotEmpty) { - desc = '你们都在${city.first}留下过足迹'; - cityStr = '你们都在${city.first}留下过足迹'; - } - } - - if (desc.isNotEmpty) { - if (data['data']['both_cities'] != null) { - info['city'] = cityStr; - } - info['interests'] = data['data']['interests'] ?? []; - info['guide_text'] = data['data']['guide_text'] ?? ''; - 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; - } - } - } - return false; -} - -//发送文本消息 -sendTextMsg(String userId, {String content = '看看这次缘分匹配到哪位小可爱呢?'}) async { - // 创建文本消息 - V2TimValueCallback createTextMessageRes = - await TencentImSDKPlugin.v2TIMManager - .getMessageManager() - .createTextMessage( - text: content, // 文本信息 - ); - if (createTextMessageRes.code == 0) { - // 文本信息创建成功 - String? id = createTextMessageRes.data?.id; - // 发送文本消息 - // 在sendMessage时,若只填写receiver则发个人用户单聊消息 - // 若只填写groupID则发群组消息 - // 若填写了receiver与groupID则发群内的个人用户,消息在群聊中显示,只有指定receiver能看见 - V2TimValueCallback sendMessageRes = await TencentImSDKPlugin - .v2TIMManager - .getMessageManager() - .sendMessage(id: id!, receiver: userId, groupID: ''); - if (sendMessageRes.code == 0) { - // 发送成功 - return true; - } - return false; - } - // V2TimValueCallback createCustomMessageRes = - // await TencentImSDKPlugin.v2TIMManager - // .getMessageManager() - // .createTextAtMessage(text: '看看这次缘分匹配到哪位小可爱呢?',atUserList: [], - // ); - // if (createCustomMessageRes.code == 0) { - // String? id = createCustomMessageRes.data?.id; - // // 发送自定义消息 - // // 在sendMessage时,若只填写receiver则发个人用户单聊消息 - // // 若只填写groupID则发群组消息 - // // 若填写了receiver与groupID则发群内的个人用户,消息在群聊中显示,只有指定receiver能看见 - // V2TimValueCallback sendMessageRes = await TencentImSDKPlugin - // .v2TIMManager - // .getMessageManager() - // .sendMessage(id: id!, receiver: userId,groupID: ''); - // if (sendMessageRes.code == 0) { - // // 发送成功 - // return true; - // } - // } -} - -//发送卡片自定义消息 -sendCustomMsg(String userId, String data, String desc) async { - // 创建自定义消息 - V2TimValueCallback createCustomMessageRes = - await TencentImSDKPlugin.v2TIMManager - .getMessageManager() - .createCustomMessage( - data: data, - desc: desc, - extension: 'cardData', - ); - if (createCustomMessageRes.code == 0) { - String? id = createCustomMessageRes.data?.id; - // 发送自定义消息 - //EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); - - // 在sendMessage时,若只填写receiver则发个人用户单聊消息 - // 若只填写groupID则发群组消息 - // 若填写了receiver与groupID则发群内的个人用户,消息在群聊中显示,只有指定receiver能看见 - V2TimValueCallback sendMessageRes = await TencentImSDKPlugin - .v2TIMManager - .getMessageManager() - .sendMessage(id: id!, receiver: userId, groupID: ''); - if (sendMessageRes.code == 0) { - // 发送成功 - sendMessageRes.data?.customElem?.data; //自定义data - sendMessageRes.data?.customElem?.desc; //自定义desc - sendMessageRes.data?.customElem?.extension; //自定义extension - } - } -} - -//发送圈子自定义消息 -sendCircleCustomMsg(String userId, String data, String desc) async { - // 创建自定义消息 - V2TimValueCallback createCustomMessageRes = - await TencentImSDKPlugin.v2TIMManager - .getMessageManager() - .createCustomMessage( - data: data, - desc: desc, - extension: 'circleData', - ); - if (createCustomMessageRes.code == 0) { - String? id = createCustomMessageRes.data?.id; - // 发送自定义消息 - //EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); - - // 在sendMessage时,若只填写receiver则发个人用户单聊消息 - // 若只填写groupID则发群组消息 - // 若填写了receiver与groupID则发群内的个人用户,消息在群聊中显示,只有指定receiver能看见 - V2TimValueCallback sendMessageRes = await TencentImSDKPlugin - .v2TIMManager - .getMessageManager() - .sendMessage(id: id!, receiver: userId, groupID: ''); - if (sendMessageRes.code == 0) { - // 发送成功 - sendMessageRes.data?.customElem?.data; //自定义data - sendMessageRes.data?.customElem?.desc; //自定义desc - sendMessageRes.data?.customElem?.extension; //自定义extension - showOKToast('发送成功'); - } - } -} class MyApp extends StatefulWidget { const MyApp({super.key}); diff --git a/circle_app/lib/network/api.dart b/circle_app/lib/network/api.dart index ef0f4fc..ce62e9f 100644 --- a/circle_app/lib/network/api.dart +++ b/circle_app/lib/network/api.dart @@ -89,6 +89,8 @@ class Api { //发消息是否需要vip弹窗 static const getIsVips = 'mall-service/vips/show/'; + //IM状态 + static const imstate = '/user-service/user/im/state'; //发视频图片消息增加计数 @@ -328,4 +330,26 @@ class Api { //礼物馆 static const giftHall = '/mall-service/gift/giftHall/'; + //速聊推荐 + static const recommendQuickChatUser = '/msg-service/recommendQuickChatUser'; + + //站外分享 + static const offSite = '/up-service/share/offSite'; + + //抢占第一 + static const startQuick = '/msg-service/startQuick'; + + + //是否开启速聊 + static const queryQuickStart = '/msg-service/queryQuickStart'; + + //不显示在速聊列表 + static const stopQuick = '/msg-service/stopQuick'; + + //呼唤30人 + static const callOthers = '/msg-service/call/others'; + + + //获取一条招呼语 + static const msgRandOne = '/msg-service/message/hello_word/randOne'; } \ No newline at end of file diff --git a/circle_app/lib/network/dio_manager.dart b/circle_app/lib/network/dio_manager.dart index 49d1a55..ce87c0f 100644 --- a/circle_app/lib/network/dio_manager.dart +++ b/circle_app/lib/network/dio_manager.dart @@ -42,9 +42,9 @@ class DioManager { // 请求基地址 baseUrl: baseUrl, // 连接服务器超时时间,单位是毫秒 - connectTimeout: const Duration(seconds: 300), + connectTimeout: const Duration(seconds: 30), // 接收数据的最长时限 - receiveTimeout: const Duration(seconds: 300), + receiveTimeout: const Duration(seconds: 30), )); _dio!.interceptors.add(LogInterceptor( responseBody: true, @@ -247,23 +247,11 @@ class DioManager { pushLoginPage(); break; } - if (responseMap["code"] != 200) { + if (responseMap["code"] != 200 && responseMap["code"] != 10000) { showOKToast(responseMap['msg']); } } return responseMap; - // switch(responseMap["code"]){ - // case 200: - // case 30503: - // return responseMap; - // case 5003: - // pushLoginPage(); - // break; - // - // default: - // return {'code': responseMap["code"], 'msg': responseMap["msg"]}; - // } - return responseMap; } on DioException catch (e) { SharedPreferencesHelper sp = await SharedPreferencesHelper.getInstance(); if (sp.getString(SharedPreferencesHelper.LOGINPHONE) == '18800000100') { diff --git a/circle_app/lib/router/app_pages.dart b/circle_app/lib/router/app_pages.dart index 9d6d47e..abfcfbf 100644 --- a/circle_app/lib/router/app_pages.dart +++ b/circle_app/lib/router/app_pages.dart @@ -46,6 +46,7 @@ import 'package:circle_app/app/offaccount/view.dart'; import 'package:circle_app/app/photoinfo/binding.dart'; import 'package:circle_app/app/photoinfo/view.dart'; import 'package:circle_app/app/privacy/view.dart'; +import 'package:circle_app/app/quick/view.dart'; import 'package:circle_app/app/report/binding.dart'; import 'package:circle_app/app/report/view.dart'; import 'package:circle_app/app/reset_pwd/binding.dart'; @@ -80,6 +81,7 @@ import '../app/good_reviews/binding.dart'; import '../app/good_reviews/view.dart'; import '../app/my_assets/binding.dart'; import '../app/privacy/binding.dart'; +import '../app/quick/binding.dart'; import '../app/splash/view.dart'; import '../app/visitorlist/binding.dart'; import 'app_routers.dart'; @@ -263,8 +265,9 @@ class AppPages { GetPage(name: AppRoutes.BillActivity, page: () => BillPage(), binding: BillBinding(),), GetPage(name: AppRoutes.GiftShopPage, page: () => Gift_shopPage(), - binding: Gift_shopBinding(),) - + binding: Gift_shopBinding(),), + GetPage(name: AppRoutes.Quick, page: () => QuickPage(), + binding: QuickBinding(),) ]; } diff --git a/circle_app/lib/router/app_routers.dart b/circle_app/lib/router/app_routers.dart index 2de5c9c..497037b 100644 --- a/circle_app/lib/router/app_routers.dart +++ b/circle_app/lib/router/app_routers.dart @@ -51,6 +51,6 @@ abstract class AppRoutes { static const GiftShopPage = '/GiftShopPage'; - + static const Quick = '/msg/quick'; } \ No newline at end of file diff --git a/circle_app/lib/util/util.dart b/circle_app/lib/util/util.dart index ee9cbed..b089b07 100644 --- a/circle_app/lib/util/util.dart +++ b/circle_app/lib/util/util.dart @@ -16,10 +16,12 @@ import 'package:oktoast/oktoast.dart'; import 'package:path_provider/path_provider.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; +import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:video_compress/video_compress.dart'; import '../app/circle/logic.dart'; import '../app/select_circle/logic.dart'; +import '../network/dio_manager.dart'; import 'SharedPreferencesHelper.dart'; class Util {} @@ -483,3 +485,245 @@ Size boundingTextSize(BuildContext context, String text, TextStyle style, ..layout(maxWidth: maxWidth); return textPainter.size; } + + + +//跳转发消息页面 +pushChatPage(String userId, String imId, String userName) { + var con = V2TimConversation( + conversationID: "c2c_$imId", userID: imId, showName: userName, type: 1); + Get.toNamed(AppRoutes.Chat, arguments: con); + createCustomMsg(userId, imId); +} + +createCustomMsg(String userId, String imId) async { + //通过会话ID获取指定会话列表 + V2TimValueCallback> + getConversationListByConversaionIdsRes = await TencentImSDKPlugin + .v2TIMManager + .getConversationManager() + .getConversationListByConversaionIds( + conversationIDList: ["c2c_$imId"]); //需要获取会话列表数据的会话id列表 + if (getConversationListByConversaionIdsRes.code == 0 && + getConversationListByConversaionIdsRes.data!.isEmpty) { + //获取资料,然后发送自定义卡片消息 + var data = await DioManager.instance.get( + url: 'msg-service/user/$userId/chat/card', + ); + if (data['code'] == 200) { + String desc = ''; + String cityStr = ''; + Map info = {}; + + if (data['data']['both_interests'] != null) { + List both_interests = data['data']['both_interests']; + List circleList = []; + both_interests.forEach((element) { + circleList.add(element['title']); + }); + if (circleList.isNotEmpty) { + info['both_interests'] = + '你们有${circleList.length}个共同的圈子:${circleList.join('、')}'; + if (desc.isEmpty) { + desc = '你们有${circleList.length}个共同的圈子:${circleList.join('、')}'; + } + } + } + + if (data['data']['both_cities'] != null) { + List city = data['data']['both_cities']; + print('城市' + city.toString()); + if (city.isNotEmpty) { + desc = '你们都在${city.first}留下过足迹'; + cityStr = '你们都在${city.first}留下过足迹'; + } + } + + if (desc.isNotEmpty) { + if (data['data']['both_cities'] != null) { + info['city'] = cityStr; + } + info['interests'] = data['data']['interests'] ?? []; + info['guide_text'] = data['data']['guide_text'] ?? ''; + 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; + } + } + } + return false; +} + +//发送文本消息 +sendTextMsg(String userId, {String content = '看看这次缘分匹配到哪位小可爱呢?'}) async { + // 创建文本消息 + V2TimValueCallback createTextMessageRes = + await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .createTextMessage( + text: content, // 文本信息 + ); + if (createTextMessageRes.code == 0) { + // 文本信息创建成功 + String? id = createTextMessageRes.data?.id; + // 发送文本消息 + // 在sendMessage时,若只填写receiver则发个人用户单聊消息 + // 若只填写groupID则发群组消息 + // 若填写了receiver与groupID则发群内的个人用户,消息在群聊中显示,只有指定receiver能看见 + V2TimValueCallback sendMessageRes = await TencentImSDKPlugin + .v2TIMManager + .getMessageManager() + .sendMessage(id: id!, receiver: userId, groupID: ''); + if (sendMessageRes.code == 0) { + // 发送成功 + return true; + } + return false; + } + // V2TimValueCallback createCustomMessageRes = + // await TencentImSDKPlugin.v2TIMManager + // .getMessageManager() + // .createTextAtMessage(text: '看看这次缘分匹配到哪位小可爱呢?',atUserList: [], + // ); + // if (createCustomMessageRes.code == 0) { + // String? id = createCustomMessageRes.data?.id; + // // 发送自定义消息 + // // 在sendMessage时,若只填写receiver则发个人用户单聊消息 + // // 若只填写groupID则发群组消息 + // // 若填写了receiver与groupID则发群内的个人用户,消息在群聊中显示,只有指定receiver能看见 + // V2TimValueCallback sendMessageRes = await TencentImSDKPlugin + // .v2TIMManager + // .getMessageManager() + // .sendMessage(id: id!, receiver: userId,groupID: ''); + // if (sendMessageRes.code == 0) { + // // 发送成功 + // return true; + // } + // } +} + +//发送卡片自定义消息 +sendCustomMsg(String userId, String data, String desc) async { + // 创建自定义消息 + V2TimValueCallback createCustomMessageRes = + await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .createCustomMessage( + data: data, + desc: desc, + extension: 'cardData', + ); + if (createCustomMessageRes.code == 0) { + String? id = createCustomMessageRes.data?.id; + // 发送自定义消息 + if (Get.currentRoute == AppRoutes.Chat) { + EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); + } else { + V2TimValueCallback sendMessageRes = await TencentImSDKPlugin + .v2TIMManager + .getMessageManager() + .sendMessage(id: id!, receiver: userId, groupID: ''); + if (sendMessageRes.code == 0) { + // 发送成功 + sendMessageRes.data?.customElem?.data; //自定义data + sendMessageRes.data?.customElem?.desc; //自定义desc + sendMessageRes.data?.customElem?.extension; //自定义extension + } + } + } +} + +//发送圈子自定义消息 +sendCircleCustomMsg(String userId, String data, String desc) async { + // 创建自定义消息 + V2TimValueCallback createCustomMessageRes = + await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .createCustomMessage( + data: data, + desc: desc, + extension: 'circleData', + ); + if (createCustomMessageRes.code == 0) { + String? id = createCustomMessageRes.data?.id; + // 发送自定义消息 + EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); + } +} + + +//发送求送礼物自定义消息 +sendGetGiftCustomMsg(String userId, String data, String desc) async { + // 创建自定义消息 + V2TimValueCallback createCustomMessageRes = + await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .createCustomMessage( + data: data, + desc: desc, + extension: 'getGiftData', + ); + if (createCustomMessageRes.code == 0) { + String? id = createCustomMessageRes.data?.id; + // 发送自定义消息 + EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); + + } +} + + +//发送许愿自定义消息 +sendGetWishCustomMsg(String userId, String data, String desc) async { + // 创建自定义消息 + V2TimValueCallback createCustomMessageRes = + await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .createCustomMessage( + data: data, + desc: desc, + extension: 'getWishData', + ); + if (createCustomMessageRes.code == 0) { + String? id = createCustomMessageRes.data?.id; + // 发送自定义消息 + EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); + // + // // 在sendMessage时,若只填写receiver则发个人用户单聊消息 + // // 若只填写groupID则发群组消息 + // // 若填写了receiver与groupID则发群内的个人用户,消息在群聊中显示,只有指定receiver能看见 + // V2TimValueCallback sendMessageRes = await TencentImSDKPlugin + // .v2TIMManager + // .getMessageManager() + // .sendMessage(id: id!, receiver: userId, groupID: ''); + // if (sendMessageRes.code == 0) { + // // 发送成功 + // sendMessageRes.data?.customElem?.data; //自定义data + // sendMessageRes.data?.customElem?.desc; //自定义desc + // sendMessageRes.data?.customElem?.extension; //自定义extension + // showOKToast('发送成功'); + // } + } +} + + +//发送邀请许愿自定义消息 +sendInventWishCustomMsg(String userId, String data, String desc) async { + // 创建自定义消息 + V2TimValueCallback createCustomMessageRes = + await TencentImSDKPlugin.v2TIMManager + .getMessageManager() + .createCustomMessage( + data: data, + desc: desc, + extension: 'getInventWishData', + ); + if (createCustomMessageRes.code == 0) { + String? id = createCustomMessageRes.data?.id; + // 发送自定义消息 + EventBusManager.fire(SendCoustomMessage(createCustomMessageRes)); + } +} + diff --git a/circle_app/pubspec.lock b/circle_app/pubspec.lock index c9cbf00..cd8dde9 100644 --- a/circle_app/pubspec.lock +++ b/circle_app/pubspec.lock @@ -553,6 +553,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -829,6 +837,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.0" + gradient_borders: + dependency: "direct main" + description: + name: gradient_borders + sha256: "69eeaff519d145a4c6c213ada1abae386bcc8981a4970d923e478ce7ba19e309" + url: "https://pub.dev" + source: hosted + version: "1.0.0" html: dependency: transitive description: @@ -1349,6 +1365,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.2.4" + protobuf: + dependency: transitive + description: + name: protobuf + sha256: "01dd9bd0fa02548bf2ceee13545d4a0ec6046459d847b6b061d8a27237108a08" + url: "https://pub.dev" + source: hosted + version: "2.1.0" provider: dependency: transitive description: @@ -1562,6 +1586,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + svgaplayer_flutter: + dependency: "direct main" + description: + name: svgaplayer_flutter + sha256: "13ad44aabb454e0094962b260c5333662fbd2879c7f9f8d2595b3c4b79817651" + url: "https://pub.dev" + source: hosted + version: "2.2.0" synchronized: dependency: transitive description: diff --git a/circle_app/pubspec.yaml b/circle_app/pubspec.yaml index cfc5feb..34ae355 100644 --- a/circle_app/pubspec.yaml +++ b/circle_app/pubspec.yaml @@ -107,6 +107,10 @@ dependencies: flutter_bugly: ^0.4.4 #图片压缩 flutter_image_compress: ^1.1.3 + #SVGA显示控件 + svgaplayer_flutter: ^2.2.0 + #边框渐变 + gradient_borders: ^1.0.0 dev_dependencies: flutter_test: