mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-11-26 20:44:54 +00:00
Add countdown functionality and device type support across device management views
This commit is contained in:
@ -47,7 +47,7 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
final success = await RemoteControlDeviceService().controlDevice(
|
||||
deviceUuid: deviceId,
|
||||
status: Status(
|
||||
code: 'countdown_1',
|
||||
code: event.countdownCode,
|
||||
value: 0,
|
||||
),
|
||||
);
|
||||
@ -80,15 +80,18 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
) {
|
||||
if (state is ScheduleLoaded) {
|
||||
final currentState = state as ScheduleLoaded;
|
||||
|
||||
emit(currentState.copyWith(
|
||||
countdownSeconds: currentState.countdownSeconds,
|
||||
selectedTime: currentState.selectedTime,
|
||||
deviceId: deviceId,
|
||||
scheduleMode: event.scheduleMode,
|
||||
countdownRemaining: Duration.zero,
|
||||
countdownHours: 0,
|
||||
countdownMinutes: 0,
|
||||
inchingHours: 0,
|
||||
inchingMinutes: 0,
|
||||
isCountdownActive: false,
|
||||
countdownHours: currentState.countdownHours,
|
||||
countdownMinutes: currentState.countdownMinutes,
|
||||
inchingHours: currentState.inchingHours,
|
||||
inchingMinutes: currentState.inchingMinutes,
|
||||
isInchingActive: false,
|
||||
isCountdownActive: currentState.countdownRemaining > Duration.zero,
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -221,7 +224,6 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
deviceId,
|
||||
event.category,
|
||||
);
|
||||
|
||||
if (state is ScheduleLoaded) {
|
||||
final currentState = state as ScheduleLoaded;
|
||||
emit(currentState.copyWith(
|
||||
@ -285,12 +287,22 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
) async {
|
||||
try {
|
||||
if (state is ScheduleLoaded) {
|
||||
Status status = Status(code: '', value: '');
|
||||
if (event.deviceType == 'CUR_2') {
|
||||
status = status.copyWith(
|
||||
code: 'control',
|
||||
value: event.functionOn == true ? 'open' : 'close');
|
||||
} else {
|
||||
status =
|
||||
status.copyWith(code: event.category, value: event.functionOn);
|
||||
}
|
||||
|
||||
final dateTime = DateTime.parse(event.time);
|
||||
final updatedSchedule = ScheduleEntry(
|
||||
scheduleId: event.scheduleId,
|
||||
category: event.category,
|
||||
time: getTimeStampWithoutSeconds(dateTime).toString(),
|
||||
function: Status(code: event.category, value: event.functionOn),
|
||||
function: status,
|
||||
days: event.selectedDays,
|
||||
);
|
||||
final success = await DevicesManagementApi().editScheduleRecord(
|
||||
@ -396,7 +408,7 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
final totalSeconds =
|
||||
Duration(hours: event.hours, minutes: event.minutes).inSeconds;
|
||||
final code = event.mode == ScheduleModes.countdown
|
||||
? 'countdown_1'
|
||||
? event.countDownCode
|
||||
: 'switch_inching';
|
||||
final currentState = state as ScheduleLoaded;
|
||||
final duration = Duration(seconds: totalSeconds);
|
||||
@ -423,7 +435,7 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
);
|
||||
|
||||
if (success) {
|
||||
if (code == 'countdown_1') {
|
||||
if (code == event.countDownCode) {
|
||||
final countdownDuration = Duration(seconds: totalSeconds);
|
||||
|
||||
emit(
|
||||
@ -437,7 +449,7 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
);
|
||||
|
||||
if (countdownDuration.inSeconds > 0) {
|
||||
_startCountdownTimer(emit, countdownDuration);
|
||||
_startCountdownTimer(emit, countdownDuration, event.countDownCode);
|
||||
} else {
|
||||
_countdownTimer?.cancel();
|
||||
emit(
|
||||
@ -467,9 +479,7 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
}
|
||||
|
||||
void _startCountdownTimer(
|
||||
Emitter<ScheduleState> emit,
|
||||
Duration duration,
|
||||
) {
|
||||
Emitter<ScheduleState> emit, Duration duration, String countdownCode) {
|
||||
_countdownTimer?.cancel();
|
||||
_countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
||||
if (_currentCountdown != null && _currentCountdown! > Duration.zero) {
|
||||
@ -479,6 +489,7 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
} else {
|
||||
timer.cancel();
|
||||
add(StopScheduleEvent(
|
||||
countdownCode: countdownCode,
|
||||
mode: _currentCountdown == null
|
||||
? ScheduleModes.countdown
|
||||
: ScheduleModes.inching,
|
||||
@ -515,70 +526,75 @@ class ScheduleBloc extends Bloc<ScheduleEvent, ScheduleState> {
|
||||
try {
|
||||
final status =
|
||||
await DevicesManagementApi().getDeviceStatus(event.deviceId);
|
||||
print(status.status);
|
||||
int totalSeconds = 0;
|
||||
final countdownItem = status.status.firstWhere(
|
||||
(item) => item.code == event.countdownCode,
|
||||
orElse: () => Status(code: '', value: 0),
|
||||
);
|
||||
totalSeconds = (countdownItem.value as int?) ?? 0;
|
||||
final countdownHours = totalSeconds ~/ 3600;
|
||||
final countdownMinutes = (totalSeconds % 3600) ~/ 60;
|
||||
final countdownSeconds = totalSeconds % 60;
|
||||
|
||||
final deviceStatus =
|
||||
WaterHeaterStatusModel.fromJson(event.deviceId, status.status);
|
||||
final isCountdownActive = totalSeconds > 0;
|
||||
final isInchingActive = !isCountdownActive &&
|
||||
(deviceStatus.inchingHours > 0 || deviceStatus.inchingMinutes > 0);
|
||||
|
||||
final scheduleMode =
|
||||
deviceStatus.countdownHours > 0 || deviceStatus.countdownMinutes > 0
|
||||
? ScheduleModes.countdown
|
||||
: deviceStatus.inchingHours > 0 || deviceStatus.inchingMinutes > 0
|
||||
? ScheduleModes.inching
|
||||
: ScheduleModes.schedule;
|
||||
final isCountdown = scheduleMode == ScheduleModes.countdown;
|
||||
final isInching = scheduleMode == ScheduleModes.inching;
|
||||
final newState = state is ScheduleLoaded
|
||||
? (state as ScheduleLoaded).copyWith(
|
||||
scheduleMode: ScheduleModes.schedule,
|
||||
countdownHours: countdownHours,
|
||||
countdownMinutes: countdownMinutes,
|
||||
countdownSeconds: countdownSeconds,
|
||||
inchingHours: deviceStatus.inchingHours,
|
||||
inchingMinutes: deviceStatus.inchingMinutes,
|
||||
isCountdownActive: isCountdownActive,
|
||||
isInchingActive: isInchingActive,
|
||||
countdownRemaining: isCountdownActive
|
||||
? Duration(seconds: totalSeconds)
|
||||
: Duration.zero,
|
||||
)
|
||||
: ScheduleLoaded(
|
||||
scheduleMode: ScheduleModes.schedule,
|
||||
schedules: const [],
|
||||
selectedTime: null,
|
||||
selectedDays: List.filled(7, false),
|
||||
functionOn: false,
|
||||
isEditing: false,
|
||||
deviceId: event.deviceId,
|
||||
countdownHours: countdownHours,
|
||||
countdownMinutes: countdownMinutes,
|
||||
countdownSeconds: countdownSeconds,
|
||||
inchingHours: deviceStatus.inchingHours,
|
||||
inchingMinutes: deviceStatus.inchingMinutes,
|
||||
isCountdownActive: isCountdownActive,
|
||||
isInchingActive: isInchingActive,
|
||||
countdownRemaining: isCountdownActive
|
||||
? Duration(seconds: totalSeconds)
|
||||
: Duration.zero,
|
||||
);
|
||||
emit(newState);
|
||||
|
||||
Duration? countdownRemaining;
|
||||
var isCountdownActive = false;
|
||||
var isInchingActive = false;
|
||||
if (isCountdownActive) {
|
||||
_countdownTimer?.cancel();
|
||||
_currentCountdown = Duration(seconds: totalSeconds);
|
||||
countdownRemaining = _currentCountdown!;
|
||||
|
||||
if (isCountdown) {
|
||||
countdownRemaining = Duration(
|
||||
hours: deviceStatus.countdownHours,
|
||||
minutes: deviceStatus.countdownMinutes,
|
||||
);
|
||||
isCountdownActive = countdownRemaining > Duration.zero;
|
||||
} else if (isInching) {
|
||||
isInchingActive = Duration(
|
||||
hours: deviceStatus.inchingHours,
|
||||
minutes: deviceStatus.inchingMinutes,
|
||||
) >
|
||||
Duration.zero;
|
||||
}
|
||||
if (state is ScheduleLoaded) {
|
||||
final currentState = state as ScheduleLoaded;
|
||||
emit(currentState.copyWith(
|
||||
scheduleMode: scheduleMode,
|
||||
countdownHours: deviceStatus.countdownHours,
|
||||
countdownMinutes: deviceStatus.countdownMinutes,
|
||||
inchingHours: deviceStatus.inchingHours,
|
||||
inchingMinutes: deviceStatus.inchingMinutes,
|
||||
isCountdownActive: isCountdownActive,
|
||||
isInchingActive: isInchingActive,
|
||||
countdownRemaining: countdownRemaining ?? Duration.zero,
|
||||
));
|
||||
if (totalSeconds > 0) {
|
||||
_startCountdownTimer(
|
||||
emit, Duration(seconds: totalSeconds), event.countdownCode);
|
||||
} else {
|
||||
add(StopScheduleEvent(
|
||||
countdownCode: event.countdownCode,
|
||||
mode: ScheduleModes.countdown,
|
||||
deviceId: event.deviceId,
|
||||
));
|
||||
}
|
||||
} else {
|
||||
emit(ScheduleLoaded(
|
||||
schedules: const [],
|
||||
selectedTime: null,
|
||||
selectedDays: List.filled(7, false),
|
||||
functionOn: false,
|
||||
isEditing: false,
|
||||
deviceId: deviceId,
|
||||
scheduleMode: scheduleMode,
|
||||
countdownHours: deviceStatus.countdownHours,
|
||||
countdownMinutes: deviceStatus.countdownMinutes,
|
||||
inchingHours: deviceStatus.inchingHours,
|
||||
inchingMinutes: deviceStatus.inchingMinutes,
|
||||
isCountdownActive: isCountdownActive,
|
||||
isInchingActive: isInchingActive,
|
||||
countdownRemaining: countdownRemaining ?? Duration.zero,
|
||||
));
|
||||
_countdownTimer?.cancel();
|
||||
}
|
||||
|
||||
// if (isCountdownActive && countdownRemaining != null) {
|
||||
// _startCountdownTimer(emit, countdownRemaining);
|
||||
// }
|
||||
} catch (e) {
|
||||
emit(ScheduleError('Failed to fetch device status: $e'));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user