finished time period

This commit is contained in:
ashrafzarkanisala
2024-07-28 00:11:19 +03:00
parent 8a1c583bff
commit 0bda828161
8 changed files with 101 additions and 27 deletions
@@ -30,6 +30,7 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
on<UpdateTaskEvent>(_updateTaskValue);
on<SelectConditionEvent>(_selectConditionRule);
on<SceneTypeEvent>(_sceneTypeEvent);
on<EffectiveTimePeriodEvent>(_onEffectiveTimeEvent);
}
CreateSceneEnum sceneType = CreateSceneEnum.none;
@@ -45,6 +46,7 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
final Map<String, dynamic> automationSelectedValues = {};
final Map<String, String> automationComparatorValues = {};
String conditionRule = 'or';
EffectiveTime? effectiveTime;
FutureOr<void> _onAddSceneTask(
AddTaskEvent event, Emitter<CreateSceneState> emit) {
@@ -511,4 +513,9 @@ class CreateSceneBloc extends Bloc<CreateSceneEvent, CreateSceneState>
emit(SceneTypeState(event.type));
}
FutureOr<void> _onEffectiveTimeEvent(
EffectiveTimePeriodEvent event, Emitter<CreateSceneState> emit) {
effectiveTime = event.period;
}
}
@@ -178,3 +178,8 @@ class SceneTypeEvent extends CreateSceneEvent {
final CreateSceneEnum type;
const SceneTypeEvent(this.type);
}
class EffectiveTimePeriodEvent extends CreateSceneEvent {
final EffectiveTime period;
const EffectiveTimePeriodEvent(this.period);
}
@@ -1,6 +1,11 @@
import 'package:bloc/bloc.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_app/features/scene/bloc/create_scene/create_scene_bloc.dart';
import 'package:syncrow_app/features/scene/bloc/effective_period/effect_period_event.dart';
import 'package:syncrow_app/features/scene/bloc/effective_period/effect_period_state.dart';
import 'package:syncrow_app/features/scene/enum/effective_period_options.dart';
import 'package:syncrow_app/features/scene/model/create_automation_model.dart';
import 'package:syncrow_app/navigation/navigation_service.dart';
class EffectPeriodBloc extends Bloc<EffectPeriodEvent, EffectPeriodState> {
EffectPeriodBloc() : super(EffectPeriodState.initial()) {
@@ -10,21 +15,72 @@ class EffectPeriodBloc extends Bloc<EffectPeriodEvent, EffectPeriodState> {
}
void _onSetPeriod(SetPeriod event, Emitter<EffectPeriodState> emit) {
String startTime = '';
String endTime = '';
switch (event.period) {
case EnumEffectivePeriodOptions.allDay:
startTime = '00:00';
endTime = '23:59';
break;
case EnumEffectivePeriodOptions.daytime:
startTime = '06:00';
endTime = '18:00';
break;
case EnumEffectivePeriodOptions.night:
startTime = '18:00';
endTime = '06:00';
break;
case EnumEffectivePeriodOptions.custom:
startTime = state.customStartTime ?? '00:00';
endTime = state.customEndTime ?? '23:59';
break;
default:
break;
}
// Update CreateSceneBloc
BlocProvider.of<CreateSceneBloc>(
NavigationService.navigatorKey.currentState!.context)
.add(EffectiveTimePeriodEvent(EffectiveTime(
start: startTime, end: endTime, loops: state.selectedDaysBinary)));
emit(state.copyWith(selectedPeriod: event.period));
}
void _onToggleDay(ToggleDay event, Emitter<EffectPeriodState> emit) {
final days = List.of(state.selectedDays);
if (days.contains(event.day)) {
days.remove(event.day);
final daysList = state.selectedDaysBinary.split('');
final dayIndex = _getDayIndex(event.day);
if (daysList[dayIndex] == '1') {
daysList[dayIndex] = '0';
} else {
days.add(event.day);
daysList[dayIndex] = '1';
}
emit(state.copyWith(selectedDays: days));
final newDaysBinary = daysList.join();
emit(state.copyWith(selectedDaysBinary: newDaysBinary));
BlocProvider.of<CreateSceneBloc>(
NavigationService.navigatorKey.currentState!.context)
.add(EffectiveTimePeriodEvent(EffectiveTime(
start: state.customStartTime ?? '00:00',
end: state.customEndTime ?? '23:59',
loops: newDaysBinary)));
}
void _onSetCustomTime(SetCustomTime event, Emitter<EffectPeriodState> emit) {
emit(state.copyWith(
customStartTime: event.startTime, customEndTime: event.endTime));
BlocProvider.of<CreateSceneBloc>(
NavigationService.navigatorKey.currentState!.context)
.add(EffectiveTimePeriodEvent(EffectiveTime(
start: event.startTime,
end: event.endTime,
loops: state.selectedDaysBinary)));
}
int _getDayIndex(String day) {
const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
return days.indexOf(day);
}
}
@@ -3,13 +3,13 @@ import 'package:syncrow_app/features/scene/enum/effective_period_options.dart';
class EffectPeriodState extends Equatable {
final EnumEffectivePeriodOptions selectedPeriod;
final List<String> selectedDays;
final String selectedDaysBinary;
final String? customStartTime;
final String? customEndTime;
const EffectPeriodState({
required this.selectedPeriod,
required this.selectedDays,
required this.selectedDaysBinary,
this.customStartTime,
this.customEndTime,
});
@@ -17,21 +17,21 @@ class EffectPeriodState extends Equatable {
factory EffectPeriodState.initial() {
return const EffectPeriodState(
selectedPeriod: EnumEffectivePeriodOptions.allDay,
selectedDays: [],
customStartTime: null,
customEndTime: null,
selectedDaysBinary: "1111111", // All days selected
customStartTime: "00:00",
customEndTime: "23:59",
);
}
EffectPeriodState copyWith({
EnumEffectivePeriodOptions? selectedPeriod,
List<String>? selectedDays,
String? selectedDaysBinary,
String? customStartTime,
String? customEndTime,
}) {
return EffectPeriodState(
selectedPeriod: selectedPeriod ?? this.selectedPeriod,
selectedDays: selectedDays ?? this.selectedDays,
selectedDaysBinary: selectedDaysBinary ?? this.selectedDaysBinary,
customStartTime: customStartTime ?? this.customStartTime,
customEndTime: customEndTime ?? this.customEndTime,
);
@@ -39,5 +39,5 @@ class EffectPeriodState extends Equatable {
@override
List<Object?> get props =>
[selectedPeriod, selectedDays, customStartTime, customEndTime];
[selectedPeriod, selectedDaysBinary, customStartTime, customEndTime];
}
@@ -87,16 +87,16 @@ class PresenceSensorHelperFunctions {
value: 'none',
description: 'None',
),
SceneOperationalValue(
icon: Assets.assetsPresence,
value: 'presence',
description: 'Presence',
),
SceneOperationalValue(
icon: Assets.assetsMotion,
value: 'motion',
description: 'Motion',
),
// SceneOperationalValue(
// icon: Assets.assetsPresence,
// value: 'presence',
// description: 'Presence',
// ),
// SceneOperationalValue(
// icon: Assets.assetsMotion,
// value: 'motion',
// description: 'Motion',
// ),
],
),
SceneStaticFunction(
@@ -46,7 +46,7 @@ mixin SceneLogicHelper {
unitUuid: HomeCubit.getInstance().selectedSpace!.id ?? '',
automationName: sceneName.text,
decisionExpr: sceneBloc.conditionRule,
effectiveTime:
effectiveTime: sceneBloc.effectiveTime ??
EffectiveTime(start: '00:00', end: '23:59', loops: '1111111'),
conditions: List.generate(
conditions.length,
@@ -60,8 +60,8 @@ class _AlertDialogSliderStepsState extends State<AlertDialogSliderSteps> {
}
double _normalizeValue(dynamic value) {
if (widget.taskItem.code == "temp_set" ||
widget.taskItem.code == "temp_current") {
if (((widget.taskItem.code == "temp_set" && value > 200) ||
widget.taskItem.code == "temp_current")) {
return (value) / 10;
}
return value.toDouble();
@@ -32,7 +32,8 @@ class RepeatDays extends StatelessWidget {
children: daysMap.entries.map((entry) {
final day = entry.key;
final abbreviation = entry.value;
final isSelected = state.selectedDays.contains(day);
final dayIndex = _getDayIndex(day);
final isSelected = state.selectedDaysBinary[dayIndex] == '1';
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 3.0),
child: GestureDetector(
@@ -70,4 +71,9 @@ class RepeatDays extends StatelessWidget {
],
);
}
int _getDayIndex(String day) {
const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
return days.indexOf(day);
}
}