// src/features/flyer/FlyerUploader.tsx import React, { useEffect, useCallback } from 'react'; import { useNavigate, Link } from 'react-router-dom'; import { logger } from '../../services/logger.client'; import { ProcessingStatus } from './ProcessingStatus'; import { useDragAndDrop } from '../../hooks/useDragAndDrop'; import { useFlyerUploader } from '../../hooks/useFlyerUploader'; interface FlyerUploaderProps { onProcessingComplete: () => void; } export const FlyerUploader: React.FC = ({ onProcessingComplete }) => { const navigate = useNavigate(); const { processingState, statusMessage, errorMessage, duplicateFlyerId, processingStages, estimatedTime, currentFile, flyerId, upload, resetUploaderState, } = useFlyerUploader(); useEffect(() => { if (statusMessage) logger.info(`FlyerUploader Status: ${statusMessage}`); }, [statusMessage]); useEffect(() => { if (errorMessage) { logger.error(`[FlyerUploader] Error encountered: ${errorMessage}`, { duplicateFlyerId }); } }, [errorMessage, duplicateFlyerId]); // Handle completion and navigation useEffect(() => { if (processingState === 'completed' && flyerId) { onProcessingComplete(); // Small delay to show the "Complete" state before redirecting const timer = setTimeout(() => { navigate(`/flyers/${flyerId}`); }, 1500); return () => clearTimeout(timer); } }, [processingState, flyerId, onProcessingComplete, navigate]); const handleFileChange = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (file) { upload(file); } event.target.value = ''; }; const onFilesDropped = useCallback( (files: FileList) => { if (files && files.length > 0) { upload(files[0]); } }, [upload], ); const isProcessing = processingState === 'uploading' || processingState === 'polling'; const { isDragging, dropzoneProps } = useDragAndDrop({ onFilesDropped, disabled: isProcessing, }); const borderColor = isDragging ? 'border-brand-primary' : 'border-gray-400 dark:border-gray-600'; const bgColor = isDragging ? 'bg-brand-light/50 dark:bg-brand-dark/20' : 'bg-gray-50/50 dark:bg-gray-800/20'; if (isProcessing || processingState === 'completed' || processingState === 'error') { return (
{/* Display status message if not completed (completed has its own redirect logic) */} {statusMessage && processingState !== 'completed' && (

{statusMessage}

)} {processingState === 'completed' && (

Processing complete! Redirecting to flyer {flyerId}...

)} {errorMessage && (
{duplicateFlyerId ? (

{errorMessage} You can view it here:{' '} Flyer #{duplicateFlyerId}

) : (

{errorMessage}

)}
)} {processingState === 'polling' && ( )} {(processingState === 'error' || processingState === 'completed') && ( )}
); } return (

Upload New Flyer

); };