import React from 'react'; import type { MergeQueueItem, MergeMode } from '../merge/mergeTypes'; interface MergeQueuePanelProps { items: MergeQueueItem[]; hasCurrentPdf: boolean; currentPdfName: string | null; currentPageCount: number; mergeMode: MergeMode; mergeInsertAt: string; isBusy: boolean; canMerge: boolean; isLoading: boolean; hasErrors: boolean; onMergeModeChange: (mode: MergeMode) => void; onMergeInsertAtChange: (value: string) => void; onMoveUp: (itemId: string) => void; onMoveDown: (itemId: string) => void; onRemove: (itemId: string) => void; onCancel: () => void; onConfirm: () => void; } function formatFileSize(size: number): string { if (size < 1024) return `${size} B`; if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`; return `${(size / (1024 * 1024)).toFixed(1)} MB`; } const MergeQueuePanel: React.FC = ({ items, hasCurrentPdf, currentPdfName, currentPageCount, mergeMode, mergeInsertAt, isBusy, canMerge, isLoading, hasErrors, onMergeModeChange, onMergeInsertAtChange, onMoveUp, onMoveDown, onRemove, onCancel, onConfirm, }) => { const queuedPageCount = items.reduce( (sum, item) => sum + (item.pageCount ?? 0), 0 ); return (

Merge PDF queue

Add several PDFs, reorder the queue, then merge them into a new unsaved workspace. Processing still happens entirely in your browser.

{hasCurrentPdf ? (

Current workspace:{' '} {currentPdfName ?? 'Untitled document'} with{' '} {currentPageCount} {currentPageCount === 1 ? 'page' : 'pages'}.

) : (

No current workspace is open. The queue will become a new workspace.

)}
{items.map((item, index) => (
#{index + 1}
{item.name} {formatFileSize(item.size)} ·{' '} {item.status === 'ready' && item.pageCount != null ? `${item.pageCount} ${item.pageCount === 1 ? 'page' : 'pages'}` : item.status === 'loading' ? 'Loading…' : (item.error ?? 'Error')}
))}

Queue total:{' '} {items.length} {items.length === 1 ? 'PDF' : 'PDFs'} {queuedPageCount > 0 && ( <> {' '} · {queuedPageCount} {queuedPageCount === 1 ? 'page' : 'pages'} )}

{mergeMode === 'overwrite' && hasCurrentPdf && (

Replace mode discards the current in-memory workspace after the merge. Save it first if you want to keep the current state separately.

)} {hasErrors && (

One or more queued files could not be loaded. Remove failed items before merging.

)}
); }; export default MergeQueuePanel;