Explorar el Código

[new]完善查看轨迹登录、屏蔽等弹窗流程

zk hace 8 meses
padre
commit
02a2432d43

+ 3 - 0
assets/string/base/string.xml

@@ -157,4 +157,7 @@
     <string name="share_friend_desc">将应用分享给好友,需要好友下载安装并同意授权后可查看定位。
     </string>
     <string name="wechat_no_install">微信未安装</string>
+    <string name="dialog_not_login_view_trace_tip">登录即可体验查看轨迹记录</string>
+    <string name="friend_not_open_location_share">该好友没有开启位置分享</string>
+    <string name="friend_go_instruct_him">去通知Ta</string>
 </resources>

+ 5 - 0
lib/data/repositories/account_repository.dart

@@ -184,6 +184,11 @@ class AccountRepository {
   static AccountRepository getInstance() {
     return getIt.get<AccountRepository>();
   }
+
+  bool memberIsExpired() {
+    return memberStatusInfo.value == null ||
+        memberStatusInfo.value?.expired == true;
+  }
 }
 
 class RequestCodeTooOftenException implements Exception {

+ 4 - 0
lib/di/get_it.config.dart

@@ -24,8 +24,10 @@ import '../module/friend/friend_controller.dart' as _i821;
 import '../module/friend/setting/friend_setting_controller.dart' as _i492;
 import '../module/login/login_controller.dart' as _i1008;
 import '../module/main/main_controller.dart' as _i731;
+import '../module/member/member_controller.dart' as _i269;
 import '../module/mine/mine_controller.dart' as _i732;
 import '../module/splash/splash_controller.dart' as _i973;
+import '../module/trace/trace_controller.dart' as _i504;
 import '../socket/atmob_location_client.dart' as _i220;
 import 'network_module.dart' as _i567;
 
@@ -43,6 +45,8 @@ extension GetItInjectableX on _i174.GetIt {
     final networkModule = _$NetworkModule();
     gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
     gh.factory<_i973.SplashController>(() => _i973.SplashController());
+    gh.factory<_i269.MemberController>(() => _i269.MemberController());
+    gh.factory<_i504.TraceController>(() => _i504.TraceController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.lazySingleton<_i220.AtmobLocationClient>(
         () => _i220.AtmobLocationClient());

+ 26 - 0
lib/dialog/common_alert_dialog_impl.dart

@@ -56,3 +56,29 @@ void deleteFriendDialog({required VoidCallback confirmOnTap}) {
         CommonAlertDialog.dismiss(tag: tag);
       });
 }
+
+void showBlockMeTipDialog({required VoidCallback confirmOnTap}) {
+  final tag = 'showBlockMeTipDialog';
+  CommonAlertDialog.show(
+      tag: tag,
+      titleWidget: Text(
+        StringName.kindlyReminder,
+        style: TextStyle(
+            fontSize: 17.sp,
+            color: '#333333'.color,
+            fontWeight: FontWeight.bold),
+      ),
+      descWidget: Text(
+        StringName.friendNotOpenLocationShare,
+        style: TextStyle(fontSize: 15.sp, color: '#404040'.color),
+      ),
+      cancelText: StringName.dialogCancel,
+      confirmText: StringName.friendGoInstructHim,
+      cancelOnTap: () {
+        CommonAlertDialog.dismiss(tag: tag);
+      },
+      confirmOnTap: () {
+        confirmOnTap();
+        CommonAlertDialog.dismiss(tag: tag);
+      });
+}

+ 15 - 0
lib/dialog/common_confirm_dialog_impl.dart

@@ -70,3 +70,18 @@ void showAppShareDialog({required VoidCallback onConfirm}) {
       confirmText: StringName.inviteBtn,
       confirmOnTap: onConfirm);
 }
+
+void showTraceTipsDialog({required VoidCallback onConfirm}) {
+  CommonConfirmDialog.show(
+      titleWidget: Text(StringName.kindlyReminder,
+          style: TextStyle(
+              fontSize: 17.sp,
+              color: '#333333'.color,
+              fontWeight: FontWeight.bold)),
+      descWidget: Text(
+        StringName.dialogNotLoginViewTraceTip,
+        style: TextStyle(fontSize: 14.sp, color: '#404040'.color),
+      ),
+      confirmText: StringName.dialogGoLogin,
+      confirmOnTap: onConfirm);
+}

+ 2 - 19
lib/module/add_friend/add_friend_dialog_controller.dart

