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
@@ -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();
}
@@ -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(
deviceId,
Status(code: code, value: value),
);
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);
}
}
}
}
@@ -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];
}
@@ -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: () {},
),
],
),
);
}
}
@@ -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;
+3
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';
}