3 Commits ff17233bd8 ... 58fab8cbe0

Autore SHA1 Messaggio Data
  babantudev 58fab8cbe0 Perbaikan Tiket Mengalir 10 mesi fa
  Masarifyuli 8fb648ad36 add page end session 10 mesi fa
  uye 9d375ccc75 Merge branch 'master' of dama_agh/telnow_2025 into master 10 mesi fa
29 ha cambiato i file con 354 aggiunte e 164 eliminazioni
  1. 0 0
      android/app/.cxx/Debug/3v266c66/arm64-v8a/.cmake/api/v1/reply/index-2025-04-21T03-15-38-0690.json
  2. 12 12
      android/app/.cxx/Debug/3v266c66/arm64-v8a/configure_fingerprint.bin
  3. 0 0
      android/app/.cxx/Debug/3v266c66/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-21T03-15-39-0668.json
  4. 12 12
      android/app/.cxx/Debug/3v266c66/armeabi-v7a/configure_fingerprint.bin
  5. 0 0
      android/app/.cxx/Debug/3v266c66/x86/.cmake/api/v1/reply/index-2025-04-21T03-15-40-0489.json
  6. 12 12
      android/app/.cxx/Debug/3v266c66/x86/configure_fingerprint.bin
  7. 0 0
      android/app/.cxx/Debug/3v266c66/x86_64/.cmake/api/v1/reply/index-2025-04-21T03-15-41-0288.json
  8. 12 12
      android/app/.cxx/Debug/3v266c66/x86_64/configure_fingerprint.bin
  9. 15 0
      android/app/build.gradle
  10. 19 0
      android/app/src/main/res/values-night-v31/styles.xml
  11. 19 0
      android/app/src/main/res/values-v31/styles.xml
  12. 4 1
      assets/lang/en.json
  13. 4 1
      assets/lang/id.json
  14. 2 1
      assets/lang/ja.json
  15. 2 1
      assets/lang/ko.json
  16. 2 1
      assets/lang/zh.json
  17. 21 0
      ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
  18. BIN
      ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png
  19. 2 0
      lib/app_router.dart
  20. 60 43
      lib/app_router.gr.dart
  21. 10 0
      lib/main.dart
  22. 2 0
      lib/src/api/api_auth_provider.dart
  23. 1 0
      lib/src/api/jwt_token.dart
  24. 106 0
      lib/src/layouts/auth/end_session.dart
  25. 12 6
      lib/src/layouts/auth/qr.dart
  26. 1 2
      lib/src/layouts/components/template.dart
  27. 6 60
      lib/src/utils/dio_logging_interceptors.dart
  28. 16 0
      pubspec.lock
  29. 2 0
      pubspec.yaml

android/app/.cxx/Debug/3v266c66/arm64-v8a/.cmake/api/v1/reply/index-2025-04-07T03-22-35-0063.json → android/app/.cxx/Debug/3v266c66/arm64-v8a/.cmake/api/v1/reply/index-2025-04-21T03-15-38-0690.json


+ 12 - 12
android/app/.cxx/Debug/3v266c66/arm64-v8a/configure_fingerprint.bin

@@ -2,27 +2,27 @@ C/C++ Structured LogO
 M
 KC:\src\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC
 A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint	ØñÕöà2§ ÆÄ½�Ñ2`
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint	”à×å2§ ÆÄ½�Ñ2`
 ^
-\E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\additional_project_files.txt	ÙñÕöà2 ÿé•òà2]
+\E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\additional_project_files.txt	”à×å2 ìÄà²å2]
 [
-YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\android_gradle_build.json	ÙñÕöà2• £ê•òà2b
+YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\android_gradle_build.json	Ôà×å2• õÄà²å2b
 `
-^E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\android_gradle_build_mini.json	ÙñÕöà2ò ±ê•òà2O
+^E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\android_gradle_build_mini.json	Ôà×å2ò ÿÄà²å2O
 M
-KE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\build.ninja	ÙñÕöà2ÍÓ Ÿé•òà2S
+KE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\build.ninja	Ôà×å2ÍÓ ±Äà²å2S
 Q
-OE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\build.ninja.txt	ÙñÕöà2X
+OE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\build.ninja.txt	Ôà×å2X
 V
-TE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\build_file_index.txt	ÙñÕöà2
K »ê•òà2Y
+TE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\build_file_index.txt	Ôà×å2
K ‡Åà²å2Y
 W
-UE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\compile_commands.json	ÙñÕöà2	]
+UE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\compile_commands.json	Ôà×å2	]
 [
-YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\compile_commands.json.bin	ÙñÕöà2
+YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\compile_commands.json.bin	Ôà×å2
 c
 a
-_E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\metadata_generation_command.txt	ÙñÕöà2Ÿ ºê•òà2V
+_E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\metadata_generation_command.txt	Ôà×å2Ÿ †Åà²å2V
 T
-RE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\prefab_config.json	ÙñÕöà2
( »ê•òà2[
+RE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\prefab_config.json	Ôà×å2
( †Åà²å2[
 Y
-WE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\symbol_folder_index.txt	ÙñÕöà2

N »ê•òà2
+WE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\arm64-v8a\symbol_folder_index.txt	Ôà×å2

N ‡Åà²å2

android/app/.cxx/Debug/3v266c66/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-07T03-22-36-0324.json → android/app/.cxx/Debug/3v266c66/armeabi-v7a/.cmake/api/v1/reply/index-2025-04-21T03-15-39-0668.json


+ 12 - 12
android/app/.cxx/Debug/3v266c66/armeabi-v7a/configure_fingerprint.bin

@@ -2,27 +2,27 @@ C/C++ Structured LogO
 M
 KC:\src\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC
 A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint	�òÕöà2§ ÆÄ½�Ñ2b
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint	Ö•à×å2§ ÆÄ½�Ñ2b
 `
-^E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\additional_project_files.txt	�òÕöà2 ¯ó•òà2_
+^E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\additional_project_files.txt	וà×å2 ŸÌà²å2_
 ]
