2
0

maxkey.dart 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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(error.type);
  37. LOGGER.e(error.response);
  38. if (error.type == DioExceptionType.badResponse) {
  39. SCAFFOLD_MESSENGER_KEY.currentState?.showSnackBar(
  40. SnackBar(
  41. content: const Text("Please login again."),
  42. action: SnackBarAction(
  43. label: "Login",
  44. onPressed: () async {
  45. _dio.options.headers.remove(HttpHeaders.authorizationHeader);
  46. await MaxKeyPersistent.instance.clearToken();
  47. NAVIGATOR_KEY.currentContext?.pushReplacement(
  48. RoutePath.loginPage,
  49. );
  50. },
  51. ),
  52. ),
  53. );
  54. }
  55. handler.next(error);
  56. },
  57. ));
  58. }
  59. void updateBaseUrl() {
  60. LOGGER.i("old baseUrl: ${_dio.options.baseUrl}");
  61. _dio.options.baseUrl = MaxKeyPersistent.instance.baseUrl;
  62. LOGGER.i("new baseUrl: ${_dio.options.baseUrl}");
  63. notifyListeners();
  64. }
  65. List<String> maxKeyCookies = [];
  66. Future<bool> maxKeyNetworkTest({String? host}) async {
  67. try {
  68. LOGGER.i(
  69. "[MaxKeyNetworkTest] GET: ${host == null ? MaxKeyPersistent.instance.baseUrl : "http://$host/sign"}",
  70. );
  71. await _dio.get(
  72. host == null ? MaxKeyPersistent.instance.baseUrl : "http://$host/sign",
  73. );
  74. LOGGER.i("MaxKeyNetworkTest: true");
  75. return true;
  76. } catch (err) {
  77. LOGGER.e(err);
  78. }
  79. LOGGER.i("MaxKeyNetworkTest: false");
  80. return false;
  81. }
  82. }