use leptos::*; use leptos_router::*; use crate::app::{ models::{Post, PostMetadata}, components::{ Loading, Nav, ReadingTime, DateTime } }; #[server] pub async fn get_posts( tag: Option ) -> Result, ServerFnError> { leptos_actix::extract( |data: actix_web::web::Data| async move { let data = data.into_inner(); let default = vec![]; let posts = match tag { Some(tag) => data.posts_by_tag.get(&tag).unwrap_or(&default), None => &data.posts }; posts.iter() .map(|post| { Post { metadata: post.metadata.clone(), content: post.content.clone(), } }) .collect::, >() }, ).await } #[server] pub async fn get_post( slug: String ) -> Result { leptos_actix::extract( |data: actix_web::web::Data| async move { let data = data.into_inner(); data.posts_by_slug.get(&slug) .and_then(|post| Some(Post { metadata: post.metadata.clone(), content: post.content.clone(), })) }, ) .await .and_then(|post| post.ok_or_else(|| ServerFnError::ServerError("Post not found".to_string()))) } #[component] pub fn PostHeader( metadata: PostMetadata, full_element: bool ) -> impl IntoView { let class = if full_element { "metadata border-b-2 pb-5" } else { "metadata" }; let title = if full_element { view! { <>{metadata.title.clone()} }.into_view() } else { view! { {metadata.title.clone()} } }; view! {

{title}

{metadata.description.clone()}

} } #[component] pub fn PostTags( tags: Vec ) -> impl IntoView { view! {
{ tags.into_iter().map(|tag| view! { {tag}}).collect_view() }
} } #[component] pub fn PostListCard( post: Post ) -> impl IntoView { view! {
format!("Image { if post.metadata.draft { Some(view!{
}) } else { None } }
} } #[component] pub fn PostList() -> impl IntoView { let query = use_query_map(); let tag = move || query.with(|query| query.get("tag").cloned()); let posts = create_resource(move || tag(), move |_| get_posts(tag())); let posts_view = move || { posts.and_then(|posts| { posts.iter() .map(|post| view! { }) .collect_view() }) }; let filter_view = move || { tag().and_then(|tag| Some(view! {
Tag sélectionné : {tag}
})) }; view! { }>