app_router.dart 7.1 KB

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