login_controller.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import 'dart:async';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/scheduler.dart';
  4. import 'package:get/get.dart';
  5. import 'package:grpc/grpc.dart';
  6. import 'package:trackoffical_app/logger.dart';
  7. import 'package:trackoffical_app/service/api.dart';
  8. import 'package:trackoffical_app/pb.dart' as pb;
  9. import 'package:trackoffical_app/service/game/game.dart';
  10. import 'package:trackoffical_app/service/game/game_manager_service.dart';
  11. import 'package:trackoffical_app/view/ingame/game_std/game_std_view.dart';
  12. import '../../route.dart';
  13. import '../../utils.dart';
  14. class LoginController extends GetxController {
  15. final phone = "".obs;
  16. final password = "".obs;
  17. final codeRetryLeft = 0.seconds.obs;
  18. Timer? ticker;
  19. var isSignInEnable = true;
  20. final isAgreeContract = false.obs;
  21. @override
  22. void onInit() {
  23. super.onInit();
  24. ticker = Timer.periodic(1.seconds, (timer) {
  25. codeRetryLeft.value -= 1.seconds;
  26. });
  27. }
  28. void onGetCode() async {
  29. info("获取验证码");
  30. await tryCatchApi(
  31. () async {
  32. codeRetryLeft.value =
  33. await ApiService.to.getSmsSendLeftTime(phone.value);
  34. if (codeRetryLeft.value.inSeconds > 0) {
  35. return;
  36. }
  37. await ApiService.to
  38. .authSendCodeToPhone(phone.value, pb.SmsType.Login);
  39. codeRetryLeft.value =
  40. await ApiService.to.getSmsSendLeftTime(phone.value);
  41. info("获取验证码结束");
  42. },
  43. errTitle: '获取验证码失败',
  44. onError: (e) {
  45. if (e.code == StatusCode.notFound) {
  46. Get.snackbar('用户未注册', "请先注册",
  47. isDismissible: true, duration: 3.seconds);
  48. return true;
  49. }
  50. return false;
  51. });
  52. }
  53. Future<void> onSignIn() async {
  54. if (!isAgreeContract.value) {
  55. Get.snackbar('请先', '阅读并同意协议');
  56. return;
  57. }
  58. if (!isSignInEnable) {
  59. return;
  60. }
  61. try {
  62. isSignInEnable = false;
  63. if (phone.value.isEmpty) {
  64. Get.snackbar('手机号错误', "请重新输入",
  65. isDismissible: true, duration: 3.seconds);
  66. return;
  67. }
  68. if (password.value.isEmpty) {
  69. Get.snackbar('验证码错误', "请重新输入",
  70. isDismissible: true, duration: 3.seconds);
  71. return;
  72. }
  73. final args = Get.arguments;
  74. await tryCatchApi(
  75. () async {
  76. info("登录 ${phone.value} ${password.value}");
  77. await ApiService.to.signIn(phone.value, password.value);
  78. if (Get.previousRoute == RouteName.signIn) {
  79. Get.offAllNamed(RouteName.home);
  80. } else {
  81. Get.back(result: true, closeOverlays: true);
  82. }
  83. info("登录成功");
  84. },
  85. errTitle: '登录失败',
  86. onError: (e) {
  87. switch (e.code) {
  88. case StatusCode.unauthenticated:
  89. Get.snackbar('登录失败', "验证码错误");
  90. return true;
  91. case StatusCode.notFound:
  92. Get.snackbar('用户未注册', "请先注册");
  93. return true;
  94. default:
  95. return false;
  96. }
  97. });
  98. } finally {
  99. isSignInEnable = true;
  100. }
  101. }
  102. @override
  103. void onClose() {
  104. ticker?.cancel();
  105. }
  106. }
  107. class LoginControllerMock extends LoginController {}