diff --git a/lib/pages/access_management/bloc/access_bloc.dart b/lib/pages/access_management/bloc/access_bloc.dart index 4b7e499c..26b3efc4 100644 --- a/lib/pages/access_management/bloc/access_bloc.dart +++ b/lib/pages/access_management/bloc/access_bloc.dart @@ -64,13 +64,15 @@ class AccessBloc extends Bloc { } } - - Future selectTime(SelectTime event, Emitter emit,) async { + Future selectTime( + SelectTime event, + Emitter emit, + ) async { emit(AccessLoaded()); final DateTime? picked = await showDatePicker( context: event.context, initialDate: DateTime.now(), - firstDate: DateTime.now().add(const Duration(days: -5095)), + firstDate: DateTime.now().add(const Duration(days: -5095)), lastDate: DateTime.now().add(const Duration(days: 2095)), ); if (picked != null) { @@ -97,7 +99,8 @@ class AccessBloc extends Bloc { } } else { if (effectiveTimeTimeStamp != null && selectedTimestamp < effectiveTimeTimeStamp!) { - CustomSnackBar.displaySnackBar('Expiration Time cannot be earlier than Effective Time.'); + CustomSnackBar.displaySnackBar( + 'Expiration Time cannot be earlier than Effective Time.'); } else { endTime = selectedDateTime.toString().split('.').first; expirationTimeTimeStamp = selectedTimestamp; @@ -106,14 +109,11 @@ class AccessBloc extends Bloc { } } emit(ChangeTimeState()); - } - Future _filterData(FilterDataEvent event, Emitter emit) async { emit(AccessLoaded()); try { - print(event.emailAuthorizer?.toLowerCase()); // Convert search text to lower case for case-insensitive search final searchText = event.passwordName?.toLowerCase() ?? ''; final searchEmailText = event.emailAuthorizer?.toLowerCase() ?? ''; @@ -121,15 +121,17 @@ class AccessBloc extends Bloc { bool matchesCriteria = true; // Convert timestamp to DateTime and extract date component DateTime effectiveDate = - DateTime.fromMillisecondsSinceEpoch(int.parse(item.effectiveTime.toString()) * 1000) - .toUtc() - .toLocal(); + DateTime.fromMillisecondsSinceEpoch(int.parse(item.effectiveTime.toString()) * 1000) + .toUtc() + .toLocal(); DateTime invalidDate = - DateTime.fromMillisecondsSinceEpoch(int.parse(item.invalidTime.toString()) * 1000) - .toUtc() - .toLocal(); - DateTime effectiveDateAndTime = DateTime(effectiveDate.year, effectiveDate.month, effectiveDate.day,effectiveDate.hour,effectiveDate.minute); - DateTime invalidDateAndTime = DateTime(invalidDate.year, invalidDate.month, invalidDate.day,invalidDate.hour,invalidDate.minute); + DateTime.fromMillisecondsSinceEpoch(int.parse(item.invalidTime.toString()) * 1000) + .toUtc() + .toLocal(); + DateTime effectiveDateAndTime = DateTime(effectiveDate.year, effectiveDate.month, + effectiveDate.day, effectiveDate.hour, effectiveDate.minute); + DateTime invalidDateAndTime = DateTime(invalidDate.year, invalidDate.month, invalidDate.day, + invalidDate.hour, invalidDate.minute); // Filter by password name, making the search case-insensitive if (searchText.isNotEmpty) { @@ -139,7 +141,8 @@ class AccessBloc extends Bloc { } } if (searchEmailText.isNotEmpty) { - final bool matchesName = item.authorizerEmail.toString().toLowerCase().contains(searchEmailText); + final bool matchesName = + item.authorizerEmail.toString().toLowerCase().contains(searchEmailText); if (!matchesName) { matchesCriteria = false; } @@ -147,13 +150,9 @@ class AccessBloc extends Bloc { // Filter by start date only if (event.startTime != null && event.endTime == null) { DateTime startDateTime = - DateTime.fromMillisecondsSinceEpoch(event.startTime! * 1000).toUtc().toLocal(); - startDateTime = DateTime( - startDateTime.year, - startDateTime.month, - startDateTime.day, - startDateTime.hour, - startDateTime.minute); + DateTime.fromMillisecondsSinceEpoch(event.startTime! * 1000).toUtc().toLocal(); + startDateTime = DateTime(startDateTime.year, startDateTime.month, startDateTime.day, + startDateTime.hour, startDateTime.minute); if (effectiveDateAndTime.isBefore(startDateTime)) { matchesCriteria = false; } @@ -161,14 +160,9 @@ class AccessBloc extends Bloc { // Filter by end date only if (event.endTime != null && event.startTime == null) { DateTime startDateTime = - DateTime.fromMillisecondsSinceEpoch(event.endTime! * 1000).toUtc().toLocal(); - startDateTime = DateTime( - startDateTime.year, - startDateTime.month, - startDateTime.day, - startDateTime.hour, - startDateTime.minute - ); + DateTime.fromMillisecondsSinceEpoch(event.endTime! * 1000).toUtc().toLocal(); + startDateTime = DateTime(startDateTime.year, startDateTime.month, startDateTime.day, + startDateTime.hour, startDateTime.minute); if (invalidDateAndTime.isAfter(startDateTime)) { matchesCriteria = false; } @@ -177,12 +171,15 @@ class AccessBloc extends Bloc { // Filter by both start date and end date if (event.startTime != null && event.endTime != null) { DateTime startDateTime = - DateTime.fromMillisecondsSinceEpoch(event.startTime! * 1000).toUtc().toLocal(); + DateTime.fromMillisecondsSinceEpoch(event.startTime! * 1000).toUtc().toLocal(); DateTime endDateTime = - DateTime.fromMillisecondsSinceEpoch(event.endTime! * 1000).toUtc().toLocal(); - startDateTime = DateTime(startDateTime.year, startDateTime.month, startDateTime.day,startDateTime.hour,startDateTime.minute); - endDateTime = DateTime(endDateTime.year, endDateTime.month, endDateTime.day,endDateTime.hour,endDateTime.minute); - if (effectiveDateAndTime.isBefore(startDateTime) || invalidDateAndTime.isAfter(endDateTime)) { + DateTime.fromMillisecondsSinceEpoch(event.endTime! * 1000).toUtc().toLocal(); + startDateTime = DateTime(startDateTime.year, startDateTime.month, startDateTime.day, + startDateTime.hour, startDateTime.minute); + endDateTime = DateTime(endDateTime.year, endDateTime.month, endDateTime.day, + endDateTime.hour, endDateTime.minute); + if (effectiveDateAndTime.isBefore(startDateTime) || + invalidDateAndTime.isAfter(endDateTime)) { matchesCriteria = false; } } @@ -205,7 +202,6 @@ class AccessBloc extends Bloc { } } - resetSearch(ResetSearch event, Emitter emit) async { emit(AccessLoaded()); startTime = 'Start Time'; @@ -224,7 +220,6 @@ class AccessBloc extends Bloc { " ${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}"; } - Future onTabChanged(TabChangedEvent event, Emitter emit) async { try { emit(AccessLoaded()); @@ -257,6 +252,4 @@ class AccessBloc extends Bloc { emit(FailedState(e.toString())); } } - } - diff --git a/lib/pages/auth/bloc/auth_bloc.dart b/lib/pages/auth/bloc/auth_bloc.dart index cf01a73c..a8a32f54 100644 --- a/lib/pages/auth/bloc/auth_bloc.dart +++ b/lib/pages/auth/bloc/auth_bloc.dart @@ -96,35 +96,33 @@ class AuthBloc extends Bloc { Future changePassword(ChangePasswordEvent event, Emitter emit) async { emit(LoadingForgetState()); - try { - var response = await AuthenticationAPI.verifyOtp( - email: forgetEmailController.text, otpCode: forgetOtp.text); - if (response == true) { - await AuthenticationAPI.forgetPassword( - password: forgetPasswordController.text, - email: forgetEmailController.text); - _timer?.cancel(); - emit(const TimerState(isButtonEnabled: true, remainingTime: 0)); - emit(SuccessForgetState()); - } - } on DioException catch (e) { - final errorData = e.response!.data; - String errorMessage = errorData['message']; - if (errorMessage == 'this email is not registered') { - validate = 'Invalid Credentials!'; - emit(AuthInitialState()); - } else if (errorMessage == "You entered wrong otp") { - forgetValidate = 'Wrong one time password.'; - emit(AuthInitialState()); - } else if (errorMessage == "OTP expired") { - forgetValidate = 'One time password has been expired.'; - emit(AuthInitialState()); - } else { - validate = ''; - emit(AuthInitialState()); - } + try { + var response = await AuthenticationAPI.verifyOtp( + email: forgetEmailController.text, otpCode: forgetOtp.text); + if (response == true) { + await AuthenticationAPI.forgetPassword( + password: forgetPasswordController.text, email: forgetEmailController.text); + _timer?.cancel(); + emit(const TimerState(isButtonEnabled: true, remainingTime: 0)); + emit(SuccessForgetState()); } - + } on DioException catch (e) { + final errorData = e.response!.data; + String errorMessage = errorData['message']; + if (errorMessage == 'this email is not registered') { + validate = 'Invalid Credentials!'; + emit(AuthInitialState()); + } else if (errorMessage == "You entered wrong otp") { + forgetValidate = 'Wrong one time password.'; + emit(AuthInitialState()); + } else if (errorMessage == "OTP expired") { + forgetValidate = 'One time password has been expired.'; + emit(AuthInitialState()); + } else { + validate = ''; + emit(AuthInitialState()); + } + } } String? validateCode(String? value) { diff --git a/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart b/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart index 46eedaaf..94659941 100644 --- a/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart +++ b/lib/pages/device_managment/all_devices/bloc/device_managment_bloc.dart @@ -220,7 +220,8 @@ class DeviceManagementBloc extends Bloc device.online == true).length; _offlineCount = _devices.where((device) => device.online == false).length; - _lowBatteryCount = _devices.where((device) => device.batteryLevel != null && device.batteryLevel! < 20).length; + _lowBatteryCount = + _devices.where((device) => device.batteryLevel != null && device.batteryLevel! < 20).length; } String _getFilterFromIndex(int index) { @@ -253,6 +254,8 @@ class DeviceManagementBloc extends Bloc { on(_onFactoryReset); } - void _fetchCeilingSensorStatus(CeilingInitialEvent event, Emitter emit) async { + void _fetchCeilingSensorStatus( + CeilingInitialEvent event, Emitter emit) async { emit(CeilingLoadingInitialState()); try { var response = await DevicesManagementApi().getDeviceStatus(event.deviceId); @@ -77,7 +78,8 @@ class CeilingSensorBloc extends Bloc { ); } - Future _onBatchControl(CeilingBatchControlEvent event, Emitter emit) async { + Future _onBatchControl( + CeilingBatchControlEvent event, Emitter emit) async { emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus)); if (event.code == 'sensitivity') { deviceStatus.sensitivity = event.value; @@ -122,7 +124,8 @@ class CeilingSensorBloc extends Bloc { if (isBatch) { response = await DevicesManagementApi().deviceBatchControl(deviceId, code, value); } else { - response = await DevicesManagementApi().deviceControl(deviceId, Status(code: code, value: value)); + response = await DevicesManagementApi() + .deviceControl(deviceId, Status(code: code, value: value)); } if (!response) { @@ -140,18 +143,19 @@ class CeilingSensorBloc extends Bloc { }); } - FutureOr _getDeviceReports(GetCeilingDeviceReportsEvent event, Emitter emit) async { + FutureOr _getDeviceReports( + GetCeilingDeviceReportsEvent event, Emitter emit) async { if (event.code.isEmpty) { emit(ShowCeilingDescriptionState(description: reportString)); return; } else { emit(CeilingReportsLoadingState()); - final from = DateTime.now().subtract(const Duration(days: 30)).millisecondsSinceEpoch; - final to = DateTime.now().millisecondsSinceEpoch; + // final from = DateTime.now().subtract(const Duration(days: 30)).millisecondsSinceEpoch; + // final to = DateTime.now().millisecondsSinceEpoch; try { - await DevicesManagementApi.getDeviceReportsByDate(deviceId, event.code, from.toString(), to.toString()) - .then((value) { + // await DevicesManagementApi.getDeviceReportsByDate(deviceId, event.code, from.toString(), to.toString()) + await DevicesManagementApi.getDeviceReports(deviceId, event.code).then((value) { emit(CeilingReportsState(deviceReport: value)); }); } catch (e) { @@ -182,7 +186,8 @@ class CeilingSensorBloc extends Bloc { } } - FutureOr _onFactoryReset(CeilingFactoryResetEvent event, Emitter emit) async { + FutureOr _onFactoryReset( + CeilingFactoryResetEvent event, Emitter emit) async { emit(CeilingLoadingNewSate(ceilingSensorModel: deviceStatus)); try { final response = await DevicesManagementApi().factoryReset( diff --git a/lib/pages/device_managment/ceiling_sensor/bloc/event.dart b/lib/pages/device_managment/ceiling_sensor/bloc/ceiling_event.dart similarity index 100% rename from lib/pages/device_managment/ceiling_sensor/bloc/event.dart rename to lib/pages/device_managment/ceiling_sensor/bloc/ceiling_event.dart diff --git a/lib/pages/device_managment/ceiling_sensor/bloc/state.dart b/lib/pages/device_managment/ceiling_sensor/bloc/ceiling_state.dart similarity index 100% rename from lib/pages/device_managment/ceiling_sensor/bloc/state.dart rename to lib/pages/device_managment/ceiling_sensor/bloc/ceiling_state.dart diff --git a/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart b/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart index 18149990..08a65a11 100644 --- a/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart +++ b/lib/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart @@ -46,22 +46,19 @@ class CeilingSensorModel { _spaceType = getSpaceType(status.value ?? 'none'); break; case 'sensitivity': - _sensitivity = status.value is int - ? status.value - : int.tryParse(status.value ?? '1') ?? 1; + _sensitivity = + status.value is int ? status.value : int.tryParse(status.value ?? '1') ?? 1; break; case 'checking_result': _checkingResult = status.value ?? ''; break; case 'presence_range': - _presenceRange = status.value is int - ? status.value - : int.tryParse(status.value ?? '0') ?? 0; + _presenceRange = + status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0; break; case 'sports_para': - _sportsPara = status.value is int - ? status.value - : int.tryParse(status.value ?? '0') ?? 0; + _sportsPara = + status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0; break; case 'body_movement': _bodyMovement = status.value ?? ''; @@ -70,9 +67,7 @@ class CeilingSensorModel { _noBodyTime = status.value ?? 'none'; break; case 'moving_max_dis': - _maxDis = status.value is int - ? status.value - : int.tryParse(status.value ?? '0') ?? 0; + _maxDis = status.value is int ? status.value : int.tryParse(status.value ?? '0') ?? 0; break; } } diff --git a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_batch_control.dart b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_batch_control.dart index d1dc54a2..b7f9af5d 100644 --- a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_batch_control.dart +++ b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_batch_control.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/factory_reset_model.dart'; -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/bloc/ceiling_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/ceiling_event.dart'; +import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/ceiling_state.dart'; import 'package:syncrow_web/pages/device_managment/ceiling_sensor/model/ceiling_sensor_model.dart'; import 'package:syncrow_web/pages/device_managment/shared/batch_control/factory_reset.dart'; import 'package:syncrow_web/pages/device_managment/shared/batch_control/firmware_update.dart'; @@ -12,8 +12,7 @@ import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presen import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presense_nobody_time.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class CeilingSensorBatchControlView extends StatelessWidget - with HelperResponsiveLayout { +class CeilingSensorBatchControlView extends StatelessWidget with HelperResponsiveLayout { const CeilingSensorBatchControlView({super.key, required this.devicesIds}); final List devicesIds; @@ -28,12 +27,11 @@ class CeilingSensorBatchControlView extends StatelessWidget ..add(CeilingFetchDeviceStatusEvent(devicesIds)), child: BlocBuilder( builder: (context, state) { - if (state is CeilingLoadingInitialState || - state is CeilingReportsLoadingState) { + if (state is CeilingLoadingInitialState || state is CeilingReportsLoadingState) { return const Center(child: CircularProgressIndicator()); } else if (state is CeilingUpdateState) { - return _buildGridView(context, state.ceilingSensorModel, - isExtraLarge, isLarge, isMedium); + return _buildGridView( + context, state.ceilingSensorModel, isExtraLarge, isLarge, isMedium); } return const Center(child: Text('Error fetching status')); }, @@ -41,8 +39,8 @@ class CeilingSensorBatchControlView extends StatelessWidget ); } - Widget _buildGridView(BuildContext context, CeilingSensorModel model, - bool isExtraLarge, bool isLarge, bool isMedium) { + Widget _buildGridView(BuildContext context, CeilingSensorModel model, bool isExtraLarge, + bool isLarge, bool isMedium) { return GridView( padding: const EdgeInsets.symmetric(horizontal: 50), shrinkWrap: true, @@ -118,8 +116,7 @@ class CeilingSensorBatchControlView extends StatelessWidget context.read().add( CeilingFactoryResetEvent( devicesId: devicesIds.first, - factoryResetModel: - FactoryResetModel(devicesUuid: devicesIds), + factoryResetModel: FactoryResetModel(devicesUuid: devicesIds), ), ); }, diff --git a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart index ecf0afae..845c326b 100644 --- a/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart +++ b/lib/pages/device_managment/ceiling_sensor/view/ceiling_sensor_controls.dart @@ -1,9 +1,9 @@ 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/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/bloc/ceiling_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/ceiling_event.dart'; +import 'package:syncrow_web/pages/device_managment/ceiling_sensor/bloc/ceiling_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_space_type.dart'; @@ -16,8 +16,7 @@ import 'package:syncrow_web/pages/device_managment/shared/table/report_table.dar import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class CeilingSensorControlsView extends StatelessWidget - with HelperResponsiveLayout { +class CeilingSensorControlsView extends StatelessWidget with HelperResponsiveLayout { const CeilingSensorControlsView({super.key, required this.device}); final AllDevicesModel device; @@ -32,35 +31,29 @@ class CeilingSensorControlsView extends StatelessWidget ..add(CeilingInitialEvent(device.uuid ?? '')), child: BlocBuilder( builder: (context, state) { - if (state is CeilingLoadingInitialState || - state is CeilingReportsLoadingState) { + if (state is CeilingLoadingInitialState || state is CeilingReportsLoadingState) { return const Center(child: CircularProgressIndicator()); } else if (state is CeilingUpdateState) { - return _buildGridView(context, state.ceilingSensorModel, - isExtraLarge, isLarge, isMedium); + return _buildGridView( + context, state.ceilingSensorModel, isExtraLarge, isLarge, isMedium); } else if (state is CeilingReportsState) { return ReportsTable( report: state.deviceReport, onRowTap: (index) {}, onClose: () { - context - .read() - .add(BackToCeilingGridViewEvent()); + context.read().add(BackToCeilingGridViewEvent()); }, ); } else if (state is ShowCeilingDescriptionState) { return DescriptionView( description: state.description, onClose: () { - context - .read() - .add(BackToCeilingGridViewEvent()); + context.read().add(BackToCeilingGridViewEvent()); }, ); } else if (state is CeilingReportsFailedState) { final model = context.read().deviceStatus; - return _buildGridView( - context, model, isExtraLarge, isLarge, isMedium); + return _buildGridView(context, model, isExtraLarge, isLarge, isMedium); } return const Center(child: Text('Error fetching status')); }, @@ -68,8 +61,8 @@ class CeilingSensorControlsView extends StatelessWidget ); } - Widget _buildGridView(BuildContext context, CeilingSensorModel model, - bool isExtraLarge, bool isLarge, bool isMedium) { + Widget _buildGridView(BuildContext context, CeilingSensorModel model, bool isExtraLarge, + bool isLarge, bool isMedium) { return GridView( padding: const EdgeInsets.symmetric(horizontal: 50), shrinkWrap: true, @@ -150,8 +143,8 @@ class CeilingSensorControlsView extends StatelessWidget ), GestureDetector( onTap: () { - context.read().add(GetCeilingDeviceReportsEvent( - code: 'presence_state', deviceUuid: device.uuid!)); + context.read().add( + GetCeilingDeviceReportsEvent(code: 'presence_state', deviceUuid: device.uuid!)); }, child: const PresenceStaticWidget( icon: Assets.illuminanceRecordIcon, @@ -160,8 +153,9 @@ class CeilingSensorControlsView extends StatelessWidget ), GestureDetector( onTap: () { - context.read().add(GetCeilingDeviceReportsEvent( - code: '', deviceUuid: device.uuid!)); + context + .read() + .add(GetCeilingDeviceReportsEvent(code: '', deviceUuid: device.uuid!)); }, child: const PresenceStaticWidget( icon: Assets.helpDescriptionIcon, diff --git a/lib/pages/device_managment/shared/table/report_table.dart b/lib/pages/device_managment/shared/table/report_table.dart index 892bdd1a..11385080 100644 --- a/lib/pages/device_managment/shared/table/report_table.dart +++ b/lib/pages/device_managment/shared/table/report_table.dart @@ -3,6 +3,8 @@ import 'package:intl/intl.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/device_reports.dart'; import 'package:syncrow_web/pages/device_managment/shared/table/table_cell_widget.dart'; import 'package:syncrow_web/pages/device_managment/shared/table/table_header.dart'; +import 'package:syncrow_web/utils/color_manager.dart'; +import 'package:syncrow_web/utils/extension/build_context_x.dart'; // ignore: must_be_immutable class ReportsTable extends StatelessWidget { @@ -31,81 +33,90 @@ class ReportsTable extends StatelessWidget { @override Widget build(BuildContext context) { - return Stack( - children: [ - Padding( - padding: const EdgeInsets.all(20.0), - child: Table( - border: TableBorder.all(color: Colors.grey.shade300, width: 1), - columnWidths: const { - 0: FlexColumnWidth(), - 1: FlexColumnWidth(), - 2: FlexColumnWidth(), - }, - children: [ - TableRow( - decoration: BoxDecoration(color: Colors.grey.shade200), - children: [ - const TableHeader(title: 'Date'), - const TableHeader(title: 'Time'), - TableHeader(title: thirdColumnTitle ?? 'Status'), - ], - ), - if (report.data != null) - ...report.data!.asMap().entries.map((entry) { - int index = entry.key; - DeviceEvent data = entry.value; - - // Parse eventTime into Date and Time - DateTime eventDateTime = - DateTime.fromMillisecondsSinceEpoch(data.eventTime!); - String date = DateFormat('dd/MM/yyyy').format(eventDateTime); - String time = DateFormat('HH:mm').format(eventDateTime); - - String value; - if (hideValueShowDescription == true) { - if (mainDoorSensor != null && mainDoorSensor == true) { - value = data.value == 'true' ? 'Open' : 'Close'; - } else if (garageDoorSensor != null && - garageDoorSensor == true) { - value = data.value == 'true' ? 'Opened' : 'Closed'; - } else if (waterLeak != null && waterLeak == true) { - value = - data.value == 'normal' ? 'Normal' : 'Leak Detected'; - } else { - value = '${data.value!} ${thirdColumnDescription ?? ''}'; - } - } else { - value = '${data.value!} ${thirdColumnDescription ?? ''}'; - } - - return TableRow( - children: [ - TableCellWidget(value: date), - TableCellWidget(value: time), - TableCellWidget( - value: value, - onTap: () => onRowTap(index), - ), - ], - ); - }), - ], - ), - ), - Positioned( - top: 0, - right: 0, - child: IconButton( - icon: const Icon( - Icons.close, - color: Colors.red, - size: 18, + return report.data == null || report.data!.isEmpty + ? Container( + padding: const EdgeInsets.all(20.0), + width: MediaQuery.sizeOf(context).width, + alignment: AlignmentDirectional.center, + height: 100, + child: Text( + 'No reports found', + style: context.textTheme.bodyLarge!.copyWith(color: ColorsManager.grayColor), ), - onPressed: onClose, - ), - ), - ], - ); + ) + : Stack( + children: [ + Padding( + padding: const EdgeInsets.all(20.0), + child: Table( + border: TableBorder.all(color: Colors.grey.shade300, width: 1), + columnWidths: const { + 0: FlexColumnWidth(), + 1: FlexColumnWidth(), + 2: FlexColumnWidth(), + }, + children: [ + TableRow( + decoration: BoxDecoration(color: Colors.grey.shade200), + children: [ + const TableHeader(title: 'Date'), + const TableHeader(title: 'Time'), + TableHeader(title: thirdColumnTitle ?? 'Status'), + ], + ), + if (report.data != null) + ...report.data!.asMap().entries.map((entry) { + int index = entry.key; + DeviceEvent data = entry.value; + + // Parse eventTime into Date and Time + DateTime eventDateTime = + DateTime.fromMillisecondsSinceEpoch(data.eventTime!); + String date = DateFormat('dd/MM/yyyy').format(eventDateTime); + String time = DateFormat('HH:mm').format(eventDateTime); + + String value; + if (hideValueShowDescription == true) { + if (mainDoorSensor != null && mainDoorSensor == true) { + value = data.value == 'true' ? 'Open' : 'Close'; + } else if (garageDoorSensor != null && garageDoorSensor == true) { + value = data.value == 'true' ? 'Opened' : 'Closed'; + } else if (waterLeak != null && waterLeak == true) { + value = data.value == 'normal' ? 'Normal' : 'Leak Detected'; + } else { + value = '${data.value!} ${thirdColumnDescription ?? ''}'; + } + } else { + value = '${data.value!} ${thirdColumnDescription ?? ''}'; + } + + return TableRow( + children: [ + TableCellWidget(value: date), + TableCellWidget(value: time), + TableCellWidget( + value: value, + onTap: () => onRowTap(index), + ), + ], + ); + }) + ], + ), + ), + Positioned( + top: 0, + right: 0, + child: IconButton( + icon: const Icon( + Icons.close, + color: Colors.red, + size: 18, + ), + onPressed: onClose, + ), + ), + ], + ); } } diff --git a/lib/pages/device_managment/shared/toggle_widget.dart b/lib/pages/device_managment/shared/toggle_widget.dart index 61c16e4b..ad0ba8ad 100644 --- a/lib/pages/device_managment/shared/toggle_widget.dart +++ b/lib/pages/device_managment/shared/toggle_widget.dart @@ -31,7 +31,6 @@ class ToggleWidget extends StatelessWidget { @override Widget build(BuildContext context) { - debugPrint(label.toString()); return DeviceControlsContainer( child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/pages/device_managment/wall_sensor/bloc/bloc.dart b/lib/pages/device_managment/wall_sensor/bloc/wall_bloc.dart similarity index 87% rename from lib/pages/device_managment/wall_sensor/bloc/bloc.dart rename to lib/pages/device_managment/wall_sensor/bloc/wall_bloc.dart index f3040b48..41598439 100644 --- a/lib/pages/device_managment/wall_sensor/bloc/bloc.dart +++ b/lib/pages/device_managment/wall_sensor/bloc/wall_bloc.dart @@ -1,8 +1,8 @@ import 'dart:async'; 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/wall_sensor/bloc/event.dart'; -import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/state.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/wall_event.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/wall_state.dart'; import 'package:syncrow_web/pages/device_managment/wall_sensor/model/wall_sensor_model.dart'; import 'package:syncrow_web/services/devices_mang_api.dart'; @@ -38,12 +38,10 @@ class WallSensorBloc extends Bloc { // Fetch batch status FutureOr _fetchWallSensorBatchControl( - WallSensorFetchBatchStatusEvent event, - Emitter emit) async { + WallSensorFetchBatchStatusEvent event, Emitter emit) async { emit(WallSensorLoadingInitialState()); try { - var response = - await DevicesManagementApi().getBatchStatus(event.devicesIds); + var response = await DevicesManagementApi().getBatchStatus(event.devicesIds); deviceStatus = WallSensorModel.fromJson(response.status); emit(WallSensorUpdateState(wallSensorModel: deviceStatus)); } catch (e) { @@ -70,8 +68,7 @@ class WallSensorBloc extends Bloc { // } catch (_) {} // } - void _changeValue( - WallSensorChangeValueEvent event, Emitter emit) async { + void _changeValue(WallSensorChangeValueEvent event, Emitter emit) async { emit(WallSensorLoadingNewSate(wallSensorModel: deviceStatus)); if (event.code == 'far_detection') { deviceStatus.farDetection = event.value; @@ -128,8 +125,7 @@ class WallSensorBloc extends Bloc { try { late bool response; if (isBatch) { - response = await DevicesManagementApi() - .deviceBatchControl(deviceId, code, value); + response = await DevicesManagementApi().deviceBatchControl(deviceId, code, value); } else { response = await DevicesManagementApi() .deviceControl(deviceId, Status(code: code, value: value)); @@ -148,10 +144,13 @@ class WallSensorBloc extends Bloc { FutureOr _getDeviceReports( GetDeviceReportsEvent event, Emitter emit) async { emit(DeviceReportsLoadingState()); + // final from = DateTime.now().subtract(const Duration(days: 30)).millisecondsSinceEpoch; + // final to = DateTime.now().millisecondsSinceEpoch; try { - await DevicesManagementApi.getDeviceReports(deviceId, event.code) - .then((value) { + // await DevicesManagementApi.getDeviceReportsByDate( + // deviceId, event.code, from.toString(), to.toString()) + await DevicesManagementApi.getDeviceReports(deviceId, event.code).then((value) { emit(DeviceReportsState(deviceReport: value, code: event.code)); }); } catch (e) { @@ -160,13 +159,11 @@ class WallSensorBloc extends Bloc { } } - void _showDescription( - ShowDescriptionEvent event, Emitter emit) { + void _showDescription(ShowDescriptionEvent event, Emitter emit) { emit(WallSensorShowDescriptionState(description: event.description)); } - void _backToGridView( - BackToGridViewEvent event, Emitter emit) { + void _backToGridView(BackToGridViewEvent event, Emitter emit) { emit(WallSensorUpdateState(wallSensorModel: deviceStatus)); } diff --git a/lib/pages/device_managment/wall_sensor/bloc/event.dart b/lib/pages/device_managment/wall_sensor/bloc/wall_event.dart similarity index 100% rename from lib/pages/device_managment/wall_sensor/bloc/event.dart rename to lib/pages/device_managment/wall_sensor/bloc/wall_event.dart diff --git a/lib/pages/device_managment/wall_sensor/bloc/state.dart b/lib/pages/device_managment/wall_sensor/bloc/wall_state.dart similarity index 100% rename from lib/pages/device_managment/wall_sensor/bloc/state.dart rename to lib/pages/device_managment/wall_sensor/bloc/wall_state.dart diff --git a/lib/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart b/lib/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart index 66078d60..66ff67aa 100644 --- a/lib/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart +++ b/lib/pages/device_managment/wall_sensor/view/wall_sensor_batch_control.dart @@ -4,14 +4,13 @@ import 'package:syncrow_web/pages/device_managment/all_devices/models/factory_re import 'package:syncrow_web/pages/device_managment/shared/batch_control/factory_reset.dart'; import 'package:syncrow_web/pages/device_managment/shared/batch_control/firmware_update.dart'; import 'package:syncrow_web/pages/device_managment/shared/sensors_widgets/presence_update_data.dart'; -import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/bloc.dart'; -import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/event.dart'; -import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/state.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/wall_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/wall_event.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/wall_state.dart'; import 'package:syncrow_web/pages/device_managment/wall_sensor/model/wall_sensor_model.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class WallSensorBatchControlView extends StatelessWidget - with HelperResponsiveLayout { +class WallSensorBatchControlView extends StatelessWidget with HelperResponsiveLayout { const WallSensorBatchControlView({super.key, required this.devicesIds}); final List devicesIds; @@ -26,16 +25,13 @@ class WallSensorBatchControlView extends StatelessWidget ..add(WallSensorFetchBatchStatusEvent(devicesIds)), child: BlocBuilder( builder: (context, state) { - if (state is WallSensorLoadingInitialState || - state is DeviceReportsLoadingState) { + if (state is WallSensorLoadingInitialState || state is DeviceReportsLoadingState) { return const Center(child: CircularProgressIndicator()); } else if (state is WallSensorUpdateState) { - return _buildGridView(context, state.wallSensorModel, isExtraLarge, - isLarge, isMedium); + return _buildGridView(context, state.wallSensorModel, isExtraLarge, isLarge, isMedium); } else if (state is DeviceReportsFailedState) { final model = context.read().deviceStatus; - return _buildGridView( - context, model, isExtraLarge, isLarge, isMedium); + return _buildGridView(context, model, isExtraLarge, isLarge, isMedium); } return const Center(child: Text('Error fetching status')); }, @@ -43,8 +39,8 @@ class WallSensorBatchControlView extends StatelessWidget ); } - Widget _buildGridView(BuildContext context, WallSensorModel model, - bool isExtraLarge, bool isLarge, bool isMedium) { + Widget _buildGridView( + BuildContext context, WallSensorModel model, bool isExtraLarge, bool isLarge, bool isMedium) { return GridView( padding: const EdgeInsets.symmetric(horizontal: 50, vertical: 20), shrinkWrap: true, @@ -97,12 +93,11 @@ class WallSensorBatchControlView extends StatelessWidget maxValue: 10000, steps: 1, description: 'sec', - action: (int value) => - context.read().add(WallSensorBatchControlEvent( - deviceIds: devicesIds, - code: 'no_one_time', - value: value, - ))), + action: (int value) => context.read().add(WallSensorBatchControlEvent( + deviceIds: devicesIds, + code: 'no_one_time', + value: value, + ))), PresenceUpdateData( value: model.farDetection.toDouble(), title: 'Far Detection:', diff --git a/lib/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart b/lib/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart index f0ff7591..370edaa5 100644 --- a/lib/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart +++ b/lib/pages/device_managment/wall_sensor/view/wall_sensor_conrtols.dart @@ -3,9 +3,9 @@ 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/shared/table/description_view.dart'; import 'package:syncrow_web/pages/device_managment/shared/table/report_table.dart'; -import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/bloc.dart'; -import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/event.dart'; -import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/state.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/wall_bloc.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/wall_event.dart'; +import 'package:syncrow_web/pages/device_managment/wall_sensor/bloc/wall_state.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'; @@ -14,8 +14,7 @@ import 'package:syncrow_web/pages/device_managment/wall_sensor/model/wall_sensor import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class WallSensorControlsView extends StatelessWidget - with HelperResponsiveLayout { +class WallSensorControlsView extends StatelessWidget with HelperResponsiveLayout { const WallSensorControlsView({super.key, required this.device}); final AllDevicesModel device; @@ -26,23 +25,19 @@ class WallSensorControlsView extends StatelessWidget final isLarge = isLargeScreenSize(context); final isMedium = isMediumScreenSize(context); return BlocProvider( - create: (context) => WallSensorBloc(deviceId: device.uuid!) - ..add(WallSensorFetchStatusEvent()), + create: (context) => + WallSensorBloc(deviceId: device.uuid!)..add(WallSensorFetchStatusEvent()), child: BlocBuilder( builder: (context, state) { - if (state is WallSensorLoadingInitialState || - state is DeviceReportsLoadingState) { + if (state is WallSensorLoadingInitialState || state is DeviceReportsLoadingState) { return const Center(child: CircularProgressIndicator()); } else if (state is WallSensorUpdateState) { - return _buildGridView(context, state.wallSensorModel, isExtraLarge, - isLarge, isMedium); + return _buildGridView(context, state.wallSensorModel, isExtraLarge, isLarge, isMedium); } else if (state is DeviceReportsState) { return ReportsTable( report: state.deviceReport, - thirdColumnTitle: - state.code == 'illuminance_value' ? "Value" : 'Status', - thirdColumnDescription: - state.code == 'illuminance_value' ? "Lux" : null, + thirdColumnTitle: state.code == 'illuminance_value' ? "Value" : 'Status', + thirdColumnDescription: state.code == 'illuminance_value' ? "Lux" : null, onRowTap: (index) {}, onClose: () { context.read().add(BackToGridViewEvent()); @@ -57,8 +52,7 @@ class WallSensorControlsView extends StatelessWidget ); } else if (state is DeviceReportsFailedState) { final model = context.read().deviceStatus; - return _buildGridView( - context, model, isExtraLarge, isLarge, isMedium); + return _buildGridView(context, model, isExtraLarge, isLarge, isMedium); } return const Center(child: Text('Error fetching status')); }, @@ -66,8 +60,8 @@ class WallSensorControlsView extends StatelessWidget ); } - Widget _buildGridView(BuildContext context, WallSensorModel model, - bool isExtraLarge, bool isLarge, bool isMedium) { + Widget _buildGridView( + BuildContext context, WallSensorModel model, bool isExtraLarge, bool isLarge, bool isMedium) { return GridView( padding: const EdgeInsets.symmetric(horizontal: 50), shrinkWrap: true, @@ -136,11 +130,10 @@ class WallSensorControlsView extends StatelessWidget maxValue: 10000, steps: 1, description: 'sec', - action: (int value) => - context.read().add(WallSensorChangeValueEvent( - code: 'no_one_time', - value: value, - ))), + action: (int value) => context.read().add(WallSensorChangeValueEvent( + code: 'no_one_time', + value: value, + ))), PresenceUpdateData( value: model.farDetection.toDouble(), title: 'Far Detection:', @@ -157,8 +150,9 @@ class WallSensorControlsView extends StatelessWidget ), GestureDetector( onTap: () { - context.read().add(GetDeviceReportsEvent( - code: 'illuminance_value', deviceUuid: device.uuid!)); + context + .read() + .add(GetDeviceReportsEvent(code: 'illuminance_value', deviceUuid: device.uuid!)); }, child: const PresenceStaticWidget( icon: Assets.illuminanceRecordIcon, @@ -167,8 +161,9 @@ class WallSensorControlsView extends StatelessWidget ), GestureDetector( onTap: () { - context.read().add(GetDeviceReportsEvent( - code: 'presence_state', deviceUuid: device.uuid!)); + context + .read() + .add(GetDeviceReportsEvent(code: 'presence_state', deviceUuid: device.uuid!)); }, child: const PresenceStaticWidget( icon: Assets.presenceRecordIcon, diff --git a/lib/pages/visitor_password/bloc/visitor_password_bloc.dart b/lib/pages/visitor_password/bloc/visitor_password_bloc.dart index 5b9ab5b7..aeb53260 100644 --- a/lib/pages/visitor_password/bloc/visitor_password_bloc.dart +++ b/lib/pages/visitor_password/bloc/visitor_password_bloc.dart @@ -76,7 +76,8 @@ class VisitorPasswordBloc extends Bloc selectTimeVisitorPassword( SelectTimeVisitorPassword event, - Emitter emit,) async { + Emitter emit, + ) async { final DateTime? picked = await showDatePicker( context: event.context, initialDate: DateTime.now(), @@ -359,7 +360,6 @@ class VisitorPasswordBloc extends Bloc jsonData = json; List passwordList = jsonData.map((jsonItem) { return PasswordModel.fromJson(jsonItem);