3 Commits ff17233bd8 ... 58fab8cbe0

Author SHA1 Message Date
  babantudev 58fab8cbe0 Perbaikan Tiket Mengalir 1 month ago
  Masarifyuli 8fb648ad36 add page end session 1 month ago
  uye 9d375ccc75 Merge branch 'master' of dama_agh/telnow_2025 into master 2 months ago
29 changed files with 354 additions and 164 deletions
  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: