push ceiling sensor batch control

This commit is contained in:
ashrafzarkanisala
2024-09-18 13:15:43 +03:00
parent abb0a58468
commit fd09db6835
7 changed files with 132 additions and 24 deletions

View File

@ -14,8 +14,9 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
CeilingSensorBloc({required this.deviceId}) : super(CeilingInitialState()) {
on<CeilingInitialEvent>(_fetchCeilingSensorStatus);
on<CeilingBatchControlEvent>(_fetchCeilingSensorBatchControl);
on<CeilingFetchDeviceStatusEvent>(_fetchCeilingSensorBatchControl);
on<CeilingChangeValueEvent>(_changeValue);
on<CeilingBatchControlEvent>(_onBatchControl);
on<GetCeilingDeviceReportsEvent>(_getDeviceReports);
on<ShowCeilingDescriptionEvent>(_showDescription);
on<BackToCeilingGridViewEvent>(_backToGridView);
@ -25,7 +26,8 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
CeilingInitialEvent event, Emitter<CeilingSensorState> emit) async {
emit(CeilingLoadingInitialState());
try {
var response = await DevicesManagementApi().getDeviceStatus(deviceId);
var response = await DevicesManagementApi()
.getDeviceStatus(event.deviceId);
deviceStatus = CeilingSensorModel.fromJson(response.status);
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
// _listenToChanges();
@ -68,34 +70,76 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
}
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
await _runDeBouncer(
deviceId: deviceId, code: event.code, value: event.value, emit: emit);
deviceId: deviceId,
code: event.code,
value: event.value,
emit: emit,
isBatch: false,
);
}
Future<void> _onBatchControl(
CeilingBatchControlEvent event, Emitter<CeilingSensorState> emit) async {
emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus));
if (event.code == 'sensitivity') {
deviceStatus.sensitivity = event.value;
} else if (event.code == 'none_body_time') {
deviceStatus.noBodyTime = event.value;
} else if (event.code == 'moving_max_dis') {
deviceStatus.maxDistance = event.value;
} else if (event.code == 'scene') {
deviceStatus.spaceType = getSpaceType(event.value);
}
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
await _runDeBouncer(
deviceId: event.deviceIds,
code: event.code,
value: event.value,
emit: emit,
isBatch: true,
);
}
_runDeBouncer({
required String deviceId,
required dynamic deviceId,
required String code,
required dynamic value,
required Emitter<CeilingSensorState> emit,
required bool isBatch,
}) {
late String id;
if (deviceId is List) {
id = deviceId.first;
} else {
id = deviceId;
}
if (_timer != null) {
_timer!.cancel();
}
_timer = Timer(const Duration(seconds: 1), () async {
try {
final response = await DevicesManagementApi()
.deviceControl(deviceId, Status(code: code, value: value));
late bool response;
if (isBatch) {
response = await DevicesManagementApi()
.deviceBatchControl(deviceId, code, value);
} else {
response = await DevicesManagementApi()
.deviceControl(deviceId, Status(code: code, value: value));
}
if (!response) {
add(CeilingInitialEvent());
add(CeilingInitialEvent(id));
}
if (response == true && code == 'scene') {
emit(CeilingLoadingInitialState());
await Future.delayed(const Duration(seconds: 1));
add(CeilingInitialEvent());
add(CeilingInitialEvent(id));
}
} catch (_) {
await Future.delayed(const Duration(milliseconds: 500));
add(CeilingInitialEvent());
add(CeilingInitialEvent(id));
}
});
}
@ -131,10 +175,12 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
}
FutureOr<void> _fetchCeilingSensorBatchControl(
CeilingBatchControlEvent event, Emitter<CeilingSensorState> emit) async {
CeilingFetchDeviceStatusEvent event,
Emitter<CeilingSensorState> emit) async {
emit(CeilingLoadingInitialState());
try {
var response = await DevicesManagementApi().getDeviceStatus(deviceId);
var response =
await DevicesManagementApi().getBatchStatus(event.devicesIds);
deviceStatus = CeilingSensorModel.fromJson(response.status);
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
} catch (e) {

View File

@ -7,9 +7,37 @@ abstract class CeilingSensorEvent extends Equatable {
List<Object> get props => [];
}
class CeilingInitialEvent extends CeilingSensorEvent {}
class CeilingInitialEvent extends CeilingSensorEvent {
final String deviceId;
const CeilingInitialEvent(this.deviceId);
class CeilingBatchControlEvent extends CeilingSensorEvent {}
@override
List<Object> get props => [deviceId];
}
class CeilingFetchDeviceStatusEvent extends CeilingSensorEvent {
final List<String> devicesIds;
const CeilingFetchDeviceStatusEvent(this.devicesIds);
@override
List<Object> get props => [devicesIds];
}
class CeilingBatchControlEvent extends CeilingSensorEvent {
final List<String> deviceIds;
final String code;
final dynamic value;
const CeilingBatchControlEvent({
required this.deviceIds,
required this.code,
required this.value,
});
@override
List<Object> get props => [deviceIds, code, value];
}
class CeilingChangeValueEvent extends CeilingSensorEvent {
final dynamic value;

View File

@ -66,3 +66,12 @@ class ShowCeilingDescriptionState extends CeilingSensorState {
@override
List<Object> get props => [description];
}
class CeilingBatchControlSuccessState extends CeilingSensorState {
final CeilingSensorModel ceilingSensorModel;
const CeilingBatchControlSuccessState({required this.ceilingSensorModel});
@override
List<Object> get props => [ceilingSensorModel];
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart';
class CeilingSensorModel {
@ -91,6 +92,30 @@ class CeilingSensorModel {
spaceType: _spaceType,
);
}
CeilingSensorModel copyWith({
String? presenceState,
int? sensitivity,
String? checkingResult,
int? presenceRange,
int? sportsPara,
String? bodyMovement,
String? noBodyTime,
int? maxDistance,
SpaceTypes? spaceType,
}) {
return CeilingSensorModel(
presenceState: presenceState ?? this.presenceState,
sensitivity: sensitivity ?? this.sensitivity,
checkingResult: checkingResult ?? this.checkingResult,
presenceRange: presenceRange ?? this.presenceRange,
sportsPara: sportsPara ?? this.sportsPara,
bodyMovement: bodyMovement ?? this.bodyMovement,
noBodyTime: noBodyTime ?? this.noBodyTime,
maxDistance: maxDistance ?? this.maxDistance,
spaceType: spaceType ?? this.spaceType,
);
}
}
enum SpaceTypes {

View File

@ -24,7 +24,7 @@ class CeilingSensorBatchControlView extends StatelessWidget
final isMedium = isMediumScreenSize(context);
return BlocProvider(
create: (context) => CeilingSensorBloc(deviceId: devicesIds.first)
..add(CeilingBatchControlEvent()),
..add(CeilingFetchDeviceStatusEvent(devicesIds)),
child: BlocBuilder<CeilingSensorBloc, CeilingSensorState>(
builder: (context, state) {
if (state is CeilingLoadingInitialState ||
@ -33,10 +33,6 @@ class CeilingSensorBatchControlView extends StatelessWidget
} else if (state is CeilingUpdateState) {
return _buildGridView(context, state.ceilingSensorModel,
isExtraLarge, isLarge, isMedium);
} else if (state is CeilingReportsFailedState) {
final model = context.read<CeilingSensorBloc>().deviceStatus;
return _buildGridView(
context, model, isExtraLarge, isLarge, isMedium);
}
return const Center(child: Text('Error fetching status'));
},
@ -65,7 +61,8 @@ class CeilingSensorBatchControlView extends StatelessWidget
description: 'Space Type',
value: model.spaceType,
action: (String value) => context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
CeilingBatchControlEvent(
deviceIds: devicesIds,
code: 'scene',
value: value,
),
@ -79,7 +76,8 @@ class CeilingSensorBatchControlView extends StatelessWidget
steps: 1,
action: (int value) {
context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
CeilingBatchControlEvent(
deviceIds: devicesIds,
code: 'sensitivity',
value: value,
),
@ -94,7 +92,8 @@ class CeilingSensorBatchControlView extends StatelessWidget
steps: 50,
description: 'm',
action: (int value) => context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
CeilingBatchControlEvent(
deviceIds: devicesIds,
code: 'moving_max_dis',
value: value,
),
@ -105,7 +104,8 @@ class CeilingSensorBatchControlView extends StatelessWidget
title: 'Nobody Time:',
description: '',
action: (String value) => context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
CeilingBatchControlEvent(
deviceIds: devicesIds,
code: 'nobody_time',
value: value,
),

View File

@ -29,7 +29,7 @@ class CeilingSensorControlsView extends StatelessWidget
final isMedium = isMediumScreenSize(context);
return BlocProvider(
create: (context) => CeilingSensorBloc(deviceId: device.uuid ?? '')
..add(CeilingInitialEvent()),
..add(CeilingInitialEvent(device.uuid ?? '')),
child: BlocBuilder<CeilingSensorBloc, CeilingSensorState>(
builder: (context, state) {
if (state is CeilingLoadingInitialState ||

View File

@ -79,7 +79,7 @@ class DevicesManagementApi {
body: body,
showServerMessage: true,
expectedResponseModel: (json) {
return json['success'] ?? false;
return (json['successResults'] as List).isNotEmpty ;
},
);