import { useState } from "react"; import { useTranslation } from "react-i18next"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { ExternalLink, Download, Trash2, Loader2 } from "lucide-react"; import { settingsApi } from "@/lib/api"; import type { Skill } from "@/lib/api/skills"; interface SkillCardProps { skill: Skill; onInstall: (directory: string) => Promise; onUninstall: (directory: string) => Promise; } export function SkillCard({ skill, onInstall, onUninstall }: SkillCardProps) { const { t } = useTranslation(); const [loading, setLoading] = useState(false); const handleInstall = async () => { setLoading(true); try { await onInstall(skill.directory); } finally { setLoading(false); } }; const handleUninstall = async () => { setLoading(true); try { await onUninstall(skill.directory); } finally { setLoading(false); } }; const handleOpenGithub = async () => { if (skill.readmeUrl) { try { await settingsApi.openExternal(skill.readmeUrl); } catch (error) { console.error("Failed to open URL:", error); } } }; const showDirectory = Boolean(skill.directory) && skill.directory.trim().toLowerCase() !== skill.name.trim().toLowerCase(); return (
{skill.name}
{showDirectory && ( {skill.directory} )} {skill.repoOwner && skill.repoName && ( {skill.repoOwner}/{skill.repoName} )}
{skill.installed && ( {t("skills.installed")} )}

{skill.description || t("skills.noDescription")}

{skill.readmeUrl && ( )} {skill.installed ? ( ) : ( )}
); }