"use client"; import React, { useEffect } from "react"; import Link from "next/link"; import { ActionButton } from "@/components/ui/action-button"; import useRelativeTime from "@/lib/hooks/relative-time"; import { api } from "@/lib/trpc"; import { Separator } from "@radix-ui/react-dropdown-menu"; import dayjs from "dayjs"; import relativeTime from "dayjs/plugin/relativeTime"; import { Dot, LinkIcon } from "lucide-react"; import { useTranslation } from "react-i18next"; import { useInView } from "react-intersection-observer"; import { ZGetAllHighlightsResponse, ZHighlight, } from "@karakeep/shared/types/highlights"; import HighlightCard from "./HighlightCard"; dayjs.extend(relativeTime); function Highlight({ highlight }: { highlight: ZHighlight }) { const { fromNow, localCreatedAt } = useRelativeTime(highlight.createdAt); const { t } = useTranslation(); return (
{fromNow} {t("common.source")}
); } export default function AllHighlights({ highlights: initialHighlights, }: { highlights: ZGetAllHighlightsResponse; }) { const { t } = useTranslation(); const { data, fetchNextPage, hasNextPage, isFetchingNextPage } = api.highlights.getAll.useInfiniteQuery( {}, { initialData: () => ({ pages: [initialHighlights], pageParams: [null], }), initialCursor: null, getNextPageParam: (lastPage) => lastPage.nextCursor, }, ); const { ref: loadMoreRef, inView: loadMoreButtonInView } = useInView(); useEffect(() => { if (loadMoreButtonInView && hasNextPage && !isFetchingNextPage) { fetchNextPage(); } }, [loadMoreButtonInView]); const allHighlights = data?.pages.flatMap((p) => p.highlights); return (
{allHighlights && allHighlights.length > 0 && allHighlights.map((h) => ( ))} {allHighlights && allHighlights.length == 0 && (

{t("highlights.no_highlights")}

)} {hasNextPage && (
fetchNextPage()} variant="ghost" > Load More
)}
); }