diff --git a/src/pages/Merge/Merge.jsx b/src/pages/Merge/Merge.jsx index b9df87d..09e5420 100644 --- a/src/pages/Merge/Merge.jsx +++ b/src/pages/Merge/Merge.jsx @@ -1,17 +1,13 @@ import React, { useState, useRef, useCallback, useEffect } from "react"; import { useFileStore } from "../../hooks/useFileStore"; import { - Layers, X, Download, Loader2, Trash2, GripVertical, - Plus, Eye, EyeOff, CheckCircle2, FileText, + Layers, X, Download, Loader2, Trash2, + Plus, CheckCircle2, FileText, } from "lucide-react"; import { motion, AnimatePresence } from "framer-motion"; -import { Button } from "../../components/ui/Button"; -import { UpgradeButton } from "../../components/ui/UpgradeButton"; -import { mergePdfs } from "../../services/pdf.service"; -import { Dropzone } from "../../components/pdf/Dropzone"; -import { formatFileSize } from "../../utils/formatters"; -import { useSubscription } from "../../hooks/useSubscription"; -import { FREE_LIMITS } from "../../config/limits"; +import { Button } from "../../components/ui/Button"; +import { mergePdfs } from "../../services/pdf.service"; +import { Dropzone } from "../../components/pdf/Dropzone"; import * as pdfjsLib from "pdfjs-dist"; pdfjsLib.GlobalWorkerOptions.workerSrc = new URL( @@ -19,7 +15,7 @@ pdfjsLib.GlobalWorkerOptions.workerSrc = new URL( import.meta.url, ).toString(); -// ─── helpers ────────────────────────────────────────────────────────────────── +// ─── helpers ───────────────────────── let _uid = 0; function makeId() { return ++_uid; } @@ -29,443 +25,189 @@ async function renderFirstPage(file) { const pdf = await pdfjsLib.getDocument({ data: buf }).promise; const page = await pdf.getPage(1); const viewport = page.getViewport({ scale: 0.5 }); + const canvas = document.createElement("canvas"); - canvas.width = viewport.width; + canvas.width = viewport.width; canvas.height = viewport.height; - await page.render({ canvasContext: canvas.getContext("2d"), viewport }).promise; + + await page.render({ + canvasContext: canvas.getContext("2d"), + viewport + }).promise; + const url = canvas.toDataURL("image/jpeg", 0.8); - canvas.width = 0; - return { thumb: url, numPages: pdf.numPages }; + return { thumb: url }; } catch { - return { thumb: null, numPages: null }; + return { thumb: null }; } } -// ─── PDF Card ───────────────────────────────────────────────────────────────── -function PdfCard({ item, onRemove, onPreview, onDragStart, onDragEnter, onDragEnd }) { - const [over, setOver] = useState(false); - - return ( - onDragStart(item.id)} - onDragEnter={() => { onDragEnter(item.id); setOver(true); }} - onDragLeave={() => setOver(false)} - onDragOver={(e) => e.preventDefault()} - onDrop={() => { onDragEnd(); setOver(false); }} - className={[ - "relative group flex flex-col items-center gap-2 border rounded-2xl p-2.5 cursor-grab active:cursor-grabbing select-none transition-all duration-150", - over - ? "border-white/40 bg-white/[0.06] scale-[1.02]" - : "bg-zinc-900/60 border-white/[0.06] hover:border-white/20", - ].join(" ")} - > - {/* Order badge */} -
- {item.order} -
- - - - {/* Thumbnail area */} -
- {item.thumb ? ( - {item.name} - ) : item.loadingThumb ? ( -
- - Loading… -
- ) : ( -
- -
- )} - - {/* Page count overlay */} - {item.numPages != null && ( -
- {item.numPages}p -
- )} - - {/* Preview overlay button */} - -
- - {/* Name + size */} -
-

{item.name}

-

{formatFileSize(item.size)}

-
- - {/* Remove */} - -
- ); -} - -// ─── Preview Modal ───────────────────────────────────────────────────────────── -function PreviewModal({ item, onClose }) { - const objectUrl = useRef(null); - const [src, setSrc] = useState(null); - - useEffect(() => { - if (!item) return; - const url = URL.createObjectURL(item.file); - objectUrl.current = url; - setSrc(url); - return () => { URL.revokeObjectURL(url); }; - }, [item]); - - if (!item) return null; - - return ( - - - e.stopPropagation()} - > - {/* Header */} -
-
- - {item.name} - {item.numPages && ( - · {item.numPages} pages - )} -
- -
- - {/* Iframe viewer */} -
- {src ? ( -