| 53 | }; |
| 54 | |
| 55 | const handleFileSelect = (event: React.ChangeEvent<HTMLInputElement>) => { |
| 56 | const file = event.target.files?.[0]; |
| 57 | logger.info('File selected', { fileName: file?.name, fileType: file?.type, fileSize: file?.size }); |
| 58 | |
| 59 | if (file && file.type.startsWith('image/')) { |
| 60 | logger.info('Valid image file, reading as data URL'); |
| 61 | const reader = new FileReader(); |
| 62 | reader.onload = (e) => { |
| 63 | const result = e.target?.result as string; |
| 64 | logger.info('File reader loaded', { resultLength: result.length, resultPreview: result.substring(0, 100) }); |
| 65 | // Extract base64 data (remove data:image/...;base64, prefix) |
| 66 | const base64Data = result.split(',')[1]; |
| 67 | logger.info('Extracted base64 data', { base64Length: base64Data.length }); |
| 68 | onResponse({ type: 'image', data: base64Data }); |
| 69 | }; |
| 70 | reader.onerror = (error) => { |
| 71 | logger.error('File reader error', error); |
| 72 | }; |
| 73 | reader.readAsDataURL(file); |
| 74 | } else { |
| 75 | logger.warn('Invalid file selected', { fileType: file?.type }); |
| 76 | } |
| 77 | }; |
| 78 | |
| 79 | const handleStartCamera = async () => { |
| 80 | logger.info('Starting camera'); |