push water heater batch control view

This commit is contained in:
ashrafzarkanisala
2024-09-23 08:32:49 +03:00
parent b5eeeedcd2
commit 0c530e9ea6
7 changed files with 217 additions and 18 deletions

View File

@ -0,0 +1,22 @@
<svg width="25" height="36" viewBox="0 0 25 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.67036 31.6755C9.37913 31.6755 9.14303 31.9116 9.14303 32.2029V33.5343C9.14303 34.3122 8.5101 34.9452 7.73219 34.9452H6.41014C6.11891 34.9452 5.88281 35.1813 5.88281 35.4725C5.88281 35.7637 6.11891 35.9998 6.41014 35.9998H7.73219C9.09163 35.9998 10.1977 34.8938 10.1977 33.5343V32.2029C10.1977 31.9116 9.96158 31.6755 9.67036 31.6755Z" fill="#72BBFF"/>
<path d="M10.6115 29.458H8.7285C8.43727 29.458 8.20117 29.6941 8.20117 29.9853V31.2785C8.20117 32.0885 8.86012 32.7473 9.67002 32.7473C10.4799 32.7473 11.1389 32.0884 11.1389 31.2785V29.9853C11.1389 29.6941 10.9028 29.458 10.6115 29.458Z" fill="#6B717D"/>
<path d="M14.4785 31.6755C14.7697 31.6755 15.0058 31.9116 15.0058 32.2029V33.5343C15.0058 34.3122 15.6388 34.9452 16.4167 34.9452H17.7387C18.0299 34.9452 18.266 35.1813 18.266 35.4725C18.266 35.7637 18.0299 35.9998 17.7387 35.9998H16.4167C15.0572 35.9998 13.9512 34.8938 13.9512 33.5343V32.2029C13.9512 31.9116 14.1873 31.6755 14.4785 31.6755Z" fill="#FF6C6C"/>
<path d="M13.5371 29.4583H15.4201C15.7114 29.4583 15.9475 29.6944 15.9475 29.9856V31.2787C15.9475 32.0887 15.2885 32.7476 14.4786 32.7476C13.6687 32.7476 13.0098 32.0886 13.0098 31.2787V29.9856C13.0098 29.6944 13.2459 29.4583 13.5371 29.4583Z" fill="#6B717D"/>
<path d="M2.14594 3.29248H0.527327C0.236102 3.29248 0 3.52858 0 3.81981C0 4.11103 0.236102 4.34714 0.527327 4.34714H2.14594C2.43717 4.34714 2.67327 4.11103 2.67327 3.81981C2.67327 3.52858 2.43717 3.29248 2.14594 3.29248Z" fill="#6B717D"/>
<path d="M2.14594 5.75342H0.527327C0.236102 5.75342 0 5.98952 0 6.28075C0 6.57197 0.236102 6.80807 0.527327 6.80807H2.14594C2.43717 6.80807 2.67327 6.57197 2.67327 6.28075C2.67327 5.98952 2.43717 5.75342 2.14594 5.75342Z" fill="#6B717D"/>
<path d="M23.6186 17.7485H22C21.7088 17.7485 21.4727 17.9846 21.4727 18.2759C21.4727 18.5671 21.7088 18.8032 22 18.8032H23.6186C23.9098 18.8032 24.1459 18.5671 24.1459 18.2759C24.1459 17.9846 23.9098 17.7485 23.6186 17.7485Z" fill="#6B717D"/>
<path d="M19.5902 27.5019V29.9663C19.5902 30.2574 19.354 30.4936 19.0629 30.4936H5.08592C4.79484 30.4936 4.55859 30.2574 4.55859 29.9663V27.5019C4.55859 27.2109 4.79484 26.9746 5.08592 26.9746H19.0629C19.354 26.9746 19.5902 27.2109 19.5902 27.5019Z" fill="#D6EAEC"/>
<path d="M19.5898 27.5019V29.9663C19.5898 30.2574 19.3535 30.4936 19.0624 30.4936H16.9531C17.2442 30.4936 17.4805 30.2574 17.4805 29.9663V27.5019C17.4805 27.2109 17.2442 26.9746 16.9531 26.9746H19.0624C19.3535 26.9746 19.5898 27.2109 19.5898 27.5019Z" fill="#B5D9DD"/>
<path d="M22.5287 1.66214V22.3242L20.4194 22.8994L12.0736 25.1767L1.61914 22.3242V1.66214C1.61914 0.745289 2.36443 0 3.28128 0H20.8666C21.7827 0 22.5287 0.745289 22.5287 1.66214Z" fill="#D6EAEC"/>
<path d="M22.5273 1.66214V22.3242L20.418 22.8994V1.66214C20.418 0.745289 19.672 0 18.7559 0H20.8652C21.7813 0 22.5273 0.745289 22.5273 1.66214Z" fill="#B5D9DD"/>
<path d="M22.5287 22.3242V26.3671C22.5287 27.2839 21.7827 28.0292 20.8666 28.0292H3.28128C2.36443 28.0292 1.61914 27.2839 1.61914 26.3671V22.3242H22.5287Z" fill="#6B717D"/>
<path d="M22.5273 22.3242V26.3671C22.5273 27.2839 21.7813 28.0292 20.8652 28.0292H18.7559C19.672 28.0292 20.418 27.2839 20.418 26.3671V22.3242H22.5273Z" fill="#47505E"/>
<path d="M12.43 13.9283C12.2285 13.744 11.9196 13.744 11.7181 13.9283C11.6376 14.0019 9.74805 15.7519 9.74805 17.6083C9.74805 18.8909 10.7915 19.9344 12.0741 19.9344C13.3567 19.9344 14.4001 18.8909 14.4001 17.6083C14.4 15.7519 12.5104 14.0019 12.43 13.9283Z" fill="#72BBFF"/>
<path d="M16.1576 8.85955C17.0908 6.60807 16.0222 4.02635 13.7707 3.0931C11.5192 2.15986 8.93748 3.2285 8.00424 5.47998C7.071 7.73146 8.13964 10.3132 10.3911 11.2464C12.6426 12.1797 15.2243 11.111 16.1576 8.85955Z" fill="#B5D9DD"/>
<path d="M14.7283 7.16982C14.7283 9.02109 13.9254 10.5271 12.0741 10.5271C11.7957 10.5271 11.525 10.4927 11.2655 10.428C9.80379 10.0659 8.7168 8.74266 8.7168 7.16982C8.7168 5.59698 9.80379 4.27374 11.2655 3.91164C11.525 3.84695 11.7957 3.8125 12.0741 3.8125C13.9254 3.8125 14.7283 5.31855 14.7283 7.16982Z" fill="white"/>
<path d="M15.4315 7.16982C15.4315 9.02109 13.9255 10.5271 12.0742 10.5271C11.7958 10.5271 11.5251 10.4927 11.2656 10.428C12.7274 10.0659 13.8144 8.74266 13.8144 7.16982C13.8144 5.59698 12.7274 4.27374 11.2656 3.91164C11.5251 3.84695 11.7958 3.8125 12.0742 3.8125C13.9255 3.8125 15.4315 5.31855 15.4315 7.16982Z" fill="#D6EAEC"/>
<path d="M12.4478 6.79706C12.2418 6.59105 11.908 6.59112 11.7021 6.79706L10.5783 7.92094C10.3723 8.12688 10.3723 8.4608 10.5783 8.66667C10.6812 8.76961 10.8162 8.82115 10.9512 8.82115C11.0861 8.82115 11.2211 8.76968 11.324 8.66667L12.4478 7.5428C12.6538 7.33685 12.6538 7.00294 12.4478 6.79706Z" fill="#FF6C6C"/>
<path d="M5.55469 25.7041C5.84593 25.7041 6.08203 25.468 6.08203 25.1768C6.08203 24.8855 5.84593 24.6494 5.55469 24.6494C5.26344 24.6494 5.02734 24.8855 5.02734 25.1768C5.02734 25.468 5.26344 25.7041 5.55469 25.7041Z" fill="#47505E"/>
<path d="M18.5918 25.7041C18.883 25.7041 19.1191 25.468 19.1191 25.1768C19.1191 24.8855 18.883 24.6494 18.5918 24.6494C18.3006 24.6494 18.0645 24.8855 18.0645 25.1768C18.0645 25.468 18.3006 25.7041 18.5918 25.7041Z" fill="#47505E"/>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -20,6 +20,7 @@ import 'package:syncrow_web/pages/device_managment/two_gang_switch/view/wall_lig
import 'package:syncrow_web/pages/device_managment/two_gang_switch/view/wall_light_device_control.dart';
import 'package:syncrow_web/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart';
import 'package:syncrow_web/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart';
import 'package:syncrow_web/pages/device_managment/water_heater/view/water_heater_batch_control.dart';
import 'package:syncrow_web/pages/device_managment/water_heater/view/water_heater_device_control.dart';
mixin RouteControlsBasedCode {
@ -56,7 +57,7 @@ mixin RouteControlsBasedCode {
case 'AC':
return AcDeviceControlsView(device: device);
case 'WH':
return WaterHeaterDeviceControl(
return WaterHeaterDeviceControlView(
device: device,
);
case 'DS':
@ -140,6 +141,14 @@ mixin RouteControlsBasedCode {
.where((e) => (e.productType == 'AC'))
.map((e) => e.uuid!)
.toList());
case 'WH':
return WaterHEaterBatchControlView(
deviceIds: devices
.where((e) => (e.productType == 'WH'))
.map((e) => e.uuid!)
.toList(),
);
default:
return const SizedBox();
}

View File

@ -17,6 +17,8 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
WaterHeaterBloc() : super(WaterHeaterInitial()) {
on<WaterHeaterFetchStatusEvent>(_fetchWaterHeaterStatus);
on<ToggleWaterHeaterEvent>(_controlWaterHeater);
on<FetchWaterHeaterBatchStatusEvent>(_batchFetchWaterHeater);
on<ControlWaterHeaterBatchEvent>(_batchControlWaterHeater);
on<UpdateScheduleEvent>(_updateScheduleEvent);
on<StopScheduleEvent>(_stopScheduleEvent);
on<DecrementCountdownEvent>(_onDecrementCountdown);
@ -145,6 +147,7 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
value: event.value,
oldValue: oldValue,
emit: emit,
isBatch: false,
);
if (success) {
@ -395,19 +398,29 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
// }
Future<bool> _runDebounce({
required String deviceId,
required dynamic deviceId,
required String code,
required dynamic value,
required dynamic oldValue,
required Emitter<WaterHeaterState> emit,
required bool isBatch,
}) async {
try {
late bool status;
await Future.delayed(const Duration(milliseconds: 500));
final status = await DevicesManagementApi().deviceControl(
if (isBatch) {
status = await DevicesManagementApi().deviceBatchControl(
deviceId,
code,
value,
);
} else {
status = await DevicesManagementApi().deviceControl(
deviceId,
Status(code: code, value: value),
);
}
if (!status) {
_revertValue(code, oldValue, emit.call);
@ -580,4 +593,54 @@ class WaterHeaterBloc extends Bloc<WaterHeaterEvent, WaterHeaterState> {
}
}
}
FutureOr<void> _batchFetchWaterHeater(FetchWaterHeaterBatchStatusEvent event,
Emitter<WaterHeaterState> emit) async {
emit(WaterHeaterLoadingState());
try {
final status =
await DevicesManagementApi().getBatchStatus(event.devicesUuid);
deviceStatus = WaterHeaterStatusModel.fromJson(
event.devicesUuid.first, status.status);
emit(WaterHeaterDeviceStatusLoaded(deviceStatus));
} catch (e) {
emit(WaterHeaterDeviceStatusLoaded(deviceStatus));
}
}
FutureOr<void> _batchControlWaterHeater(ControlWaterHeaterBatchEvent event,
Emitter<WaterHeaterState> emit) async {
if (state is WaterHeaterDeviceStatusLoaded) {
final currentState = state as WaterHeaterDeviceStatusLoaded;
final oldValue = _getValueByCode(event.code);
_updateLocalValue(event.code, event.value);
emit(currentState.copyWith(
status: deviceStatus,
));
final success = await _runDebounce(
deviceId: event.devicesUuid,
code: event.code,
value: event.value,
oldValue: oldValue,
emit: emit,
isBatch: true,
);
if (success) {
if (event.code == "switch_1") {
emit(currentState.copyWith(
status: deviceStatus,
));
}
} else {
_updateLocalValue(event.code, oldValue);
}
}
}
}

View File

@ -52,15 +52,6 @@ final class WaterHeaterFetchStatusEvent extends WaterHeaterEvent {
List<Object?> get props => [deviceId];
}
final class WaterHeaterFetchBatchStatusEvent extends WaterHeaterEvent {
final String deviceId;
const WaterHeaterFetchBatchStatusEvent(this.deviceId);
@override
List<Object?> get props => [deviceId];
}
final class DecrementCountdownEvent extends WaterHeaterEvent {}
final class AddScheduleEvent extends WaterHeaterEvent {
@ -106,7 +97,8 @@ final class UpdateScheduleEntryEvent extends WaterHeaterEvent {
});
@override
List<Object?> get props => [category, functionOn, deviceId, scheduleId, index];
List<Object?> get props =>
[category, functionOn, deviceId, scheduleId, index];
}
class GetSchedulesEvent extends WaterHeaterEvent {
@ -165,3 +157,26 @@ class UpdateFunctionOnEvent extends WaterHeaterEvent {
@override
List<Object?> get props => [isOn];
}
class FetchWaterHeaterBatchStatusEvent extends WaterHeaterEvent {
final List<String> devicesUuid;
const FetchWaterHeaterBatchStatusEvent({required this.devicesUuid});
@override
List<Object?> get props => [devicesUuid];
}
class ControlWaterHeaterBatchEvent extends WaterHeaterEvent {
final List<String> devicesUuid;
final String code;
final dynamic value;
const ControlWaterHeaterBatchEvent({
required this.devicesUuid,
required this.code,
required this.value,
});
@override
List<Object?> get props => [devicesUuid, code, value];
}

View File

@ -0,0 +1,87 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/device_managment/shared/batch_control/factory_reset.dart';
import 'package:syncrow_web/pages/device_managment/shared/batch_control/firmware_update.dart';
import 'package:syncrow_web/pages/device_managment/shared/toggle_widget.dart';
import 'package:syncrow_web/pages/device_managment/water_heater/bloc/water_heater_bloc.dart';
import 'package:syncrow_web/pages/device_managment/water_heater/models/water_heater_status_model.dart';
import 'package:syncrow_web/utils/constants/assets.dart';
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart';
class WaterHEaterBatchControlView extends StatelessWidget
with HelperResponsiveLayout {
const WaterHEaterBatchControlView({super.key, required this.deviceIds});
final List<String> deviceIds;
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => WaterHeaterBloc()
..add(FetchWaterHeaterBatchStatusEvent(devicesUuid: deviceIds)),
child: BlocBuilder<WaterHeaterBloc, WaterHeaterState>(
builder: (context, state) {
if (state is WaterHeaterLoadingState) {
return const Center(child: CircularProgressIndicator());
} else if (state is WaterHeaterDeviceStatusLoaded) {
return _buildStatusControls(context, state.status);
} else if (state is WaterHeaterBatchFailedState) {
return const Center(child: Text('Error fetching status'));
} else {
return const Center(child: CircularProgressIndicator());
}
},
),
);
}
Widget _buildStatusControls(
BuildContext context, WaterHeaterStatusModel status) {
final isExtraLarge = isExtraLargeScreenSize(context);
final isLarge = isLargeScreenSize(context);
final isMedium = isMediumScreenSize(context);
return SizedBox(
child: GridView(
padding: const EdgeInsets.symmetric(horizontal: 50),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: isLarge || isExtraLarge
? 3
: isMedium
? 2
: 1,
mainAxisExtent: 140,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
),
children: [
ToggleWidget(
value: status.heaterSwitch,
code: 'switch_1',
deviceId: deviceIds.first,
label: 'Water Heater',
icon: Assets.waterHeater,
onChange: (value) {
context.read<WaterHeaterBloc>().add(
ControlWaterHeaterBatchEvent(
devicesUuid: deviceIds,
code: 'switch_1',
value: value,
),
);
},
),
FirmwareUpdateWidget(
deviceId: deviceIds.first,
version: 12,
),
FactoryResetWidget(
callFactoryReset: () {},
),
],
),
);
}
}

View File

@ -12,9 +12,9 @@ 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 WaterHeaterDeviceControl extends StatelessWidget
class WaterHeaterDeviceControlView extends StatelessWidget
with HelperResponsiveLayout {
const WaterHeaterDeviceControl({super.key, required this.device});
const WaterHeaterDeviceControlView({super.key, required this.device});
final AllDevicesModel device;

View File

@ -163,4 +163,7 @@ class Assets {
//assets/icons/open_close_records.svg
static const String openCloseRecords = 'assets/icons/open_close_records.svg';
//assets/icons/water_heater.svg
static const String waterHeater = 'assets/icons/water_heater.svg';
}