use std::sync::Arc; use apb::{Actor, Base, Collection, Object}; use leptos::*; use leptos_router::*; use crate::prelude::*; #[component] pub fn AboutPage() -> impl IntoView { view! {
about

μpub" is a micro social network powered by "ActivityPub

"the "fediverse" is an ensemble of social networks, which, while independently hosted, can communicate with each other"

content is aggregated in timelines, logged out users can only access global server timeline

} } #[component] pub fn ConfigPage() -> impl IntoView { view! {
config

"not implemented :("

} } #[component] pub fn UserPage(tl: Timeline) -> impl IntoView { let params = use_params_map(); let auth = use_context::().expect("missing auth context"); let id = params.get() .get("id") .cloned() .unwrap_or_default(); let mut uid = id .replace("/web/objects/", "") .replacen('+', "https://", 1) .replace('@', "/"); if !uid.starts_with("http") { uid = format!("{URL_BASE}/web/objects/{uid}"); } let actor = create_local_resource(move || params.get().get("id").cloned().unwrap_or_default(), move |id| { async move { match CACHE.get(&Uri::full(FetchKind::User, &id)) { Some(x) => Some(x.clone()), None => { let user : serde_json::Value = Http::fetch(&Uri::api(FetchKind::User, &id, true), auth).await.ok()?; let user = Arc::new(user); CACHE.put(Uri::full(FetchKind::User, &id), user.clone()); Some(user) }, } } }); view! {
users::view
{move || { let uid = uid.clone(); match actor.get() { None => view! {

loading...

}.into_view(), Some(None) => { view! {

loading failed"↗"

}.into_view() }, Some(Some(object)) => { let uid = object.id().unwrap_or_default().to_string(); let avatar_url = object.icon().get().map(|x| x.url().id().unwrap_or_default()).unwrap_or_default(); let background_url = object.image().get().map(|x| x.url().id().unwrap_or_default()).unwrap_or_default(); let display_name = object.name().unwrap_or_default().to_string(); let username = object.preferred_username().unwrap_or_default().to_string(); let summary = object.summary().unwrap_or_default().to_string(); let domain = object.id().unwrap_or_default().replace("https://", "").split('/').next().unwrap_or_default().to_string(); let actor_type = object.actor_type().unwrap_or(apb::ActorType::Person); let actor_type_tag = if actor_type == apb::ActorType::Person { None } else { Some(view! { "["{actor_type.as_ref().to_lowercase()}"]" } ) }; let created = object.published(); let following = object.generator().get().map(|x| x.total_items().unwrap_or(0)).unwrap_or(0); let followers = object.audience().get().map(|x| x.total_items().unwrap_or(0)).unwrap_or(0); let statuses = object.replies().get().map(|x| x.total_items().unwrap_or(0)).unwrap_or(0); let tl_url = format!("{}/outbox/page", Uri::api(FetchKind::User, &id.clone(), false)); if !tl.next.get().starts_with(&tl_url) { tl.reset(tl_url); } view! {