"use client"; import React, { useEffect, useState } from "react"; import { Card, CardContent, CardHeader } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Category, Script } from "@/lib/types"; const CategoryView = () => { const [categories, setCategories] = useState([]); const [selectedCategory, setSelectedCategory] = useState(null); useEffect(() => { const fetchCategoriesAndScripts = async () => { try { const basePath = process.env.NODE_ENV === "production" ? "/ProxmoxVE" : ""; // Dynamischer Basis-Pfad // Kategorien laden const categoriesResponse = await fetch(`${basePath}/json/metadata.json`); if (!categoriesResponse.ok) { throw new Error("Failed to fetch categories"); } const metadata = await categoriesResponse.json(); console.log("Raw metadata:", metadata); // Debugging if (!metadata.categories) { throw new Error("Invalid metadata structure: categories missing"); } const categories = metadata.categories.map((category: Category) => ({ ...category, scripts: [], })); // Skripte laden const scriptsResponse = await fetch(`${basePath}/json`); if (!scriptsResponse.ok) { throw new Error("Failed to fetch scripts"); } const scriptsList = await scriptsResponse.json(); const scripts: Script[] = await Promise.all( scriptsList .filter((file: string) => file.endsWith(".json") && file !== "metadata.json") .map(async (file: string) => { const scriptResponse = await fetch(`${basePath}/json/${file}`); if (scriptResponse.ok) { return await scriptResponse.json(); } return null; }) ).then((results) => results.filter((script) => script !== null)); // Kategorien und Skripte verknüpfen categories.forEach((category) => { category.scripts = scripts.filter((script: Script) => script.categories.includes(category.id) ); }); console.log("Parsed categories with scripts:", categories); // Debugging setCategories(categories); } catch (error) { console.error("Error fetching categories and scripts:", error); } }; fetchCategoriesAndScripts(); }, []); const handleCategoryClick = (category: Category) => { setSelectedCategory(category); }; const handleBackClick = () => { setSelectedCategory(null); }; return (
{categories.length === 0 && (

No categories available. Please check the JSON file.

)} {selectedCategory ? (

{selectedCategory.name}

{selectedCategory.scripts .sort((a, b) => a.name.localeCompare(b.name)) .map((script: Script) => (

{script.name}

{script.date_created || "No date available"}

))}
) : (

Categories

{categories.map((category) => ( handleCategoryClick(category)} className="cursor-pointer hover:shadow-lg" > ))}
)}
); }; export default CategoryView;