Procházet zdrojové kódy

add page end session

Masarifyuli před 2 dny
rodič
revize
8fb648ad36

+ 15 - 0
android/app/build.gradle

@@ -6,6 +6,12 @@ plugins {
     id "com.google.gms.google-services"
 }
 
+def keystoreProperties = new Properties()
+def keystorePropertiesFile = rootProject.file('key.properties')
+if (keystorePropertiesFile.exists()) {
+    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
 android {
     namespace = "com.datacomsolusindo.telnow2.telnow_mobile2"
     compileSdk = flutter.compileSdkVersion
@@ -33,6 +39,15 @@ android {
         ndkVersion "25.1.8937393"
     }
 
+    signingConfigs {
+        release {
+            keyAlias keystoreProperties['keyAlias']
+            keyPassword keystoreProperties['keyPassword']
+            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
+            storePassword keystoreProperties['storePassword']
+        }
+    }
+
     buildTypes {
         release {
             // TODO: Add your own signing config for the release build.

+ 19 - 0
android/app/src/main/res/values-night-v31/styles.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
+    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
+        <item name="android:forceDarkAllowed">false</item>
+        <item name="android:windowFullscreen">false</item>
+        <item name="android:windowDrawsSystemBarBackgrounds">false</item>
+        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
+    </style>
+    <!-- Theme applied to the Android Window as soon as the process has started.
+         This theme determines the color of the Android Window while your
+         Flutter UI initializes, as well as behind your Flutter UI while its
+         running.
+         
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
+    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
+        <item name="android:windowBackground">?android:colorBackground</item>
+    </style>
+</resources>

+ 19 - 0
android/app/src/main/res/values-v31/styles.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
+    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <item name="android:forceDarkAllowed">false</item>
+        <item name="android:windowFullscreen">false</item>
+        <item name="android:windowDrawsSystemBarBackgrounds">false</item>
+        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
+    </style>
+    <!-- Theme applied to the Android Window as soon as the process has started.
+         This theme determines the color of the Android Window while your
+         Flutter UI initializes, as well as behind your Flutter UI while its
+         running.
+         
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
+    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
+        <item name="android:windowBackground">?android:colorBackground</item>
+    </style>
+</resources>

+ 3 - 1
assets/lang/en.json

@@ -322,5 +322,7 @@
    "referenceNumber": "Reference Number",
    "enterTicketNumber": "Enter ticket number",
    "subject": "Subject",
-   "requestReference": "Request Reference"
+   "requestReference": "Request Reference",
+   "endSessionTitle": "Your session has been ended.",
+   "endSessionDesc": "Oops, sorry. We have not see you for along time. It\\'s kindly your session has expired. Please re-login to continue using application."
 }

+ 3 - 1
assets/lang/id.json

@@ -322,5 +322,7 @@
    "referenceNumber": "Nomor Referensi",
    "enterTicketNumber": "Masukkan nomor tiket",
    "subject": "Subyek",
-   "requestReference": "Referensi Permintaan"
+   "requestReference": "Referensi Permintaan",
+   "endSessionTitle": "Sesi kamu telah habis.",
+   "endSessionDesc": "Oh, maaf. Sepertinya kamu sudah lama tidak menggunakan aplikasi. Biar aman silakan login ulang sebelum lanjut."
 }

+ 21 - 0
ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json

@@ -0,0 +1,21 @@
+{
+  "images" : [
+    {
+      "filename" : "background.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

binární
ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png


+ 2 - 0
lib/app_router.dart

@@ -4,6 +4,7 @@ import 'package:flutter_native_splash/flutter_native_splash.dart';
 import 'package:telnow_mobile_new/app_router.gr.dart';
 import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
 import 'package:telnow_mobile_new/src/injector/injector.dart';
+import 'package:telnow_mobile_new/src/layouts/auth/end_session.dart';
 import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferences_manager.dart';
 import 'package:telnow_mobile_new/src/utils/U.dart';
 
@@ -18,6 +19,7 @@ class AppRouter extends RootStackRouter {
   List<AutoRoute> get routes => [
     AutoRoute(path: '/qr', page: NewQrRoute.page, guards: qrGuards, initial: true),
     AutoRoute(path: '/change-code/:pid', page: ChangeCodeRoute.page),
+    AutoRoute(path: '/end-session', page: EndSessionRoute.page),
     AutoRoute(
         path: '/app/:pid', page: HomeGuardRoute.page, guards: appGuards,
         children: [

+ 60 - 43
lib/app_router.gr.dart

@@ -9,27 +9,28 @@
 // coverage:ignore-file
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'package:auto_route/auto_route.dart' as _i8;
-import 'package:telnow_mobile_new/main.dart' as _i5;
+import 'package:auto_route/auto_route.dart' as _i9;
+import 'package:telnow_mobile_new/main.dart' as _i6;
 import 'package:telnow_mobile_new/src/layouts/auth/change_code.dart' as _i3;
-import 'package:telnow_mobile_new/src/layouts/auth/login.dart' as _i6;
-import 'package:telnow_mobile_new/src/layouts/auth/qr.dart' as _i7;
+import 'package:telnow_mobile_new/src/layouts/auth/end_session.dart' as _i4;
+import 'package:telnow_mobile_new/src/layouts/auth/login.dart' as _i7;
+import 'package:telnow_mobile_new/src/layouts/auth/qr.dart' as _i8;
 import 'package:telnow_mobile_new/src/layouts/components/auto_login.dart'
     as _i2;
 import 'package:telnow_mobile_new/src/layouts/components/error_page.dart'
-    as _i4;
+    as _i5;
 import 'package:telnow_mobile_new/src/layouts/components/responsive.dart'
     as _i1;
 
 /// generated route for
 /// [_i1.AccountResponsive]
-class AccountResponsive extends _i8.PageRouteInfo<void> {
-  const AccountResponsive({List<_i8.PageRouteInfo>? children})
+class AccountResponsive extends _i9.PageRouteInfo<void> {
+  const AccountResponsive({List<_i9.PageRouteInfo>? children})
     : super(AccountResponsive.name, initialChildren: children);
 
   static const String name = 'AccountResponsive';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
       return const _i1.AccountResponsive();
@@ -39,13 +40,13 @@ class AccountResponsive extends _i8.PageRouteInfo<void> {
 
 /// generated route for
 /// [_i1.AppResponsive]
-class AppResponsive extends _i8.PageRouteInfo<void> {
-  const AppResponsive({List<_i8.PageRouteInfo>? children})
+class AppResponsive extends _i9.PageRouteInfo<void> {
+  const AppResponsive({List<_i9.PageRouteInfo>? children})
     : super(AppResponsive.name, initialChildren: children);
 
   static const String name = 'AppResponsive';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
       return const _i1.AppResponsive();
@@ -55,13 +56,13 @@ class AppResponsive extends _i8.PageRouteInfo<void> {
 
 /// generated route for
 /// [_i2.AutoLoginPage]
-class AutoLoginRoute extends _i8.PageRouteInfo<void> {
-  const AutoLoginRoute({List<_i8.PageRouteInfo>? children})
+class AutoLoginRoute extends _i9.PageRouteInfo<void> {
+  const AutoLoginRoute({List<_i9.PageRouteInfo>? children})
     : super(AutoLoginRoute.name, initialChildren: children);
 
   static const String name = 'AutoLoginRoute';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
       return _i2.AutoLoginPage();
@@ -71,13 +72,13 @@ class AutoLoginRoute extends _i8.PageRouteInfo<void> {
 
 /// generated route for
 /// [_i3.ChangeCodePage]
-class ChangeCodeRoute extends _i8.PageRouteInfo<void> {
-  const ChangeCodeRoute({List<_i8.PageRouteInfo>? children})
+class ChangeCodeRoute extends _i9.PageRouteInfo<void> {
+  const ChangeCodeRoute({List<_i9.PageRouteInfo>? children})
     : super(ChangeCodeRoute.name, initialChildren: children);
 
   static const String name = 'ChangeCodeRoute';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
       return const _i3.ChangeCodePage();
@@ -86,12 +87,28 @@ class ChangeCodeRoute extends _i8.PageRouteInfo<void> {
 }
 
 /// generated route for
-/// [_i4.ErrorPage]
-class ErrorRoute extends _i8.PageRouteInfo<ErrorRouteArgs> {
+/// [_i4.EndSessionPage]
+class EndSessionRoute extends _i9.PageRouteInfo<void> {
+  const EndSessionRoute({List<_i9.PageRouteInfo>? children})
+    : super(EndSessionRoute.name, initialChildren: children);
+
+  static const String name = 'EndSessionRoute';
+
+  static _i9.PageInfo page = _i9.PageInfo(
+    name,
+    builder: (data) {
+      return const _i4.EndSessionPage();
+    },
+  );
+}
+
+/// generated route for
+/// [_i5.ErrorPage]
+class ErrorRoute extends _i9.PageRouteInfo<ErrorRouteArgs> {
   ErrorRoute({
     required dynamic code,
     required dynamic errMsg,
-    List<_i8.PageRouteInfo>? children,
+    List<_i9.PageRouteInfo>? children,
   }) : super(
          ErrorRoute.name,
          args: ErrorRouteArgs(code: code, errMsg: errMsg),
@@ -100,11 +117,11 @@ class ErrorRoute extends _i8.PageRouteInfo<ErrorRouteArgs> {
 
   static const String name = 'ErrorRoute';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
       final args = data.argsAs<ErrorRouteArgs>();
-      return _i4.ErrorPage(args.code, args.errMsg);
+      return _i5.ErrorPage(args.code, args.errMsg);
     },
   );
 }
@@ -124,13 +141,13 @@ class ErrorRouteArgs {
 
 /// generated route for
 /// [_i1.HistoryResponsive]
-class HistoryResponsive extends _i8.PageRouteInfo<void> {
-  const HistoryResponsive({List<_i8.PageRouteInfo>? children})
+class HistoryResponsive extends _i9.PageRouteInfo<void> {
+  const HistoryResponsive({List<_i9.PageRouteInfo>? children})
     : super(HistoryResponsive.name, initialChildren: children);
 
   static const String name = 'HistoryResponsive';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
       return const _i1.HistoryResponsive();
@@ -139,30 +156,30 @@ class HistoryResponsive extends _i8.PageRouteInfo<void> {
 }
 
 /// generated route for
-/// [_i5.HomeGuardPage]
-class HomeGuardRoute extends _i8.PageRouteInfo<void> {
-  const HomeGuardRoute({List<_i8.PageRouteInfo>? children})
+/// [_i6.HomeGuardPage]
+class HomeGuardRoute extends _i9.PageRouteInfo<void> {
+  const HomeGuardRoute({List<_i9.PageRouteInfo>? children})
     : super(HomeGuardRoute.name, initialChildren: children);
 
   static const String name = 'HomeGuardRoute';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
-      return const _i5.HomeGuardPage();
+      return const _i6.HomeGuardPage();
     },
   );
 }
 
 /// generated route for
 /// [_i1.HomeResponsive]
-class HomeResponsive extends _i8.PageRouteInfo<void> {
-  const HomeResponsive({List<_i8.PageRouteInfo>? children})
+class HomeResponsive extends _i9.PageRouteInfo<void> {
+  const HomeResponsive({List<_i9.PageRouteInfo>? children})
     : super(HomeResponsive.name, initialChildren: children);
 
   static const String name = 'HomeResponsive';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
       return const _i1.HomeResponsive();
@@ -171,33 +188,33 @@ class HomeResponsive extends _i8.PageRouteInfo<void> {
 }
 
 /// generated route for
-/// [_i6.LoginPage]
-class LoginRoute extends _i8.PageRouteInfo<void> {
-  const LoginRoute({List<_i8.PageRouteInfo>? children})
+/// [_i7.LoginPage]
+class LoginRoute extends _i9.PageRouteInfo<void> {
+  const LoginRoute({List<_i9.PageRouteInfo>? children})
     : super(LoginRoute.name, initialChildren: children);
 
   static const String name = 'LoginRoute';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
-      return const _i6.LoginPage();
+      return const _i7.LoginPage();
     },
   );
 }
 
 /// generated route for
-/// [_i7.NewQrPage]
-class NewQrRoute extends _i8.PageRouteInfo<void> {
-  const NewQrRoute({List<_i8.PageRouteInfo>? children})
+/// [_i8.NewQrPage]
+class NewQrRoute extends _i9.PageRouteInfo<void> {
+  const NewQrRoute({List<_i9.PageRouteInfo>? children})
     : super(NewQrRoute.name, initialChildren: children);
 
   static const String name = 'NewQrRoute';
 
-  static _i8.PageInfo page = _i8.PageInfo(
+  static _i9.PageInfo page = _i9.PageInfo(
     name,
     builder: (data) {
-      return const _i7.NewQrPage();
+      return const _i8.NewQrPage();
     },
   );
 }

+ 10 - 0
lib/main.dart

@@ -18,10 +18,12 @@ import 'package:quick_notify_2/quick_notify.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
 import 'package:telnow_mobile_new/src/injector/injector.dart';
+import 'package:telnow_mobile_new/src/layouts/components/template.dart';
 import 'package:telnow_mobile_new/src/layouts/mobile/history_forum.dart';
 import 'package:telnow_mobile_new/src/layouts/mobile/message_list.dart';
 import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferences_manager.dart';
 import 'package:telnow_mobile_new/src/utils/U.dart';
+import 'package:telnow_mobile_new/src/utils/dio_logging_interceptors.dart';
 import 'package:telnow_mobile_new/src/utils/provider.dart';
 import 'package:upgrader/upgrader.dart';
 import 'package:http/http.dart' as http;
@@ -153,6 +155,14 @@ class _HomeGuardPageState extends State<HomeGuardPage> {
 
   @override
   Widget build(BuildContext context) {
+    eventBus.on().listen((event) {
+      print("eventBus => ${event.toString()}");
+      if(event.toString() == 'logout') {
+        // token.logout();
+        context.navigateToPath('/end-session');
+        return;
+      }
+    });
     // TODO: implement build
     return Scaffold(
       body: !kIsWeb ? UpgradeAlert(child: AutoRouter()):AutoRouter(),

+ 1 - 0
lib/src/api/jwt_token.dart

@@ -121,6 +121,7 @@ class JwtToken{
     await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyHistoryMark);
     await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyMenuDisplay);
     await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyAutoTranslate);
+    await _sharedPreferencesManager.clearKey(SharedPreferencesManager.keyCountRefreshToken);
     CacheMan.clearData();
   }
 

+ 106 - 0
lib/src/layouts/auth/end_session.dart

@@ -0,0 +1,106 @@
+import 'package:auto_route/annotations.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:easy_localization/easy_localization.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:http/http.dart' as http;
+import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
+import 'package:telnow_mobile_new/src/utils/U.dart';
+
+import '../components/template.dart';
+
+@RoutePage()
+class EndSessionPage extends StatelessWidget {
+  const EndSessionPage({super.key});
+
+  @override
+  Widget build(BuildContext context) {
+    bool useAsset = false;
+    String imageUrl = '';
+    final ApiAuthProvider apiAuthProvider = ApiAuthProvider();
+
+    try {
+      imageUrl = apiAuthProvider.baseUrl + U.decodeBase64Url(Uri.decodeComponent(U.getAccessCode()!))+'/assets/background/tn';
+      http.head(Uri.parse(imageUrl));
+    }catch(e){
+      useAsset = true;
+    }
+
+    return Scaffold(
+      resizeToAvoidBottomInset: false,
+      body: Stack(
+        children: [
+          SizedBox(
+            width: double.infinity, height: double.infinity,
+            child: Image.network(imageUrl, fit: BoxFit.cover, width: double.infinity, height: double.infinity, errorBuilder: (context, error, stacktrace){
+              return Image.asset('assets/image/background/background.jpg', fit: BoxFit.cover, width: double.infinity, height: double.infinity);
+            })
+          ),
+          SingleChildScrollView(
+            child: Container(
+              padding: EdgeInsets.fromLTRB(16, kIsWeb?105:200, 16, 16),
+              width: MediaQuery.of(context).size.width,
+              height: kIsWeb && MediaQuery.of(context).size.height<700 ? 700 : MediaQuery.of(context).size.height,
+              decoration: BoxDecoration(
+                  gradient: LinearGradient(
+                      begin: Alignment.topCenter, end: Alignment.bottomCenter,
+                      colors: [
+                        primaryColor.withValues(alpha: 0.50), Colors.black.withValues(alpha: 0.91)
+                      ]
+                  )
+              ),
+              child: Column(
+                crossAxisAlignment: CrossAxisAlignment.center,
+                children: [
+                  Image.asset('assets/image/logo/logo.png', width: 160),
+                  Expanded(
+                    child: Column(
+                      mainAxisAlignment: MainAxisAlignment.start,
+                      children: [
+                        Container(
+                          margin: EdgeInsets.only(top: 100, left: 16, right: 16, bottom: 48),
+                          child: Column(
+                            children: [
+                              Text('endSessionTitle'.tr(), style: TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500), textAlign: TextAlign.center),
+                              SizedBox(height: 16),
+                              Text('endSessionDesc'.tr(), style: TextStyle(color: Colors.white, fontSize: 16), textAlign: TextAlign.center),
+                            ],
+                          )
+                        ),
+                        GestureDetector(
+                          onTap: (){
+                            token.logout();
+                            context.router.removeLast();
+                            context.navigateToPath("/app/${U.getAccessCode()}/login");
+                          },
+                          child: Container(
+                            padding: EdgeInsets.symmetric(vertical: 32, horizontal: 64),
+                            decoration: BoxDecoration(
+                                color: primaryColor.withValues(alpha: 0.50),
+                                border: Border.all(color: Colors.white),
+                                borderRadius: BorderRadius.all(Radius.circular(12))
+                            ),
+                            child: Row(
+                              mainAxisSize: MainAxisSize.min,
+                              children: [
+                                Text('backToLogin'.tr(), style: TextStyle(color: Colors.white, fontSize: 16)),
+                              ],
+                            ),
+                          ),
+                        ),
+                      ],
+                    ),
+                  ),
+                  SizedBox(height: 5),
+                  Text('${'version'.tr()} ${ApiAuthProvider().displayVersion}', style: TextStyle(color: Colors.white, fontSize: 14)),
+                  SizedBox(height: 5),
+                  Text('Build ${ApiAuthProvider().buildNumber}', style: TextStyle(color: Colors.white, fontSize: 13)),
+                ],
+              ),
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 12 - 6
lib/src/layouts/auth/qr.dart

@@ -1,4 +1,3 @@
-import 'dart:convert';
 import 'dart:io';
 
 import 'package:auto_route/auto_route.dart';
@@ -17,6 +16,7 @@ import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferenc
 import 'package:telnow_mobile_new/src/utils/U.dart';
 import 'package:toggle_switch/toggle_switch.dart';
 import 'package:url_launcher/url_launcher.dart';
+import 'package:http/http.dart' as http;
 
 @RoutePage()
 class NewQrPage extends StatefulWidget {
@@ -37,10 +37,17 @@ class _NewQrPageState extends State<NewQrPage> {
   String serialNumber = '';
   String imageUrl = '';
   List lang = [];
+  bool useAsset = false;
 
   @override
   void initState() {
-    try{imageUrl = apiAuthProvider.baseUrl + U.decodeBase64Url(Uri.decodeComponent(U.getAccessCode()!))+'/assets/background/tn';}catch(e){}
+    try {
+      imageUrl = apiAuthProvider.baseUrl + U.decodeBase64Url(Uri.decodeComponent(U.getAccessCode()!))+'/assets/background/tn';
+      http.head(Uri.parse(imageUrl));
+    }catch(e){
+      useAsset = true;
+    }
+
     getCompanyName();
     // TODO: implement initState
     super.initState();
@@ -83,9 +90,8 @@ class _NewQrPageState extends State<NewQrPage> {
         children: [
           SizedBox(
             width: double.infinity, height: double.infinity,
-            child: Image.network(imageUrl, fit: BoxFit.cover, width: double.infinity, height: double.infinity, errorBuilder: (context, error, stackTrace) {
-              return Image.asset('assets/image/background/background.jpg', fit: BoxFit.cover, width: double.infinity, height: double.infinity);
-            }),
+            child: !useAsset ? Image.network(imageUrl, fit: BoxFit.cover, width: double.infinity, height: double.infinity,) :
+            Image.asset('assets/image/background/background.jpg', fit: BoxFit.cover, width: double.infinity, height: double.infinity),
           ),
           SingleChildScrollView(
             child: Container(
@@ -306,7 +312,7 @@ class _NewQrPageState extends State<NewQrPage> {
       }
     } catch (e) {
       print(e);
-      showError(context, 'messageInvalidCode'.tr());
+      if(mounted) showError(context, 'messageInvalidCode'.tr());
     }
   }
 }

+ 1 - 2
lib/src/layouts/components/template.dart

@@ -540,7 +540,6 @@ final SharedPreferencesManager _sharedPreferencesManager = locator<SharedPrefere
 class NoDataPage extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
-    print(ApiAuthProvider().getServiceAsset('TNSendRequest.json'));
     return Center(
       child: Column(
         mainAxisSize: MainAxisSize.min,
@@ -630,7 +629,7 @@ handlingError(context, type) {
                     style: TextStyle(fontSize: 14),
                     textAlign: TextAlign.center),
               ),
-              type == 3 || type == 4
+              type > 2
                   ? Padding(
                 padding: const EdgeInsets.fromLTRB(15, 0, 15, 10),
                 child: SizedBox(

+ 6 - 60
lib/src/utils/dio_logging_interceptors.dart

@@ -1,12 +1,13 @@
 import 'package:dio/dio.dart';
-import 'package:telnow_mobile_new/main.dart';
 import 'package:telnow_mobile_new/src/injector/injector.dart';
 import 'package:telnow_mobile_new/src/model/refreshtoken/refresh_token_body.dart';
 import 'package:telnow_mobile_new/src/model/token/token.dart';
 import 'package:telnow_mobile_new/src/layouts/components/template.dart';
 import 'package:telnow_mobile_new/src/storage/sharedpreferences/shared_preferences_manager.dart';
 import 'package:telnow_mobile_new/src/utils/u.dart';
+import 'package:event_bus/event_bus.dart';
 
+EventBus eventBus = EventBus();
 class DioLoggingInterceptors extends InterceptorsWrapper {
   final Dio _dio;
   final SharedPreferencesManager _sharedPreferencesManager = locator<SharedPreferencesManager>();
@@ -40,7 +41,8 @@ class DioLoggingInterceptors extends InterceptorsWrapper {
         bool? checkRefreshCount = _sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyCountRefreshToken);
         int? refreshCount = _sharedPreferencesManager.getInt(SharedPreferencesManager.keyCountRefreshToken);
         if(checkRefreshCount! && refreshCount! > 4){
-          handlingError(NavigationService.navigatorKey.currentContext, 3);
+          // handlingError(NavigationService.navigatorKey.currentContext, 3);
+          eventBus.fire("logout");
           return;
         }
 
@@ -70,65 +72,9 @@ class DioLoggingInterceptors extends InterceptorsWrapper {
       }
     } catch (error) {
       print("Error dio: ${error.toString()}");
-      handlingError(NavigationService.navigatorKey.currentContext, 3);
+      eventBus.fire("logout");
+      // handlingError(NavigationService.navigatorKey.currentContext, 3);
     }
     super.onError(dioError, handler);
   }
-
-//  @override
-//  void onError(DioError dioError,ErrorInterceptorHandler handler) async {
-//    print("<-- ${dioError.message} ${(dioError.response?.requestOptions != null ? (dioError.response.requestOptions.baseUrl + dioError.response.requestOptions.path) : 'URL')}");
-//    print("${dioError.response != null ? dioError.response.data : 'Unknown Error'}");
-//    print("<-- End error");
-//
-//    int responseCode = dioError.response?.statusCode;
-//
-//    try {
-//      if(responseCode == 401 && (dioError.response != null && json.decode(dioError.response.data)['error'] == 'invalid_token_not_found')){
-//        await _sharedPreferencesManager.putInt(SharedPreferencesManager.keyCountRefreshToken, 4);
-//      }
-//    } catch (e) {
-//      await _sharedPreferencesManager.putInt(SharedPreferencesManager.keyCountRefreshToken, 4);
-//    }
-//
-//    bool checkRefreshCount = _sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyCountRefreshToken);
-//    int refreshCount = _sharedPreferencesManager.getInt(SharedPreferencesManager.keyCountRefreshToken);
-//    if(checkRefreshCount && refreshCount > 4){
-//      await _sharedPreferencesManager.putString(SharedPreferencesManager.keyAccessToken, '');
-//      await _sharedPreferencesManager.putString(SharedPreferencesManager.keyRefreshToken, '');
-//      await _sharedPreferencesManager.putInt(SharedPreferencesManager.keyCountRefreshToken, 0);
-//    }
-//
-//    String oldAccessToken = _sharedPreferencesManager.getString(SharedPreferencesManager.keyAccessToken);
-//    if (oldAccessToken != '' && responseCode == 401 && _sharedPreferencesManager != null) {
-//      _dio.interceptors.requestLock.lock();
-//      _dio.interceptors.responseLock.lock();
-//
-//      String refreshToken = _sharedPreferencesManager.getString(SharedPreferencesManager.keyRefreshToken);
-//      RefreshTokenBody refreshTokenBody = RefreshTokenBody('refresh_token', refreshToken);
-//      ApiAuthRepository apiAuthRepository = ApiAuthRepository();
-//
-//      await _sharedPreferencesManager.putInt(SharedPreferencesManager.keyCountRefreshToken, refreshCount+1);
-//print('try to refresh token: '+refreshCount.toString());
-//      Token token = await apiAuthRepository.postRefreshAuth(refreshTokenBody);
-//      if(token!=null){
-//        await _sharedPreferencesManager.putString(SharedPreferencesManager.keyAccessToken, token.accessToken);
-//        await _sharedPreferencesManager.putString(SharedPreferencesManager.keyRefreshToken, token.refreshToken);
-//        await _sharedPreferencesManager.putInt(SharedPreferencesManager.keyCountRefreshToken, 0);
-//
-//        RequestOptions options = dioError.response?.requestOptions;
-//        options.headers.addAll({'requirestoken': true});
-//        _dio.interceptors.requestLock.unlock();
-//        _dio.interceptors.responseLock.unlock();
-//
-//        _dio.fetch(options).then((r) => handler.resolve(r),
-//          onError: (e) {
-//            handler.reject(e);
-//          },
-//        );
-//      }
-//    } else {
-//      super.onError(dioError,handler);
-//    }
-//  }
 }

+ 53 - 37
pubspec.lock

@@ -69,10 +69,10 @@ packages:
     dependency: transitive
     description:
       name: async
-      sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
+      sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
       url: "https://pub.dev"
     source: hosted
-    version: "2.12.0"
+    version: "2.11.0"
   auto_route:
     dependency: "direct main"
     description:
@@ -109,10 +109,10 @@ packages:
     dependency: transitive
     description:
       name: boolean_selector
-      sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
+      sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.2"
+    version: "2.1.1"
   build:
     dependency: transitive
     description:
@@ -269,10 +269,10 @@ packages:
     dependency: transitive
     description:
       name: characters
-      sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
+      sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
       url: "https://pub.dev"
     source: hosted
-    version: "1.4.0"
+    version: "1.3.0"
   checked_yaml:
     dependency: transitive
     description:
@@ -285,10 +285,10 @@ packages:
     dependency: transitive
     description:
       name: clock
-      sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
+      sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.2"
+    version: "1.1.1"
   cloud_firestore:
     dependency: "direct main"
     description:
@@ -325,10 +325,10 @@ packages:
     dependency: transitive
     description:
       name: collection
-      sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
+      sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
       url: "https://pub.dev"
     source: hosted
-    version: "1.19.1"
+    version: "1.19.0"
   convert:
     dependency: transitive
     description:
@@ -473,14 +473,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.4.0"
+  event_bus:
+    dependency: "direct main"
+    description:
+      name: event_bus
+      sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.1"
   fake_async:
     dependency: transitive
     description:
       name: fake_async
-      sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
+      sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
       url: "https://pub.dev"
     source: hosted
-    version: "1.3.2"
+    version: "1.3.1"
   ffi:
     dependency: transitive
     description:
@@ -917,6 +925,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "4.9.0"
+  jwt_decoder:
+    dependency: "direct main"
+    description:
+      name: jwt_decoder
+      sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.1"
   lazy_load_scrollview:
     dependency: "direct main"
     description:
@@ -929,18 +945,18 @@ packages:
     dependency: transitive
     description:
       name: leak_tracker
-      sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
+      sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
       url: "https://pub.dev"
     source: hosted
-    version: "10.0.8"
+    version: "10.0.7"
   leak_tracker_flutter_testing:
     dependency: transitive
     description:
       name: leak_tracker_flutter_testing
-      sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
+      sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.9"
+    version: "3.0.8"
   leak_tracker_testing:
     dependency: transitive
     description:
@@ -993,10 +1009,10 @@ packages:
     dependency: transitive
     description:
       name: matcher
-      sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
+      sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
       url: "https://pub.dev"
     source: hosted
-    version: "0.12.17"
+    version: "0.12.16+1"
   material_color_utilities:
     dependency: transitive
     description:
@@ -1009,10 +1025,10 @@ packages:
     dependency: transitive
     description:
       name: meta
-      sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
+      sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
       url: "https://pub.dev"
     source: hosted
-    version: "1.16.0"
+    version: "1.15.0"
   mime:
     dependency: transitive
     description:
@@ -1153,10 +1169,10 @@ packages:
     dependency: transitive
     description:
       name: path
-      sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
+      sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
       url: "https://pub.dev"
     source: hosted
-    version: "1.9.1"
+    version: "1.9.0"
   path_drawing:
     dependency: transitive
     description:
@@ -1494,10 +1510,10 @@ packages:
     dependency: transitive
     description:
       name: source_span
-      sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
+      sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
       url: "https://pub.dev"
     source: hosted
-    version: "1.10.1"
+    version: "1.10.0"
   sprintf:
     dependency: transitive
     description:
@@ -1550,18 +1566,18 @@ packages:
     dependency: transitive
     description:
       name: stack_trace
-      sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
+      sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
       url: "https://pub.dev"
     source: hosted
-    version: "1.12.1"
+    version: "1.12.0"
   stream_channel:
     dependency: transitive
     description:
       name: stream_channel
-      sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
+      sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.4"
+    version: "2.1.2"
   stream_transform:
     dependency: transitive
     description:
@@ -1574,10 +1590,10 @@ packages:
     dependency: transitive
     description:
       name: string_scanner
-      sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
+      sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
       url: "https://pub.dev"
     source: hosted
-    version: "1.4.1"
+    version: "1.3.0"
   synchronized:
     dependency: "direct main"
     description:
@@ -1590,18 +1606,18 @@ packages:
     dependency: transitive
     description:
       name: term_glyph
-      sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
+      sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
       url: "https://pub.dev"
     source: hosted
-    version: "1.2.2"
+    version: "1.2.1"
   test_api:
     dependency: transitive
     description:
       name: test_api
-      sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
+      sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
       url: "https://pub.dev"
     source: hosted
-    version: "0.7.4"
+    version: "0.7.3"
   timelines_plus:
     dependency: "direct main"
     description:
@@ -1782,10 +1798,10 @@ packages:
     dependency: transitive
     description:
       name: vm_service
-      sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
+      sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
       url: "https://pub.dev"
     source: hosted
-    version: "14.3.1"
+    version: "14.3.0"
   watcher:
     dependency: transitive
     description:
@@ -1907,5 +1923,5 @@ packages:
     source: hosted
     version: "3.1.1"
 sdks:
-  dart: ">=3.7.0-0 <4.0.0"
+  dart: ">=3.6.1 <4.0.0"
   flutter: ">=3.27.0"

+ 2 - 0
pubspec.yaml

@@ -93,6 +93,8 @@ dependencies:
   youtube_player_iframe: ^5.2.1
   mobile_scanner: ^6.0.6
   open_file: ^3.5.10
+  jwt_decoder: ^2.0.1
+  event_bus: ^2.0.1
 
 dev_dependencies:
   flutter_test: