Browse Source

fix: stuck loading

Masarifyuli 1 month ago
parent
commit
7e4402e8dd
35 changed files with 225 additions and 118 deletions
  1. 3 1
      assets/lang/en.json
  2. 4 1
      assets/lang/id.json
  3. 3 1
      assets/lang/ja.json
  4. 3 1
      assets/lang/ko.json
  5. 3 1
      assets/lang/zh.json
  6. 3 3
      lib/app_router.dart
  7. 6 5
      lib/main.dart
  8. 4 4
      lib/src/api/api_auth_provider.dart
  9. 31 16
      lib/src/layouts/auth/end_session.dart
  10. 44 1
      lib/src/layouts/components/template.dart
  11. 4 2
      lib/src/layouts/functions/account.dart
  12. 2 1
      lib/src/layouts/mobile/history_detail.dart
  13. 2 1
      lib/src/layouts/mobile/history_detail_pending.dart
  14. 3 1
      lib/src/layouts/mobile/history_forum.dart
  15. 2 1
      lib/src/layouts/mobile/menu_account.dart
  16. 18 6
      lib/src/layouts/mobile/menu_history.dart
  17. 3 2
      lib/src/layouts/mobile/menu_home.dart
  18. 1 1
      lib/src/layouts/mobile/message_broadcast.dart
  19. 1 1
      lib/src/layouts/mobile/message_chat.dart
  20. 1 1
      lib/src/layouts/mobile/message_list.dart
  21. 1 1
      lib/src/layouts/mobile/message_select.dart
  22. 1 1
      lib/src/layouts/mobile/request_select.dart
  23. 5 2
      lib/src/layouts/mobile/request_success.dart
  24. 2 1
      lib/src/layouts/web/history_detail.dart
  25. 1 1
      lib/src/layouts/web/history_detail_pending.dart
  26. 1 1
      lib/src/layouts/web/history_forum.dart
  27. 2 1
      lib/src/layouts/web/menu_account.dart
  28. 4 3
      lib/src/layouts/web/menu_history.dart
  29. 2 1
      lib/src/layouts/web/menu_home.dart
  30. 2 2
      lib/src/layouts/web/message_list.dart
  31. 1 1
      lib/src/layouts/web/request_select.dart
  32. 2 2
      lib/src/layouts/web/request_success.dart
  33. 18 9
      lib/src/utils/U.dart
  34. 5 4
      lib/src/utils/dio_logging_interceptors.dart
  35. 37 37
      pubspec.lock

+ 3 - 1
assets/lang/en.json

@@ -325,5 +325,7 @@
    "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."
+   "invalidParentTicket": "Invalid parent ticket.",
+   "failedLoad": "Failed to load Application.",
+   "tap2retry": "Tap to retry."
 }

+ 4 - 1
assets/lang/id.json

@@ -325,5 +325,8 @@
    "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."
+   "invalidParentTicket": "Nomor referensi tidak valid.",
+   "failedLoad": "Gagal memuat aplikasi.",
+   "tap2retry": "Ketuk untuk mencoba kembali."
+
 }

+ 3 - 1
assets/lang/ja.json

@@ -323,5 +323,7 @@
    "enterTicketNumber": "チケット番号を入力してください",
    "subject": "主題",
    "requestReference": "リクエストリファレンス",
-   "invalidParentTicket": "親チケットが無効です。"
+   "invalidParentTicket": "親チケットが無効です。",
+   "failedLoad": "アプリケーションのロードに失敗しました。",
+   "tap2retry": "タップして再試行します。"
 }

+ 3 - 1
assets/lang/ko.json

@@ -323,5 +323,7 @@
    "enterTicketNumber": "티켓번호를 입력하세요",
    "subject": "주제",
    "requestReference": "참조 요청",
-   "invalidParentTicket": "부모 티켓이 유효하지 않습니다."
+   "invalidParentTicket": "부모 티켓이 유효하지 않습니다.",
+   "failedLoad": "애플리케이션을 로드하지 못했습니다.",
+   "tap2retry": "다시 시도하려면 탭하세요."
 }

+ 3 - 1
assets/lang/zh.json

@@ -323,5 +323,7 @@
    "enterTicketNumber": "输入票号",
    "subject": "主题",
    "requestReference": "请求参考",
-   "invalidParentTicket": "父母票无效。"
+   "invalidParentTicket": "父母票无效。",
+   "failedLoad": "无法加载应用程序。",
+   "tap2retry": "点击重试。"
 }

+ 3 - 3
lib/app_router.dart

@@ -1,6 +1,6 @@
 import 'package:auto_route/auto_route.dart';
 import 'package:flutter/foundation.dart';
-import 'package:flutter_native_splash/flutter_native_splash.dart';
+// 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';
@@ -45,7 +45,7 @@ class AppRouter extends RootStackRouter {
       if (!kIsWeb && U.getAccessCode() != null && param.isEmpty) {
         router.pushPath('/app/${Uri.encodeComponent(U.getAccessCode()!)}');
       } else{
-        FlutterNativeSplash.remove();
+        // FlutterNativeSplash.remove();
         resolver.next();
       }
     })
@@ -112,7 +112,7 @@ class AppRouter extends RootStackRouter {
         }
       }
 
-      FlutterNativeSplash.remove();
+      // FlutterNativeSplash.remove();
       resolver.next();
     })
   ];

+ 6 - 5
lib/main.dart

@@ -10,7 +10,7 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_local_notifications/flutter_local_notifications.dart';
-import 'package:flutter_native_splash/flutter_native_splash.dart';
+// import 'package:flutter_native_splash/flutter_native_splash.dart';
 import 'package:fluttertoast/fluttertoast.dart';
 import 'package:page_transition/page_transition.dart';
 import 'package:provider/provider.dart';
@@ -27,6 +27,7 @@ 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;
+import 'package:telnow_mobile_new/src/api/jwt_token.dart';
 
 import 'app_router.dart';
 
@@ -68,8 +69,8 @@ void main() async{
     await setupLocator();
     SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
     HttpOverrides.global = new MyHttpOverrides();
-    WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
-    FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
+    // WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
+    // FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
     runApp(
         EasyLocalization(
             path: 'assets/lang',
@@ -152,7 +153,7 @@ class HomeGuardPage extends StatefulWidget {
 
 class _HomeGuardPageState extends State<HomeGuardPage> {
   late DateTime currentBackPressTime;
-
+  JwtToken token = JwtToken();
   @override
   Widget build(BuildContext context) {
     eventBus.on().listen((event) {
@@ -160,7 +161,7 @@ class _HomeGuardPageState extends State<HomeGuardPage> {
       if(event.toString() == 'logout') {
         // token.logout();
         context.navigateToPath('/end-session');
-        return;
+        // return;
       }
     });
     // TODO: implement build

+ 4 - 4
lib/src/api/api_auth_provider.dart

@@ -39,8 +39,8 @@ class ApiAuthProvider {
   // final String baseUrl = 'http://$host/';
   final String clientId = 'inf-G52G4op8N8';
   final String clientSecret = '3JskYu5zxlXRDv6g';
-  final String clientIdWeb = 'web-apHca0ncOX';
-  final String clientSecretWeb = '1qeIwW8Wu9AF4DRF';
+  // final String clientIdWeb = 'web-apHca0ncOX';
+  // final String clientSecretWeb = '1qeIwW8Wu9AF4DRF';
   var isDebug;
 
   ApiAuthProvider() {
@@ -89,7 +89,7 @@ class ApiAuthProvider {
             headers: {
               'Accept': 'application/json',
               'Authorization': 'Basic ${base64Encode(
-                utf8.encode('${kIsWeb?clientIdWeb:clientId}:${kIsWeb?clientSecretWeb:clientSecret}'),
+                utf8.encode('$clientId:$clientSecret'),
               )}'
             },
           ));
@@ -144,7 +144,7 @@ class ApiAuthProvider {
           headers: {
             'Accept': 'application/json',
             'Authorization': 'Basic ${base64Encode(
-              utf8.encode('${kIsWeb?clientIdWeb:clientId}:${kIsWeb?clientSecretWeb:clientSecret}'),
+              utf8.encode('$clientId:$clientSecret'),
             )}',
           },
         ),

+ 31 - 16
lib/src/layouts/auth/end_session.dart

@@ -10,9 +10,14 @@ import 'package:telnow_mobile_new/src/utils/U.dart';
 import '../components/template.dart';
 
 @RoutePage()
-class EndSessionPage extends StatelessWidget {
+class EndSessionPage extends StatefulWidget {
   const EndSessionPage({super.key});
 
+  @override
+  State<EndSessionPage> createState() => _EndSessionPageState();
+}
+
+class _EndSessionPageState extends State<EndSessionPage> {
   @override
   Widget build(BuildContext context) {
     bool useAsset = false;
@@ -31,10 +36,10 @@ class EndSessionPage extends StatelessWidget {
       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);
-            })
+              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(
@@ -58,20 +63,22 @@ class EndSessionPage extends StatelessWidget {
                       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),
-                            ],
-                          )
+                            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");
+                            setState(() {
+                              token.logout();
+                              context.router.removeLast();
+                              context.navigateToPath("/app/${U.getAccessCode()}/login");
+                            });
                           },
                           child: Container(
                             padding: EdgeInsets.symmetric(vertical: 32, horizontal: 64),
@@ -104,3 +111,11 @@ class EndSessionPage extends StatelessWidget {
     );
   }
 }
+
+// class EndSessionPage extends StatelessWidget {
+//   const EndSessionPage({super.key});
+//
+//   @override
+//   Widget build(BuildContext context) {
+//
+// }

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

@@ -18,6 +18,7 @@ import 'package:lottie/lottie.dart';
 import 'package:page_transition/page_transition.dart';
 import 'package:photo_view/photo_view.dart';
 import 'package:photo_view/photo_view_gallery.dart';
+import 'package:provider/provider.dart';
 import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
 import 'package:telnow_mobile_new/src/api/jwt_token.dart';
 import 'package:telnow_mobile_new/src/injector/injector.dart';
@@ -25,8 +26,11 @@ import 'package:telnow_mobile_new/src/layouts/auth/qr.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/cache_manager.dart';
+import 'package:telnow_mobile_new/src/utils/dio_logging_interceptors.dart';
 import 'package:uuid/uuid.dart';
 
+import '../../utils/provider.dart';
+
 PreferredSizeWidget appBarTemplate({required BuildContext context, required String title, String icon = 'arrow-left', List<Widget>? action, exc = false}){
   return AppBar(
     elevation: 0,
@@ -250,7 +254,10 @@ Widget loginFieldTemplate({required String value, placeholder = '', required act
   );
 }
 
-Widget loadingTemplate(){
+Widget loadingTemplate(VoidCallback setState){
+  Future.delayed(Duration(seconds: 10),() {
+    setState();
+  });
   return Center(
     child: Container(
       height: 36,
@@ -265,6 +272,42 @@ Widget loadingTemplate(){
   );
 }
 
+Widget showButton(BuildContext context){
+  var pid = U.getPidFromUrl(context.router.currentUrl);
+  return Center(
+    child: GestureDetector(
+      onTap: (){
+        context.router.removeLast();
+        context.navigateToPath("/app/$pid/login");
+      },
+      child: Container(
+        decoration: BoxDecoration(color: Colors.amber.withAlpha(0)),
+        height: MediaQuery.of(context).size.height,
+        width: MediaQuery.of(context).size.width,
+        child: Center(
+            child: Column(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                Text("failedLoad".tr()),
+                SizedBox(height: 12,),
+                Container(
+                  decoration: BoxDecoration(
+                    border: Border.all(color: Color(0xFFA5A5A5)),
+                    borderRadius: BorderRadius.all(Radius.circular(4))
+                  ),
+                  child: Padding(
+                    padding: const EdgeInsets.all(8.0),
+                    child: Text("tap2retry".tr()),
+                  ),
+                )
+              ],
+            )
+        )
+      ),
+    ),
+  );
+}
+
 Widget infoContainer(String text){
   return Container(
     width: double.infinity,

+ 4 - 2
lib/src/layouts/functions/account.dart

@@ -6,6 +6,7 @@ import 'package:telnow_mobile_new/main.dart';
 import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
 import 'package:telnow_mobile_new/src/api/jwt_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:telnow_mobile_new/src/utils/provider.dart';
 
@@ -13,7 +14,7 @@ class AccountFunction{
   final ApiAuthProvider apiAuthProvider = ApiAuthProvider();
   final NotificationClass notification = NotificationClass();
   final JwtToken token = JwtToken();
-  
+  SharedPreferencesManager _sharedPreferencesManager = SharedPreferencesManager();
   getUser(BuildContext context) async {
     var res = await token.getUserData(context);
     if (res != null) {
@@ -53,7 +54,8 @@ class AccountFunction{
     String pid = U.getPidFromUrl(context.router.currentUrl);
 
     try {
-      var tkn = await U.getFcmToken();
+      var tkn = await _sharedPreferencesManager.getString(SharedPreferencesManager.keyFcmToken);
+      // var tkn = await U.getFcmToken();
       if (tkn == null) {
         Navigator.of(context).pop();
         closeLoading(context);

+ 2 - 1
lib/src/layouts/mobile/history_detail.dart

@@ -33,6 +33,7 @@ class _MobHistoryDetailPageState extends State<MobHistoryDetailPage> {
     {'key': 4, 'image': "assets/image/icon/satisfied.png", 'label': 'verySatisfied'.tr()},
     {'key': 5, 'image': "assets/image/icon/very_satisfied.png", 'label': 'reallyPleased'.tr()},
   ];
+  bool _timeLimit = false;
 
   @override
   void initState() {
@@ -324,7 +325,7 @@ class _MobHistoryDetailPageState extends State<MobHistoryDetailPage> {
                     ],
                   ),
                 ),
-              ):loadingTemplate(),
+              ):_timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},),
             ),
             divider(),
             list.isEmpty || list['autoResponse'] || list['currentState'] == 'DISELESAIKAN' || list['currentState'] == 'TUNTAS' || list['currentState'] == 'DIBATALKAN' ? Container() : Container(

+ 2 - 1
lib/src/layouts/mobile/history_detail_pending.dart

@@ -18,6 +18,7 @@ class MobHistoryDetailPendingPage extends StatefulWidget {
 
 class _MobHistoryDetailPendingPageState extends State<MobHistoryDetailPendingPage> {
   final SharedPreferencesManager sharedPreferencesManager = locator<SharedPreferencesManager>();
+  bool _timeLimit = false;
 
   @override
   Widget build(BuildContext context) {
@@ -101,7 +102,7 @@ class _MobHistoryDetailPendingPageState extends State<MobHistoryDetailPendingPag
                     ],
                   ),
                 ),
-              ):loadingTemplate(),
+              ):_timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},),
             ),
             divider(),
             widget.data.isNotEmpty?Container(

+ 3 - 1
lib/src/layouts/mobile/history_forum.dart

@@ -292,7 +292,9 @@ class _MobHistoryForumPageState extends State<MobHistoryForumPage> {
             child: Container(
               alignment: Alignment.topCenter,
               width: U.bodyWidth(context),
-              child: messageData.length == 0 && !isAfterLoad ? loadingTemplate() : SingleChildScrollView(
+              child: messageData.length == 0 && !isAfterLoad ? loadingTemplate(() {
+
+              },) : SingleChildScrollView(
                 controller: scrollController,
                 reverse: isReverse,
                 padding: EdgeInsets.fromLTRB(10, 10, 10, 7),

+ 2 - 1
lib/src/layouts/mobile/menu_account.dart

@@ -28,6 +28,7 @@ class _MobAccountPageState extends State<MobAccountPage> {
   bool dnd = false;
   bool autoTranslate = false;
   List lang = [];
+  bool _timeLimit = false;
 
   @override
   void initState() {
@@ -417,7 +418,7 @@ class _MobAccountPageState extends State<MobAccountPage> {
     ) : Provider.of<UserModule>(context).resetData() ? RefreshPage(() {
       Provider.of<UserModule>(context, listen: false).setResetData(false);
       accFunc.getUser(context);
-    }) : loadingTemplate();
+    }) : _timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},);
   }
 
   changeLang(context, user) {

+ 18 - 6
lib/src/layouts/mobile/menu_history.dart

@@ -1,3 +1,4 @@
+import 'package:auto_route/auto_route.dart';
 import 'package:easy_localization/easy_localization.dart';
 import 'package:easy_refresh/easy_refresh.dart';
 import 'package:flutter/material.dart';
@@ -10,6 +11,7 @@ import 'package:telnow_mobile_new/src/layouts/mobile/history_detail_pending.dart
 import 'package:telnow_mobile_new/src/layouts/components/template.dart';
 import 'package:telnow_mobile_new/src/layouts/mobile/history_rating.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';
 
 class MobHistoryPage extends StatefulWidget {
@@ -30,7 +32,8 @@ class _MobHistoryPageState extends State<MobHistoryPage> with TickerProviderStat
     {'key': 4, 'image': "assets/image/icon/satisfied.png", 'label': 'verySatisfied'.tr()},
     {'key': 5, 'image': "assets/image/icon/very_satisfied.png", 'label': 'reallyPleased'.tr()},
   ];
-  
+  bool _timeLimit = false;
+
   @override
   void initState() {
     Provider.of<HistoryModule>(context, listen: false).reset();
@@ -49,13 +52,16 @@ class _MobHistoryPageState extends State<MobHistoryPage> with TickerProviderStat
     _animationController.dispose();
     super.dispose();
   }
-  
+
   @override
   Widget build(BuildContext context) {
+    eventBus.on().listen((event){
+      print(event.toString());
+    });
     return Provider.of<UserModule>(context).resetData() ? RefreshPage(() {
       Provider.of<UserModule>(context, listen: false).setResetData(false);
       hisFunc.getActiveForum(context);
-    }) : Scaffold(
+    }) : _timeLimit ? showButton(context) : Scaffold(
       backgroundColor: backgroundColor,
       appBar: AppBar(
         elevation: 0,
@@ -144,7 +150,9 @@ class _MobHistoryPageState extends State<MobHistoryPage> with TickerProviderStat
                   child: Provider.of<HistoryModule>(context).selectedFilter() == 0 ? doneContainer() : ongoingContainer(),
                 ),
               ),
-            ) : Provider.of<UserModule>(context).resetData() ? Container() : loadingTemplate(),
+            ) : Provider.of<UserModule>(context).resetData() ? Container() : loadingTemplate(() {
+              if(mounted) if(mounted) setState(()=>_timeLimit=true);
+            },),
           )
         ],
       ),
@@ -334,7 +342,7 @@ class _MobHistoryPageState extends State<MobHistoryPage> with TickerProviderStat
             }),
           ),
           !Provider.of<HistoryModule>(context).stopLoadHistory() || (Provider.of<HistoryModule>(context).isLoadHistory() && Provider.of<HistoryModule>(context).page() > 0)
