use super::types::*;
use super::wizard::OnboardingWizard;
impl OnboardingWizard {
pub fn next_step(&mut self) {
self.error_message = None;
self.focused_field = 0;
if self.quick_jump {
self.quick_jump_done = true;
return;
}
match self.step {
OnboardingStep::ModeSelect => {
self.step = OnboardingStep::Workspace;
}
OnboardingStep::Workspace => {
if let Err(e) = self.ensure_config_files() {
self.error_message = Some(format!("Failed to create config files: {}", e));
return;
}
self.step = OnboardingStep::ProviderAuth;
self.auth_field = AuthField::Provider;
self.ps.detect_existing_key();
}
OnboardingStep::ProviderAuth => {
if self.ps.api_key_input.is_empty() && !self.ps.is_custom() && !self.ps.is_cli() {
self.error_message = Some("API key is required".to_string());
return;
}
if self.ps.is_custom()
&& (self.ps.base_url.is_empty()
|| self.ps.custom_model.is_empty()
|| self.ps.custom_name.is_empty())
{
self.error_message = Some(
"Base URL, model name, and provider name are required for custom provider"
.to_string(),
);
return;
}
if self.mode == WizardMode::QuickStart {
self.step = OnboardingStep::Daemon;
} else {
tracing::debug!("[next_step] ProviderAuth → Channels");
self.step = OnboardingStep::Channels;
self.focused_field = 0;
}
}
OnboardingStep::Channels => {
self.step = OnboardingStep::VoiceSetup;
self.voice_field = VoiceField::SttModeSelect;
self.detect_existing_groq_key();
}
OnboardingStep::TelegramSetup
| OnboardingStep::DiscordSetup
| OnboardingStep::WhatsAppSetup
| OnboardingStep::SlackSetup
| OnboardingStep::TrelloSetup => {
self.step = OnboardingStep::Channels;
}
OnboardingStep::VoiceSetup => {
self.step = OnboardingStep::ImageSetup;
self.image_field = ImageField::VisionToggle;
self.detect_existing_image_key();
}
OnboardingStep::ImageSetup => {
self.step = OnboardingStep::Daemon;
}
OnboardingStep::Daemon => {
self.step = OnboardingStep::HealthCheck;
self.start_health_check();
}
OnboardingStep::HealthCheck => {
self.step = OnboardingStep::BrainSetup;
self.brain_field = BrainField::AboutMe;
}
OnboardingStep::BrainSetup => {
if self.brain_generated || self.brain_error.is_some() {
self.step = OnboardingStep::Complete;
}
}
OnboardingStep::Complete => {
}
}
}
pub fn prev_step(&mut self) -> bool {
self.error_message = None;
self.focused_field = 0;
match self.step {
OnboardingStep::ModeSelect => {
return true;
}
OnboardingStep::Workspace => {
self.step = OnboardingStep::ModeSelect;
}
OnboardingStep::ProviderAuth => {
self.step = OnboardingStep::Workspace;
}
OnboardingStep::Channels => {
self.step = OnboardingStep::ProviderAuth;
self.auth_field = AuthField::Provider;
}
OnboardingStep::TelegramSetup => {
self.step = OnboardingStep::Channels;
}
OnboardingStep::DiscordSetup
| OnboardingStep::WhatsAppSetup
| OnboardingStep::SlackSetup
| OnboardingStep::TrelloSetup => {
self.step = OnboardingStep::Channels;
}
OnboardingStep::VoiceSetup => {
self.step = OnboardingStep::Channels;
}
OnboardingStep::ImageSetup => {
self.step = OnboardingStep::VoiceSetup;
self.voice_field = VoiceField::SttModeSelect;
}
OnboardingStep::Daemon => {
if self.mode == WizardMode::QuickStart {
self.step = OnboardingStep::ProviderAuth;
self.auth_field = AuthField::Provider;
} else {
self.step = OnboardingStep::ImageSetup;
self.image_field = ImageField::VisionToggle;
}
}
OnboardingStep::HealthCheck => {
self.step = OnboardingStep::Daemon;
}
OnboardingStep::BrainSetup => {
self.step = OnboardingStep::HealthCheck;
self.brain_generating = false;
self.brain_error = None;
}
OnboardingStep::Complete => {
self.step = OnboardingStep::BrainSetup;
self.brain_field = BrainField::AboutMe;
}
}
false
}
}