'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, Star } 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; }); const linkRefs = useRef<{ [key: string]: HTMLAnchorElement | null }>({}); 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]); useEffect(() => { const matchingScripts = links .flatMap(category => category.expand.items) .filter(script => script.title.toLowerCase().includes(searchTerm.toLowerCase())); if (matchingScripts.length === 1) { const scriptTitle = matchingScripts[0].title; setSelectedScript(scriptTitle); const linkElement = linkRefs.current[scriptTitle]; if (linkElement) { linkElement.click(); } } else { setSelectedScript(null); } }, [searchTerm, links, setSelectedScript]); 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

{links.reduce( (acc, category) => acc + category.expand.items.length, 0, )}{" "} Total 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.length}
{" "}
{category.expand.items .filter((script) => script.title.toLowerCase().includes(searchTerm.toLowerCase()), ) .map((script, index) => (

handleSelected(script.title)} ref={(el) => { linkRefs.current[script.title] = el; }} > {showLogos && script.logo && ( {script.title} )} {script.title} {script.isMostViewed && ( )} {script.item_type}

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