use std::time::Instant;
use crate::state::{AppState, InputMode, Step, TunnelPhase};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum UiOverlayState {
ConfirmStop,
Help,
Editing,
Normal,
}
pub(crate) fn overlay_state(state: &AppState) -> UiOverlayState {
if state.confirm_stop {
UiOverlayState::ConfirmStop
} else if state.show_help {
UiOverlayState::Help
} else if state.input_mode == InputMode::Editing {
UiOverlayState::Editing
} else {
UiOverlayState::Normal
}
}
pub(crate) fn handle_lifecycle_esc(state: &mut AppState) -> Step {
match state.phase {
TunnelPhase::Starting => {
if let Some(handle) = state.ctx.startup_handle.take() {
handle.abort();
}
state.phase = TunnelPhase::Idle;
state.active_mode = None;
state.quit_pressed_at = None;
state.add_log("已取消启动");
Step::Continue
}
TunnelPhase::Active => {
state.quit_pressed_at = None;
state.confirm_stop = true;
Step::Continue
}
TunnelPhase::Stopping => {
state.quit_pressed_at = None;
Step::Continue
}
TunnelPhase::Idle => {
let now = Instant::now();
if let Some(prev) = state.quit_pressed_at
&& now.duration_since(prev).as_secs() < 1
{
return Step::Exit;
}
state.quit_pressed_at = Some(now);
Step::Continue
}
}
}