From 754d869fac5856ef90efbb56041eab3255a810b4 Mon Sep 17 00:00:00 2001 From: mohammad Date: Mon, 7 Oct 2024 16:53:50 +0300 Subject: [PATCH] water leak --- assets/icons/detected_water_leak.svg | 32 +++ assets/icons/normal_water_leak.svg | 27 ++ assets/icons/waterleak_icon.svg | 8 + .../bloc/water_leak_bloc/water_leak_bloc.dart | 182 +++++++++++++ .../water_leak_bloc/water_leak_event.dart | 102 ++++++++ .../water_leak_bloc/water_leak_state.dart | 39 +++ lib/features/devices/model/device_model.dart | 5 +- .../devices/model/water_leak_model.dart | 28 ++ .../view/widgets/room_page_switch.dart | 8 + .../water_leak_notification_settings.dart | 93 +++++++ .../water_leak/water_leak_records_screen.dart | 220 ++++++++++++++++ .../widgets/water_leak/water_leak_screen.dart | 203 +++++++++++++++ lib/generated/assets.dart | 240 ++++++++++++------ lib/utils/resource_manager/constants.dart | 3 + pubspec.yaml | 2 +- 15 files changed, 1111 insertions(+), 81 deletions(-) create mode 100644 assets/icons/detected_water_leak.svg create mode 100644 assets/icons/normal_water_leak.svg create mode 100644 assets/icons/waterleak_icon.svg create mode 100644 lib/features/devices/bloc/water_leak_bloc/water_leak_bloc.dart create mode 100644 lib/features/devices/bloc/water_leak_bloc/water_leak_event.dart create mode 100644 lib/features/devices/bloc/water_leak_bloc/water_leak_state.dart create mode 100644 lib/features/devices/model/water_leak_model.dart create mode 100644 lib/features/devices/view/widgets/water_leak/water_leak_notification_settings.dart create mode 100644 lib/features/devices/view/widgets/water_leak/water_leak_records_screen.dart create mode 100644 lib/features/devices/view/widgets/water_leak/water_leak_screen.dart 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 get props => []; +} + +class WaterLeakLoading extends WaterLeakEvent {} + +class WaterLeakSwitch extends WaterLeakEvent { + final bool switchD; + final String deviceId; + final String productId; + const WaterLeakSwitch({required this.switchD, this.deviceId = '', this.productId = ''}); + + @override + List get props => [switchD, deviceId, productId]; +} + +class WaterLeakUpdated extends WaterLeakEvent {} + +class WaterLeakInitial extends WaterLeakEvent { + const WaterLeakInitial(); +} + +class ReportLogsInitial extends WaterLeakEvent { + const ReportLogsInitial(); +} + + +class WaterLeakChangeStatus extends WaterLeakEvent {} + + +class GetCounterEvent extends WaterLeakEvent { + final String deviceCode; + const GetCounterEvent({required this.deviceCode}); + @override + List get props => [deviceCode]; +} + + + +class ToggleLowBatteryEvent extends WaterLeakEvent { + final bool isLowBatteryEnabled; + + const ToggleLowBatteryEvent(this.isLowBatteryEnabled); + + @override + List get props => [isLowBatteryEnabled]; +} + +class ToggleClosingReminderEvent extends WaterLeakEvent { + final bool isClosingReminderEnabled; + + const ToggleClosingReminderEvent(this.isClosingReminderEnabled); + + @override + List get props => [isClosingReminderEnabled]; +} + +class ToggleWaterLeakAlarmEvent extends WaterLeakEvent { + final bool isWaterLeakAlarmEnabled; + + const ToggleWaterLeakAlarmEvent(this.isWaterLeakAlarmEnabled); + + @override + List get props => [isWaterLeakAlarmEnabled]; +} + + + +class SetCounterValue extends WaterLeakEvent { + final Duration duration; + final String deviceCode; + const SetCounterValue({required this.duration, required this.deviceCode}); + @override + List get props => [duration, deviceCode]; +} + +class StartTimer extends WaterLeakEvent { + final int duration; + + const StartTimer(this.duration); + + @override + List get props => [duration]; +} + +class TickTimer extends WaterLeakEvent { + final int remainingTime; + + const TickTimer(this.remainingTime); + + @override + List get props => [remainingTime]; +} + +class StopTimer extends WaterLeakEvent {} + +class OnClose extends WaterLeakEvent {} diff --git a/lib/features/devices/bloc/water_leak_bloc/water_leak_state.dart b/lib/features/devices/bloc/water_leak_bloc/water_leak_state.dart new file mode 100644 index 0000000..c4a3ad3 --- /dev/null +++ b/lib/features/devices/bloc/water_leak_bloc/water_leak_state.dart @@ -0,0 +1,39 @@ +import 'package:equatable/equatable.dart'; +import 'package:syncrow_app/features/devices/model/water_leak_model.dart'; + + class WaterLeakState extends Equatable { + const WaterLeakState(); + + @override + List get props => []; +} + +class WaterLeakInitialState extends WaterLeakState {} + +class WaterLeakLoadingState extends WaterLeakState {} + +class WaterLeakFailedState extends WaterLeakState { + final String errorMessage; + + const WaterLeakFailedState({required this.errorMessage}); + + @override + List get props => [errorMessage]; +} + +class UpdateState extends WaterLeakState { + final WaterLeakModel waterSensor; + const UpdateState({required this.waterSensor}); + + @override + List get props => [waterSensor]; +} + + +class LoadingNewSate extends WaterLeakState { + final WaterLeakModel waterSensor; + const LoadingNewSate({required this.waterSensor}); + + @override + List get props => [waterSensor]; +} diff --git a/lib/features/devices/model/device_model.dart b/lib/features/devices/model/device_model.dart index 44899e6..799faa3 100644 --- a/lib/features/devices/model/device_model.dart +++ b/lib/features/devices/model/device_model.dart @@ -74,8 +74,9 @@ class DeviceModel { tempIcon = Assets.garageIcon; } else if (type == DeviceType.ThreeTouch) { tempIcon = Assets.assetsIcons3GangSwitch; - } - else { + } else if (type == DeviceType.WaterLeak) { + tempIcon = Assets.waterLeakIcon; + } else { tempIcon = Assets.assetsIconsLogo; } diff --git a/lib/features/devices/model/water_leak_model.dart b/lib/features/devices/model/water_leak_model.dart new file mode 100644 index 0000000..15fec65 --- /dev/null +++ b/lib/features/devices/model/water_leak_model.dart @@ -0,0 +1,28 @@ +import 'package:syncrow_app/features/devices/model/status_model.dart'; + +class WaterLeakModel { + bool waterContactState; + int batteryPercentage; + + WaterLeakModel({ + required this.waterContactState, + required this.batteryPercentage, + }); + + factory WaterLeakModel.fromJson(List jsonList) { + late bool _waterContactState; + late int _batteryPercentage; + + for (int i = 0; i < jsonList.length; i++) { + if (jsonList[i].code == 'watersensor_state') { + _waterContactState = jsonList[i].value ?? false; + } else if (jsonList[i].code == 'battery_percentage') { + _batteryPercentage = jsonList[i].value ?? 0; + } + } + return WaterLeakModel( + waterContactState: _waterContactState, + batteryPercentage: _batteryPercentage, + ); + } +} diff --git a/lib/features/devices/view/widgets/room_page_switch.dart b/lib/features/devices/view/widgets/room_page_switch.dart index 3eb0d6c..8e06f4d 100644 --- a/lib/features/devices/view/widgets/room_page_switch.dart +++ b/lib/features/devices/view/widgets/room_page_switch.dart @@ -23,6 +23,7 @@ import 'package:syncrow_app/features/devices/view/widgets/ceiling_sensor/ceiling import 'package:syncrow_app/features/devices/view/widgets/smart_door/door_interface.dart'; import 'package:syncrow_app/features/devices/view/widgets/three_gang/three_gang_interface.dart'; import 'package:syncrow_app/features/devices/view/widgets/water_heater/water_heater_page.dart'; +import 'package:syncrow_app/features/devices/view/widgets/water_leak/water_leak_screen.dart'; import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/helpers/custom_page_route.dart'; @@ -196,6 +197,13 @@ void showDeviceInterface(DeviceModel device, BuildContext context) { pageBuilder: (context, animation1, animation2) => GarageDoorScreen(device: device))); + case DeviceType.WaterLeak: + Navigator.push( + context, + PageRouteBuilder( + pageBuilder: (context, animation1, animation2) => + WaterLeakScreen(device: device))); + break; default: } diff --git a/lib/features/devices/view/widgets/water_leak/water_leak_notification_settings.dart b/lib/features/devices/view/widgets/water_leak/water_leak_notification_settings.dart new file mode 100644 index 0000000..404b256 --- /dev/null +++ b/lib/features/devices/view/widgets/water_leak/water_leak_notification_settings.dart @@ -0,0 +1,93 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/water_leak_bloc/water_leak_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/shared_widgets/default_container.dart'; +import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class NotificationSettingsPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Notification Settings', + child: BlocProvider( + create: (context) => + WaterLeakBloc(WLId: '')..add(const WaterLeakInitial()), + child: BlocBuilder( + builder: (context, state) { + final waterLeakBloc = BlocProvider.of(context); + + return state is WaterLeakLoading + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : Column( + children: [ + DefaultContainer( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 50, + child: ListTile( + contentPadding: EdgeInsets.zero, + leading: const BodyLarge( + text: 'Low Battery Alarm', + fontWeight: FontWeight.normal, + ), + trailing: Transform.scale( + scale: .8, + child: CupertinoSwitch( + value: waterLeakBloc.lowBattery, + onChanged: (value) { + context.read().add( + ToggleLowBatteryEvent(value)); + }, + applyTheme: true, + )), + ), + ), + const Divider( + color: ColorsManager.graysColor, + ), + SizedBox( + height: 50, + child: ListTile( + contentPadding: EdgeInsets.zero, + leading: const BodyLarge( + text: 'Water Leakage Alarm', + fontWeight: FontWeight.normal, + ), + trailing: Transform.scale( + scale: .8, + child: CupertinoSwitch( + value: waterLeakBloc.closingReminder, + onChanged: (value) { + context.read().add( + ToggleClosingReminderEvent( + value)); + }, + applyTheme: true, + )), + ), + ), + ], + ), + ), + ], + ); + }, + ), + )); + } +} diff --git a/lib/features/devices/view/widgets/water_leak/water_leak_records_screen.dart b/lib/features/devices/view/widgets/water_leak/water_leak_records_screen.dart new file mode 100644 index 0000000..456b4ab --- /dev/null +++ b/lib/features/devices/view/widgets/water_leak/water_leak_records_screen.dart @@ -0,0 +1,220 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:intl/intl.dart'; +import 'package:syncrow_app/features/devices/bloc/water_leak_bloc/water_leak_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_report_model.dart'; +import 'package:syncrow_app/features/shared_widgets/default_container.dart'; +import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; +import 'package:syncrow_app/utils/context_extension.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class WaterLeakRecordsScreen extends StatelessWidget { + final String WLId; + const WaterLeakRecordsScreen({super.key, required this.WLId}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Records', + child: BlocProvider( + create: (context) => + WaterLeakBloc(WLId: WLId ?? '')..add(const ReportLogsInitial()), + child: BlocBuilder( + builder: (context, state) { + final waterSensorBloc = BlocProvider.of(context); + final Map> groupedRecords = {}; + + if (state is WaterLeakLoadingState) { + return const Center( + child: DefaultContainer( + width: 50, height: 50, child: CircularProgressIndicator()), + ); + } else if (state is UpdateState) { + // Group records by formatted date + + // Iterate over the data list in DeviceReport + for (var record in waterSensorBloc.recordGroups.data!) { + final DateTime eventDateTime = + DateTime.fromMillisecondsSinceEpoch(record.eventTime!); + final String formattedDate = + DateFormat('EEEE, dd/MM/yyyy').format(eventDateTime); + + // Group by formatted date + if (groupedRecords.containsKey(formattedDate)) { + groupedRecords[formattedDate]!.add(record); + } else { + groupedRecords[formattedDate] = [record]; + } + } + } + return DefaultTabController( + // Wrap with DefaultTabController + length: 2, + child: Column( + children: [ + Container( + width: MediaQuery.of(context).size.width, + decoration: const ShapeDecoration( + color: ColorsManager.onPrimaryColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(30)), + ), + ), + child: TabBar( + onTap: (value) { + // if (value == 0) { + // if (oneTouchBloc.createSchedule == true) { + // // oneTouchBloc.toggleCreateSchedule(); + // oneTouchBloc + // .add(const ToggleCreateScheduleEvent(index: 0)); + // } + // oneTouchBloc.add(const ToggleSelectedEvent(index: 0)); + // } else { + // oneTouchBloc.add(const ToggleSelectedEvent(index: 1)); + // } + }, + indicatorColor: Colors.white, // Customize the indicator + dividerHeight: 0, + indicatorSize: TabBarIndicatorSize.tab, + indicator: const ShapeDecoration( + color: ColorsManager.slidingBlueColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(20)), + ), + ), + tabs: [ + Tab( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 10), + child: BodySmall( + text: 'Record', + style: context.bodySmall.copyWith( + color: ColorsManager.blackColor, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + ), + ), + ), + Tab( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Text( + 'Automation Record', + style: context.bodySmall.copyWith( + color: ColorsManager.blackColor, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + ), + ), + ), + ], + ), + ), + Expanded( + child: TabBarView( + physics: + const NeverScrollableScrollPhysics(), // Disable swiping + + children: [ + // Build the ListView with grouped data + ListView.builder( + itemCount: groupedRecords.length, + itemBuilder: (context, index) { + final String date = + groupedRecords.keys.elementAt(index); + final List recordsForDate = + groupedRecords[date]!; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Date header + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + date, + style: const TextStyle( + color: ColorsManager.grayColor, + fontSize: 13, + fontWeight: FontWeight.w700, + ), + ), + ), + // List of records for the specific date + DefaultContainer( + child: Column( + children: [ + ...recordsForDate + .asMap() + .entries + .map((entry) { + final int idx = entry.key; + final DeviceEvent record = entry.value; + final DateTime eventDateTime = + DateTime.fromMillisecondsSinceEpoch( + record.eventTime!); + final String formattedTime = + DateFormat('HH:mm:ss') + .format(eventDateTime); + + return Column( + children: [ + Container( + child: ListTile( + leading: Icon( + record.value == 'true' + ? Icons.radio_button_checked + : Icons + .radio_button_unchecked, + color: record.value == 'true' + ? Colors.blue + : Colors.grey, + ), + title: Text( + record.value == 'true' + ? "Opened" + : "Closed", + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + subtitle: Text('$formattedTime'), + ), + ), + // Only add Divider if it's not the last item + if (idx != recordsForDate.length - 1) + const Divider( + color: ColorsManager.graysColor, + ), + ], + ); + }).toList(), + ], + ), + ), + ], + ); + }, + ), + Container( + height: 10, + width: 20, + ) + ])) + ], + ), + ); + } + // return const Center(child: Text('No data available.')); + // }, + ), + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/water_leak/water_leak_screen.dart b/lib/features/devices/view/widgets/water_leak/water_leak_screen.dart new file mode 100644 index 0000000..cee3cd9 --- /dev/null +++ b/lib/features/devices/view/widgets/water_leak/water_leak_screen.dart @@ -0,0 +1,203 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_app/features/devices/bloc/water_leak_bloc/water_leak_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_model.dart'; +import 'package:syncrow_app/features/devices/model/water_leak_model.dart'; +import 'package:syncrow_app/features/devices/view/widgets/water_leak/water_leak_notification_settings.dart'; +import 'package:syncrow_app/features/devices/view/widgets/water_leak/water_leak_records_screen.dart'; +import 'package:syncrow_app/features/shared_widgets/battery_bar.dart'; +import 'package:syncrow_app/features/shared_widgets/default_container.dart'; +import 'package:syncrow_app/features/shared_widgets/default_scaffold.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; +import 'package:syncrow_app/generated/assets.dart'; + +class WaterLeakScreen extends StatelessWidget { + final DeviceModel? device; + + const WaterLeakScreen({super.key, this.device}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Water Leak Sensor', + child: BlocProvider( + create: (context) => WaterLeakBloc(WLId: device?.uuid ?? '') + ..add(const WaterLeakInitial()), + child: BlocBuilder( + builder: (context, state) { + final waterLeakBloc = BlocProvider.of(context); + WaterLeakModel model = + WaterLeakModel(batteryPercentage: 0, waterContactState: false); + if (state is LoadingNewSate) { + model = state.waterSensor; + } else if (state is UpdateState) { + model = state.waterSensor; + } + return state is WaterLeakLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async { + waterLeakBloc.add(const WaterLeakInitial()); + }, + child: ListView( + children: [ + SizedBox( + height: MediaQuery.sizeOf(context).height * 0.8, + child: Column( + children: [ + BatteryBar( + batteryPercentage: model.batteryPercentage, + ), + Expanded( + flex: 4, + child: InkWell( + overlayColor: WidgetStateProperty.all( + Colors.transparent), + onTap: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Container( + decoration: BoxDecoration( + // color: Colors.white.withOpacity(0.1), + borderRadius: + BorderRadius.circular(890), + boxShadow: [ + BoxShadow( + color: + Colors.white.withOpacity(0.1), + blurRadius: 24, + offset: const Offset(-5, -5), + blurStyle: BlurStyle.outer, + ), + BoxShadow( + color: Colors.black + .withOpacity(0.11), + blurRadius: 25, + offset: const Offset(5, 5), + blurStyle: BlurStyle.outer, + ), + BoxShadow( + color: Colors.black + .withOpacity(0.13), + blurRadius: 30, + offset: const Offset(5, 5), + blurStyle: BlurStyle.inner, + ), + ], + ), + child: SvgPicture.asset( + model.waterContactState + ? Assets.normalWaterLeak + : Assets.detectedWaterLeak, + fit: BoxFit.fill, + ), + ), + ], + ), + ), + ), + Flexible( + child: Row( + children: [ + Expanded( + child: DefaultContainer( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + WaterLeakRecordsScreen(WLId: device!.uuid!)), + ); + }, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + ConstrainedBox( + constraints: const BoxConstraints( + maxHeight: 46, maxWidth: 50), + child: SvgPicture.asset( + Assets.doorRecordsIcon), + ), + const SizedBox( + height: 15, + ), + const Flexible( + child: FittedBox( + child: BodySmall( + text: 'Records', + // doorLockButtons.keys.elementAt(index), + textAlign: TextAlign.center, + ), + ), + ), + ], + ), + ), + ), + const SizedBox( + width: 10, + ), + Expanded( + child: DefaultContainer( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => NotificationSettingsPage()), + ); + }, + child: Column( + crossAxisAlignment: + CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + ConstrainedBox( + constraints: const BoxConstraints( + maxHeight: 46, maxWidth: 50), + child: SvgPicture.asset(Assets + .doorNotificationSetting), + ), + const SizedBox( + height: 15, + ), + const Flexible( + child: FittedBox( + child: BodySmall( + text: 'Notification Settings', + // doorLockButtons.keys.elementAt(index), + textAlign: TextAlign.center, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ) + ], + ), + ), + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index 68575b6..0a6ebda 100644 --- a/lib/generated/assets.dart +++ b/lib/generated/assets.dart @@ -3,7 +3,8 @@ class Assets { /// Assets for assetsFontsAftikaRegular /// assets/fonts/AftikaRegular.ttf - static const String assetsFontsAftikaRegular = "assets/fonts/AftikaRegular.ttf"; + static const String assetsFontsAftikaRegular = + "assets/fonts/AftikaRegular.ttf"; /// Assets for assetsIcons3GangSwitch /// assets/icons/3GangSwitch.svg @@ -19,82 +20,98 @@ class Assets { /// Assets for assetsIconsAutomatedClock /// assets/icons/automated_clock.svg - static const String assetsIconsAutomatedClock = "assets/icons/automated_clock.svg"; + static const String assetsIconsAutomatedClock = + "assets/icons/automated_clock.svg"; static const String acSwitchIcon = "assets/icons/ac_switch_ic.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstChargeddmOff.svg - static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff = + static const String + assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstChargeddmOff = "assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstDefaultdmOff.svg - static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff = + static const String + assetsIconsBatteryDmOffPerOffchargOfflowOffpmOffstDefaultdmOff = "assets/icons/battery/dmOff/perOffchargOfflowOffpmOffstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff /// assets/icons/battery/dmOff/perOffchargOfflowOffpmOnstChargeddmOff.svg - static const String assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff = + static const String + assetsIconsBatteryDmOffPerOffchargOfflowOffpmOnstChargeddmOff = "assets/icons/battery/dmOff/perOffchargOfflowOffpmOnstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff /// assets/icons/battery/dmOff/perOffchargOfflowOnpmOffstDefaultdmOff.svg - static const String assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff = + static const String + assetsIconsBatteryDmOffPerOffchargOfflowOnpmOffstDefaultdmOff = "assets/icons/battery/dmOff/perOffchargOfflowOnpmOffstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff /// assets/icons/battery/dmOff/perOffchargOfflowOnpmOnstDefaultdmOff.svg - static const String assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff = + static const String + assetsIconsBatteryDmOffPerOffchargOfflowOnpmOnstDefaultdmOff = "assets/icons/battery/dmOff/perOffchargOfflowOnpmOnstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff /// assets/icons/battery/dmOff/perOffchargOnlowOffpmOffstChargeddmOff.svg - static const String assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff = + static const String + assetsIconsBatteryDmOffPerOffchargOnlowOffpmOffstChargeddmOff = "assets/icons/battery/dmOff/perOffchargOnlowOffpmOffstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff /// assets/icons/battery/dmOff/perOffchargOnlowOnpmOffstlowBatterydmOff.svg - static const String assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff = + static const String + assetsIconsBatteryDmOffPerOffchargOnlowOnpmOffstlowBatterydmOff = "assets/icons/battery/dmOff/perOffchargOnlowOnpmOffstlowBatterydmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff /// assets/icons/battery/dmOff/perOffchargOnlowOnpmOnstlowpmdmOff.svg - static const String assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff = + static const String + assetsIconsBatteryDmOffPerOffchargOnlowOnpmOnstlowpmdmOff = "assets/icons/battery/dmOff/perOffchargOnlowOnpmOnstlowpmdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstChargeddmOff.svg - static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff = + static const String + assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstChargeddmOff = "assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstDefaultdmOff.svg - static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff = + static const String + assetsIconsBatteryDmOffPerOnchargOfflowOffpmOffstDefaultdmOff = "assets/icons/battery/dmOff/perOnchargOfflowOffpmOffstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff /// assets/icons/battery/dmOff/perOnchargOfflowOffpmOnstChargeddmOff.svg - static const String assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff = + static const String + assetsIconsBatteryDmOffPerOnchargOfflowOffpmOnstChargeddmOff = "assets/icons/battery/dmOff/perOnchargOfflowOffpmOnstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff /// assets/icons/battery/dmOff/perOnchargOfflowOnpmOffstDefaultdmOff.svg - static const String assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff = + static const String + assetsIconsBatteryDmOffPerOnchargOfflowOnpmOffstDefaultdmOff = "assets/icons/battery/dmOff/perOnchargOfflowOnpmOffstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff /// assets/icons/battery/dmOff/perOnchargOfflowOnpmOnstDefaultdmOff.svg - static const String assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff = + static const String + assetsIconsBatteryDmOffPerOnchargOfflowOnpmOnstDefaultdmOff = "assets/icons/battery/dmOff/perOnchargOfflowOnpmOnstDefaultdmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff /// assets/icons/battery/dmOff/perOnchargOnlowOffpmOffstChargeddmOff.svg - static const String assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff = + static const String + assetsIconsBatteryDmOffPerOnchargOnlowOffpmOffstChargeddmOff = "assets/icons/battery/dmOff/perOnchargOnlowOffpmOffstChargeddmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff /// assets/icons/battery/dmOff/perOnchargOnlowOnpmOffstlowBatterydmOff.svg - static const String assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff = + static const String + assetsIconsBatteryDmOffPerOnchargOnlowOnpmOffstlowBatterydmOff = "assets/icons/battery/dmOff/perOnchargOnlowOnpmOffstlowBatterydmOff.svg"; /// Assets for assetsIconsBatteryDmOffPerOnchargOnlowOnpmOnstlowpmdmOff @@ -104,37 +121,44 @@ class Assets { /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstChargeddmOn.svg - static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn = + static const String + assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstChargeddmOn = "assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstDefaultdmOn.svg - static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn = + static const String + assetsIconsBatteryDmOnPerOffchargOfflowOffpmOffstDefaultdmOn = "assets/icons/battery/dmOn/perOffchargOfflowOffpmOffstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn /// assets/icons/battery/dmOn/perOffchargOfflowOffpmOnstChargeddmOn.svg - static const String assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn = + static const String + assetsIconsBatteryDmOnPerOffchargOfflowOffpmOnstChargeddmOn = "assets/icons/battery/dmOn/perOffchargOfflowOffpmOnstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn /// assets/icons/battery/dmOn/perOffchargOfflowOnpmOffstDefaultdmOn.svg - static const String assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn = + static const String + assetsIconsBatteryDmOnPerOffchargOfflowOnpmOffstDefaultdmOn = "assets/icons/battery/dmOn/perOffchargOfflowOnpmOffstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn /// assets/icons/battery/dmOn/perOffchargOfflowOnpmOnstDefaultdmOn.svg - static const String assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn = + static const String + assetsIconsBatteryDmOnPerOffchargOfflowOnpmOnstDefaultdmOn = "assets/icons/battery/dmOn/perOffchargOfflowOnpmOnstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn /// assets/icons/battery/dmOn/perOffchargOnlowOffpmOffstChargeddmOn.svg - static const String assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn = + static const String + assetsIconsBatteryDmOnPerOffchargOnlowOffpmOffstChargeddmOn = "assets/icons/battery/dmOn/perOffchargOnlowOffpmOffstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn /// assets/icons/battery/dmOn/perOffchargOnlowOnpmOffstlowBatterydmOn.svg - static const String assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn = + static const String + assetsIconsBatteryDmOnPerOffchargOnlowOnpmOffstlowBatterydmOn = "assets/icons/battery/dmOn/perOffchargOnlowOnpmOffstlowBatterydmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOffchargOnlowOnpmOnstlowpmdmOn @@ -144,37 +168,44 @@ class Assets { /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstChargeddmOn.svg - static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn = + static const String + assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstChargeddmOn = "assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstDefaultdmOn.svg - static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn = + static const String + assetsIconsBatteryDmOnPerOnchargOfflowOffpmOffstDefaultdmOn = "assets/icons/battery/dmOn/perOnchargOfflowOffpmOffstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn /// assets/icons/battery/dmOn/perOnchargOfflowOffpmOnstChargeddmOn.svg - static const String assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn = + static const String + assetsIconsBatteryDmOnPerOnchargOfflowOffpmOnstChargeddmOn = "assets/icons/battery/dmOn/perOnchargOfflowOffpmOnstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn /// assets/icons/battery/dmOn/perOnchargOfflowOnpmOffstDefaultdmOn.svg - static const String assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn = + static const String + assetsIconsBatteryDmOnPerOnchargOfflowOnpmOffstDefaultdmOn = "assets/icons/battery/dmOn/perOnchargOfflowOnpmOffstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn /// assets/icons/battery/dmOn/perOnchargOfflowOnpmOnstDefaultdmOn.svg - static const String assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn = + static const String + assetsIconsBatteryDmOnPerOnchargOfflowOnpmOnstDefaultdmOn = "assets/icons/battery/dmOn/perOnchargOfflowOnpmOnstDefaultdmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn /// assets/icons/battery/dmOn/perOnchargOnlowOffpmOffstChargeddmOn.svg - static const String assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn = + static const String + assetsIconsBatteryDmOnPerOnchargOnlowOffpmOffstChargeddmOn = "assets/icons/battery/dmOn/perOnchargOnlowOffpmOffstChargeddmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn /// assets/icons/battery/dmOn/perOnchargOnlowOnpmOffstlowBatterydmOn.svg - static const String assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn = + static const String + assetsIconsBatteryDmOnPerOnchargOnlowOnpmOffstlowBatterydmOn = "assets/icons/battery/dmOn/perOnchargOnlowOnpmOffstlowBatterydmOn.svg"; /// Assets for assetsIconsBatteryDmOnPerOnchargOnlowOnpmOnstlowpmdmOn @@ -218,7 +249,8 @@ class Assets { static const String assetsIconsCurtainsIconVerticalBlade = "assets/icons/curtainsIcon/left_vertical_blade.svg"; - static const String rightVerticalBlade = "assets/icons/curtainsIcon/right_vertical_blade.svg"; + static const String rightVerticalBlade = + "assets/icons/curtainsIcon/right_vertical_blade.svg"; /// Assets for assetsIconsDashboard /// assets/icons/dashboard.svg @@ -228,7 +260,8 @@ class Assets { /// Assets for assetsIconsDashboardFill /// assets/icons/dashboard-fill.svg - static const String assetsIconsDashboardFill = "assets/icons/dashboard-fill.svg"; + static const String assetsIconsDashboardFill = + "assets/icons/dashboard-fill.svg"; /// Assets for assetsIconsDevices /// assets/icons/Devices.svg @@ -244,7 +277,8 @@ class Assets { /// Assets for assetsIconsDoorLockLinkage /// assets/icons/DoorLockLinkage.svg - static const String assetsIconsDoorLockLinkage = "assets/icons/DoorLockLinkage.svg"; + static const String assetsIconsDoorLockLinkage = + "assets/icons/DoorLockLinkage.svg"; /// Assets for assetsIconsDoorLockLock /// assets/icons/DoorLockLock.svg @@ -252,15 +286,18 @@ class Assets { /// Assets for assetsIconsDoorLockMembers /// assets/icons/DoorLockMembers.svg - static const String assetsIconsDoorLockMembers = "assets/icons/DoorLockMembers.svg"; + static const String assetsIconsDoorLockMembers = + "assets/icons/DoorLockMembers.svg"; /// Assets for assetsIconsDoorLockPassword /// assets/icons/DoorLockPassword.svg - static const String assetsIconsDoorLockPassword = "assets/icons/DoorLockPassword.svg"; + static const String assetsIconsDoorLockPassword = + "assets/icons/DoorLockPassword.svg"; /// Assets for assetsIconsDoorLockRecords /// assets/icons/DoorLockRecords.svg - static const String assetsIconsDoorLockRecords = "assets/icons/DoorLockRecords.svg"; + static const String assetsIconsDoorLockRecords = + "assets/icons/DoorLockRecords.svg"; /// Assets for assetsIconsDoorlockAssetsBatteryIndicator /// assets/icons/doorlock-assets/BatteryIndicator.svg @@ -281,7 +318,8 @@ class Assets { /// assets/icons/doorlock-assets/lockIcon.svg static const String assetsIconsDoorlockAssetsLockIcon = "assets/icons/doorlock-assets/lockIcon.svg"; - static const String doorUnlockIcon = "assets/icons/doorlock-assets/door_un_look_ic.svg"; + static const String doorUnlockIcon = + "assets/icons/doorlock-assets/door_un_look_ic.svg"; /// Assets for assetsIconsDoorlockAssetsMembersManagement /// assets/icons/doorlock-assets/members-management.svg @@ -369,11 +407,13 @@ class Assets { /// Assets for assetsIconsLightSwitchOff /// assets/icons/lightSwitchOff.svg - static const String assetsIconsLightSwitchOff = "assets/icons/lightSwitchOff.svg"; + static const String assetsIconsLightSwitchOff = + "assets/icons/lightSwitchOff.svg"; /// Assets for assetsIconsLightSwitchOn /// assets/icons/lightSwitchOn.svg - static const String assetsIconsLightSwitchOn = "assets/icons/lightSwitchOn.svg"; + static const String assetsIconsLightSwitchOn = + "assets/icons/lightSwitchOn.svg"; /// Assets for assetsIconsLinkageIconsDoorLockAlarm /// assets/icons/linkageIcons/doorLockAlarm.svg @@ -382,7 +422,8 @@ class Assets { /// Assets for assetsIconsLinkTimeLimitedPasswordIcon /// assets/icons/timeLimitedPasswordIcon.svg - static const String timeLimitedPasswordIcon = "assets/icons/timeLimitedPasswordIcon.svg"; + static const String timeLimitedPasswordIcon = + "assets/icons/timeLimitedPasswordIcon.svg"; /// Assets for assetsIconsoneTimePassword /// assets/icons/oneTimePassword.svg @@ -390,7 +431,8 @@ class Assets { /// Assets for assetsIconsTimeLimitedPassword /// assets/icons/timeLimitedPassword.svg - static const String timeLimitedPassword = "assets/icons/timeLimitedPassword.svg"; + static const String timeLimitedPassword = + "assets/icons/timeLimitedPassword.svg"; /// Assets for assetsIconsNoValidPasswords /// assets/icons/noValidPasswords.svg @@ -559,11 +601,13 @@ class Assets { /// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// assets/icons/presence-sensor-assets/space_type_icon.svg - static const String spaceTypeIcon = "assets/icons/presence-sensor-assets/space_type_icon.svg"; + static const String spaceTypeIcon = + "assets/icons/presence-sensor-assets/space_type_icon.svg"; /// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// assets/icons/presence-sensor-assets/space_type_icon.svg - static const String sensitivityIcon = "assets/icons/presence-sensor-assets/Sensitivity.svg"; + static const String sensitivityIcon = + "assets/icons/presence-sensor-assets/Sensitivity.svg"; /// Assets for assetsIconsPresenceSensorAssetsParameterSettings /// assets/icons/presence-sensor-assets/maximum_distance.svg @@ -596,7 +640,8 @@ class Assets { /// Assets for assetsIconsRoutinesFill /// assets/icons/Routines-fill.svg - static const String assetsIconsRoutinesFill = "assets/icons/Routines-fill.svg"; + static const String assetsIconsRoutinesFill = + "assets/icons/Routines-fill.svg"; /// Assets for assetsIconsScan /// assets/icons/Scan.svg @@ -628,7 +673,8 @@ class Assets { /// Assets for assetsIconsSustainability /// assets/icons/sustainability.svg - static const String assetsIconsSustainability = "assets/icons/sustainability.svg"; + static const String assetsIconsSustainability = + "assets/icons/sustainability.svg"; /// Assets for assetsIconsUnlockingMethodsIconsFace /// assets/icons/unlockingMethodsIcons/face.svg @@ -724,7 +770,8 @@ class Assets { /// Assets for assetsImagesHorizintalBlade /// assets/images/HorizintalBlade.png - static const String assetsImagesHorizintalBlade = "assets/images/HorizintalBlade.png"; + static const String assetsImagesHorizintalBlade = + "assets/images/HorizintalBlade.png"; /// Assets for assetsImagesLogo /// assets/images/Logo.svg @@ -732,7 +779,8 @@ class Assets { /// Assets for assetsImagesLogoHorizontal /// assets/images/logo_horizontal.png - static const String assetsImagesLogoHorizontal = "assets/images/logo_horizontal.png"; + static const String assetsImagesLogoHorizontal = + "assets/images/logo_horizontal.png"; /// Assets for assetsImagesPause /// assets/images/Pause.png @@ -762,7 +810,8 @@ class Assets { /// assets/images/Window.png static const String assetsImagesWindow = "assets/images/window_img.svg"; - static const String assetsSensitivityFunction = "assets/icons/functions_icons/sensitivity.svg"; + static const String assetsSensitivityFunction = + "assets/icons/functions_icons/sensitivity.svg"; //assets/icons/functions_icons/sesitivity_operation_icon.svg static const String assetsSensitivityOperationIcon = @@ -770,59 +819,73 @@ class Assets { //assets/icons/functions_icons/ac_power.svg - static const String assetsAcPower = "assets/icons/functions_icons/ac_power.svg"; + static const String assetsAcPower = + "assets/icons/functions_icons/ac_power.svg"; //assets/icons/functions_icons/ac_power_off.svg - static const String assetsAcPowerOFF = "assets/icons/functions_icons/ac_power_off.svg"; + static const String assetsAcPowerOFF = + "assets/icons/functions_icons/ac_power_off.svg"; //assets/icons/functions_icons/child_lock.svg - static const String assetsChildLock = "assets/icons/functions_icons/child_lock.svg"; + static const String assetsChildLock = + "assets/icons/functions_icons/child_lock.svg"; //assets/icons/functions_icons/cooling.svg - static const String assetsFreezing = "assets/icons/functions_icons/freezing.svg"; + static const String assetsFreezing = + "assets/icons/functions_icons/freezing.svg"; //assets/icons/functions_icons/fan_speed.svg - static const String assetsFanSpeed = "assets/icons/functions_icons/fan_speed.svg"; + static const String assetsFanSpeed = + "assets/icons/functions_icons/fan_speed.svg"; //assets/icons/functions_icons/ac_cooling.svg - static const String assetsAcCooling = "assets/icons/functions_icons/ac_cooling.svg"; + static const String assetsAcCooling = + "assets/icons/functions_icons/ac_cooling.svg"; //assets/icons/functions_icons/ac_heating.svg - static const String assetsAcHeating = "assets/icons/functions_icons/ac_heating.svg"; + static const String assetsAcHeating = + "assets/icons/functions_icons/ac_heating.svg"; //assets/icons/functions_icons/celsius_degrees.svg - static const String assetsCelsiusDegrees = "assets/icons/functions_icons/celsius_degrees.svg"; + static const String assetsCelsiusDegrees = + "assets/icons/functions_icons/celsius_degrees.svg"; //assets/icons/functions_icons/tempreture.svg - static const String assetsTempreture = "assets/icons/functions_icons/tempreture.svg"; + static const String assetsTempreture = + "assets/icons/functions_icons/tempreture.svg"; //assets/icons/functions_icons/ac_fan_low.svg - static const String assetsAcFanLow = "assets/icons/functions_icons/ac_fan_low.svg"; + static const String assetsAcFanLow = + "assets/icons/functions_icons/ac_fan_low.svg"; //assets/icons/functions_icons/ac_fan_middle.svg - static const String assetsAcFanMiddle = "assets/icons/functions_icons/ac_fan_middle.svg"; + static const String assetsAcFanMiddle = + "assets/icons/functions_icons/ac_fan_middle.svg"; //assets/icons/functions_icons/ac_fan_high.svg - static const String assetsAcFanHigh = "assets/icons/functions_icons/ac_fan_high.svg"; + static const String assetsAcFanHigh = + "assets/icons/functions_icons/ac_fan_high.svg"; //assets/icons/functions_icons/ac_fan_auto.svg - static const String assetsAcFanAuto = "assets/icons/functions_icons/ac_fan_auto.svg"; + static const String assetsAcFanAuto = + "assets/icons/functions_icons/ac_fan_auto.svg"; //assets/icons/functions_icons/scene_child_lock.svg - static const String assetsSceneChildLock = "assets/icons/functions_icons/scene_child_lock.svg"; + static const String assetsSceneChildLock = + "assets/icons/functions_icons/scene_child_lock.svg"; //assets/icons/functions_icons/scene_child_unlock.svg @@ -831,15 +894,18 @@ class Assets { //assets/icons/functions_icons/scene_refresh.svg - static const String assetsSceneRefresh = "assets/icons/functions_icons/scene_refresh.svg"; + static const String assetsSceneRefresh = + "assets/icons/functions_icons/scene_refresh.svg"; //assets/icons/functions_icons/light_countdown.svg - static const String assetsLightCountdown = "assets/icons/functions_icons/light_countdown.svg"; + static const String assetsLightCountdown = + "assets/icons/functions_icons/light_countdown.svg"; //assets/icons/functions_icons/far_detection.svg - static const String assetsFarDetection = "assets/icons/functions_icons/far_detection.svg"; + static const String assetsFarDetection = + "assets/icons/functions_icons/far_detection.svg"; //assets/icons/functions_icons/far_detection_function.svg @@ -848,11 +914,13 @@ class Assets { //assets/icons/functions_icons/indicator.svg - static const String assetsIndicator = "assets/icons/functions_icons/indicator.svg"; + static const String assetsIndicator = + "assets/icons/functions_icons/indicator.svg"; //assets/icons/functions_icons/motion_detection.svg - static const String assetsMotionDetection = "assets/icons/functions_icons/motion_detection.svg"; + static const String assetsMotionDetection = + "assets/icons/functions_icons/motion_detection.svg"; //assets/icons/functions_icons/motionless_detection.svg @@ -861,15 +929,18 @@ class Assets { //assets/icons/functions_icons/nobody_time.svg - static const String assetsNobodyTime = "assets/icons/functions_icons/nobody_time.svg"; + static const String assetsNobodyTime = + "assets/icons/functions_icons/nobody_time.svg"; //assets/icons/functions_icons/factory_reset.svg - static const String assetsFactoryReset = "assets/icons/functions_icons/factory_reset.svg"; + static const String assetsFactoryReset = + "assets/icons/functions_icons/factory_reset.svg"; //assets/icons/functions_icons/master_state.svg - static const String assetsMasterState = "assets/icons/functions_icons/master_state.svg"; + static const String assetsMasterState = + "assets/icons/functions_icons/master_state.svg"; //assets/icons/functions_icons/switch_alarm_sound.svg @@ -878,7 +949,8 @@ class Assets { //assets/icons/functions_icons/reset_off.svg - static const String assetsResetOff = "assets/icons/functions_icons/reset_off.svg"; + static const String assetsResetOff = + "assets/icons/functions_icons/reset_off.svg"; //assets/icons/functions_icons/automation_functions/card_unlock.svg @@ -952,7 +1024,8 @@ class Assets { //assets/icons/functions_icons/automation_functions/motion.svg - static const String assetsMotion = "assets/icons/functions_icons/automation_functions/motion.svg"; + static const String assetsMotion = + "assets/icons/functions_icons/automation_functions/motion.svg"; //assets/icons/functions_icons/automation_functions/current_temp.svg @@ -974,22 +1047,33 @@ class Assets { static const String waterHeaterOn = "assets/icons/water_heater_on.svg"; static const String waterHeaterOff = "assets/icons/water_heater_off.svg"; - static const String scheduleCelenderIcon = "assets/icons/schedule_celender_icon.svg"; - static const String scheduleCirculateIcon = "assets/icons/schedule_circulate_icon.svg"; - static const String scheduleInchingIcon = "assets/icons/schedule_Inching_icon.svg"; + static const String scheduleCelenderIcon = + "assets/icons/schedule_celender_icon.svg"; + static const String scheduleCirculateIcon = + "assets/icons/schedule_circulate_icon.svg"; + static const String scheduleInchingIcon = + "assets/icons/schedule_Inching_icon.svg"; static const String scheduleTimeIcon = "assets/icons/schedule_time_icon.svg"; static const String waterHeaterIcon = "assets/icons/water_heater_icon.svg"; static const String doorOpen = "assets/icons/opened_door.svg"; static const String doorClose = "assets/icons/closed_door.svg"; - static const String doorNotificationSetting = "assets/icons/door_notification_setting_icon.svg"; + static const String doorNotificationSetting = + "assets/icons/door_notification_setting_icon.svg"; static const String doorRecordsIcon = "assets/icons/door_records_icon.svg"; static const String doorSensorIcon = "assets/icons/door_sensor_icon.svg"; static const String closedGarageIcon = "assets/icons/closed_garage_door.svg"; static const String openGarageIcon = "assets/icons/open_garage_door.svg"; static const String garageCountdown = "assets/icons/garage_countdown.svg"; - static const String garagePreferencesIcon = "assets/icons/garage_preferences_icon.svg"; + static const String garagePreferencesIcon = + "assets/icons/garage_preferences_icon.svg"; static const String garageSchedule = "assets/icons/garage_schedule.svg"; static const String garageIcon = "assets/icons/garageIcon.svg"; + + static const String normalWaterLeak = "assets/icons/normal_water_leak.svg"; + static const String detectedWaterLeak = + "assets/icons/detected_water_leak.svg"; + + static const String waterLeakIcon = "assets/icons/waterleak_icon.svg"; } diff --git a/lib/utils/resource_manager/constants.dart b/lib/utils/resource_manager/constants.dart index 5bd1667..e76100e 100644 --- a/lib/utils/resource_manager/constants.dart +++ b/lib/utils/resource_manager/constants.dart @@ -54,6 +54,7 @@ enum DeviceType { TowTouch, ThreeTouch, GarageDoor, + WaterLeak, Other, } @@ -85,6 +86,7 @@ Map devicesTypesMap = { "2GT": DeviceType.TowTouch, "3GT": DeviceType.ThreeTouch, "GD": DeviceType.GarageDoor, + "WL": DeviceType.WaterLeak, }; Map> devicesFunctionsMap = { DeviceType.AC: [ @@ -468,6 +470,7 @@ Map> devicesFunctionsMap = { "range": ["unclosed_time", "close_time_alarm", "none"] })), ], + DeviceType.WaterLeak: [], }; enum TempModes { hot, cold, wind } diff --git a/pubspec.yaml b/pubspec.yaml index 1a9b3e5..8d4d265 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: This is the mobile application project, developed with Flutter for # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: 1.0.3+25 +version: 1.0.3+26 environment: sdk: ">=3.0.6 <4.0.0"