/** * T078: Note viewer with rendered markdown, metadata, and backlinks * T081-T082: Wikilink click handling and broken link styling */ import { useMemo } from 'react'; import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; import { Edit, Trash2, Calendar, Tag as TagIcon, ArrowLeft } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { ScrollArea } from '@/components/ui/scroll-area'; import { Separator } from '@/components/ui/separator'; import type { Note } from '@/types/note'; import type { BacklinkResult } from '@/services/api'; import { createWikilinkComponent } from '@/lib/markdown.tsx'; interface NoteViewerProps { note: Note; backlinks: BacklinkResult[]; onEdit?: () => void; onDelete?: () => void; onWikilinkClick: (linkText: string) => void; } export function NoteViewer({ note, backlinks, onEdit, onDelete, onWikilinkClick, }: NoteViewerProps) { // Create custom markdown components with wikilink handler const markdownComponents = useMemo( () => createWikilinkComponent(onWikilinkClick), [onWikilinkClick] ); const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); }; return (
{note.note_path}