@@ -2,23 +2,18 @@ import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/data/consts/error_code.dart';
-import 'package:location/data/consts/web_url.dart';
 import 'package:location/data/repositories/friends_repository.dart';
 import 'package:location/module/login/login_page.dart';
-import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/string.gen.dart';
-import 'package:location/sdk/wechat/wechat_helper.dart';
 import 'package:location/utils/common_expand.dart';
 import 'package:location/utils/http_handler.dart';
 import 'package:location/utils/permission_util.dart';
 import 'package:location/utils/toast_util.dart';
 import 'package:permission_handler/permission_handler.dart';
-import 'package:wechat_kit/wechat_kit.dart';
 import '../../../base/base_controller.dart';
 import '../../dialog/common_confirm_dialog_impl.dart';
 import 'package:flutter_contacts/flutter_contacts.dart';
-
-import '../../sdk/wechat/wechat_share_helper.dart';
+import '../../sdk/wechat/wechat_share_util.dart';
 import '../../utils/de_bounce.dart';
 
 @injectable
@@ -89,18 +84,7 @@ class AddFriendDialogController extends BaseController {
   }
 
   void _shareToWechat() async {
-    if (!await WechatHelper.isInstalled()) {
-      ToastUtil.show(StringName.wechatNoInstall);
-      return;
-    }
-    WechatHelper.shareUrlToWechat(
-            scene: WechatScene.kSession,
-            webpageUrl: WebUrl.shareUrl,
-            title: StringName.shareFriendTitle,
-            description: StringName.shareFriendDesc,
-            thumbData: await WechatShareHelper.assetImageToBytes(
-                Assets.images.iconMainMapClock.path))
-        .catchError((error) {
+    WechatShareUtil.shareWebPage().catchError((error) {
       ToastUtil.show(error.toString());
     });
   }
@@ -111,7 +95,6 @@ class AddFriendDialogController extends BaseController {
     });
   }
 
