import { CalendarPlus } from "lucide-react"; import { useMemo, useState } from "react"; import Image from "next/image"; import Link from "next/link"; import type { Category, Script } from "@/lib/types"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; import { basePath, mostPopularScripts } from "@/config/site-config"; import { Button } from "@/components/ui/button"; import { extractDate } from "@/lib/time"; const ITEMS_PER_PAGE = 3; export function getDisplayValueFromType(type: string) { switch (type) { case "ct": return "LXC"; case "vm": return "VM"; case "pve": case "addon": return ""; default: return ""; } } export function LatestScripts({ items }: { items: Category[] }) { const [page, setPage] = useState(1); const latestScripts = useMemo(() => { if (!items) return []; const scripts = items.flatMap(category => category.scripts || []); // Filter out duplicates by slug const uniqueScriptsMap = new Map(); scripts.forEach((script) => { if (!uniqueScriptsMap.has(script.slug)) { uniqueScriptsMap.set(script.slug, script); } }); return Array.from(uniqueScriptsMap.values()).sort( (a, b) => new Date(b.date_created).getTime() - new Date(a.date_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(script => (
((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)} className="h-11 w-11 object-contain" />

{script.name} {" "} {getDisplayValueFromType(script.type)}

{extractDate(script.date_created)}

{script.description}
))}
); } export function MostViewedScripts({ items }: { items: Category[] }) { const mostViewedScripts = items.reduce((acc: Script[], category) => { const foundScripts = category.scripts.filter(script => mostPopularScripts.includes(script.slug)); return acc.concat(foundScripts); }, []); return (
{mostViewedScripts.length > 0 && ( <>

Most Viewed Scripts

)}
{mostViewedScripts.map(script => (
((e.currentTarget as HTMLImageElement).src = `/${basePath}/logo.png`)} className="h-11 w-11 object-contain" />

{script.name} {" "} {getDisplayValueFromType(script.type)}

{extractDate(script.date_created)}

{script.description}
))}
); }