maxkey.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import 'dart:io';
  2. import 'package:dio/dio.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:go_router/go_router.dart';
  5. import 'package:maxkey_flutter/maxkey/services/authn.service.dart';
  6. import 'package:maxkey_flutter/maxkey/services/image_captcha.service.dart';
  7. import 'package:maxkey_flutter/maxkey/services/time_based.service.dart';
  8. import 'package:maxkey_flutter/maxkey/services/users.service.dart';
  9. import 'package:maxkey_flutter/persistent.dart';
  10. import 'package:maxkey_flutter/utils.dart';
  11. /// 会在需要刷新的时候通知
  12. class MaxKey with ChangeNotifier {
  13. final _dio = Dio(BaseOptions(
  14. baseUrl: MaxKeyPersistent.instance.baseUrl,
  15. connectTimeout: const Duration(seconds: 10),
  16. ));
  17. late final authnService = AuthnService(_dio);
  18. late final imageCaptchaService = ImageCaptchaService(_dio);
  19. late final timeBasedService = TimeBasedService(_dio);
  20. late final usersService = UsersService(_dio);
  21. static MaxKey? _instance;
  22. static MaxKey get instance {
  23. _instance ??= MaxKey._();
  24. return _instance!;
  25. }
  26. MaxKey._() {
  27. _dio.interceptors.add(InterceptorsWrapper(
  28. onResponse: (response, handler) {
  29. final cookies = response.headers[HttpHeaders.setCookieHeader];
  30. if (cookies != null) {
  31. maxKeyCookies = List.from(cookies);
  32. }
  33. handler.next(response);
  34. },
  35. onError: (error, handler) {
  36. LOGGER.e("InterceptorsWrapper.onError(): ");
  37. LOGGER.e(error.type);
  38. LOGGER.e(error.response);
  39. if (error.type == DioExceptionType.badResponse) {
  40. SCAFFOLD_MESSENGER_KEY.currentState?.showSnackBar(
  41. SnackBar(
  42. content: const Text("登陆状态过期。请重新登陆"),
  43. action: SnackBarAction(
  44. label: "重新登陆",
  45. onPressed: () async {
  46. _dio.options.headers.remove(HttpHeaders.authorizationHeader);
  47. await MaxKeyPersistent.instance.clearToken();
  48. NAVIGATOR_KEY.currentContext?.pushReplacement(
  49. RoutePath.loginPage,
  50. );
  51. },
  52. ),
  53. ),
  54. );
  55. }
  56. handler.next(error);
  57. },
  58. ));
  59. }
  60. void updateBaseUrl() {
  61. LOGGER.i("MaxKey.updateBaseUrl(): ");
  62. LOGGER.i("old baseUrl: ${_dio.options.baseUrl}");
  63. _dio.options.baseUrl = MaxKeyPersistent.instance.baseUrl;
  64. LOGGER.i("new baseUrl: ${_dio.options.baseUrl}");
  65. notifyListeners();
  66. }
  67. List<String> maxKeyCookies = [];
  68. Future<bool> maxKeyNetworkTest({String? host}) async {
  69. try {
  70. LOGGER.i("MaxKey.maxKeyNetworkTest(): ");
  71. LOGGER.i(
  72. "[MaxKeyNetworkTest] GET: ${host == null ? MaxKeyPersistent.instance.baseUrl : "http://$host/sign"}",
  73. );
  74. await _dio
  75. .get(host == null
  76. ? MaxKeyPersistent.instance.baseUrl
  77. : "http://$host/sign")
  78. .timeout(const Duration(seconds: 5));
  79. LOGGER.i("MaxKeyNetworkTest: true");
  80. return true;
  81. } catch (err) {
  82. LOGGER.e("MaxKey.maxKeyNetworkTest(): ");
  83. LOGGER.e(err);
  84. }
  85. LOGGER.i("MaxKeyNetworkTest: false");
  86. return false;
  87. }
  88. }