diff --git a/assets/icons/closed_door.svg b/assets/icons/closed_door.svg
new file mode 100644
index 0000000..3c155c2
--- /dev/null
+++ b/assets/icons/closed_door.svg
@@ -0,0 +1,47 @@
+
diff --git a/assets/icons/door_notification_setting_icon.svg b/assets/icons/door_notification_setting_icon.svg
new file mode 100644
index 0000000..75e9aa8
--- /dev/null
+++ b/assets/icons/door_notification_setting_icon.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/icons/door_records_icon.svg b/assets/icons/door_records_icon.svg
new file mode 100644
index 0000000..df459ff
--- /dev/null
+++ b/assets/icons/door_records_icon.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/icons/door_sensor_icon.svg b/assets/icons/door_sensor_icon.svg
new file mode 100644
index 0000000..5357720
--- /dev/null
+++ b/assets/icons/door_sensor_icon.svg
@@ -0,0 +1,23 @@
+
diff --git a/assets/icons/opened_door.svg b/assets/icons/opened_door.svg
new file mode 100644
index 0000000..40aa398
--- /dev/null
+++ b/assets/icons/opened_door.svg
@@ -0,0 +1,47 @@
+
diff --git a/lib/features/auth/bloc/auth_cubit.dart b/lib/features/auth/bloc/auth_cubit.dart
index 2952e70..276bfd8 100644
--- a/lib/features/auth/bloc/auth_cubit.dart
+++ b/lib/features/auth/bloc/auth_cubit.dart
@@ -8,7 +8,6 @@ import 'package:syncrow_app/features/auth/model/user_model.dart';
import 'package:syncrow_app/navigation/navigation_service.dart';
import 'package:syncrow_app/navigation/routing_constants.dart';
import 'package:syncrow_app/services/api/authentication_api.dart';
-import 'package:syncrow_app/services/api/profile_api.dart';
import 'package:syncrow_app/utils/helpers/shared_preferences_helper.dart';
import 'package:syncrow_app/utils/helpers/snack_bar.dart';
import 'package:syncrow_app/utils/resource_manager/strings_manager.dart';
diff --git a/lib/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart b/lib/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart
new file mode 100644
index 0000000..213dbeb
--- /dev/null
+++ b/lib/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart
@@ -0,0 +1,179 @@
+import 'dart:async';
+
+import 'package:dio/dio.dart';
+import 'package:firebase_database/firebase_database.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_event.dart';
+import 'package:syncrow_app/features/devices/bloc/door_sensor_bloc/door_sensor_state.dart';
+import 'package:syncrow_app/features/devices/model/device_control_model.dart';
+import 'package:syncrow_app/features/devices/model/device_report_model.dart';
+import 'package:syncrow_app/features/devices/model/door_sensor_model.dart';
+import 'package:syncrow_app/features/devices/model/status_model.dart';
+import 'package:syncrow_app/services/api/devices_api.dart';
+
+class DoorSensorBloc extends Bloc {
+ final String DSId;
+ DoorSensorBloc({
+ required this.DSId,
+ }) : super(const DoorSensorState()) {
+ on(_fetchStatus);
+ on(fetchLogsForLastMonth);
+ on(_toggleLowBattery);
+ on(_toggleClosingReminder);
+ on(_toggleDoorAlarm);
+ }
+ Timer? _timer;
+ bool lowBattery = false;
+ bool closingReminder = false;
+ bool doorAlarm = false;
+ DoorSensorModel deviceStatus =
+ DoorSensorModel(doorContactState: false, batteryPercentage: 0);
+
+ void _fetchStatus(
+ DoorSensorInitial event, Emitter emit) async {
+ emit(DoorSensorLoadingState());
+ try {
+ var response = await DevicesAPI.getDeviceStatus(DSId);
+ List statusModelList = [];
+ for (var status in response['status']) {
+ statusModelList.add(StatusModel.fromJson(status));
+ }
+ deviceStatus = DoorSensorModel.fromJson(
+ statusModelList,
+ );
+ emit(UpdateState(doorSensor: deviceStatus));
+ Future.delayed(const Duration(milliseconds: 500));
+ _listenToChanges();
+ } catch (e) {
+ emit(DoorSensorFailedState(errorMessage: e.toString()));
+ return;
+ }
+ }
+
+ // Toggle functions for each switch
+ void _toggleLowBattery(
+ ToggleLowBatteryEvent event, Emitter emit) async {
+ emit(LoadingNewSate(doorSensor: deviceStatus));
+ try {
+ lowBattery = event.isLowBatteryEnabled;
+ emit(UpdateState(doorSensor: deviceStatus));
+
+ // API call to update the state, if necessary
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(
+ deviceId: DSId,
+ code: 'low_battery',
+ value: lowBattery,
+ ),
+ DSId,
+ );
+ } catch (e) {
+ emit(DoorSensorFailedState(errorMessage: e.toString()));
+ }
+ }
+
+ void _toggleClosingReminder(
+ ToggleClosingReminderEvent event, Emitter emit) async {
+ emit(LoadingNewSate(doorSensor: deviceStatus));
+ try {
+ closingReminder = event.isClosingReminderEnabled;
+ emit(UpdateState(doorSensor: deviceStatus));
+
+ // API call to update the state, if necessary
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(
+ deviceId: DSId,
+ code: 'closing_reminder',
+ value: closingReminder,
+ ),
+ DSId,
+ );
+ } catch (e) {
+ emit(DoorSensorFailedState(errorMessage: e.toString()));
+ }
+ }
+
+ void _toggleDoorAlarm(
+ ToggleDoorAlarmEvent event, Emitter emit) async {
+ emit(LoadingNewSate(doorSensor: deviceStatus));
+ try {
+ doorAlarm = event.isDoorAlarmEnabled;
+ emit(UpdateState(doorSensor: deviceStatus));
+
+ // API call to update the state, if necessary
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(
+ deviceId: DSId,
+ code: 'door_alarm',
+ value: doorAlarm,
+ ),
+ DSId,
+ );
+ } catch (e) {
+ emit(DoorSensorFailedState(errorMessage: e.toString()));
+ }
+ }
+
+ DeviceReport recordGroups =
+ DeviceReport(startTime: '0', endTime: '0', data: []);
+
+ Future fetchLogsForLastMonth(
+ ReportLogsInitial event, Emitter emit) async {
+ // Get the current date and time
+ DateTime now = DateTime.now();
+
+ // Calculate the date one month ago
+ DateTime lastMonth = DateTime(now.year, now.month - 1, now.day);
+
+ // Convert the date to milliseconds since epoch (Unix timestamp in milliseconds)
+ int startTime = lastMonth.millisecondsSinceEpoch;
+ int endTime = now.millisecondsSinceEpoch;
+ try {
+ emit(DoorSensorLoadingState());
+ var response = await DevicesAPI.getReportLogs(
+ startTime:
+ startTime.toString(), // Convert to String if the API expects it
+ endTime: endTime.toString(), // Convert to String if the API expects it
+ deviceUuid: DSId,
+ code: 'doorcontact_state',
+ );
+ print('response======${response}');
+ recordGroups = response;
+ // Process response here
+ emit(UpdateState(doorSensor: deviceStatus));
+ } on DioException catch (e) {
+ final errorData = e.response!.data;
+ String errorMessage = errorData['message'];
+ // Handle error
+ print('Error fetching logs: ${errorMessage}');
+ }
+ }
+
+ _listenToChanges() {
+ try {
+ DatabaseReference ref =
+ FirebaseDatabase.instance.ref('device-status/$DSId');
+ Stream stream = ref.onValue;
+
+ stream.listen((DatabaseEvent event) async {
+ if (_timer != null) {
+ await Future.delayed(const Duration(seconds: 2));
+ }
+ Map usersMap =
+ event.snapshot.value as Map;
+ List statusList = [];
+
+ usersMap['status'].forEach((element) {
+ statusList.add(StatusModel(code: element['code'], value: true));
+ });
+
+ deviceStatus = DoorSensorModel.fromJson(statusList);
+ if (!isClosed) {
+ add(
+ DoorSensorSwitch(switchD: deviceStatus.doorContactState),
+ );
+ }
+ });
+ } catch (_) {}
+ }
+}
diff --git a/lib/features/devices/bloc/door_sensor_bloc/door_sensor_event.dart b/lib/features/devices/bloc/door_sensor_bloc/door_sensor_event.dart
new file mode 100644
index 0000000..8a99623
--- /dev/null
+++ b/lib/features/devices/bloc/door_sensor_bloc/door_sensor_event.dart
@@ -0,0 +1,102 @@
+import 'package:equatable/equatable.dart';
+
+abstract class DoorSensorEvent extends Equatable {
+ const DoorSensorEvent();
+
+ @override
+ List