-
   void onSelectContactClick() async {
     bool isGranted = await PermissionUtil.checkPermission(Permission.contacts);
     if (!isGranted) {

+ 30 - 0
lib/module/friend/friend_controller.dart

@@ -10,6 +10,13 @@ import 'package:location/data/repositories/friends_repository.dart';
 import 'package:location/module/friend/setting/friend_setting_page.dart';
 
 import '../../data/bean/user_info.dart';
+import '../../dialog/common_alert_dialog_impl.dart';
+import '../../dialog/common_confirm_dialog_impl.dart';
+import '../../sdk/wechat/wechat_share_util.dart';
+import '../../utils/toast_util.dart';
+import '../login/login_page.dart';
+import '../member/member_page.dart';
+import '../trace/trace_page.dart';
 
 @injectable
 class FriendController extends BaseController {
@@ -63,4 +70,27 @@ class FriendController extends BaseController {
   void onEditClick(UserInfo e) {
     FriendSettingPage.start(e);
   }
+
+  void onViewTraceClick(UserInfo userInfo) {
+    if (!accountRepository.isLogin.value) {
+      showTraceTipsDialog(onConfirm: () {
+        LoginPage.start();
+      });
+      return;
+    }
+    if (accountRepository.memberIsExpired()) {
+      MemberPage.start();
+      return;
+    }
+
+    if (userInfo.blockedMe == true) {
+      showBlockMeTipDialog(confirmOnTap: () {
+        WechatShareUtil.shareWebPage().catchError((error) {
+          ToastUtil.show(error.toString());
+        });
+      });
+      return;
+    }
+    TracePage.start();
+  }
 }

+ 17 - 11
lib/module/friend/friend_list_item.dart

@@ -11,7 +11,8 @@ import '../../resource/assets.gen.dart';
 import '../../resource/colors.gen.dart';
 import '../../utils/date_util.dart';
 
-Widget buildFriendItem(UserInfo userInfo, {VoidCallback? onEditClick}) {
+Widget buildFriendItem(UserInfo userInfo,
+    {VoidCallback? onEditClick, VoidCallback? viewTraceClick}) {
   return Container(
     margin: EdgeInsets.only(left: 12.w, right: 12.w, bottom: 10.w),
     width: double.infinity,
@@ -126,16 +127,21 @@ Widget buildFriendItem(UserInfo userInfo, {VoidCallback? onEditClick}) {
                   ),
                 ),
                 SizedBox(width: 20.w),
-                Container(
-                  margin: EdgeInsets.only(right: 12.w),
-                  decoration: BoxDecoration(
-                      color: ColorName.colorPrimary,
-                      borderRadius: BorderRadius.circular(36.w)),
-                  padding:
-                      EdgeInsets.symmetric(horizontal: 14.w, vertical: 8.w),
-                  child: Text(
-                    StringName.examineTrace,
-                    style: TextStyle(fontSize: 12.sp, color: ColorName.white),
+                GestureDetector(
+                  onTap: () {
+                    viewTraceClick?.call();
+                  },
+                  child: Container(
+                    margin: EdgeInsets.only(right: 12.w),
+                    decoration: BoxDecoration(
+                        color: ColorName.colorPrimary,
+                        borderRadius: BorderRadius.circular(36.w)),
+                    padding:
+                        EdgeInsets.symmetric(horizontal: 14.w, vertical: 8.w),
+                    child: Text(
+                      StringName.examineTrace,
+                      style: TextStyle(fontSize: 12.sp, color: ColorName.white),
+                    ),
                   ),
                 ),
               ],

+ 12 - 3
lib/module/friend/friend_page.dart

@@ -63,16 +63,25 @@ class FriendPage extends BasePage<FriendController> {
                       ),
                       SizedBox(height: 10.w),
                       Obx(() {
-                        return buildFriendItem(controller.mineUserInfo);
+                        return buildFriendItem(controller.mineUserInfo,
+                            onEditClick: () =>
+                                controller.onEditClick(controller.mineUserInfo),
+                            viewTraceClick: () => controller
+                                .onViewTraceClick(controller.mineUserInfo));
                       }),
                       Obx(() {
                         return controller.virtualFriendInfo == null
                             ? SizedBox.shrink()
-                            : buildFriendItem(controller.virtualFriendInfo!);
+                            : buildFriendItem(controller.virtualFriendInfo!,
+                                viewTraceClick: () =>
+                                    controller.onViewTraceClick(
+                                        controller.virtualFriendInfo!));
                       }),
                       ...controller.friendsList.map((e) => Obx(() {
                             return buildFriendItem(e,
-                                onEditClick: () => controller.onEditClick(e));
+                                onEditClick: () => controller.onEditClick(e),
+                                viewTraceClick: () =>
+                                    controller.onViewTraceClick(e));
                           }))
                     ],
                   );

+ 30 - 0
lib/module/main/main_controller.dart

@@ -12,11 +12,18 @@ import 'package:location/data/repositories/friends_repository.dart';
 import 'package:flutter_map/flutter_map.dart';
 import 'package:location/handler/error_handler.dart';
 import 'package:location/module/friend/friend_page.dart';
+import 'package:location/module/login/login_page.dart';
+import 'package:location/module/member/member_page.dart';
+import 'package:location/module/trace/trace_page.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/sdk/map/map_helper.dart';
+import 'package:location/sdk/wechat/wechat_helper.dart';
 import 'package:location/utils/base_expand.dart';
 import 'package:location/utils/toast_util.dart';
 import '../../data/repositories/config_repository.dart';
+import '../../dialog/common_alert_dialog_impl.dart';
+import '../../dialog/common_confirm_dialog_impl.dart';
+import '../../sdk/wechat/wechat_share_util.dart';
 import '../../socket/atmob_location_client.dart';
 import '../../dialog/friend_dialog.dart';
 import '../../dialog/check_loation_permission_dialog.dart';
@@ -230,4 +237,27 @@ class MainController extends BaseController {
     friendsListSubscription?.cancel();
     loginSubscription?.cancel();
   }
+
+  void onViewTraceClick(UserInfo userInfo) {
+    if (!accountRepository.isLogin.value) {
+      showTraceTipsDialog(onConfirm: () {
+        LoginPage.start();
+      });
+      return;
+    }
+    if (accountRepository.memberIsExpired()) {
+      MemberPage.start();
+      return;
+    }
+
+    if (userInfo.blockedMe == true) {
+      showBlockMeTipDialog(confirmOnTap: () {
+        WechatShareUtil.shareWebPage().catchError((error) {
+          ToastUtil.show(error.toString());
+        });
+      });
+      return;
+    }
+    TracePage.start();
+  }
 }

+ 15 - 9
lib/module/main/main_friend_item.dart

@@ -73,7 +73,8 @@ Widget mainFriendItem(UserInfo userInfo, bool isSelected,
   );
 }
 
-Widget mainSelectedFriendItem(UserInfo userInfo) {
+Widget mainSelectedFriendItem(UserInfo userInfo,
+    {VoidCallback? viewTraceClick}) {
   return Container(
       width: 336.w,
       height: 86.w,
@@ -114,14 +115,19 @@ Widget mainSelectedFriendItem(UserInfo userInfo) {
                           style: TextStyle(
                               fontSize: 12.sp, color: '#A7A7A7'.color)),
                       Spacer(),
-                      Container(
-                          margin: EdgeInsets.only(right: 16.w),
-                          decoration: getPrimaryBtnDecoration(32.w),
-                          padding: EdgeInsets.symmetric(
-                              horizontal: 21.w, vertical: 5.w),
-                          child: Text(StringName.locationTrace,
-                              style: TextStyle(
-                                  fontSize: 15.sp, color: Colors.white)))
+                      GestureDetector(
+                        onTap: () {
+                          viewTraceClick?.call();
+                        },
+                        child: Container(
+                            margin: EdgeInsets.only(right: 16.w),
+                            decoration: getPrimaryBtnDecoration(32.w),
+                            padding: EdgeInsets.symmetric(
+                                horizontal: 21.w, vertical: 5.w),
+                            child: Text(StringName.locationTrace,
+                                style: TextStyle(
+                                    fontSize: 15.sp, color: Colors.white))),
+                      )
                     ],
                   ),
                   Expanded(

+ 4 - 2
lib/module/main/main_page.dart

@@ -160,7 +160,8 @@ class MainPage extends BasePage<MainController> {
     return Row(
       children: [
         Expanded(
-            child: buildFunItem(Assets.images.iconMainFriendGuard.provider(),
+            child: buildFunItem(
+                Assets.images.iconMainFriendGuard.provider(),
                 StringName.mainFriendListTab,
                 () => controller.onFriendClick())),
         Expanded(
@@ -218,7 +219,8 @@ class MainPage extends BasePage<MainController> {
       if (userInfo == null) {
         return SizedBox.shrink();
       }
-      return mainSelectedFriendItem(userInfo);
+      return mainSelectedFriendItem(userInfo,
+          viewTraceClick: () => controller.onViewTraceClick(userInfo));
     });
   }
 

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

@@ -0,0 +1,5 @@
+import 'package:injectable/injectable.dart';
+import 'package:location/base/base_controller.dart';
+
+@injectable
+class MemberController extends BaseController {}

+ 21 - 0
lib/module/member/member_page.dart

@@ -0,0 +1,21 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:location/base/base_page.dart';
+import 'package:location/module/member/member_controller.dart';
+
+import '../../router/app_pages.dart';
+
+class MemberPage extends BasePage<MemberController> {
+  const MemberPage({super.key});
+
+  static void start() {
+    Get.toNamed(RoutePath.member);
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Text('这是会员页');
+  }
+}

+ 5 - 0
lib/module/trace/trace_controller.dart

@@ -0,0 +1,5 @@
+import 'package:injectable/injectable.dart';
+import 'package:location/base/base_controller.dart';
+
+@injectable
+class TraceController extends BaseController {}

+ 21 - 0
lib/module/trace/trace_page.dart

@@ -0,0 +1,21 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:location/base/base_page.dart';
+import 'package:location/module/trace/trace_controller.dart';
+
+import '../../router/app_pages.dart';
+
+class TracePage extends BasePage<TraceController> {
+  const TracePage({super.key});
+
+  static void start() {
+    Get.toNamed(RoutePath.trace);
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Text('这是轨迹查询页');
+  }
+}

+ 9 - 0
lib/resource/string.gen.dart

@@ -128,6 +128,12 @@ class StringName {
   static final String shareFriendTitle = 'share_friend_title'.tr; // 邀请好友
   static final String shareFriendDesc = 'share_friend_desc'.tr; // 将应用分享给好友,需要好友下载安装并同意授权后可查看定位。
   static final String wechatNoInstall = 'wechat_no_install'.tr; // 微信未安装
+  static final String dialogNotLoginViewTraceTip =
+      'dialog_not_login_view_trace_tip'.tr; // 登录即可体验查看轨迹记录
+  static final String friendNotOpenLocationShare =
+      'friend_not_open_location_share'.tr; // 该好友没有开启位置分享
+  static final String friendGoInstructHim =
+      'friend_go_instruct_him'.tr; // 去通知Ta
 }
 class StringMultiSource {
   StringMultiSource._();
@@ -259,6 +265,9 @@ class StringMultiSource {
       'share_friend_title': '邀请好友',
       'share_friend_desc': '将应用分享给好友,需要好友下载安装并同意授权后可查看定位。',
       'wechat_no_install': '微信未安装',
+      'dialog_not_login_view_trace_tip': '登录即可体验查看轨迹记录',
+      'friend_not_open_location_share': '该好友没有开启位置分享',
+      'friend_go_instruct_him': '去通知Ta',
     },
   };
 }

+ 10 - 2
lib/router/app_pages.dart

@@ -1,19 +1,21 @@
 import 'package:get/get.dart';
 import 'package:location/di/get_it.dart';
 import 'package:location/module/browser/browser_controller.dart';
-import 'package:location/module/browser/browser_view.dart';
 import 'package:location/module/friend/friend_controller.dart';
 import 'package:location/module/friend/friend_page.dart';
 import 'package:location/module/friend/setting/friend_setting_controller.dart';
 import 'package:location/module/friend/setting/friend_setting_page.dart';
 import 'package:location/module/login/login_controller.dart';
 import 'package:location/module/main/main_page.dart';
+import 'package:location/module/member/member_controller.dart';
+import 'package:location/module/member/member_page.dart';
 import 'package:location/module/mine/mine_page.dart';
+import 'package:location/module/trace/trace_controller.dart';
+import 'package:location/module/trace/trace_page.dart';
 import '../module/add_friend/add_friend_dialog_controller.dart';
 import '../module/login/login_page.dart';
 import '../module/main/main_controller.dart';
 import '../module/mine/mine_controller.dart';
-import '../module/splash/splash_controller.dart';
 import '../module/splash/splash_page.dart';
 
 abstract class AppPage {
@@ -29,6 +31,8 @@ abstract class RoutePath {
   static const browser = '/browser';
   static const friend = '/friend';
   static const friendSetting = '/friendSetting';
+  static const member = '/member';
+  static const trace = '/trace';
 }
 
 class AppBinding extends Bindings {
@@ -41,6 +45,8 @@ class AppBinding extends Bindings {
     lazyPut(() => getIt.get<BrowserController>());
     lazyPut(() => getIt.get<FriendController>());
     lazyPut(() => getIt.get<FriendSettingController>());
+    lazyPut(() => getIt.get<MemberController>());
+    lazyPut(() => getIt.get<TraceController>());
   }
 
   void lazyPut<S>(InstanceBuilderCallback<S> builder) {
@@ -55,4 +61,6 @@ final generalPages = [
   GetPage(name: RoutePath.mine, page: () => MinePage()),
   GetPage(name: RoutePath.friend, page: () => FriendPage()),
   GetPage(name: RoutePath.friendSetting, page: () => FriendSettingPage()),
+  GetPage(name: RoutePath.member, page: () => MemberPage()),
+  GetPage(name: RoutePath.trace, page: () => TracePage()),
 ];

+ 0 - 11
lib/sdk/wechat/wechat_share_helper.dart

@@ -1,11 +0,0 @@
-import 'package:flutter/foundation.dart';
-import 'package:flutter/services.dart';
-
-class WechatShareHelper {
-  WechatShareHelper._();
-
-  static Future<Uint8List> assetImageToBytes(String assetPath) async {
-    final ByteData byteData = await rootBundle.load(assetPath);
-    return byteData.buffer.asUint8List();
-  }
-}

+ 29 - 0
lib/sdk/wechat/wechat_share_util.dart

@@ -0,0 +1,29 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:location/sdk/wechat/wechat_helper.dart';
+import 'package:wechat_kit/wechat_kit.dart';
+import '../../data/consts/web_url.dart';
+import '../../resource/assets.gen.dart';
+import '../../resource/string.gen.dart';
+
+class WechatShareUtil {
+  WechatShareUtil._();
+
+  static Future<void> shareWebPage() async {
+    if (!await WechatHelper.isInstalled()) {
+      throw Exception(StringName.wechatNoInstall);
+    }
+    return WechatHelper.shareUrlToWechat(
+        scene: WechatScene.kSession,
+        webpageUrl: WebUrl.shareUrl,
+        title: StringName.shareFriendTitle,
+        description: StringName.shareFriendDesc,
+        thumbData:
+            await assetImageToBytes(Assets.images.iconMainMapClock.path));
+  }
+
+  static Future<Uint8List> assetImageToBytes(String assetPath) async {
+    final ByteData byteData = await rootBundle.load(assetPath);
+    return byteData.buffer.asUint8List();
+  }
+}