mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 15:17:31 +00:00
Add FlushMountedPresenceSensorControlView for managing presence sensor settings
This commit is contained in:
@ -9,6 +9,7 @@ import 'package:syncrow_web/pages/device_managment/curtain/view/curtain_batch_st
|
|||||||
import 'package:syncrow_web/pages/device_managment/curtain/view/curtain_status_view.dart';
|
import 'package:syncrow_web/pages/device_managment/curtain/view/curtain_status_view.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart';
|
import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_batch_control_view.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_control_view.dart';
|
import 'package:syncrow_web/pages/device_managment/door_lock/view/door_lock_control_view.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/garage_door/view/garage_door_batch_control_view.dart';
|
import 'package:syncrow_web/pages/device_managment/garage_door/view/garage_door_batch_control_view.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/garage_door/view/garage_door_control_view.dart';
|
import 'package:syncrow_web/pages/device_managment/garage_door/view/garage_door_control_view.dart';
|
||||||
import 'package:syncrow_web/pages/device_managment/gateway/view/gateway_batch_control.dart';
|
import 'package:syncrow_web/pages/device_managment/gateway/view/gateway_batch_control.dart';
|
||||||
@ -104,6 +105,9 @@ mixin RouteControlsBasedCode {
|
|||||||
);
|
);
|
||||||
case 'SOS':
|
case 'SOS':
|
||||||
return SosDeviceControlsView(device: device);
|
return SosDeviceControlsView(device: device);
|
||||||
|
|
||||||
|
case 'NCPS':
|
||||||
|
return FlushMountedPresenceSensorControlView(device: device);
|
||||||
default:
|
default:
|
||||||
return const SizedBox();
|
return const SizedBox();
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,225 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_bloc.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/flush_mounted_presence_sensor/models/flush_mounted_presence_sensor_model.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_display_data.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_static_widget.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_status.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_update_data.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/shared/table/description_view.dart';
|
||||||
|
import 'package:syncrow_web/pages/device_managment/shared/table/report_table.dart';
|
||||||
|
import 'package:syncrow_web/services/control_device_service.dart';
|
||||||
|
import 'package:syncrow_web/utils/constants/assets.dart';
|
||||||
|
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart';
|
||||||
|
|
||||||
|
class FlushMountedPresenceSensorControlView extends StatelessWidget
|
||||||
|
with HelperResponsiveLayout {
|
||||||
|
const FlushMountedPresenceSensorControlView({super.key, required this.device});
|
||||||
|
|
||||||
|
final AllDevicesModel device;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final isExtraLarge = isExtraLargeScreenSize(context);
|
||||||
|
final isLarge = isLargeScreenSize(context);
|
||||||
|
final isMedium = isMediumScreenSize(context);
|
||||||
|
return BlocProvider(
|
||||||
|
create: (context) => FlushMountedPresenceSensorBloc(
|
||||||
|
deviceId: device.uuid!,
|
||||||
|
controlDeviceService: DebouncedControlDeviceService(
|
||||||
|
decoratee: RemoteControlDeviceService(),
|
||||||
|
),
|
||||||
|
)..add(FlushMountedPresenceSensorFetchStatusEvent()),
|
||||||
|
child: BlocBuilder<FlushMountedPresenceSensorBloc,
|
||||||
|
FlushMountedPresenceSensorState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is FlushMountedPresenceSensorLoadingInitialState ||
|
||||||
|
state is FlushMountedPresenceSensorDeviceReportsLoadingState) {
|
||||||
|
return const Center(child: CircularProgressIndicator());
|
||||||
|
} else if (state is FlushMountedPresenceSensorUpdateState) {
|
||||||
|
return _buildGridView(
|
||||||
|
context, state.model, isExtraLarge, isLarge, isMedium);
|
||||||
|
} else if (state is FlushMountedPresenceSensorDeviceReportsState) {
|
||||||
|
return ReportsTable(
|
||||||
|
report: state.deviceReport,
|
||||||
|
thirdColumnTitle:
|
||||||
|
state.code == 'illuminance_value' ? "Value" : 'Status',
|
||||||
|
thirdColumnDescription:
|
||||||
|
state.code == 'illuminance_value' ? "Lux" : null,
|
||||||
|
onRowTap: (index) {},
|
||||||
|
onClose: () {
|
||||||
|
context
|
||||||
|
.read<FlushMountedPresenceSensorBloc>()
|
||||||
|
.add(FlushMountedPresenceSensorBackToGridViewEvent());
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} else if (state is FlushMountedPresenceSensorShowDescriptionState) {
|
||||||
|
return DescriptionView(
|
||||||
|
description: state.description,
|
||||||
|
onClose: () {
|
||||||
|
context
|
||||||
|
.read<FlushMountedPresenceSensorBloc>()
|
||||||
|
.add(FlushMountedPresenceSensorBackToGridViewEvent());
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} else if (state is FlushMountedPresenceSensorDeviceReportsFailedState) {
|
||||||
|
final model =
|
||||||
|
context.read<FlushMountedPresenceSensorBloc>().deviceStatus;
|
||||||
|
return _buildGridView(
|
||||||
|
context,
|
||||||
|
model,
|
||||||
|
isExtraLarge,
|
||||||
|
isLarge,
|
||||||
|
isMedium,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return const Center(
|
||||||
|
child: Text('Error fetching status', textAlign: TextAlign.center),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildGridView(
|
||||||
|
BuildContext context,
|
||||||
|
FlushMountedPresenceSensorModel model,
|
||||||
|
bool isExtraLarge,
|
||||||
|
bool isLarge,
|
||||||
|
bool isMedium,
|
||||||
|
) {
|
||||||
|
return 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: [
|
||||||
|
PresenceState(
|
||||||
|
value: model.presenceState,
|
||||||
|
),
|
||||||
|
PresenceDisplayValue(
|
||||||
|
value: model.illuminance.toString(),
|
||||||
|
postfix: 'Lux',
|
||||||
|
description: 'Illuminance Value',
|
||||||
|
),
|
||||||
|
PresenceUpdateData(
|
||||||
|
value: model.sensitivity.toDouble(),
|
||||||
|
title: 'Sensitivity:',
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 9,
|
||||||
|
steps: 1,
|
||||||
|
action: (int value) => context.read<FlushMountedPresenceSensorBloc>().add(
|
||||||
|
FlushMountedPresenceSensorChangeValueEvent(
|
||||||
|
code: FlushMountedPresenceSensorModel.codeSensitivity,
|
||||||
|
value: value,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PresenceUpdateData(
|
||||||
|
value: (model.nearDetection).toDouble(),
|
||||||
|
title: 'Nearest Detect Dist:',
|
||||||
|
description: 'm',
|
||||||
|
minValue: 0.0,
|
||||||
|
maxValue: 950,
|
||||||
|
steps: 10,
|
||||||
|
action: (int value) => context.read<FlushMountedPresenceSensorBloc>().add(
|
||||||
|
FlushMountedPresenceSensorChangeValueEvent(
|
||||||
|
code: FlushMountedPresenceSensorModel.codeNearDetection,
|
||||||
|
value: (value).toInt(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PresenceUpdateData(
|
||||||
|
value: (model.farDetection).toDouble(),
|
||||||
|
title: 'Max Detect Dist:',
|
||||||
|
description: 'm',
|
||||||
|
minValue: 0.0,
|
||||||
|
maxValue: 950,
|
||||||
|
steps: 10,
|
||||||
|
action: (int value) => context.read<FlushMountedPresenceSensorBloc>().add(
|
||||||
|
FlushMountedPresenceSensorChangeValueEvent(
|
||||||
|
code: FlushMountedPresenceSensorModel.codeFarDetection,
|
||||||
|
value: (value).toInt(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PresenceUpdateData(
|
||||||
|
value: (model.presenceDelay.toDouble()),
|
||||||
|
title: 'Trigger Level:',
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 3,
|
||||||
|
steps: 1,
|
||||||
|
action: (int value) => context.read<FlushMountedPresenceSensorBloc>().add(
|
||||||
|
FlushMountedPresenceSensorChangeValueEvent(
|
||||||
|
code: FlushMountedPresenceSensorModel.codePresenceDelay,
|
||||||
|
value: value,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PresenceUpdateData(
|
||||||
|
value: (model.occurDistReduce.toDouble()),
|
||||||
|
title: 'Indent Level:',
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 3,
|
||||||
|
steps: 1,
|
||||||
|
action: (int value) => context.read<FlushMountedPresenceSensorBloc>().add(
|
||||||
|
FlushMountedPresenceSensorChangeValueEvent(
|
||||||
|
code: FlushMountedPresenceSensorModel.codeOccurDistReduce,
|
||||||
|
value: value,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PresenceUpdateData(
|
||||||
|
value: (model.sensiReduce.toDouble()),
|
||||||
|
title: 'Target Confirm Time:',
|
||||||
|
description: 's',
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 3,
|
||||||
|
steps: 1,
|
||||||
|
action: (int value) => context.read<FlushMountedPresenceSensorBloc>().add(
|
||||||
|
FlushMountedPresenceSensorChangeValueEvent(
|
||||||
|
code: FlushMountedPresenceSensorModel.codeSensiReduce,
|
||||||
|
value: value,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
PresenceUpdateData(
|
||||||
|
value: ((model.noneDelay).toDouble()),
|
||||||
|
description: 's',
|
||||||
|
title: 'Disappe Delay:',
|
||||||
|
minValue: 0,
|
||||||
|
maxValue: 3000,
|
||||||
|
steps: 10,
|
||||||
|
action: (int value) => context.read<FlushMountedPresenceSensorBloc>().add(
|
||||||
|
FlushMountedPresenceSensorChangeValueEvent(
|
||||||
|
code: FlushMountedPresenceSensorModel.codeNoneDelay,
|
||||||
|
value: value,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => context.read<FlushMountedPresenceSensorBloc>().add(
|
||||||
|
FlushMountedPresenceSensorGetDeviceReportsEvent(
|
||||||
|
code: 'presence_state',
|
||||||
|
deviceUuid: device.uuid!,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: const PresenceStaticWidget(
|
||||||
|
icon: Assets.presenceRecordIcon,
|
||||||
|
description: 'Presence Record',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user