From c4dd0797a166be390e263760313ce7bee8335264 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 15 May 2026 04:13:34 +0200 Subject: [PATCH] feat(frontend): RemoteFollowers component --- .../federation/remote-followers.tsx | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 thoughts-frontend/components/federation/remote-followers.tsx diff --git a/thoughts-frontend/components/federation/remote-followers.tsx b/thoughts-frontend/components/federation/remote-followers.tsx new file mode 100644 index 0000000..5355da6 --- /dev/null +++ b/thoughts-frontend/components/federation/remote-followers.tsx @@ -0,0 +1,61 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { getRemoteFollowers, rejectFollowRequest, type RemoteActor } from "@/lib/api"; +import { useAuth } from "@/hooks/use-auth"; +import { UserAvatar } from "@/components/user-avatar"; +import { Button } from "@/components/ui/button"; +import { toast } from "sonner"; + +export function RemoteFollowers() { + const { token } = useAuth(); + const [followers, setFollowers] = useState([]); + const [loading, setLoading] = useState(true); + + useEffect(() => { + if (!token) return; + getRemoteFollowers(token) + .then(setFollowers) + .catch(() => toast.error("Failed to load followers")) + .finally(() => setLoading(false)); + }, [token]); + + const remove = async (actorUrl: string) => { + if (!token) return; + setFollowers((prev) => prev.filter((f) => f.url !== actorUrl)); + await rejectFollowRequest(actorUrl, token).catch(() => { + toast.error("Failed to remove follower"); + }); + }; + + if (loading) return

Loading…

; + if (followers.length === 0) + return

No remote followers yet.

; + + return ( + + ); +}