"use client"; import { useEffect, useRef, useState } from 'react'; import { ArrowLeft } from 'lucide-react'; import PaneHeader from './PaneHeader'; import type { BasePaneProps } from './types'; import SkillCard from '@/components/skills/SkillCard'; import SkillMarkdown from '@/components/skills/SkillMarkdown'; interface SkillMeta { name: string; description: string; immutable: boolean; } interface Skill extends SkillMeta { content: string; } export default function SkillsPane({ slot, onCollapse, onSwapPanes, tabBar, }: BasePaneProps) { const [skills, setSkills] = useState([]); const [selectedSkill, setSelectedSkill] = useState(null); const [loading, setLoading] = useState(true); const [deleting, setDeleting] = useState(null); const detailScrollRef = useRef(null); useEffect(() => { void fetchSkills(); const handleSkillUpdated = () => { void fetchSkills(); }; window.addEventListener('skills:updated', handleSkillUpdated); window.addEventListener('guides:updated', handleSkillUpdated); return () => { window.removeEventListener('skills:updated', handleSkillUpdated); window.removeEventListener('guides:updated', handleSkillUpdated); }; }, []); useEffect(() => { if (selectedSkill && detailScrollRef.current) { detailScrollRef.current.scrollTo({ top: 0, behavior: 'auto' }); } }, [selectedSkill?.name]); const fetchSkills = async () => { try { const res = await fetch('/api/skills'); const data = await res.json(); if (data.success) { setSkills(data.data); } } catch (err) { console.error('[SkillsPane] Failed to fetch skills:', err); } finally { setLoading(false); } }; const handleSelectSkill = async (name: string) => { try { const res = await fetch(`/api/skills/${encodeURIComponent(name)}`); const data = await res.json(); if (data.success) { setSelectedSkill(data.data); } } catch (err) { console.error('[SkillsPane] Failed to fetch skill:', err); } }; const handleDeleteSkill = async (name: string, e: React.MouseEvent) => { e.stopPropagation(); if (!confirm(`Delete skill "${name}"?`)) return; setDeleting(name); try { const res = await fetch(`/api/skills/${encodeURIComponent(name)}`, { method: 'DELETE' }); const data = await res.json(); if (data.success) { await fetchSkills(); if (selectedSkill?.name === name) { setSelectedSkill(null); } } } catch (err) { console.error('[SkillsPane] Failed to delete skill:', err); } finally { setDeleting(null); } }; return (
{selectedSkill ? (
{selectedSkill.name}
) : ( {skills.length} skills )}
{loading ? (
Loading...
) : selectedSkill ? (
{selectedSkill.name}
{selectedSkill.description}
) : (
{skills.length === 0 ? (
No skills found
) : ( skills.map((skill) => ( )) )}
)}
); }