import 'dart:async'; import 'package:electronic_assistant/base/app_base_request.dart'; import 'package:electronic_assistant/data/api/atmob_api.dart'; import 'package:electronic_assistant/data/api/request/complaint_submit_request.dart'; import 'package:electronic_assistant/data/repositories/task_repository.dart'; import 'package:electronic_assistant/utils/async_util.dart'; import 'package:electronic_assistant/utils/event_bus.dart'; import 'package:electronic_assistant/utils/mmkv_util.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import '../../resource/string.gen.dart'; import '../../sdk/gravity/gravity_helper.dart'; import '../../utils/http_handler.dart'; import '../api/request/login_request.dart'; import '../api/request/user_info_update_request.dart'; import '../api/request/verification_code_request.dart'; import '../api/response/login_response.dart'; import '../api/response/user_info_response.dart'; import '../consts/error_code.dart'; const String EventUserLogin = 'EventUserLogin'; const String EventUserLogout = 'EventUserLogout'; class AccountRepository { final ACCOUNT_TOKEN = 'account_token'; final ACCOUNT_PHONE = 'account_phone'; static String? token; String? _phone; final isLogin = false.obs; final Rxn _userInfo = Rxn(); CancelableFuture? _getUserInfoFuture; AccountRepository._() { debugPrint('AccountRepository init'); token = KVUtil.getString(ACCOUNT_TOKEN, null); _phone = KVUtil.getString(ACCOUNT_PHONE, null); refreshUserInfo(); if (token != null && token!.isNotEmpty) { isLogin.value = true; taskRepository.startUnfinishedTask(); } } Rxn get userInfo => _userInfo; String? get phone => _phone; Future getVerificationCode(String phone) { return atmobApi .getVerificationCode(VerificationCodeRequest(phone)) .then(HttpHandler.handle(true)); } Future userDeprecate() { return atmobApi .userDeprecate(AppBaseRequest()) .then(HttpHandler.handle(true)); } Future updateUserInfo(String profession, String post) { return atmobApi .updateUserInfo(UserInfoUpdateRequest(profession, post)) .then(HttpHandler.handle(true)) .then((data) { accountRepository.refreshUserInfo(); }); } Future? refreshUserInfo() { if (_getUserInfoFuture != null) { _getUserInfoFuture?.cancel(); } _getUserInfoFuture = AsyncUtil.retryWithExponentialBackoff( () => getUserInfo(), 10, predicate: (error) { if (error is ServerErrorException) { return error.code != ErrorCode.errorCodeNoLogin; } return true; }); return _getUserInfoFuture; } Future getUserInfo() { return atmobApi .userInfo(AppBaseRequest()) .then(HttpHandler.handle(false)) .then((response) { if (response.loginStatus == 0) { logout(); } else { isLogin.value = true; } _userInfo.value = response; return response; }); } Future login(String phone, String code) { return atmobApi .login(LoginRequest(phone, code)) .then(HttpHandler.handle(false)) .then((response) { onLoginSuccess(phone, response.authToken); return response; }); } Future complaintSubmit(int type, String content) { return atmobApi .complaintSubmit(ComplaintSubmitRequest(type, content)) .then(HttpHandler.handle(true)); } void onLoginSuccess(String phone, String? token) { AccountRepository.token = token; _phone = phone; KVUtil.putString(ACCOUNT_TOKEN, token); KVUtil.putString(ACCOUNT_PHONE, phone); isLogin.value = true; refreshUserInfo(); taskRepository.startUnfinishedTask(); eventBus.emit(EventUserLogin); GravityHelper.onLogin(); } void logout() { _phone = null; AccountRepository.token = null; KVUtil.putString(ACCOUNT_TOKEN, null); KVUtil.putString(ACCOUNT_PHONE, null); isLogin.value = false; taskRepository.stopTask(); _userInfo.value = null; eventBus.emit(EventUserLogout); GravityHelper.onLogout(); } getUserSubName(String? phone) { String name = StringName.account.tr; if (phone == null) { return name; } //后4位 if (phone.length > 4) { phone = phone.substring(phone.length - 4); } return '$name$phone'; } } final accountRepository = AccountRepository._();