周睿 il y a 1 an
Parent
commit
9ee3cb5a49

+ 14 - 5
app_business/lib/view/home/dialog_event_register.dart

@@ -39,6 +39,7 @@ class RegisterDialogController extends GetxController {
   var password = '';
   late final int mapId;
   late final Iterable<EventInfo>? eventList;
+  late final _args;
 
   String? get dateString {
     final d = date.value;
@@ -51,6 +52,7 @@ class RegisterDialogController extends GetxController {
   @override
   void onInit() {
     final args = Get.arguments;
+    _args = args;
 
     if (args is _ArgCreate) {
       mapId = args.mapId;
@@ -195,10 +197,17 @@ class RegisterDialog extends GetView<RegisterDialogController> {
     final timeStartAt = controller.registerStartAt.value;
     final timeStopAt = controller.registerStopAt.value;
     final selected = controller.selected.value;
-
-    if (selected == null) {
-      Get.snackbar('错误', '请选择一个活动');
-      return;
+    final args = controller._args;
+    var selectedId = -1;
+    if (args is _ArgCreate) {
+      if (selected == null) {
+        Get.snackbar('错误', '请选择一个活动');
+        return;
+      }
+      selectedId = selected.id;
+    }
+    if (args is _ArgEdit) {
+      selectedId = args.old.id;
     }
 
     if (controller.registerName.isEmpty) {
@@ -232,7 +241,7 @@ class RegisterDialog extends GetView<RegisterDialogController> {
 
     Get.back(
         result: EventRegisterInfo()
-          ..id = selected.id
+          ..id = selectedId
           ..name = controller.registerName
           ..startAt = startAt
           ..stopAt = stopAt

+ 36 - 22
app_business/lib/view/home/event_manage/event_manage.dart

@@ -2,6 +2,7 @@ import 'package:app_business/service/api.dart';
 import 'package:app_business/view/home/dialog_event_register.dart';
 import 'package:pretty_qr_code/pretty_qr_code.dart';
 import 'package:track_common/model/event_state.dart';
+import 'package:track_common/utils.dart';
 import 'package:track_common/widget.dart';
 import 'package:track_common/widget/prelude.dart';
 
@@ -41,36 +42,49 @@ class EventManage extends GetView<EventManagerController> {
   Widget wTopButtons(BuildContext context) {
     return Obx(() {
       final enable = controller.selected?.state == EventState.start;
+      final buttons = [
+        (Colors.orange, '一键重赛', controller.userRestartAll),
+        (Colors.blue, '一键分发', controller.routeAllocAll),
+        (Colors.green, '一键开始', controller.userStartAll),
+        (Colors.red, '一键删除', controller.userDelAll),
+      ];
+
+      final List<Widget> children = buttons.map((e) {
+        return AppButton.outlined(
+          color: e.$1,
+          onPressed: onDoAll(context, enable, e.$2, e.$3),
+          child: Text(e.$2),
+        );
+      }).toList();
 
       return Row(
         mainAxisSize: MainAxisSize.min,
         mainAxisAlignment: MainAxisAlignment.spaceBetween,
-        children: [
-          AppButton.outlined(
-            color: Colors.orange,
-            onPressed: enable ? controller.userRestartAll : null,
-            child: const Text('一键重赛'),
-          ),
-          AppButton.outlined(
-            color: Colors.blue,
-            onPressed: enable ? controller.routeAllocAll : null,
-            child: const Text('一键分发'),
-          ),
-          AppButton.outlined(
-            color: Colors.green,
-            onPressed: enable ? controller.userStartAll : null,
-            child: const Text('一键开始'),
-          ),
-          AppButton.outlined(
-            color: Colors.red,
-            onPressed: enable ? controller.userDelAll : null,
-            child: const Text('一键删除'),
-          )
-        ],
+        children: children,
       );
     });
   }
 
+  void Function()? onDoAll(BuildContext context, bool enable, String title,
+      Future<void> Function() then) {
+    return enable ? () => doAll(context, title, then) : null;
+  }
+
+  Future<void> doAll(
+      BuildContext context, String title, Future<void> Function() then) async {
+    Get.dialog(AppDialog(
+        title: Text('确认$title?'),
+        onCancelText: '取消',
+        onConfirmText: '确认',
+        onConfirm: () => context.doCall(() async {
+              await then();
+              if (context.mounted) {
+                ScaffoldMessenger.of(context)
+                    .showSnackBar(const SnackBar(content: Text('操作成功')));
+              }
+            }, onFinally: () => Get.back())));
+  }
+
   Widget wDate(BuildContext context) {
     return GestureDetector(
         onTap: () => _onTapDate(context),

+ 4 - 8
app_business/lib/view/home/event_manage/event_manage_controller.dart

@@ -175,8 +175,7 @@ class EventManagerController extends GetxController {
   Future<void> routeAllocAll() async {
     final idList = selectedUser.value.toList();
     if (idList.isEmpty) {
-      Get.snackbar('操作失败', '请选择1个以上的用户');
-      return;
+      throw ArgumentError('操作失败 请选择1个以上的用户');
     }
     await _api.eventUserAllocRouteAll(idList);
   }
@@ -184,8 +183,7 @@ class EventManagerController extends GetxController {
   Future<void> userStartAll() async {
     final idList = selectedUser.value.toList();
     if (idList.isEmpty) {
-      Get.snackbar('操作失败', '请选择1个以上的用户');
-      return;
+      throw ArgumentError('操作失败 请选择1个以上的用户');
     }
     await _api.eventUserStartAll(idList);
   }
@@ -193,8 +191,7 @@ class EventManagerController extends GetxController {
   Future<void> userRestartAll() async {
     final idList = selectedUser.value.toList();
     if (idList.isEmpty) {
-      Get.snackbar('操作失败', '请选择1个以上的用户');
-      return;
+      throw ArgumentError('操作失败 请选择1个以上的用户');
     }
     await _api.eventUserRestartAll(idList);
   }
@@ -202,8 +199,7 @@ class EventManagerController extends GetxController {
   Future<void> userDelAll() async {
     final idList = selectedUser.value.toList();
     if (idList.isEmpty) {
-      Get.snackbar('操作失败', '请选择1个以上的用户');
-      return;
+      throw ArgumentError('操作失败 请选择1个以上的用户');
     }
     await _api.eventUserDelAll(idList);
   }

+ 1 - 1
app_business/pubspec.yaml

@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
 # In Windows, build-name is used as the major, minor, and patch parts
 # of the product and file versions while build-number is used as the build suffix.
-version: 1.1.0+1
+version: 1.1.1+1
 
 environment:
   sdk: '>=3.1.5 <4.0.0'

+ 50 - 0
libs/track_common/lib/utils.dart

@@ -1,4 +1,5 @@
 import 'package:common_pub/common_pub.dart';
+import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:grpc/grpc.dart';
@@ -39,6 +40,55 @@ Future<void> tryApi(
   );
 }
 
+extension BuildContextExt on BuildContext {
+  void _showSnakeBar(String msg) {
+    ScaffoldMessenger.of(this).showSnackBar(SnackBar(content: Text(msg)));
+  }
+
+  Future<void> doCall(
+    Future<void> Function() call, {
+    Future<bool> Function(Error err)? onError,
+    Future<bool> Function(GrpcError err)? onGrpcError,
+    VoidCallback? onFinally,
+  }) async {
+    try {
+      await call();
+    } on GrpcError catch (e) {
+      if (onGrpcError != null) {
+        if (await onGrpcError(e)) {
+          return;
+        }
+      }
+
+      switch (e.code) {
+        case StatusCode.unavailable:
+          _showSnakeBar('网络错误,请稍后再试');
+          break;
+        case StatusCode.unauthenticated:
+          if (await LoginView.to()) {
+            try {
+              await call();
+            } catch (e) {
+              _showSnakeBar('出错了,未知错误');
+            }
+          }
+          break;
+        case StatusCode.unknown:
+          _showSnakeBar('出错了,未知错误');
+          break;
+        default:
+          _showSnakeBar('出错了,${e.message ?? ''}');
+      }
+    } on ArgumentError catch (e) {
+      _showSnakeBar('出错了,${kDebugMode ? e.message : '未知错误'}');
+    } catch (e) {
+      _showSnakeBar('出错了,${kDebugMode ? e.toString() : '未知错误'}');
+    } finally {
+      onFinally?.call();
+    }
+  }
+}
+
 class Preview extends StatelessWidget {
   const Preview({super.key, required this.child});