import React, { useEffect, useRef, useState } from 'react'; import { AdjustContrastParameters } from '../../../hooks/tools/adjustContrast/useAdjustContrastParameters'; import { useThumbnailGeneration } from '../../../hooks/useThumbnailGeneration'; import ObscuredOverlay from '../../shared/ObscuredOverlay'; import { Text } from '@mantine/core'; import { useTranslation } from 'react-i18next'; import { applyAdjustmentsToCanvas } from './utils'; interface Props { file: File | null; parameters: AdjustContrastParameters; } export default function AdjustContrastPreview({ file, parameters }: Props) { const { t } = useTranslation(); const containerRef = useRef(null); const canvasRef = useRef(null); const [thumb, setThumb] = useState(null); const { requestThumbnail } = useThumbnailGeneration(); useEffect(() => { let active = true; const load = async () => { if (!file || file.type !== 'application/pdf') { setThumb(null); return; } const id = `${file.name}:${file.size}:${file.lastModified}:page:1`; const tUrl = await requestThumbnail(id, file, 1); if (active) setThumb(tUrl || null); }; load(); return () => { active = false; }; }, [file, requestThumbnail]); useEffect(() => { const revoked: string | null = null; const render = async () => { if (!thumb || !canvasRef.current) return; const img = new Image(); img.crossOrigin = 'anonymous'; img.src = thumb; await new Promise((resolve, reject) => { img.onload = () => resolve(); img.onerror = () => reject(); }); // Draw thumbnail to a source canvas const src = document.createElement('canvas'); src.width = img.naturalWidth; src.height = img.naturalHeight; const sctx = src.getContext('2d'); if (!sctx) return; sctx.drawImage(img, 0, 0); // Apply accurate pixel adjustments const adjusted = applyAdjustmentsToCanvas(src, parameters); // Draw adjusted onto display canvas const display = canvasRef.current; display.width = adjusted.width; display.height = adjusted.height; const dctx = display.getContext('2d'); if (!dctx) return; dctx.clearRect(0, 0, display.width, display.height); dctx.drawImage(adjusted, 0, 0); }; render(); return () => { if (revoked) URL.revokeObjectURL(revoked); }; }, [thumb, parameters]); return (
{t('common.preview', 'Preview')}
{t('adjustContrast.noPreview', 'Select a PDF to preview')}} borderRadius={6} >
{thumb && ( )}
); }