'use client' import * as React from 'react' import { Download, Upload, FileText, Eye, Code, LayoutGrid, Trash2, Save, Copy, Check, } from 'lucide-react' import { toast } from 'sonner' import { Button } from '@/components/ui/button' import { Separator } from '@/components/ui/separator' import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip' import { EditorProvider, EditorBubbleMenu, EditorFormatBold, EditorFormatItalic, EditorFormatStrike, EditorFormatCode, EditorNodeHeading1, EditorNodeHeading2, EditorNodeHeading3, EditorNodeBulletList, EditorNodeOrderedList, EditorNodeTaskList, EditorNodeQuote, EditorNodeCode, EditorLinkSelector, EditorClearFormatting, type JSONContent, } from '@/components/ui/shadcn-io/editor' import { usePersonalListStore } from '@/lib/personal-list-store' import { cn } from '@/lib/utils' import { PersonalListItems } from './personal-list-items' export function PersonalListEditor() { const { markdown, setMarkdown, activeView, setActiveView, items, generateMarkdown, exportList, importList, clearList, } = usePersonalListStore() const [content, setContent] = React.useState(markdown) const [copied, setCopied] = React.useState(false) const fileInputRef = React.useRef(null) // Update content when markdown changes React.useEffect(() => { setContent(markdown) }, [markdown]) const handleEditorUpdate = React.useCallback( ({ editor }: { editor: any }) => { const md = editor.storage.markdown?.getMarkdown() || editor.getText() setMarkdown(md) }, [setMarkdown] ) const handleExportMarkdown = () => { const md = generateMarkdown() const blob = new Blob([md], { type: 'text/markdown' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = `my-awesome-list-${Date.now()}.md` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) toast.success('Markdown exported successfully!') } const handleExportJSON = () => { const data = exportList() const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json', }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = `my-awesome-list-${Date.now()}.json` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) toast.success('List exported successfully!') } const handleImportJSON = (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (!file) return const reader = new FileReader() reader.onload = (e) => { try { const data = JSON.parse(e.target?.result as string) importList(data) toast.success('List imported successfully!') } catch (error) { toast.error('Failed to import list. Invalid JSON format.') } } reader.readAsText(file) } const handleCopyMarkdown = async () => { const md = generateMarkdown() await navigator.clipboard.writeText(md) setCopied(true) setTimeout(() => setCopied(false), 2000) toast.success('Markdown copied to clipboard!') } const handleClear = () => { if (confirm('Are you sure you want to clear your entire list? This cannot be undone.')) { clearList() toast.success('List cleared successfully!') } } return (
{/* Toolbar */}
{/* View Mode Toggle */} Editor Mode Split View Preview Mode {/* Actions */} Copy Markdown Export Markdown Export JSON Import JSON Clear List
{items.length} {items.length === 1 ? 'item' : 'items'}
{/* Content */}
{/* Editor View */} {(activeView === 'editor' || activeView === 'split') && (
)} {/* Preview/Items View */} {(activeView === 'preview' || activeView === 'split') && (
)}
) }