use yew::prelude::*; use yew_router::prelude::*; use web_sys::HtmlSelectElement; use crate::services::calendar_service::UserInfo; use crate::components::CalendarListItem; #[derive(Clone, Routable, PartialEq)] pub enum Route { #[at("/")] Home, #[at("/login")] Login, #[at("/calendar")] Calendar, } #[derive(Clone, PartialEq)] pub enum ViewMode { Month, Week, } #[derive(Clone, PartialEq)] pub enum Theme { Default, Ocean, Forest, Sunset, Purple, Dark, Rose, Mint, } impl Theme { pub fn value(&self) -> &'static str { match self { Theme::Default => "default", Theme::Ocean => "ocean", Theme::Forest => "forest", Theme::Sunset => "sunset", Theme::Purple => "purple", Theme::Dark => "dark", Theme::Rose => "rose", Theme::Mint => "mint", } } pub fn from_value(value: &str) -> Self { match value { "ocean" => Theme::Ocean, "forest" => Theme::Forest, "sunset" => Theme::Sunset, "purple" => Theme::Purple, "dark" => Theme::Dark, "rose" => Theme::Rose, "mint" => Theme::Mint, _ => Theme::Default, } } } impl Default for ViewMode { fn default() -> Self { ViewMode::Month } } #[derive(Properties, PartialEq)] pub struct SidebarProps { pub user_info: Option, pub on_logout: Callback<()>, pub on_create_calendar: Callback<()>, pub color_picker_open: Option, pub on_color_change: Callback<(String, String)>, pub on_color_picker_toggle: Callback, pub available_colors: Vec, pub on_calendar_context_menu: Callback<(MouseEvent, String)>, pub current_view: ViewMode, pub on_view_change: Callback, pub current_theme: Theme, pub on_theme_change: Callback, } #[function_component(Sidebar)] pub fn sidebar(props: &SidebarProps) -> Html { let on_view_change = { let on_view_change = props.on_view_change.clone(); Callback::from(move |e: Event| { let target = e.target_dyn_into::(); if let Some(select) = target { let value = select.value(); let new_view = match value.as_str() { "week" => ViewMode::Week, _ => ViewMode::Month, }; on_view_change.emit(new_view); } }) }; let on_theme_change = { let on_theme_change = props.on_theme_change.clone(); Callback::from(move |e: Event| { let target = e.target_dyn_into::(); if let Some(select) = target { let value = select.value(); let new_theme = Theme::from_value(&value); on_theme_change.emit(new_theme); } }) }; html! { } }