"use client"; import type { z } from "zod"; import { githubGist, nord } from "react-syntax-highlighter/dist/esm/styles/hljs"; import { CalendarIcon, Check, Clipboard, Download } from "lucide-react"; import { useCallback, useEffect, useMemo, useState } from "react"; import SyntaxHighlighter from "react-syntax-highlighter"; import { useTheme } from "next-themes"; import { format } from "date-fns"; import { toast } from "sonner"; import Image from "next/image"; import type { Category } from "@/lib/types"; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Calendar } from "@/components/ui/calendar"; import { Textarea } from "@/components/ui/textarea"; import { Button } from "@/components/ui/button"; import { Switch } from "@/components/ui/switch"; import { basePath } from "@/config/site-config"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { fetchCategories } from "@/lib/data"; import { cn } from "@/lib/utils"; import type { Script } from "./_schemas/schemas"; import { ScriptItem } from "../scripts/_components/script-item"; import InstallMethod from "./_components/install-method"; import { ScriptSchema } from "./_schemas/schemas"; import Categories from "./_components/categories"; import Note from "./_components/note"; function search(scripts: Script[], query: string): Script[] { const queryLower = query.toLowerCase().trim(); const searchWords = queryLower.split(/\s+/).filter(Boolean); return scripts .map((script) => { const nameLower = script.name.toLowerCase(); const descriptionLower = (script.description || "").toLowerCase(); let score = 0; for (const word of searchWords) { if (nameLower.includes(word)) { score += 10; } if (descriptionLower.includes(word)) { score += 5; } } return { script, score }; }) .filter(({ score }) => score > 0) .sort((a, b) => b.score - a.score) .slice(0, 20) .map(({ script }) => script); } const initialScript: Script = { name: "", slug: "", categories: [], date_created: format(new Date(), "yyyy-MM-dd"), type: "ct", updateable: false, privileged: false, interface_port: null, documentation: null, config_path: "", website: null, logo: null, description: "", disable: undefined, disable_description: undefined, install_methods: [], default_credentials: { username: null, password: null, }, notes: [], }; export default function JSONGenerator() { const { theme } = useTheme(); const [script, setScript] = useState