From 66f6b1cba9770a2a20bd355872de6e8ff0d19470 Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Tue, 8 Oct 2024 11:48:35 +0300 Subject: [PATCH] fix bugs --- assets/icons/1gang.svg | 5 ++ assets/icons/2gang.svg | 7 ++ lib/pages/common/curtain_toggle.dart | 10 +-- lib/pages/common/custom_table.dart | 36 ++++---- .../ac/view/ac_device_batch_control.dart | 19 ++--- .../ac/view/ac_device_control.dart | 12 +-- .../batch_control_list/batch_ac_mode.dart | 29 +++---- .../batch_current_temp.dart | 76 ++++++++--------- .../batch_control_list/batch_fan_speed.dart | 33 +++----- .../ac/view/control_list/ac_mode.dart | 29 +++---- .../ac/view/control_list/ac_toggle.dart | 10 +-- .../ac/view/control_list/current_temp.dart | 27 ++---- .../ac/view/control_list/fan_speed.dart | 32 +++---- .../bloc/device_managment_bloc.dart | 71 +++++----------- .../widgets/device_managment_body.dart | 36 +++----- .../ceiling_sensor/bloc/bloc.dart | 41 ++++----- .../widgets/schedule__garage_table.dart | 48 ++++------- .../gateway/bloc/gate_way_bloc.dart | 9 +- .../gateway/view/gateway_view.dart | 2 +- .../shared/device_controls_container.dart | 8 +- .../shared/toggle_widget.dart | 9 +- .../visitor_password/model/device_model.dart | 12 ++- lib/services/devices_mang_api.dart | 28 ++----- lib/utils/constants/assets.dart | 84 +++++++------------ lib/utils/enum/device_types.dart | 7 ++ 25 files changed, 258 insertions(+), 422 deletions(-) create mode 100644 assets/icons/1gang.svg create mode 100644 assets/icons/2gang.svg diff --git a/assets/icons/1gang.svg b/assets/icons/1gang.svg new file mode 100644 index 00000000..647dc350 --- /dev/null +++ b/assets/icons/1gang.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icons/2gang.svg b/assets/icons/2gang.svg new file mode 100644 index 00000000..6cfe191b --- /dev/null +++ b/assets/icons/2gang.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/lib/pages/common/curtain_toggle.dart b/lib/pages/common/curtain_toggle.dart index a44822c3..305ede03 100644 --- a/lib/pages/common/curtain_toggle.dart +++ b/lib/pages/common/curtain_toggle.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; @@ -22,13 +22,7 @@ class CurtainToggle extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(16), + return DeviceControlsContainer( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ diff --git a/lib/pages/common/custom_table.dart b/lib/pages/common/custom_table.dart index 1de04c02..5b6692ae 100644 --- a/lib/pages/common/custom_table.dart +++ b/lib/pages/common/custom_table.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_web/pages/device_managment/all_devices/bloc/device_managment_bloc.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; @@ -78,20 +80,22 @@ class _DynamicTableState extends State { _selectAll = false; } - void _toggleSelectAll(bool? value) { - setState(() { - _selectAll = value ?? false; - _selectedRows = List.filled(widget.data.length, _selectAll); - }); - widget.onSelectionChanged?.call(_selectedRows); - } - void _toggleRowSelection(int index) { setState(() { _selectedRows[index] = !_selectedRows[index]; _selectAll = _selectedRows.every((isSelected) => isSelected); }); widget.onSelectionChanged?.call(_selectedRows); + context.read().add(UpdateSelection(_selectedRows)); + } + + void _toggleSelectAll(bool? value) { + setState(() { + _selectAll = value ?? false; + _selectedRows = List.filled(widget.data.length, _selectAll); + }); + widget.onSelectionChanged?.call(_selectedRows); + context.read().add(UpdateSelection(_selectedRows)); } @override @@ -130,13 +134,9 @@ class _DynamicTableState extends State { ), Text( // no password - widget.tableName == 'AccessManagement' - ? 'No Password ' - : 'No Devices', - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith(color: ColorsManager.grayColor), + widget.tableName == 'AccessManagement' ? 'No Password ' : 'No Devices', + style: + Theme.of(context).textTheme.bodySmall!.copyWith(color: ColorsManager.grayColor), ) ], ), @@ -155,10 +155,8 @@ class _DynamicTableState extends State { final row = widget.data[index]; return Row( children: [ - if (widget.withCheckBox) - _buildRowCheckbox(index, widget.size.height * 0.10), - ...row.map((cell) => - _buildTableCell(cell.toString(), widget.size.height * 0.10)), + if (widget.withCheckBox) _buildRowCheckbox(index, widget.size.height * 0.10), + ...row.map((cell) => _buildTableCell(cell.toString(), widget.size.height * 0.10)), ], ); }, diff --git a/lib/pages/device_managment/ac/view/ac_device_batch_control.dart b/lib/pages/device_managment/ac/view/ac_device_batch_control.dart index 1930e9c4..2da394c7 100644 --- a/lib/pages/device_managment/ac/view/ac_device_batch_control.dart +++ b/lib/pages/device_managment/ac/view/ac_device_batch_control.dart @@ -15,8 +15,7 @@ import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class AcDeviceBatchControlView extends StatelessWidget - with HelperResponsiveLayout { +class AcDeviceBatchControlView extends StatelessWidget with HelperResponsiveLayout { const AcDeviceBatchControlView({super.key, required this.devicesIds}); final List devicesIds; @@ -27,8 +26,7 @@ class AcDeviceBatchControlView extends StatelessWidget final isLarge = isLargeScreenSize(context); final isMedium = isMediumScreenSize(context); return BlocProvider( - create: (context) => AcBloc(deviceId: devicesIds.first) - ..add(AcFetchBatchStatusEvent(devicesIds)), + create: (context) => AcBloc(deviceId: devicesIds.first)..add(AcFetchBatchStatusEvent(devicesIds)), child: BlocBuilder( builder: (context, state) { if (state is ACStatusLoaded) { @@ -66,6 +64,7 @@ class AcDeviceBatchControlView extends StatelessWidget tempSet: state.status.tempSet, code: 'temp_set', devicesIds: devicesIds, + isBatch: true, ), BatchAcMode( value: state.status.acMode, @@ -99,8 +98,7 @@ class AcDeviceBatchControlView extends StatelessWidget ), Text( 'h', - style: context.textTheme.bodySmall! - .copyWith(color: ColorsManager.blackColor), + style: context.textTheme.bodySmall!.copyWith(color: ColorsManager.blackColor), ), Text( '30', @@ -109,9 +107,7 @@ class AcDeviceBatchControlView extends StatelessWidget fontWeight: FontWeight.bold, ), ), - Text('m', - style: context.textTheme.bodySmall! - .copyWith(color: ColorsManager.blackColor)), + Text('m', style: context.textTheme.bodySmall!.copyWith(color: ColorsManager.blackColor)), IconButton( onPressed: () {}, icon: const Icon( @@ -133,7 +129,7 @@ class AcDeviceBatchControlView extends StatelessWidget code: 'child_lock', value: state.status.childLock, label: 'Child Lock', - icon: state.status.childLock ? Assets.unlock : Assets.acLock, + icon: state.status.childLock ? Assets.acLock : Assets.unlock, onChange: (value) { context.read().add(AcBatchControlEvent( devicesIds: devicesIds, @@ -147,8 +143,7 @@ class AcDeviceBatchControlView extends StatelessWidget callFactoryReset: () { context.read().add(AcFactoryResetEvent( deviceId: state.status.uuid, - factoryResetModel: - FactoryResetModel(devicesUuid: devicesIds), + factoryResetModel: FactoryResetModel(devicesUuid: devicesIds), )); }, ), 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 3c383854..37d3a402 100644 --- a/lib/pages/device_managment/ac/view/ac_device_control.dart +++ b/lib/pages/device_managment/ac/view/ac_device_control.dart @@ -24,8 +24,7 @@ class AcDeviceControlsView extends StatelessWidget with HelperResponsiveLayout { final isLarge = isLargeScreenSize(context); final isMedium = isMediumScreenSize(context); return BlocProvider( - create: (context) => AcBloc(deviceId: device.uuid!) - ..add(AcFetchDeviceStatusEvent(device.uuid!)), + create: (context) => AcBloc(deviceId: device.uuid!)..add(AcFetchDeviceStatusEvent(device.uuid!)), child: BlocBuilder( builder: (context, state) { if (state is ACStatusLoaded) { @@ -98,8 +97,7 @@ class AcDeviceControlsView extends StatelessWidget with HelperResponsiveLayout { ), Text( 'h', - style: context.textTheme.bodySmall! - .copyWith(color: ColorsManager.blackColor), + style: context.textTheme.bodySmall!.copyWith(color: ColorsManager.blackColor), ), Text( '30', @@ -108,9 +106,7 @@ class AcDeviceControlsView extends StatelessWidget with HelperResponsiveLayout { fontWeight: FontWeight.bold, ), ), - Text('m', - style: context.textTheme.bodySmall! - .copyWith(color: ColorsManager.blackColor)), + Text('m', style: context.textTheme.bodySmall!.copyWith(color: ColorsManager.blackColor)), IconButton( onPressed: () {}, icon: const Icon( @@ -132,7 +128,7 @@ class AcDeviceControlsView extends StatelessWidget with HelperResponsiveLayout { code: 'child_lock', value: state.status.childLock, label: 'Child Lock', - icon: state.status.childLock ? Assets.unlock : Assets.acLock, + icon: state.status.childLock ? Assets.acLock : Assets.unlock, onChange: (value) { context.read().add( AcControlEvent( diff --git a/lib/pages/device_managment/ac/view/batch_control_list/batch_ac_mode.dart b/lib/pages/device_managment/ac/view/batch_control_list/batch_ac_mode.dart index 8b601ac2..60d48256 100644 --- a/lib/pages/device_managment/ac/view/batch_control_list/batch_ac_mode.dart +++ b/lib/pages/device_managment/ac/view/batch_control_list/batch_ac_mode.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; -import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; +import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; class BatchAcMode extends StatelessWidget { const BatchAcMode({ @@ -21,30 +22,20 @@ class BatchAcMode extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(16), + return DeviceControlsContainer( child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - _buildIconContainer(context, TempModes.cold, Assets.freezing, - value == TempModes.cold), - _buildIconContainer( - context, TempModes.hot, Assets.acSun, value == TempModes.hot), - _buildIconContainer(context, TempModes.wind, Assets.acAirConditioner, - value == TempModes.wind), + _buildIconContainer(context, TempModes.cold, Assets.freezing, value == TempModes.cold), + _buildIconContainer(context, TempModes.hot, Assets.acSun, value == TempModes.hot), + _buildIconContainer(context, TempModes.wind, Assets.acAirConditioner, value == TempModes.wind), ], ), ); } - Widget _buildIconContainer( - BuildContext context, TempModes mode, String assetPath, bool isSelected) { + Widget _buildIconContainer(BuildContext context, TempModes mode, String assetPath, bool isSelected) { return Flexible( child: GestureDetector( onTap: () { diff --git a/lib/pages/device_managment/ac/view/batch_control_list/batch_current_temp.dart b/lib/pages/device_managment/ac/view/batch_control_list/batch_current_temp.dart index ba5ea639..be7441df 100644 --- a/lib/pages/device_managment/ac/view/batch_control_list/batch_current_temp.dart +++ b/lib/pages/device_managment/ac/view/batch_control_list/batch_current_temp.dart @@ -1,11 +1,13 @@ import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; import 'package:syncrow_web/pages/device_managment/shared/celciuse_symbol.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; import 'package:syncrow_web/pages/device_managment/shared/increament_decreament.dart'; import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; class BatchCurrentTemp extends StatefulWidget { const BatchCurrentTemp({ @@ -14,12 +16,14 @@ class BatchCurrentTemp extends StatefulWidget { required this.devicesIds, required this.currentTemp, required this.tempSet, + this.isBatch, }); final String code; final List devicesIds; final int currentTemp; final int tempSet; + final bool? isBatch; @override State createState() => _CurrentTempState(); @@ -67,49 +71,39 @@ class _CurrentTempState extends State { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(16), + return DeviceControlsContainer( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Current Temperature', - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith(color: Colors.grey), - ), - const SizedBox( - height: 5, - ), - Row( - children: [ - Text( - (widget.currentTemp > 99 - ? widget.currentTemp / 10 - : widget.currentTemp) - .toString(), - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith(color: Colors.grey), - ), - const CelsiusSymbol( - color: Colors.grey, - ) - ], - ), - ], - ), + widget.isBatch == true + ? Text( + 'Set Temperature', + style: Theme.of(context).textTheme.bodySmall!.copyWith(color: Colors.grey), + ) + : Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Current Temperature', + style: Theme.of(context).textTheme.bodySmall!.copyWith(color: Colors.grey), + ), + const SizedBox( + height: 5, + ), + Row( + children: [ + Text( + (widget.currentTemp > 99 ? widget.currentTemp / 10 : widget.currentTemp).toString(), + style: Theme.of(context).textTheme.bodySmall!.copyWith(color: Colors.grey), + ), + const CelsiusSymbol( + color: Colors.grey, + ) + ], + ), + ], + ), const Spacer(), IncrementDecrementWidget( value: _adjustedValue.toString(), diff --git a/lib/pages/device_managment/ac/view/batch_control_list/batch_fan_speed.dart b/lib/pages/device_managment/ac/view/batch_control_list/batch_fan_speed.dart index 11882473..ba49047a 100644 --- a/lib/pages/device_managment/ac/view/batch_control_list/batch_fan_speed.dart +++ b/lib/pages/device_managment/ac/view/batch_control_list/batch_fan_speed.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; -import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; +import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; class BatchFanSpeedControl extends StatelessWidget { const BatchFanSpeedControl({ @@ -21,23 +22,16 @@ class BatchFanSpeedControl extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(8), + return DeviceControlsContainer( + padding: 8, child: Column( children: [ Wrap( runSpacing: 8, spacing: 8, children: [ - _buildIconContainer(context, FanSpeeds.auto, Assets.acFanAuto, - value == FanSpeeds.auto), - _buildIconContainer(context, FanSpeeds.low, Assets.acFanLow, - value == FanSpeeds.low), + _buildIconContainer(context, FanSpeeds.auto, Assets.acFanAuto, value == FanSpeeds.auto), + _buildIconContainer(context, FanSpeeds.low, Assets.acFanLow, value == FanSpeeds.low), ], ), const SizedBox(height: 8), @@ -45,10 +39,8 @@ class BatchFanSpeedControl extends StatelessWidget { runSpacing: 8, spacing: 8, children: [ - _buildIconContainer(context, FanSpeeds.middle, Assets.acFanMiddle, - value == FanSpeeds.middle), - _buildIconContainer(context, FanSpeeds.high, Assets.acFanHigh, - value == FanSpeeds.high), + _buildIconContainer(context, FanSpeeds.middle, Assets.acFanMiddle, value == FanSpeeds.middle), + _buildIconContainer(context, FanSpeeds.high, Assets.acFanHigh, value == FanSpeeds.high), ], ) ], @@ -56,8 +48,7 @@ class BatchFanSpeedControl extends StatelessWidget { ); } - Widget _buildIconContainer(BuildContext context, FanSpeeds speed, - String assetPath, bool isSelected) { + Widget _buildIconContainer(BuildContext context, FanSpeeds speed, String assetPath, bool isSelected) { return GestureDetector( onTap: () { context.read().add( diff --git a/lib/pages/device_managment/ac/view/control_list/ac_mode.dart b/lib/pages/device_managment/ac/view/control_list/ac_mode.dart index 65c7ae0a..c6ffc052 100644 --- a/lib/pages/device_managment/ac/view/control_list/ac_mode.dart +++ b/lib/pages/device_managment/ac/view/control_list/ac_mode.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; -import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; +import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; class AcMode extends StatelessWidget { const AcMode({ @@ -21,30 +22,20 @@ class AcMode extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(16), + return DeviceControlsContainer( child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - _buildIconContainer(context, TempModes.cold, Assets.freezing, - value == TempModes.cold), - _buildIconContainer( - context, TempModes.hot, Assets.acSun, value == TempModes.hot), - _buildIconContainer(context, TempModes.wind, Assets.acAirConditioner, - value == TempModes.wind), + _buildIconContainer(context, TempModes.cold, Assets.freezing, value == TempModes.cold), + _buildIconContainer(context, TempModes.hot, Assets.acSun, value == TempModes.hot), + _buildIconContainer(context, TempModes.wind, Assets.acAirConditioner, value == TempModes.wind), ], ), ); } - Widget _buildIconContainer( - BuildContext context, TempModes mode, String assetPath, bool isSelected) { + Widget _buildIconContainer(BuildContext context, TempModes mode, String assetPath, bool isSelected) { return Flexible( child: GestureDetector( onTap: () { diff --git a/lib/pages/device_managment/ac/view/control_list/ac_toggle.dart b/lib/pages/device_managment/ac/view/control_list/ac_toggle.dart index e709a6b4..4e81ec09 100644 --- a/lib/pages/device_managment/ac/view/control_list/ac_toggle.dart +++ b/lib/pages/device_managment/ac/view/control_list/ac_toggle.dart @@ -1,9 +1,9 @@ import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; @@ -25,13 +25,7 @@ class AcToggle extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(16), + return DeviceControlsContainer( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/pages/device_managment/ac/view/control_list/current_temp.dart b/lib/pages/device_managment/ac/view/control_list/current_temp.dart index 0327e357..7618846c 100644 --- a/lib/pages/device_managment/ac/view/control_list/current_temp.dart +++ b/lib/pages/device_managment/ac/view/control_list/current_temp.dart @@ -1,11 +1,13 @@ import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; import 'package:syncrow_web/pages/device_managment/shared/celciuse_symbol.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; import 'package:syncrow_web/pages/device_managment/shared/increament_decreament.dart'; import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; class CurrentTemp extends StatefulWidget { const CurrentTemp({ @@ -67,13 +69,7 @@ class _CurrentTempState extends State { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(16), + return DeviceControlsContainer( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -83,10 +79,7 @@ class _CurrentTempState extends State { children: [ Text( 'Current Temperature', - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith(color: Colors.grey), + style: Theme.of(context).textTheme.bodySmall!.copyWith(color: Colors.grey), ), const SizedBox( height: 5, @@ -94,14 +87,8 @@ class _CurrentTempState extends State { Row( children: [ Text( - (widget.currentTemp > 99 - ? widget.currentTemp / 10 - : widget.currentTemp) - .toString(), - style: Theme.of(context) - .textTheme - .bodySmall! - .copyWith(color: Colors.grey), + (widget.currentTemp > 99 ? widget.currentTemp / 10 : widget.currentTemp).toString(), + style: Theme.of(context).textTheme.bodySmall!.copyWith(color: Colors.grey), ), const CelsiusSymbol( color: Colors.grey, diff --git a/lib/pages/device_managment/ac/view/control_list/fan_speed.dart b/lib/pages/device_managment/ac/view/control_list/fan_speed.dart index 8612c689..952e112b 100644 --- a/lib/pages/device_managment/ac/view/control_list/fan_speed.dart +++ b/lib/pages/device_managment/ac/view/control_list/fan_speed.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; -import 'package:syncrow_web/utils/color_manager.dart'; -import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_bloc.dart'; import 'package:syncrow_web/pages/device_managment/ac/bloc/ac_event.dart'; +import 'package:syncrow_web/pages/device_managment/ac/model/ac_model.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/constants/assets.dart'; class FanSpeedControl extends StatelessWidget { const FanSpeedControl({ @@ -21,23 +22,15 @@ class FanSpeedControl extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(8), + return DeviceControlsContainer( child: Column( children: [ Wrap( runSpacing: 8, spacing: 8, children: [ - _buildIconContainer(context, FanSpeeds.auto, Assets.acFanAuto, - value == FanSpeeds.auto), - _buildIconContainer(context, FanSpeeds.low, Assets.acFanLow, - value == FanSpeeds.low), + _buildIconContainer(context, FanSpeeds.auto, Assets.acFanAuto, value == FanSpeeds.auto), + _buildIconContainer(context, FanSpeeds.low, Assets.acFanLow, value == FanSpeeds.low), ], ), const SizedBox(height: 8), @@ -45,10 +38,8 @@ class FanSpeedControl extends StatelessWidget { runSpacing: 8, spacing: 8, children: [ - _buildIconContainer(context, FanSpeeds.middle, Assets.acFanMiddle, - value == FanSpeeds.middle), - _buildIconContainer(context, FanSpeeds.high, Assets.acFanHigh, - value == FanSpeeds.high), + _buildIconContainer(context, FanSpeeds.middle, Assets.acFanMiddle, value == FanSpeeds.middle), + _buildIconContainer(context, FanSpeeds.high, Assets.acFanHigh, value == FanSpeeds.high), ], ) ], @@ -56,8 +47,7 @@ class FanSpeedControl extends StatelessWidget { ); } - Widget _buildIconContainer(BuildContext context, FanSpeeds speed, - String assetPath, bool isSelected) { + Widget _buildIconContainer(BuildContext context, FanSpeeds speed, String assetPath, bool isSelected) { return GestureDetector( onTap: () { context.read().add( diff --git a/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart b/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart index fc066335..5c35f9e9 100644 --- a/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart +++ b/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart @@ -6,8 +6,7 @@ import 'package:syncrow_web/services/devices_mang_api.dart'; part 'device_managment_event.dart'; part 'device_managment_state.dart'; -class DeviceManagementBloc - extends Bloc { +class DeviceManagementBloc extends Bloc { int _selectedIndex = 0; List _devices = []; int _onlineCount = 0; @@ -28,8 +27,7 @@ class DeviceManagementBloc on(_onUpdateSelection); } - Future _onFetchDevices( - FetchDevices event, Emitter emit) async { + Future _onFetchDevices(FetchDevices event, Emitter emit) async { emit(DeviceManagementLoading()); try { final devices = await DevicesManagementApi().fetchDevices(); @@ -51,8 +49,7 @@ class DeviceManagementBloc } } - void _onFilterDevices( - FilterDevices event, Emitter emit) async { + void _onFilterDevices(FilterDevices event, Emitter emit) async { if (_devices.isNotEmpty) { _filteredDevices = List.from(_devices.where((device) { switch (event.filter) { @@ -83,8 +80,7 @@ class DeviceManagementBloc } } - Future _onResetFilters( - ResetFilters event, Emitter emit) async { + Future _onResetFilters(ResetFilters event, Emitter emit) async { productName = ''; _selectedDevices.clear(); _filteredDevices = List.from(_devices); @@ -100,8 +96,7 @@ class DeviceManagementBloc )); } - void _onResetSelectedDevices( - ResetSelectedDevices event, Emitter emit) { + void _onResetSelectedDevices(ResetSelectedDevices event, Emitter emit) { _selectedDevices.clear(); if (state is DeviceManagementLoaded) { @@ -127,14 +122,12 @@ class DeviceManagementBloc } } - void _onSelectedFilterChanged( - SelectedFilterChanged event, Emitter emit) { + void _onSelectedFilterChanged(SelectedFilterChanged event, Emitter emit) { _selectedIndex = event.selectedIndex; add(FilterDevices(_getFilterFromIndex(_selectedIndex))); } - void _onSelectDevice( - SelectDevice event, Emitter emit) { + void _onSelectDevice(SelectDevice event, Emitter emit) { final selectedUuid = event.selectedDevice.uuid; if (_selectedDevices.any((device) => device.uuid == selectedUuid)) { @@ -145,8 +138,7 @@ class DeviceManagementBloc List clonedSelectedDevices = List.from(_selectedDevices); - bool isControlButtonEnabled = - _checkIfControlButtonEnabled(clonedSelectedDevices); + bool isControlButtonEnabled = _checkIfControlButtonEnabled(clonedSelectedDevices); if (state is DeviceManagementLoaded) { emit(DeviceManagementLoaded( @@ -155,8 +147,7 @@ class DeviceManagementBloc onlineCount: _onlineCount, offlineCount: _offlineCount, lowBatteryCount: _lowBatteryCount, - selectedDevice: - clonedSelectedDevices.isNotEmpty ? clonedSelectedDevices : null, + selectedDevice: clonedSelectedDevices.isNotEmpty ? clonedSelectedDevices : null, isControlButtonEnabled: isControlButtonEnabled, )); } else if (state is DeviceManagementFiltered) { @@ -166,15 +157,13 @@ class DeviceManagementBloc onlineCount: _onlineCount, offlineCount: _offlineCount, lowBatteryCount: _lowBatteryCount, - selectedDevice: - clonedSelectedDevices.isNotEmpty ? clonedSelectedDevices : null, + selectedDevice: clonedSelectedDevices.isNotEmpty ? clonedSelectedDevices : null, isControlButtonEnabled: isControlButtonEnabled, )); } } - void _onUpdateSelection( - UpdateSelection event, Emitter emit) { + void _onUpdateSelection(UpdateSelection event, Emitter emit) { List selectedDevices = []; List devicesToSelectFrom = []; @@ -217,8 +206,7 @@ class DeviceManagementBloc bool _checkIfControlButtonEnabled(List selectedDevices) { if (selectedDevices.length > 1) { - final productTypes = - selectedDevices.map((device) => device.productType).toSet(); + final productTypes = selectedDevices.map((device) => device.productType).toSet(); return productTypes.length == 1; } else if (selectedDevices.length == 1) { return true; @@ -229,10 +217,7 @@ class DeviceManagementBloc void _calculateDeviceCounts() { _onlineCount = _devices.where((device) => device.online == true).length; _offlineCount = _devices.where((device) => device.online == false).length; - _lowBatteryCount = _devices - .where((device) => - device.batteryLevel != null && device.batteryLevel! < 20) - .length; + _lowBatteryCount = _devices.where((device) => device.batteryLevel != null && device.batteryLevel! < 20).length; } String _getFilterFromIndex(int index) { @@ -248,8 +233,7 @@ class DeviceManagementBloc } } - void _onSearchDevices( - SearchDevices event, Emitter emit) { + void _onSearchDevices(SearchDevices event, Emitter emit) { if ((event.community == null || event.community!.isEmpty) && (event.unitName == null || event.unitName!.isEmpty) && (event.productName == null || event.productName!.isEmpty)) { @@ -263,38 +247,21 @@ class DeviceManagementBloc List devicesToSearch = _filteredDevices; if (devicesToSearch.isNotEmpty) { - _selectedDevices.clear(); - _selectedIndex = _selectedIndex; - final filteredDevices = devicesToSearch.where((device) { final matchesCommunity = event.community == null || event.community!.isEmpty || - (device.room?.name - ?.toLowerCase() - .contains(event.community!.toLowerCase()) ?? - false); + (device.room?.name?.toLowerCase().contains(event.community!.toLowerCase()) ?? false); final matchesUnit = event.unitName == null || event.unitName!.isEmpty || - (device.unit?.name - ?.toLowerCase() - .contains(event.unitName!.toLowerCase()) ?? - false); + (device.unit?.name?.toLowerCase().contains(event.unitName!.toLowerCase()) ?? false); final matchesProductName = event.productName == null || event.productName!.isEmpty || - (device.name - ?.toLowerCase() - .contains(event.productName!.toLowerCase()) ?? - false); + (device.name?.toLowerCase().contains(event.productName!.toLowerCase()) ?? false); final matchesDeviceName = event.productName == null || event.productName!.isEmpty || - (device.categoryName - ?.toLowerCase() - .contains(event.productName!.toLowerCase()) ?? - false); + (device.categoryName?.toLowerCase().contains(event.productName!.toLowerCase()) ?? false); - return matchesCommunity && - matchesUnit && - (matchesProductName || matchesDeviceName); + return matchesCommunity && matchesUnit && (matchesProductName || matchesDeviceName); }).toList(); emit(DeviceManagementFiltered( 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 21ed882c..2787c7b9 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,14 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/device_managment/shared/device_batch_control_dialog.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'; import 'package:syncrow_web/pages/device_managment/all_devices/bloc/device_managment_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; -import 'package:syncrow_web/pages/device_managment/shared/device_control_dialog.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/widgets/device_search_filters.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_batch_control_dialog.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_control_dialog.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; import 'package:syncrow_web/utils/format_date_time.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; import 'package:syncrow_web/utils/style.dart'; @@ -37,8 +37,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { offlineCount = state.offlineCount; lowBatteryCount = state.lowBatteryCount; isControlButtonEnabled = state.isControlButtonEnabled; - selectedDevices = - state.selectedDevice ?? context.read().selectedDevices; + selectedDevices = state.selectedDevice ?? []; } else if (state is DeviceManagementFiltered) { devicesToShow = state.filteredDevices; selectedIndex = state.selectedIndex; @@ -46,14 +45,12 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { offlineCount = state.offlineCount; lowBatteryCount = state.lowBatteryCount; isControlButtonEnabled = state.isControlButtonEnabled; - selectedDevices = - state.selectedDevice ?? context.read().selectedDevices; + selectedDevices = state.selectedDevice ?? []; } else if (state is DeviceManagementInitial) { devicesToShow = []; selectedIndex = 0; isControlButtonEnabled = false; } - final tabs = [ 'All', 'Online ($onlineCount)', @@ -66,8 +63,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { return Column( children: [ Container( - padding: - isLargeScreenSize(context) ? const EdgeInsets.all(30) : const EdgeInsets.all(15), + padding: isLargeScreenSize(context) ? const EdgeInsets.all(30) : const EdgeInsets.all(15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -98,8 +94,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { ), ); } else if (selectedDevices.length > 1) { - final productTypes = - selectedDevices.map((device) => device.productType).toSet(); + final productTypes = selectedDevices.map((device) => device.productType).toSet(); if (productTypes.length == 1) { showDialog( context: context, @@ -128,9 +123,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { ), Expanded( child: Padding( - padding: isLargeScreenSize(context) - ? const EdgeInsets.all(30) - : const EdgeInsets.all(15), + padding: isLargeScreenSize(context) ? const EdgeInsets.all(30) : const EdgeInsets.all(15), child: DynamicTable( withSelectAll: true, cellDecoration: containerDecoration, @@ -160,21 +153,16 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { device.unit?.name ?? '', device.room?.name ?? '', device.batteryLevel != null ? '${device.batteryLevel}%' : '-', - formatDateTime( - DateTime.fromMillisecondsSinceEpoch((device.createTime ?? 0) * 1000)), + formatDateTime(DateTime.fromMillisecondsSinceEpoch((device.createTime ?? 0) * 1000)), device.online == true ? 'Online' : 'Offline', - formatDateTime( - DateTime.fromMillisecondsSinceEpoch((device.updateTime ?? 0) * 1000)), + formatDateTime(DateTime.fromMillisecondsSinceEpoch((device.updateTime ?? 0) * 1000)), ]; }).toList(), onSelectionChanged: (selectedRows) { context.read().add(UpdateSelection(selectedRows)); }, - initialSelectedIds: context - .read() - .selectedDevices - .map((device) => device.uuid!) - .toList(), + initialSelectedIds: + context.read().selectedDevices.map((device) => device.uuid!).toList(), isEmpty: devicesToShow.isEmpty, ), ), diff --git a/lib/pages/device_managment/ceiling_sensor/bloc/bloc.dart b/lib/pages/device_managment/ceiling_sensor/bloc/bloc.dart index a2382ba6..22ac90d7 100644 --- a/lib/pages/device_managment/ceiling_sensor/bloc/bloc.dart +++ b/lib/pages/device_managment/ceiling_sensor/bloc/bloc.dart @@ -1,4 +1,5 @@ import 'dart:async'; + import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/event.dart'; @@ -23,12 +24,10 @@ class CeilingSensorBloc extends Bloc { on(_onFactoryReset); } - void _fetchCeilingSensorStatus( - CeilingInitialEvent event, Emitter emit) async { + void _fetchCeilingSensorStatus(CeilingInitialEvent event, Emitter emit) async { emit(CeilingLoadingInitialState()); try { - var response = - await DevicesManagementApi().getDeviceStatus(event.deviceId); + var response = await DevicesManagementApi().getDeviceStatus(event.deviceId); deviceStatus = CeilingSensorModel.fromJson(response.status); emit(CeilingUpdateState(ceilingSensorModel: deviceStatus)); // _listenToChanges(); @@ -57,8 +56,7 @@ class CeilingSensorBloc extends Bloc { // } catch (_) {} // } - void _changeValue( - CeilingChangeValueEvent event, Emitter emit) async { + void _changeValue(CeilingChangeValueEvent event, Emitter emit) async { emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus)); if (event.code == 'sensitivity') { deviceStatus.sensitivity = event.value; @@ -79,8 +77,7 @@ class CeilingSensorBloc extends Bloc { ); } - Future _onBatchControl( - CeilingBatchControlEvent event, Emitter emit) async { + Future _onBatchControl(CeilingBatchControlEvent event, Emitter emit) async { emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus)); if (event.code == 'sensitivity') { deviceStatus.sensitivity = event.value; @@ -123,11 +120,9 @@ class CeilingSensorBloc extends Bloc { try { late bool response; if (isBatch) { - response = await DevicesManagementApi() - .deviceBatchControl(deviceId, code, value); + response = await DevicesManagementApi().deviceBatchControl(deviceId, code, value); } else { - response = await DevicesManagementApi() - .deviceControl(deviceId, Status(code: code, value: value)); + response = await DevicesManagementApi().deviceControl(deviceId, Status(code: code, value: value)); } if (!response) { @@ -145,16 +140,17 @@ class CeilingSensorBloc extends Bloc { }); } - FutureOr _getDeviceReports(GetCeilingDeviceReportsEvent event, - Emitter emit) async { + FutureOr _getDeviceReports(GetCeilingDeviceReportsEvent event, Emitter emit) async { if (event.code.isEmpty) { emit(ShowCeilingDescriptionState(description: reportString)); return; } else { emit(CeilingReportsLoadingState()); + final from = DateTime.now().subtract(const Duration(days: 30)).millisecondsSinceEpoch; + final to = DateTime.now().millisecondsSinceEpoch; try { - await DevicesManagementApi.getDeviceReports(deviceId, event.code) + await DevicesManagementApi.getDeviceReportsByDate(deviceId, event.code, from.toString(), to.toString()) .then((value) { emit(CeilingReportsState(deviceReport: value)); }); @@ -165,23 +161,19 @@ class CeilingSensorBloc extends Bloc { } } - void _showDescription( - ShowCeilingDescriptionEvent event, Emitter emit) { + void _showDescription(ShowCeilingDescriptionEvent event, Emitter emit) { emit(ShowCeilingDescriptionState(description: event.description)); } - void _backToGridView( - BackToCeilingGridViewEvent event, Emitter emit) { + void _backToGridView(BackToCeilingGridViewEvent event, Emitter emit) { emit(CeilingUpdateState(ceilingSensorModel: deviceStatus)); } FutureOr _fetchCeilingSensorBatchControl( - CeilingFetchDeviceStatusEvent event, - Emitter emit) async { + CeilingFetchDeviceStatusEvent event, Emitter emit) async { emit(CeilingLoadingInitialState()); try { - var response = - await DevicesManagementApi().getBatchStatus(event.devicesIds); + var response = await DevicesManagementApi().getBatchStatus(event.devicesIds); deviceStatus = CeilingSensorModel.fromJson(response.status); emit(CeilingUpdateState(ceilingSensorModel: deviceStatus)); } catch (e) { @@ -190,8 +182,7 @@ class CeilingSensorBloc extends Bloc { } } - FutureOr _onFactoryReset( - CeilingFactoryResetEvent event, Emitter emit) async { + FutureOr _onFactoryReset(CeilingFactoryResetEvent event, Emitter emit) async { emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus)); try { final response = await DevicesManagementApi().factoryReset( diff --git a/lib/pages/device_managment/garage_door/widgets/schedule__garage_table.dart b/lib/pages/device_managment/garage_door/widgets/schedule__garage_table.dart index 48ebbcad..07cd9c7a 100644 --- a/lib/pages/device_managment/garage_door/widgets/schedule__garage_table.dart +++ b/lib/pages/device_managment/garage_door/widgets/schedule__garage_table.dart @@ -26,8 +26,7 @@ class ScheduleGarageTableWidget extends StatelessWidget { Table( border: TableBorder.all( color: ColorsManager.graysColor, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(20), topRight: Radius.circular(20)), + borderRadius: const BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20)), ), children: [ TableRow( @@ -51,21 +50,17 @@ class ScheduleGarageTableWidget extends StatelessWidget { BlocBuilder( builder: (context, state) { if (state is ScheduleGarageLoadingState) { - return const SizedBox( - height: 200, - child: Center(child: CircularProgressIndicator())); + return const SizedBox(height: 200, child: Center(child: CircularProgressIndicator())); } - if (state is GarageDoorLoadedState && - state.status.schedules == null) { + if (state is GarageDoorLoadedState && state.status.schedules?.isEmpty == true) { return _buildEmptyState(context); } else if (state is GarageDoorLoadedState) { return Container( height: 200, decoration: BoxDecoration( border: Border.all(color: ColorsManager.graysColor), - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(20), - bottomRight: Radius.circular(20)), + borderRadius: + const BorderRadius.only(bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20)), ), child: _buildTableBody(state, context)); } @@ -83,8 +78,7 @@ class ScheduleGarageTableWidget extends StatelessWidget { height: 200, decoration: BoxDecoration( border: Border.all(color: ColorsManager.graysColor), - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20)), + borderRadius: const BorderRadius.only(bottomLeft: Radius.circular(20), bottomRight: Radius.circular(20)), ), child: Center( child: Column( @@ -118,8 +112,7 @@ class ScheduleGarageTableWidget extends StatelessWidget { children: [ if (state.status.schedules != null) for (int i = 0; i < state.status.schedules!.length; i++) - _buildScheduleRow( - state.status.schedules![i], i, context, state), + _buildScheduleRow(state.status.schedules![i], i, context, state), ], ), ), @@ -141,8 +134,7 @@ class ScheduleGarageTableWidget extends StatelessWidget { ); } - TableRow _buildScheduleRow(ScheduleModel schedule, int index, - BuildContext context, GarageDoorLoadedState state) { + TableRow _buildScheduleRow(ScheduleModel schedule, int index, BuildContext context, GarageDoorLoadedState state) { return TableRow( children: [ Center( @@ -160,8 +152,7 @@ class ScheduleGarageTableWidget extends StatelessWidget { width: 24, height: 24, child: schedule.enable - ? const Icon(Icons.radio_button_checked, - color: ColorsManager.blueColor) + ? const Icon(Icons.radio_button_checked, color: ColorsManager.blueColor) : const Icon( Icons.radio_button_unchecked, color: ColorsManager.grayColor, @@ -169,9 +160,7 @@ class ScheduleGarageTableWidget extends StatelessWidget { ), ), ), - Center( - child: Text(_getSelectedDays( - ScheduleModel.parseSelectedDays(schedule.days)))), + Center(child: Text(_getSelectedDays(ScheduleModel.parseSelectedDays(schedule.days)))), Center(child: Text(formatIsoStringToTime(schedule.time, context))), Center(child: Text(schedule.function.value ? 'On' : 'Off')), Center( @@ -181,24 +170,18 @@ class ScheduleGarageTableWidget extends StatelessWidget { TextButton( style: TextButton.styleFrom(padding: EdgeInsets.zero), onPressed: () { - GarageDoorDialogHelper.showAddGarageDoorScheduleDialog( - context, - schedule: schedule, - index: index, - isEdit: true); + GarageDoorDialogHelper.showAddGarageDoorScheduleDialog(context, + schedule: schedule, index: index, isEdit: true); }, child: Text( 'Edit', - style: context.textTheme.bodySmall! - .copyWith(color: ColorsManager.blueColor), + style: context.textTheme.bodySmall!.copyWith(color: ColorsManager.blueColor), ), ), TextButton( style: TextButton.styleFrom(padding: EdgeInsets.zero), onPressed: () { - context - .read() - .add(DeleteGarageDoorScheduleEvent( + context.read().add(DeleteGarageDoorScheduleEvent( index: index, scheduleId: schedule.scheduleId, deviceId: state.status.uuid, @@ -206,8 +189,7 @@ class ScheduleGarageTableWidget extends StatelessWidget { }, child: Text( 'Delete', - style: context.textTheme.bodySmall! - .copyWith(color: ColorsManager.blueColor), + style: context.textTheme.bodySmall!.copyWith(color: ColorsManager.blueColor), ), ), ], diff --git a/lib/pages/device_managment/gateway/bloc/gate_way_bloc.dart b/lib/pages/device_managment/gateway/bloc/gate_way_bloc.dart index f4c16ba0..e14672ae 100644 --- a/lib/pages/device_managment/gateway/bloc/gate_way_bloc.dart +++ b/lib/pages/device_managment/gateway/bloc/gate_way_bloc.dart @@ -16,12 +16,10 @@ class GateWayBloc extends Bloc { on(_onFactoryReset); } - FutureOr _getGatWayById( - GatWayById event, Emitter emit) async { + FutureOr _getGatWayById(GatWayById event, Emitter emit) async { emit(GatewayLoadingState()); try { - List devicesList = - await DevicesManagementApi.getDevicesByGatewayId(event.getWayId); + List devicesList = await DevicesManagementApi.getDevicesByGatewayId(event.getWayId); emit(UpdateGatewayState(list: devicesList)); } catch (e) { @@ -30,8 +28,7 @@ class GateWayBloc extends Bloc { } } - FutureOr _onFactoryReset( - GateWayFactoryReset event, Emitter emit) async { + FutureOr _onFactoryReset(GateWayFactoryReset event, Emitter emit) async { emit(GatewayLoadingState()); try { final response = await DevicesManagementApi().factoryReset( diff --git a/lib/pages/device_managment/gateway/view/gateway_view.dart b/lib/pages/device_managment/gateway/view/gateway_view.dart index ce9b06da..2bfc6822 100644 --- a/lib/pages/device_managment/gateway/view/gateway_view.dart +++ b/lib/pages/device_managment/gateway/view/gateway_view.dart @@ -74,7 +74,7 @@ class _DeviceItem extends StatelessWidget { padding: const EdgeInsets.all(8), color: ColorsManager.whiteColors, child: SvgPicture.asset( - device.icon, + device.icon ?? 'assets/icons/gateway.svg', width: 35, height: 35, fit: BoxFit.contain, diff --git a/lib/pages/device_managment/shared/device_controls_container.dart b/lib/pages/device_managment/shared/device_controls_container.dart index 158b43cf..4f1dea59 100644 --- a/lib/pages/device_managment/shared/device_controls_container.dart +++ b/lib/pages/device_managment/shared/device_controls_container.dart @@ -2,15 +2,17 @@ import 'package:flutter/material.dart'; import 'package:syncrow_web/utils/color_manager.dart'; class DeviceControlsContainer extends StatelessWidget { - const DeviceControlsContainer({required this.child, super.key}); + const DeviceControlsContainer({required this.child, this.padding, super.key}); final Widget child; + final double? padding; @override Widget build(BuildContext context) { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(20), - color: ColorsManager.grayColor.withOpacity(0.2), + color: ColorsManager.greyColor.withOpacity(0.2), + // boxShadow: [ // BoxShadow( // color: ColorsManager.blackColor.withOpacity(0.05), @@ -19,7 +21,7 @@ class DeviceControlsContainer extends StatelessWidget { // spreadRadius: 0) // ], ), - padding: const EdgeInsets.all(12), + padding: EdgeInsets.all(padding ?? 12), child: child, ); } diff --git a/lib/pages/device_managment/shared/toggle_widget.dart b/lib/pages/device_managment/shared/toggle_widget.dart index 942c1b32..ad0ba8ad 100644 --- a/lib/pages/device_managment/shared/toggle_widget.dart +++ b/lib/pages/device_managment/shared/toggle_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart'; @@ -30,13 +31,7 @@ class ToggleWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: ColorsManager.greyColor.withOpacity(0.2), - border: Border.all(color: ColorsManager.boxDivider), - ), - padding: const EdgeInsets.all(16), + return DeviceControlsContainer( child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/visitor_password/model/device_model.dart b/lib/pages/visitor_password/model/device_model.dart index 6d1c714d..c357da52 100644 --- a/lib/pages/visitor_password/model/device_model.dart +++ b/lib/pages/visitor_password/model/device_model.dart @@ -1,6 +1,6 @@ +import 'package:syncrow_web/utils/constants/app_enum.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/enum/device_types.dart'; -import 'package:syncrow_web/utils/constants/app_enum.dart'; class DeviceModel { dynamic productUuid; @@ -51,7 +51,6 @@ class DeviceModel { factory DeviceModel.fromJson(Map json) { String tempIcon = ''; DeviceType type = devicesTypesMap[json['productType']] ?? DeviceType.Other; - if (type == DeviceType.LightBulb) { tempIcon = Assets.lightBulb; } else if (type == DeviceType.CeilingSensor || type == DeviceType.WallSensor) { @@ -66,9 +65,16 @@ class DeviceModel { tempIcon = Assets.gangSwitch; } else if (type == DeviceType.Gateway) { tempIcon = Assets.gateway; + } else if (type == DeviceType.OneGang) { + tempIcon = Assets.oneGang; + } else if (type == DeviceType.TwoGang) { + tempIcon = Assets.twoGang; + } else if (type == DeviceType.WH) { + tempIcon = Assets.waterHeater; } else { - tempIcon = Assets.logo; + tempIcon = Assets.blackLogo; } + return DeviceModel( productUuid: json['productUuid'], productType: json['productType'], diff --git a/lib/services/devices_mang_api.dart b/lib/services/devices_mang_api.dart index b22eedbb..dc0af9a8 100644 --- a/lib/services/devices_mang_api.dart +++ b/lib/services/devices_mang_api.dart @@ -68,8 +68,7 @@ class DevicesManagementApi { } } - Future deviceBatchControl( - List uuids, String code, dynamic value) async { + Future deviceBatchControl(List uuids, String code, dynamic value) async { try { final body = { 'devicesUuid': uuids, @@ -93,8 +92,7 @@ class DevicesManagementApi { } } - static Future> getDevicesByGatewayId( - String gatewayId) async { + static Future> getDevicesByGatewayId(String gatewayId) async { final response = await HTTPService().get( path: ApiEndpoints.gatewayApi.replaceAll('{gatewayUuid}', gatewayId), showServerMessage: false, @@ -128,9 +126,7 @@ class DevicesManagementApi { String code, ) async { final response = await HTTPService().get( - path: ApiEndpoints.getDeviceLogs - .replaceAll('{uuid}', uuid) - .replaceAll('{code}', code), + path: ApiEndpoints.getDeviceLogs.replaceAll('{uuid}', uuid).replaceAll('{code}', code), showServerMessage: false, expectedResponseModel: (json) { return DeviceReport.fromJson(json); @@ -139,8 +135,7 @@ class DevicesManagementApi { return response; } - static Future getDeviceReportsByDate(String uuid, String code, - [String? from, String? to]) async { + static Future getDeviceReportsByDate(String uuid, String code, [String? from, String? to]) async { final response = await HTTPService().get( path: ApiEndpoints.getDeviceLogsByDate .replaceAll('{uuid}', uuid) @@ -179,8 +174,7 @@ class DevicesManagementApi { } } - Future addScheduleRecord( - ScheduleEntry sendSchedule, String uuid) async { + Future addScheduleRecord(ScheduleEntry sendSchedule, String uuid) async { try { final response = await HTTPService().post( path: ApiEndpoints.scheduleByDeviceId.replaceAll('{deviceUuid}', uuid), @@ -197,13 +191,10 @@ class DevicesManagementApi { } } - Future> getDeviceSchedules( - String uuid, String category) async { + Future> getDeviceSchedules(String uuid, String category) async { try { final response = await HTTPService().get( - path: ApiEndpoints.getScheduleByDeviceId - .replaceAll('{deviceUuid}', uuid) - .replaceAll('{category}', category), + path: ApiEndpoints.getScheduleByDeviceId.replaceAll('{deviceUuid}', uuid).replaceAll('{category}', category), showServerMessage: true, expectedResponseModel: (json) { List schedules = []; @@ -220,10 +211,7 @@ class DevicesManagementApi { } } - Future updateScheduleRecord( - {required bool enable, - required String uuid, - required String scheduleId}) async { + Future updateScheduleRecord({required bool enable, required String uuid, required String scheduleId}) async { try { final response = await HTTPService().put( path: ApiEndpoints.updateScheduleByDeviceId diff --git a/lib/utils/constants/assets.dart b/lib/utils/constants/assets.dart index 05ef096e..4ac64bb6 100644 --- a/lib/utils/constants/assets.dart +++ b/lib/utils/constants/assets.dart @@ -13,12 +13,10 @@ class Assets { static const String rightLine = "assets/images/right_line.png"; static const String google = "assets/images/google.svg"; static const String facebook = "assets/images/facebook.svg"; - static const String invisiblePassword = - "assets/images/Password_invisible.svg"; + static const String invisiblePassword = "assets/images/Password_invisible.svg"; static const String visiblePassword = "assets/images/password_visible.svg"; static const String accessIcon = "assets/images/access_icon.svg"; - static const String spaseManagementIcon = - "assets/images/spase_management_icon.svg"; + static const String spaseManagementIcon = "assets/images/spase_management_icon.svg"; static const String devicesIcon = "assets/images/devices_icon.svg"; static const String moveinIcon = "assets/images/movein_icon.svg"; static const String constructionIcon = "assets/images/construction_icon.svg"; @@ -31,15 +29,13 @@ class Assets { static const String emptyTable = "assets/images/empty_table.svg"; // General assets - static const String motionlessDetection = - "assets/icons/motionless_detection.svg"; + static const String motionlessDetection = "assets/icons/motionless_detection.svg"; static const String acHeating = "assets/icons/ac_heating.svg"; static const String acPowerOff = "assets/icons/ac_power_off.svg"; static const String acFanMiddle = "assets/icons/ac_fan_middle.svg"; static const String switchAlarmSound = "assets/icons/switch_alarm_sound.svg"; static const String resetOff = "assets/icons/reset_off.svg"; - static const String sensitivityOperationIcon = - "assets/icons/sesitivity_operation_icon.svg"; + static const String sensitivityOperationIcon = "assets/icons/sesitivity_operation_icon.svg"; static const String motionDetection = "assets/icons/motion_detection.svg"; static const String freezing = "assets/icons/freezing.svg"; static const String indicator = "assets/icons/indicator.svg"; @@ -60,56 +56,35 @@ class Assets { static const String celsiusDegrees = "assets/icons/celsius_degrees.svg"; static const String masterState = "assets/icons/master_state.svg"; static const String acPower = "assets/icons/ac_power.svg"; - static const String farDetectionFunction = - "assets/icons/far_detection_function.svg"; + static const String farDetectionFunction = "assets/icons/far_detection_function.svg"; static const String nobodyTime = "assets/icons/nobody_time.svg"; // Automation functions - static const String tempPasswordUnlock = - "assets/icons/automation_functions/temp_password_unlock.svg"; - static const String doorlockNormalOpen = - "assets/icons/automation_functions/doorlock_normal_open.svg"; - static const String doorbell = - "assets/icons/automation_functions/doorbell.svg"; - static const String remoteUnlockViaApp = - "assets/icons/automation_functions/remote_unlock_via_app.svg"; - static const String doubleLock = - "assets/icons/automation_functions/double_lock.svg"; - static const String selfTestResult = - "assets/icons/automation_functions/self_test_result.svg"; - static const String lockAlarm = - "assets/icons/automation_functions/lock_alarm.svg"; - static const String presenceState = - "assets/icons/automation_functions/presence_state.svg"; - static const String currentTemp = - "assets/icons/automation_functions/current_temp.svg"; - static const String presence = - "assets/icons/automation_functions/presence.svg"; - static const String residualElectricity = - "assets/icons/automation_functions/residual_electricity.svg"; - static const String hijackAlarm = - "assets/icons/automation_functions/hijack_alarm.svg"; - static const String passwordUnlock = - "assets/icons/automation_functions/password_unlock.svg"; - static const String remoteUnlockRequest = - "assets/icons/automation_functions/remote_unlock_req.svg"; - static const String cardUnlock = - "assets/icons/automation_functions/card_unlock.svg"; + static const String tempPasswordUnlock = "assets/icons/automation_functions/temp_password_unlock.svg"; + static const String doorlockNormalOpen = "assets/icons/automation_functions/doorlock_normal_open.svg"; + static const String doorbell = "assets/icons/automation_functions/doorbell.svg"; + static const String remoteUnlockViaApp = "assets/icons/automation_functions/remote_unlock_via_app.svg"; + static const String doubleLock = "assets/icons/automation_functions/double_lock.svg"; + static const String selfTestResult = "assets/icons/automation_functions/self_test_result.svg"; + static const String lockAlarm = "assets/icons/automation_functions/lock_alarm.svg"; + static const String presenceState = "assets/icons/automation_functions/presence_state.svg"; + static const String currentTemp = "assets/icons/automation_functions/current_temp.svg"; + static const String presence = "assets/icons/automation_functions/presence.svg"; + static const String residualElectricity = "assets/icons/automation_functions/residual_electricity.svg"; + static const String hijackAlarm = "assets/icons/automation_functions/hijack_alarm.svg"; + static const String passwordUnlock = "assets/icons/automation_functions/password_unlock.svg"; + static const String remoteUnlockRequest = "assets/icons/automation_functions/remote_unlock_req.svg"; + static const String cardUnlock = "assets/icons/automation_functions/card_unlock.svg"; static const String motion = "assets/icons/automation_functions/motion.svg"; - static const String fingerprintUnlock = - "assets/icons/automation_functions/fingerprint_unlock.svg"; + static const String fingerprintUnlock = "assets/icons/automation_functions/fingerprint_unlock.svg"; // Presence Sensor Assets static const String sensorMotionIcon = "assets/icons/sensor_motion_ic.svg"; - static const String sensorPresenceIcon = - "assets/icons/sensor_presence_ic.svg"; + static const String sensorPresenceIcon = "assets/icons/sensor_presence_ic.svg"; static const String sensorVacantIcon = "assets/icons/sensor_vacant_ic.svg"; - static const String illuminanceRecordIcon = - "assets/icons/illuminance_record_ic.svg"; - static const String presenceRecordIcon = - "assets/icons/presence_record_ic.svg"; - static const String helpDescriptionIcon = - "assets/icons/help_description_ic.svg"; + static const String illuminanceRecordIcon = "assets/icons/illuminance_record_ic.svg"; + static const String presenceRecordIcon = "assets/icons/presence_record_ic.svg"; + static const String helpDescriptionIcon = "assets/icons/help_description_ic.svg"; static const String lightPulp = "assets/icons/light_pulb.svg"; static const String acDevice = "assets/icons/ac_device.svg"; @@ -183,9 +158,14 @@ class Assets { //assets/icons/water_leak_normal.svg static const String waterLeakNormal = 'assets/icons/water_leak_normal.svg'; //assets/icons/water_leak_detected.svg - static const String waterLeakDetected = - 'assets/icons/water_leak_detected.svg'; + static const String waterLeakDetected = 'assets/icons/water_leak_detected.svg'; //assets/icons/automation_records.svg static const String automationRecords = 'assets/icons/automation_records.svg'; + + //assets/icons/1gang.svg + static const String oneGang = 'assets/icons/1gang.svg'; + + //assets/icons/2gang.svg + static const String twoGang = 'assets/icons/2gang.svg'; } diff --git a/lib/utils/enum/device_types.dart b/lib/utils/enum/device_types.dart index 94821ef6..9ddead07 100644 --- a/lib/utils/enum/device_types.dart +++ b/lib/utils/enum/device_types.dart @@ -4,10 +4,13 @@ enum DeviceType { DoorLock, Curtain, Blind, + OneGang, + TwoGang, ThreeGang, Gateway, CeilingSensor, WallSensor, + WH, Other, } @@ -18,4 +21,8 @@ Map devicesTypesMap = { "DL": DeviceType.DoorLock, "WPS": DeviceType.WallSensor, "3G": DeviceType.ThreeGang, + "2G": DeviceType.TwoGang, + "1G": DeviceType.OneGang, + "CUR": DeviceType.Curtain, + "WH": DeviceType.WH, };