yggdrasil/components/post/
post_cover.rs1use dioxus::prelude::*;
7
8#[component]
18pub fn PostCover(src: String, #[props(default)] post_id: Option<i32>) -> Element {
19 let ar_style = {
21 #[cfg_attr(not(feature = "server"), allow(unused_mut))]
22 let mut s = String::new();
23 #[cfg(feature = "server")]
24 {
25 if let Some(rel) = src
26 .strip_prefix("/uploads/")
27 .map(|p| p.split('?').next().unwrap_or(p))
28 {
29 if let Some((w, h)) = crate::api::image::get_image_dimensions(rel) {
30 s = format!("--ar:{} / {};", w, h);
32 }
33 }
34 }
35 s
36 };
37
38 let placeholder_src = if src.contains('?') {
40 format!("{}&w=20", src.split('?').next().unwrap_or(&src))
41 } else {
42 format!("{}?w=20", src)
43 };
44 let full_src = if src.contains('?') {
45 format!("{}&w=1200", src.split('?').next().unwrap_or(&src))
46 } else {
47 format!("{}?w=1200", src)
48 };
49
50 rsx! {
51 figure { class: "entry-cover",
52 "data-vt-post-id": post_id.map(|id| id.to_string()),
53 "data-vt-role": post_id.map(|_| "cover"),
54 span {
55 class: "blur-img entry-cover-blur lightbox-single",
56 style: "{ar_style}",
57 img {
58 class: "blur-img-placeholder",
59 src: "{placeholder_src}",
60 alt: "封面图片",
61 }
62 img {
63 class: "blur-img-full",
64 "data-src": "{full_src}",
65 alt: "封面图片",
66 }
67 }
68 }
69 }
70}