diff --git a/assets/icons/check_update_icon.svg b/assets/icons/check_update_icon.svg new file mode 100644 index 0000000..46527d3 --- /dev/null +++ b/assets/icons/check_update_icon.svg @@ -0,0 +1,22 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/icons/edit_sos_icon.svg b/assets/icons/edit_sos_icon.svg new file mode 100644 index 0000000..c9e6a9e --- /dev/null +++ b/assets/icons/edit_sos_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icons/empty_log.svg b/assets/icons/empty_log.svg new file mode 100644 index 0000000..8e847ac --- /dev/null +++ b/assets/icons/empty_log.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/icons/empty_update_icon.svg b/assets/icons/empty_update_icon.svg new file mode 100644 index 0000000..3cf26c9 --- /dev/null +++ b/assets/icons/empty_update_icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/icons/faq_icon.svg b/assets/icons/faq_icon.svg new file mode 100644 index 0000000..394f26c --- /dev/null +++ b/assets/icons/faq_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/green_sos.svg b/assets/icons/green_sos.svg new file mode 100644 index 0000000..da225aa --- /dev/null +++ b/assets/icons/green_sos.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/info.svg b/assets/icons/info.svg new file mode 100644 index 0000000..8aafa02 --- /dev/null +++ b/assets/icons/info.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/notification_icon.svg b/assets/icons/notification_icon.svg new file mode 100644 index 0000000..ed3d9d0 --- /dev/null +++ b/assets/icons/notification_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/red_sos.svg b/assets/icons/red_sos.svg new file mode 100644 index 0000000..c2f6966 --- /dev/null +++ b/assets/icons/red_sos.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/share_icon.svg b/assets/icons/share_icon.svg new file mode 100644 index 0000000..a4b908f --- /dev/null +++ b/assets/icons/share_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/sos_profile_icon.svg b/assets/icons/sos_profile_icon.svg new file mode 100644 index 0000000..f99ec5b --- /dev/null +++ b/assets/icons/sos_profile_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/thumb_down.svg b/assets/icons/thumb_down.svg new file mode 100644 index 0000000..4d22f00 --- /dev/null +++ b/assets/icons/thumb_down.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/thumb_up.svg b/assets/icons/thumb_up.svg new file mode 100644 index 0000000..5670b79 --- /dev/null +++ b/assets/icons/thumb_up.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/update_icon.svg b/assets/icons/update_icon.svg new file mode 100644 index 0000000..cf3e305 --- /dev/null +++ b/assets/icons/update_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/features/devices/bloc/sos_bloc/sos_bloc.dart b/lib/features/devices/bloc/sos_bloc/sos_bloc.dart new file mode 100644 index 0000000..17c782a --- /dev/null +++ b/lib/features/devices/bloc/sos_bloc/sos_bloc.dart @@ -0,0 +1,259 @@ +import 'dart:async'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/device_control_model.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/device_report_model.dart'; +import 'package:syncrow_app/features/devices/model/question_model.dart'; +import 'package:syncrow_app/features/devices/model/sos_model.dart'; +import 'package:syncrow_app/features/devices/model/status_model.dart'; +import 'package:syncrow_app/features/devices/model/subspace_model.dart'; +import 'package:syncrow_app/services/api/devices_api.dart'; +import 'package:syncrow_app/services/api/spaces_api.dart'; + +class SosBloc extends Bloc { + final String sosId; + SosBloc({ + required this.sosId, + }) : super(const SosState()) { + on(_fetchStatus); + on(fetchLogsForLastMonth); + on(_toggleLowBattery); + on(_toggleClosingReminder); + on(_changeName); + on(_onSearchFaq); + on(_onSosInitial); + on(_fetchRoomsAndDevices); + on(_onOptionSelected); + on(_onSaveSelection); + // on(_toggleWaterLeakAlarm); + } + + final TextEditingController nameController = + TextEditingController(text: '${'firstName'}'); + bool isSaving = false; + bool editName = false; + final FocusNode focusNode = FocusNode(); + Timer? _timer; + bool enableAlarm = false; + bool closingReminder = false; + bool waterAlarm = false; + SosModel deviceStatus = + SosModel(waterContactState: 'normal', batteryPercentage: 0); + + void _fetchStatus(SosInitial event, Emitter emit) async { + emit(SosLoadingState()); + try { + var response = await DevicesAPI.getDeviceStatus(sosId); + List statusModelList = []; + for (var status in response['status']) { + statusModelList.add(StatusModel.fromJson(status)); + } + deviceStatus = SosModel.fromJson( + statusModelList, + ); + emit(UpdateState(sensor: deviceStatus)); + + Future.delayed(const Duration(milliseconds: 500)); + // _listenToChanges(); + } catch (e) { + emit(SosFailedState(errorMessage: e.toString())); + return; + } + } + + void _onSearchFaq(SearchFaqEvent event, Emitter emit) { + emit(SosLoadingState()); + List _faqQuestions = faqQuestions.where((question) { + return question.question + .toLowerCase() + .contains(event.query.toLowerCase()); + }).toList(); + emit(FaqSearchState(filteredFaqQuestions: _faqQuestions)); + } + + void _changeName(ChangeNameEvent event, Emitter emit) { + emit(SosLoadingState()); + editName = event.value!; + if (editName) { + Future.delayed(const Duration(milliseconds: 500), () { + focusNode.requestFocus(); + }); + } else { + focusNode.unfocus(); + } + emit(NameEditingState(editName: editName)); + } + + void _toggleLowBattery( + ToggleEnableAlarmEvent event, Emitter emit) async { + emit(LoadingNewSate(sosSensor: deviceStatus)); + try { + enableAlarm = event.isLowBatteryEnabled; + emit(UpdateState(sensor: deviceStatus)); + await DevicesAPI.controlDevice( + DeviceControlModel( + deviceId: sosId, + code: 'low_battery', + value: enableAlarm, + ), + sosId, + ); + } catch (e) { + emit(SosFailedState(errorMessage: e.toString())); + } + } + + void _toggleClosingReminder( + ToggleClosingReminderEvent event, Emitter emit) async { + emit(LoadingNewSate(sosSensor: deviceStatus)); + try { + closingReminder = event.isClosingReminderEnabled; + emit(UpdateState(sensor: deviceStatus)); + + // API call to update the state, if necessary + // await DevicesAPI.controlDevice( + // DeviceControlModel( + // deviceId: sosId, + // code: 'closing_reminder', + // value: closingReminder, + // ), + // sosId, + // ); + } catch (e) { + emit(SosFailedState(errorMessage: e.toString())); + } + } + + DeviceReport recordGroups = + DeviceReport(startTime: '0', endTime: '0', data: []); + + Future fetchLogsForLastMonth( + ReportLogsInitial event, Emitter emit) async { + DateTime now = DateTime.now(); + DateTime lastMonth = DateTime(now.year, now.month - 1, now.day); + int startTime = lastMonth.millisecondsSinceEpoch; + int endTime = now.millisecondsSinceEpoch; + try { + emit(SosLoadingState()); + var response = await DevicesAPI.getReportLogs( + startTime: startTime.toString(), + endTime: endTime.toString(), + deviceUuid: sosId, + code: 'sossensor_state', + ); + recordGroups = response; + emit(UpdateState(sensor: deviceStatus)); + } on DioException catch (e) { + final errorData = e.response!.data; + String errorMessage = errorData['message']; + emit(SosFailedState(errorMessage: e.toString())); + } + } + + // _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 (_) {} + // } + + // Demo list of FAQ questions using the QuestionModel class + final List faqQuestions = [ + QuestionModel( + id: 1, + question: 'How does an SOS emergency button work?', + answer: + 'The SOS emergency button sends an alert to your contacts when pressed.', + ), + QuestionModel( + id: 2, + question: 'How long will an SOS alarm persist?', + answer: + 'The SOS alarm will persist until it is manually turned off or after a set time.', + ), + QuestionModel( + id: 3, + question: 'What should I do if the SOS button is unresponsive?', + answer: 'Try restarting the device. If it persists, contact support.', + ), + QuestionModel( + id: 4, + question: 'Can I use the SOS feature without a network connection?', + answer: + 'No, a network connection is required to send the alert to your contacts.', + ), + QuestionModel( + id: 5, + question: 'How often should I check the SOS battery?', + answer: + 'Check the SOS battery at least once a month to ensure it is operational.', + ), + ]; + Future _onSosInitial( + SosInitialQuestion event, Emitter emit) async { + emit(SosLoadingState()); + // SosModel sosModel = await fetchSosData(sosId); // Define this function as needed + emit(FaqLoadedState(filteredFaqQuestions: faqQuestions)); + } + + List allDevices = []; + List roomsList = []; + + void _fetchRoomsAndDevices( + FetchRoomsEvent event, Emitter emit) async { + try { + emit(SosLoadingState()); + roomsList = await SpacesAPI.getSubSpaceBySpaceId( + event.unit.community.uuid, event.unit.id); + emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList)); + } catch (e) { + emit(const SosFailedState(errorMessage: 'Something went wrong')); + return; + } + } + + String _selectedOption = ''; + bool _hasSelectionChanged = false; + + void _onOptionSelected(SelectOptionEvent event, Emitter emit) { + emit(SosLoadingState()); + _selectedOption = event.selectedOption; + _hasSelectionChanged = true; + emit(OptionSelectedState( + selectedOption: _selectedOption, + hasSelectionChanged: _hasSelectionChanged)); + } + + void _onSaveSelection(SaveSelectionEvent event, Emitter emit) { + if (_hasSelectionChanged) { + print('Save button clicked with selected option: $_selectedOption'); + _hasSelectionChanged = false; + emit(SaveSelectionSuccessState()); + } + } +} diff --git a/lib/features/devices/bloc/sos_bloc/sos_event.dart b/lib/features/devices/bloc/sos_bloc/sos_event.dart new file mode 100644 index 0000000..62d83c3 --- /dev/null +++ b/lib/features/devices/bloc/sos_bloc/sos_event.dart @@ -0,0 +1,129 @@ +import 'package:equatable/equatable.dart'; +import 'package:syncrow_app/features/app_layout/model/space_model.dart'; + +abstract class SosEvent extends Equatable { + const SosEvent(); + + @override + List get props => []; +} + +class SosLoading extends SosEvent {} + +class SosSwitch extends SosEvent { + final String switchD; + final String deviceId; + final String productId; + const SosSwitch( + {required this.switchD, this.deviceId = '', this.productId = ''}); + + @override + List get props => [switchD, deviceId, productId]; +} + +class SosUpdated extends SosEvent {} + +class SosInitial extends SosEvent { + const SosInitial(); +} + +class ReportLogsInitial extends SosEvent { + const ReportLogsInitial(); +} + +class SosChangeStatus extends SosEvent {} + +class GetCounterEvent extends SosEvent { + final String deviceCode; + const GetCounterEvent({required this.deviceCode}); + @override + List get props => [deviceCode]; +} + +class ToggleEnableAlarmEvent extends SosEvent { + final bool isLowBatteryEnabled; + + const ToggleEnableAlarmEvent(this.isLowBatteryEnabled); + + @override + List get props => [isLowBatteryEnabled]; +} + +class ToggleClosingReminderEvent extends SosEvent { + final bool isClosingReminderEnabled; + + const ToggleClosingReminderEvent(this.isClosingReminderEnabled); + + @override + List get props => [isClosingReminderEnabled]; +} + +class ToggleSosAlarmEvent extends SosEvent { + final bool isSosAlarmEnabled; + + const ToggleSosAlarmEvent(this.isSosAlarmEnabled); + + @override + List get props => [isSosAlarmEnabled]; +} + +class SetCounterValue extends SosEvent { + final Duration duration; + final String deviceCode; + const SetCounterValue({required this.duration, required this.deviceCode}); + @override + List get props => [duration, deviceCode]; +} + +class StartTimer extends SosEvent { + final int duration; + + const StartTimer(this.duration); + + @override + List get props => [duration]; +} + +class TickTimer extends SosEvent { + final int remainingTime; + + const TickTimer(this.remainingTime); + + @override + List get props => [remainingTime]; +} + +class StopTimer extends SosEvent {} + +class OnClose extends SosEvent {} + +class ChangeNameEvent extends SosEvent { + final bool? value; + const ChangeNameEvent({this.value}); +} + +class SearchFaqEvent extends SosEvent { + final String query; + + const SearchFaqEvent(this.query); +} + +class SosInitialQuestion extends SosEvent { + const SosInitialQuestion(); +} + +class FetchRoomsEvent extends SosEvent { + final SpaceModel unit; + + const FetchRoomsEvent({required this.unit}); + + @override + List get props => [unit]; +} + +class SelectOptionEvent extends SosEvent { + final String selectedOption; + SelectOptionEvent({required this.selectedOption}); +} + +class SaveSelectionEvent extends SosEvent {} diff --git a/lib/features/devices/bloc/sos_bloc/sos_state.dart b/lib/features/devices/bloc/sos_bloc/sos_state.dart new file mode 100644 index 0000000..3b5e38d --- /dev/null +++ b/lib/features/devices/bloc/sos_bloc/sos_state.dart @@ -0,0 +1,87 @@ +import 'package:equatable/equatable.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/question_model.dart'; +import 'package:syncrow_app/features/devices/model/sos_model.dart'; +import 'package:syncrow_app/features/devices/model/subspace_model.dart'; + +class SosState extends Equatable { + const SosState(); + + @override + List get props => []; +} + +class SosInitialState extends SosState {} + +class SosLoadingState extends SosState {} + +class SosFailedState extends SosState { + final String errorMessage; + + const SosFailedState({required this.errorMessage}); + + @override + List get props => [errorMessage]; +} + +class UpdateState extends SosState { + final SosModel sensor; + const UpdateState({required this.sensor}); + + @override + List get props => [sensor]; +} + +class LoadingNewSate extends SosState { + final SosModel sosSensor; + const LoadingNewSate({required this.sosSensor}); + + @override + List get props => [sosSensor]; +} + +class NameEditingState extends SosState { + final bool editName; + + NameEditingState({required this.editName}); +} + +class FaqLoadedState extends SosState { + final List filteredFaqQuestions; + + FaqLoadedState({this.filteredFaqQuestions = const []}); +} + +class FaqSearchState extends SosState { + final List filteredFaqQuestions; + + const FaqSearchState({this.filteredFaqQuestions = const []}); +} + +class FetchRoomsState extends SosState { + final List roomsList; + final List devicesList; + + const FetchRoomsState({required this.devicesList, required this.roomsList}); + + @override + List get props => [devicesList]; +} + +class OptionSelectedState extends SosState { + final String selectedOption; + final bool hasSelectionChanged; + + OptionSelectedState({ + required this.selectedOption, + required this.hasSelectionChanged, + }); + + @override + List get props => [selectedOption, hasSelectionChanged]; +} + +class SaveSelectionSuccessState extends SosState { + @override + List get props => []; +} diff --git a/lib/features/devices/model/question_model.dart b/lib/features/devices/model/question_model.dart new file mode 100644 index 0000000..2965620 --- /dev/null +++ b/lib/features/devices/model/question_model.dart @@ -0,0 +1,11 @@ +class QuestionModel { + final int id; + final String question; + final String answer; + + QuestionModel({ + required this.id, + required this.question, + required this.answer, + }); +} diff --git a/lib/features/devices/model/sos_model.dart b/lib/features/devices/model/sos_model.dart new file mode 100644 index 0000000..69c567b --- /dev/null +++ b/lib/features/devices/model/sos_model.dart @@ -0,0 +1,28 @@ +import 'package:syncrow_app/features/devices/model/status_model.dart'; + +class SosModel { + String waterContactState; + int batteryPercentage; + + SosModel({ + required this.waterContactState, + required this.batteryPercentage, + }); + + factory SosModel.fromJson(List jsonList) { + late String _waterContactState; + late int _batteryPercentage; + + for (int i = 0; i < jsonList.length; i++) { + if (jsonList[i].code == 'sossensor_state') { + _waterContactState = jsonList[i].value ?? false; + } else if (jsonList[i].code == 'battery_percentage') { + _batteryPercentage = jsonList[i].value ?? 0; + } + } + return SosModel( + waterContactState: _waterContactState, + batteryPercentage: _batteryPercentage, + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_alarm_management_page.dart b/lib/features/devices/view/widgets/sos/sos_alarm_management_page.dart new file mode 100644 index 0000000..c750368 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_alarm_management_page.dart @@ -0,0 +1,112 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_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/features/shared_widgets/text_widgets/body_medium.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class AlarmManagementPage extends StatelessWidget { + const AlarmManagementPage({super.key}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Alarm Settings', + child: BlocProvider( + create: (context) => SosBloc(sosId: ''), + child: BlocBuilder( + builder: (context, state) { + final _bloc = BlocProvider.of(context); + + return state is LoadingNewSate + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 10, + ), + const BodyMedium( + text: 'The Alarm Management', + fontWeight: FontWeight.w700, + fontSize: 12, + fontColor: ColorsManager.grayColor, + ), + const SizedBox( + height: 5, + ), + DefaultContainer( + child: Padding( + padding: const EdgeInsets.only(left: 10, right: 10), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 50, + child: ListTile( + contentPadding: EdgeInsets.zero, + leading: const BodyMedium( + text: 'SOS Alarm', + fontWeight: FontWeight.w400, + fontSize: 15, + ), + trailing: Transform.scale( + scale: .8, + child: CupertinoSwitch( + value: _bloc.enableAlarm, + onChanged: (value) { + context.read().add( + ToggleEnableAlarmEvent(value)); + }, + applyTheme: true, + )), + ), + ), + const Divider( + color: ColorsManager.graysColor, + ), + SizedBox( + height: 50, + child: ListTile( + contentPadding: EdgeInsets.zero, + leading: const BodyLarge( + text: 'Low Battery Reminder', + fontWeight: FontWeight.w400, + fontSize: 15, + ), + trailing: Transform.scale( + scale: .8, + child: CupertinoSwitch( + value: _bloc.closingReminder, + onChanged: (value) { + context.read().add( + ToggleClosingReminderEvent( + value)); + }, + applyTheme: true, + )), + ), + ), + ], + ), + ), + ), + ], + ); + }, + ), + )); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_records_screen.dart b/lib/features/devices/view/widgets/sos/sos_records_screen.dart new file mode 100644 index 0000000..54b763a --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_records_screen.dart @@ -0,0 +1,234 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:intl/intl.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_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/generated/assets.dart'; +import 'package:syncrow_app/utils/context_extension.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class SosRecordsScreen extends StatefulWidget { + final String sosId; + const SosRecordsScreen({super.key, required this.sosId}); + + @override + State createState() => _SosRecordsScreenState(); +} + +class _SosRecordsScreenState extends State { + int _selectedIndex = 0; + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Records', + child: BlocProvider( + create: (context) => + SosBloc(sosId: widget.sosId)..add(const ReportLogsInitial()), + child: BlocBuilder( + builder: (context, state) { + final waterSensorBloc = BlocProvider.of(context); + final Map> groupedRecords = {}; + + if (state is LoadingNewSate) { + return const Center( + child: DefaultContainer( + width: 50, height: 50, child: CircularProgressIndicator()), + ); + } else if (state is UpdateState) { + for (var record in waterSensorBloc.recordGroups.data!) { + final DateTime eventDateTime = + DateTime.fromMillisecondsSinceEpoch(record.eventTime!); + final String formattedDate = + DateFormat('EEEE, dd/MM/yyyy').format(eventDateTime); + + if (groupedRecords.containsKey(formattedDate)) { + groupedRecords[formattedDate]!.add(record); + } else { + groupedRecords[formattedDate] = [record]; + } + } + } + + return 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) { + setState(() { + _selectedIndex = value; + }); + }, + indicatorColor: Colors.white, + 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: _selectedIndex == 0 + ? Colors.white + : ColorsManager.blackColor, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + ), + ), + ), + Tab( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Text( + 'Automation Log', + style: context.bodySmall.copyWith( + color: _selectedIndex == 1 + ? Colors.white + : ColorsManager.blackColor, + fontSize: 12, + fontWeight: FontWeight.w400, + ), + ), + ), + ), + ], + ), + ), + Expanded( + child: TabBarView( + physics: const NeverScrollableScrollPhysics(), + children: [ + groupedRecords.isEmpty + ? Center( + child: SvgPicture.asset( + Assets.emptyLog, + fit: BoxFit.fill, + ), + ) + : 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: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + date, + style: const TextStyle( + color: ColorsManager.grayColor, + fontSize: 13, + fontWeight: FontWeight.w700, + ), + ), + ), + 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: [ + ListTile( + leading: SvgPicture.asset( + record.value == 'true' + ? Assets + .leakDetectedIcon + : Assets + .leakNormalIcon, + height: 25, + width: 25, + ), + title: Text( + record.value == 'true' + ? "Leak Detected" + : "Normal", + style: const TextStyle( + fontWeight: + FontWeight.bold, + fontSize: 18, + ), + ), + subtitle: + Text('$formattedTime'), + ), + if (idx != + recordsForDate.length - 1) + const Divider( + color: ColorsManager + .graysColor, + ), + ], + ); + }).toList(), + ], + ), + ), + ], + ); + }, + ), + Container( + height: 10, + width: 20, + child: Center( + child: SvgPicture.asset( + Assets.emptyLog, + fit: BoxFit.fill, + ), + ), + ), + ], + ), + ), + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_screen.dart b/lib/features/devices/view/widgets/sos/sos_screen.dart new file mode 100644 index 0000000..4d3bc40 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_screen.dart @@ -0,0 +1,216 @@ +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/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/sos_model.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_alarm_management_page.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_records_screen.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_settings.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 SosScreen extends StatelessWidget { + final DeviceModel? device; + + const SosScreen({super.key, this.device}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'SOS', + actions: [ + InkWell( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => SosSettings(device: device!)), + ); + }, + child: SvgPicture.asset(Assets.assetsIconsSettings)), + const SizedBox( + width: 10, + ) + ], + child: BlocProvider( + create: (context) => + SosBloc(sosId: device?.uuid ?? '')..add(const SosInitial()), + child: BlocBuilder( + builder: (context, state) { + final sensor = BlocProvider.of(context); + SosModel model = + SosModel(batteryPercentage: 0, waterContactState: 'normal'); + if (state is LoadingNewSate) { + model = state.sosSensor; + } else if (state is UpdateState) { + model = state.sensor; + } + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async { + sensor.add(const SosInitial()); + }, + 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( + 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 == 'normal' + ? Assets.redSos + : Assets.greenSos, + fit: BoxFit.fill, + ), + ), + ], + ), + ), + ), + Flexible( + child: Row( + children: [ + Expanded( + child: DefaultContainer( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + SosRecordsScreen( + sosId: 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', + textAlign: TextAlign.center, + ), + ), + ), + ], + ), + ), + ), + const SizedBox( + width: 10, + ), + Expanded( + child: DefaultContainer( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + const AlarmManagementPage()), + ); + }, + 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: 'Alarm Settings', + textAlign: TextAlign.center, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ) + ], + ), + ), + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/delete_dialog.dart b/lib/features/devices/view/widgets/sos/sos_setting/delete_dialog.dart new file mode 100644 index 0000000..67c62e2 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/delete_dialog.dart @@ -0,0 +1,227 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class DisconnectDeviceDialog extends StatelessWidget { + final Function()? cancelTab; + final Function()? confirmTab; + + const DisconnectDeviceDialog({ + super.key, + required this.cancelTab, + required this.confirmTab, + }); + + @override + Widget build(BuildContext context) { + return AlertDialog( + contentPadding: EdgeInsets.zero, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + height: 10, + ), + const BodyLarge( + text: 'Disconnect Device', + fontWeight: FontWeight.w700, + fontColor: ColorsManager.red, + fontSize: 16, + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 15), + child: Divider( + color: ColorsManager.textGray, + ), + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20), + child: Column( + children: [ + Center( + child: Text( + 'This will disconnect your device from this Application')), + ], + ), + ), + Row( + children: [ + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + right: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: SizedBox( + child: InkWell( + onTap: cancelTab, + child: const Padding( + padding: EdgeInsets.all(15), + child: Center( + child: Text( + 'Cancel', + style: TextStyle( + color: ColorsManager.textGray, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + ), + ), + ), + ), + ), + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + left: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: InkWell( + onTap: confirmTab, + child: const Padding( + padding: EdgeInsets.all(15), + child: Center( + child: Text( + 'Disconnect', + style: TextStyle( + color: ColorsManager.red, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + )), + )) + ], + ) + ], + ), + ); + } +} + +class DisconnectWipeData extends StatelessWidget { + final Function()? cancelTab; + final Function()? confirmTab; + + const DisconnectWipeData({ + super.key, + required this.cancelTab, + required this.confirmTab, + }); + + @override + Widget build(BuildContext context) { + return AlertDialog( + contentPadding: EdgeInsets.zero, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + height: 10, + ), + const BodyLarge( + text: 'Disconnect and Wipe Data', + fontWeight: FontWeight.w700, + fontColor: ColorsManager.red, + fontSize: 16, + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 15), + child: Divider( + color: ColorsManager.textGray, + ), + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20), + child: Column( + children: [ + Center( + child: Text( + 'This will disconnect your device from this Application and wipe all the data')), + ], + ), + ), + Row( + children: [ + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + right: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: SizedBox( + child: InkWell( + onTap: cancelTab, + child: const Padding( + padding: EdgeInsets.all(15), + child: Center( + child: Text( + 'Cancel', + style: TextStyle( + color: ColorsManager.textGray, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + ), + ), + ), + ), + ), + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + left: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: InkWell( + onTap: confirmTab, + child: const Padding( + padding: EdgeInsets.all(15), + child: Center( + child: Text( + 'Disconnect', + style: TextStyle( + color: ColorsManager.red, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + )), + )) + ], + ) + ], + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/faq_sos_page.dart b/lib/features/devices/view/widgets/sos/sos_setting/faq_sos_page.dart new file mode 100644 index 0000000..bbb75f7 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/faq_sos_page.dart @@ -0,0 +1,151 @@ +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/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/question_model.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/question_page.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_medium.dart'; +import 'package:syncrow_app/generated/assets.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class FaqSosPage extends StatelessWidget { + final DeviceModel? device; + + const FaqSosPage({super.key, this.device}); + + @override + Widget build(BuildContext context) { + TextEditingController _searchController = TextEditingController(); + return DefaultScaffold( + title: 'FAQ', + child: BlocProvider( + create: (context) => + SosBloc(sosId: device?.uuid ?? '')..add(const SosInitialQuestion()), + child: BlocBuilder( + builder: (context, state) { + final sensor = BlocProvider.of(context); + + List displayedQuestions = []; + if (state is FaqSearchState) { + displayedQuestions = state.filteredFaqQuestions; + } else if (state is FaqLoadedState) { + displayedQuestions = state.filteredFaqQuestions; + } + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async { + sensor.add(const SosInitial()); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + DefaultContainer( + padding: const EdgeInsets.all(5), + child: TextFormField( + controller: _searchController, + onChanged: (value) { + sensor.add(SearchFaqEvent(value)); + }, + decoration: InputDecoration( + hintText: 'Enter your questions', + hintStyle: const TextStyle( + color: ColorsManager.textGray, + fontSize: 16, + fontWeight: FontWeight.w400), + suffixIcon: Container( + padding: const EdgeInsets.all(5.0), + margin: const EdgeInsets.all(10.0), + child: SvgPicture.asset( + Assets.searchIcon, + fit: BoxFit.contain, + ), + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.04, + ), + BodyMedium( + text: _searchController.text.isEmpty + ? 'Device Related FAQs' + : '${displayedQuestions.length} Help Topics', + fontWeight: FontWeight.w700, + fontSize: 12, + fontColor: ColorsManager.grayColor, + ), + Expanded( + child: DefaultContainer( + child: ListView.builder( + shrinkWrap: true, + itemCount: displayedQuestions.length, + itemBuilder: (context, index) { + final faq = displayedQuestions[index]; + return InkWell( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => QuestionPage( + questionModel: faq, + )), + ); + }, + child: SizedBox( + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Expanded( + child: BodyMedium( + fontSize: 14, + fontWeight: FontWeight.w400, + text: faq.question, + ), + ), + const Icon( + Icons.keyboard_arrow_right, + color: ColorsManager.textGray, + ), + ], + ), + ), + const Divider( + color: ColorsManager.dividerColor, + ), + ], + ), + ), + ); + }, + )), + ), + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/location_setting.dart b/lib/features/devices/view/widgets/sos/sos_setting/location_setting.dart new file mode 100644 index 0000000..07ab1b9 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/location_setting.dart @@ -0,0 +1,195 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/app_layout/model/space_model.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/sos_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_medium.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class LocationSosPage extends StatelessWidget { + final SpaceModel? space; + + LocationSosPage({super.key, this.space}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: BlocProvider( + create: (context) => + SosBloc(sosId: '')..add(FetchRoomsEvent(unit: space!)), + child: BlocBuilder( + builder: (context, state) { + final sensor = BlocProvider.of(context); + SosModel model = + SosModel(batteryPercentage: 0, waterContactState: 'normal'); + + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator(), + ), + ) + : DefaultScaffold( + actions: [ + BlocBuilder( + builder: (context, state) { + final bool canSave = state is OptionSelectedState && + state.hasSelectionChanged; + return InkWell( + onTap: canSave + ? () { + context + .read() + .add(SaveSelectionEvent()); + } + : null, + child: BodyMedium( + text: 'Save', + fontWeight: FontWeight.w700, + fontSize: 16, + fontColor: canSave + ? ColorsManager.slidingBlueColor + : ColorsManager.primaryTextColor, + ), + ); + }, + ), + const SizedBox(width: 20), + ], + child: RefreshIndicator( + onRefresh: () async { + sensor.add(const SosInitial()); + }, + child: ListView( + shrinkWrap: true, + padding: const EdgeInsets.symmetric(vertical: 20), + children: [ + const BodyMedium( + text: 'Smart Device Location', + fontWeight: FontWeight.w700, + fontSize: 12, + fontColor: ColorsManager.grayColor, + ), + const SizedBox(height: 5), + DefaultContainer( + padding: const EdgeInsets.all(20), + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: sensor.roomsList.length, + itemBuilder: (context, index) { + final room = sensor.roomsList![index]; + return Column( + children: [ + _buildCheckboxOption( + label: room.name!, + isSelected: + state is OptionSelectedState && + state.selectedOption == room.name, + onTap: (v) { + context.read().add( + SelectOptionEvent( + selectedOption: v)); + }, + ), + if (index < + sensor.roomsList.length - 1) ...[ + const SizedBox(height: 10), + const Divider( + color: ColorsManager.dividerColor, + ), + const SizedBox(height: 10), + ], + ], + ); + }, + ), + ), + ], + ), + ), + ); + }, + ), + ), + ); + } + + Widget _buildCheckboxOption({ + required String label, + required bool isSelected, + required Function(String) onTap, + }) { + return Padding( + padding: const EdgeInsets.only(bottom: 10, top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + BodyMedium( + text: label, + style: const TextStyle(fontSize: 15, fontWeight: FontWeight.w400), + ), + CircularCheckbox( + value: isSelected, + onChanged: (bool? value) { + if (value == true) { + onTap(label); + } + }, + ), + ], + ), + ); + } +} + +class CircularCheckbox extends StatefulWidget { + final bool value; + final ValueChanged onChanged; + + CircularCheckbox({required this.value, required this.onChanged}); + + @override + _CircularCheckboxState createState() => _CircularCheckboxState(); +} + +class _CircularCheckboxState extends State { + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + widget.onChanged(!widget.value); + }, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: widget.value + ? ColorsManager.primaryColorWithOpacity.withOpacity(0.01) + : Colors.grey, + width: 2.0, + ), + color: widget.value + ? ColorsManager.primaryColorWithOpacity + : Colors.transparent, + ), + width: 24.0, + height: 24.0, + child: widget.value + ? const Icon( + Icons.check, + color: Colors.white, + size: 16.0, + ) + : null, + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/question_page.dart b/lib/features/devices/view/widgets/sos/sos_setting/question_page.dart new file mode 100644 index 0000000..26118e8 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/question_page.dart @@ -0,0 +1,143 @@ +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/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/question_model.dart'; +import 'package:syncrow_app/features/devices/model/sos_model.dart'; +import 'package:syncrow_app/features/shared_widgets/default_button.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/features/shared_widgets/text_widgets/body_medium.dart'; +import 'package:syncrow_app/generated/assets.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class QuestionPage extends StatelessWidget { + final QuestionModel? questionModel; + + const QuestionPage({super.key, this.questionModel}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'FAQ', + child: BlocProvider( + create: (context) => SosBloc(sosId: '')..add(const SosInitial()), + child: BlocBuilder( + builder: (context, state) { + final sensor = BlocProvider.of(context); + SosModel model = + SosModel(batteryPercentage: 0, waterContactState: 'normal'); + if (state is LoadingNewSate) { + model = state.sosSensor; + } else if (state is UpdateState) { + model = state.sensor; + } + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async { + sensor.add(const SosInitial()); + }, + child: Column( + children: [ + DefaultContainer( + padding: EdgeInsets.all(15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + BodyLarge( + text: questionModel!.question, + fontSize: 22, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blackColor, + ), + SizedBox( + height: 15, + ), + BodyMedium( + text: questionModel!.answer, + fontSize: 14, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.secondaryTextColor, + ), + ], + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.15, + ), + Center( + child: SizedBox( + width: 180, + child: DefaultButton( + backgroundColor: ColorsManager.grayButtonColors, + borderRadius: 50, + onPressed: () {}, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + Assets.thumbUp, + fit: BoxFit.fill, + ), + SizedBox( + width: 10, + ), + BodyMedium( + text: 'Helpful', + fontSize: 12, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blackColor, + ), + ], + )), + ), + ), + SizedBox( + height: 15, + ), + Center( + child: SizedBox( + width: 180, + child: DefaultButton( + backgroundColor: ColorsManager.grayButtonColors, + borderRadius: 50, + onPressed: () {}, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + Assets.thumbDown, + fit: BoxFit.fill, + ), + SizedBox( + width: 10, + ), + BodyMedium( + text: 'Not Helpful', + fontSize: 12, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blackColor, + ), + ], + )), + ), + ), + ], + )); + }, + ), + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/share_sos_page.dart b/lib/features/devices/view/widgets/sos/sos_setting/share_sos_page.dart new file mode 100644 index 0000000..ba1f4f6 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/share_sos_page.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/sos_model.dart'; +import 'package:syncrow_app/features/shared_widgets/default_button.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/features/shared_widgets/text_widgets/body_medium.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class ShareSosPage extends StatelessWidget { + final DeviceModel? device; + + const ShareSosPage({super.key, this.device}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Share Device', + child: BlocProvider( + create: (context) => + SosBloc(sosId: device?.uuid ?? '')..add(const SosInitial()), + child: BlocBuilder( + builder: (context, state) { + final sensor = BlocProvider.of(context); + SosModel model = + SosModel(batteryPercentage: 0, waterContactState: 'normal'); + if (state is LoadingNewSate) { + model = state.sosSensor; + } else if (state is UpdateState) { + model = state.sensor; + } + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async { + sensor.add(const SosInitial()); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const BodyLarge( + text: 'Sharing Method Not Supported', + fontSize: 15, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blackColor, + ), + const BodyMedium( + text: + 'Currently, you cannot use the specified method to share Bluetooth mesh devices Zigbee devices, infrared devices, Bluetooth Beacon Devices, and certain Bluetooth LE devices with other users.', + fontSize: 14, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.secondaryTextColor, + ), + const SizedBox( + height: 10, + ), + const BodyLarge( + text: 'Recommended Sharing Method', + fontSize: 15, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blackColor, + ), + const BodyMedium( + text: + 'If the recipient is a home member or a reliable user, tap Me > Home Management > Add Member and add the recipient to your home. Then, devices in the home can be shared with the recipient in bulk.', + fontSize: 14, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.secondaryTextColor, + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.15, + ), + Center( + child: SizedBox( + width: 250, + child: DefaultButton( + backgroundColor: ColorsManager.blueColor1, + borderRadius: 50, + onPressed: () {}, + child: Text('Add Home Member')), + ), + ) + ], + )); + }, + ), + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/sos_info_page.dart b/lib/features/devices/view/widgets/sos/sos_setting/sos_info_page.dart new file mode 100644 index 0000000..caa3e18 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/sos_info_page.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/sos_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_large.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class SosInfoPge extends StatelessWidget { + final DeviceModel? device; + + const SosInfoPge({super.key, this.device}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Device Information', + child: BlocProvider( + create: (context) => + SosBloc(sosId: device?.uuid ?? '')..add(const SosInitial()), + child: BlocBuilder( + builder: (context, state) { + final sensor = BlocProvider.of(context); + SosModel model = + SosModel(batteryPercentage: 0, waterContactState: 'normal'); + if (state is LoadingNewSate) { + model = state.sosSensor; + } else if (state is UpdateState) { + model = state.sensor; + } + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async { + sensor.add(const SosInitial()); + }, + child: DefaultContainer( + child: Padding( + padding: const EdgeInsets.only(left: 10, right: 10), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const BodyLarge( + text: 'Virtual ID', + fontSize: 15, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blackColor, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const BodySmall( + text: 'bf3575d0e0c8b6e0a6hybl', + fontColor: ColorsManager.primaryTextColor, + ), + InkWell( + onTap: () {}, + child: const Row( + children: [ + Icon( + Icons.copy, + color: ColorsManager.blueColor, + ), + BodyMedium( + text: 'Copy', + fontColor: ColorsManager.blueColor, + ), + ], + ), + ) + ], + ), + const Divider( + color: ColorsManager.dividerColor, + ), + const Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + BodyLarge( + text: 'MAC', + fontSize: 15, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blackColor, + ), + BodySmall( + text: 'bf3575d0e0c8b6e0a6hybl', + fontColor: ColorsManager.primaryTextColor, + ), + ], + ), + const Divider( + color: ColorsManager.dividerColor, + ), + const Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + BodyLarge( + text: 'Time Zone', + fontSize: 15, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blackColor, + ), + BodySmall( + text: 'Asia/Dubai', + fontColor: ColorsManager.primaryTextColor, + ), + ], + ), + ]), + ))); + }, + ), + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/sos_profile_page.dart b/lib/features/devices/view/widgets/sos/sos_setting/sos_profile_page.dart new file mode 100644 index 0000000..a9c9cba --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/sos_profile_page.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_app/features/app_layout/bloc/home_cubit.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/sos_model.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/location_setting.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_medium.dart'; +import 'package:syncrow_app/generated/assets.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class SosProfilePage extends StatelessWidget { + final DeviceModel? device; + + const SosProfilePage({super.key, this.device}); + + @override + Widget build(BuildContext context) { + var spaces = HomeCubit.getInstance().spaces; + + return DefaultScaffold( + title: 'Device Settings', + child: BlocProvider( + create: (context) => + SosBloc(sosId: device?.uuid ?? '')..add(const SosInitial()), + child: BlocBuilder( + builder: (context, state) { + final sensor = BlocProvider.of(context); + SosModel model = + SosModel(batteryPercentage: 0, waterContactState: 'normal'); + if (state is LoadingNewSate) { + model = state.sosSensor; + } else if (state is UpdateState) { + model = state.sensor; + } + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async { + sensor.add(const SosInitial()); + }, + child: ListView( + children: [ + CircleAvatar( + radius: 60, + backgroundColor: Colors.white, + child: CircleAvatar( + radius: 55, + backgroundColor: Colors.grey, + child: ClipOval( + child: SvgPicture.asset( + Assets.sosProfileIcon, + fit: BoxFit.fill, + ), + ), + ), + ), + const SizedBox( + height: 10, + ), + SizedBox( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + IntrinsicWidth( + child: ConstrainedBox( + constraints: + const BoxConstraints(maxWidth: 200), + child: TextFormField( + maxLength: 30, + style: const TextStyle( + color: Colors.black, + ), + textAlign: TextAlign.center, + focusNode: sensor.focusNode, + controller: sensor.nameController, + enabled: sensor.editName, + onEditingComplete: () { + // sensor.add(SaveNameEvent(context: context)); + }, + decoration: const InputDecoration( + hintText: "Your Name", + border: InputBorder.none, + fillColor: Colors.white10, + counterText: '', + ), + ), + ), + ), + const SizedBox(width: 5), + InkWell( + onTap: () { + sensor + .add(const ChangeNameEvent(value: true)); + }, + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 10), + child: Icon( + Icons.edit_outlined, + size: 20, + color: ColorsManager.textPrimaryColor, + ), + ), + ), + ], + ), + ), + const SizedBox(height: 20), + const BodyMedium( + text: 'Smart Device Information', + fontWeight: FontWeight.w700, + fontSize: 12, + fontColor: ColorsManager.grayColor, + ), + DefaultContainer( + padding: const EdgeInsets.all(20), + child: InkWell( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => LocationSosPage( + space: spaces!.first, + )), + ); + }, + child: const Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + child: Text('Location'), + ), + Row( + children: [ + SizedBox( + child: BodyMedium( + text: 'Syncroom', + fontColor: ColorsManager.textGray, + ), + ), + Icon( + Icons.arrow_forward_ios, + size: 15, + color: ColorsManager.textGray, + ), + ], + ) + ], + ), + ), + ) + ], + ), + ); + }, + ), + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/sos_update_note.dart b/lib/features/devices/view/widgets/sos/sos_setting/sos_update_note.dart new file mode 100644 index 0000000..03e5f85 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/sos_update_note.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class SosUpdateNote extends StatelessWidget { + final Function()? cancelTab; + final Function()? confirmTab; + + const SosUpdateNote({ + super.key, + required this.cancelTab, + required this.confirmTab, + }); + + @override + Widget build(BuildContext context) { + return AlertDialog( + contentPadding: EdgeInsets.zero, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + height: 10, + ), + BodyLarge( + text: 'Update Note', + fontWeight: FontWeight.w700, + fontColor: ColorsManager.switchButton.withOpacity(0.6), + fontSize: 16, + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 15), + child: Divider( + color: ColorsManager.textGray, + ), + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20), + child: Column( + children: [ + Center( + child: Text( + 'This update may take a long time. Make sure that the device is fully charged. The device will be unavailable during the update.', + textAlign: TextAlign.center, + )), + ], + ), + ), + Row( + children: [ + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + right: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: SizedBox( + child: InkWell( + onTap: cancelTab, + child: const Padding( + padding: const EdgeInsets.only(top: 15, bottom: 15), + child: Center( + child: Text( + 'Cancel', + style: TextStyle( + color: ColorsManager.textGray, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + ), + ), + ), + ), + ), + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + left: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: InkWell( + onTap: confirmTab, + child: Padding( + padding: const EdgeInsets.only(top: 15, bottom: 15), + child: Center( + child: Text( + 'Start Update', + style: TextStyle( + color: + ColorsManager.switchButton.withOpacity(0.6), + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + )), + )) + ], + ) + ], + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/sos_update_page.dart b/lib/features/devices/view/widgets/sos/sos_setting/sos_update_page.dart new file mode 100644 index 0000000..fabd7b2 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/sos_update_page.dart @@ -0,0 +1,344 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:percent_indicator/linear_percent_indicator.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/sos_update_note.dart'; +import 'package:syncrow_app/features/shared_widgets/default_button.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_medium.dart'; +import 'package:syncrow_app/generated/assets.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class SosUpdatePage extends StatelessWidget { + const SosUpdatePage({super.key}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Device Update', + child: BlocProvider( + create: (context) => SosBloc(sosId: '')..add(const SosInitial()), + child: BlocBuilder( + builder: (context, state) { + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async {}, + child: Column( + children: [ + // SizedBox( + // height: MediaQuery.of(context).size.height * 0.15, + // ), + DefaultContainer( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 50, + child: ListTile( + contentPadding: EdgeInsets.zero, + leading: SizedBox( + width: 200, + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: const BoxDecoration( + color: + ColorsManager.primaryColor, + borderRadius: BorderRadius.all( + Radius.circular(50))), + child: SvgPicture.asset( + Assets.checkUpdateIcon, + fit: BoxFit.fill, + height: 25, + ), + ), + const SizedBox( + width: 10, + ), + InkWell( + onTap: () {}, + child: const BodyMedium( + text: 'Automatic Update', + fontWeight: FontWeight.normal, + ), + ), + ], + ), + ), + trailing: Container( + width: 100, + child: Row( + mainAxisAlignment: + MainAxisAlignment.end, + children: [ + const BodyMedium( + text: 'Off', + fontColor: ColorsManager.textGray, + ), + Transform.scale( + scale: .8, + child: CupertinoSwitch( + value: true, + onChanged: (value) {}, + applyTheme: true, + ), + ), + ], + ), + )), + ), + ], + ), + ), + const SizedBox( + height: 10, + ), + UpdateSosContainerWithProgressBar( + sosDescription: + 'Connectivity Issue Resolved Fixed a bug that caused the SOS button to disconnect from the app intermittently.', + sosVersion: 'SOS v2.0.5', + ), + // const UpdatedContainer( + // sosVersion: 'SOS v1.0.13', + // sosDescription: 'SOS is up to date', + // ), + + // const NewUpdateContainer( + // sosVersion: 'SOS v2.0.5', + // sosDescription: + // 'Connectivity Issue Resolved Fixed a bug that caused the SOS button to disconnect from the app intermittently.', + // ), + const SizedBox( + height: 15, + ), + ], + )); + }, + ), + ), + ); + } +} + +class UpdatedContainer extends StatelessWidget { + final String? sosVersion; + final String? sosDescription; + const UpdatedContainer({ + this.sosVersion, + this.sosDescription, + super.key, + }); + + @override + Widget build(BuildContext context) { + return DefaultContainer( + height: MediaQuery.of(context).size.height * 0.35, + child: Padding( + padding: const EdgeInsets.all(25), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SvgPicture.asset( + Assets.emptyUpdateIcon, + fit: BoxFit.fill, + ), + BodyMedium( + text: sosVersion!, + fontColor: ColorsManager.primaryTextColor, + ), + BodyMedium( + text: sosDescription!, + fontColor: ColorsManager.blackColor, + ), + ], + ), + ], + ), + ), + ); + } +} + +class NewUpdateContainer extends StatelessWidget { + final String? sosVersion; + final String? sosDescription; + const NewUpdateContainer({ + this.sosVersion, + this.sosDescription, + super.key, + }); + + @override + Widget build(BuildContext context) { + return DefaultContainer( + height: MediaQuery.of(context).size.height * 0.50, + child: Padding( + padding: const EdgeInsets.all(25), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SvgPicture.asset( + Assets.emptyUpdateIcon, + fit: BoxFit.fill, + ), + const BodyMedium( + text: 'New Update Available Now!', + fontColor: ColorsManager.blueColor, + ), + BodyMedium( + text: sosVersion!, + fontColor: ColorsManager.primaryTextColor, + ), + Container( + width: MediaQuery.of(context).size.width * 0.7, + child: BodyMedium( + text: sosDescription!, + fontColor: ColorsManager.textPrimaryColor, + textAlign: TextAlign.center, + ), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.6, + child: DefaultButton( + borderRadius: 25, + backgroundColor: ColorsManager.blueColor1, + height: 150, + onPressed: () { + showDialog( + context: context, + builder: (context) { + return SosUpdateNote( + cancelTab: () { + Navigator.of(context).pop(); + }, + confirmTab: () { + Navigator.of(context).pop(); + }, + ); + }, + ); + }, + child: const BodyMedium( + text: 'Update Now', + fontColor: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w700, + textAlign: TextAlign.center, + ), + ), + ) + ], + ), + ], + ), + ), + ); + } +} + +class UpdateSosContainerWithProgressBar extends StatelessWidget { + final String? sosVersion; + final String? sosDescription; + const UpdateSosContainerWithProgressBar({ + this.sosVersion, + this.sosDescription, + super.key, + }); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + DefaultContainer( + height: MediaQuery.of(context).size.height * 0.50, + child: Padding( + padding: const EdgeInsets.all(25), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SvgPicture.asset( + Assets.emptyUpdateIcon, + fit: BoxFit.fill, + ), + const BodyMedium( + text: 'New Update Available Now!', + fontColor: ColorsManager.blueColor, + ), + BodyMedium( + text: sosVersion!, + fontColor: ColorsManager.primaryTextColor, + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.7, + child: BodyMedium( + text: sosDescription!, + fontColor: ColorsManager.textPrimaryColor, + textAlign: TextAlign.center, + ), + ), + LinearPercentIndicator( + barRadius: Radius.circular(10), + width: 170.0, + animation: true, + animationDuration: 1000, + lineHeight: 5.0, + percent: 0.2, + linearStrokeCap: LinearStrokeCap.butt, + progressColor: ColorsManager.blueColor1, + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.7, + child: const BodyMedium( + text: 'Downloading Update please be patient', + fontColor: ColorsManager.textPrimaryColor, + textAlign: TextAlign.center, + ), + ), + ], + ), + ], + ), + ), + ), + SizedBox( + width: MediaQuery.of(context).size.width * 0.7, + child: const BodyMedium( + text: + 'Please keep the power of the device connected during the upgrade process.', + fontColor: ColorsManager.textPrimaryColor, + textAlign: TextAlign.center, + ), + ), + ], + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_setting/update_dialog_sos.dart b/lib/features/devices/view/widgets/sos/sos_setting/update_dialog_sos.dart new file mode 100644 index 0000000..0529161 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_setting/update_dialog_sos.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class UpdateInfoDialog extends StatelessWidget { + final Function()? cancelTab; + final Function()? confirmTab; + + const UpdateInfoDialog({ + super.key, + required this.cancelTab, + required this.confirmTab, + }); + + @override + Widget build(BuildContext context) { + return AlertDialog( + contentPadding: EdgeInsets.zero, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + height: 10, + ), + BodyLarge( + text: 'Update Available', + fontWeight: FontWeight.w700, + fontColor: ColorsManager.switchButton.withOpacity(0.6), + fontSize: 16, + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 15), + child: Divider( + color: ColorsManager.textGray, + ), + ), + const Padding( + padding: EdgeInsets.only(left: 15, right: 20, top: 15, bottom: 20), + child: Column( + children: [ + Center( + child: Text( + 'An update is available for your device. Version 2.1.0 includes new features and important fixes to enhance performance and security.', + textAlign: TextAlign.center, + )), + ], + ), + ), + Row( + children: [ + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + right: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: SizedBox( + child: InkWell( + onTap: cancelTab, + child: const Padding( + padding: const EdgeInsets.only(top: 15, bottom: 15), + child: Center( + child: Text( + 'Remind me later', + style: TextStyle( + color: ColorsManager.textGray, + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + ), + ), + ), + ), + ), + Expanded( + child: Container( + decoration: const BoxDecoration( + border: Border( + left: BorderSide( + color: ColorsManager.textGray, + width: 0.5, + ), + top: BorderSide( + color: ColorsManager.textGray, + width: 1.0, + ), + )), + child: InkWell( + onTap: confirmTab, + child: Padding( + padding: const EdgeInsets.only(top: 15, bottom: 15), + child: Center( + child: Text( + 'Update Now', + style: TextStyle( + color: + ColorsManager.switchButton.withOpacity(0.6), + fontSize: 14, + fontWeight: FontWeight.w400), + ), + ), + )), + )) + ], + ) + ], + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_settings.dart b/lib/features/devices/view/widgets/sos/sos_settings.dart new file mode 100644 index 0000000..b7b834d --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_settings.dart @@ -0,0 +1,460 @@ +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/sos_bloc/sos_bloc.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_event.dart'; +import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; +import 'package:syncrow_app/features/devices/model/sos_model.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/delete_dialog.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/sos_profile_page.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/faq_sos_page.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/share_sos_page.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/sos_info_page.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/sos_update_page.dart'; +import 'package:syncrow_app/features/devices/view/widgets/sos/sos_setting/update_dialog_sos.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_medium.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; +import 'package:syncrow_app/generated/assets.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class SosSettings extends StatelessWidget { + final DeviceModel? device; + + const SosSettings({super.key, this.device}); + + @override + Widget build(BuildContext context) { + return DefaultScaffold( + title: 'Device Settings', + child: BlocProvider( + create: (context) => + SosBloc(sosId: device?.uuid ?? '')..add(const SosInitial()), + child: BlocBuilder( + builder: (context, state) { + final sensor = BlocProvider.of(context); + SosModel model = + SosModel(batteryPercentage: 0, waterContactState: 'normal'); + if (state is LoadingNewSate) { + model = state.sosSensor; + } else if (state is UpdateState) { + model = state.sensor; + } + return state is SosLoadingState + ? const Center( + child: DefaultContainer( + width: 50, + height: 50, + child: CircularProgressIndicator()), + ) + : RefreshIndicator( + onRefresh: () async { + sensor.add(const SosInitial()); + }, + child: ListView( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 10, + ), + child: InkWell( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => const SosProfilePage(), + ), + ); + }, + child: Stack( + children: [ + const Column( + crossAxisAlignment: + CrossAxisAlignment.stretch, + children: [ + SizedBox(height: 20), + DefaultContainer( + borderRadius: + BorderRadius.all(Radius.circular(30)), + child: Padding( + padding: EdgeInsets.all(10.0), + child: Padding( + padding: EdgeInsets.only(left: 90), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + BodyMedium( + text: 'SOS', + fontWeight: FontWeight.bold, + ), + SizedBox( + height: 5, + ), + BodySmall( + text: "Room: Syncrow"), + ], + ), + Icon(Icons.edit_sharp) + ], + ), + ), + ), + ), + ], + ), + Positioned( + top: 0, + left: 20, + child: CircleAvatar( + radius: 40, + backgroundColor: Colors.white, + child: CircleAvatar( + radius: 40, + backgroundColor: Colors.grey, + child: ClipOval( + child: SvgPicture.asset( + Assets.sosProfileIcon, + fit: BoxFit.fill, + ), + ), + ), + ), + ), + ], + ), + ), + ), + const SizedBox(height: 20), + const BodyMedium( + text: 'Device Management', + fontWeight: FontWeight.w700, + fontSize: 12, + fontColor: ColorsManager.grayColor, + ), + DefaultContainer( + child: SettingWidget( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => const SosInfoPge()), + ); + }, + text: 'Device Information', + icon: Assets.infoIcon, + ), + ), + const SizedBox(height: 20), + const BodyMedium( + text: 'Device Offline Notification', + fontWeight: FontWeight.w700, + fontSize: 12, + fontColor: ColorsManager.grayColor, + ), + DefaultContainer( + child: SettingWidget( + onTap: () {}, + text: 'Offline Notification', + icon: Assets.notificationIcon, + ), + ), + const SizedBox(height: 20), + const BodyMedium( + text: 'Others', + fontWeight: FontWeight.w700, + fontSize: 12, + fontColor: ColorsManager.grayColor, + ), + const SizedBox(height: 5), + DefaultContainer( + child: Column( + children: [ + SettingWidget( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + ShareSosPage(device: device!)), + ); + }, + text: 'Share Device', + icon: Assets.shareIcon, + ), + const Divider( + color: ColorsManager.dividerColor, + ), + SettingWidget( + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + FaqSosPage(device: device!)), + ); + }, + text: 'Device FAQ', + icon: Assets.faqIcon, + ), + const Divider( + color: ColorsManager.dividerColor, + ), + SettingWidget( + onTapUpdate: () { + showDialog( + context: context, + builder: (context) { + return UpdateInfoDialog( + cancelTab: () { + Navigator.of(context).pop(); + }, + confirmTab: () { + // context + // .read< + // CreateSceneBloc>() + // .add(DeleteSceneEvent( + // sceneId: sceneId, + // unitUuid: HomeCubit + // .getInstance() + // .selectedSpace! + // .id!, + // )); + Navigator.of(context).pop(); + }, + ); + }, + ); + }, + isUpdate: true, + onTap: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => + const SosUpdatePage()), + ); + }, + text: 'Device Update', + icon: Assets.updateIcon, + ), + ], + ), + ), + const SizedBox(height: 20), + InkWell( + onTap: () { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return Container( + height: 200, + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const BodyMedium( + text: 'Remove Device', + fontWeight: FontWeight.w700, + fontSize: 16, + fontColor: ColorsManager.red, + ), + const SizedBox(height: 10), + const SizedBox( + width: 250, + child: Divider( + color: ColorsManager.dividerColor, + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () { + showDialog( + context: context, + builder: (context) { + return DisconnectDeviceDialog( + cancelTab: () { + Navigator.of(context) + .pop(); + }, + confirmTab: () { + // context + // .read< + // CreateSceneBloc>() + // .add(DeleteSceneEvent( + // sceneId: sceneId, + // unitUuid: HomeCubit + // .getInstance() + // .selectedSpace! + // .id!, + // )); + Navigator.of(context) + .pop(); + }, + ); + }, + ); + }, + child: const BodyMedium( + text: 'Disconnect Device', + fontWeight: FontWeight.w400, + fontSize: 15, + fontColor: ColorsManager + .textPrimaryColor, + ), + ), + const Icon( + Icons.keyboard_arrow_right, + color: ColorsManager.textGray, + ) + ], + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () { + showDialog( + context: context, + builder: (context) { + return DisconnectWipeData( + cancelTab: () { + Navigator.of(context) + .pop(); + }, + confirmTab: () { + // context + // .read< + // CreateSceneBloc>() + // .add(DeleteSceneEvent( + // sceneId: sceneId, + // unitUuid: HomeCubit + // .getInstance() + // .selectedSpace! + // .id!, + // )); + Navigator.of(context) + .pop(); + }, + ); + }, + ); + }, + child: const BodyMedium( + text: + 'Disconnect Device and Wipe Data', + fontWeight: FontWeight.w400, + fontSize: 15, + fontColor: ColorsManager + .textPrimaryColor, + ), + ), + const Icon( + Icons.keyboard_arrow_right, + color: ColorsManager.textGray, + ) + ], + ), + ], + ), + ); + }, + ); + }, + child: const Center( + child: BodyMedium( + text: 'Remove Device', + fontWeight: FontWeight.w400, + fontSize: 15, + fontColor: ColorsManager.red, + ), + ), + ), + ], + ), + ); + }, + ), + ), + ); + } +} + +class SettingWidget extends StatelessWidget { + final String? text; + final bool? isUpdate; + final String? icon; + final Function()? onTap; + final Function()? onTapUpdate; + const SettingWidget( + {super.key, + this.text, + this.icon, + this.onTap, + this.isUpdate, + this.onTapUpdate}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.all(10), + decoration: const BoxDecoration( + color: ColorsManager.primaryColor, + borderRadius: BorderRadius.all(Radius.circular(50))), + child: SvgPicture.asset( + icon!, + fit: BoxFit.fill, + height: 25, + ), + ), + ), + const SizedBox( + width: 10, + ), + Expanded( + flex: isUpdate == true ? 3 : 6, + child: BodyMedium( + text: text!, + fontSize: 15, + fontWeight: FontWeight.w400, + )), + ], + ), + ), + isUpdate == true + ? InkWell( + onTap: onTapUpdate, + child: const BodyMedium( + text: '1 Update Available', + fontSize: 13, + fontWeight: FontWeight.w400, + fontColor: ColorsManager.blueColor, + ), + ) + : const SizedBox(), + const Icon( + Icons.arrow_forward_ios, + color: ColorsManager.graysColor, + size: 20, + ) + ], + ), + ); + } +} diff --git a/lib/features/devices/view/widgets/sos/sos_status_bar.dart b/lib/features/devices/view/widgets/sos/sos_status_bar.dart new file mode 100644 index 0000000..e1be227 --- /dev/null +++ b/lib/features/devices/view/widgets/sos/sos_status_bar.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:syncrow_app/features/devices/model/smart_door_model.dart'; +import 'package:syncrow_app/generated/assets.dart'; + +class SosStatusBar extends StatelessWidget { + const SosStatusBar({ + required this.smartDoorModel, + super.key, + }); + + final SmartDoorModel smartDoorModel; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SvgPicture.asset(Assets.assetsIconsWifi), + Transform.rotate( + angle: 1.5708, // 90 degrees in radians (π/2 or 1.5708) + child: Icon( + _getBatteryIcon(smartDoorModel.residualElectricity), + color: _getBatteryColor(smartDoorModel.residualElectricity), + size: 30, + ), + ), + ], + ); + } + + IconData _getBatteryIcon(int batteryLevel) { + // if (batteryState == BatteryState.charging) { + // return Icons.battery_charging_full; + // } else + if (batteryLevel >= 80) { + return Icons.battery_full; + } else if (batteryLevel >= 60) { + return Icons.battery_4_bar; + } else if (batteryLevel >= 40) { + return Icons.battery_3_bar; + } else if (batteryLevel >= 20) { + return Icons.battery_2_bar; + } else { + return Icons.battery_alert; + } + } + + Color _getBatteryColor(int batteryLevel) { + if (batteryLevel >= 80) { + return Colors.green; + } else if (batteryLevel >= 40) { + return Colors.yellowAccent; + } else { + return Colors.red; + } + } +} diff --git a/lib/generated/assets.dart b/lib/generated/assets.dart index 1a2ecf7..98114ab 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,27 +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 detectedWaterLeak = + "assets/icons/detected_water_leak.svg"; static const String waterLeakIcon = "assets/icons/waterleak_icon.svg"; static const String leakDetectedIcon = "assets/icons/leak_detected.svg"; @@ -1012,5 +1091,19 @@ class Assets { static const String powerClampIcon = "assets/icons/power_clamp.svg"; static const String automationIcon = "assets/icons/automation_ic.svg"; - //powerClampIcon + //sos + static const String redSos = "assets/icons/red_sos.svg"; + static const String greenSos = "assets/icons/green_sos.svg"; + static const String emptyLog = "assets/icons/empty_log.svg"; + static const String sosProfileIcon = "assets/icons/sos_profile_icon.svg"; + static const String sosEditProfile = "assets/icons/edit_sos_icon.svg"; + static const String thumbUp = "assets/icons/thumb_up.svg"; + static const String thumbDown = "assets/icons/thumb_down.svg"; + static const String shareIcon = "assets/icons/share_icon.svg"; + static const String infoIcon = "assets/icons/info.svg"; + static const String notificationIcon = "assets/icons/notification_icon.svg"; + static const String faqIcon = "assets/icons/faq_icon.svg"; + static const String updateIcon = "assets/icons/update_icon.svg"; + static const String emptyUpdateIcon = "assets/icons/empty_update_icon.svg"; + static const String checkUpdateIcon = "assets/icons/check_update_icon.svg"; } diff --git a/lib/utils/resource_manager/color_manager.dart b/lib/utils/resource_manager/color_manager.dart index c078eab..ac3a4bb 100644 --- a/lib/utils/resource_manager/color_manager.dart +++ b/lib/utils/resource_manager/color_manager.dart @@ -31,5 +31,8 @@ abstract class ColorsManager { static const Color switchButton = Color(0xff023DFE); static const Color grayBox = Color(0xffF5F5F5); static const Color chart = Color(0xff023DFE); + static const Color blueColor = Color(0xff5481F3); + static const Color blueColor1 = Color(0xff0A7AFF); + static const Color grayButtonColors = Color(0xffCCCCCC); } //background: #F5F5F5;023DFE diff --git a/pubspec.lock b/pubspec.lock index 4b11f46..057d001 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -704,6 +704,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.1" + percent_indicator: + dependency: "direct main" + description: + name: percent_indicator + sha256: c37099ad833a883c9d71782321cb65c3a848c21b6939b6185f0ff6640d05814c + url: "https://pub.dev" + source: hosted + version: "4.2.3" permission_handler: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index e2f30e0..0cf1620 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,6 +46,7 @@ dependencies: device_info_plus: ^10.1.0 fl_chart: ^0.69.0 firebase_database: ^10.5.7 + percent_indicator: ^4.0.1 dev_dependencies: