diff --git a/assets/icons/detected_water_leak.svg b/assets/icons/detected_water_leak.svg
new file mode 100644
index 0000000..a098dac
--- /dev/null
+++ b/assets/icons/detected_water_leak.svg
@@ -0,0 +1,32 @@
+
diff --git a/assets/icons/normal_water_leak.svg b/assets/icons/normal_water_leak.svg
new file mode 100644
index 0000000..1359107
--- /dev/null
+++ b/assets/icons/normal_water_leak.svg
@@ -0,0 +1,27 @@
+
diff --git a/assets/icons/waterleak_icon.svg b/assets/icons/waterleak_icon.svg
new file mode 100644
index 0000000..60c65db
--- /dev/null
+++ b/assets/icons/waterleak_icon.svg
@@ -0,0 +1,8 @@
+
diff --git a/lib/features/devices/bloc/water_leak_bloc/water_leak_bloc.dart b/lib/features/devices/bloc/water_leak_bloc/water_leak_bloc.dart
new file mode 100644
index 0000000..4996830
--- /dev/null
+++ b/lib/features/devices/bloc/water_leak_bloc/water_leak_bloc.dart
@@ -0,0 +1,182 @@
+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/water_leak_bloc/water_leak_event.dart';
+import 'package:syncrow_app/features/devices/bloc/water_leak_bloc/water_leak_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/status_model.dart';
+import 'package:syncrow_app/features/devices/model/water_leak_model.dart';
+import 'package:syncrow_app/services/api/devices_api.dart';
+
+class WaterLeakBloc extends Bloc {
+ final String WLId;
+ WaterLeakBloc({
+ required this.WLId,
+ }) : super(const WaterLeakState()) {
+ on(_fetchStatus);
+ on(fetchLogsForLastMonth);
+ on(_toggleLowBattery);
+ on(_toggleClosingReminder);
+ on(_toggleWaterLeakAlarm);
+ }
+ Timer? _timer;
+ bool lowBattery = false;
+ bool closingReminder = false;
+ bool waterAlarm = false;
+ WaterLeakModel deviceStatus =
+ WaterLeakModel(waterContactState: false, batteryPercentage: 0);
+
+ void _fetchStatus(
+ WaterLeakInitial event, Emitter emit) async {
+ emit(WaterLeakLoadingState());
+ try {
+ var response = await DevicesAPI.getDeviceStatus(WLId);
+ List statusModelList = [];
+ for (var status in response['status']) {
+ statusModelList.add(StatusModel.fromJson(status));
+ }
+ deviceStatus = WaterLeakModel.fromJson(
+ statusModelList,
+ );
+ emit(UpdateState(waterSensor: deviceStatus));
+ Future.delayed(const Duration(milliseconds: 500));
+ _listenToChanges();
+ } catch (e) {
+ emit(WaterLeakFailedState(errorMessage: e.toString()));
+ return;
+ }
+ }
+
+ // Toggle functions for each switch
+ void _toggleLowBattery(
+ ToggleLowBatteryEvent event, Emitter emit) async {
+ emit(LoadingNewSate(waterSensor: deviceStatus));
+ try {
+ lowBattery = event.isLowBatteryEnabled;
+ emit(UpdateState(waterSensor: deviceStatus));
+
+ // API call to update the state, if necessary
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(
+ deviceId: WLId,
+ code: 'low_battery',
+ value: lowBattery,
+ ),
+ WLId,
+ );
+ } catch (e) {
+ emit(WaterLeakFailedState(errorMessage: e.toString()));
+ }
+ }
+
+ void _toggleClosingReminder(
+ ToggleClosingReminderEvent event, Emitter emit) async {
+ emit(LoadingNewSate(waterSensor: deviceStatus));
+ try {
+ closingReminder = event.isClosingReminderEnabled;
+ emit(UpdateState(waterSensor: deviceStatus));
+
+ // API call to update the state, if necessary
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(
+ deviceId: WLId,
+ code: 'closing_reminder',
+ value: closingReminder,
+ ),
+ WLId,
+ );
+ } catch (e) {
+ emit(WaterLeakFailedState(errorMessage: e.toString()));
+ }
+ }
+
+ void _toggleWaterLeakAlarm(
+ ToggleWaterLeakAlarmEvent event, Emitter emit) async {
+ emit(LoadingNewSate(waterSensor: deviceStatus));
+ try {
+ waterAlarm = event.isWaterLeakAlarmEnabled;
+ emit(UpdateState(waterSensor: deviceStatus));
+
+ // API call to update the state, if necessary
+ await DevicesAPI.controlDevice(
+ DeviceControlModel(
+ deviceId: WLId,
+ code: 'water_alarm',
+ value: waterAlarm,
+ ),
+ WLId,
+ );
+ } catch (e) {
+ emit(WaterLeakFailedState(errorMessage: e.toString()));
+ }
+ }
+
+ DeviceReport recordGroups = DeviceReport(
+ startTime: '0',
+ endTime: '0',
+ data: [DeviceEvent(code: '111', eventTime: 23456789, value: 'tyuio')]);
+
+ 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(WaterLeakLoadingState());
+ // 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: WLId,
+ // code: 'watercontact_state',
+ // );
+ // print('response======${response}');
+ // recordGroups = response;
+ // Process response here
+ emit(UpdateState(waterSensor: 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/$WLId');
+ 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 = WaterLeakModel.fromJson(statusList);
+ if (!isClosed) {
+ add(
+ WaterLeakSwitch(switchD: deviceStatus.waterContactState),
+ );
+ }
+ });
+ } catch (_) {}
+ }
+}
diff --git a/lib/features/devices/bloc/water_leak_bloc/water_leak_event.dart b/lib/features/devices/bloc/water_leak_bloc/water_leak_event.dart
new file mode 100644
index 0000000..0d2bb23
--- /dev/null
+++ b/lib/features/devices/bloc/water_leak_bloc/water_leak_event.dart
@@ -0,0 +1,102 @@
+import 'package:equatable/equatable.dart';
+
+abstract class WaterLeakEvent extends Equatable {
+ const WaterLeakEvent();
+
+ @override
+ List