import { createFileRoute } from '@tanstack/react-router' import { useState } from 'react' import { getWikiCategories, getWikiPage, type WikiPage } from '@/wiki' import { Input } from '@/components/ui/input' import { Search, ChevronDown, ChevronRight } from 'lucide-react' export const Route = createFileRoute('/_authenticated/help')({ validateSearch: (search: Record) => ({ page: (search.page as string) || 'getting-started', }), component: HelpPage, }) function renderMarkdown(content: string) { // Simple markdown to HTML — handles headers, bold, lists, tips, notes return content .split('\n\n') .map((block, i) => { const trimmed = block.trim() if (!trimmed) return null // Headers if (trimmed.startsWith('## ')) return

{trimmed.slice(3)}

if (trimmed.startsWith('# ')) return

{trimmed.slice(2)}

// Lists if (trimmed.match(/^\d+\./m) || trimmed.startsWith('- ')) { const items = trimmed.split('\n').filter(Boolean) const isOrdered = items[0].match(/^\d+\./) const Tag = isOrdered ? 'ol' : 'ul' return ( {items.map((item, j) => (
  • {renderInline(item.replace(/^(\d+\.\s*|-\s*)/, ''))}
  • ))}
    ) } // Paragraph return

    {renderInline(trimmed)}

    }) .filter(Boolean) } function renderInline(text: string) { // Bold const parts = text.split(/(\*\*[^*]+\*\*)/) return parts.map((part, i) => { if (part.startsWith('**') && part.endsWith('**')) { return {part.slice(2, -2)} } return part }) } function HelpPage() { const categories = getWikiCategories() const search = Route.useSearch() const navigate = Route.useNavigate() const currentPage = getWikiPage(search.page) const [searchQuery, setSearchQuery] = useState('') const [collapsed, setCollapsed] = useState>({}) const allPages = categories.flatMap((c) => c.pages) const filteredPages = searchQuery ? allPages.filter( (p) => p.title.toLowerCase().includes(searchQuery.toLowerCase()) || p.content.toLowerCase().includes(searchQuery.toLowerCase()), ) : null function goToPage(slug: string) { navigate({ search: { page: slug } }) setSearchQuery('') } function toggleCategory(name: string) { setCollapsed((prev) => ({ ...prev, [name]: !prev[name] })) } return (
    {/* Sidebar */}
    setSearchQuery(e.target.value)} className="pl-9 text-sm" />
    {filteredPages ? ( filteredPages.length === 0 ? (

    No results

    ) : ( filteredPages.map((p) => ( )) ) ) : ( categories.map((cat) => { const isCollapsed = collapsed[cat.name] ?? false return (
    {!isCollapsed && (
    {cat.pages.map((p) => ( ))}
    )}
    ) }) )}
    {/* Content */}
    {currentPage ? (
    {renderMarkdown(currentPage.content)}
    ) : (

    Page not found

    )}
    ) }