mirror of
https://github.com/SyncrowIOT/web.git
synced 2026-10-23 10:37:57 +00:00
push water heater batch control view
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user