code changes

This commit is contained in:
mohammad
2024-11-25 15:45:40 +03:00
parent 946f806a71
commit 4527ec15ee
9 changed files with 274 additions and 410 deletions
@@ -62,6 +62,12 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
bool waterAlarm = false; bool waterAlarm = false;
static String deviceName = ''; static String deviceName = '';
static String selectedRoomId = ''; static String selectedRoomId = '';
bool selecedScene = false;
bool enableAlarm = false;
List<FourSceneSwitchModel> fourScene = [];
String _selectedOption = '';
bool _hasSelectionChanged = false;
FourSceneModelState deviceStatus = FourSceneModelState( FourSceneModelState deviceStatus = FourSceneModelState(
scene_1: '', scene_1: '',
@@ -103,36 +109,17 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
subspaceName: "", subspaceName: "",
), ),
); );
String selectedFormApiSceneId = '';
//============================ get Scene and assign scene =====================
String selectedFormApiSceneId = '';
String selectedSceneId = ''; String selectedSceneId = '';
_selectScene(SelectSceneEvent event, Emitter<FourSceneState> emit) { _selectScene(SelectSceneEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState()); emit(FourSceneLoadingState());
selectedSceneId = event.selectedSceneId; selectedSceneId = event.selectedSceneId;
emit(SceneSelectionUpdatedState(selectedSceneId: selectedSceneId)); emit(SceneSelectionUpdatedState(selectedSceneId: selectedSceneId));
} }
Future<void> saveName(
SaveNameEvent event, Emitter<FourSceneState> emit) async {
if (_validateInputs()) return;
try {
add(const ChangeNameEvent(value: false));
isSaving = true;
emit(FourSceneLoadingState());
var response = await DevicesAPI.putDeviceName(
deviceId: fourSceneId, deviceName: nameController.text);
add(const FourSceneInitialInfo());
CustomSnackBar.displaySnackBar('Save Successfully');
emit(SaveState());
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
} finally {
isSaving = false;
}
}
void getSceneByName( void getSceneByName(
GetSceneBySwitchName event, Emitter<FourSceneState> emit) async { GetSceneBySwitchName event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState()); emit(FourSceneLoadingState());
@@ -146,12 +133,6 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
} }
} }
bool selecedScene = false;
bool enableAlarm = false;
String _selectedOption = '';
bool _hasSelectionChanged = false;
void _onOptionSelected( void _onOptionSelected(
SelectOptionEvent event, Emitter<FourSceneState> emit) { SelectOptionEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState()); emit(FourSceneLoadingState());
@@ -162,8 +143,6 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
hasSelectionChanged: _hasSelectionChanged)); hasSelectionChanged: _hasSelectionChanged));
} }
List<FourSceneSwitchModel> fourScene = [];
void _fetchFourSceneSwitches( void _fetchFourSceneSwitches(
FourSceneSwitchInitial event, Emitter<FourSceneState> emit) async { FourSceneSwitchInitial event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState()); emit(FourSceneLoadingState());
@@ -195,37 +174,6 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
} }
} }
deleteDevice(DeleteDeviceEvent event, Emitter<FourSceneState> emit) async {
try {
emit(FourSceneLoadingState());
var response = await DevicesAPI.resetDevise(devicesUuid: fourSceneId);
CustomSnackBar.displaySnackBar('Reset Successfully');
emit(UpdateState(device: deviceStatus));
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
return;
}
}
void _fetchDeviceStatus(
FourSceneInitial event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState());
try {
var response = await DevicesAPI.getDeviceStatus(fourSceneId);
List<StatusModel> statusModelList = [];
for (var status in response['status']) {
statusModelList.add(StatusModel.fromJson(status));
}
deviceStatus = FourSceneModelState.fromJson(
statusModelList,
);
add(const FourSceneSwitchInitial());
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
return;
}
}
void assignScene( void assignScene(
AssignDeviceScene event, Emitter<FourSceneState> emit) async { AssignDeviceScene event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState()); emit(FourSceneLoadingState());
@@ -263,6 +211,8 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
} }
} }
//===================== fetch Device Status and info =======================
void _toggleLowBattery( void _toggleLowBattery(
ToggleEnableAlarmEvent event, Emitter<FourSceneState> emit) async { ToggleEnableAlarmEvent event, Emitter<FourSceneState> emit) async {
emit(LoadingNewSate(device: deviceStatus)); emit(LoadingNewSate(device: deviceStatus));
@@ -274,26 +224,24 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
} }
} }
// void _controlDevice( void _fetchDeviceStatus(
// ControlDeviceScene event, Emitter<FourSceneState> emit) async { FourSceneInitial event, Emitter<FourSceneState> emit) async {
// emit(FourSceneLoadingState()); emit(FourSceneLoadingState());
// try { try {
// deviceStatus.switch_backlight = !event.backLight!; var response = await DevicesAPI.getDeviceStatus(fourSceneId);
// emit(UpdateState(device: deviceStatus)); List<StatusModel> statusModelList = [];
// final response = await DevicesAPI.controlDevice( for (var status in response['status']) {
// DeviceControlModel( statusModelList.add(StatusModel.fromJson(status));
// deviceId: fourSceneId, }
// code: 'switch_backlight', deviceStatus = FourSceneModelState.fromJson(
// value: !event.backLight!), statusModelList,
// fourSceneId); );
add(const FourSceneSwitchInitial());
// if (!response['success']) { } catch (e) {
// // add(InitialEvent(groupScreen: oneTouchGroup)); emit(FourSceneFailedState(errorMessage: e.toString()));
// } return;
// } catch (_) { }
// // add(InitialEvent(groupScreen: oneTouchGroup)); }
// }
// }
Future fetchDeviceInfo( Future fetchDeviceInfo(
FourSceneInitialInfo event, Emitter<FourSceneState> emit) async { FourSceneInitialInfo event, Emitter<FourSceneState> emit) async {
@@ -318,18 +266,8 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
emit(FaqSearchState(filteredFaqQuestions: _faqQuestions)); emit(FaqSearchState(filteredFaqQuestions: _faqQuestions));
} }
void _changeName(ChangeNameEvent event, Emitter<FourSceneState> emit) { //============================ assign Device ==================================
emit(FourSceneLoadingState()); //////////////////////////////////////////////////////////////////////////////
editName = event.value!;
if (editName) {
Future.delayed(const Duration(milliseconds: 500), () {
focusNode.requestFocus();
});
} else {
focusNode.unfocus();
}
emit(NameEditingState(editName: editName));
}
void _toggleNotification( void _toggleNotification(
ToggleNotificationEvent event, Emitter<FourSceneState> emit) async { ToggleNotificationEvent event, Emitter<FourSceneState> emit) async {
@@ -337,15 +275,6 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
try { try {
enableAlarm = event.isClosingEnabled; enableAlarm = event.isClosingEnabled;
emit(UpdateState(device: deviceStatus)); emit(UpdateState(device: deviceStatus));
// API call to update the state, if necessary
// await DevicesAPI.controlDevice(
// DeviceControlModel(
// deviceId: sosId,
// code: 'closing_reminder',
// value: closingReminder,
// ),
// sosId,
// );
} catch (e) { } catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString())); emit(FourSceneFailedState(errorMessage: e.toString()));
} }
@@ -354,38 +283,50 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
DeviceReport recordGroups = DeviceReport recordGroups =
DeviceReport(startTime: '0', endTime: '0', data: []); DeviceReport(startTime: '0', endTime: '0', data: []);
//========================= Question and faq ================================
final List<QuestionModel> faqQuestions = [ final List<QuestionModel> faqQuestions = [
QuestionModel( QuestionModel(
id: 1, id: 1,
question: 'How does an SOS emergency button work?', question:
'How does an 4 Scene Switch work? How long will an 4 Scene Switch persist?',
answer: answer:
'The SOS emergency button sends an alert to your contacts when pressed.', 'Yes. In scenes with high detection requirements, we recommend that you choose phone or message notification in Automation.',
), ),
QuestionModel( QuestionModel(
id: 2, id: 2,
question: 'How long will an SOS alarm persist?', question: 'Does the 4 Scene Switch support sending notifications?',
answer: answer:
'The SOS alarm will persist until it is manually turned off or after a set time.', 'The SOS alarm will persist until it is manually turned off or after a set time.',
), ),
QuestionModel( QuestionModel(
id: 3, id: 3,
question: 'What should I do if the SOS button is unresponsive?', question:
'Why does the data statistics in the device panel not show the correct data?',
answer: 'Try restarting the device. If it persists, contact support.', answer: 'Try restarting the device. If it persists, contact support.',
), ),
QuestionModel( QuestionModel(
id: 4, id: 4,
question: 'Can I use the SOS feature without a network connection?', question:
'How long will the App show offline after a device (low-power devices and normal devices) is powered...',
answer: answer:
'No, a network connection is required to send the alert to your contacts.', '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.',
),
]; ];
bool isHelpful = false;
void _toggleHelpful(
ToggleHelpfulEvent event, Emitter<FourSceneState> emit) async {
try {
emit(FourSceneLoadingState());
isHelpful = event.isHelpful!;
emit(SaveState());
} catch (e) {
emit(const FourSceneFailedState(errorMessage: 'Something went wrong'));
}
}
Future<void> _onFourSceneInitial( Future<void> _onFourSceneInitial(
FourSceneInitialQuestion event, Emitter<FourSceneState> emit) async { FourSceneInitialQuestion event, Emitter<FourSceneState> emit) async {
emit(FourSceneLoadingState()); emit(FourSceneLoadingState());
@@ -394,20 +335,6 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
List<DeviceModel> allDevices = []; List<DeviceModel> allDevices = [];
List<SubSpaceModel> roomsList = []; List<SubSpaceModel> roomsList = [];
void _fetchRoomsAndDevices(
FetchRoomsEvent event, Emitter<FourSceneState> emit) async {
try {
emit(FourSceneLoadingState());
roomsList = await SpacesAPI.getSubSpaceBySpaceId(
event.unit.community.uuid, event.unit.id);
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
} catch (e) {
emit(const FourSceneFailedState(errorMessage: 'Something went wrong'));
return;
}
}
bool switchStatus = true; bool switchStatus = true;
Future<void> changeSwitchStatus( Future<void> changeSwitchStatus(
ChangeSwitchStatusEvent event, Emitter<FourSceneState> emit) async { ChangeSwitchStatusEvent event, Emitter<FourSceneState> emit) async {
@@ -499,6 +426,8 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
emit(UpdateStateList(groupDevices: groupDevices, devices: devices)); emit(UpdateStateList(groupDevices: groupDevices, devices: devices));
} }
//=========================== assign device to room ==========================
void _assignDevice( void _assignDevice(
AssignRoomEvent event, Emitter<FourSceneState> emit) async { AssignRoomEvent event, Emitter<FourSceneState> emit) async {
try { try {
@@ -525,6 +454,35 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
} }
} }
void _fetchRoomsAndDevices(
FetchRoomsEvent event, Emitter<FourSceneState> emit) async {
try {
emit(FourSceneLoadingState());
roomsList = await SpacesAPI.getSubSpaceBySpaceId(
event.unit.community.uuid, event.unit.id);
emit(FetchRoomsState(devicesList: allDevices, roomsList: roomsList));
} catch (e) {
emit(const FourSceneFailedState(errorMessage: 'Something went wrong'));
return;
}
}
//============================ setting name ==================================
//////////////////////////////////////////////////////////////////////////////
void _changeName(ChangeNameEvent event, Emitter<FourSceneState> emit) {
emit(FourSceneLoadingState());
editName = event.value!;
if (editName) {
Future.delayed(const Duration(milliseconds: 500), () {
focusNode.requestFocus();
});
} else {
focusNode.unfocus();
}
emit(NameEditingState(editName: editName));
}
bool _validateInputs() { bool _validateInputs() {
final nameError = fullNameValidator(nameController.text); final nameError = fullNameValidator(nameController.text);
if (nameError != null) { if (nameError != null) {
@@ -546,6 +504,27 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
return null; return null;
} }
Future<void> saveName(
SaveNameEvent event, Emitter<FourSceneState> emit) async {
if (_validateInputs()) return;
try {
add(const ChangeNameEvent(value: false));
isSaving = true;
emit(FourSceneLoadingState());
var response = await DevicesAPI.putDeviceName(
deviceId: fourSceneId, deviceName: nameController.text);
add(const FourSceneInitialInfo());
CustomSnackBar.displaySnackBar('Save Successfully');
emit(SaveState());
} catch (e) {
emit(FourSceneFailedState(errorMessage: e.toString()));
} finally {
isSaving = false;
}
}
//====================== update device ==============================
bool enableUpdate = false; bool enableUpdate = false;
void _toggleUpdate( void _toggleUpdate(
@@ -559,16 +538,15 @@ class FourSceneBloc extends Bloc<FourSceneEvent, FourSceneState> {
} }
} }
bool isHelpful = false; deleteDevice(DeleteDeviceEvent event, Emitter<FourSceneState> emit) async {
void _toggleHelpful(
ToggleHelpfulEvent event, Emitter<FourSceneState> emit) async {
try { try {
emit(FourSceneLoadingState()); emit(FourSceneLoadingState());
isHelpful = event.isHelpful!; var response = await DevicesAPI.resetDevise(devicesUuid: fourSceneId);
emit(SaveState()); CustomSnackBar.displaySnackBar('Reset Successfully');
emit(UpdateState(device: deviceStatus));
} catch (e) { } catch (e) {
emit(const FourSceneFailedState(errorMessage: 'Something went wrong')); emit(FourSceneFailedState(errorMessage: e.toString()));
return;
} }
} }
} }
@@ -10,21 +10,6 @@ abstract class FourSceneEvent extends Equatable {
List<Object> get props => []; List<Object> get props => [];
} }
class FourSceneLoading extends FourSceneEvent {}
class FourSceneSwitch extends FourSceneEvent {
final String switchD;
final String deviceId;
final String productId;
const FourSceneSwitch(
{required this.switchD, this.deviceId = '', this.productId = ''});
@override
List<Object> get props => [switchD, deviceId, productId];
}
class FourSceneUpdated extends FourSceneEvent {}
class FourSceneInitialInfo extends FourSceneEvent { class FourSceneInitialInfo extends FourSceneEvent {
const FourSceneInitialInfo(); const FourSceneInitialInfo();
} }
@@ -39,19 +24,6 @@ class SaveNameEvent extends FourSceneEvent {
const SaveNameEvent({this.deviceName}); const SaveNameEvent({this.deviceName});
} }
class ReportLogsInitial extends FourSceneEvent {
const ReportLogsInitial();
}
class FourSceneChangeStatus extends FourSceneEvent {}
class GetCounterEvent extends FourSceneEvent {
final String deviceCode;
const GetCounterEvent({required this.deviceCode});
@override
List<Object> get props => [deviceCode];
}
class ToggleEnableAlarmEvent extends FourSceneEvent { class ToggleEnableAlarmEvent extends FourSceneEvent {
final bool isLowBatteryEnabled; final bool isLowBatteryEnabled;
@@ -70,44 +42,6 @@ class ToggleNotificationEvent extends FourSceneEvent {
List<Object> get props => [isClosingEnabled]; List<Object> get props => [isClosingEnabled];
} }
class ToggleFourSceneAlarmEvent extends FourSceneEvent {
final bool isFourSceneAlarmEnabled;
const ToggleFourSceneAlarmEvent(this.isFourSceneAlarmEnabled);
@override
List<Object> get props => [isFourSceneAlarmEnabled];
}
class SetCounterValue extends FourSceneEvent {
final Duration duration;
final String deviceCode;
const SetCounterValue({required this.duration, required this.deviceCode});
@override
List<Object> get props => [duration, deviceCode];
}
class StartTimer extends FourSceneEvent {
final int duration;
const StartTimer(this.duration);
@override
List<Object> get props => [duration];
}
class TickTimer extends FourSceneEvent {
final int remainingTime;
const TickTimer(this.remainingTime);
@override
List<Object> get props => [remainingTime];
}
class StopTimer extends FourSceneEvent {}
class OnClose extends FourSceneEvent {}
class DeleteDeviceEvent extends FourSceneEvent {} class DeleteDeviceEvent extends FourSceneEvent {}
class ChangeNameEvent extends FourSceneEvent { class ChangeNameEvent extends FourSceneEvent {
@@ -164,11 +98,9 @@ class SearchScenesEvent extends FourSceneEvent {
}); });
} }
class SaveLocationSelectionEvent extends FourSceneEvent {}
class SelectOptionEvent extends FourSceneEvent { class SelectOptionEvent extends FourSceneEvent {
final dynamic selectedOption; final dynamic selectedOption;
const SelectOptionEvent({ const SelectOptionEvent({
this.selectedOption, this.selectedOption,
}); });
} }
@@ -176,14 +108,14 @@ class SelectOptionEvent extends FourSceneEvent {
class AddDeviceToGroup extends FourSceneEvent { class AddDeviceToGroup extends FourSceneEvent {
final GroupDevicesModel device; final GroupDevicesModel device;
final String icon; final String icon;
AddDeviceToGroup(this.device, this.icon); const AddDeviceToGroup(this.device, this.icon);
} }
class RemoveDeviceFromGroup extends FourSceneEvent { class RemoveDeviceFromGroup extends FourSceneEvent {
final GroupDevicesModel device; final GroupDevicesModel device;
final String icon; final String icon;
RemoveDeviceFromGroup(this.device, this.icon); const RemoveDeviceFromGroup(this.device, this.icon);
} }
class AssignRoomEvent extends FourSceneEvent { class AssignRoomEvent extends FourSceneEvent {
@@ -207,15 +139,10 @@ class AssignRoomEvent extends FourSceneEvent {
class FetchDeviceScene extends FourSceneEvent {} class FetchDeviceScene extends FourSceneEvent {}
class FourSceneSwitchInitial extends FourSceneEvent { class FourSceneSwitchInitial extends FourSceneEvent {
const FourSceneSwitchInitial(); const FourSceneSwitchInitial();
} }
class SaveSelectionSceneEvent extends FourSceneEvent {
const SaveSelectionSceneEvent();
}
class AssignDeviceScene extends FourSceneEvent { class AssignDeviceScene extends FourSceneEvent {
final String? sceneUuid; final String? sceneUuid;
final String? switchName; final String? switchName;
@@ -232,13 +159,13 @@ class GetSceneBySwitchName extends FourSceneEvent {
const GetSceneBySwitchName({this.switchName}); const GetSceneBySwitchName({this.switchName});
} }
class ToggleUpdateEvent extends FourSceneEvent { class ToggleUpdateEvent extends FourSceneEvent {
final bool? isUpdateEnabled; final bool? isUpdateEnabled;
const ToggleUpdateEvent({this.isUpdateEnabled}); const ToggleUpdateEvent({this.isUpdateEnabled});
} }
class ToggleHelpfulEvent extends FourSceneEvent { class ToggleHelpfulEvent extends FourSceneEvent {
final bool? isHelpful; final bool? isHelpful;
const ToggleHelpfulEvent({this.isHelpful}); const ToggleHelpfulEvent({this.isHelpful});
} }
@@ -14,12 +14,8 @@ class FourSceneState extends Equatable {
List<Object> get props => []; List<Object> get props => [];
} }
class FourSceneInitialState extends FourSceneState {}
class FourSceneLoadingState extends FourSceneState {} class FourSceneLoadingState extends FourSceneState {}
class FourSceState extends FourSceneState {}
class UpdateStateList extends FourSceneState { class UpdateStateList extends FourSceneState {
final List<GroupDevicesModel> groupDevices; final List<GroupDevicesModel> groupDevices;
final List<GroupDevicesModel> devices; final List<GroupDevicesModel> devices;
@@ -60,7 +56,7 @@ class NameEditingState extends FourSceneState {
class FaqLoadedState extends FourSceneState { class FaqLoadedState extends FourSceneState {
final List<QuestionModel> filteredFaqQuestions; final List<QuestionModel> filteredFaqQuestions;
FaqLoadedState({this.filteredFaqQuestions = const []}); const FaqLoadedState({this.filteredFaqQuestions = const []});
} }
class FaqSearchState extends FourSceneState { class FaqSearchState extends FourSceneState {
@@ -94,8 +90,6 @@ class SceneLoaded extends FourSceneState {
{this.loadingSceneId, this.loadingStates = const {}}); {this.loadingSceneId, this.loadingStates = const {}});
} }
class SelectedSceneState extends FourSceneState {}
class SearchResultsState extends FourSceneState {} class SearchResultsState extends FourSceneState {}
class SaveState extends FourSceneState {} class SaveState extends FourSceneState {}
@@ -106,7 +100,7 @@ class OptionSelectedState extends FourSceneState {
final String selectedOption; final String selectedOption;
final bool hasSelectionChanged; final bool hasSelectionChanged;
OptionSelectedState({ const OptionSelectedState({
required this.selectedOption, required this.selectedOption,
required this.hasSelectionChanged, required this.hasSelectionChanged,
}); });
@@ -126,5 +120,5 @@ class LoadingDeviceInfo extends FourSceneState {
class SceneSelectionUpdatedState extends FourSceneState { class SceneSelectionUpdatedState extends FourSceneState {
final String selectedSceneId; final String selectedSceneId;
SceneSelectionUpdatedState({required this.selectedSceneId}); const SceneSelectionUpdatedState({required this.selectedSceneId});
} }
@@ -11,7 +11,8 @@ import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dar
import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class AlarmManagementPage extends StatelessWidget { class AlarmManagementPage extends StatelessWidget {
const AlarmManagementPage({super.key}); final String sosId;
const AlarmManagementPage({super.key, required this.sosId});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -29,18 +29,15 @@ class SosScreen extends StatelessWidget {
child: BlocBuilder<SosBloc, SosState>( child: BlocBuilder<SosBloc, SosState>(
builder: (context, state) { builder: (context, state) {
final sensor = BlocProvider.of<SosBloc>(context); final sensor = BlocProvider.of<SosBloc>(context);
// Default SOS model in case no state is loaded
SosModel model = SosModel( SosModel model = SosModel(
batteryPercentage: 0, batteryPercentage: 0,
sosContactState: '', sosContactState: '',
); );
// Update the model based on the state
if (state is LoadingNewSate) { if (state is LoadingNewSate) {
model = state.sosSensor; model = state.sosSensor;
} else if (state is UpdateState) { } else if (state is UpdateState) {
model = state.sensor; model = state.sensor;
} }
return DefaultScaffold( return DefaultScaffold(
title: sensor.deviceInfo.name, title: sensor.deviceInfo.name,
actions: [ actions: [
@@ -183,7 +180,9 @@ class SosScreen extends StatelessWidget {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (context) => builder: (context) =>
const AlarmManagementPage(), AlarmManagementPage(
sosId: device!.uuid!,
),
), ),
); );
}, },
@@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/app_layout/model/space_model.dart'; import 'package:syncrow_app/features/app_layout/model/space_model.dart';
@@ -6,11 +5,9 @@ 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_event.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.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/devices/model/sos_model.dart';
import 'package:syncrow_app/features/devices/model/subspace_model.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.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/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_medium.dart';
import 'package:syncrow_app/navigation/routing_constants.dart';
import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart';
class LocationSosPage extends StatelessWidget { class LocationSosPage extends StatelessWidget {
@@ -39,8 +36,8 @@ class LocationSosPage extends StatelessWidget {
SosModel model = SosModel model =
SosModel(batteryPercentage: 0, sosContactState: ''); SosModel(batteryPercentage: 0, sosContactState: '');
if (state is SaveSelectionSuccessState) { if (state is SaveSelectionSuccessState) {
new Future.delayed(const Duration(microseconds: 500), () { Future.delayed(const Duration(microseconds: 500), () {
_bloc.add(SosInitial()); _bloc.add(const SosInitial());
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
}); });
} }
@@ -80,64 +77,59 @@ class LocationSosPage extends StatelessWidget {
), ),
const SizedBox(width: 20), const SizedBox(width: 20),
], ],
child: RefreshIndicator( child: ListView(
onRefresh: () async { shrinkWrap: true,
// sensor.add(const SosInitial()); padding: const EdgeInsets.symmetric(vertical: 20),
}, children: [
child: ListView( const BodyMedium(
shrinkWrap: true, text: 'Smart Device Location',
padding: const EdgeInsets.symmetric(vertical: 20), fontWeight: FontWeight.w700,
children: [ fontSize: 12,
const BodyMedium( fontColor: ColorsManager.grayColor,
text: 'Smart Device Location', ),
fontWeight: FontWeight.w700, const SizedBox(height: 5),
fontSize: 12, DefaultContainer(
fontColor: ColorsManager.grayColor, padding: const EdgeInsets.all(20),
), child: ListView.builder(
const SizedBox(height: 5), physics: const NeverScrollableScrollPhysics(),
DefaultContainer( shrinkWrap: true,
padding: const EdgeInsets.all(20), itemCount: _bloc.roomsList.length,
child: ListView.builder( itemBuilder: (context, index) {
physics: const NeverScrollableScrollPhysics(), final fromRoom = _bloc.roomsList[index];
shrinkWrap: true, final isSelected = (state
itemCount: _bloc.roomsList.length, is OptionSelectedState &&
itemBuilder: (context, index) { state.selectedOption == fromRoom.id) ||
final fromRoom = _bloc.roomsList[index]; (state is! OptionSelectedState &&
final isSelected = (state fromRoom.id ==
is OptionSelectedState && _bloc.deviceInfo.subspace.uuid);
state.selectedOption == fromRoom.id) ||
(state is! OptionSelectedState &&
fromRoom.id ==
_bloc.deviceInfo.subspace.uuid);
return Column( return Column(
children: [ children: [
_buildCheckboxOption( _buildCheckboxOption(
label: fromRoom.name!, label: fromRoom.name!,
isSelected: isSelected, isSelected: isSelected,
onTap: (label) { onTap: (label) {
context.read<SosBloc>().add( context.read<SosBloc>().add(
SelectOptionEvent( SelectOptionEvent(
selectedOption: fromRoom.id!, selectedOption: fromRoom.id!,
), ),
); );
roomIdSelected = fromRoom.id!; roomIdSelected = fromRoom.id!;
}, },
),
if (index < _bloc.roomsList.length - 1) ...[
const SizedBox(height: 10),
const Divider(
color: ColorsManager.dividerColor,
), ),
if (index < _bloc.roomsList.length - 1) ...[ const SizedBox(height: 10),
const SizedBox(height: 10),
const Divider(
color: ColorsManager.dividerColor,
),
const SizedBox(height: 10),
],
], ],
); ],
}, );
), },
), ),
], ),
), ],
), ),
); );
}, },
@@ -5,7 +5,6 @@ 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_event.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.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/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_button.dart';
import 'package:syncrow_app/features/shared_widgets/default_container.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/default_scaffold.dart';
@@ -28,13 +27,7 @@ class QuestionPage extends StatelessWidget {
child: BlocBuilder<SosBloc, SosState>( child: BlocBuilder<SosBloc, SosState>(
builder: (context, state) { builder: (context, state) {
final sensor = BlocProvider.of<SosBloc>(context); final sensor = BlocProvider.of<SosBloc>(context);
SosModel model =
SosModel(batteryPercentage: 0, sosContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SosLoadingState return state is SosLoadingState
? const Center( ? const Center(
child: DefaultContainer( child: DefaultContainer(
@@ -42,109 +35,105 @@ class QuestionPage extends StatelessWidget {
height: 50, height: 50,
child: CircularProgressIndicator()), child: CircularProgressIndicator()),
) )
: RefreshIndicator( : Column(
onRefresh: () async { children: [
sensor.add(const SosInitial()); DefaultContainer(
}, padding: const EdgeInsets.all(15),
child: Column( child: Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
DefaultContainer( children: [
padding: EdgeInsets.all(15), BodyLarge(
child: Column( text: questionModel!.question,
crossAxisAlignment: CrossAxisAlignment.start, fontSize: 22,
children: [ fontWeight: FontWeight.w400,
BodyLarge( fontColor: ColorsManager.blackColor,
text: questionModel!.question, ),
fontSize: 22, const SizedBox(
fontWeight: FontWeight.w400, height: 15,
fontColor: ColorsManager.blackColor, ),
), BodyMedium(
SizedBox( text: questionModel!.answer,
height: 15, fontSize: 14,
), fontWeight: FontWeight.w400,
BodyMedium( fontColor: ColorsManager.secondaryTextColor,
text: questionModel!.answer, ),
fontSize: 14, ],
fontWeight: FontWeight.w400,
fontColor: ColorsManager.secondaryTextColor,
),
],
),
), ),
SizedBox( ),
height: MediaQuery.of(context).size.height * 0.15, SizedBox(
height: MediaQuery.of(context).size.height * 0.15,
),
Center(
child: SizedBox(
width: 180,
child: DefaultButton(
backgroundColor: sensor.isHelpful == true
? ColorsManager.grayColor
: ColorsManager.grayButtonColors,
borderRadius: 50,
onPressed: () {
sensor.add(
const ToggleHelpfulEvent(isHelpful: true));
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.thumbUp,
fit: BoxFit.fill,
),
const SizedBox(
width: 10,
),
const BodyMedium(
text: 'Helpful',
fontSize: 12,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
],
)),
), ),
Center( ),
child: SizedBox( const SizedBox(
width: 180, height: 15,
child: DefaultButton( ),
backgroundColor: sensor.isHelpful == true Center(
? ColorsManager.grayColor child: SizedBox(
: ColorsManager.grayButtonColors, width: 180,
borderRadius: 50, child: DefaultButton(
onPressed: () { backgroundColor: sensor.isHelpful == false
sensor ? ColorsManager.grayColor
.add(ToggleHelpfulEvent(isHelpful: true)); : ColorsManager.grayButtonColors,
}, borderRadius: 50,
child: Row( onPressed: () {
crossAxisAlignment: CrossAxisAlignment.center, sensor.add(
mainAxisAlignment: MainAxisAlignment.center, const ToggleHelpfulEvent(isHelpful: false));
children: [ },
SvgPicture.asset( child: Row(
Assets.thumbUp, crossAxisAlignment: CrossAxisAlignment.center,
fit: BoxFit.fill, mainAxisAlignment: MainAxisAlignment.center,
), children: [
const SizedBox( SvgPicture.asset(
width: 10, Assets.thumbDown,
), fit: BoxFit.fill,
const BodyMedium( ),
text: 'Helpful', const SizedBox(
fontSize: 12, width: 10,
fontWeight: FontWeight.w400, ),
fontColor: ColorsManager.blackColor, const BodyMedium(
), text: 'Not Helpful',
], fontSize: 12,
)), fontWeight: FontWeight.w400,
), fontColor: ColorsManager.blackColor,
),
],
)),
), ),
const SizedBox( ),
height: 15, ],
), );
Center(
child: SizedBox(
width: 180,
child: DefaultButton(
backgroundColor: sensor.isHelpful == false
? ColorsManager.grayColor
: ColorsManager.grayButtonColors,
borderRadius: 50,
onPressed: () {
sensor.add(
ToggleHelpfulEvent(isHelpful: false));
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.thumbDown,
fit: BoxFit.fill,
),
const SizedBox(
width: 10,
),
const BodyMedium(
text: 'Not Helpful',
fontSize: 12,
fontWeight: FontWeight.w400,
fontColor: ColorsManager.blackColor,
),
],
)),
),
),
],
));
}, },
), ),
), ),
@@ -5,7 +5,6 @@ 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_event.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.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/device_model.dart';
import 'package:syncrow_app/features/devices/model/sos_model.dart';
import 'package:syncrow_app/features/menu/view/widgets/manage_home/home_settings.dart'; import 'package:syncrow_app/features/menu/view/widgets/manage_home/home_settings.dart';
import 'package:syncrow_app/features/shared_widgets/default_button.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_container.dart';
@@ -32,13 +31,6 @@ class ShareSosPage extends StatelessWidget {
child: BlocBuilder<SosBloc, SosState>( child: BlocBuilder<SosBloc, SosState>(
builder: (context, state) { builder: (context, state) {
final sensor = BlocProvider.of<SosBloc>(context); final sensor = BlocProvider.of<SosBloc>(context);
SosModel model =
SosModel(batteryPercentage: 0, sosContactState: 'normal');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SosLoadingState return state is SosLoadingState
? const Center( ? const Center(
child: DefaultContainer( child: DefaultContainer(
@@ -100,7 +92,7 @@ class ShareSosPage extends StatelessWidget {
space: spaces!.first, space: spaces!.first,
))); )));
}, },
child: Text('Add Home Member')), child: const Text('Add Home Member')),
), ),
) )
], ],
@@ -5,7 +5,6 @@ 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_event.dart';
import 'package:syncrow_app/features/devices/bloc/sos_bloc/sos_state.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/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_container.dart';
import 'package:syncrow_app/features/shared_widgets/default_scaffold.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_large.dart';
@@ -29,13 +28,6 @@ class SosInfoPage extends StatelessWidget {
child: BlocBuilder<SosBloc, SosState>( child: BlocBuilder<SosBloc, SosState>(
builder: (context, state) { builder: (context, state) {
final _bloc = BlocProvider.of<SosBloc>(context); final _bloc = BlocProvider.of<SosBloc>(context);
SosModel model =
SosModel(batteryPercentage: 0, sosContactState: '');
if (state is LoadingNewSate) {
model = state.sosSensor;
} else if (state is UpdateState) {
model = state.sensor;
}
return state is SosLoadingState return state is SosLoadingState
? const Center( ? const Center(
child: DefaultContainer( child: DefaultContainer(