-              ? Container(margin: EdgeInsets.only(top: Provider.of<HistoryModule>(context).page() > 0 ? 0 : 50), child: loadingTemplate())
+              ? Container(margin: EdgeInsets.only(top: Provider.of<HistoryModule>(context).page() > 0 ? 0 : 50), child: loadingTemplate(() {},))
               : Provider.of<HistoryModule>(context).dataMisi().length == 0 && Provider.of<HistoryModule>(context).dataPending().length == 0
               ? NoDataPage()
               : Container(),
@@ -478,7 +486,7 @@ class _MobHistoryPageState extends State<MobHistoryPage> with TickerProviderStat
                 );
               })),
           !Provider.of<HistoryModule>(context).stopLoadHistory() || (Provider.of<HistoryModule>(context).isLoadHistory() && Provider.of<HistoryModule>(context).page() > 0)
-              ? Container(margin: EdgeInsets.only(top: Provider.of<HistoryModule>(context).page() > 0 ? 0 : 50), child: loadingTemplate())
+              ? Container(margin: EdgeInsets.only(top: Provider.of<HistoryModule>(context).page() > 0 ? 0 : 50), child: loadingTemplate(() {},))
               : Provider.of<HistoryModule>(context).dataMisi().length == 0
               ? NoDataPage()
               : Container(),
@@ -619,3 +627,7 @@ class _MobHistoryPageState extends State<MobHistoryPage> with TickerProviderStat
         });
   }
 }
+
+Widget mbuh(context){
+  return Text('data');
+}

+ 3 - 2
lib/src/layouts/mobile/menu_home.dart

@@ -34,6 +34,7 @@ class MobHomePage extends StatefulWidget {
 class _MobHomePageState extends State<MobHomePage> with WidgetsBindingObserver {
   final HomeFunction homeFunc = HomeFunction();
   final SharedPreferencesManager sharedPreferencesManager = locator<SharedPreferencesManager>();
+  bool _timeLimit = false;
 
   @override
   void initState() {
@@ -545,9 +546,9 @@ class _MobHomePageState extends State<MobHomePage> with WidgetsBindingObserver {
         ],
       ),
     ) : Provider.of<UserModule>(context).resetData() ? RefreshPage(() {
-      Provider.of<UserModule>(context).setResetData(false);
+      Provider.of<UserModule>(context, listen: false).setResetData(false);
       homeFunc.getProfileData(context);
-    }) : loadingTemplate();
+    }) : _timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},);
   }
 
   Widget emptyWidget({double left = 16}){

+ 1 - 1
lib/src/layouts/mobile/message_broadcast.dart

@@ -275,7 +275,7 @@ class _MobMessageBroadcastPageState extends State<MobMessageBroadcastPage> {
             ),
           )
         ],
