import { useState, useEffect } from 'react'; import { APP_ID } from '../../../api/config'; import { orderBookingClient } from '../../../api/clients'; export function ImagePreview({ file }: { file: any }) { const [url, setUrl] = useState(null); useEffect(() => { if (file instanceof File) { const objectUrl = URL.createObjectURL(file); setUrl(objectUrl); return () => URL.revokeObjectURL(objectUrl); } else if (file && file.uuid) { setUrl(`${orderBookingClient.baseUrl}/app/${APP_ID}/view/files/${file.uuid}/preview`); } else if (typeof file === 'string' && file.startsWith('http')) { setUrl(file); } }, [file]); if (!url) return null; return Preview; } export function FileInput({ label, type, required, value, onChange, }: { label: string; type: 'image' | 'file' | string; required?: boolean; value: File[] | undefined | null | unknown; onChange: (files: File[]) => void; }) { const files = Array.isArray(value) ? value : (value ? [value] : []); const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { const newFiles = Array.from(e.target.files); // Since we only want 1 file, replace the existing one instead of appending onChange(newFiles); } // reset input so the same file can be selected again if needed e.target.value = ''; }; const removeFile = (index: number) => { const newFiles = [...files]; newFiles.splice(index, 1); onChange(newFiles); }; return (
{label} {required && *}
{files.length > 0 && (
{files.map((file, i) => (
{type === 'image' ? ( ) : (
{file.name || file.original_name || 'File'}
)}
))}
)}
); }