use leptos::*; use crate::{prelude::*, URL_SENSITIVE}; use apb::{field::OptionalString, Document, Object}; #[component] pub fn Attachment( object: serde_json::Value, #[prop(optional)] sensitive: bool ) -> impl IntoView { let config = use_context::>().expect("missing config context"); let (expand, set_expand) = create_signal(false); let href = object.url().id().str().unwrap_or_default(); let media_type = object.media_type() .unwrap_or("link") // TODO make it an Option rather than defaulting to link everywhere .to_string(); let mut kind = media_type .split('/') .next() .unwrap_or("link") .to_string(); // TODO in theory we should match on document_type, but mastodon and misskey send all attachments // as "Documents" regardless of type, so we're forced to ignore the actual AP type and just match // using media_type, uffff // // those who correctly send Image type objects without a media type get shown as links here, this // is a dirty fix to properly display as images if kind == "link" && matches!(object.document_type(), Ok(apb::DocumentType::Image)) { kind = "image".to_string(); } match kind.as_str() { "image" => view! {

}.into_view(), "video" => { let _href = href.clone(); view! {
}.into_view() }, "audio" => view! {

}.into_view(), "link" | "text" => view! {

{Uri::pretty(&href, 50)}

}.into_view(), _ => view! {

{media_type} {object.name().map(|name| { view! {

{name.to_string()}

} })}

}.into_view(), } }