-      ):loadingTemplate(),
+      ):loadingTemplate(() {},),
     );
   }
 }

+ 1 - 1
lib/src/layouts/mobile/message_chat.dart

@@ -261,7 +261,7 @@ class _MobMessageChatPageState extends State<MobMessageChatPage> {
               child: Container(width: bodyWidth,
                 child:LayoutBuilder(
                     builder: (context,constraint) {
-                      return messageData.length == 0 && !isAfterLoad ? loadingTemplate() : Column(
+                      return messageData.length == 0 && !isAfterLoad ? loadingTemplate(() {},) : Column(
                         children: [
                           Expanded(
                             child: SingleChildScrollView(

+ 1 - 1
lib/src/layouts/mobile/message_list.dart

@@ -48,7 +48,7 @@ class _MobMessageListPageState extends State<MobMessageListPage> {
               child: EasyRefresh(
                 header: MaterialHeader(clamping: true, color: primaryColor),
                 onRefresh: () => messageFunc.onRefresh(context),
-                child: Provider.of<MessageModule>(context).data().isEmpty && !Provider.of<MessageModule>(context).firstLoad()? loadingTemplate() : Provider.of<MessageModule>(context).data().isEmpty ? Center(
+                child: Provider.of<MessageModule>(context).data().isEmpty && !Provider.of<MessageModule>(context).firstLoad()? loadingTemplate(() {},) : Provider.of<MessageModule>(context).data().isEmpty ? Center(
                   child: Text('noMessageText').tr(),
                 ) : ListView(
                   padding: EdgeInsets.only(top: 12.0),

+ 1 - 1
lib/src/layouts/mobile/message_select.dart

@@ -62,7 +62,7 @@ class _MobMessageSelectPageState extends State<MobMessageSelectPage> {
     return Scaffold(
       backgroundColor: Colors.white,
       appBar: appBarTemplate(context: context, title: 'selectRecipient'.tr()),
-      body: !isLoaded ? loadingTemplate() : Column(
+      body: !isLoaded ? loadingTemplate(() {},) : Column(
         children: [
           divider(),
           Expanded(

+ 1 - 1
lib/src/layouts/mobile/request_select.dart

@@ -84,7 +84,7 @@ class _MobReqSelectPageState extends State<MobReqSelectPage> {
             child: Container(
               alignment: Alignment.topCenter,
               width: U.bodyWidth(context),
-              child: Provider.of<RequestModule>(context).isLoad()? loadingTemplate() : SingleChildScrollView(
+              child: Provider.of<RequestModule>(context).isLoad()? loadingTemplate(() {},) : SingleChildScrollView(
                 padding: EdgeInsets.symmetric(horizontal: 16),
                 child: Provider.of<RequestModule>(context).isEmpty() ? Center(child: Padding(
                     padding: const EdgeInsets.only(top: 24.0),

+ 5 - 2
lib/src/layouts/mobile/request_success.dart

@@ -57,6 +57,8 @@ class _MobReqSuccessPageState extends State<MobReqSuccessPage> {
     Navigator.of(context).popUntil((_) => count++ >= page);
   }
 
+  bool _timeLimit = false;
+
   @override
   Widget build(BuildContext context) {
     return Scaffold(
@@ -169,7 +171,7 @@ class _MobReqSuccessPageState extends State<MobReqSuccessPage> {
                   ],
                 ),
               ),
-            ):loadingTemplate(),
+            ):_timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},),
           ),
           list.isNotEmpty?Column(
             children: [
@@ -264,6 +266,7 @@ class MobReqSuccessPendingPage extends StatefulWidget {
 }
 
 class _MobReqSuccessPendingPageState extends State<MobReqSuccessPendingPage> {
+  bool _timeLimit = false;
   @override
   Widget build(BuildContext context) {
     return Scaffold(
@@ -333,7 +336,7 @@ class _MobReqSuccessPendingPageState extends State<MobReqSuccessPendingPage> {
                   ],
                 ),
               ),
-            ):loadingTemplate(),
+            ):_timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},),
           ),
           Column(
             children: [

+ 2 - 1
lib/src/layouts/web/history_detail.dart

@@ -32,6 +32,7 @@ class _WebHistoryDetailPageState extends State<WebHistoryDetailPage> {
     {'key': 4, 'image': "assets/image/icon/satisfied.png", 'label': 'verySatisfied'.tr()},
     {'key': 5, 'image': "assets/image/icon/very_satisfied.png", 'label': 'reallyPleased'.tr()},
   ];
+  bool _timeLimit = false;
 
   @override
   void initState() {
@@ -327,7 +328,7 @@ class _WebHistoryDetailPageState extends State<WebHistoryDetailPage> {
                     ],
                   )
                 ],
-              ) : loadingTemplate(),
+              ) : _timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},),
             ),
           ),
           list.isEmpty || list['autoResponse'] || list['currentState'] == 'DISELESAIKAN' || list['currentState'] == 'TUNTAS' || list['currentState'] == 'DIBATALKAN' ? Container() : Container(

+ 1 - 1
lib/src/layouts/web/history_detail_pending.dart

@@ -112,7 +112,7 @@ class _WebHistoryDetailPendingPageState extends State<WebHistoryDetailPendingPag
                     ],
                   )
                 ],
-              ):loadingTemplate(),
+              ):loadingTemplate(() {},),
             ),
           ),
           Container(

+ 1 - 1
lib/src/layouts/web/history_forum.dart

@@ -441,7 +441,7 @@ class _WebHistoryForumPageState extends State<WebHistoryForumPage> {
                     child: Column(
                       children: [
                         Expanded(
-                          child: messageData.length == 0 && !isAfterLoad ? loadingTemplate() : SingleChildScrollView(
+                          child: messageData.length == 0 && !isAfterLoad ? loadingTemplate(() {},) : SingleChildScrollView(
                             controller: scrollController,
                             reverse: isReverse,
                             child: Column(

+ 2 - 1
lib/src/layouts/web/menu_account.dart

@@ -28,6 +28,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
   bool dnd = false;
   bool autoTranslate = false;
   List lang = [];
+  bool _timeLimit = false;
 
   @override
   void initState() {
@@ -445,7 +446,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
     ) : Provider.of<UserModule>(context).resetData() ? RefreshPage(() {
       Provider.of<UserModule>(context, listen: false).setResetData(false);
       accFunc.getUser(context);
-    }) : loadingTemplate();
+    }) : _timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},);
   }
 
   changeLang(context, user) {

+ 4 - 3
lib/src/layouts/web/menu_history.dart

@@ -29,6 +29,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
     {'key': 4, 'image': "assets/image/icon/satisfied.png", 'label': 'verySatisfied'.tr()},
     {'key': 5, 'image': "assets/image/icon/very_satisfied.png", 'label': 'reallyPleased'.tr()},
   ];
+  bool _timeLimit = false;
 
   @override
   void initState() {
@@ -146,7 +147,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                   child: Provider.of<HistoryModule>(context).selectedFilter() == 0 ? doneContainer() : ongoingContainer(),
                 ),
               ),
-            ) : Provider.of<UserModule>(context).resetData() ? Container() : loadingTemplate(),
+            ) : Provider.of<UserModule>(context).resetData() ? Container() : _timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},),
           )
         ],
       ),
@@ -359,7 +360,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
             }),
           ),
           !Provider.of<HistoryModule>(context).stopLoadHistory() || (Provider.of<HistoryModule>(context).isLoadHistory() && Provider.of<HistoryModule>(context).page() > 0)
