use yew::prelude::*; use yew_router::prelude::*; use gloo_storage::{LocalStorage, Storage}; use crate::components::{Login, Register, Calendar}; use crate::services::{CalendarService, CalendarEvent}; use std::collections::HashMap; use chrono::{Local, NaiveDate, Datelike}; #[derive(Clone, Routable, PartialEq)] enum Route { #[at("/")] Home, #[at("/login")] Login, #[at("/register")] Register, #[at("/calendar")] Calendar, } #[function_component] pub fn App() -> Html { let auth_token = use_state(|| -> Option { LocalStorage::get("auth_token").ok() }); let on_login = { let auth_token = auth_token.clone(); Callback::from(move |token: String| { auth_token.set(Some(token)); }) }; let on_logout = { let auth_token = auth_token.clone(); Callback::from(move |_| { let _ = LocalStorage::delete("auth_token"); auth_token.set(None); }) }; html! {

{"Calendar App"}

{ if auth_token.is_some() { html! { } } else { html! { } } }
render={move |route| { let auth_token = (*auth_token).clone(); let on_login = on_login.clone(); match route { Route::Home => { if auth_token.is_some() { html! { to={Route::Calendar}/> } } else { html! { to={Route::Login}/> } } } Route::Login => { if auth_token.is_some() { html! { to={Route::Calendar}/> } } else { html! { } } } Route::Register => { if auth_token.is_some() { html! { to={Route::Calendar}/> } } else { html! { } } } Route::Calendar => { if auth_token.is_some() { html! { } } else { html! { to={Route::Login}/> } } } } }} />
} } #[function_component] fn CalendarView() -> Html { let events = use_state(|| HashMap::>::new()); let loading = use_state(|| true); let error = use_state(|| None::); // Get current auth token let auth_token: Option = LocalStorage::get("auth_token").ok(); let today = Local::now().date_naive(); let current_year = today.year(); let current_month = today.month(); // Fetch events when component mounts { let events = events.clone(); let loading = loading.clone(); let error = error.clone(); let auth_token = auth_token.clone(); use_effect_with((), move |_| { if let Some(token) = auth_token { let events = events.clone(); let loading = loading.clone(); let error = error.clone(); wasm_bindgen_futures::spawn_local(async move { let calendar_service = CalendarService::new(); match calendar_service.fetch_events_for_month(&token, current_year, current_month).await { Ok(calendar_events) => { let grouped_events = CalendarService::group_events_by_date(calendar_events); events.set(grouped_events); loading.set(false); } Err(err) => { error.set(Some(format!("Failed to load events: {}", err))); loading.set(false); } } }); } else { loading.set(false); error.set(Some("No authentication token found".to_string())); } || () }); } html! {
{ if *loading { html! {

{"Loading calendar events..."}

} } else if let Some(err) = (*error).clone() { html! {

{format!("Error: {}", err)}

} } else { html! { } } }
} }