Kaynağa Gözat

add:添加购买会员弹出分享提示框。

zhoukun 5 ay önce
ebeveyn
işleme
8ddbace997

BIN
assets/images/icon_member_payment_completed.webp


+ 6 - 0
lib/data/api/atmob_api.dart

@@ -31,6 +31,7 @@ import 'package:location/data/api/response/member_status_response.dart';
 import 'package:location/data/api/response/member_trial_info_response.dart';
 import 'package:location/data/api/response/member_trial_response.dart';
 import 'package:location/data/api/response/message_response.dart';
+import 'package:location/data/api/response/order_first_check_response.dart';
 import 'package:location/data/api/response/order_status_response.dart';
 import 'package:location/data/api/response/query_track_response.dart';
 import 'package:location/data/api/response/request_friend_list_response.dart';
@@ -194,4 +195,9 @@ abstract class AtmobApi {
   @POST("/s/v1/user/avatar/update")
   Future<BaseResponse> userAvatarUpdate(
       @Body() UserAvatarUpdateRequest request);
+
+  ///检查是否是首次购买-中台
+  @POST("/s/v1/order/first/check")
+  Future<BaseResponse<OrderFirstCheckResponse>> orderFirstCheck(
+      @Body() AppBaseRequest request);
 }

+ 40 - 0
lib/data/api/atmob_api.g.dart

@@ -1470,6 +1470,46 @@ class _AtmobApi implements AtmobApi {
     return _value;
   }
 
+  @override
+  Future<BaseResponse<OrderFirstCheckResponse>> orderFirstCheck(
+      AppBaseRequest request) async {
+    final _extra = <String, dynamic>{};
+    final queryParameters = <String, dynamic>{};
+    final _headers = <String, dynamic>{};
+    final _data = <String, dynamic>{};
+    _data.addAll(request.toJson());
+    final _options =
+        _setStreamType<BaseResponse<OrderFirstCheckResponse>>(Options(
+      method: 'POST',
+      headers: _headers,
+      extra: _extra,
+    )
+            .compose(
+              _dio.options,
+              '/s/v1/order/first/check',
+              queryParameters: queryParameters,
+              data: _data,
+            )
+            .copyWith(
+                baseUrl: _combineBaseUrls(
+              _dio.options.baseUrl,
+              baseUrl,
+            )));
+    final _result = await _dio.fetch<Map<String, dynamic>>(_options);
+    late BaseResponse<OrderFirstCheckResponse> _value;
+    try {
+      _value = BaseResponse<OrderFirstCheckResponse>.fromJson(
+        _result.data!,
+        (json) =>
+            OrderFirstCheckResponse.fromJson(json as Map<String, dynamic>),
+      );
+    } on Object catch (e, s) {
+      errorLogger?.logError(e, s, _options);
+      rethrow;
+    }
+    return _value;
+  }
+
   RequestOptions newRequestOptions(Object? options) {
     if (options is RequestOptions) {
       return options as RequestOptions;

+ 18 - 0
lib/data/api/response/order_first_check_response.dart

@@ -0,0 +1,18 @@
+
+
+import 'package:json_annotation/json_annotation.dart';
+
+part 'order_first_check_response.g.dart';
+
+@JsonSerializable()
+class OrderFirstCheckResponse {
+  @JsonKey(name: 'first')
+  bool first;
+
+  OrderFirstCheckResponse(this.first);
+
+  factory OrderFirstCheckResponse.fromJson(Map<String, dynamic> json) =>
+      _$OrderFirstCheckResponseFromJson(json);
+
+  Map<String, dynamic> toJson() => _$OrderFirstCheckResponseToJson(this);
+}

+ 19 - 0
lib/data/api/response/order_first_check_response.g.dart

@@ -0,0 +1,19 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'order_first_check_response.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+OrderFirstCheckResponse _$OrderFirstCheckResponseFromJson(
+        Map<String, dynamic> json) =>
+    OrderFirstCheckResponse(
+      json['first'] as bool,
+    );
+
+Map<String, dynamic> _$OrderFirstCheckResponseToJson(
+        OrderFirstCheckResponse instance) =>
+    <String, dynamic>{
+      'first': instance.first,
+    };

+ 9 - 0
lib/data/repositories/member_repository.dart

@@ -12,6 +12,7 @@ import '../api/request/submit_and_request_pay_request.dart';
 import '../api/request/subscription_resume_request.dart';
 import '../api/response/item_list_response.dart';
 import '../api/response/member_trial_info_response.dart';
+import '../api/response/order_first_check_response.dart';
 import '../api/response/request_pay_response.dart';
 import '../api/response/subscription_check_response.dart';
 
@@ -80,4 +81,12 @@ class MemberRepository {
     });
   }
 