-              ? Container(margin: EdgeInsets.only(top: Provider.of<HistoryModule>(context).page() > 0 ? 0 : 50), child: loadingTemplate())
+              ? Container(margin: EdgeInsets.only(top: Provider.of<HistoryModule>(context).page() > 0 ? 0 : 50), child: loadingTemplate(() {},))
               : Provider.of<HistoryModule>(context).dataMisi().isEmpty && Provider.of<HistoryModule>(context).dataPending().isEmpty
               ? NoDataPage()
               : Container(),
@@ -494,7 +495,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
               })
           ),
           !Provider.of<HistoryModule>(context).stopLoadHistory() || (Provider.of<HistoryModule>(context).isLoadHistory() && Provider.of<HistoryModule>(context).page() > 0)
-              ? Container(margin: EdgeInsets.only(top: Provider.of<HistoryModule>(context).page() > 0 ? 0 : 50), child: loadingTemplate())
+              ? Container(margin: EdgeInsets.only(top: Provider.of<HistoryModule>(context).page() > 0 ? 0 : 50), child: loadingTemplate(() {},))
               : Provider.of<HistoryModule>(context).dataMisi().length == 0 ? NoDataPage() : Container(),
         ],
       ),

+ 2 - 1
lib/src/layouts/web/menu_home.dart

