use leptos::*; use crate::prelude::*; use apb::{field::OptionalString, target::Addressed, Activity, Base, Object}; #[component] pub fn ActivityLine(activity: crate::Object) -> impl IntoView { let object_id = activity.object().id().str().unwrap_or_default(); let activity_url = activity.id().map(|x| view! { "↗" }); let actor_id = activity.actor().id().str().unwrap_or_default(); let actor = CACHE.get_or(&actor_id, serde_json::Value::String(actor_id.clone()).into()); let kind = activity.activity_type().unwrap_or(apb::ActivityType::Activity); let href = match kind { apb::ActivityType::Follow => Uri::web(U::Actor, &object_id), // TODO for update check what's being updated _ => Uri::web(U::Object, &object_id), }; view! {
{kind.as_ref().to_string()} {activity_url}
} } #[component] pub fn Item( item: crate::Object, #[prop(optional)] sep: bool, #[prop(optional)] replies: bool, ) -> impl IntoView { let config = use_context::>().expect("missing config context"); let id = item.id().unwrap_or_default().to_string(); let sep = if sep { Some(view! {
}) } else { None }; if !replies && !config.get().filters.visible(&item) { return None; } match item.object_type().unwrap_or(apb::ObjectType::Object) { // special case for placeholder activities apb::ObjectType::Note | apb::ObjectType::Document(_) => Some(view! { {sep.clone()} }.into_view()), // everything else apb::ObjectType::Activity(t) => { let object_id = item.object().id().str().unwrap_or_default(); let object = match t { apb::ActivityType::Create | apb::ActivityType::Announce => CACHE.get(&object_id).map(|obj| { view! { } }.into_view()), apb::ActivityType::Follow => CACHE.get(&object_id).map(|obj| { view! {
} }.into_view()), _ => None, }; Some(view! { {object} {sep.clone()} }.into_view()) }, // should never happen t => Some(view! {

type not implemented : {t.as_ref().to_string()}

}.into_view()), } }