import { CATEGORIES, TOOLS } from "@stirling-image/shared"; import { useEffect, useMemo, useState } from "react"; import { useSettingsStore } from "@/stores/settings-store"; import { SearchBar } from "../common/search-bar"; import { ToolCard } from "../common/tool-card"; export function ToolPanel() { const [search, setSearch] = useState(""); const { disabledTools, experimentalEnabled, loaded, fetch } = useSettingsStore(); useEffect(() => { fetch(); }, [fetch]); const visibleTools = useMemo(() => { if (!loaded) return []; return TOOLS.filter((t) => { if (disabledTools.includes(t.id)) return false; if (t.experimental && !experimentalEnabled) return false; return true; }); }, [disabledTools, experimentalEnabled, loaded]); const filteredTools = useMemo(() => { if (!search) return visibleTools; const q = search.toLowerCase(); return visibleTools.filter( (t) => t.name.toLowerCase().includes(q) || t.description.toLowerCase().includes(q), ); }, [search, visibleTools]); const groupedTools = useMemo(() => { const groups = new Map(); for (const tool of filteredTools) { const list = groups.get(tool.category) || []; list.push(tool); groups.set(tool.category, list); } return groups; }, [filteredTools]); return (
{CATEGORIES.filter((cat) => groupedTools.has(cat.id)).map((category) => (

{category.name}

{groupedTools.get(category.id)?.map((tool) => ( ))}
))} {filteredTools.length === 0 && (

No tools found

)}
); }