import { Conversation } from "@/components/conversation"; import { Quote } from "@/components/quote"; import { RepostNote } from "@/components/repost"; import { TextNote } from "@/components/text"; import { ArrowRightCircleIcon, ArrowRightIcon } from "@lume/icons"; import { type ColumnRouteSearch, type Event, Kind } from "@lume/types"; import { Spinner } from "@lume/ui"; import { useInfiniteQuery } from "@tanstack/react-query"; import { Link, createFileRoute, redirect } from "@tanstack/react-router"; import { Virtualizer } from "virtua"; export const Route = createFileRoute("/group")({ validateSearch: (search: Record): ColumnRouteSearch => { return { account: search.account, label: search.label, name: search.name, }; }, beforeLoad: async ({ search, context }) => { const ark = context.ark; const key = `lume_group_${search.label}`; const groups = (await ark.get_nstore(key)) as string[]; const settings = await ark.get_settings(); if (!groups?.length) { throw redirect({ to: "/create-group", search: { ...search, redirect: "/group", }, }); } return { groups, settings, }; }, component: Screen, }); export function Screen() { const { label, account } = Route.useSearch(); const { ark, groups } = Route.useRouteContext(); const { data, isLoading, isFetching, isFetchingNextPage, hasNextPage, fetchNextPage, } = useInfiniteQuery({ queryKey: [label, account], initialPageParam: 0, queryFn: async ({ pageParam }: { pageParam: number }) => { const events = await ark.get_local_events(groups, 20, pageParam); return events; }, getNextPageParam: (lastPage) => lastPage?.at(-1)?.created_at - 1, select: (data) => data?.pages.flatMap((page) => page.filter((ev) => ev.kind === Kind.Text)), refetchOnWindowFocus: false, }); const renderItem = (event: Event) => { if (!event) return; switch (event.kind) { case Kind.Repost: return ; default: { const isConversation = event.tags.filter((tag) => tag[0] === "e" && tag[3] !== "mention") .length > 0; const isQuote = event.tags.filter((tag) => tag[0] === "q").length > 0; if (isConversation) { return ; } if (isQuote) { return ; } return ; } } }; return (
{isFetching && !isLoading && !isFetchingNextPage ? (
Fetching new notes...
) : null} {isLoading ? (
Loading...
) : !data.length ? ( ) : ( {data.map((item) => renderItem(item))} )} {data?.length && hasNextPage ? (
) : null}
); } function Empty() { return (

Your newsfeed is empty

Here are few suggestions to get started.

Show trending notes Discover trending users
); }