"use client"; import { useState, useEffect, useCallback } from "react"; import BackToMC from "@/components/mission-control/BackToMC"; interface Skill { slug: string; name: string; score: number; description?: string; version?: string; author?: string; downloads?: number; } export default function ClawHubMarketplace() { const [skills, setSkills] = useState([]); const [search, setSearch] = useState(""); const [loading, setLoading] = useState(false); const [selectedSkill, setSelectedSkill] = useState(null); const [action, setAction] = useState<"install" | "analyze" | "clone" | null>(null); const [output, setOutput] = useState(""); const [installing, setInstalling] = useState(false); const searchSkills = useCallback(async (query: string) => { if (!query.trim()) { // Load popular skills setLoading(true); try { const res = await fetch(`/api/clawhub?action=popular`); const data = await res.json(); setSkills(data.skills || []); } catch (e) { console.error(e); } setLoading(false); return; } setLoading(true); try { const res = await fetch(`/api/clawhub?action=search&q=${encodeURIComponent(query)}`); const data = await res.json(); setSkills(data.skills || []); } catch (e) { console.error(e); } setLoading(false); }, []); useEffect(() => { searchSkills(""); }, [searchSkills]); const getSkillDetails = async (slug: string) => { setLoading(true); try { const res = await fetch(`/api/clawhub?action=info&slug=${encodeURIComponent(slug)}`); const data = await res.json(); setSelectedSkill({ ...data, slug }); } catch (e) { console.error(e); } setLoading(false); }; const handleInstall = async () => { if (!selectedSkill) return; setInstalling(true); setOutput("Installing...\n"); try { const res = await fetch(`/api/clawhub`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "install", slug: selectedSkill.slug }), }); const data = await res.json(); setOutput(data.output || data.error || "Done"); } catch (e) { setOutput("Error: " + String(e)); } setInstalling(false); }; const handleAnalyze = async () => { if (!selectedSkill) return; setAction("analyze"); setOutput("Analyzing skill code...\n"); try { const res = await fetch(`/api/clawhub`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "analyze", slug: selectedSkill.slug }), }); const data = await res.json(); setOutput(data.output || data.error || "Analysis complete"); } catch (e) { setOutput("Error: " + String(e)); } setAction(null); }; const handleClone = async () => { if (!selectedSkill) return; setAction("clone"); setOutput("Creating custom version...\n"); try { const res = await fetch(`/api/clawhub`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action: "clone", slug: selectedSkill.slug, name: selectedSkill.name }), }); const data = await res.json(); setOutput(data.output || data.error || "Clone complete"); } catch (e) { setOutput("Error: " + String(e)); } setAction(null); }; return (

🛒 ClawHub Marketplace

Search, install, analyze, and customize skills from ClawHub

setSearch(e.target.value)} onKeyDown={(e) => e.key === "Enter" && searchSkills(search)} placeholder="Search skills..." className="flex-1 bg-slate-800 border border-slate-700 rounded-lg px-4 py-2 text-white placeholder-slate-400 focus:outline-none focus:border-blue-500" />
{/* Skills List */}

Available Skills

{skills.length} skills found

{loading ? (
Loading...
) : skills.length === 0 ? (
No skills found
) : ( skills.map((skill) => ( )) )}
{/* Detail Panel */}

{selectedSkill ? selectedSkill.name : "Select a Skill"}

{selectedSkill && (

@{selectedSkill.slug}

)}
{!selectedSkill ? (
Click a skill to see details
) : (
{selectedSkill.description && (

Description

{selectedSkill.description}

)}
{selectedSkill.version && ( v{selectedSkill.version} )} {selectedSkill.author && ( by {selectedSkill.author} )} {selectedSkill.downloads !== undefined && ( {selectedSkill.downloads} downloads )}
{/* Action Buttons */}
{/* Output */} {output && (

Output

                      {output}
                    
)}
)}
); }