import React, { useState, useEffect, useMemo } from 'react'; import { motion } from 'framer-motion'; import { X, Printer, Loader2, GitCommit, FileText } from 'lucide-react'; import { previewProject } from '../../api/client'; import ReactMarkdown from 'react-markdown'; import * as Diff from 'diff'; interface LivePreviewProps { projectId: string; onClose: () => void; } const LivePreview: React.FC = ({ projectId, onClose }) => { const [markdownData, setMarkdownData] = useState(''); const [oldMarkdownData, setOldMarkdownData] = useState(''); const [loading, setLoading] = useState(true); const [viewMode, setViewMode] = useState<'current' | 'diff'>('current'); useEffect(() => { previewProject(projectId).then(res => { setMarkdownData(res.markdown || ''); setOldMarkdownData(res.old_markdown || ''); setLoading(false); }).catch(() => setLoading(false)); }, [projectId]); const handlePrint = () => { window.print(); }; const renderDiff = () => { if (!oldMarkdownData) return {markdownData}; const diffResult = Diff.diffWordsWithSpace(oldMarkdownData, markdownData); return (
{diffResult.map((part, index) => { if (part.added) { return {part.value}; } if (part.removed) { return {part.value}; } return {part.value}; })}
); }; return (
{/* Header */}

Podgląd Głównego Dokumentu

{/* Content */}
{loading ? (
Generowanie pełnego dokumentu wniosku...
) : (
{markdownData ? ( viewMode === 'current' ? {markdownData} : renderDiff() ) : (

Brak połączonych sekcji wniosku. Najpierw wygeneruj sekcje by uzyskać całościowy zarys.

)}
)}
); }; export default LivePreview;