// components/top-friends-editor.tsx "use client"; import { useState } from "react"; import { User, setTopFriends } from "@/lib/api"; import { UserAvatar } from "./user-avatar"; import { Button } from "./ui/button"; import { Input } from "./ui/input"; import { Card, CardContent } from "./ui/card"; interface TopFriendsEditorProps { token: string; initialTopFriends: User[]; localFriends: User[]; } export function TopFriendsEditor({ token, initialTopFriends, localFriends, }: TopFriendsEditorProps) { const [topFriends, setTopFriendsState] = useState(initialTopFriends); const [search, setSearch] = useState(""); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [saved, setSaved] = useState(false); const topIds = new Set(topFriends.map((f) => f.id)); const suggestions = localFriends.filter( (f) => !topIds.has(f.id) && (f.username.toLowerCase().includes(search.toLowerCase()) || (f.displayName ?? "").toLowerCase().includes(search.toLowerCase())) ); function remove(id: string) { setTopFriendsState((prev) => prev.filter((f) => f.id !== id)); setSaved(false); } function add(user: User) { if (topFriends.length >= 8) return; setTopFriendsState((prev) => [...prev, user]); setSearch(""); setSaved(false); } async function save() { setSaving(true); setError(null); setSaved(false); try { await setTopFriends(token, topFriends.map((f) => f.id)); setSaved(true); } catch { setError("Failed to save. Please try again."); } finally { setSaving(false); } } return (
{topFriends.length === 0 && (

No top friends yet. Add up to 8 from the search below.

)} {topFriends.map((friend, i) => (
{i + 1}

{friend.displayName || friend.username}

@{friend.username}

))}
{topFriends.length < 8 && (
setSearch(e.target.value)} /> {search.length > 0 && ( {suggestions.length === 0 ? (

No matches.

) : ( suggestions.slice(0, 5).map((user) => ( )) )}
)}
)}
{saved && (

Saved!

)} {error && (

{error}

)}
); }