import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { useMemo, useState } from "react"; import { Category } from "@/lib/types"; import Link from "next/link"; import Image from "next/image"; import { Button } from "./ui/button"; import { extractDate } from "@/lib/time"; const ITEMS_PER_PAGE = 3; export function LatestScripts({ items }: { items: Category[] }) { const [page, setPage] = useState(1); const latestScripts = useMemo(() => { if (!items) return []; const scripts = items.flatMap((category) => category.expand.items || []); return scripts.sort( (a, b) => new Date(b.created).getTime() - new Date(a.created).getTime(), ); }, [items]); const goToNextPage = () => { setPage((prevPage) => prevPage + 1); }; const goToPreviousPage = () => { setPage((prevPage) => prevPage - 1); }; const startIndex = (page - 1) * ITEMS_PER_PAGE; const endIndex = page * ITEMS_PER_PAGE; if (!items) { return null; } return (
{latestScripts.length > 0 && (

Newest Scripts

{page > 1 && (
Previous
)} {endIndex < latestScripts.length && (
{page === 1 ? "More.." : "Next"}
)}
)}
{latestScripts.slice(startIndex, endIndex).map((item) => (

{item.title} {item.item_type}

Date added: {extractDate(item.created)}

{item.description}
))}
); } export function MostViewedScripts({ items }: { items: Category[] }) { const [page, setPage] = useState(1); const mostViewedScripts = useMemo(() => { if (!items) return []; const scripts = items.flatMap((category) => category.expand.items || []); const mostViewedScripts = scripts .filter((script) => script.isMostViewed) .map((script) => ({ ...script, })) .sort((a, b) => a.mostViewedPosition - b.mostViewedPosition); return mostViewedScripts; }, [items]); const goToNextPage = () => { setPage((prevPage) => prevPage + 1); }; const goToPreviousPage = () => { setPage((prevPage) => prevPage - 1); }; const startIndex = (page - 1) * ITEMS_PER_PAGE; const endIndex = page * ITEMS_PER_PAGE; return (
{mostViewedScripts.length > 0 && ( <>

Most Viewed Scripts

This data, unfortunately, is not directly influenced by interacting with the website. (yet)

)}
{mostViewedScripts.slice(startIndex, endIndex).map((item) => (

{item.title} {item.item_type}

Date added: {extractDate(item.created)}

{item.description}
))}
{page > 1 && ( )} {endIndex < mostViewedScripts.length && ( )}
); } export function RecentlyUpdatedScripts({ items }: { items: Category[] }) { const [page, setPage] = useState(1); const updatedScripts = useMemo(() => { if (!items) return []; const scripts = items.flatMap((category) => category.expand.items || []); const updatedScripts = scripts.map((script) => ({ ...script, updated: new Date(script.updated), })); return updatedScripts.sort( (a, b) => b.updated.getTime() - a.updated.getTime(), ); }, [items]); const goToNextPage = () => { setPage((prevPage) => prevPage + 1); }; const goToPreviousPage = () => { setPage((prevPage) => prevPage - 1); }; const startIndex = (page - 1) * ITEMS_PER_PAGE; const endIndex = page * ITEMS_PER_PAGE; return (
{updatedScripts.length > 0 && (

Recently Updated Scripts

{page > 1 && (
Previous
)} {endIndex < updatedScripts.length && (
{page === 1 ? "More.." : "Next"}
)}
)}
{updatedScripts.slice(startIndex, endIndex).map((item) => (

{item.title} {item.item_type}

Last updated: {item.updated.toISOString().split("T")[0]}

{item.description}
))}
); }