diff --git a/lib/bloc/home_bloc.dart b/lib/bloc/home_bloc.dart index 0b71992..39bd1e2 100644 --- a/lib/bloc/home_bloc.dart +++ b/lib/bloc/home_bloc.dart @@ -1,10 +1,17 @@ import 'dart:async'; -import '../feature/home/device_alias_model.dart'; +import 'package:flutter/material.dart'; +import 'package:sfm_app/product/extension/context_extension.dart'; +import '../product/services/api_services.dart'; +import '../feature/home/device_alias_model.dart'; import '../product/base/bloc/base_bloc.dart'; +import '../product/services/language_services.dart'; +import '../product/utils/device_utils.dart'; class HomeBloc extends BlocBase { + APIServices apiServices = APIServices(); + final allDevicesAliasMap = StreamController>>.broadcast(); StreamSink>> get sinkAllDevicesAliasMap => @@ -12,12 +19,12 @@ class HomeBloc extends BlocBase { Stream>> get streamAllDevicesAliasMap => allDevicesAliasMap.stream; - final allDevicesAliasJoinedMap = - StreamController>>.broadcast(); - StreamSink>> - get sinkAllDevicesAliasJoinedMap => allDevicesAliasJoinedMap.sink; - Stream>> - get streamAllDevicesAliasJoinedMap => allDevicesAliasJoinedMap.stream; + // final allDevicesAliasJoinedMap = + // StreamController>>.broadcast(); + // StreamSink>> + // get sinkAllDevicesAliasJoinedMap => allDevicesAliasJoinedMap.sink; + // Stream>> + // get streamAllDevicesAliasJoinedMap => allDevicesAliasJoinedMap.stream; final countNotification = StreamController.broadcast(); StreamSink get sinkCountNotification => countNotification.sink; @@ -34,12 +41,104 @@ class HomeBloc extends BlocBase { Stream>> get streamOwnerDevicesStatus => ownerDevicesStatus.stream; + + final aliasDevices = StreamController?>.broadcast(); + StreamSink?> get sinkAliasDevices => aliasDevices.sink; + Stream?> get streamAliasDevices => aliasDevices.stream; + + void getOwnerAndJoinedDevices(BuildContext context) async { + + await apiServices.execute(context, () async { + List devices = await apiServices.getDashBoardDevices().handleApiError(); + List publicDevices = []; + for (var device in devices) { + if (device.visibility == "PUBLIC") { + publicDevices.add(device); + } + } + sinkAliasDevices.add(publicDevices); + if (!context.mounted) return; + getOwnerDeviceState(context, publicDevices); + }); + } + void getOwnerDeviceState(BuildContext context,List allDevices) async { + // int notificationCount = 0; + Map> ownerDevicesStatus = {}; + List ownerDevicesState = []; + + if (!context.mounted) return; + sinkOwnerDevicesStatus.add(ownerDevicesStatus); + + int count = 0; + for (var device in allDevices) { + // if (device.isOwner != true) continue; + + if (!context.mounted) return; + Map sensorMap = DeviceUtils.instance + .getDeviceSensors(context, device.status?.sensors ?? []); + + if (device.state == 1 || device.state == 3) { + ownerDevicesStatus["state"] ??= []; + ownerDevicesStatus["state"]!.add(device); + if (!context.mounted) return; + sinkOwnerDevicesStatus.add(ownerDevicesStatus); + count++; + } + + final noDataMessage = appLocalization(context).no_data_message; + if (sensorMap['sensorBattery'] != noDataMessage) { + if (double.parse(sensorMap['sensorBattery']) <= 20) { + ownerDevicesStatus['battery'] ??= []; + ownerDevicesStatus['battery']!.add(device); + if (!context.mounted) return; + sinkOwnerDevicesStatus.add(ownerDevicesStatus); + count++; + } + } + } + if (!context.mounted) return; + sinkCountNotification.add(count); + } + + void getDeviceStatusAliasMap(List devices) { + Map> allDevicesAliasMap = {}; + for (var key in ['all', 'online', 'offline', 'warning', 'not-use']) { + allDevicesAliasMap[key] = []; + } + + for (DeviceWithAlias device in devices) { + allDevicesAliasMap['all']!.add(device); + if (device.state == 0 || device.state == 1) { + allDevicesAliasMap['online']!.add(device); + } + if (device.state == -1) { + allDevicesAliasMap['offline']!.add(device); + } + if (device.state == 1) { + allDevicesAliasMap['warning']!.add(device); + } + if (device.state == -2) { + allDevicesAliasMap['not-use']!.add(device); + } + + } + sinkAllDevicesAliasMap.add(allDevicesAliasMap); + } + + + + + + @override void dispose() { allDevicesAliasMap.close(); - allDevicesAliasJoinedMap.close(); + // allDevicesAliasJoinedMap.close(); countNotification.close(); hasJoinedDevice.close(); ownerDevicesStatus.close(); + aliasDevices.close(); } + + } diff --git a/lib/feature/home/home_screen.dart b/lib/feature/home/home_screen.dart index c486672..1f86756 100644 --- a/lib/feature/home/home_screen.dart +++ b/lib/feature/home/home_screen.dart @@ -1,13 +1,11 @@ import 'dart:async'; import 'dart:developer'; import 'package:flutter/material.dart'; -import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart'; +import '../../product/shared/shared_loading_animation.dart'; import '../../product/shared/shared_component_loading_animation.dart'; -import '../../product/utils/app_logger_utils.dart'; import 'shared/alert_card.dart'; import 'shared/warning_card.dart'; -import '../../product/utils/device_utils.dart'; import 'device_alias_model.dart'; import 'shared/overview_card.dart'; import '../settings/device_notification_settings/device_notification_settings_model.dart'; @@ -18,8 +16,7 @@ import '../../bloc/home_bloc.dart'; import '../../product/base/bloc/base_bloc.dart'; class HomeScreen extends StatefulWidget { - const HomeScreen({super.key, required this.persistentTabController}); - final PersistentTabController persistentTabController; + const HomeScreen({super.key}); @override State createState() => _HomeScreenState(); } @@ -27,24 +24,17 @@ class HomeScreen extends StatefulWidget { class _HomeScreenState extends State { late HomeBloc homeBloc; APIServices apiServices = APIServices(); - Map> allDevicesAliasMap = {}; - List devices = []; bool isFunctionCall = false; Timer? getAllDevicesTimer; - int notificationCount = 0; - Map> ownerDevicesStatus = {}; - List ownerDevicesState = []; + @override void initState() { super.initState(); homeBloc = BlocProvider.of(context); - getAllDevicesTimer?.cancel(); - AppLoggerUtils.debug("Init State HomeScreen"); - getOwnerAndJoinedDevices(); const duration = Duration(seconds: 10); getAllDevicesTimer = - Timer.periodic(duration, (Timer t) => getOwnerAndJoinedDevices()); + Timer.periodic(duration, (Timer t) => homeBloc.getOwnerAndJoinedDevices(context)); } @override @@ -56,255 +46,200 @@ class _HomeScreenState extends State { @override Widget build(BuildContext context) { - return Scaffold( - body: Padding( - padding: context.paddingLow, - child: SingleChildScrollView( - child: Column( - children: [ - Row( - children: [ - Text( - appLocalization(context).notification, - style: context.titleMediumTextStyle, - ), - SizedBox(width: context.lowValue), - StreamBuilder( - stream: homeBloc.streamCountNotification, - builder: (context, countSnapshot) { - return Text( - "(${countSnapshot.data ?? 0})", - style: context.titleMediumTextStyle, - ); - }, - ) - ], - ), - SizedBox( - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: StreamBuilder>>( - stream: homeBloc.streamOwnerDevicesStatus, - builder: (context, snapshot) { - return AnimatedSwitcher( - duration: context.lowDuration, - transitionBuilder: - (Widget child, Animation animation) { - final offsetAnimation = Tween( - begin: const Offset(0.0, 0.2), - end: Offset.zero, - ).animate(CurvedAnimation( - parent: animation, - curve: Curves.easeInOut, - )); - return FadeTransition( - opacity: animation, - child: SlideTransition( - position: offsetAnimation, - child: child, - ), - ); - }, - child: snapshot.data?['state'] != null || - snapshot.data?['battery'] != null - ? ConstrainedBox( - key: const ValueKey('data'), - constraints: BoxConstraints( - minWidth: - MediaQuery.of(context).size.width), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - if (snapshot.data?['state'] != null) - ...snapshot.data!['state']! - .map( - (item) => SizedBox( - width: context.dynamicWidth(0.95), - child: FutureBuilder( - future: warningCard( - context, apiServices, item), - builder: (context, - warningCardSnapshot) { - if (warningCardSnapshot - .hasData) { - return warningCardSnapshot - .data!; - } else { - return const SizedBox - .shrink(); - } - }, - ), - ), - ) - .toList(), - if (snapshot.data?['battery'] != null) - ...snapshot.data!['battery']! - .map( - (batteryItem) => SizedBox( - width: context.dynamicWidth(0.95), - child: FutureBuilder( - future: notificationCard( - context, - "lowBattery", - appLocalization(context) - .low_battery_message, - batteryItem, - ), - builder: (context, - warningCardSnapshot) { - if (warningCardSnapshot - .hasData) { - return warningCardSnapshot - .data!; - } else { - return const SizedBox - .shrink(); - } - }, - ), - ), - ) - .toList(), - ], - ), - ) - : Padding( - key: const ValueKey('no_data'), - padding: context.paddingMedium, - child: Center( + return StreamBuilder?>( + stream: homeBloc.streamAliasDevices, + builder: (context, aliasDevicesSnapshot) { + if(aliasDevicesSnapshot.data == null){ + homeBloc.getOwnerAndJoinedDevices(context); + return const SharedLoadingAnimation(); + }else{ + log("Goi else"); + homeBloc.getOwnerDeviceState(context, aliasDevicesSnapshot.data ?? []); + homeBloc.getDeviceStatusAliasMap(aliasDevicesSnapshot.data ?? []); + checkSettingDevice(aliasDevicesSnapshot.data ?? []); + return Scaffold( + body: Padding( + padding: context.paddingLow, + child: SingleChildScrollView( + child: Column( + children: [ + Row( + children: [ + Text( + appLocalization(context).notification, + style: context.titleMediumTextStyle, + ), + SizedBox(width: context.lowValue), + StreamBuilder( + stream: homeBloc.streamCountNotification, + builder: (context, countSnapshot) { + if(countSnapshot.data == null){ + homeBloc.getOwnerDeviceState(context, aliasDevicesSnapshot.data ?? []); + return const Text("0"); + } else{ + return Text( + "(${countSnapshot.data ?? 0})", + style: context.titleMediumTextStyle, + ); + } + }, + ) + ], + ), + SizedBox( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: StreamBuilder>>( + stream: homeBloc.streamOwnerDevicesStatus, + builder: (context, ownerDevicesStatusSnapshot) { + if(ownerDevicesStatusSnapshot.data == null){ + homeBloc.getOwnerDeviceState(context, aliasDevicesSnapshot.data ?? []); + return const SharedComponentLoadingAnimation(); + }else{ + return AnimatedSwitcher( + duration: context.lowDuration, + transitionBuilder: + (Widget child, Animation animation) { + final offsetAnimation = Tween( + begin: const Offset(0.0, 0.2), + end: Offset.zero, + ).animate(CurvedAnimation( + parent: animation, + curve: Curves.easeInOut, + )); + return FadeTransition( + opacity: animation, + child: SlideTransition( + position: offsetAnimation, + child: child, + ), + ); + }, + child: ownerDevicesStatusSnapshot.data?['state'] != null || + ownerDevicesStatusSnapshot.data?['battery'] != null + ? ConstrainedBox( + key: const ValueKey('data'), + constraints: BoxConstraints( + minWidth: + MediaQuery.of(context).size.width), child: Row( - mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, children: [ - const Icon( - Icons.check_circle_outline_rounded, - size: 40, - color: Colors.green, - ), - SizedBox(width: context.lowValue), - Text( - appLocalization(context) - .notification_description, - maxLines: 2, - overflow: TextOverflow.ellipsis, - softWrap: true, - textAlign: TextAlign.start, - ), + if (ownerDevicesStatusSnapshot.data?['state'] != null) + ...ownerDevicesStatusSnapshot.data!['state']! + .map( + (item) => SizedBox( + width: context.dynamicWidth(0.95), + child: FutureBuilder( + future: warningCard( + context, apiServices, item), + builder: (context, + warningCardSnapshot) { + if (warningCardSnapshot + .hasData) { + return warningCardSnapshot + .data!; + } else { + return const SizedBox + .shrink(); + } + }, + ), + ), + ) + .toList(), + if (ownerDevicesStatusSnapshot.data?['battery'] != null) + ...ownerDevicesStatusSnapshot.data!['battery']! + .map( + (batteryItem) => SizedBox( + width: context.dynamicWidth(0.95), + child: FutureBuilder( + future: notificationCard( + context, + "lowBattery", + appLocalization(context) + .low_battery_message, + batteryItem, + ), + builder: (context, + warningCardSnapshot) { + if (warningCardSnapshot + .hasData) { + return warningCardSnapshot + .data!; + } else { + return const SizedBox + .shrink(); + } + }, + ), + ), + ) + .toList(), ], ), + ) + : Padding( + key: const ValueKey('no_data'), + padding: context.paddingMedium, + child: Center( + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon( + Icons.check_circle_outline_rounded, + size: 40, + color: Colors.green, + ), + SizedBox(width: context.lowValue), + Text( + appLocalization(context) + .notification_description, + maxLines: 2, + overflow: TextOverflow.ellipsis, + softWrap: true, + textAlign: TextAlign.start, + ), + ], + ), + ), ), - ), - ); - }, - ), + ); + } + }, + ), + ), + ), + StreamBuilder>>( + stream: homeBloc.streamAllDevicesAliasMap, + builder: (context, allDevicesAliasMapSnapshot) { + if(allDevicesAliasMapSnapshot.data == null){ + homeBloc.getDeviceStatusAliasMap(aliasDevicesSnapshot.data ?? []); + return const SharedComponentLoadingAnimation(); + }else{ + final data = allDevicesAliasMapSnapshot.data!; + return OverviewCard( + isOwner: true, + total: data['all']?.length ?? 0, + active: data['online']?.length ?? 0, + inactive: data['offline']?.length ?? 0, + warning: data['warn']?.length ?? 0, + unused: data['not-use']?.length ?? 0, + showUnused: false, + ); + } + }, + ), + ], ), ), - StreamBuilder>>( - stream: homeBloc.streamAllDevicesAliasMap, - builder: (context, allDevicesAliasMapSnapshot) { - if(allDevicesAliasMapSnapshot.data == null){ - return const SharedComponentLoadingAnimation(); - }else{ - final data = allDevicesAliasMapSnapshot.data!; - return OverviewCard( - isOwner: true, - total: data['all']?.length ?? 0, - active: data['online']?.length ?? 0, - inactive: data['offline']?.length ?? 0, - warning: data['warn']?.length ?? 0, - unused: data['not-use']?.length ?? 0, - showUnused: false, - ); - } - }, - ), - ], - ), - ), - ), + ), + ); + } + } ); } - void getOwnerAndJoinedDevices() async { - await apiServices.execute(context, () async { - devices = await apiServices.getDashBoardDevices().handleApiError(); - List publicDevices = []; - for (var device in devices) { - if (device.visibility == "PUBLIC") { - publicDevices.add(device); - } - } - getOwnerDeviceState(publicDevices); - checkSettingDevice(publicDevices); - getDeviceStatusAliasMap(publicDevices); - }); - } - - void getOwnerDeviceState(List allDevices) async { - ownerDevicesState.clear(); - ownerDevicesStatus.clear(); - - if (!mounted) return; - homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus); - - int count = 0; - for (var device in allDevices) { - // if (device.isOwner != true) continue; - - if (!mounted) return; - Map sensorMap = DeviceUtils.instance - .getDeviceSensors(context, device.status?.sensors ?? []); - - if (device.state == 1 || device.state == 3) { - ownerDevicesStatus["state"] ??= []; - ownerDevicesStatus["state"]!.add(device); - if (!mounted) return; - homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus); - count++; - } - - final noDataMessage = appLocalization(context).no_data_message; - if (sensorMap['sensorBattery'] != noDataMessage) { - if (double.parse(sensorMap['sensorBattery']) <= 20) { - ownerDevicesStatus['battery'] ??= []; - ownerDevicesStatus['battery']!.add(device); - if (!mounted) return; - homeBloc.sinkOwnerDevicesStatus.add(ownerDevicesStatus); - count++; - } - } - } - - notificationCount = count; - if (!mounted) return; - homeBloc.sinkCountNotification.add(notificationCount); - } - - void getDeviceStatusAliasMap(List devices) { - allDevicesAliasMap.clear(); - for (var key in ['all', 'online', 'offline', 'warning', 'not-use']) { - allDevicesAliasMap[key] = []; - } - - for (DeviceWithAlias device in devices) { - allDevicesAliasMap['all']!.add(device); - if (device.state == 0 || device.state == 1) { - allDevicesAliasMap['online']!.add(device); - } - if (device.state == -1) { - allDevicesAliasMap['offline']!.add(device); - } - if (device.state == 1) { - allDevicesAliasMap['warning']!.add(device); - } - if (device.state == -2) { - allDevicesAliasMap['not-use']!.add(device); - } - - } - homeBloc.sinkAllDevicesAliasMap.add(allDevicesAliasMap); - } - void checkSettingDevice(List devices) async { if (isFunctionCall) { log("Ham check setting da duoc goi"); diff --git a/lib/feature/main/main_screen.dart b/lib/feature/main/main_screen.dart index 79230b0..3bdae22 100644 --- a/lib/feature/main/main_screen.dart +++ b/lib/feature/main/main_screen.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:go_router/go_router.dart'; import 'package:badges/badges.dart' as badges; -import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart'; +import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart'; import '../../product/utils/permission_handler.dart'; import '../../product/permission/notification_permission.dart'; @@ -147,79 +147,75 @@ class _MainScreenState extends State with WidgetsBindingObserver { WidgetsBinding.instance.removeObserver(this); } - List _navBarsItems() { - return [ - PersistentBottomNavBarItem( - icon: IconConstants.instance.getMaterialIcon(Icons.home), - title: appLocalization(context).home_page_destination, - activeColorPrimary: Colors.blue, - inactiveColorPrimary: Colors.grey, - inactiveIcon: - IconConstants.instance.getMaterialIcon(Icons.home_outlined), - ), - PersistentBottomNavBarItem( - icon: IconConstants.instance.getMaterialIcon(Icons.settings), - title: appLocalization(context).manager_page_destination, - activeColorPrimary: Colors.blue, - inactiveColorPrimary: Colors.grey, - inactiveIcon: - IconConstants.instance.getMaterialIcon(Icons.settings_outlined), - ), - PersistentBottomNavBarItem( - icon: IconConstants.instance.getMaterialIcon(Icons.location_on), - title: appLocalization(context).map_page_destination, - activeColorPrimary: Colors.blue, - inactiveColorPrimary: Colors.grey, - inactiveIcon: - IconConstants.instance.getMaterialIcon(Icons.location_on_outlined), - ), - PersistentBottomNavBarItem( - icon: IconConstants.instance.getMaterialIcon(Icons.history), - title: appLocalization(context).history_page_destination, - activeColorPrimary: Colors.blue, - inactiveColorPrimary: Colors.grey, - inactiveIcon: - IconConstants.instance.getMaterialIcon(Icons.history_outlined), - ), - PersistentBottomNavBarItem( - icon: IconConstants.instance.getMaterialIcon(Icons.group), - title: appLocalization(context).group_page_destination, - activeColorPrimary: Colors.blue, - inactiveColorPrimary: Colors.grey, - inactiveIcon: - IconConstants.instance.getMaterialIcon(Icons.group_outlined), - ), - ]; - } - - List _buildScreens() { - return [ - BlocProvider( - child: HomeScreen( - persistentTabController: controller, - ), - blocBuilder: () => HomeBloc(), - ), - BlocProvider( - child: const DevicesManagerScreen(), - blocBuilder: () => DevicesManagerBloc()), - BlocProvider( - child: const MapScreen(), - blocBuilder: () => MapBloc(), - ), - BlocProvider( - child: const DeviceLogsScreen(), - blocBuilder: () => DeviceLogsBloc(), - ), - BlocProvider( - child: const InterFamilyScreen(), - blocBuilder: () => InterFamilyBloc(), - ), - ]; - } - @override Widget build(BuildContext context) { + List tabs = [ + PersistentTabConfig( + screen: BlocProvider( + child: const HomeScreen(), + blocBuilder: () => HomeBloc(), + ), + item: ItemConfig( + icon: IconConstants.instance.getMaterialIcon(Icons.home), + title: appLocalization(context).home_page_destination, + inactiveIcon: + IconConstants.instance.getMaterialIcon(Icons.home_outlined), + iconSize: 30, + ), + ), + PersistentTabConfig( + screen: BlocProvider( + child: const DevicesManagerScreen(), + blocBuilder: () => DevicesManagerBloc(), + ), + item: ItemConfig( + icon: IconConstants.instance.getMaterialIcon(Icons.settings), + title: appLocalization(context).manager_page_destination, + inactiveIcon: + IconConstants.instance.getMaterialIcon(Icons.settings_outlined), + iconSize: 30, + ), + ), + PersistentTabConfig( + screen: BlocProvider( + child: const MapScreen(), + blocBuilder: () => MapBloc(), + ), + item: ItemConfig( + icon: IconConstants.instance.getMaterialIcon(Icons.location_on), + title: appLocalization(context).map_page_destination, + inactiveIcon: IconConstants.instance + .getMaterialIcon(Icons.location_on_outlined), + iconSize: 30, + ), + ), + PersistentTabConfig( + screen: BlocProvider( + child: const DeviceLogsScreen(), + blocBuilder: () => DeviceLogsBloc(), + ), + item: ItemConfig( + icon: IconConstants.instance.getMaterialIcon(Icons.history), + title: appLocalization(context).history_page_destination, + inactiveIcon: + IconConstants.instance.getMaterialIcon(Icons.history_outlined), + iconSize: 30, + ), + ), + PersistentTabConfig( + screen: BlocProvider( + child: const InterFamilyScreen(), + blocBuilder: () => InterFamilyBloc(), + ), + item: ItemConfig( + icon: IconConstants.instance.getMaterialIcon(Icons.group), + title: appLocalization(context).group_page_destination, + inactiveIcon: + IconConstants.instance.getMaterialIcon(Icons.group_outlined), + iconSize: 30, + ), + ), + ]; return StreamBuilder( stream: mainBloc.streamThemeMode, initialData: isLight, @@ -368,32 +364,27 @@ class _MainScreenState extends State with WidgetsBindingObserver { ], ), body: PersistentTabView( - context, - controller: controller, - screens: _buildScreens(), - items: _navBarsItems(), - handleAndroidBackButtonPress: true, - resizeToAvoidBottomInset: true, stateManagement: false, + controller: controller, + tabs: tabs, + navBarBuilder: (navBarConfig) => Style6BottomNavBar( + navBarConfig: navBarConfig, + navBarDecoration: NavBarDecoration( + color: themeModeSnapshot.data! ? Colors.white : Colors.black, + borderRadius: BorderRadius.circular(context.mediumValue), + padding: const EdgeInsets.all(10)), + ), backgroundColor: themeModeSnapshot.data! ? Colors.white : Colors.black, - decoration: NavBarDecoration( - borderRadius: BorderRadius.circular(30.0), - colorBehindNavBar: - themeModeSnapshot.data! ? Colors.white : Colors.black, + navBarOverlap: const NavBarOverlap.none(), + // margin: EdgeInsets.only( + // left: context.lowValue, + // bottom: context.dynamicHeight(0.02), + // right: context.lowValue), + screenTransitionAnimation: const ScreenTransitionAnimation( + curve: Curves.bounceInOut, + duration: Duration(milliseconds: 200), ), - animationSettings: const NavBarAnimationSettings( - navBarItemAnimation: ItemAnimationSettings( - duration: Duration(milliseconds: 200), - curve: Curves.bounceInOut, - ), - screenTransitionAnimation: ScreenTransitionAnimationSettings( - animateTabTransition: true, - curve: Curves.bounceInOut, - duration: Duration(milliseconds: 200), - ), - ), - navBarStyle: NavBarStyle.style13, ), ); }, diff --git a/lib/main.dart b/lib/main.dart index a2e5c2d..12aa178 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,3 @@ - import 'dart:developer'; - import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; diff --git a/lib/product/constant/app/app_constants.dart b/lib/product/constant/app/app_constants.dart index dc156e8..5a8373a 100644 --- a/lib/product/constant/app/app_constants.dart +++ b/lib/product/constant/app/app_constants.dart @@ -25,5 +25,5 @@ class ApplicationConstants { static const PARTICIPANT_GROUP = "participant"; static const NO_DATA = "no_data"; static const LOADING = "loading"; - static int CALL_API_TIMEOUT = 15; + static int CALL_API_TIMEOUT = 30; } diff --git a/lib/product/services/notification_services.dart b/lib/product/services/notification_services.dart index 4a753cb..919cd72 100644 --- a/lib/product/services/notification_services.dart +++ b/lib/product/services/notification_services.dart @@ -3,7 +3,7 @@ import 'dart:math' as math; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart'; +import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart'; class NotificationServices { FirebaseMessaging messaging = FirebaseMessaging.instance; @@ -30,12 +30,8 @@ class NotificationServices { void firebaseInit(BuildContext context) { FirebaseMessaging.onMessage.listen((message) { dev.log("Foreground message payload: ${message.toMap()}"); - if (WidgetsBinding.instance != null) { - showNotification(message); - } else { - dev.log("App is in background, skipping foreground notification"); - } - }); + showNotification(message); + }); } Future getDeviceToken() async { diff --git a/pubspec.lock b/pubspec.lock index 6185db9..5c739cf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -417,10 +417,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: b465e99ce64ba75e61c8c0ce3d87b66d8ac07f0b35d0a7e0263fcfc10f99e836 + sha256: "02ff498f6279470ff7f60c998a69b872f26696ceec237c8402e63a2133868ddf" url: "https://pub.dev" source: hosted - version: "13.2.5" + version: "15.2.3" google_maps: dependency: transitive description: @@ -693,14 +693,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1" - persistent_bottom_nav_bar: + persistent_bottom_nav_bar_v2: dependency: "direct main" description: - name: persistent_bottom_nav_bar - sha256: "6aa9b97ced1abd92c90cedd1997d34ea0b35c3ded762ac6063baccc299b0c4c5" + name: persistent_bottom_nav_bar_v2 + sha256: "1d6347d86512ef028341eaecf2e8870af5dd41462fe77ec5b3126da29b4d7a8d" url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.1.0" petitparser: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 5eb39c8..b3c15cd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,7 +22,7 @@ dependencies: permission_handler: ^11.0.1 # flex_color_scheme: ^7.2.0 flex_color_scheme: ^8.2.0 - go_router: ^13.1.0 + go_router: ^15.2.3 http: ^1.3.0 top_snackbar_flutter: ^3.1.0 badges: ^3.1.2 @@ -40,8 +40,7 @@ dependencies: flutter_polyline_points: ^2.1.0 simple_ripple_animation: ^0.1.0 fl_chart: ^0.64.0 - # persistent_bottom_nav_bar_v2: ^4.2.8 - persistent_bottom_nav_bar: ^6.2.1 + persistent_bottom_nav_bar_v2: ^6.1.0 win32: ^5.10.0 google_maps_flutter: ^2.12.2 data_table_2: ^2.5.18