@@ -52,6 +52,7 @@ class _WebHomePageState extends State<WebHomePage> {
     // TODO: implement initState
     super.initState();
   }
+  bool _timeLimit = false;
 
   @override
   Widget build(BuildContext context) {
@@ -666,7 +667,7 @@ class _WebHomePageState extends State<WebHomePage> {
     ) : Provider.of<UserModule>(context).resetData() ? RefreshPage(() {
       Provider.of<UserModule>(context).setResetData(false);
       homeFunc.getProfileData(context);
-    }) : loadingTemplate();
+    }) : _timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},);
   }
 
   Widget emptyWidget(){

+ 2 - 2
lib/src/layouts/web/message_list.dart

@@ -248,7 +248,7 @@ class _WebMessageListPageState extends State<WebMessageListPage> {
                           child: EasyRefresh(
                             header: MaterialHeader(clamping: true, color: primaryColor),
                             onRefresh: () => messageFunc.onRefresh(context),
-                            child: Provider.of<MessageModule>(context).data().isEmpty && !Provider.of<MessageModule>(context).firstLoad()? loadingTemplate() : Provider.of<MessageModule>(context).data().isEmpty ? Center(
+                            child: Provider.of<MessageModule>(context).data().isEmpty && !Provider.of<MessageModule>(context).firstLoad()? loadingTemplate(() {},) : Provider.of<MessageModule>(context).data().isEmpty ? Center(
                               child: Text('noMessageText').tr(),
                             ) : SingleChildScrollView(
                               padding: EdgeInsets.symmetric(vertical: 20, horizontal: 10),
@@ -350,7 +350,7 @@ class _WebMessageListPageState extends State<WebMessageListPage> {
                           ),
                           divider(),
                           Expanded(
-                            child: messageData.isEmpty && !isAfterLoad ? loadingTemplate() : SingleChildScrollView(
+                            child: messageData.isEmpty && !isAfterLoad ? loadingTemplate(() {},) : SingleChildScrollView(
                               padding: const EdgeInsets.fromLTRB(10, 10, 10, 7),
                               controller: scrollController,
                               reverse: isReverse,

+ 1 - 1
lib/src/layouts/web/request_select.dart

@@ -102,7 +102,7 @@ class _WebReqSelectPageState extends State<WebReqSelectPage> {
           ),
           divider(),
           Expanded(
-            child: Provider.of<RequestModule>(context).isLoad()? loadingTemplate() : Container(
+            child: Provider.of<RequestModule>(context).isLoad()? loadingTemplate(() {},) : Container(
               width: double.infinity,
               child: SingleChildScrollView(
                 padding: EdgeInsets.symmetric(vertical: 25, horizontal: 100),

+ 2 - 2
lib/src/layouts/web/request_success.dart

@@ -197,7 +197,7 @@ class _WebReqSuccessPageState extends State<WebReqSuccessPage> {
                   )
                 ],
               ),
-            ):loadingTemplate(),
+            ):loadingTemplate(() {},),
           )
         ],
       ),
@@ -378,7 +378,7 @@ class _WebReqSuccessPendingPageState extends State<WebReqSuccessPendingPage> {
                     ],
                   )
                 ],
-              ):loadingTemplate(),
+              ):loadingTemplate(() {},),
             ),
           )
         ],

+ 18 - 9
lib/src/utils/U.dart

@@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_randomcolor/flutter_randomcolor.dart';
 import 'package:flutter_svg/svg.dart';
+import 'package:jwt_decoder/jwt_decoder.dart';
 import 'package:telnow_mobile_new/src/api/api_auth_repository.dart';
 import 'package:telnow_mobile_new/src/model/token/token.dart';
 import 'dart:convert';
@@ -86,14 +87,22 @@ class U {
   }
 
   static Future waitForRefreshAuth() async {
-    return _lockAuth.synchronized(() async {
-      // print("wait refresh token OK");
-    });
+    if(JwtDecoder.isExpired(_sharedPreferencesManager.getString(SharedPreferencesManager.keyAccessToken)!)){
+      // print("get new token");
+      String? refreshToken = _sharedPreferencesManager.getString(SharedPreferencesManager.keyRefreshToken)!;
+      RefreshTokenBody? refreshTokenBody = RefreshTokenBody('refresh_token', refreshToken);
+      refreshAuth(refreshTokenBody);
+    } else {
+      print(JwtDecoder.getRemainingTime(_sharedPreferencesManager.getString(SharedPreferencesManager.keyAccessToken)!));
+    }
+    // return _lockAuth.synchronized(() async {
+    //   print("wait refresh token OK");
+    // });
   }
 
   static Future<Token?> refreshAuth(RefreshTokenBody refreshTokenBody) async {
     // print("refresh token");
-    return _lockAuth.synchronized(() async {
+    // return _lockAuth.synchronized(() async { //lock bikin stuck
       // print("refresh token start");
       var nw = DateTime.now().millisecondsSinceEpoch;
       if (_authLastMs == 0 || nw - _authLastMs >= 5000) {
@@ -105,7 +114,7 @@ class U {
       }
       // print("refresh token finish");
       return _lastReqToken;
-    });
+    // });
 
     // if (token != null) {
     //   _authLastMs = DateTime.now().millisecondsSinceEpoch;
@@ -307,9 +316,9 @@ class U {
       if (val != null) {
         _serverVersion = val['data'];
       }
-      print("U checkServerVersion error: ${error.toString()}");
+      // print("U checkServerVersion error: ${error.toString()}");
     }
-    print('checking current server version: $_serverVersion');
+    // print('checking current server version: $_serverVersion');
   }
 
   static newServerVersion(int version){
@@ -501,7 +510,7 @@ class U {
           var res = await ApiAuthProvider().postData('/api/receptionists/send/request', null, data, context);
           if (res != null) {
             uniqueId.add(res['uniqueId']);
-            print('success send pending request others');
+            // print('success send pending request others');
           }
         }
         else{
@@ -510,7 +519,7 @@ class U {
           var res = await ApiAuthProvider().postData('/api/requestHistories/search/request/' + element['type'] + '/' + element['id'].toString() + '/' + element['noteFormat'] + '/submit', null, data, context);
           if (res != null) {
             uniqueId.add(res['uniqueId']);
-            print('success send pending request');
+            // print('success send pending request');
           }
         }
       }

+ 5 - 4
lib/src/utils/dio_logging_interceptors.dart

@@ -17,7 +17,8 @@ class DioLoggingInterceptors extends InterceptorsWrapper {
   @override
   void onRequest(RequestOptions options, RequestInterceptorHandler handler) async {
     if (options.headers.containsKey('requirestoken')) {
-      await U.waitForRefreshAuth();
+      // await U.waitForRefreshAuth(); //bikin stuck
+      // return;
       options.headers.remove('requirestoken');
       String? accessToken = _sharedPreferencesManager.getString(SharedPreferencesManager.keyAccessToken);
       options.headers.addAll({'Authorization': 'Bearer $accessToken'});
@@ -37,10 +38,10 @@ class DioLoggingInterceptors extends InterceptorsWrapper {
     // print(dioError.response?.realUri.toString());
     try {
       if (dioError.response?.statusCode == 401) {
-        print("auth error");
+        // print("auth error");
         bool? checkRefreshCount = _sharedPreferencesManager.isKeyExists(SharedPreferencesManager.keyCountRefreshToken);
         int? refreshCount = _sharedPreferencesManager.getInt(SharedPreferencesManager.keyCountRefreshToken);
-        if(checkRefreshCount! && refreshCount! > 4){
+        if(checkRefreshCount! && refreshCount! > 2){
           // handlingError(NavigationService.navigatorKey.currentContext, 3);
           eventBus.fire("logout");
           return;
@@ -50,7 +51,7 @@ class DioLoggingInterceptors extends InterceptorsWrapper {
         //   handlingError(NavigationService.navigatorKey.currentContext, 3);
         // }
         if (dioError.response!.data.toString().contains("Access token expired")) {
-          print("token expired");
+          // print("token expired");
 
           String? refreshToken = _sharedPreferencesManager.getString(SharedPreferencesManager.keyRefreshToken)!;
           RefreshTokenBody? refreshTokenBody = RefreshTokenBody('refresh_token', refreshToken);

+ 37 - 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:
@@ -485,10 +485,10 @@ packages:
     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:
@@ -945,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:
@@ -1009,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:
@@ -1025,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:
@@ -1169,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:
@@ -1510,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:
@@ -1566,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:
@@ -1590,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:
@@ -1606,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:
@@ -1798,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:
@@ -1923,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"