"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, useCallback, } from "react"; import { Category } from "@/lib/types"; import { Badge } from "./ui/badge"; import { Button } from "./ui/button"; 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 handleSelected = useCallback( (title: string) => { setSelectedScript(title); }, [setSelectedScript], ); useEffect(() => { if (selectedScript) { const category = links.find((category) => category.expand.items.some((script) => script.title === selectedScript), ); if (category) { setExpandedItems((prev) => Array.from(new Set([...prev, category.catagoryName])), ); handleSelected(selectedScript); } } }, [selectedScript, links, handleSelected]); 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]); return (

Categories

{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

) : (

Press / to search

)}
{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;