diff --git a/app/scripts/page.tsx b/app/scripts/page.tsx index 33177ca..36e8aac 100644 --- a/app/scripts/page.tsx +++ b/app/scripts/page.tsx @@ -1,24 +1,59 @@ +'use client' import ScriptItem from "@/components/Script"; import ScriptBrowser from "@/components/ScriptBrowser"; import Particles from "@/components/ui/particles"; +import { pb } from "@/lib/pocketbase"; +import { Category } from "@/lib/types"; +import { useEffect, useState } from "react"; export default function Page() { + const [links, setLinks] = useState([]); + const [isLoading , setIsLoading] = useState(true) + + const fetchLinks = async () => { + try { + setIsLoading(true) + const res = await pb.collection("categories").getFullList({ + expand: "items", + sort: "order", + requestKey: "desktop", + }); + setLinks(res as unknown as Category[]); + setIsLoading(false) + } catch (error) { + console.error("Error fetching links:", error); + setIsLoading(false) + } + }; + + useEffect(() => { + fetchLinks(); + }, []); + return ( <> - -
-
-
- + {!isLoading ? ( + <> + +
+
+
+ +
+
+ +
-
- +
+ + ) : ( +
+
-
-
+ )} ); } diff --git a/components/LatestScripts.tsx b/components/LatestScripts.tsx index fefb33e..ec7f7c9 100644 --- a/components/LatestScripts.tsx +++ b/components/LatestScripts.tsx @@ -8,27 +8,24 @@ import { } from "@/components/ui/card"; import { pb } from "@/lib/pocketbase"; import { useEffect, useState } from "react"; -import { Script } from "@/lib/types"; +import { Category, Script } from "@/lib/types"; import Link from "next/link"; import Image from "next/image"; import { Button } from "./ui/button"; import { extractDate } from "@/lib/time"; -function LatestScripts() { +function LatestScripts({items } : {items: Category[]}) { const [latestScripts, setLatestScripts] = useState([]); - async function getLatestScripts() { - const res = await pb.collection("proxmox_scripts").getList(1, 3, { - sort: "-created", - requestKey: "latest_scripts", - }); - - setLatestScripts(res.items as unknown as Script[]); - } - useEffect(() => { - getLatestScripts(); - }, []); + if (items) { + const scripts = items.flatMap((category) => category.expand.items); + const sortedScripts = scripts.sort((a, b) => { + return new Date(b.created).getTime() - new Date(a.created).getTime(); + }); + setLatestScripts(sortedScripts.slice(0, 3)); + } + }, [items]); return (
diff --git a/components/MostViewedScripts.tsx b/components/MostViewedScripts.tsx index 0a69e3f..7e52f4a 100644 --- a/components/MostViewedScripts.tsx +++ b/components/MostViewedScripts.tsx @@ -8,32 +8,25 @@ import { } from "@/components/ui/card"; import { pb } from "@/lib/pocketbase"; import { useEffect, useState } from "react"; -import { Script } from "@/lib/types"; +import { Category, Script } from "@/lib/types"; import Link from "next/link"; import Image from "next/image"; import { Button } from "./ui/button"; import { extractDate } from "@/lib/time"; -export default function MostViewedScripts() { +export default function MostViewedScripts({items} : {items: Category[]}) { const [latestScripts, setLatestScripts] = useState([]); - async function getLatestScripts() { - try { - const res = await pb.collection("proxmox_scripts").getList(1, 3, { - sort: "mostViewedPosition", - filter: "isMostViewed = true", - }); - setLatestScripts(res.items as unknown as Script[]); - } catch (error) { - console.error("Error fetching scripts:", error); - } - } - - - useEffect(() => { - getLatestScripts(); - }, []); + if (items) { + const scripts = items.flatMap((category) => category.expand.items); + const mostViewedScripts = scripts.filter((item) => item.isMostViewed); + const sortedScripts = mostViewedScripts.sort((a, b) => { + return a.mostViewedPosition - b.mostViewedPosition; + }); + setLatestScripts(sortedScripts.slice(0, 3)); + } + }, [items]); return (
diff --git a/components/Script.tsx b/components/Script.tsx index 91d2c6a..0e82968 100644 --- a/components/Script.tsx +++ b/components/Script.tsx @@ -8,28 +8,25 @@ import { toast } from "sonner"; import { Clipboard, Info, X } from "lucide-react"; import { Separator } from "@/components/ui/separator"; import Link from "next/link"; -import { Script } from "@/lib/types"; -import { useSearchParams } from "next/navigation"; +import { Category, Script } from "@/lib/types"; +import { useSearchParams } from "next/navigation"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import LatestScripts from "./LatestScripts"; import MostViewedScripts from "./MostViewedScripts"; -function ScriptItem() { +function ScriptItem({ items }: { items: Category[] }) { const [item, setItem] = useState