"use client"; import { useState } from "react"; import Link from "next/link"; import { UserAvatar } from "@/components/user-avatar"; import { ThoughtList } from "@/components/thought-list"; import { Card } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { ExternalLink, UserPlus, UserMinus } from "lucide-react"; import { followUser, unfollowUser, RemoteActor, Thought, Me, getActorFollowers, getActorFollowing, ActorConnection } from "@/lib/api"; import { RemoteUserCard } from "@/components/remote-user-card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { toast } from "sonner"; import { useAuth } from "@/hooks/use-auth"; interface RemoteUserProfileProps { actor: RemoteActor; initialPosts: Thought[]; me: Me | null; initialFollowed?: boolean; } export function RemoteUserProfile({ actor, initialPosts, me, initialFollowed = false, }: RemoteUserProfileProps) { const [followed, setFollowed] = useState(initialFollowed); const [loading, setLoading] = useState(false); const { token } = useAuth(); type ConnectionTab = "posts" | "followers" | "following"; const [activeTab, setActiveTab] = useState("posts"); const [followers, setFollowers] = useState([]); const [following, setFollowing] = useState([]); const [followersPage, setFollowersPage] = useState(1); const [followingPage, setFollowingPage] = useState(1); const [followersHasMore, setFollowersHasMore] = useState(false); const [followingHasMore, setFollowingHasMore] = useState(false); const [followersLoaded, setFollowersLoaded] = useState(false); const [followingLoaded, setFollowingLoaded] = useState(false); const handleFollow = async () => { if (!token) { toast.error("You must be logged in to follow users."); return; } setLoading(true); try { if (followed) { await unfollowUser(actor.handle, token); setFollowed(false); } else { await followUser(actor.handle, token); setFollowed(true); toast.success(`Follow request sent to ${actor.handle}`); } } catch { toast.error( followed ? "Failed to unfollow." : "Failed to send follow request.", ); } finally { setLoading(false); } }; const loadFollowers = async (page: number) => { const result = await getActorFollowers(actor.handle, page, token).catch(() => null); if (!result) return; setFollowers((prev) => (page === 1 ? result.items : [...prev, ...result.items])); setFollowersHasMore(result.hasMore); setFollowersLoaded(true); setFollowersPage(page); }; const loadFollowing = async (page: number) => { const result = await getActorFollowing(actor.handle, page, token).catch(() => null); if (!result) return; setFollowing((prev) => (page === 1 ? result.items : [...prev, ...result.items])); setFollowingHasMore(result.hasMore); setFollowingLoaded(true); setFollowingPage(page); }; const handleTabChange = (tab: string) => { setActiveTab(tab as ConnectionTab); if (tab === "followers" && !followersLoaded) loadFollowers(1); if (tab === "following" && !followingLoaded) loadFollowing(1); }; const isOwnProfile = me?.username === actor.handle; const authorDetails = new Map(); initialPosts.forEach((t) => { authorDetails.set(t.author.username, { avatarUrl: actor.avatarUrl }); }); return (
Posts Followers Following {initialPosts.length > 0 ? ( ) : (

Posts are being fetched — check back soon.

)}
{!followersLoaded ? (

Loading followers…

) : followers.length === 0 ? (

No followers cached yet — check back soon.

) : (
{followers.map((f) => ( ))} {followersHasMore && ( )}
)}
{!followingLoaded ? (

Loading following…

) : following.length === 0 ? (

No following cached yet — check back soon.

) : (
{following.map((f) => ( ))} {followingHasMore && ( )}
)}
); }