'use client' import { Accordion, AccordionItem, AccordionTrigger, AccordionContent, } from "@/components/ui/accordion"; import { Input } from "@/components/ui/input"; import Link from "next/link"; import Image from "next/image"; import { X, EyeOff, Eye } from "lucide-react"; import React, { useState, useEffect, useRef, useMemo } from "react"; import { Category } from "@/lib/types"; import { Badge } from "./ui/badge"; import clsx from "clsx"; const ScriptBrowser = ({ items, selectedScript, setSelectedScript, }: { items: Category[]; selectedScript: string | null; setSelectedScript: (script: string | null) => void; }) => { const [links, setLinks] = useState([]); const [searchTerm, setSearchTerm] = useState(""); const inputRef = useRef(null); const [expandedItems, setExpandedItems] = useState([]); const [showLogos, setShowLogos] = useState(() => { const saved = localStorage.getItem('showLogos'); return saved ? JSON.parse(saved) : true; }); useEffect(() => { localStorage.setItem('showLogos', JSON.stringify(showLogos)); }, [showLogos]); useEffect(() => { if (items) { setLinks(items); } }, [items]); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "/") { inputRef.current?.focus(); event.preventDefault(); } if (event.key === "Escape") { handleSearch(""); } }; document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("keydown", handleKeyDown); }; }, []); const handleSearch = (value: string) => { setSearchTerm(value); }; const filteredLinks = useMemo(() => { return links.filter((category) => category.expand.items.some((script) => script.title.toLowerCase().includes(searchTerm.toLowerCase()), ), ); }, [links, searchTerm]); useEffect(() => { if (searchTerm) { const expanded = filteredLinks.map((category) => category.catagoryName); setExpandedItems(expanded); } else { setExpandedItems([]); } }, [searchTerm, filteredLinks]); const handleAccordionChange = (value: string[]) => { setExpandedItems(value); }; const accordionProps = useMemo(() => { return searchTerm ? { type: "multiple" as const, value: expandedItems, onValueChange: handleAccordionChange, } : { type: "single" as const, collapsible: true, value: expandedItems[0], onValueChange: (value: string) => handleAccordionChange([value]), }; }, [searchTerm, expandedItems]); const handleSelected = (title: string) => { setSelectedScript(title); }; return (

Scripts

handleSearch(e.target.value)} ref={inputRef} value={searchTerm} /> {searchTerm && ( handleSearch("")} style={{ position: 'absolute', right: '0.5rem' }} /> )}
{searchTerm ? (

Press 'Esc' to clear the search

) : (

setShowLogos(!showLogos)}> {showLogos ? <>Hide Logos : <>Show Logos}

)}
{filteredLinks.map((category) => ( {category.catagoryName} {category.expand.items .filter((script) => script.title.toLowerCase().includes(searchTerm.toLowerCase()), ) .map((script, index) => (

handleSelected(script.title)} > {showLogos && script.logo && ( {script.title} )} {script.title} {script.item_type}

))}
))}
); }; export default ScriptBrowser;