Browse Source

bersih2 version compatibility

Yulian 2 months ago
parent
commit
57ed4e4ab3

+ 1 - 5
lib/src/layouts/auth/login.dart

@@ -65,11 +65,7 @@ class _LoginPageState extends State<LoginPage> {
       companyName = lics['companyName']??'';
       serialNumber = lics['serialNumber']??'';
       companyLogo = lics['logo']??'';
-      if(await U.isCompatibleWith(VersionKey.multiBahasa)){
-        lang = lics['_validLang'] ?? [];
-      } else if(1698720817 <= lics['serverVersion']){
-        lang = lics['languages'] != null ? lics['languages'].split(',') : [];
-      }
+      lang = lics['_validLang'] ?? [];
       if(mounted) setState(() {});
     }
   }

+ 1 - 5
lib/src/layouts/functions/account.dart

@@ -41,11 +41,7 @@ class AccountFunction{
     }
     try{
       Map<String, dynamic> p;
-      if(await U.isCompatibleWith(VersionKey.multiBahasa)){
-        p = {'userId': user['userId'], 'language': 'ID', '_language': code.toUpperCase()};
-      } else {
-        p = {'userId': user['userId'], 'language': code.toUpperCase()};
-      }
+      p = {'userId': user['userId'], 'language': 'ID', '_language': code.toUpperCase()};
       var res = await apiAuthProvider.patchData('/api/informants/${user['id']}', p);
       if (res != null) {
         UIService.closeLoading();

+ 1 - 2
lib/src/layouts/functions/home.dart

@@ -297,7 +297,7 @@ class HomeFunction{
         }
 
         serviceModule.setMessage([]);
-        if (tempData.length > 0) {
+        if (tempData.isNotEmpty) {
           serviceModule.setMessage(tempData);
         }
       }
@@ -305,7 +305,6 @@ class HomeFunction{
       print(e.toString());
     }
 
-    if(await U.isCompatibleWith(VersionKey.multiBahasa) == false) return;
     try{
       String url = '/api/messages/search/myForum';
       var res = await apiAuthProvider.getData(url, null);

+ 1 - 1
lib/src/layouts/functions/message.dart

@@ -26,7 +26,7 @@ class MessageFunction{
   }
 
   getDataMessages(BuildContext context) async {
-    if(await U.isCompatibleWith(VersionKey.multiBahasa)) getDataForum(context);
+    getDataForum(context);
     String url = '/api/messages/search/myMessages';
     var val = await CacheMan.readData(url);
     if (val != null) {

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

@@ -58,11 +58,7 @@ class _MobAccountPageState extends State<MobAccountPage> {
 
   setToggle() async{
     var license = await U.getLicense();
-    if(await U.isCompatibleWith(VersionKey.multiBahasa)){
-      lang = license['_validLang'] ?? [];
-    } else {
-      lang = license['languages'] != null ? license['languages'].split(',') : [];
-    }
+    lang = license['_validLang'] ?? [];
     setState(() {
       dnd = Provider.of<UserModule>(context, listen: false).dndStatus();
       serDis = U.servantDisplay();

+ 5 - 25
lib/src/layouts/mobile/menu_home.dart

@@ -65,10 +65,7 @@ class _MobHomePageState extends State<MobHomePage> with WidgetsBindingObserver {
   }
 
   checkCompatibility() async{
-    var isCompatible = await U.isCompatibleWith(VersionKey.multiBahasa);
-    if(isCompatible) {
-      homeFunc.getContactCenter(context);
-    }
+    homeFunc.getContactCenter(context);
   }
 
   @override
@@ -117,27 +114,10 @@ class _MobHomePageState extends State<MobHomePage> with WidgetsBindingObserver {
                       Text(name, style: TextStyle(color: Colors.white, fontSize: 18), overflow: TextOverflow.ellipsis),
                       Row(
                         children: [
-                          //TODO: tambah pengecekan server version disini
-                          FutureBuilder<bool>(
-                            future: U.isCompatibleWith(VersionKey.multiBahasa),
-                            builder: (context, snapshot) {
-                              if (!snapshot.hasData) {
-                                return SizedBox();
-                              }
-
-                              final isCompatible = snapshot.data!;
-                              final hasContactCenter = serviceModule.contactCenter().toString().isNotEmpty;
-
-                              if (isCompatible && hasContactCenter) {
-                                return GestureDetector(
-                                    onTap: () => launchUrl(Uri.parse(serviceModule.contactCenter().toString())),
-                                    child: U.iconsax('phone-number', color: Colors.white, size: 26.0)
-                                );
-                              } else {
-                                return SizedBox(); // or nothing
-                              }
-                            },
-                          ),
+                          serviceModule.contactCenter().toString().isNotEmpty ? GestureDetector(
+                              onTap: () => launchUrl(Uri.parse(serviceModule.contactCenter().toString())),
+                              child: U.iconsax('phone-number', color: Colors.white, size: 26.0)
+                          ) : SizedBox.shrink(),
                           SizedBox(width: 8),
                           GestureDetector(
                             child: Stack(

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

@@ -289,14 +289,7 @@ class _MobMessageListPageState extends State<MobMessageListPage> {
     return Scaffold(
       backgroundColor: Colors.white,
       appBar: appBarTemplate(context: context, title: 'message'.tr()),
-      body: FutureBuilder(future: U.isCompatibleWith(VersionKey.multiBahasa), builder: (context, snapshot){
-        if (!snapshot.hasData) {
-          return chat(); // or a loading spinner
-        } else {
-          return bodyForum();
-        }
-      }),
-      // U.isCompatibleWith(VersionKey.multiBahasa) ? bodyForum() : chat(),
+      body: bodyForum(),
       floatingActionButton: Provider.of<MessageModule>(context).user().isNotEmpty &&
           Provider.of<MessageModule>(context).user()['canSendMessage'] &&
           Provider.of<MessageModule>(context).activeTab() == 0 ? FloatingActionButton(

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

@@ -7,6 +7,7 @@ import 'package:telnow_mobile_new/src/layouts/components/template.dart';
 import 'package:telnow_mobile_new/src/utils/U.dart';
 
 import '../../api/api_auth_provider.dart';
+import '../../utils/extensions.dart';
 import '../components/widgets.dart';
 
 // State
@@ -139,7 +140,7 @@ class _PickupAssetState extends State<PickupAsset> {
                   GestureDetector(
                     child: Text('buttonBack'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                     onTap: ()=>navigateBack(context),
-                  )
+                  ).withHover()
                 ],
               ),
             ),
@@ -290,7 +291,7 @@ class ImageRadioTile extends StatelessWidget {
               ],
             ),
           ),
-        ),
+        ).withHover(),
         SizedBox(height: 5,),
         // WidgetComponent.boxSeparator(),
       ],

+ 80 - 76
lib/src/layouts/web/menu_account.dart

@@ -1,6 +1,7 @@
 import 'package:app_settings/app_settings.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:page_transition/page_transition.dart';
 import 'package:provider/provider.dart';
@@ -10,6 +11,7 @@ import 'package:telnow_mobile_new/src/layouts/functions/account.dart';
 import 'package:telnow_mobile_new/src/layouts/components/template.dart';
 import 'package:telnow_mobile_new/src/layouts/web/password.dart';
 import 'package:telnow_mobile_new/src/utils/U.dart';
+import 'package:telnow_mobile_new/src/utils/extensions.dart';
 import 'package:telnow_mobile_new/src/utils/provider.dart';
 import 'package:permission_handler/permission_handler.dart';
 import 'package:telnow_mobile_new/src/utils/ui_service.dart';
@@ -57,11 +59,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
 
   setToggle() async{
     var license = await U.getLicense();
-    if(await U.isCompatibleWith(VersionKey.multiBahasa)){
-      lang = license['_validLang'] ?? [];
-    } else {
-      lang = license['languages'] != null ? license['languages'].split(',') : [];
-    }
+    lang = license['_validLang'] ?? [];
     setState(() {
       serDis = U.servantDisplay();
       autoTranslate = U.autoTranslate();
@@ -103,7 +101,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
                     context.router.removeLast();
                     context.navigateToPath("/app/$pid/menu");
                   },
-                )
+                ).withHover()
               ],
             ),
           ),
@@ -213,7 +211,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
                                         ],
                                       ),
                                     ),
-                                  ),
+                                  ).withHover(),
                                 ],
                               )
                             ],
@@ -254,7 +252,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
                                         }
                                       });
                                     },
-                                  ),
+                                  ).withHover(),
                                 ],
                               )
                             ],
@@ -281,7 +279,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
                                   ),
                                 ),
                                 onTap: () => changeLang(context, Provider.of<UserModule>(context, listen: false).user()),
-                              ),
+                              ).withHover(),
                               divider(),
                               Container(
                                 color: Colors.white,
@@ -319,7 +317,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
                                           }
                                         });
                                       },
-                                    ),
+                                    ).withHover(),
                                   ],
                                 ),
                               ),
@@ -343,7 +341,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
                                   value??false;
                                   if (value) UIService.showSuccess('messagePassChanged'.tr());
                                 }),
-                              ),
+                              ).withHover(),
                               divider(),
                               GestureDetector(
                                 child: Container(
@@ -380,7 +378,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
                                     },
                                   );
                                 },
-                              ),
+                              ).withHover(),
                             ],
                           ),
                           separator(),
@@ -427,22 +425,24 @@ class _WebAccountPageState extends State<WebAccountPage> {
                                 },
                               );
                             },
-                          ),
-                          isDeniedNotifPermission ? Padding(padding: EdgeInsets.symmetric(vertical: 16), child: separator()) : Container(),
-                          isDeniedNotifPermission ? GestureDetector(
-                            child: Column(
-                              crossAxisAlignment: CrossAxisAlignment.start,
-                              children: [
-                                Text("not_allow_permission".tr()),
-                                SizedBox(height: 8,),
-                                Text("tap_here".tr(), style: TextStyle(color: Color(0xFF198AF2)),),
-                              ],
-                            ),
-                            onTap: () => AppSettings.openAppSettings(type: AppSettingsType.notification).then((value) async {
-                              // print("after open setting");
-                              // checkPermission(2);
-                            }),
-                          ) : Container(),
+                          ).withHover(),
+                          if(isDeniedNotifPermission && !kIsWeb) ...[
+                            GestureDetector(
+                              child: Column(
+                                crossAxisAlignment: CrossAxisAlignment.start,
+                                children: [
+                                  Text("not_allow_permission".tr()),
+                                  SizedBox(height: 8,),
+                                  Text("tap_here".tr(), style: TextStyle(color: Color(0xFF198AF2)),),
+                                ],
+                              ),
+                              onTap: () => AppSettings.openAppSettings(type: AppSettingsType.notification).then((value) async {
+                                // print("after open setting");
+                                // checkPermission(2);
+                              }),
+                            ).withHover(),
+                            Padding(padding: EdgeInsets.symmetric(vertical: 16), child: separator()),
+                          ]
                         ],
                       ),
                     ),
@@ -456,7 +456,7 @@ class _WebAccountPageState extends State<WebAccountPage> {
     ) : userModule.resetData() ? RefreshPage(() {
       Provider.of<UserModule>(context, listen: false).setResetData(false);
       accFunc.getUser(context);
-    }) : _timeLimit ? showButton(context) : loadingTemplate(() {if(mounted) setState(()=>_timeLimit=true);},);
+    }) : _timeLimit ? showButton(context) : loadingTemplate( (){ if(mounted) setState(()=>_timeLimit=true); }, );
   }
 
   changeLang(context, user) {
@@ -486,52 +486,56 @@ class _WebAccountPageState extends State<WebAccountPage> {
   }
 
   listOfLang(user, cd){
-    return !mounted ? SizedBox() : SafeArea(
-      child: Column(
-        crossAxisAlignment: CrossAxisAlignment.start,
-        children: [
-          ListTile(
-            title: Text('bahasa'.tr(), style: TextStyle(color: textColor, fontSize: 14)),
-            trailing: Icon(context.locale.toString()=='id'?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
-            onTap: context.locale.toString() != 'id' ? () async {
-              accFunc.switchLang('id', user);
-              Navigator.of(cd).pop();
-            } : null,
-          ),
-          ListTile(
-            title: Text('english'.tr(), style: TextStyle(color: textColor, fontSize: 14)),
-            trailing: Icon(context.locale.toString()=='en'?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
-            onTap: context.locale.toString() != 'en' ? () async {
-              accFunc.switchLang('en', user);
-              Navigator.of(cd).pop();
-            } : null,
-          ),
-          lang.length - 1 > 1 ? ListTile(
-            title: Text(codeOflang[lang[2]], style: TextStyle(color: textColor, fontSize: 14)),
-            trailing: Icon(context.locale.toString()==lang[2]?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
-            onTap: context.locale.toString() != lang[2] ? () async {
-              accFunc.switchLang(1, user);
-              Navigator.of(cd).pop();
-            } : null,
-          ) : Container(),
-          lang.length - 1 > 2 ? ListTile(
-            title: Text(codeOflang[lang[3]], style: TextStyle(color: textColor, fontSize: 14)),
-            trailing: Icon(context.locale.toString()==lang[3]?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
-            onTap: context.locale.toString() != lang[3] ? () async {
-              accFunc.switchLang(2, user);
-              Navigator.of(cd).pop();
-            } : null,
-          ) : Container(),
-          lang.length - 1 > 3 ? ListTile(
-            title: Text(codeOflang[lang[4]], style: TextStyle(color: textColor, fontSize: 14)),
-            trailing: Icon(context.locale.toString()==lang[4]?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
-            onTap: context.locale.toString() != lang[4] ? () async {
-              accFunc.switchLang(3, user);
-              Navigator.of(cd).pop();
-            } : null,
-          ) : Container(),
-        ],
-      ),
-    );
+    if(mounted) {
+      return SafeArea(
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            ListTile(
+              title: Text('bahasa'.tr(), style: TextStyle(color: textColor, fontSize: 14)),
+              trailing: Icon(context.locale.toString()=='id'?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
+              onTap: context.locale.toString() != 'id' ? () async {
+                accFunc.switchLang('id', user);
+                Navigator.of(cd).pop();
+              } : null,
+            ),
+            ListTile(
+              title: Text('english'.tr(), style: TextStyle(color: textColor, fontSize: 14)),
+              trailing: Icon(context.locale.toString()=='en'?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
+              onTap: context.locale.toString() != 'en' ? () async {
+                accFunc.switchLang('en', user);
+                Navigator.of(cd).pop();
+              } : null,
+            ),
+            if(lang.length - 1 > 1) ListTile(
+              title: Text(codeOflang[lang[2]], style: TextStyle(color: textColor, fontSize: 14)),
+              trailing: Icon(context.locale.toString()==lang[2]?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
+              onTap: context.locale.toString() != lang[2] ? () async {
+                accFunc.switchLang(1, user);
+                Navigator.of(cd).pop();
+              } : null,
+            ),
+            if(lang.length - 1 > 2) ListTile(
+              title: Text(codeOflang[lang[3]], style: TextStyle(color: textColor, fontSize: 14)),
+              trailing: Icon(context.locale.toString()==lang[3]?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
+              onTap: context.locale.toString() != lang[3] ? () async {
+                accFunc.switchLang(2, user);
+                Navigator.of(cd).pop();
+              } : null,
+            ),
+            if(lang.length - 1 > 3) ListTile(
+              title: Text(codeOflang[lang[4]], style: TextStyle(color: textColor, fontSize: 14)),
+              trailing: Icon(context.locale.toString()==lang[4]?Icons.radio_button_checked:Icons.radio_button_off, color: primaryColor, size: 18),
+              onTap: context.locale.toString() != lang[4] ? () async {
+                accFunc.switchLang(3, user);
+                Navigator.of(cd).pop();
+              } : null,
+            ),
+          ],
+        ),
+      );
+    } else {
+      return SizedBox.shrink();
+    }
   }
 }

+ 17 - 16
lib/src/layouts/web/menu_history.dart

@@ -14,6 +14,7 @@ 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 '../../utils/extensions.dart';
 import 'history_detail.dart';
 
 class WebHistoryPage extends StatefulWidget {
@@ -111,20 +112,20 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                     ),
                   ),
                   onTap: () => historyFunction.deleteData(context),
-                ) : GestureDetector(
+                ).withHover() : GestureDetector(
                   child: Text('buttonBack'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                   onTap: (){
                     var pid = U.getPidFromUrl(context.router.currentUrl);
                     context.router.removeLast();
                     context.navigateToPath("/app/$pid/menu");
                   },
-                )
+                ).withHover()
               ],
             ),
           ),
           divider(),
           Container(
-            padding: EdgeInsets.symmetric(vertical: 25, horizontal: 100),
+            padding: EdgeInsets.symmetric(horizontal: 100),
             child: Column(
               crossAxisAlignment: CrossAxisAlignment.start,
               children: [
@@ -133,7 +134,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                 SizedBox(height: 20),
                 buildFilter(historyModuleListen),
                 // historyModuleListen.activeTab() == 0 ? doneFilter() : ongoingFilter(),
-                SizedBox(height: 20),
+                // SizedBox(height: 20),
               ],
             ),
           ),
@@ -174,7 +175,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
             historyFunction.onRefresh();
             // }
           },
-        ),
+        ).withHover(),
         GestureDetector(
           child: Container(
             padding: EdgeInsets.symmetric(vertical: 5, horizontal: 16),
@@ -188,7 +189,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
             historyFunction.onRefresh();
             // }
           },
-        ),
+        ).withHover(),
       ],
     );
   }
@@ -222,7 +223,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
               }
               // }
             },
-          );
+          ).withHover();
         }),
       ),
     );
@@ -342,7 +343,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                     historyFunction.onRefresh();
                   }
                 },
-              );
+              ).withHover();
             }),
           ) : Container(),
 
@@ -435,7 +436,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                   val = val??false;
                   if(val) historyModule.cancelMisi(i);
                 }),
-              );
+              ).withHover();
             }),
           ),
           !historyModuleListen.stopLoadHistory() || (historyModuleListen.isLoadHistory() && historyModuleListen.page() > 0)
@@ -515,7 +516,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                                 onTap: () {
                                   rateMissionNew(context, historyModule.dataRequests()[i], i);
                                 },
-                              ) : !historyFunction.isAutoResponse(dataRequest[i]) ? Row(
+                              ).withHover() : !historyFunction.isAutoResponse(dataRequest[i]) ? Row(
                                 children: [
                                   Image(image: AssetImage(rating[dataRequest[i]['satisfactionRate'] - 1]['image'].toString()), width: 25),
                                   SizedBox(width: 5),
@@ -530,7 +531,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                                 child: Text('reqAgain'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                               ),
                               onTap: () => historyFunction.requestAgainAction(i),
-                            )
+                            ).withHover()
                           ],
                         ),
                       ],
@@ -544,7 +545,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                     }
                   },
                   onLongPress: () => historyFunction.selectedController(context, i),
-                );
+                ).withHover();
               })
           ),
           !historyModuleListen.stopLoadHistory() || (historyModuleListen.isLoadHistory() && historyModuleListen.page() > 0)
@@ -666,7 +667,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                                       description = rating[i]['label'] as String;
                                     });
                                   },
-                                ),
+                                ).withHover(),
                               );
                             }),
                           ),
@@ -737,7 +738,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                             Row(
                               mainAxisAlignment: MainAxisAlignment.spaceBetween,
                               children: [
-                                Text('${'ticketNumber'.tr()}: '+list['ticketNo'], style: TextStyle(color: Colors.white, fontSize: 12, fontWeight: FontWeight.w300)),
+                                Text('${'ticketNumber'.tr()}: ${list['ticketNo']}', style: TextStyle(color: Colors.white, fontSize: 12, fontWeight: FontWeight.w300)),
                                 Text(convertDate(list['datetimeRequest'], context.locale.toString()), style: TextStyle(color: Colors.white, fontSize: 12, fontWeight: FontWeight.w300)),
                               ],
                             ),
@@ -767,7 +768,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                                         description = rating[i]['label'] as String;
                                       });
                                     },
-                                  ),
+                                  ).withHover(),
                                 );
                               }),
                             ),
@@ -799,7 +800,7 @@ class _WebHistoryPageState extends State<WebHistoryPage> with TickerProviderStat
                                           ratingAspect = ratingAspect == aspectList[i]?'':aspectList[i];
                                         });
                                       },
-                                    );
+                                    ).withHover();
                                   }),
                                 ),
                                 aspectList.isNotEmpty ? SizedBox(height: 10) : Container(),

+ 115 - 136
lib/src/layouts/web/menu_home.dart

@@ -19,6 +19,7 @@ import 'package:telnow_mobile_new/src/layouts/web/request_select.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/extensions.dart';
 import 'package:telnow_mobile_new/src/utils/provider.dart';
 import 'package:url_launcher/url_launcher.dart';
 
@@ -58,10 +59,7 @@ class _WebHomePageState extends State<WebHomePage> {
   bool _timeLimit = false;
 
   checkCompatibility() async{
-    var isCompatible = await U.isCompatibleWith(VersionKey.multiBahasa);
-    if(isCompatible) {
-      homeFunc.getContactCenter(context);
-    }
+    homeFunc.getContactCenter(context);
   }
 
   @override
@@ -102,40 +100,17 @@ class _WebHomePageState extends State<WebHomePage> {
                                 val = val??true;
                                 if(val) homeFunc.getFrequentlyRequested();
                               }),
-                            ),
+                            ).withHover(),
                           ),
                           SizedBox(width: 30),
-                          FutureBuilder(future: U.isCompatibleWith(VersionKey.multiBahasa), builder: (context, snapshot){
-                            if(!snapshot.hasData){
-                              return SizedBox();
-                            }
-                            final isCompatible = snapshot.data!;
-                            final hasContactCenter = Provider.of<ServiceModule>(context, listen: false)
-                                .contactCenter()
-                                .toString()
-                                .isNotEmpty;
-
-                            if (isCompatible && hasContactCenter) {
-                              return Container(
-                                padding: EdgeInsets.all(8),
-                                decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))),
-                                child: GestureDetector(
-                                    onTap: () => launchUrl(Uri.parse(Provider.of<ServiceModule>(context, listen: false).contactCenter().toString())),
-                                    child: U.iconsax('phone-number', color: primaryColor, size: 26.0)
-                                ),
-                              ); // replace with the widget you want to show
-                            } else {
-                              return SizedBox(); // or nothing
-                            }
-                          }),
-                          // U.isCompatibleWith(VersionKey.multiBahasa) && Provider.of<ServiceModule>(context, listen: false).contactCenter().toString() != ''  ? Container(
-                          //   padding: EdgeInsets.all(8),
-                          //   decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))),
-                          //   child: GestureDetector(
-                          //       onTap: () => launchUrl(Uri.parse(Provider.of<ServiceModule>(context, listen: false).contactCenter().toString())),
-                          //       child: U.iconsax('phone-number', color: primaryColor, size: 26.0)
-                          //   ),
-                          // ):SizedBox(),
+                          Provider.of<ServiceModule>(context, listen: false).contactCenter().toString().isNotEmpty ? Container(
+                            padding: EdgeInsets.all(8),
+                            decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))),
+                            child: GestureDetector(
+                                onTap: () => launchUrl(Uri.parse(Provider.of<ServiceModule>(context, listen: false).contactCenter().toString())),
+                                child: U.iconsax('phone-number', color: primaryColor, size: 26.0)
+                            ).withHover(),
+                          ) : SizedBox(),
                           SizedBox(width: 10),
                           GestureDetector(
                             child: Container(
@@ -155,7 +130,7 @@ class _WebHomePageState extends State<WebHomePage> {
                             onTap: ()=>navigateTo(context, WebMessageListPage(Provider.of<UserModule>(context, listen: false).user())).then((_){
                               homeFunc.getUnreadMessages(context);
                             }),
-                          ),
+                          ).withHover(),
                           SizedBox(width: 10),
                           GestureDetector(
                             child: Container(
@@ -168,7 +143,7 @@ class _WebHomePageState extends State<WebHomePage> {
                               context.router.removeLast();
                               context.navigateToPath("/app/$pid/menu/history");
                             },
-                          ),
+                          ).withHover(),
                           SizedBox(width: 10),
                           GestureDetector(
                             child: Container(
@@ -181,7 +156,7 @@ class _WebHomePageState extends State<WebHomePage> {
                               context.router.removeLast();
                               context.navigateToPath("/app/$pid/menu/account");
                             },
-                          )
+                          ).withHover()
                         ],
                       ),
                       Provider.of<UserModule>(context).profile()['greeting'][context.locale.toString()] != null ? Padding(
@@ -197,84 +172,85 @@ class _WebHomePageState extends State<WebHomePage> {
                   children: [
                     Text('${Provider.of<UserModule>(context).user()['name']}${(Provider.of<UserModule>(context).user()['guestName']!=null&&Provider.of<UserModule>(context).user()['guestName']!=''?' - ${Provider.of<UserModule>(context).user()['guestName']}':'')}', style: TextStyle(color: Colors.white, fontSize: 18), overflow: TextOverflow.ellipsis),
                     SizedBox(height: 10),
-                    Container(
-                      child: Row(
-                        children: [
-                          GestureDetector(child: Icon(Icons.info_outline, color: Colors.white, size: 20), onTap: () => showSuccess(context, "scopeDesc".tr()),),
-                          SizedBox(width: 8),
-                          Text('scope'.tr(), style: TextStyle(color: Colors.white, fontSize: 14)),
-                          SizedBox(width: 16),
-                          GestureDetector(
-                            child: Container(
-                              padding: EdgeInsets.fromLTRB(16, 4, 16, 4),
-                              decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))),
-                              child: Row(
-                                children: [
-                                  Text(Provider.of<ServiceModule>(context).scoopeName(), style: TextStyle(color: primaryColor, fontSize: 14)),
-                                  SizedBox(width: 8),
-                                  U.iconsax('arrow-down-1', color: primaryColor, size: 14),
-                                ],
-                              ),
+                    Row(
+                      children: [
+                        GestureDetector(
+                          child: Icon(Icons.info_outline, color: Colors.white, size: 20),
+                          onTap: () => showSuccess(context, "scopeDesc".tr()),
+                        ).withHover(),
+                        SizedBox(width: 8),
+                        Text('scope'.tr(), style: TextStyle(color: Colors.white, fontSize: 14)),
+                        SizedBox(width: 16),
+                        GestureDetector(
+                          child: Container(
+                            padding: EdgeInsets.fromLTRB(16, 4, 16, 4),
+                            decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))),
+                            child: Row(
+                              children: [
+                                Text(Provider.of<ServiceModule>(context).scoopeName(), style: TextStyle(color: primaryColor, fontSize: 14)),
+                                SizedBox(width: 8),
+                                U.iconsax('arrow-down-1', color: primaryColor, size: 14),
+                              ],
                             ),
-                            onTap: (){
-                              if(Provider.of<ServiceModule>(context, listen: false).scoope().isNotEmpty){
-                                showDialog(
-                                  context: context,
-                                  builder: (contexts) {
-                                    return AlertDialog(
-                                      contentPadding: EdgeInsets.symmetric(vertical: 0, horizontal: 10),
-                                      content: Column(
-                                        mainAxisSize: MainAxisSize.min,
-                                        children: [
-                                          Container(
-                                            margin: EdgeInsets.symmetric(vertical: 16),
-                                            child: Text('changeScope'.tr(), style: TextStyle(color: textColor, fontSize: 14), textAlign: TextAlign.center),
-                                          ),
-                                          divider(),
-                                          SizedBox(height: 16),
-                                          Column(
-                                            children: List.generate(Provider.of<ServiceModule>(context).getScoopeLength(), (i){
-                                              return GestureDetector(
-                                                  child: Container(
-                                                    color: Colors.white,
-                                                    padding: EdgeInsets.symmetric(vertical: 16, horizontal: 16),
-                                                    child: Row(
-                                                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
-                                                      children: [
-                                                        Text(Provider.of<ServiceModule>(context).scoope()[i]['value'], style: TextStyle(color: textColor, fontSize: 14)),
-                                                        Icon(Provider.of<ServiceModule>(context).checkScoope(Provider.of<ServiceModule>(context).scoope()[i]['key'])?Icons.radio_button_checked:Icons.radio_button_off, color: Provider.of<ServiceModule>(context).checkScoope(Provider.of<ServiceModule>(context).scoope()[i]['key'])?primaryColor:Colors.black45, size: 22),
-                                                      ],
-                                                    ),
+                          ),
+                          onTap: (){
+                            if(Provider.of<ServiceModule>(context, listen: false).scoope().isNotEmpty){
+                              showDialog(
+                                context: context,
+                                builder: (contexts) {
+                                  return AlertDialog(
+                                    contentPadding: EdgeInsets.symmetric(vertical: 0, horizontal: 10),
+                                    content: Column(
+                                      mainAxisSize: MainAxisSize.min,
+                                      children: [
+                                        Container(
+                                          margin: EdgeInsets.symmetric(vertical: 16),
+                                          child: Text('changeScope'.tr(), style: TextStyle(color: textColor, fontSize: 14), textAlign: TextAlign.center),
+                                        ),
+                                        divider(),
+                                        SizedBox(height: 16),
+                                        Column(
+                                          children: List.generate(Provider.of<ServiceModule>(context).getScoopeLength(), (i){
+                                            return GestureDetector(
+                                                child: Container(
+                                                  color: Colors.white,
+                                                  padding: EdgeInsets.symmetric(vertical: 16, horizontal: 16),
+                                                  child: Row(
+                                                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                                                    children: [
+                                                      Text(Provider.of<ServiceModule>(context).scoope()[i]['value'], style: TextStyle(color: textColor, fontSize: 14)),
+                                                      Icon(Provider.of<ServiceModule>(context).checkScoope(Provider.of<ServiceModule>(context).scoope()[i]['key'])?Icons.radio_button_checked:Icons.radio_button_off, color: Provider.of<ServiceModule>(context).checkScoope(Provider.of<ServiceModule>(context).scoope()[i]['key'])?primaryColor:Colors.black45, size: 22),
+                                                    ],
                                                   ),
-                                                  onTap: () async{
-                                                    await sharedPreferencesManager.putString(SharedPreferencesManager.keyScoope, Provider.of<ServiceModule>(context, listen: false).scoope()[i]['key']);
-                                                    Provider.of<ServiceModule>(context, listen: false).setScoopeValue(Provider.of<ServiceModule>(context, listen: false).scoope()[i]['key']);
-                                                    Provider.of<ServiceModule>(context, listen: false).setScoopeName(Provider.of<ServiceModule>(context, listen: false).scoope()[i]['value']);
-                                                    Navigator.of(contexts).pop();
+                                                ),
+                                                onTap: () async{
+                                                  await sharedPreferencesManager.putString(SharedPreferencesManager.keyScoope, Provider.of<ServiceModule>(context, listen: false).scoope()[i]['key']);
+                                                  Provider.of<ServiceModule>(context, listen: false).setScoopeValue(Provider.of<ServiceModule>(context, listen: false).scoope()[i]['key']);
+                                                  Provider.of<ServiceModule>(context, listen: false).setScoopeName(Provider.of<ServiceModule>(context, listen: false).scoope()[i]['value']);
+                                                  Navigator.of(contexts).pop();
 
-                                                    var profile = Provider.of<UserModule>(context, listen: false).profile();
-                                                    if(profile['topMenu']['show'] != null && profile['topMenu']['show'] == true) {
-                                                      homeFunc.getTopMenuNew();
-                                                    }
-                                                    if(profile['specialOffer'] != null && profile['specialOffer']['show'] == true) homeFunc.getSpecialOffer(context);
-                                                    if(profile['frequentlyRequested'] != null && profile['frequentlyRequested']['show'] == true) homeFunc.getFrequentlyRequested();
-                                                    if(profile['banner'] != null && profile['banner']['show'] == true) homeFunc.getBanner(context);
-                                                    if(profile['quickAction'] != null && profile['quickAction']['show'] == true) homeFunc.getQuickAction(context);
+                                                  var profile = Provider.of<UserModule>(context, listen: false).profile();
+                                                  if(profile['topMenu']['show'] != null && profile['topMenu']['show'] == true) {
+                                                    homeFunc.getTopMenuNew();
                                                   }
-                                              );
-                                            }),
-                                          ),
-                                          SizedBox(height: 16),
-                                        ],
-                                      ),
-                                    );
-                                  },
-                                );
-                              }
-                            },
-                          )
-                        ],
-                      ),
+                                                  if(profile['specialOffer'] != null && profile['specialOffer']['show'] == true) homeFunc.getSpecialOffer(context);
+                                                  if(profile['frequentlyRequested'] != null && profile['frequentlyRequested']['show'] == true) homeFunc.getFrequentlyRequested();
+                                                  if(profile['banner'] != null && profile['banner']['show'] == true) homeFunc.getBanner(context);
+                                                  if(profile['quickAction'] != null && profile['quickAction']['show'] == true) homeFunc.getQuickAction(context);
+                                                }
+                                            ).withHover();
+                                          }),
+                                        ),
+                                        SizedBox(height: 16),
+                                      ],
+                                    ),
+                                  );
+                                },
+                              );
+                            }
+                          },
+                        ).withHover()
+                      ],
                     ),
                   ],
                 )
@@ -369,7 +345,7 @@ class _WebHomePageState extends State<WebHomePage> {
                                 val = val??true;
                                 if(val) homeFunc.getFrequentlyRequested();
                               }),
-                            ),
+                            ).withHover(),
                           ),
                         ) : Container(),
                       ):Container(),
@@ -434,7 +410,7 @@ class _WebHomePageState extends State<WebHomePage> {
                                                   });
                                                 }
                                               },
-                                            ),
+                                            ).withHover(),
                                           ),
                                         );
                                       }),
@@ -442,8 +418,10 @@ class _WebHomePageState extends State<WebHomePage> {
                                     Provider.of<UserModule>(context).user()['checkedIn'] && Provider.of<UserModule>(context).houseKeeping() && Provider.of<UserModule>(context).dndStatus() ? GestureDetector(
                                       child: Container(
                                         width: size*2, padding: EdgeInsets.symmetric(horizontal: 25),
+                                        decoration: BoxDecoration(border: Border(left: BorderSide(color: Colors.grey))),
                                         child: Container(
                                           padding: EdgeInsets.all(10),
+                                          decoration: BoxDecoration(color: Color(0xffD81010).withValues(alpha: 0.15), borderRadius: BorderRadius.all(Radius.circular(10)), border: Border.all(color: Color(0xffD81010))),
                                           child: Column(
                                             children: [
                                               Icon(Icons.remove_circle, color: Color(0xffD81010), size: 18),
@@ -451,9 +429,7 @@ class _WebHomePageState extends State<WebHomePage> {
                                               Text('info_dnd'.tr(), style: TextStyle(color: textColor, fontSize: 14))
                                             ],
                                           ),
-                                          decoration: BoxDecoration(color: Color(0xffD81010).withValues(alpha: 0.15), borderRadius: BorderRadius.all(Radius.circular(10)), border: Border.all(color: Color(0xffD81010))),
                                         ),
-                                        decoration: BoxDecoration(border: Border(left: BorderSide(color: Colors.grey))),
                                       ),
                                       onTap: (){
                                         showDialog(
@@ -463,7 +439,7 @@ class _WebHomePageState extends State<WebHomePage> {
                                           ),
                                         );
                                       }
-                                    ) : Container()
+                                    ).withHover() : Container()
                                   ],
                                 );
                               },
@@ -477,14 +453,14 @@ class _WebHomePageState extends State<WebHomePage> {
                                     child: Container(
                                       padding: EdgeInsets.symmetric(horizontal: 16, vertical: 4),
                                       margin: EdgeInsets.only(right: 30),
-                                      child: Text('customize'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                                       decoration: BoxDecoration(
                                           color: primaryColor.withValues(alpha: 0.1),
                                           borderRadius: BorderRadius.all(Radius.circular(50))
                                       ),
+                                      child: Text('customize'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                                     ),
                                     onTap: ()=>navigateTo(context, WebMenuEditorPage(scope: Provider.of<ServiceModule>(context, listen: false).scoopeValue())),
-                                  ),
+                                  ).withHover(),
                                 ),
                                 SizedBox(height: 20),
                                 LayoutBuilder(
@@ -525,7 +501,7 @@ class _WebHomePageState extends State<WebHomePage> {
                                                   if(val) homeFunc.getFrequentlyRequested();
                                                 });
                                               },
-                                            ),
+                                            ).withHover(),
                                           ),
                                         );
                                       }),
@@ -560,6 +536,7 @@ class _WebHomePageState extends State<WebHomePage> {
                                       constraints: BoxConstraints(minWidth: minWidth, minHeight: minHeight),
                                       child: Container(
                                         width: size, height: size*1.4,
+                                        decoration: BoxDecoration(color: Colors.white, border: Border.all(color: textColor.withValues(alpha: 0.15)), borderRadius: BorderRadius.all(Radius.circular(12))),
                                         child: Column(
                                           crossAxisAlignment: CrossAxisAlignment.start,
                                           children: [
@@ -578,11 +555,10 @@ class _WebHomePageState extends State<WebHomePage> {
                                             )
                                           ],
                                         ),
-                                        decoration: BoxDecoration(color: Colors.white, border: Border.all(color: textColor.withValues(alpha: 0.15)), borderRadius: BorderRadius.all(Radius.circular(12))),
                                       ),
                                     ),
                                     onTap: ()=>navigateTo(context, WebReqCreatePage(user: Provider.of<UserModule>(context, listen: false).user(), request: Provider.of<ServiceModule>(context, listen: false).specialOffer()[i])),
-                                  )),
+                                  ).withHover()),
                                 );
                               },
                             ) : emptyWidget()
@@ -612,6 +588,7 @@ class _WebHomePageState extends State<WebHomePage> {
                                         constraints: BoxConstraints(minWidth: minWidth, minHeight: minHeight),
                                         child: Container(
                                           width: size, height: size*1.2,
+                                          decoration: BoxDecoration(color: Colors.white, border: Border.all(color: textColor.withValues(alpha: 0.15)), borderRadius: BorderRadius.all(Radius.circular(12))),
                                           child: Column(
                                             crossAxisAlignment: CrossAxisAlignment.start,
                                             children: [
@@ -629,14 +606,13 @@ class _WebHomePageState extends State<WebHomePage> {
                                               )
                                             ],
                                           ),
-                                          decoration: BoxDecoration(color: Colors.white, border: Border.all(color: textColor.withValues(alpha: 0.15)), borderRadius: BorderRadius.all(Radius.circular(12))),
                                         ),
                                       ),
                                       onTap: ()=>navigateTo(context, WebReqCreatePage(user: Provider.of<UserModule>(context, listen: false).user(), request: Provider.of<ServiceModule>(context, listen: false).data()[i])).then((val){
                                         val = val??true;
                                         if(val) homeFunc.getFrequentlyRequested();
                                       }),
-                                    );
+                                    ).withHover();
                                   }),
                                 );
                               },
@@ -662,7 +638,12 @@ class _WebHomePageState extends State<WebHomePage> {
                                   children: List.generate(Provider.of<ServiceModule>(context).quickAct().length, (i) {
                                     return GestureDetector(
                                       child: Container(
-                                        width: size, child: Row(
+                                        width: size,
+                                        decoration: BoxDecoration(
+                                          color: Colors.white,
+                                          border: Border.all(color: textColor.withValues(alpha: 0.15)),
+                                          borderRadius: BorderRadius.all(Radius.circular(12))
+                                        ), child: Row(
                                           children: [
                                             imageTiles(imageUrl: Provider.of<ServiceModule>(context).quickAct()[i]['_mobileImage'] ?? "null", width: 110, height: 90),
                                             SizedBox(width: 20),
@@ -679,14 +660,9 @@ class _WebHomePageState extends State<WebHomePage> {
                                             Padding(padding: EdgeInsets.symmetric(horizontal: 20), child: U.iconsax('arrow-right-3', size: 16, color: textColor.withValues(alpha: 0.75)))
                                           ],
                                         ),
-                                        decoration: BoxDecoration(
-                                          color: Colors.white,
-                                          border: Border.all(color: textColor.withValues(alpha: 0.15)),
-                                          borderRadius: BorderRadius.all(Radius.circular(12))
-                                        ),
                                       ),
                                       onTap: ()=>navigateTo(context, WebReqCreatePage(user: Provider.of<UserModule>(context, listen: false).user(), request: Provider.of<ServiceModule>(context, listen: false).quickAct()[i])),
-                                    );
+                                    ).withHover();
                                   }),
                                 );
                               },
@@ -754,7 +730,7 @@ class _WebMenuEditorPageState extends State<WebMenuEditorPage> {
                 GestureDetector(
                   child: Text('buttonBack'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                   onTap: ()=>navigateBack(context),
-                )
+                ).withHover()
               ],
             ),
           ),
@@ -812,7 +788,7 @@ class _WebMenuEditorPageState extends State<WebMenuEditorPage> {
                                                       data.remove(data[i]);
                                                     });
                                                   },
-                                                ),
+                                                ).withHover(),
                                                 SizedBox(width: 40)
                                               ],
                                             ),
@@ -874,7 +850,7 @@ class _WebMenuEditorPageState extends State<WebMenuEditorPage> {
                                             showError(context, 'maxMenu'.tr());
                                           }
                                         },
-                                      ),
+                                      ).withHover(),
                                     ],
                                   ),
                                 );
@@ -926,13 +902,16 @@ class _WebMenuEditorPageState extends State<WebMenuEditorPage> {
   imageContainer(iconUrl){
     return Container(
       padding: EdgeInsets.all(5),
-      child: Image(image: CachedNetworkImageProvider(iconUrl+'?bridge-cache=true', cacheManager: CacheManager(CacheMan.config(iconUrl+'?bridge-cache=true'))), width: 50, height: 50),
       decoration: BoxDecoration(
           color: Colors.white,
           borderRadius: BorderRadius.all(Radius.circular(12)),
           border: Border.all(width: 0.2, color: Colors.black12),
           boxShadow: [BoxShadow(color: Colors.grey.withValues(alpha: 0.3), blurRadius: 2, offset: Offset(0, 2))]
       ),
+      child: Image(
+          image: CachedNetworkImageProvider(iconUrl+'?bridge-cache=true', cacheManager: CacheManager(CacheMan.config(iconUrl+'?bridge-cache=true'))),
+          width: 50, height: 50
+      ),
     );
   }
 }

+ 1 - 16
lib/src/layouts/web/message_list.dart

@@ -1308,22 +1308,7 @@ class _WebMessageListPageState extends State<WebMessageListPage> {
             ),
           ),
           divider(),
-          FutureBuilder(future: U.isCompatibleWith(VersionKey.multiBahasa), builder: (context, snapshot){
-            if (snapshot.connectionState != ConnectionState.done) {
-              return CircularProgressIndicator(); // atau loading spinner
-            }
-
-            if (snapshot.hasError) {
-              print("Error in isCompatibleWith: ${snapshot.error}");
-              return SizedBox(); // atau widget fallback
-            }
-
-            if (snapshot.data == true) {
-              return tabForum();
-            } else {
-              return SizedBox();
-            }
-          }),
+          tabForum(),
           Expanded(
             child: Container(
               width: double.infinity, height: double.infinity,

+ 3 - 2
lib/src/layouts/web/password.dart

@@ -9,6 +9,7 @@ import 'package:telnow_mobile_new/src/model/login/login_body.dart';
 import 'package:telnow_mobile_new/src/model/token/token.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/extensions.dart';
 
 class WebPasswordPage extends StatefulWidget {
   final Map<String, dynamic> user;
@@ -43,7 +44,7 @@ class _WebPasswordPageState extends State<WebPasswordPage> {
                 GestureDetector(
                   child: Text('buttonBack'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                   onTap: ()=>navigateBack(context),
-                )
+                ).withHover(),
               ],
             ),
           ),
@@ -157,7 +158,7 @@ class _WebPasswordPageState extends State<WebPasswordPage> {
               border: InputBorder.none,
               prefixIcon: U.iconsax('bold/key', size: 24, color: iconColor),
               suffixIconConstraints: BoxConstraints(maxHeight: 40, maxWidth: 40, minHeight: 40, minWidth: 40),
-              suffixIcon: GestureDetector(child: U.iconsax(hidePass?'eye':'eye-slash', size: 24, color: textColor.withValues(alpha: 0.5)), onTap: ()=>fieldState(()=>hidePass=!hidePass)),
+              suffixIcon: GestureDetector(child: U.iconsax(hidePass?'eye':'eye-slash', size: 24, color: textColor.withValues(alpha: 0.5)), onTap: ()=>fieldState(()=>hidePass=!hidePass)).withHover(),
               enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: textColor.withValues(alpha: 0.5))),
               focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(12), borderSide: BorderSide(color: textColor.withValues(alpha: 0.5))),
               isDense: true

+ 34 - 33
lib/src/layouts/web/request_create.dart

@@ -12,6 +12,7 @@ import 'package:telnow_mobile_new/src/layouts/functions/request.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/extensions.dart';
 import 'package:telnow_mobile_new/src/utils/provider.dart';
 import 'package:toggle_switch/toggle_switch.dart';
 
@@ -88,7 +89,7 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                 GestureDetector(
                   child: Text('buttonBack'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                   onTap: ()=>navigateBack(context),
-                )
+                ).withHover(),
               ],
             ),
           ),
@@ -245,29 +246,30 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                                                     child: Container(
                                                       width: imageWidth, height: imageWidth, alignment: Alignment.topRight,
                                                       margin: EdgeInsets.only(right: i == 4 ? 0 : 6),
+                                                      decoration: BoxDecoration(
+                                                          color: Colors.black12, borderRadius: BorderRadius.all(Radius.circular(5)), border: Border.all(color: Colors.black26, width: 0.5),
+                                                          image: DecorationImage(image: MemoryImage(context.read<CreateSerModule>().images()[i]), fit: BoxFit.cover)
+                                                      ),
                                                       child: Transform.translate(
                                                         offset: Offset(3, -3),
                                                         child: GestureDetector(
                                                           child: Container(
                                                             padding: EdgeInsets.all(3),
-                                                            child: Icon(Icons.close_rounded, color: Colors.white, size: 18),
                                                             decoration: BoxDecoration(color: Colors.black54, border: Border.all(color: Colors.white, width: 2), borderRadius: BorderRadius.all(Radius.circular(50))),
+                                                            child: Icon(Icons.close_rounded, color: Colors.white, size: 18),
                                                           ),
                                                           onTap: ()=>context.read<CreateSerModule>().removeImages(i),
-                                                        ),
-                                                      ),
-                                                      decoration: BoxDecoration(
-                                                          color: Colors.black12, borderRadius: BorderRadius.all(Radius.circular(5)), border: Border.all(color: Colors.black26, width: 0.5),
-                                                          image: DecorationImage(image: MemoryImage(context.read<CreateSerModule>().images()[i]), fit: BoxFit.cover)
+                                                        ).withHover(),
                                                       ),
                                                     ),
                                                     onTap: ()=>navigateTo(context, PhotoPreviewGallery(title: 'image'.tr(), imageList: context.read<CreateSerModule>().images(), startIndex: i, isUrl: false))
-                                                );
+                                                ).withHover();
                                               }),
                                             ),
                                             context.watch<CreateSerModule>().images().length < 5 ? GestureDetector(
                                               child: Container(
                                                 width: imageWidth, height: imageWidth, alignment: Alignment.center,
+                                                decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(5)), border: Border.all(color: Colors.black26, width: 2)),
                                                 child:  context.watch<CreateSerModule>().setLoadingEffect() ? SizedBox(
                                                   height: 30,
                                                   child: LoadingIndicator(
@@ -278,10 +280,9 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                                                     pathBackgroundColor: Colors.black,
                                                   ),
                                                 ) : Icon(Icons.add_rounded, color: Colors.black26, size: 40),
-                                                decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(5)), border: Border.all(color: Colors.black26, width: 2)),
                                               ),
                                               onTap: ()=>pickupImageNew(),
-                                            ) : Container(),
+                                            ).withHover() : Container(),
                                           ],
                                         );
                                       },
@@ -299,7 +300,7 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                                       ),
                                     ),
                                     onTap: ()=>pickupImageNew(),
-                                  ),
+                                  ).withHover(),
                                   // Text("MBUH ==> ${U.newServerVersion(1736473802)} X ${U.retServerVersion()}"),
                                   Column(
                                     crossAxisAlignment: CrossAxisAlignment.start,
@@ -449,7 +450,7 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                                       ],
                                     ),
                                   ),
-                                ) : Container(
+                                ).withHover() : Container(
                                   decoration: BoxDecoration(
                                     border: Border.all(color: Color(0xff262626).withValues(alpha: 0.5)),
                                     borderRadius: BorderRadius.circular(12),
@@ -506,7 +507,7 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                                             padding: const EdgeInsets.all(12.0),
                                             child: Icon(Icons.delete_rounded, size: 24, color: Colors.red.withValues(alpha: 0.85),),
                                           ),
-                                        )
+                                        ).withHover()
                                       ],
                                     ),
                                   ),
@@ -543,7 +544,7 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                               onTap: (){
                                 if(!widget.request['scanToRequest']) Provider.of<CreateSerModule>(context, listen: false).setLocationType(1);
                               },
-                            ) : Container(),
+                            ).withHover() : Container(),
 
                             GestureDetector(
                               child: Container(
@@ -609,7 +610,7 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                               onTap: (){
                                 context.read<CreateSerModule>().setLocationType(2);
                               },
-                            ),
+                            ).withHover(),
                           ],
                         ),
                         widget.request['canNotCancel'] ? Padding(
@@ -696,14 +697,6 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                   child: GestureDetector(
                     child: Container(
                       padding: EdgeInsets.symmetric(vertical: 20),
-                      child: Column(
-                        mainAxisSize: MainAxisSize.min,
-                        children: [
-                          U.iconsax('timer-start', color: Colors.white, size: 30),
-                          SizedBox(height: 9),
-                          Text('scheduled'.tr(), style: TextStyle(color: Colors.white, fontSize: 14))
-                        ],
-                      ),
                       decoration: BoxDecoration(
                           borderRadius: BorderRadius.all(Radius.circular(12)),
                           gradient: LinearGradient(
@@ -713,27 +706,27 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                               ]
                           )
                       ),
+                      child: Column(
+                        mainAxisSize: MainAxisSize.min,
+                        children: [
+                          U.iconsax('timer-start', color: Colors.white, size: 30),
+                          SizedBox(height: 9),
+                          Text('scheduled'.tr(), style: TextStyle(color: Colors.white, fontSize: 14))
+                        ],
+                      ),
                     ),
                     onTap: (){
                       navigateBack(contexts);
                       Provider.of<CreateSerModule>(context, listen: false).setSendLater(true);
                       reqFunc.sendRequest(context, widget, controllerNote, controllerLocation, controllerReferenceNumber, controllerDateString, _currentSliderValue, asset['code']);
                     },
-                  ),
+                  ).withHover(),
                 ),
                 SizedBox(width: 16),
                 Expanded(
                   child: GestureDetector(
                     child: Container(
                       padding: EdgeInsets.symmetric(vertical: 20),
-                      child: Column(
-                        mainAxisSize: MainAxisSize.min,
-                        children: [
-                          U.iconsax('star-1', color: Colors.white, size: 30),
-                          SizedBox(height: 9),
-                          Text('sendNow'.tr(), style: TextStyle(color: Colors.white, fontSize: 14))
-                        ],
-                      ),
                       decoration: BoxDecoration(
                           borderRadius: BorderRadius.all(Radius.circular(12)),
                           gradient: LinearGradient(
@@ -743,12 +736,20 @@ class _WebReqCreatePageState extends State<WebReqCreatePage> {
                               ]
                           )
                       ),
+                      child: Column(
+                        mainAxisSize: MainAxisSize.min,
+                        children: [
+                          U.iconsax('star-1', color: Colors.white, size: 30),
+                          SizedBox(height: 9),
+                          Text('sendNow'.tr(), style: TextStyle(color: Colors.white, fontSize: 14))
+                        ],
+                      ),
                     ),
                     onTap: (){
                       navigateBack(contexts);
                       reqFunc.sendRequest(context, widget, controllerNote, controllerReferenceNumber, controllerLocation, controllerDateString, _currentSliderValue, asset['code']);
                     },
-                  ),
+                  ).withHover(),
                 ),
               ],
             ),

+ 3 - 2
lib/src/layouts/web/request_select.dart

@@ -7,6 +7,7 @@ import 'package:telnow_mobile_new/src/layouts/functions/request.dart';
 import 'package:telnow_mobile_new/src/layouts/components/template.dart';
 import 'package:telnow_mobile_new/src/layouts/web/request_create.dart';
 import 'package:telnow_mobile_new/src/utils/U.dart';
+import 'package:telnow_mobile_new/src/utils/extensions.dart';
 import 'package:telnow_mobile_new/src/utils/provider.dart';
 
 class WebReqSelectPage extends StatefulWidget {
@@ -96,7 +97,7 @@ class _WebReqSelectPageState extends State<WebReqSelectPage> {
                 GestureDetector(
                   child: Text('buttonBack'.tr(), style: TextStyle(color: primaryColor, fontSize: 14)),
                   onTap: ()=>navigateBack(context),
-                )
+                ).withHover()
               ],
             ),
           ),
@@ -160,7 +161,7 @@ class _WebReqSelectPageState extends State<WebReqSelectPage> {
                             ),
                           ),
                           onTap: ()=>navigateTo(context, WebReqCreatePage(user: widget.user, request: Provider.of<RequestModule>(context, listen: false).data()[i], fromSearch: true)),
-                        );
+                        ).withHover();
                       }),
                     );
                   },

+ 2 - 2
lib/src/utils/C.dart

@@ -5,8 +5,8 @@ enum VersionKey {
 
 class C{
 
-  static const Map<String, int> version = {
-    'multiBahasa': 1754624839 //penambahan jadi 10 bahasa, identifikasi berdasarkan ordinal 1,2,3
+  static Map<String, int> version = {
+    VersionKey.multiBahasa.name: 1754624839 //penambahan jadi 10 bahasa, identifikasi berdasarkan ordinal 1,2,3
   };
 
   static int get(String key) => version[key]?? 0;

+ 1 - 5
lib/src/utils/U.dart

@@ -356,12 +356,8 @@ class U {
     return validLang;
   }
 
-  static XnewServerVersion(int version){
-    return version <= _serverVersion;
-  }
-
   static final Map<String, Future<bool>> _compatibilityCache = {};
-  static Future<bool> isCompatibleWith(VersionKey key) {
+  static Future<bool> isCompatibleWithX(VersionKey key) {
     final keyName = key.name.toString();
     if (_compatibilityCache.containsKey(keyName)) {
       return _compatibilityCache[keyName]!;

+ 10 - 0
lib/src/utils/extensions.dart

@@ -0,0 +1,10 @@
+import 'package:flutter/material.dart';
+
+extension HoverExtension on GestureDetector {
+  Widget withHover() {
+    return MouseRegion(
+      cursor: SystemMouseCursors.click,
+      child: this,
+    );
+  }
+}