From 7c28012d799ebbb4f67ce97c9cc41c26d5cb9ee3 Mon Sep 17 00:00:00 2001 From: ashrafzarkanisala Date: Wed, 18 Sep 2024 02:23:42 +0300 Subject: [PATCH] connect reports to main door --- .../all_devices/models/device_reports.dart | 14 ++++--- .../bloc/main_door_sensor_bloc.dart | 17 ++++---- .../bloc/main_door_sensor_event.dart | 10 ++++- .../view/main_door_control_view.dart | 41 +++++++++++++++++-- .../shared/table/report_table.dart | 24 ++++++++--- lib/services/devices_mang_api.dart | 12 ++++-- lib/utils/constants/api_const.dart | 8 +++- 7 files changed, 98 insertions(+), 28 deletions(-) diff --git a/lib/pages/device_managment/all_devices/models/device_reports.dart b/lib/pages/device_managment/all_devices/models/device_reports.dart index 05604b25..82c49386 100644 --- a/lib/pages/device_managment/all_devices/models/device_reports.dart +++ b/lib/pages/device_managment/all_devices/models/device_reports.dart @@ -13,11 +13,15 @@ class DeviceReport { DeviceReport.fromJson(Map json) : deviceUuid = json['deviceUuid'] as String?, - startTime = json['startTime'] as int?, - endTime = json['endTime'] as int?, - data = (json['data'] as List?) - ?.map((e) => DeviceEvent.fromJson(e as Map)) - .toList(); + startTime = int.tryParse(json['startTime'].toString()) ?? + json['startTime'] as int?, + endTime = + int.tryParse(json['endTime'].toString()) ?? json['endTime'] as int?, + data = json['data'] != null + ? (json['data'] as List?) + ?.map((e) => DeviceEvent.fromJson(e as Map)) + .toList() + : []; Map toJson() => { 'deviceUuid': deviceUuid, diff --git a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart index bb72f1d3..50281c98 100644 --- a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart +++ b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_bloc.dart @@ -1,4 +1,6 @@ import 'dart:async'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/device_status.dart'; import 'package:syncrow_web/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart'; @@ -63,16 +65,17 @@ class MainDoorSensorBloc _timer = Timer(const Duration(milliseconds: 500), () async { try { - final status = await DevicesManagementApi() + final response = await DevicesManagementApi() .deviceControl(deviceId, Status(code: code, value: value)); - if (!status) { + if (!response) { _revertValueAndEmit(deviceId, code, oldValue, emit); } - - emit(MainDoorSensorDeviceStatusLoaded(deviceStatus)); } catch (e) { - emit(MainDoorSensorFailedState(error: e.toString())); + if (e is DioException && e.response != null) { + debugPrint('Error response: ${e.response?.data}'); + } + _revertValueAndEmit(deviceId, code, oldValue, emit); } }); } @@ -93,7 +96,6 @@ class MainDoorSensorBloc } } - // Retrieve the current value by code bool _getValueByCode(String code) { switch (code) { case 'doorcontact_state': @@ -118,13 +120,12 @@ class MainDoorSensorBloc } } - // Fetch reports related to the main door sensor FutureOr _fetchReports(MainDoorSensorReportsEvent event, Emitter emit) async { emit(MainDoorSensorLoadingState()); try { final reports = await DevicesManagementApi.getDeviceReports( - event.deviceId, event.code); + event.deviceId, event.code, event.from, event.to); emit(MainDoorSensorReportLoaded(reports)); } catch (e) { emit(MainDoorSensorFailedState(error: e.toString())); diff --git a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart index 4db304b0..40bec02c 100644 --- a/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart +++ b/lib/pages/device_managment/main_door_sensor/bloc/main_door_sensor_event.dart @@ -50,6 +50,14 @@ class MainDoorSensorBatchControl extends MainDoorSensorEvent { class MainDoorSensorReportsEvent extends MainDoorSensorEvent { final String deviceId; final String code; + final String from; + final String to; + @override + List get props => [deviceId, code, from, to]; - MainDoorSensorReportsEvent({required this.deviceId, required this.code}); + MainDoorSensorReportsEvent( + {required this.deviceId, + required this.code, + required this.from, + required this.to}); } diff --git a/lib/pages/device_managment/main_door_sensor/view/main_door_control_view.dart b/lib/pages/device_managment/main_door_sensor/view/main_door_control_view.dart index a4ac0777..3cc3e82e 100644 --- a/lib/pages/device_managment/main_door_sensor/view/main_door_control_view.dart +++ b/lib/pages/device_managment/main_door_sensor/view/main_door_control_view.dart @@ -7,6 +7,7 @@ import 'package:syncrow_web/pages/device_managment/main_door_sensor/bloc/main_do import 'package:syncrow_web/pages/device_managment/main_door_sensor/bloc/main_door_sensor_state.dart'; import 'package:syncrow_web/pages/device_managment/main_door_sensor/models/main_door_status_model.dart'; import 'package:syncrow_web/pages/device_managment/shared/device_controls_container.dart'; +import 'package:syncrow_web/pages/device_managment/shared/table/report_table.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/extension/build_context_x.dart'; @@ -25,10 +26,23 @@ class MainDoorSensorControlView extends StatelessWidget ..add(MainDoorSensorFetchDeviceEvent(device.uuid!)), child: BlocBuilder( builder: (context, state) { - if (state is MainDoorSensorLoadingState) { + if (state is MainDoorSensorLoadingState || + state is MainDoorSensorReportsLoadingState) { return const Center(child: CircularProgressIndicator()); } else if (state is MainDoorSensorDeviceStatusLoaded) { return _buildStatusControls(context, state.status); + } else if (state is MainDoorSensorReportLoaded) { + return ReportsTable( + report: state.deviceReport, + onRowTap: (index) {}, + onClose: () { + context + .read() + .add(MainDoorSensorFetchDeviceEvent(device.uuid!)); + }, + hideValueShowDescription: true, + mainDoorSensor: true, + ); } else if (state is MainDoorSensorFailedState || state is MainDoorSensorBatchFailedState) { return const Center(child: Text('Error fetching status')); @@ -60,9 +74,15 @@ class MainDoorSensorControlView extends StatelessWidget ), children: [ IconNameStatusContainer( - name: 'Open', + name: status.doorContactState ? 'Open' : 'Close', icon: Assets.mainDoor, - onTap: () {}, + onTap: () { + context.read().add(MainDoorSensorControl( + deviceId: device.uuid!, + code: 'doorcontact_state', + value: !status.doorContactState, + )); + }, status: status.doorContactState, textColor: ColorsManager.red, paddingAmount: 8, @@ -70,7 +90,20 @@ class MainDoorSensorControlView extends StatelessWidget IconNameStatusContainer( name: 'Open/Close\n Record', icon: Assets.mainDoorReports, - onTap: () {}, + onTap: () { + final from = DateTime.now() + .subtract(const Duration(days: 30)) + .millisecondsSinceEpoch; + final to = DateTime.now().millisecondsSinceEpoch; + context.read().add( + MainDoorSensorReportsEvent( + deviceId: device.uuid!, + code: 'doorcontact_state', + from: from.toString(), + to: to.toString(), + ), + ); + }, status: false, textColor: ColorsManager.blackColor, ), diff --git a/lib/pages/device_managment/shared/table/report_table.dart b/lib/pages/device_managment/shared/table/report_table.dart index d655964b..e46242a3 100644 --- a/lib/pages/device_managment/shared/table/report_table.dart +++ b/lib/pages/device_managment/shared/table/report_table.dart @@ -10,14 +10,18 @@ class ReportsTable extends StatelessWidget { final String? thirdColumnDescription; final Function(int index) onRowTap; final VoidCallback onClose; + bool? hideValueShowDescription; + bool? mainDoorSensor; - const ReportsTable({ + ReportsTable({ super.key, required this.report, required this.onRowTap, required this.onClose, this.thirdColumnTitle, this.thirdColumnDescription, + this.hideValueShowDescription, + this.mainDoorSensor, }); @override @@ -57,10 +61,20 @@ class ReportsTable extends StatelessWidget { children: [ TableCellWidget(value: date), TableCellWidget(value: time), - TableCellWidget( - value: '${data.value!} ${thirdColumnDescription ?? ''}', - onTap: () => onRowTap(index), - ), + hideValueShowDescription == true + ? TableCellWidget( + value: mainDoorSensor == true + ? data.value == 'true' + ? 'Open' + : 'Close' + : thirdColumnDescription ?? '', + onTap: () => onRowTap(index), + ) + : TableCellWidget( + value: + '${data.value!} ${thirdColumnDescription ?? ''}', + onTap: () => onRowTap(index), + ), ], ); }), diff --git a/lib/services/devices_mang_api.dart b/lib/services/devices_mang_api.dart index 70ce96f1..b9362550 100644 --- a/lib/services/devices_mang_api.dart +++ b/lib/services/devices_mang_api.dart @@ -65,7 +65,8 @@ class DevicesManagementApi { } } - static Future> getDevicesByGatewayId(String gatewayId) async { + static Future> getDevicesByGatewayId( + String gatewayId) async { final response = await HTTPService().get( path: ApiEndpoints.gatewayApi.replaceAll('{gatewayUuid}', gatewayId), showServerMessage: false, @@ -94,9 +95,14 @@ class DevicesManagementApi { return response; } - static Future getDeviceReports(String uuid, String code) async { + static Future getDeviceReports(String uuid, String code, + [String? from, String? to]) async { final response = await HTTPService().get( - path: ApiEndpoints.getDeviceLogs.replaceAll('{uuid}', uuid).replaceAll('{code}', code), + path: ApiEndpoints.getDeviceLogsByDate + .replaceAll('{uuid}', uuid) + .replaceAll('{code}', code) + .replaceAll('{startTime}', from ?? '') + .replaceAll('{endTime}', to ?? ''), showServerMessage: false, expectedResponseModel: (json) { return DeviceReport.fromJson(json); diff --git a/lib/utils/constants/api_const.dart b/lib/utils/constants/api_const.dart index 5d24b501..894da828 100644 --- a/lib/utils/constants/api_const.dart +++ b/lib/utils/constants/api_const.dart @@ -11,12 +11,14 @@ abstract class ApiEndpoints { static const String visitorPassword = '/visitor-password'; static const String getDevices = '/visitor-password/devices'; - static const String sendOnlineOneTime = '/visitor-password/temporary-password/online/one-time'; + static const String sendOnlineOneTime = + '/visitor-password/temporary-password/online/one-time'; static const String sendOnlineMultipleTime = '/visitor-password/temporary-password/online/multiple-time'; //offline Password - static const String sendOffLineOneTime = '/visitor-password/temporary-password/offline/one-time'; + static const String sendOffLineOneTime = + '/visitor-password/temporary-password/offline/one-time'; static const String sendOffLineMultipleTime = '/visitor-password/temporary-password/offline/multiple-time'; @@ -32,4 +34,6 @@ abstract class ApiEndpoints { static const String openDoorLock = '/door-lock/open/{doorLockUuid}'; static const String getDeviceLogs = '/device/report-logs/{uuid}?code={code}'; + static const String getDeviceLogsByDate = + '/device/report-logs/{uuid}?code={code}&startTime={startTime}&endTime={endTime}'; }