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/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/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..91f02ce
--- /dev/null
+++ b/lib/features/devices/bloc/door_sensor_bloc/door_sensor_bloc.dart
@@ -0,0 +1,220 @@
+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/door_sensor_model.dart';
+import 'package:syncrow_app/features/devices/model/report_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;
+ final String switchCode;
+ DoorSensorBloc({required this.DSId, required this.switchCode})
+ : super(const DoorSensorState()) {
+ on(_fetchWaterHeaterStatus);
+ on(fetchLogsForLastMonth);
+ on(_changeFirstSwitch);
+ 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 _fetchWaterHeaterStatus(
+ 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;
+ }
+ }
+
+ void _changeFirstSwitch(
+ DoorSensorSwitch event, Emitter emit) async {
+ emit(LoadingNewSate(doorSensor: deviceStatus));
+ try {
+ deviceStatus.doorContactState = !event.switchD;
+ emit(UpdateState(doorSensor: deviceStatus));
+ final response = await DevicesAPI.controlDevice(
+ DeviceControlModel(
+ deviceId: DSId,
+ code: 'doorcontact_state',
+ value: deviceStatus.doorContactState),
+ DSId);
+
+ if (!response['success']) {
+ // add(InitialEvent(groupScreen: oneGangGroup));
+ }
+ } catch (_) {
+ emit(DoorSensorFailedState(errorMessage: _.toString()));
+ }
+ }
+
+ // 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()));
+ }
+ }
+
+ final List recordGroups = [
+ RecordGroup(
+ date: DateTime(2024, 8, 31),
+ records: [
+ Record(status: 'Opened', time: '15:10:25', isOpen: false),
+ Record(status: 'Closed', time: '12:24:45', isOpen: false),
+ Record(status: 'Opened', time: '12:20:05', isOpen: true),
+ ],
+ ),
+ RecordGroup(
+ date: DateTime(2024, 8, 30),
+ records: [
+ Record(status: 'Opened', time: '14:15:30', isOpen: true),
+ Record(status: 'Closed', time: '10:22:45', isOpen: false),
+ ],
+ ),
+ RecordGroup(
+ date: DateTime(2024, 8, 29),
+ records: [
+ Record(status: 'Opened', time: '13:45:00', isOpen: true),
+ Record(status: 'Closed', time: '11:30:15', isOpen: false),
+ Record(status: 'Opened', time: '09:20:10', isOpen: true),
+ ],
+ ),
+ ];
+
+ 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 {
+ 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',
+ );
+ // Process response here
+ print(response);
+ } 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: element['value']));
+ });
+
+ 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