-[E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\android_gradle_build.json	�òÕöà2™ ±ó•òà2d
+[E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\android_gradle_build.json	וà×å2™ ¢Ìà²å2d
 b
-`E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\android_gradle_build_mini.json	�òÕöà2ö ²ó•òà2Q
+`E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\android_gradle_build_mini.json	Ø•à×å2ö £Ìà²å2Q
 O
-ME:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\build.ninja	�òÕöà2×Ó �ó•òà2U
+ME:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\build.ninja	Ø•à×å2×Ó ƒÌà²å2U
 S
-QE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\build.ninja.txt	�òÕöà2Z
+QE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\build.ninja.txt	Ø•à×å2Z
 X
-VE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\build_file_index.txt	�òÕöà2
K ´ó•òà2[
+VE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\build_file_index.txt	Ø•à×å2
K ¥Ìà²å2[
 Y
-WE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\compile_commands.json	�òÕöà2	_
+WE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\compile_commands.json	Ø•à×å2	_
 ]
-[E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\compile_commands.json.bin	�òÕöà2
+[E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\compile_commands.json.bin	Ø•à×å2
 e
 c
-aE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\metadata_generation_command.txt	�òÕöà2© ´ó•òà2X
+aE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\metadata_generation_command.txt	Ø•à×å2© ¤Ìà²å2X
 V
-TE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\prefab_config.json	�òÕöà2
( ´ó•òà2]
+TE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\prefab_config.json	Ù•à×å2
( ¥Ìà²å2]
 [
-YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\symbol_folder_index.txt	�òÕöà2

P ´ó•òà2
+YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\armeabi-v7a\symbol_folder_index.txt	Ù•à×å2

P ¥Ìà²å2

android/app/.cxx/Debug/3v266c66/x86/.cmake/api/v1/reply/index-2025-04-07T03-22-37-0487.json → android/app/.cxx/Debug/3v266c66/x86/.cmake/api/v1/reply/index-2025-04-21T03-15-40-0489.json


+ 12 - 12
android/app/.cxx/Debug/3v266c66/x86/configure_fingerprint.bin

@@ -2,27 +2,27 @@ C/C++ Structured LogO
 M
 KC:\src\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC
 A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint	’òÕöà2§ ÆÄ½�Ñ2Z
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint	µ—à×å2§ ÆÄ½�Ñ2Z
 X
-VE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\additional_project_files.txt	’òÕöà2 Äü•òà2W
+VE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\additional_project_files.txt	µ—à×å2 ÔÒà²å2W
 U
-SE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\android_gradle_build.json	“òÕöà2‰ Èü•òà2\
+SE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\android_gradle_build.json	µ—à×å2‰ ÖÒà²å2\
 Z
-XE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\android_gradle_build_mini.json	“òÕöà2æ Ëü•òà2I
+XE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\android_gradle_build_mini.json	µ—à×å2æ ØÒà²å2I
 G
-EE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\build.ninja	“òÕöà2¯Ó œü•òà2M
+EE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\build.ninja	¶—à×å2¯Ó ¸Òà²å2M
 K
-IE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\build.ninja.txt	“òÕöà2R
+IE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\build.ninja.txt	¶—à×å2R
 P
-NE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\build_file_index.txt	“òÕöà2
K Ïü•òà2S
+NE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\build_file_index.txt	¶—à×å2
K ÚÒà²å2S
 Q
-OE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\compile_commands.json	“òÕöà2	W
+OE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\compile_commands.json	·—à×å2	W
 U
-SE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\compile_commands.json.bin	“òÕöà2
+SE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\compile_commands.json.bin	·—à×å2
 ]
 [
-YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\metadata_generation_command.txt	“òÕöà2� Ìü•òà2P
+YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\metadata_generation_command.txt	·—à×å2� ØÒà²å2P
 N
-LE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\prefab_config.json	“òÕöà2
( Íü•òà2U
+LE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\prefab_config.json	·—à×å2
( ÙÒà²å2U
 S
-QE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\symbol_folder_index.txt	“òÕöà2

H Íü•òà2
+QE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86\symbol_folder_index.txt	·—à×å2

H ÙÒà²å2

android/app/.cxx/Debug/3v266c66/x86_64/.cmake/api/v1/reply/index-2025-04-07T03-22-38-0415.json → android/app/.cxx/Debug/3v266c66/x86_64/.cmake/api/v1/reply/index-2025-04-21T03-15-41-0288.json


+ 12 - 12
android/app/.cxx/Debug/3v266c66/x86_64/configure_fingerprint.bin

@@ -2,27 +2,27 @@ C/C++ Structured LogO
 M
 KC:\src\flutter\packages\flutter_tools\gradle\src\main\groovy\CMakeLists.txtC
 A
-?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint	§òÕöà2§ ÆÄ½�Ñ2]
+?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint	ú˜à×å2§ ÆÄ½�Ñ2]
 [
-YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\additional_project_files.txt	§òÕöà2 Ùƒ–òà2Z
+YE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\additional_project_files.txt	ú˜à×å2 ñØà²å2Z
 X
-VE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\android_gradle_build.json	§òÕöà2� Ûƒ–òà2_
+VE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\android_gradle_build.json	û˜à×å2� óØà²å2_
 ]
-[E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\android_gradle_build_mini.json	§òÕöà2ì ݃–òà2L
+[E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\android_gradle_build_mini.json	û˜à×å2ì õØà²å2L
 J
-HE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\build.ninja	§òÕöà2¾Ó ¾ƒ–òà2P
+HE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\build.ninja	û˜à×å2¾Ó ÕØà²å2P
 N
-LE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\build.ninja.txt	§òÕöà2U
+LE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\build.ninja.txt	û˜à×å2U
 S
-QE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\build_file_index.txt	©òÕöà2
K Þƒ–òà2V
+QE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\build_file_index.txt	û˜à×å2
K öØà²å2V
 T
-RE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\compile_commands.json	©òÕöà2	Z
+RE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\compile_commands.json	û˜à×å2	Z
 X
-VE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\compile_commands.json.bin	©òÕöà2
+VE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\compile_commands.json.bin	û˜à×å2
 `
 ^
-\E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\metadata_generation_command.txt	©òÕöà2� Þƒ–òà2S
+\E:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\metadata_generation_command.txt	û˜à×å2� õØà²å2S
 Q
-OE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\prefab_config.json	©òÕöà2
( Þƒ–òà2X
+OE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\prefab_config.json	û˜à×å2
( öØà²å2X
 V
-TE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\symbol_folder_index.txt	©òÕöà2

K Þƒ–òà2
+TE:\Kantor\telnow_2025\android\app\.cxx\Debug\3v266c66\x86_64\symbol_folder_index.txt	ü˜à×å2

K öØà²å2

+ 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>

+ 4 - 1
assets/lang/en.json

@@ -322,5 +322,8 @@
    "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.",
+   "invalidParentTicket": "Invalid parent ticket."
 }

+ 4 - 1
assets/lang/id.json

@@ -322,5 +322,8 @@
    "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.",
+   "invalidParentTicket": "Tiket induk tidak valid."
 }

+ 2 - 1
assets/lang/ja.json

@@ -322,5 +322,6 @@
    "referenceNumber": "参照番号",
    "enterTicketNumber": "チケット番号を入力してください",
    "subject": "主題",
-   "requestReference": "リクエストリファレンス"
+   "requestReference": "リクエストリファレンス",
+   "invalidParentTicket": "親チケットが無効です。"
 }

+ 2 - 1
assets/lang/ko.json

@@ -322,5 +322,6 @@
    "referenceNumber": "참조번호",
    "enterTicketNumber": "티켓번호를 입력하세요",
    "subject": "주제",
-   "requestReference": "참조 요청"
+   "requestReference": "참조 요청",
+   "invalidParentTicket": "부모 티켓이 유효하지 않습니다."
 }

+ 2 - 1
assets/lang/zh.json

@@ -322,5 +322,6 @@
    "referenceNumber": "参考编号",
    "enterTicketNumber": "输入票号",
    "subject": "主题",
-   "requestReference": "请求参考"
+   "requestReference": "请求参考",
+   "invalidParentTicket": "父母票无效。"
 }

+ 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
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(),

+ 2 - 0
lib/src/api/api_auth_provider.dart

@@ -294,6 +294,8 @@ class ApiAuthProvider {
           showError(context, 'idNotFound'.tr());
         } else if(error.response?.data['message'] == 'You are not registered as receptionist or room attendant.'){
           showError(context, 'informantNotRegistered'.tr());
+        } else if(error.response?.data['message'] == 'invalid parent ticket'){
+          showError(context, 'invalidParentTicket'.tr());
         } else {
           showError(context, error.response?.data['message']);
         }

+ 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);
-//    }
-//  }
 }

+ 16 - 0
pubspec.lock

@@ -473,6 +473,14 @@ 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:
@@ -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:

+ 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: