mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2026-10-23 09:27:56 +00:00
finished time period
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user