Some checks failed
Build and Push Docker Image / docker (push) Failing after 1m7s
Moved event fetching logic from CalendarView to Calendar component to properly use the visible date range instead of hardcoded current month. The Calendar component already tracks the current visible date through navigation, so events now load correctly for August and other months when navigating. Changes: - Calendar component now manages its own events state and fetching - Event fetching responds to current_date changes from navigation - CalendarView simplified to just render Calendar component - Fixed cargo fmt/clippy formatting across codebase 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
152 lines
5.4 KiB
Rust
152 lines
5.4 KiB
Rust
use crate::components::{Login, ViewMode};
|
|
use crate::models::ical::VEvent;
|
|
use crate::services::calendar_service::UserInfo;
|
|
use yew::prelude::*;
|
|
use yew_router::prelude::*;
|
|
|
|
#[derive(Clone, Routable, PartialEq)]
|
|
pub enum Route {
|
|
#[at("/")]
|
|
Home,
|
|
#[at("/login")]
|
|
Login,
|
|
#[at("/calendar")]
|
|
Calendar,
|
|
}
|
|
|
|
#[derive(Properties, PartialEq)]
|
|
pub struct RouteHandlerProps {
|
|
pub auth_token: Option<String>,
|
|
pub user_info: Option<UserInfo>,
|
|
pub on_login: Callback<String>,
|
|
#[prop_or_default]
|
|
pub on_event_context_menu: Option<Callback<(web_sys::MouseEvent, VEvent)>>,
|
|
#[prop_or_default]
|
|
pub on_calendar_context_menu: Option<Callback<(web_sys::MouseEvent, chrono::NaiveDate)>>,
|
|
#[prop_or_default]
|
|
pub view: ViewMode,
|
|
#[prop_or_default]
|
|
pub on_create_event_request: Option<Callback<crate::components::EventCreationData>>,
|
|
#[prop_or_default]
|
|
pub on_event_update_request: Option<
|
|
Callback<(
|
|
VEvent,
|
|
chrono::NaiveDateTime,
|
|
chrono::NaiveDateTime,
|
|
bool,
|
|
Option<chrono::DateTime<chrono::Utc>>,
|
|
Option<String>,
|
|
Option<String>,
|
|
)>,
|
|
>,
|
|
#[prop_or_default]
|
|
pub context_menus_open: bool,
|
|
}
|
|
|
|
#[function_component(RouteHandler)]
|
|
pub fn route_handler(props: &RouteHandlerProps) -> Html {
|
|
let auth_token = props.auth_token.clone();
|
|
let user_info = props.user_info.clone();
|
|
let on_login = props.on_login.clone();
|
|
let on_event_context_menu = props.on_event_context_menu.clone();
|
|
let on_calendar_context_menu = props.on_calendar_context_menu.clone();
|
|
let view = props.view.clone();
|
|
let on_create_event_request = props.on_create_event_request.clone();
|
|
let on_event_update_request = props.on_event_update_request.clone();
|
|
let context_menus_open = props.context_menus_open;
|
|
|
|
html! {
|
|
<Switch<Route> render={move |route| {
|
|
let auth_token = auth_token.clone();
|
|
let user_info = user_info.clone();
|
|
let on_login = on_login.clone();
|
|
let on_event_context_menu = on_event_context_menu.clone();
|
|
let on_calendar_context_menu = on_calendar_context_menu.clone();
|
|
let view = view.clone();
|
|
let on_create_event_request = on_create_event_request.clone();
|
|
let on_event_update_request = on_event_update_request.clone();
|
|
let context_menus_open = context_menus_open;
|
|
|
|
match route {
|
|
Route::Home => {
|
|
if auth_token.is_some() {
|
|
html! { <Redirect<Route> to={Route::Calendar}/> }
|
|
} else {
|
|
html! { <Redirect<Route> to={Route::Login}/> }
|
|
}
|
|
}
|
|
Route::Login => {
|
|
if auth_token.is_some() {
|
|
html! { <Redirect<Route> to={Route::Calendar}/> }
|
|
} else {
|
|
html! { <Login {on_login} /> }
|
|
}
|
|
}
|
|
Route::Calendar => {
|
|
if auth_token.is_some() {
|
|
html! {
|
|
<CalendarView
|
|
user_info={user_info}
|
|
on_event_context_menu={on_event_context_menu}
|
|
on_calendar_context_menu={on_calendar_context_menu}
|
|
view={view}
|
|
on_create_event_request={on_create_event_request}
|
|
on_event_update_request={on_event_update_request}
|
|
context_menus_open={context_menus_open}
|
|
/>
|
|
}
|
|
} else {
|
|
html! { <Redirect<Route> to={Route::Login}/> }
|
|
}
|
|
}
|
|
}
|
|
}} />
|
|
}
|
|
}
|
|
|
|
#[derive(Properties, PartialEq)]
|
|
pub struct CalendarViewProps {
|
|
pub user_info: Option<UserInfo>,
|
|
#[prop_or_default]
|
|
pub on_event_context_menu: Option<Callback<(web_sys::MouseEvent, VEvent)>>,
|
|
#[prop_or_default]
|
|
pub on_calendar_context_menu: Option<Callback<(web_sys::MouseEvent, chrono::NaiveDate)>>,
|
|
#[prop_or_default]
|
|
pub view: ViewMode,
|
|
#[prop_or_default]
|
|
pub on_create_event_request: Option<Callback<crate::components::EventCreationData>>,
|
|
#[prop_or_default]
|
|
pub on_event_update_request: Option<
|
|
Callback<(
|
|
VEvent,
|
|
chrono::NaiveDateTime,
|
|
chrono::NaiveDateTime,
|
|
bool,
|
|
Option<chrono::DateTime<chrono::Utc>>,
|
|
Option<String>,
|
|
Option<String>,
|
|
)>,
|
|
>,
|
|
#[prop_or_default]
|
|
pub context_menus_open: bool,
|
|
}
|
|
|
|
use crate::components::Calendar;
|
|
|
|
#[function_component(CalendarView)]
|
|
pub fn calendar_view(props: &CalendarViewProps) -> Html {
|
|
html! {
|
|
<div class="calendar-view">
|
|
<Calendar
|
|
user_info={props.user_info.clone()}
|
|
on_event_context_menu={props.on_event_context_menu.clone()}
|
|
on_calendar_context_menu={props.on_calendar_context_menu.clone()}
|
|
view={props.view.clone()}
|
|
on_create_event_request={props.on_create_event_request.clone()}
|
|
on_event_update_request={props.on_event_update_request.clone()}
|
|
context_menus_open={props.context_menus_open}
|
|
/>
|
|
</div>
|
|
}
|
|
}
|