import { useState, useCallback, useMemo } from 'react'; import { Header } from '@/components/Header'; import { FilterDropdown } from '@/components/FilterDropdown'; import { SkillList } from '@/components/SkillList'; import { SkillViewer, extractToc, TocItem } from '@/components/SkillViewer'; import { TableOfContents } from '@/components/TableOfContents'; import { useSearch } from '@/hooks/useSearch'; import { SkillsData, Skill } from '@/types/skills'; import skillsData from '@/data/skills.json'; import { getCategoryCounts } from '@/lib/skills-utils'; import { fetchSkillContent } from '@/lib/skills-api'; export function App() { const data = skillsData as SkillsData; const categoryCounts = useMemo(() => getCategoryCounts(data.skills), [data.skills]); const [selectedSkill, setSelectedSkill] = useState(null); const [skillContent, setSkillContent] = useState(null); const [isLoading, setIsLoading] = useState(false); const [query, setQuery] = useState(''); const [category, setCategory] = useState('all'); const { skills, total } = useSearch({ query, category, skills: data.skills, }); const toc: TocItem[] = skillContent ? extractToc(skillContent) : []; const loadSkillContent = useCallback(async (skill: Skill) => { setIsLoading(true); setSkillContent(null); try { const content = await fetchSkillContent(skill); setSkillContent(content); } catch (error) { console.error('Error loading skill:', error); const message = error instanceof Error ? error.message : 'Unknown error'; setSkillContent( `## Failed to load skill\n\n${message}\n\nEnsure the WebUI server is running (\`miokit webui\`) or use \`npm run dev\` from \`miokit-webui/\` for development.` ); } finally { setIsLoading(false); } }, []); const handleSelectSkill = useCallback( (skill: Skill) => { setSelectedSkill(skill); loadSkillContent(skill); }, [loadSkillContent] ); return (
); }