import 'dart:async'; import 'dart:ffi'; import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:wechat_kit/wechat_kit.dart'; import 'package:get/get.dart'; import 'package:injectable/injectable.dart'; import 'package:keyboard/base/base_controller.dart'; import 'package:keyboard/data/repository/account_repository.dart'; import 'package:keyboard/dialog/loading_dialog.dart'; import 'package:keyboard/module/login/login_page.dart'; import 'package:keyboard/utils/atmob_log.dart'; import 'package:keyboard/utils/toast_util.dart'; import 'package:sign_in_with_apple/sign_in_with_apple.dart'; import '../../data/consts/error_code.dart'; import '../../data/consts/event_report.dart'; import '../../handler/event_handler.dart'; import '../../handler/wechat_login_service.dart'; import '../../resource/string.gen.dart'; import '../../utils/error_handler.dart'; import '../../utils/http_handler.dart'; import '../member_agreement_dialog.dart'; import '../privacy_agreement_dialog.dart'; import 'login_dialog.dart'; @injectable class LoginDialogController extends BaseController { final tag = "LoginDialogController"; final WechatLoginService wechatLoginService; final AccountRepository accountRepository; final RxBool isInstallWechat = false.obs; LoginDialogController(this.wechatLoginService, this.accountRepository); final RxBool _isAgree = false.obs; bool get isAgree => _isAgree.value; clickAgree() { _isAgree.value = !_isAgree.value; } void clickWxLogin() async { EventHandler.report(EventId.event_04001); if (!_isAgree.value) { PrivacyAgreementDialog.show( btnConfirm: () async { _isAgree.value = true; clickWxLogin(); }, ); return; } wechatLoginService.login( onSuccess: (code) { accountRepository .wechatLogin(code) .then((data) { ToastUtil.show(StringName.loginSuccess); SmartDialog.dismiss(tag: LoginDialog.TAG); EventHandler.report(EventId.event_04003); }) .catchError((error) { if (error is ServerErrorException) { if (error.code == ErrorCode.verificationCodeError) { ToastUtil.show(StringName.loginVerificationCodeErrorToast); } else { ToastUtil.show(error.message); } } else { ErrorHandler.toastError(error); } EventHandler.report(EventId.event_04004); }); }, onError: (code, msg) { EventHandler.report(EventId.event_04004); ToastUtil.show("微信登录失败:$msg"); }, onCancel: () { EventHandler.report(EventId.event_04004); ToastUtil.show("用户取消登录"); }, ); } // 苹果登录点击 void clickAppleLogin() async { if (!_isAgree.value) { PrivacyAgreementDialog.show( btnConfirm: () async { _isAgree.value = true; clickAppleLogin(); }, ); ToastUtil.show(StringName.loginAgreePrivacy); return; } CustomLoadingDialog.show(); AuthorizationCredentialAppleID credential; try { credential = await SignInWithApple.getAppleIDCredential( scopes: [ AppleIDAuthorizationScopes.email, AppleIDAuthorizationScopes.fullName, ], ); } catch (error) { CustomLoadingDialog.hide(); ToastUtil.show(StringName.loginFailedToast); return; } var userIdentity = credential.userIdentifier ?? ""; var authorizationCode = credential.authorizationCode ?? ""; var identityToken = credential.identityToken ?? ""; accountRepository .appleLogin(userIdentity, authorizationCode, identityToken) .then((data) { CustomLoadingDialog.hide(); EventHandler.report(EventId.event_04003); SmartDialog.dismiss(tag: LoginDialog.TAG); ToastUtil.show(StringName.loginSuccess); }) .catchError((error) { CustomLoadingDialog.hide(); EventHandler.report(EventId.event_04004); if (error is LoginTooOftenException) { ToastUtil.show(StringName.loginTooOftenToast); return; } if (error is ServerErrorException) { if (error.code == ErrorCode.verificationCodeError) { ToastUtil.show(StringName.loginVerificationCodeErrorToast); } else { ToastUtil.show(error.message); } } else { ErrorHandler.toastError(error); } }); } void clickClose() { AtmobLog.d(tag, "clickClose"); SmartDialog.dismiss(tag: LoginDialog.TAG); } void clickPhoneLogin() { AtmobLog.d(tag, "clickPhoneLogin"); EventHandler.report(EventId.event_04002); LoginPage.start(); SmartDialog.dismiss(tag: LoginDialog.TAG); } @override void onInit() { super.onInit(); checkIsInstallWechat(); } @override void onClose() { super.onClose(); } void checkIsInstallWechat() async { isInstallWechat.value = await WechatKitPlatform.instance.isInstalled(); } }