import 'dart:async'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/routines/bloc/effective_period/effect_period_event.dart'; import 'package:syncrow_web/pages/routines/bloc/effective_period/effect_period_state.dart'; import 'package:syncrow_web/utils/constants/app_enum.dart'; class EffectPeriodBloc extends Bloc { final daysMap = { 'Sun': 'S', 'Mon': 'M', 'Tue': 'T', 'Wed': 'W', 'Thu': 'T', 'Fri': 'F', 'Sat': 'S', }; EffectPeriodBloc() : super(EffectPeriodState.initial()) { on(_initialEvent); on(_onSetPeriod); on(_onToggleDay); on(_onSetCustomTime); on(_onResetEffectivePeriod); on(_onResetDays); on(_setAllDays); } void _initialEvent(InitialEffectPeriodEvent event, Emitter emit) { add(SetCustomTime(event.effectiveTime.start, event.effectiveTime.end)); emit(state.copyWith( selectedDaysBinary: event.effectiveTime.loops, customStartTime: event.effectiveTime.start, customEndTime: event.effectiveTime.end, )); } void _onSetPeriod(SetPeriod event, Emitter 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; } emit(state.copyWith( selectedPeriod: event.period, customStartTime: startTime, customEndTime: endTime)); } void _onToggleDay(ToggleDay event, Emitter emit) { final daysList = state.selectedDaysBinary.split(''); final dayIndex = getDayIndex(event.day); if (daysList[dayIndex] == '1') { daysList[dayIndex] = '0'; } else { daysList[dayIndex] = '1'; } final newDaysBinary = daysList.join(); emit(state.copyWith(selectedDaysBinary: newDaysBinary)); } void _onSetCustomTime(SetCustomTime event, Emitter emit) { String startTime = event.startTime; String endTime = event.endTime; EnumEffectivePeriodOptions period; // Determine the period based on start and end times if (startTime == '00:00' && endTime == '23:59') { period = EnumEffectivePeriodOptions.allDay; } else if (startTime == '06:00' && endTime == '18:00') { period = EnumEffectivePeriodOptions.daytime; } else if (startTime == '18:00' && endTime == '06:00') { period = EnumEffectivePeriodOptions.night; } else { period = EnumEffectivePeriodOptions.custom; } emit( state.copyWith(customStartTime: startTime, customEndTime: endTime, selectedPeriod: period)); } void _onResetEffectivePeriod(ResetEffectivePeriod event, Emitter emit) { emit(state.copyWith( selectedPeriod: EnumEffectivePeriodOptions.allDay, customStartTime: '00:00', customEndTime: '23:59', selectedDaysBinary: '1111111')); } void _onResetDays(ResetDays event, Emitter emit) { emit(state.copyWith(selectedDaysBinary: '1111111')); } int getDayIndex(String day) { const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; return days.indexOf(day); } FutureOr _setAllDays(SetDays event, Emitter emit) { emit(state.copyWith(selectedDaysBinary: event.daysBinary)); } }