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 0000000..762b340 Binary files /dev/null and b/circle_app/assets/images/home/im_more.png differ diff --git a/circle_app/assets/images/msg/hello.png b/circle_app/assets/images/msg/hello.png new file mode 100644 index 0000000..bf00d24 Binary files /dev/null and b/circle_app/assets/images/msg/hello.png differ 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 0000000..ecfc831 Binary files /dev/null and b/circle_app/assets/images/msg/share_circle.png differ diff --git a/circle_app/assets/images/msg/wish.png b/circle_app/assets/images/msg/wish.png new file mode 100644 index 0000000..84d076d Binary files /dev/null and b/circle_app/assets/images/msg/wish.png differ 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: