From 95b1e2c9324be0d71bbcb886a14a344b62699f8b Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Thu, 29 Aug 2024 12:55:37 +0300 Subject: [PATCH] fixes bugs and re add checkboxes theme --- lib/core/theme/app_theme.dart | 1 - lib/main.dart | 40 ++++++++++++++++- .../common/text_field/custom_text_field.dart | 2 +- .../ac/view/ac_device_control.dart | 5 ++- .../view/device_managment_page.dart | 2 +- .../widgets/device_managment_body.dart | 2 +- .../model/ceiling_sensor_model.dart | 23 ++++++++-- .../view/ceiling_sensor_controls.dart | 19 ++++---- .../door_lock/view/door_lock_status_view.dart | 4 +- .../gateway/view/gateway_view.dart | 5 ++- .../view/living_room_device_control.dart | 5 ++- .../shared/device_control_dialog.dart | 2 +- .../sensors_widgets/presence_space_type.dart | 23 +++++++--- .../sensors_widgets/presense_nobody_time.dart | 45 +++++++++++++------ .../extension/build_context_x.dart | 0 15 files changed, 133 insertions(+), 45 deletions(-) delete mode 100644 lib/core/theme/app_theme.dart rename lib/{core => utils}/extension/build_context_x.dart (100%) diff --git a/lib/core/theme/app_theme.dart b/lib/core/theme/app_theme.dart deleted file mode 100644 index 8b137891..00000000 --- a/lib/core/theme/app_theme.dart +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/main.dart b/lib/main.dart index 90c643cc..a94c79c3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,7 +15,8 @@ Future main() async { initialSetup(); String checkToken = await AuthBloc.getTokenAndValidate(); GoRouter router = GoRouter( - initialLocation: checkToken == 'Success' ? RoutesConst.home : RoutesConst.auth, + initialLocation: + checkToken == 'Success' ? RoutesConst.home : RoutesConst.auth, routes: AppRoutes.getRoutes(), ); runApp(MyApp( @@ -54,7 +55,9 @@ class MyApp extends StatelessWidget { fontFamily: 'Aftika', textTheme: const TextTheme( bodySmall: TextStyle( - fontSize: 13, color: ColorsManager.whiteColors, fontWeight: FontWeight.bold), + fontSize: 13, + color: ColorsManager.whiteColors, + fontWeight: FontWeight.bold), bodyMedium: TextStyle(color: Colors.black87, fontSize: 14), bodyLarge: TextStyle(fontSize: 16, color: Colors.white), headlineSmall: TextStyle(color: Colors.black87, fontSize: 18), @@ -65,7 +68,40 @@ class MyApp extends StatelessWidget { fontWeight: FontWeight.bold, ), ), + colorScheme: ColorScheme.fromSeed( + seedColor: ColorsManager.blueColor, + primary: ColorsManager.blueColor, + onSurface: Colors.grey.shade400, + ), + switchTheme: SwitchThemeData( + thumbColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return ColorsManager.blueColor; + } + return ColorsManager.whiteColors; + }), + trackColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return ColorsManager.blueColor.withOpacity(0.5); + } + return ColorsManager.whiteColors; + }), + ), + checkboxTheme: CheckboxThemeData( + fillColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return ColorsManager.blueColor; + } + return Colors.grey.shade200; + }), + checkColor: WidgetStateProperty.all(Colors.white), + side: const BorderSide(color: ColorsManager.whiteColors), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4), + ), + ), ), + routeInformationProvider: router.routeInformationProvider, routerDelegate: router.routerDelegate, routeInformationParser: router.routeInformationParser, diff --git a/lib/pages/common/text_field/custom_text_field.dart b/lib/pages/common/text_field/custom_text_field.dart index 481102dc..2a379982 100644 --- a/lib/pages/common/text_field/custom_text_field.dart +++ b/lib/pages/common/text_field/custom_text_field.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:syncrow_web/core/extension/build_context_x.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; class StatefulTextField extends StatefulWidget { const StatefulTextField({ diff --git a/lib/pages/device_managment/ac/view/ac_device_control.dart b/lib/pages/device_managment/ac/view/ac_device_control.dart index 5c49ecfa..63d1799d 100644 --- a/lib/pages/device_managment/ac/view/ac_device_control.dart +++ b/lib/pages/device_managment/ac/view/ac_device_control.dart @@ -18,6 +18,7 @@ class AcDeviceControl extends StatelessWidget with HelperResponsiveLayout { @override Widget build(BuildContext context) { + final isExtraLarge = isExtraLargeScreenSize(context); final isLarge = isLargeScreenSize(context); final isMedium = isMediumScreenSize(context); return BlocProvider( @@ -31,7 +32,7 @@ class AcDeviceControl extends StatelessWidget with HelperResponsiveLayout { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: isLarge + crossAxisCount: isLarge || isExtraLarge ? 3 : isMedium ? 2 @@ -74,7 +75,7 @@ class AcDeviceControl extends StatelessWidget with HelperResponsiveLayout { } else if (state is AcsLoadingState) { return const Center(child: CircularProgressIndicator()); } else { - return const Center(child: Text('Error fetching status')); + return const Center(child: Text('Error fetching status')); } }, ), diff --git a/lib/pages/device_managment/all_devices/view/device_managment_page.dart b/lib/pages/device_managment/all_devices/view/device_managment_page.dart index 7496cf08..04315651 100644 --- a/lib/pages/device_managment/all_devices/view/device_managment_page.dart +++ b/lib/pages/device_managment/all_devices/view/device_managment_page.dart @@ -36,7 +36,7 @@ class DeviceManagementPage extends StatelessWidget with HelperResponsiveLayout { return DeviceManagementBody(devices: devices); } else { - return const Center(child: Text('No Devices Found')); + return const Center(child: Text('Error fetching Devices')); } }, ), diff --git a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart index 36ccf4f2..9b5fcc8d 100644 --- a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart +++ b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/core/extension/build_context_x.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/common/custom_table.dart'; import 'package:syncrow_web/pages/common/filter/filter_widget.dart'; diff --git a/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart b/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart index e8118168..528de1e6 100644 --- a/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart +++ b/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart @@ -10,6 +10,7 @@ class CeilingSensorModel { String bodyMovement; String noBodyTime; int maxDistance; + String spaceType; CeilingSensorModel({ required this.presenceState, @@ -20,6 +21,7 @@ class CeilingSensorModel { required this.bodyMovement, required this.noBodyTime, required this.maxDistance, + required this.spaceType, }); factory CeilingSensorModel.fromJson(List jsonList) { @@ -31,6 +33,7 @@ class CeilingSensorModel { String _bodyMovement = 'none'; String _noBodyTime = 'none'; int _maxDis = 0; + String _spaceType = 'none'; try { for (var status in jsonList) { @@ -38,17 +41,26 @@ class CeilingSensorModel { case 'presence_state': _presenceState = status.value ?? 'none'; break; + case 'scene': + _spaceType = status.value ?? 'none'; + break; case 'sensitivity': - _sensitivity = status.value is int ? status.value : int.tryParse(status.value ?? '1') ?? 1; + _sensitivity = status.value is int + ? status.value + : int.tryParse(status.value ?? '1') ?? 1; break; case 'checking_result': _checkingResult = status.value ?? ''; break; case 'presence_range': - _presenceRange = status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0; + _presenceRange = status.value is int + ? status.value + : int.tryParse(status.value ?? '0') ?? 0; break; case 'sports_para': - _sportsPara = status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0; + _sportsPara = status.value is int + ? status.value + : int.tryParse(status.value ?? '0') ?? 0; break; case 'body_movement': _bodyMovement = status.value ?? ''; @@ -57,7 +69,9 @@ class CeilingSensorModel { _noBodyTime = status.value ?? 'none'; break; case 'moving_max_dis': - _maxDis = status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0; + _maxDis = status.value is int + ? status.value + : int.tryParse(status.value ?? '0') ?? 0; break; } } @@ -74,6 +88,7 @@ class CeilingSensorModel { bodyMovement: _bodyMovement, noBodyTime: _noBodyTime, maxDistance: _maxDis, + spaceType: _spaceType, ); } } diff --git a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart index 2bb7eb76..4c00dd69 100644 --- a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart +++ b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart @@ -24,6 +24,7 @@ class CeilingSensorControls extends StatelessWidget @override Widget build(BuildContext context) { + final isExtraLarge = isExtraLargeScreenSize(context); final isLarge = isLargeScreenSize(context); final isMedium = isMediumScreenSize(context); return BlocProvider( @@ -35,8 +36,8 @@ class CeilingSensorControls extends StatelessWidget state is CeilingReportsLoadingState) { return const Center(child: CircularProgressIndicator()); } else if (state is CeilingUpdateState) { - return _buildGridView( - context, state.ceilingSensorModel, isLarge, isMedium); + return _buildGridView(context, state.ceilingSensorModel, + isExtraLarge, isLarge, isMedium); } else if (state is CeilingReportsState) { return ReportsTable( report: state.deviceReport, @@ -58,7 +59,8 @@ class CeilingSensorControls extends StatelessWidget ); } else if (state is CeilingReportsFailedState) { final model = context.read().deviceStatus; - return _buildGridView(context, model, isLarge, isMedium); + return _buildGridView( + context, model, isExtraLarge, isLarge, isMedium); } return const Center(child: Text('Error fetching status')); }, @@ -67,13 +69,13 @@ class CeilingSensorControls extends StatelessWidget } Widget _buildGridView(BuildContext context, CeilingSensorModel model, - bool isLarge, bool isMedium) { + bool isExtraLarge, bool isLarge, bool isMedium) { return GridView( padding: const EdgeInsets.symmetric(horizontal: 50), shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: isLarge + crossAxisCount: isLarge || isExtraLarge ? 3 : isMedium ? 2 @@ -96,8 +98,8 @@ class CeilingSensorControls extends StatelessWidget postfix: 'm', description: 'Detection Range', ), - const PresenceSpaceType( - listOfIcons: [ + PresenceSpaceType( + listOfIcons: const [ Assets.office, Assets.parlour, Assets.dyi, @@ -105,6 +107,7 @@ class CeilingSensorControls extends StatelessWidget Assets.bedroom, ], description: 'Space Type', + value: model.spaceType, ), PresenceUpdateData( value: model.sensitivity.toDouble(), @@ -138,7 +141,7 @@ class CeilingSensorControls extends StatelessWidget PresenceNoBodyTime( value: model.noBodyTime, title: 'Nobody Time:', - // description: 'hr', + description: '', action: (String value) => context.read().add( CeilingChangeValueEvent( code: 'nobody_time', diff --git a/lib/pages/device_managment/door_lock/view/door_lock_status_view.dart b/lib/pages/device_managment/door_lock/view/door_lock_status_view.dart index 12db871f..536b0d97 100644 --- a/lib/pages/device_managment/door_lock/view/door_lock_status_view.dart +++ b/lib/pages/device_managment/door_lock/view/door_lock_status_view.dart @@ -34,9 +34,9 @@ class DoorLockView extends StatelessWidget { } else if (state is UpdateState) { return _buildStatusControls(context, state.smartDoorModel); } else if (state is DoorLockControlError) { - return Center(child: Text(state.message)); + return const SizedBox(); } else { - return const Center(child: CircularProgressIndicator()); + return const Center(child: Text('Error fetching status')); } }, ), diff --git a/lib/pages/device_managment/gateway/view/gateway_view.dart b/lib/pages/device_managment/gateway/view/gateway_view.dart index 4f14161e..9fbe8cb9 100644 --- a/lib/pages/device_managment/gateway/view/gateway_view.dart +++ b/lib/pages/device_managment/gateway/view/gateway_view.dart @@ -14,6 +14,7 @@ class GateWayControls extends StatelessWidget with HelperResponsiveLayout { @override Widget build(BuildContext context) { + final isExtraLarge = isExtraLargeScreenSize(context); final isLarge = isLargeScreenSize(context); final isMedium = isMediumScreenSize(context); @@ -29,7 +30,7 @@ class GateWayControls extends StatelessWidget with HelperResponsiveLayout { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: isLarge + crossAxisCount: isLarge || isExtraLarge ? 3 : isMedium ? 2 @@ -45,7 +46,7 @@ class GateWayControls extends StatelessWidget with HelperResponsiveLayout { }, ); } else { - return const Center(child: Text('Error fetching devices')); + return const Center(child: Text('Error fetching status')); } }, ), diff --git a/lib/pages/device_managment/living_room_switch/view/living_room_device_control.dart b/lib/pages/device_managment/living_room_switch/view/living_room_device_control.dart index 60e656ad..1c9d05ca 100644 --- a/lib/pages/device_managment/living_room_switch/view/living_room_device_control.dart +++ b/lib/pages/device_managment/living_room_switch/view/living_room_device_control.dart @@ -24,7 +24,7 @@ class LivingRoomDeviceControl extends StatelessWidget return _buildStatusControls(context, state.status); } else if (state is LivingRoomDeviceManagementError || state is LivingRoomControlError) { - return Center(child: Text(state.toString())); + return const Center(child: Text('Error fetching status')); } else { return const Center(child: CircularProgressIndicator()); } @@ -35,6 +35,7 @@ class LivingRoomDeviceControl extends StatelessWidget Widget _buildStatusControls( BuildContext context, LivingRoomStatusModel status) { + final isExtraLarge = isExtraLargeScreenSize(context); final isLarge = isLargeScreenSize(context); final isMedium = isMediumScreenSize(context); return GridView( @@ -42,7 +43,7 @@ class LivingRoomDeviceControl extends StatelessWidget shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: isLarge + crossAxisCount: isLarge || isExtraLarge ? 3 : isMedium ? 2 diff --git a/lib/pages/device_managment/shared/device_control_dialog.dart b/lib/pages/device_managment/shared/device_control_dialog.dart index d115f57e..cde54047 100644 --- a/lib/pages/device_managment/shared/device_control_dialog.dart +++ b/lib/pages/device_managment/shared/device_control_dialog.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:syncrow_web/core/extension/build_context_x.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/helper/route_controls_based_code.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; diff --git a/lib/pages/device_managment/shared/sensors_widgets/presence_space_type.dart b/lib/pages/device_managment/shared/sensors_widgets/presence_space_type.dart index 185144e1..5b14452a 100644 --- a/lib/pages/device_managment/shared/sensors_widgets/presence_space_type.dart +++ b/lib/pages/device_managment/shared/sensors_widgets/presence_space_type.dart @@ -1,6 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:syncrow_web/core/extension/build_context_x.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; import 'package:syncrow_web/utils/color_manager.dart'; @@ -9,10 +10,12 @@ class PresenceSpaceType extends StatelessWidget { super.key, required this.listOfIcons, required this.description, + required this.value, }); final List listOfIcons; final String description; + final String value; @override Widget build(BuildContext context) { @@ -36,10 +39,20 @@ class PresenceSpaceType extends StatelessWidget { runSpacing: 8, spacing: 16, children: [ - ...listOfIcons.map((icon) => SvgPicture.asset( - icon, - width: 40, - height: 40, + ...listOfIcons.map((icon) => Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + color: icon.contains(value) + ? ColorsManager.blueColor + : Colors.transparent, + ), + ), + child: SvgPicture.asset( + icon, + width: 40, + height: 40, + ), )), ], ), diff --git a/lib/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart b/lib/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart index 6d37ec3a..4e64ee1e 100644 --- a/lib/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart +++ b/lib/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart @@ -23,6 +23,8 @@ class PresenceNoBodyTime extends StatefulWidget { class _PresenceUpdateDataState extends State { late String _currentValue; + late String _numericValue; + late String _unit; final List nobodyTimeRange = [ 'none', @@ -40,29 +42,45 @@ class _PresenceUpdateDataState extends State { void initState() { super.initState(); _currentValue = widget.value; + _numericValue = _extractNumericValue(_currentValue); + _unit = _extractUnit(_currentValue); + } + + String _extractNumericValue(String value) { + if (value == 'none') return '0'; + return value.replaceAll(RegExp(r'[a-zA-Z]'), '').trim(); + } + + String _extractUnit(String value) { + if (value == 'none') return ''; + if (value.endsWith('s')) return 's'; + if (value.endsWith('min')) return 'min'; + if (value.endsWith('hour')) return 'hr'; + return ''; } void _onValueChanged(String newValue) { + setState(() { + _currentValue = newValue; + _numericValue = _extractNumericValue(newValue); + _unit = _extractUnit(newValue); + }); widget.action(newValue); } void _incrementValue() { int currentIndex = nobodyTimeRange.indexOf(_currentValue); if (currentIndex < nobodyTimeRange.length - 1) { - setState(() { - _currentValue = nobodyTimeRange[currentIndex + 1]; - }); - _onValueChanged(_currentValue); + String newValue = nobodyTimeRange[currentIndex + 1]; + _onValueChanged(newValue); } } void _decrementValue() { int currentIndex = nobodyTimeRange.indexOf(_currentValue); if (currentIndex > 0) { - setState(() { - _currentValue = nobodyTimeRange[currentIndex - 1]; - }); - _onValueChanged(_currentValue); + String newValue = nobodyTimeRange[currentIndex - 1]; + _onValueChanged(newValue); } } @@ -81,11 +99,12 @@ class _PresenceUpdateDataState extends State { fontSize: 10), ), IncrementDecrementWidget( - value: _currentValue, - description: widget.description ?? '', - descriptionColor: ColorsManager.blackColor, - onIncrement: _incrementValue, - onDecrement: _decrementValue), + value: _numericValue, + description: _unit, + descriptionColor: ColorsManager.blackColor, + onIncrement: _incrementValue, + onDecrement: _decrementValue, + ), ], ), ); diff --git a/lib/core/extension/build_context_x.dart b/lib/utils/extension/build_context_x.dart similarity index 100% rename from lib/core/extension/build_context_x.dart rename to lib/utils/extension/build_context_x.dart