login_dialog_controller.dart 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import 'dart:async';
  2. import 'dart:ffi';
  3. import 'dart:io';
  4. import 'package:flutter/cupertino.dart';
  5. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  6. import 'package:wechat_kit/wechat_kit.dart';
  7. import 'package:get/get.dart';
  8. import 'package:injectable/injectable.dart';
  9. import 'package:keyboard/base/base_controller.dart';
  10. import 'package:keyboard/data/repository/account_repository.dart';
  11. import 'package:keyboard/dialog/loading_dialog.dart';
  12. import 'package:keyboard/module/login/login_page.dart';
  13. import 'package:keyboard/utils/atmob_log.dart';
  14. import 'package:keyboard/utils/toast_util.dart';
  15. import 'package:sign_in_with_apple/sign_in_with_apple.dart';
  16. import '../../data/consts/error_code.dart';
  17. import '../../data/consts/event_report.dart';
  18. import '../../handler/event_handler.dart';
  19. import '../../handler/wechat_login_service.dart';
  20. import '../../resource/string.gen.dart';
  21. import '../../utils/error_handler.dart';
  22. import '../../utils/http_handler.dart';
  23. import '../member_agreement_dialog.dart';
  24. import '../privacy_agreement_dialog.dart';
  25. import 'login_dialog.dart';
  26. @injectable
  27. class LoginDialogController extends BaseController {
  28. final tag = "LoginDialogController";
  29. final WechatLoginService wechatLoginService;
  30. final AccountRepository accountRepository;
  31. final RxBool isInstallWechat = false.obs;
  32. LoginDialogController(this.wechatLoginService, this.accountRepository);
  33. final RxBool _isAgree = false.obs;
  34. bool get isAgree => _isAgree.value;
  35. clickAgree() {
  36. _isAgree.value = !_isAgree.value;
  37. }
  38. void clickWxLogin() async {
  39. EventHandler.report(EventId.event_04001);
  40. if (!_isAgree.value) {
  41. PrivacyAgreementDialog.show(
  42. btnConfirm: () async {
  43. _isAgree.value = true;
  44. clickWxLogin();
  45. },
  46. );
  47. return;
  48. }
  49. wechatLoginService.login(
  50. onSuccess: (code) {
  51. accountRepository
  52. .wechatLogin(code)
  53. .then((data) {
  54. ToastUtil.show(StringName.loginSuccess);
  55. SmartDialog.dismiss(tag: LoginDialog.TAG);
  56. EventHandler.report(EventId.event_04003);
  57. })
  58. .catchError((error) {
  59. if (error is ServerErrorException) {
  60. if (error.code == ErrorCode.verificationCodeError) {
  61. ToastUtil.show(StringName.loginVerificationCodeErrorToast);
  62. } else {
  63. ToastUtil.show(error.message);
  64. }
  65. } else {
  66. ErrorHandler.toastError(error);
  67. }
  68. EventHandler.report(EventId.event_04004);
  69. });
  70. },
  71. onError: (code, msg) {
  72. EventHandler.report(EventId.event_04004);
  73. ToastUtil.show("微信登录失败:$msg");
  74. },
  75. onCancel: () {
  76. EventHandler.report(EventId.event_04004);
  77. ToastUtil.show("用户取消登录");
  78. },
  79. );
  80. }
  81. // 苹果登录点击
  82. void clickAppleLogin() async {
  83. if (!_isAgree.value) {
  84. PrivacyAgreementDialog.show(
  85. btnConfirm: () async {
  86. _isAgree.value = true;
  87. clickAppleLogin();
  88. },
  89. );
  90. ToastUtil.show(StringName.loginAgreePrivacy);
  91. return;
  92. }
  93. CustomLoadingDialog.show();
  94. AuthorizationCredentialAppleID credential;
  95. try {
  96. credential = await SignInWithApple.getAppleIDCredential(
  97. scopes: [
  98. AppleIDAuthorizationScopes.email,
  99. AppleIDAuthorizationScopes.fullName,
  100. ],
  101. );
  102. } catch (error) {
  103. CustomLoadingDialog.hide();
  104. ToastUtil.show(StringName.loginFailedToast);
  105. return;
  106. }
  107. var userIdentity = credential.userIdentifier ?? "";
  108. var authorizationCode = credential.authorizationCode ?? "";
  109. var identityToken = credential.identityToken ?? "";
  110. accountRepository
  111. .appleLogin(userIdentity, authorizationCode, identityToken)
  112. .then((data) {
  113. CustomLoadingDialog.hide();
  114. EventHandler.report(EventId.event_04003);
  115. SmartDialog.dismiss(tag: LoginDialog.TAG);
  116. ToastUtil.show(StringName.loginSuccess);
  117. })
  118. .catchError((error) {
  119. CustomLoadingDialog.hide();
  120. EventHandler.report(EventId.event_04004);
  121. if (error is LoginTooOftenException) {
  122. ToastUtil.show(StringName.loginTooOftenToast);
  123. return;
  124. }
  125. if (error is ServerErrorException) {
  126. if (error.code == ErrorCode.verificationCodeError) {
  127. ToastUtil.show(StringName.loginVerificationCodeErrorToast);
  128. } else {
  129. ToastUtil.show(error.message);
  130. }
  131. } else {
  132. ErrorHandler.toastError(error);
  133. }
  134. });
  135. }
  136. void clickClose() {
  137. AtmobLog.d(tag, "clickClose");
  138. SmartDialog.dismiss(tag: LoginDialog.TAG);
  139. }
  140. void clickPhoneLogin() {
  141. AtmobLog.d(tag, "clickPhoneLogin");
  142. EventHandler.report(EventId.event_04002);
  143. LoginPage.start();
  144. SmartDialog.dismiss(tag: LoginDialog.TAG);
  145. }
  146. @override
  147. void onInit() {
  148. super.onInit();
  149. checkIsInstallWechat();
  150. }
  151. @override
  152. void onClose() {
  153. super.onClose();
  154. }
  155. void checkIsInstallWechat() async {
  156. isInstallWechat.value = await WechatKitPlatform.instance.isInstalled();
  157. }
  158. }