integrate report and table view two sensors, use mock data for reports

This commit is contained in:
ashrafzarkanisala
2024-08-27 03:11:51 +03:00
parent 40deaff8a0
commit 7d700f47dd
9 changed files with 398 additions and 209 deletions

View File

@ -1,5 +1,6 @@
import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/helper/fake_report_data.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart';
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/event.dart';
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/state.dart';
@ -14,6 +15,9 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
CeilingSensorBloc({required this.deviceId}) : super(CeilingInitialState()) {
on<CeilingInitialEvent>(_fetchCeilingSensorStatus);
on<CeilingChangeValueEvent>(_changeValue);
on<GetCeilingDeviceReportsEvent>(_getDeviceReports);
on<ShowCeilingDescriptionEvent>(_showDescription);
on<BackToCeilingGridViewEvent>(_backToGridView);
}
void _fetchCeilingSensorStatus(
@ -49,7 +53,8 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
// } catch (_) {}
// }
void _changeValue(CeilingChangeValueEvent event, Emitter<CeilingSensorState> emit) async {
void _changeValue(
CeilingChangeValueEvent event, Emitter<CeilingSensorState> emit) async {
emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus));
if (event.code == 'sensitivity') {
deviceStatus.sensitivity = event.value;
@ -59,7 +64,8 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
deviceStatus.maxDistance = event.value;
}
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
await _runDeBouncer(deviceId: deviceId, code: event.code, value: event.value);
await _runDeBouncer(
deviceId: deviceId, code: event.code, value: event.value);
}
_runDeBouncer({
@ -72,8 +78,8 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
}
_timer = Timer(const Duration(seconds: 1), () async {
try {
final response =
await DevicesManagementApi().deviceControl(deviceId, Status(code: code, value: value));
final response = await DevicesManagementApi()
.deviceControl(deviceId, Status(code: code, value: value));
if (!response) {
add(CeilingInitialEvent());
@ -84,4 +90,30 @@ class CeilingSensorBloc extends Bloc<CeilingSensorEvent, CeilingSensorState> {
}
});
}
FutureOr<void> _getDeviceReports(GetCeilingDeviceReportsEvent event,
Emitter<CeilingSensorState> emit) async {
emit(CeilingReportsLoadingState());
try {
//await DevicesManagementApi.getDeviceReports(deviceId, event.code)
// .then((value) {
final fakeReport = FakeDeviceReport.generateFakeReport();
emit(CeilingReportsState(deviceReport: fakeReport));
// });
} catch (e) {
emit(CeilingReportsFailedState(error: e.toString()));
return;
}
}
void _showDescription(
ShowCeilingDescriptionEvent event, Emitter<CeilingSensorState> emit) {
emit(ShowCeilingDescriptionState(description: event.description));
}
void _backToGridView(
BackToCeilingGridViewEvent event, Emitter<CeilingSensorState> emit) {
emit(CeilingUpdateState(ceilingSensorModel: deviceStatus));
}
}

View File

@ -17,3 +17,25 @@ class CeilingChangeValueEvent extends CeilingSensorEvent {
@override
List<Object> get props => [value, code];
}
class GetCeilingDeviceReportsEvent extends CeilingSensorEvent {
final String code;
final String deviceUuid;
const GetCeilingDeviceReportsEvent(
{required this.code, required this.deviceUuid});
@override
List<Object> get props => [code, deviceUuid];
}
class ShowCeilingDescriptionEvent extends CeilingSensorEvent {
final String description;
const ShowCeilingDescriptionEvent({required this.description});
@override
List<Object> get props => [description];
}
class BackToCeilingGridViewEvent extends CeilingSensorEvent {}

View File

@ -1,4 +1,5 @@
import 'package:equatable/equatable.dart';
import 'package:syncrow_web/pages/device_managment/all_devices/models/device_reports.dart';
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart';
class CeilingSensorState extends Equatable {
@ -36,3 +37,32 @@ class CeilingFailedState extends CeilingSensorState {
@override
List<Object> get props => [error];
}
class CeilingReportsState extends CeilingSensorState {
final DeviceReport deviceReport;
const CeilingReportsState({required this.deviceReport});
@override
List<Object> get props => [deviceReport];
}
class CeilingReportsLoadingState extends CeilingSensorState {}
class CeilingReportsFailedState extends CeilingSensorState {
final String error;
const CeilingReportsFailedState({required this.error});
@override
List<Object> get props => [error];
}
class ShowCeilingDescriptionState extends CeilingSensorState {
final String description;
const ShowCeilingDescriptionState({required this.description});
@override
List<Object> get props => [description];
}

View File

@ -4,10 +4,13 @@ import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_mo
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/bloc.dart';
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/event.dart';
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/state.dart';
import 'package:syncrow_web/pages/device_managment/ceiling_sensor/model/ceiling_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/utils/constants/assets.dart';
import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart';
@ -29,99 +32,133 @@ class CeilingSensorControls extends StatelessWidget
if (state is CeilingLoadingInitialState) {
return const Center(child: CircularProgressIndicator());
} else if (state is CeilingUpdateState) {
return GridView(
padding: const EdgeInsets.symmetric(horizontal: 50),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: isLarge
? 3
: isMedium
? 2
: 1,
mainAxisExtent: 133,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
),
children: [
PresenceState(
value: state.ceilingSensorModel.presenceState,
),
PresenceDisplayValue(
value: state.ceilingSensorModel.sportsPara.toString(),
postfix: '',
description: 'Sports para',
),
PresenceDisplayValue(
value: state.ceilingSensorModel.presenceRange.toString(),
postfix: 'm',
description: 'Detection Range',
),
PresenceUpdateData(
value: state.ceilingSensorModel.sensitivity.toDouble(),
title: 'Sensitivity:',
minValue: 1,
maxValue: 5,
steps: 1,
action: (int value) {
context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
code: 'sensitivity',
value: value,
),
);
},
),
PresenceUpdateData(
value: state.ceilingSensorModel.maxDistance.toDouble(),
title: 'Maximum Distance:',
minValue: 0,
maxValue: 500,
steps: 50,
description: 'm',
action: (int value) => context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
code: 'moving_max_dis',
value: value,
),
),
),
PresenceUpdateData(
value:
(state.ceilingSensorModel.noBodyTime.toDouble() / 3600)
.roundToDouble(),
title: 'Nobody Time:',
minValue: 0,
maxValue: 300000,
steps: 5000,
description: 'hr',
action: (int value) => context
.read<CeilingSensorBloc>()
.add(CeilingChangeValueEvent(
code: 'none_body_time',
value: value,
))),
GestureDetector(
onTap: () {},
child: const PresenceStaticWidget(
icon: Assets.illuminanceRecordIcon,
description: 'Presence Record',
),
),
GestureDetector(
onTap: () {},
child: const PresenceStaticWidget(
icon: Assets.helpDescriptionIcon,
description: 'Help Description',
),
),
],
return _buildGridView(
context, state.ceilingSensorModel, isLarge, isMedium);
} else if (state is CeilingReportsState) {
return ReportsTable(
report: state.deviceReport,
onRowTap: (index) {
final entry = state.deviceReport.data![index];
context.read<CeilingSensorBloc>().add(
ShowCeilingDescriptionEvent(
description: entry['description']),
);
},
onClose: () {
context.read<CeilingSensorBloc>().add(BackToCeilingGridViewEvent());
},
);
} else {
return const Center(child: Text('Error fetching status'));
} else if (state is ShowCeilingDescriptionState) {
return DescriptionView(
description: state.description,
onClose: () {
context.read<CeilingSensorBloc>().add(BackToCeilingGridViewEvent());
},
);
} else if (state is CeilingReportsFailedState) {
final model = context.read<CeilingSensorBloc>().deviceStatus;
return _buildGridView(context, model, isLarge, isMedium);
}
return const Center(child: Text('Error fetching status'));
},
),
);
}
Widget _buildGridView(BuildContext context, CeilingSensorModel model,
bool isLarge, bool isMedium) {
return GridView(
padding: const EdgeInsets.symmetric(horizontal: 50),
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: isLarge
? 3
: isMedium
? 2
: 1,
mainAxisExtent: 133,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
),
children: [
PresenceState(
value: model.presenceState,
),
PresenceDisplayValue(
value: model.sportsPara.toString(),
postfix: '',
description: 'Sports para',
),
PresenceDisplayValue(
value: model.presenceRange.toString(),
postfix: 'm',
description: 'Detection Range',
),
PresenceUpdateData(
value: model.sensitivity.toDouble(),
title: 'Sensitivity:',
minValue: 1,
maxValue: 5,
steps: 1,
action: (int value) {
context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
code: 'sensitivity',
value: value,
),
);
},
),
PresenceUpdateData(
value: model.maxDistance.toDouble(),
title: 'Maximum Distance:',
minValue: 0,
maxValue: 500,
steps: 50,
description: 'm',
action: (int value) => context.read<CeilingSensorBloc>().add(
CeilingChangeValueEvent(
code: 'moving_max_dis',
value: value,
),
),
),
PresenceUpdateData(
value:
(model.noBodyTime.toDouble() / 3600).roundToDouble(),
title: 'Nobody Time:',
minValue: 0,
maxValue: 300000,
steps: 5000,
description: 'hr',
action: (int value) => context
.read<CeilingSensorBloc>()
.add(CeilingChangeValueEvent(
code: 'none_body_time',
value: value,
))),
GestureDetector(
onTap: () {
context.read<CeilingSensorBloc>().add(GetCeilingDeviceReportsEvent(
code: 'illuminance_record', deviceUuid: device.uuid!));
},
child: const PresenceStaticWidget(
icon: Assets.illuminanceRecordIcon,
description: 'Presence Record',
),
),
GestureDetector(
onTap: () {
context.read<CeilingSensorBloc>().add(GetCeilingDeviceReportsEvent(
code: 'presence_record', deviceUuid: device.uuid!));
},
child: const PresenceStaticWidget(
icon: Assets.presenceRecordIcon,
description: 'Presence Record',
),
),
],
);
}
}