import 'dart:async'; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:grpc/grpc.dart'; import 'package:track_common/track_common.dart'; import '../../utils.dart'; abstract class LoginController extends GetxController { final phone = "".obs; final password = "".obs; final codeRetryLeft = 0.seconds.obs; Timer? ticker; var isSignInEnable = true; final isAgreeContract = false.obs; Future getCodeLifeTime(String phone); Future authSendCodeToPhone(String phone); Future signIn(String phone, String code); @override void onInit() { super.onInit(); ticker = Timer.periodic(1.seconds, (timer) { codeRetryLeft.value -= 1.seconds; }); } void onGetCode() async { info("获取验证码"); await tryApi( () async { codeRetryLeft.value = await getCodeLifeTime(phone.value); if (codeRetryLeft.value.inSeconds > 0) { return; } await authSendCodeToPhone(phone.value); codeRetryLeft.value = await getCodeLifeTime(phone.value); info("获取验证码结束"); }, errTitle: '获取验证码失败', onError: (e) async { if (e.code == StatusCode.notFound) { Get.snackbar('用户未注册', "请先注册", isDismissible: true, duration: 3.seconds); return true; } return false; }); } Future onSignIn() async { // if (!isAgreeContract.value) { // Get.snackbar('请先', '阅读并同意协议'); // return; // } if (!isSignInEnable) { return; } try { isSignInEnable = false; if (phone.value.isEmpty) { Get.snackbar('手机号错误', "请重新输入"); return; } if (password.value.isEmpty) { Get.snackbar('验证码错误', "请重新输入"); return; } await tryApi( () async { info("登录 ${phone.value} ${password.value}"); await signIn(phone.value, password.value); final call = Get.arguments; info("登录成功"); if (call is VoidCallback) { call(); } else { Get.back(result: true, closeOverlays: true); } }, errTitle: '登录失败', onError: (e) async { switch (e.code) { case StatusCode.unauthenticated: Get.snackbar('登录失败', "验证码错误"); return true; case StatusCode.notFound: Get.snackbar('用户未注册', "请先注册"); return true; default: return false; } }); } finally { isSignInEnable = true; } } @override void onClose() { ticker?.cancel(); } } class LoginControllerMock extends LoginController { @override Future authSendCodeToPhone(String phone) { // TODO: implement authSendCodeToPhone throw UnimplementedError(); } @override Future getCodeLifeTime(String phone) { // TODO: implement getCodeLifeTime throw UnimplementedError(); } @override Future signIn(String phone, String code) { // TODO: implement signIn throw UnimplementedError(); } }