use yew::prelude::*;
use yew_router::prelude::*;
use crate::pages::{
analytics::AnalyticsPage,
dashboard::DashboardPage,
skills::SkillsPage,
skill_detail::SkillDetailPage,
run::RunPage,
history::HistoryPage,
settings::SettingsPage,
search_test::SearchTestPage,
onboarding::OnboardingPage,
not_found::NotFoundPage,
};
#[derive(Clone, Routable, PartialEq, Debug)]
pub enum Route {
#[at("/")]
Dashboard,
#[at("/skills")]
Skills,
#[at("/skills/:name")]
SkillDetail { name: String },
#[at("/skills/:name/instances/:instance")]
SkillInstance { name: String, instance: String },
#[at("/run")]
Run,
#[at("/run/:skill")]
RunSkill { skill: String },
#[at("/run/:skill/:tool")]
RunSkillTool { skill: String, tool: String },
#[at("/history")]
History,
#[at("/history/:id")]
HistoryDetail { id: String },
#[at("/settings")]
Settings,
#[at("/search-test")]
SearchTest,
#[at("/analytics")]
Analytics,
#[at("/onboarding")]
Onboarding,
#[at("/onboarding/:step")]
OnboardingStep { step: String },
#[not_found]
#[at("/404")]
NotFound,
}
pub fn switch(route: Route) -> Html {
match route {
Route::Dashboard => html! { <DashboardPage /> },
Route::Skills => html! { <SkillsPage /> },
Route::SkillDetail { name } => html! { <SkillDetailPage {name} /> },
Route::SkillInstance { name, instance } => html! {
<SkillDetailPage {name} selected_instance={Some(instance)} />
},
Route::Run => html! { <RunPage /> },
Route::RunSkill { skill } => html! { <RunPage selected_skill={Some(skill)} /> },
Route::RunSkillTool { skill, tool } => html! {
<RunPage selected_skill={Some(skill)} selected_tool={Some(tool)} />
},
Route::History => html! { <HistoryPage /> },
Route::HistoryDetail { id } => html! { <HistoryPage selected_id={Some(id)} /> },
Route::Settings => html! { <SettingsPage /> },
Route::SearchTest => html! { <SearchTestPage /> },
Route::Analytics => html! { <AnalyticsPage /> },
Route::Onboarding => html! { <OnboardingPage /> },
Route::OnboardingStep { step } => html! { <OnboardingPage {step} /> },
Route::NotFound => html! { <NotFoundPage /> },
}
}
impl Route {
pub fn display_name(&self) -> &'static str {
match self {
Route::Dashboard => "Dashboard",
Route::Skills => "Skills",
Route::SkillDetail { .. } => "Skill Details",
Route::SkillInstance { .. } => "Instance Configuration",
Route::Run | Route::RunSkill { .. } | Route::RunSkillTool { .. } => "Run",
Route::History | Route::HistoryDetail { .. } => "History",
Route::Settings => "Settings",
Route::SearchTest => "Search Test",
Route::Analytics => "Analytics",
Route::Onboarding | Route::OnboardingStep { .. } => "Setup",
Route::NotFound => "Not Found",
}
}
pub fn show_sidebar(&self) -> bool {
!matches!(self, Route::Onboarding | Route::OnboardingStep { .. })
}
}