"use client"; import { useState, useEffect } from 'react'; import { ArrowLeft, Lock, Trash2 } from 'lucide-react'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; import PaneHeader from './PaneHeader'; import type { BasePaneProps } from './types'; interface GuideMeta { name: string; description: string; immutable: boolean; } interface Guide extends GuideMeta { content: string; } export default function GuidesPane({ slot, isActive, onPaneAction, onCollapse, onSwapPanes, tabBar, }: BasePaneProps) { const [guides, setGuides] = useState([]); const [selectedGuide, setSelectedGuide] = useState(null); const [loading, setLoading] = useState(true); const [deleting, setDeleting] = useState(null); useEffect(() => { fetchGuides(); const handleGuideUpdated = () => { fetchGuides(); }; window.addEventListener('guides:updated', handleGuideUpdated); return () => window.removeEventListener('guides:updated', handleGuideUpdated); }, []); const fetchGuides = async () => { try { const res = await fetch('/api/guides'); const data = await res.json(); if (data.success) { setGuides(data.data); } } catch (err) { console.error('[GuidesPane] Failed to fetch guides:', err); } finally { setLoading(false); } }; const handleSelectGuide = async (name: string) => { try { const res = await fetch(`/api/guides/${encodeURIComponent(name)}`); const data = await res.json(); if (data.success) { setSelectedGuide(data.data); } } catch (err) { console.error('[GuidesPane] Failed to fetch guide:', err); } }; const handleDeleteGuide = async (name: string, e: React.MouseEvent) => { e.stopPropagation(); if (!confirm(`Delete guide "${name}"?`)) return; setDeleting(name); try { const res = await fetch(`/api/guides/${encodeURIComponent(name)}`, { method: 'DELETE' }); const data = await res.json(); if (data.success) { fetchGuides(); if (selectedGuide?.name === name) { setSelectedGuide(null); } } } catch (err) { console.error('[GuidesPane] Failed to delete guide:', err); } finally { setDeleting(null); } }; const handleBack = () => { setSelectedGuide(null); }; const systemGuides = guides.filter(g => g.immutable); const userGuides = guides.filter(g => !g.immutable); return (
{selectedGuide ? (
{selectedGuide.immutable && } {selectedGuide.name}
) : ( {userGuides.length} of 10 custom guides )}
{loading ? (
Loading...
) : selectedGuide ? (
(

{children}

), h2: ({ children }) => (

{children}

), h3: ({ children }) => (

{children}

), p: ({ children }) => (

{children}

), ul: ({ children }) => (
    {children}
), ol: ({ children }) => (
    {children}
), li: ({ children }) => (
  • {children}
  • ), code: ({ className, children, ...props }) => { const isInline = !className; if (isInline) { return ( {children} ); } return ( {children} ); }, pre: ({ children }) => (
    {children}
    ), strong: ({ children }) => ( {children} ), hr: () => (
    ), blockquote: ({ children }) => (
    {children}
    ), }} > {selectedGuide.content}
    ) : (
    {guides.length === 0 ? (
    No guides found
    ) : ( <> {systemGuides.length > 0 && (
    System Guides
    )} {systemGuides.map((guide) => ( ))} {userGuides.length > 0 && (
    Custom Guides
    )} {userGuides.map((guide) => ( ))} )}
    )}
    ); } function GuideCard({ guide, onSelect, onDelete, deleting, }: { guide: GuideMeta; onSelect: (name: string) => void; onDelete: (name: string, e: React.MouseEvent) => void; deleting: string | null; }) { return ( )} ); }