app_router.dart 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import 'package:auto_route/auto_route.dart';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter_native_splash/flutter_native_splash.dart';
  4. import 'package:telnow_mobile_new/app_router.gr.dart';
  5. import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
  6. import 'package:telnow_mobile_new/src/injector/injector.dart';
  7. import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferences_manager.dart';
  8. import 'package:telnow_mobile_new/src/utils/U.dart';
  9. @AutoRouterConfig(replaceInRouteName: 'Screen|Page,Route')
  10. class AppRouter extends RootStackRouter {
  11. final SharedPreferencesManager _sharedPreferencesManager = locator<SharedPreferencesManager>();
  12. @override
  13. RouteType get defaultRouteType => RouteType.material(); //.cupertino, .adaptive ..etc
  14. @override
  15. List<AutoRoute> get routes => [
  16. AutoRoute(path: '/qr', page: NewQrRoute.page, guards: qrGuards, initial: true),
  17. AutoRoute(path: '/change-code/:pid', page: ChangeCodeRoute.page),
  18. AutoRoute(
  19. path: '/app/:pid', page: HomeGuardRoute.page, guards: appGuards,
  20. children: [
  21. AutoRoute(path: 'login', page: LoginRoute.page, guards: loginGuards, initial: true),
  22. AutoRoute(path: 'loginme', page: AutoLoginRoute.page, guards: loginGuards),
  23. AutoRoute(path: 'license', page: ErrorRoute.page),
  24. AutoRoute(
  25. path: 'menu', page: AppResponsive.page, guards: menuGuards,
  26. children: [
  27. AutoRoute(path: 'home', page: HomeResponsive.page, initial: true),
  28. AutoRoute(path: 'history', page: HistoryResponsive.page),
  29. AutoRoute(path: 'account', page: AccountResponsive.page),
  30. ]
  31. ),
  32. ]
  33. ),
  34. ];
  35. List<AutoRouteGuard> get qrGuards => [
  36. AutoRouteGuard.simple((resolver, router) async{
  37. Parameters param = resolver.route.queryParams;
  38. router.removeLast();
  39. if (!kIsWeb && U.getAccessCode() != null && param.isEmpty) {
  40. router.pushNamed('/app/${Uri.encodeComponent(U.getAccessCode()!)}');
  41. } else{
  42. FlutterNativeSplash.remove();
  43. resolver.next();
  44. }
  45. })
  46. ];
  47. List<AutoRouteGuard> get appGuards => [
  48. AutoRouteGuard.simple((resolver, router) async{
  49. RouteMatch<dynamic> vRedirector = resolver.route;
  50. var codeFromUrl = '';
  51. String? rawPid = '';
  52. var pid;
  53. bool stb = false;
  54. rawPid = codeFromUrl != '' ? codeFromUrl : U.getPidFromUrl(vRedirector.pathParams.getString('pid'));
  55. try {
  56. pid = Uri.decodeComponent(rawPid);
  57. } catch (e) {
  58. print("err : $e");
  59. stb = true;
  60. }
  61. if (pid == null || stb) {
  62. router.pushNamed("/qr?new=true");
  63. }
  64. if(pid.contains('#') && U.getAccessCode() != null){
  65. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyBaseUrl);
  66. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyAccessCode);
  67. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keySerialCode);
  68. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.version);
  69. }
  70. if (U.getAccessCode() == null) {
  71. var splitPID = pid.split('#');
  72. await _sharedPreferencesManager.putString(SharedPreferencesManager.keyBaseUrl, U.rewriteUrl(splitPID[1]));
  73. await _sharedPreferencesManager.putString(SharedPreferencesManager.keyAccessCode, splitPID[0]);
  74. await _sharedPreferencesManager.putString(SharedPreferencesManager.keySerialCode, 'P-${splitPID[0]}');
  75. try {
  76. var ver = await U.reloadLicense();
  77. await _sharedPreferencesManager.putInt(SharedPreferencesManager.version, ver['version']);
  78. rawPid = Uri.encodeComponent(splitPID[0]);
  79. } catch (error) {
  80. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyBaseUrl);
  81. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyAccessCode);
  82. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keySerialCode);
  83. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.version);
  84. router.pushNamed("/qr?new=true");
  85. }
  86. } else if(_isNewAccessCode(rawPid, U.getAccessCode()!)){
  87. router.pushNamed("/change-code/$rawPid");
  88. return;
  89. } else {
  90. if (_sharedPreferencesManager.getInt(SharedPreferencesManager.version) == null){
  91. try {
  92. var ver = await U.reloadLicense();
  93. await _sharedPreferencesManager.putInt(SharedPreferencesManager.version, ver['version']);
  94. } catch (e) {
  95. print('error sini 2: ${e.toString()}');
  96. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyBaseUrl);
  97. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyAccessCode);
  98. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keySerialCode);
  99. await _sharedPreferencesManager.clearKey(SharedPreferencesManager.version);
  100. router.pushNamed("/qr?new=true");
  101. }
  102. }
  103. }
  104. FlutterNativeSplash.remove();
  105. resolver.next();
  106. })
  107. ];
  108. List<AutoRouteGuard> get loginGuards => [
  109. AutoRouteGuard.simple((resolver, router) async{
  110. router.removeLast();
  111. if (!_isValidVersion()) {
  112. router.pushNamed('/app/${Uri.encodeComponent(U.getAccessCode()!)}/license');
  113. } else if (_isLoggedIn()) {
  114. router.pushNamed('/app/${Uri.encodeComponent(U.getAccessCode()!)}/menu');
  115. } else{
  116. resolver.next();
  117. }
  118. })
  119. ];
  120. List<AutoRouteGuard> get menuGuards => [
  121. AutoRouteGuard.simple((resolver, router) async{
  122. router.removeLast();
  123. if (!_isValidVersion()) {
  124. router.pushNamed('/app/${Uri.encodeComponent(U.getAccessCode()!)}/license');
  125. } else if (!_isLoggedIn()) {
  126. router.pushNamed('/app/${Uri.encodeComponent(U.getAccessCode()!)}/login');
  127. } else{
  128. resolver.next();
  129. }
  130. })
  131. ];
  132. bool _isLoggedIn() {
  133. bool? isTokenExist = _sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyAccessToken);
  134. String? token = _sharedPreferencesManager.getString(SharedPreferencesManager.keyAccessToken);
  135. bool? isLoggedIn = _sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyIsLogin);
  136. return isLoggedIn! && isTokenExist! && token != null;
  137. }
  138. bool _isValidVersion() {
  139. return ApiAuthProvider().currentVersion == U.getVersion();
  140. }
  141. bool _isNewAccessCode(String pid, String savedPid) {
  142. try{
  143. return U.decodeBase64Url(pid) == U.decodeBase64Url(Uri.decodeComponent(savedPid)) ? false : true;
  144. } catch (e){
  145. return false;
  146. }
  147. }
  148. }