1
0
Fork 0
forked from alemi/upub

feat(web): repost button, fixed like button to/cc

This commit is contained in:
əlemi 2024-04-30 04:29:14 +02:00
parent 0bfa49fed6
commit be1c379477
Signed by: alemi
GPG key ID: A4895B84D311642C

View file

@ -96,7 +96,6 @@ pub fn Object(object: serde_json::Value) -> impl IntoView {
.map_or(0, |x| x.total_items().unwrap_or(0)); .map_or(0, |x| x.total_items().unwrap_or(0));
let already_liked = object.audience().get() let already_liked = object.audience().get()
.map_or(false, |x| !x.ordered_items().is_empty()); .map_or(false, |x| !x.ordered_items().is_empty());
let like_target = if public { None } else { Some(author_id) };
let attachments_padding = if object.attachment().is_empty() { let attachments_padding = if object.attachment().is_empty() {
None None
} else { } else {
@ -127,8 +126,8 @@ pub fn Object(object: serde_json::Value) -> impl IntoView {
</blockquote> </blockquote>
<div class="mt-s ml-1 rev"> <div class="mt-s ml-1 rev">
<ReplyButton n=comments /> <ReplyButton n=comments />
<LikeButton n=likes liked=already_liked target=oid author=like_target /> <LikeButton n=likes liked=already_liked target=oid.clone() author=author_id private=!public />
<RepostButton n=shares /> <RepostButton n=shares target=oid />
</div> </div>
} }
} }
@ -153,8 +152,9 @@ pub fn LikeButton(
n: u64, n: u64,
target: String, target: String,
liked: bool, liked: bool,
#[prop(default=None)] author: String,
author: Option<String>, #[prop(optional)]
private: bool,
) -> impl IntoView { ) -> impl IntoView {
let (count, set_count) = create_signal(n); let (count, set_count) = create_signal(n);
let (clicked, set_clicked) = create_signal(!liked); let (clicked, set_clicked) = create_signal(!liked);
@ -167,11 +167,12 @@ pub fn LikeButton(
on:click=move |_ev| { on:click=move |_ev| {
if !clicked.get() { return; } if !clicked.get() { return; }
let target_url = format!("{URL_BASE}/users/test/outbox"); let target_url = format!("{URL_BASE}/users/test/outbox");
let followers_url = format!("{URL_BASE}/users/test/followers"); let to = apb::Node::links(vec![author.to_string()]);
let (to, cc) = if let Some(author) = &author { let cc = if private { apb::Node::Empty } else {
(apb::Node::links(vec![author.to_string()]), apb::Node::Empty) apb::Node::links(vec![
} else { apb::target::PUBLIC.to_string(),
(apb::Node::links(vec![apb::target::PUBLIC.to_string()]), apb::Node::links(vec![followers_url])) format!("{URL_BASE}/users/test/followers")
])
}; };
let payload = serde_json::Value::Object(serde_json::Map::default()) let payload = serde_json::Value::Object(serde_json::Map::default())
.set_activity_type(Some(apb::ActivityType::Like)) .set_activity_type(Some(apb::ActivityType::Like))
@ -208,13 +209,37 @@ pub fn ReplyButton(n: u64) -> impl IntoView {
} }
#[component] #[component]
pub fn RepostButton(n: u64) -> impl IntoView { pub fn RepostButton(n: u64, target: String) -> impl IntoView {
let shares = if n > 0 { let (count, set_count) = create_signal(n);
Some(view! { <small>{n}</small> }) let (clicked, set_clicked) = create_signal(true);
} else { let auth = use_context::<Auth>().expect("missing auth context");
None
};
view! { view! {
<span class="emoji ml-2">{shares}" 🚀"</span> <span
class:emoji=clicked
class:cursor=clicked
class="emoji-btn ml-2"
on:click=move |_ev| {
if !clicked.get() { return; }
set_clicked.set(false);
let target_url = format!("{URL_BASE}/users/test/outbox");
let to = apb::Node::links(vec![apb::target::PUBLIC.to_string()]);
let cc = apb::Node::links(vec![format!("{URL_BASE}/users/test/followers")]);
let payload = serde_json::Value::Object(serde_json::Map::default())
.set_activity_type(Some(apb::ActivityType::Announce))
.set_object(apb::Node::link(target.clone()))
.set_to(to)
.set_cc(cc);
spawn_local(async move {
match Http::post(&target_url, &payload, auth).await {
Ok(()) => set_count.set(count.get() + 1),
Err(e) => tracing::error!("failed sending like: {e}"),
}
set_clicked.set(true);
});
}
>
{move || if count.get() > 0 { Some(view! { <small>{count}</small> })} else { None }}
" 🚀"
</span>
} }
} }