+  //试用结束查看试用信息
+  Future<OrderFirstCheckResponse>orderFirstCheck() {
+    return atmobApi.orderFirstCheck(AppBaseRequest())
+        .then(HttpHandler.handle(true))
+        .then((OrderFirstCheckResponse firstCheckResponse) {
+      return firstCheckResponse;
+    });
+  }
 }

+ 17 - 0
lib/module/member/member_controller.dart

@@ -31,6 +31,7 @@ import '../../dialog/loading_dialog.dart';
 import '../../dialog/member_retain_dialog.dart';
 import '../../dialog/wechat_qr_code_dialog.dart';
 import '../../resource/string.gen.dart';
+import '../../sdk/wechat/wechat_share_util.dart';
 import '../../utils/http_handler.dart';
 import '../../utils/payment_status_manager.dart';
 import '../../widget/animated_switcher_widget.dart';
@@ -38,6 +39,7 @@ import '../browser/browser_view.dart';
 import 'member_evaluate_bean.dart';
 import 'member_fun_bean.dart';
 import 'package:apple_pay/apple_pay.dart';
+import 'member_payment_completed_dialog.dart';
 
 @injectable
 class MemberController extends BaseController implements PaymentStatusCallback {
@@ -543,6 +545,8 @@ class MemberController extends BaseController implements PaymentStatusCallback {
   @override
   void onPaymentSuccess(
       String orderNo, PayItemBean paymentWay, GoodsBean storeItemBean) {
+    ///购买成功之后弹出
+    afterTheFirstPurchasePromptSharingBoxPops();
     try {
       WechatQrCodeDialog.dismiss();
       AlipayQrCodeDialog.dismiss();
@@ -553,4 +557,17 @@ class MemberController extends BaseController implements PaymentStatusCallback {
     }
     showPaymentSuccessDialog(onConfirm: back, onCancel: back);
   }
+
+  ///第一次购买之后弹出提示分享框
+  void afterTheFirstPurchasePromptSharingBoxPops() {
+    paymentStatusManager.onOrderFirstCheck().then((checkReponse) {
+      if (checkReponse.first) {
+        MemberPaymentCompletedDialog.show(confirmOnTap: () {
+          WechatShareUtil.shareWebPage().catchError((error) {
+            ToastUtil.show(error);
+          });
+        });
+      }
+    });
+  }
 }

+ 185 - 0
lib/module/member/member_payment_completed_dialog.dart

@@ -0,0 +1,185 @@
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:location/resource/colors.gen.dart';
+import 'package:location/utils/common_expand.dart';
+
+import '../../resource/assets.gen.dart';
+
+class MemberPaymentCompletedDialog {
+  static void show({
+    VoidCallback? cancelOnTap,
+    VoidCallback? confirmOnTap,}) {
+    Get.dialog(
+        SimpleDialog(
+          titlePadding: EdgeInsets.zero,
+          contentPadding: EdgeInsets.zero,
+          insetPadding: EdgeInsets.zero,
+          backgroundColor:Colors.transparent,
+          children: [
+            MemberPaymentCompletedTipView(
+                cancelOnTap: () {
+                  Get.back();
+                },
+                confirmOnTap: confirmOnTap)
+          ],
+        )
+    );
+  }
+}
+
+
+class MemberPaymentCompletedTipView extends StatefulWidget {
+  final VoidCallback? cancelOnTap;
+  final VoidCallback? confirmOnTap;
+
+
+  const MemberPaymentCompletedTipView({
+    super.key,
+    this.cancelOnTap,
+    required this.confirmOnTap,
+  });
+
+  @override
+  State<MemberPaymentCompletedTipView> createState() => _MemberPaymentCompletedTipViewState();
+}
+
+
+class _MemberPaymentCompletedTipViewState extends State<MemberPaymentCompletedTipView> {
+  @override
+  Widget build(BuildContext context) {
+    // TODO: implement build
+    return Container(
+      width: 1.sw,
+      margin: EdgeInsets.symmetric(horizontal: 42.w),
+      child: IntrinsicHeight(
+        child: Column(
+          children: [
+            Container(
+              decoration: BoxDecoration(
+                  color: Colors.transparent,
+                  image: DecorationImage(
+                    image: Assets.images.iconMemberPaymentCompleted.provider(),
+                    fit: BoxFit.fill,
+                  )
+              ),
+              child: Column(
+                children: [
+                  SizedBox(
+                    height: 150.w,
+                  ),
+                  Text("邀请好友 共享定位",
+                      style: TextStyle(
+                          fontSize: 20.sp,
+                          color: "#333333".color,
+                          fontWeight: FontWeight.bold)),
+                  SizedBox(height: 8.w,),
+                  Row(
+                    mainAxisAlignment: MainAxisAlignment.center,
+                    children: [
+                      Container(
+                        decoration: BoxDecoration(
+                          gradient: LinearGradient(
+                            // 渐变方向:90度(从左到右)
+                            begin: Alignment.centerLeft,
+                            end: Alignment.centerRight,
+                            // 渐变颜色:从透明灰到#AAA
+                            colors: [
+                              Color.fromRGBO(170, 170, 170, 0.0), // rgba(170, 170, 170, 0.00)
+                              Color(0xFFAAAAAA), // #AAA
+                            ],
+                            // 渐变位置:0%到100%
+                            stops: [0.0, 1.0],
+                          ),
+                        ),
+                        width: 14.w,
+                        height: 1.w,
+                      ),
+                      SizedBox(width: 6.w,),
+                      Text("共享定位需要对方下载软件授权",
+                          style: TextStyle(fontSize: 12.sp, color: ColorName.black60)),
+                      SizedBox(width: 6.w,),
+                      Container(
+                        width: 14.w,
+                        height: 1.w,
+                        decoration: BoxDecoration(
+                          gradient: LinearGradient(
+                            // 90度渐变(从左到右)
+                            begin: Alignment(-1.0, 0.0), // 左侧起点
+                            end: Alignment(1.0, 0.0),   // 右侧终点
+                            // 渐变颜色:透明灰到#AAA
+                            colors: [
+                              Color.fromARGB(0, 170, 170, 170), // rgba(170, 170, 170, 0.00)
+                              Color(0xFFAAAAAA),               // #AAA
+                            ],
+                            // 颜色分布位置
+                            stops: [0.0, 1.0],
+                          ),
+                        ),
+                      )
+                    ],
+                  ),
+                  SizedBox(
+                    height: 32.w,
+                  ),
+                  GestureDetector(
+                    onTap: () {
+                      Get.back();
+                      widget.confirmOnTap!();
+                    },
+                    child: Container(
+                      decoration: BoxDecoration(
+                        gradient: LinearGradient(
+                          begin: Alignment.centerLeft, // 90度相当于从左到右
+                          end: Alignment.centerRight,
+                          colors: [
+                            Color(0xFF7B7DFF), // #7B7DFF
+                            Color(0xFF6365FF), // #6365FF
+                          ],
+                          stops: [0.0, 1.0],
+                          // 从0%到100%
+                        ),
+                        borderRadius: BorderRadius.circular(40.w / 2.0),
+                      ),
+                      margin: EdgeInsets.symmetric(horizontal: 20.w),
+                      height: 40.w,
+                      alignment: Alignment.center,
+                      child: Text("立即邀请",
+                          style: TextStyle(
+                              fontSize: 14.sp,
+                              color: '#FFFFFF'.color,
+                              fontWeight: FontWeight.w500)
+                      ),
+                    ),
+                  ),
+                  SizedBox(
+                    height: 10.w,
+                  ),
+                  GestureDetector(
+                    onTap: widget.cancelOnTap,
+                    child: Container(
+                      height: 20.w,
+                      child: Text("下次再说",
+                          style: TextStyle(
+                              fontSize: 11.sp,
+                              color: '#898996'.color,
+                              fontWeight: FontWeight.w500)
+                      ),
+                    ),
+                  ),
+
+                  SizedBox(
+                    height: 12.w,
+                  ),
+                ],
+              ),
+            )
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 0 - 1
lib/module/mine/mine_expiration_reminder_dialog.dart

@@ -7,7 +7,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:get/get_core/src/get_main.dart';
 import 'package:location/utils/common_expand.dart';
-import 'package:retrofit/http.dart';
 
 import '../../data/api/response/member_trial_info_response.dart';
 import '../../resource/assets.gen.dart';

+ 6 - 0
lib/module/news/news_controller.dart

@@ -9,6 +9,7 @@ import 'package:url_launcher/url_launcher.dart';
 
 import '../../data/bean/message_info.dart';
 import '../../data/bean/request_friend_info.dart';
+import '../add_friend/add_friend_page.dart';
 
 @injectable
 class NewsController extends BaseController {
@@ -101,4 +102,9 @@ class NewsController extends BaseController {
   void onMessageWaitingClick() {
     NewsPendingListPage.start();
   }
+
+  ///添加跳转到加新的朋友
+  void onAddJumpToAddNewFriend() {
+    AddFriendPage.show();
+  }
 }

+ 30 - 2
lib/module/news/news_page.dart

@@ -55,10 +55,38 @@ class NewsPage extends BasePage<NewsController> {
                             controller.messageList.isEmpty
                         ? buildNoMessageView()
                         : buildHasMessageView());
-              })
+              }),
+              SizedBox(
+                height:18.w + 46.w + 10.w,
+              )
             ],
           ),
-        )
+        ),
+        Positioned(
+            bottom: MediaQuery.of(Get.context!).padding.bottom + 18.w,
+            left: 0,
+            right: 0,
+            height: 46.w,
+            child: GestureDetector(
+              onTap: () {
+                controller.onAddJumpToAddNewFriend();
+              },
+              child: Container(
+                decoration: BoxDecoration(
+                  color: "#7B7DFF".color,
+                  borderRadius: BorderRadius.circular(10.w),
+                ),
+                margin: EdgeInsets.symmetric(horizontal: 15.w),
+                height: 46.w,
+                alignment: Alignment.center,
+                child: Text("添加好友",
+                    style: TextStyle(
+                        fontSize: 14.sp,
+                        color: '#FFFFFF'.color,
+                        fontWeight: FontWeight.w500)
+                ),
+              ),
+            )),
       ],
     );
   }

