use std::rc::Rc; use yew::prelude::*; use yew_router::prelude::*; use crate::Route; use crate::pages::blog::content; use crate::pages::blog::content::BlogEntry; #[derive(Clone, Debug, Eq, PartialEq, Properties)] pub struct Props { pub seed: u8, } #[derive(PartialEq, Eq, Debug)] pub struct PostState { pub inner: content::Post, } impl Reducible for PostState { type Action = u8; fn reduce(self: Rc, action: u8) -> Rc { Self { inner: content::Post::from_seed(action.into()), }.into() } } #[function_component] pub fn Entry(props: &Props) -> Html { let seed = props.seed; let post = use_reducer(|| PostState { inner: content::Post::from_seed(seed.into()), }); { let post_dispatcher = post.dispatcher(); use_effect_with(seed, move |seed| { post_dispatcher.dispatch(*seed); || {} }); } let post = &post.inner; let render_quote = |quote: &content::Quote| { html! {

The author's profile

classes={classes!("is-size-5")} to={Route::Author { id: quote.author.seed }}> { "e.author.name } >

{ "e.content }

} }; let render_section_hero = |section: &content::Section| { html! {
This section's image

{ §ion.title }

} }; let render_section = |section, show_hero| { let hero = if show_hero { render_section_hero(section) } else { html! {} }; let paragraphs = section.paragraphs.iter().map(|paragraph| { html! {

{ paragraph }

} }); html! {
{ hero }
{ for paragraphs }
} }; let view_content = { // don't show hero for the first section let mut show_hero = false; let parts = post.content.iter().map(|part| match part { content::PostPart::Section(section) => { let html = render_section(section, show_hero); // show hero between sections show_hero = true; html } content::PostPart::Quote(quote) => { // don't show hero after a quote show_hero = false; render_quote("e) } }); html! {{for parts}} }; let keywords = post .meta .keywords .iter() .map(|keyword| html! { { keyword } }); html! { <>
The hero's background

{ &post.meta.title }

{ "by " } classes={classes!("has-text-weight-semibold")} to={Route::Author { id: post.meta.author.seed }}> { &post.meta.author.name } >

{ for keywords }
{ view_content }
} }