2025-09-12 13:52:35 -04:00
|
|
|
use std::collections::HashSet;
|
|
|
|
|
|
2025-09-08 10:01:02 -04:00
|
|
|
use dioxus::prelude::*;
|
|
|
|
|
|
2025-09-12 13:57:43 -04:00
|
|
|
use crate::components::{BlogList, TagSelector};
|
2025-09-08 18:39:30 -04:00
|
|
|
use crate::page::Page;
|
2025-09-08 10:01:02 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const BLOG_CSS: Asset = asset!("/assets/css/blog.css");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-09-12 13:52:35 -04:00
|
|
|
fn convert_categories(categories: &str) -> HashSet<String>
|
|
|
|
|
{
|
|
|
|
|
if categories.is_empty() || categories == "all"
|
|
|
|
|
{
|
|
|
|
|
HashSet::new()
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
categories.split('+').map(|s| s.to_string()).collect()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-09-08 10:01:02 -04:00
|
|
|
/// Blog page
|
|
|
|
|
#[component]
|
|
|
|
|
pub fn Blog(tag: String) -> Element
|
|
|
|
|
{
|
2025-09-12 13:52:35 -04:00
|
|
|
let mut categories: Signal<HashSet<String>> =
|
|
|
|
|
use_signal(|| convert_categories(&tag));
|
2025-09-08 10:01:02 -04:00
|
|
|
|
2025-09-12 13:52:35 -04:00
|
|
|
if *categories.read() != convert_categories(&tag)
|
2025-09-08 10:01:02 -04:00
|
|
|
{
|
2025-09-12 13:52:35 -04:00
|
|
|
categories.set(convert_categories(&tag));
|
2025-09-08 10:01:02 -04:00
|
|
|
}
|
|
|
|
|
|
2025-09-08 18:39:30 -04:00
|
|
|
rsx! {
|
2025-09-08 10:01:02 -04:00
|
|
|
document::Stylesheet { href: BLOG_CSS }
|
|
|
|
|
|
|
|
|
|
main
|
|
|
|
|
{
|
|
|
|
|
class: "blog_style",
|
|
|
|
|
div
|
|
|
|
|
{
|
|
|
|
|
class: "page_content",
|
2025-09-12 13:52:35 -04:00
|
|
|
|
2025-09-08 10:01:02 -04:00
|
|
|
BlogList
|
|
|
|
|
{
|
|
|
|
|
tags: categories
|
|
|
|
|
}
|
2025-09-12 13:57:43 -04:00
|
|
|
|
|
|
|
|
TagSelector
|
|
|
|
|
{
|
|
|
|
|
toggled_tags: categories
|
|
|
|
|
}
|
2025-09-08 10:01:02 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|