+ 5 - 0
lib/resource/assets.gen.dart

@@ -276,6 +276,10 @@ class $AssetsImagesGen {
   AssetGenImage get iconMemberFun6 =>
       const AssetGenImage('assets/images/icon_member_fun_6.webp');
 
+  /// File path: assets/images/icon_member_payment_completed.webp
+  AssetGenImage get iconMemberPaymentCompleted =>
+      const AssetGenImage('assets/images/icon_member_payment_completed.webp');
+
   /// File path: assets/images/icon_member_retain_close.webp
   AssetGenImage get iconMemberRetainClose =>
       const AssetGenImage('assets/images/icon_member_retain_close.webp');
@@ -532,6 +536,7 @@ class $AssetsImagesGen {
         iconMemberFun3,
         iconMemberFun4,
         iconMemberFun6,
+        iconMemberPaymentCompleted,
         iconMemberRetainClose,
         iconMemberVipMore,
         iconMemberVipReceiveArrow,

+ 10 - 0
lib/utils/payment_status_manager.dart

@@ -5,6 +5,7 @@ import 'package:location/data/bean/pay_item_bean.dart';
 import 'package:location/data/repositories/member_repository.dart';
 import 'package:synchronized/synchronized.dart';
 
+import '../data/api/response/order_first_check_response.dart';
 import '../handler/event_handler.dart';
 import 'async_util.dart';
 
@@ -79,6 +80,15 @@ class PaymentStatusManager {
     });
   }
 
+  ///检查是否是第一次支付
+  Future<OrderFirstCheckResponse> onOrderFirstCheck() {
+    return memberRepository.
+    orderFirstCheck()
+    .then((checkResponse) {
+      return checkResponse;
+    });
+  }
+
   void reportPaySuccess(
       int price, String orderId, String itemName, int paymentWay) {
     EventHandler.reportPay(price, orderId, itemName, paymentWay);