import { RepostNote, TextNote, useArk, useProfile, useStorage, } from "@lume/ark"; import { ArrowLeftIcon, ArrowRightCircleIcon, LoaderIcon } from "@lume/icons"; import { NIP05 } from "@lume/ui"; import { FETCH_LIMIT, displayNpub } from "@lume/utils"; import { NDKEvent, NDKKind } from "@nostr-dev-kit/ndk"; import { useInfiniteQuery } from "@tanstack/react-query"; import { useEffect, useMemo, useState } from "react"; import { Link, useNavigate, useParams } from "react-router-dom"; import { toast } from "sonner"; import { WVList } from "virtua"; export function UserRoute() { const ark = useArk(); const storage = useStorage(); const navigate = useNavigate(); const { id } = useParams(); const { user } = useProfile(id); const { data, hasNextPage, isLoading, isFetchingNextPage, fetchNextPage } = useInfiniteQuery({ queryKey: ["user-posts", id], initialPageParam: 0, queryFn: async ({ signal, pageParam, }: { signal: AbortSignal; pageParam: number; }) => { const events = await ark.getInfiniteEvents({ filter: { kinds: [NDKKind.Text, NDKKind.Repost], authors: [id], }, limit: FETCH_LIMIT, pageParam, signal, }); return events; }, getNextPageParam: (lastPage) => { const lastEvent = lastPage.at(-1); if (!lastEvent) return; return lastEvent.created_at - 1; }, refetchOnWindowFocus: false, }); const [followed, setFollowed] = useState(false); const allEvents = useMemo( () => (data ? data.pages.flatMap((page) => page) : []), [data], ); const follow = async (pubkey: string) => { try { const add = await ark.createContact({ pubkey }); if (add) { setFollowed(true); } else { toast.success("You already follow this user"); } } catch (error) { console.log(error); } }; const unfollow = async (pubkey: string) => { try { const remove = await ark.deleteContact({ pubkey }); if (remove) { setFollowed(false); } } catch (error) { console.log(error); } }; const renderItem = (event: NDKEvent) => { switch (event.kind) { case NDKKind.Text: return ; case NDKKind.Repost: return ; default: return ; } }; useEffect(() => { if (storage.account.contacts.includes(id)) { setFollowed(true); } }, []); return ( navigate(-1)} > Back {followed ? ( unfollow(id)} className="inline-flex h-9 w-28 items-center justify-center rounded-lg bg-neutral-200 text-sm font-medium hover:bg-blue-500 hover:text-white dark:bg-neutral-800" > Unfollow ) : ( follow(id)} className="inline-flex h-9 w-28 items-center justify-center rounded-lg bg-neutral-200 text-sm font-medium hover:bg-blue-500 hover:text-white dark:bg-neutral-800" > Follow )} Message {user?.name || user?.display_name || user?.displayName || "Anon"} {user?.nip05 ? ( ) : ( {displayNpub(id, 16)} )} {user?.about} Latest posts {isLoading ? ( ) : ( allEvents.map((item) => renderItem(item)) )} {hasNextPage ? ( fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage} className="inline-flex h-10 w-max items-center justify-center gap-2 rounded-full bg-blue-500 px-6 font-medium text-white hover:bg-blue-600 focus:outline-none" > {isFetchingNextPage ? ( ) : ( <> Load more > )} ) : null} ); }