mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 15:17:31 +00:00
push ceiling sensor batch control
This commit is contained in:
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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];
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
),
|
||||
|
@ -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 ||
|
||||
|
@ -79,7 +79,7 @@ class DevicesManagementApi {
|
||||
body: body,
|
||||
showServerMessage: true,
|
||||
expectedResponseModel: (json) {
|
||||
return json['success'] ?? false;
|
||||
return (json['successResults'] as List).isNotEmpty ;
|
||||
},
|
||||
);
|
||||
|
||||
|
Reference in New Issue
Block a user