sera-ai 1.0.13 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useFFmpegConverter.ts","../src/hooks/useAudioRecovery.ts","../src/hooks/useHL7FHIRConverter.ts","../src/hooks/useAudioRecorder.ts","../src/components/Toast.tsx","../src/components/AudioVisualizerImproved.tsx","../src/AudioRecorder.tsx","../src/hooks/useAudioDictation.ts","../src/AudioDictation.tsx","../src/hooks/useAudioCapture.ts","../src/AudioCapture.tsx"],"names":["useState","useCallback","error","useRef","useEffect","React","pRetry","AbortError","isPaused","React4","jsx","Check","AlertCircle","jsxs","XIcon","React5","React6","AlertTriangle","Loader2","Square","Pause","Play","Mic","API_BASE_URL","offset","React7","Fragment","tailwindStyles","stylesInjected","injectTailwindStyles","React9","Download"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAM,qBAAqB,MAAM;AAC/B,EAAA,MAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"index.js","sourcesContent":["import { useState, useCallback } from \"react\";\n\ninterface FFmpegConverterOptions {\n quality?: number;\n bitRate?: number;\n}\n\n// Embedded FFmpeg Worker - no external files needed\nconst createFFmpegWorker = () => {\n const workerCode = `\n let ffmpegModule = null;\n \n const helperFunctions = {\n float32ToWavFile: function(left, sampleRate = 44100) {\n const length = left.length;\n const buffer = new ArrayBuffer(44 + length * 2);\n const view = new DataView(buffer);\n \n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i));\n }\n };\n \n const floatTo16BitPCM = (output, offset, input) => {\n for (let i = 0; i < input.length; i++, offset += 2) {\n const s = Math.max(-1, Math.min(1, input[i]));\n output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);\n }\n };\n \n writeString(0, 'RIFF');\n view.setUint32(4, 36 + length * 2, true);\n writeString(8, 'WAVE');\n writeString(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, 'data');\n view.setUint32(40, length * 2, true);\n \n floatTo16BitPCM(view, 44, left);\n \n return buffer;\n },\n \n processAudioData: function(audioBuffer, options = {}) {\n try {\n const { quality = 1, bitRate = 128000 } = options;\n const float32Array = new Float32Array(audioBuffer);\n const wavBuffer = this.float32ToWavFile(float32Array);\n \n return {\n buffer: wavBuffer,\n size: wavBuffer.byteLength,\n duration: float32Array.length / 44100\n };\n } catch (error) {\n throw new Error('Failed to process audio data: ' + error.message);\n }\n },\n \n removeSilenceFromAudio: function(audioBuffer, options = {}) {\n try {\n const {\n silenceThreshold = 0.005, // Reduced from 0.01 to be less aggressive\n minSilenceDuration = 1.0, // Increased from 0.5 to preserve natural pauses\n sampleRate = 44100\n } = options;\n \n const float32Array = new Float32Array(audioBuffer);\n const minSilenceSamples = Math.floor(minSilenceDuration * sampleRate);\n const result = [];\n \n let silenceStart = -1;\n let silenceLength = 0;\n let totalAudioSamples = 0;\n let totalSilentSamples = 0;\n \n // First pass: analyze audio content\n for (let i = 0; i < float32Array.length; i++) {\n const sample = Math.abs(float32Array[i]);\n if (sample > silenceThreshold) {\n totalAudioSamples++;\n } else {\n totalSilentSamples++;\n }\n }\n \n const audioPercentage = totalAudioSamples / float32Array.length;\n console.log(\\`[AUDIO] Audio content: \\${(audioPercentage * 100).toFixed(2)}%\\`);\n \n // If less than 5% is audio, skip silence removal to prevent over-processing\n if (audioPercentage < 0.05) {\n console.warn('[WARN] Audio content too low, skipping silence removal to preserve speech');\n const wavBuffer = this.float32ToWavFile(float32Array, sampleRate);\n return {\n buffer: wavBuffer,\n size: wavBuffer.byteLength,\n duration: float32Array.length / sampleRate,\n originalDuration: float32Array.length / sampleRate,\n reductionPercentage: 0\n };\n }\n \n // Second pass: remove long silences\n for (let i = 0; i < float32Array.length; i++) {\n const sample = Math.abs(float32Array[i]);\n \n if (sample < silenceThreshold) {\n if (silenceStart === -1) {\n silenceStart = i;\n }\n silenceLength++;\n } else {\n // End of silence detected\n if (silenceStart !== -1) {\n if (silenceLength < minSilenceSamples) {\n // Keep short silences (natural pauses)\n for (let j = silenceStart; j < i; j++) {\n result.push(float32Array[j]);\n }\n } else {\n // Replace long silences with shorter ones (0.3 seconds instead of 0.1)\n const shortSilenceSamples = Math.floor(0.3 * sampleRate);\n for (let j = 0; j < shortSilenceSamples; j++) {\n result.push(0);\n }\n }\n silenceStart = -1;\n silenceLength = 0;\n }\n \n // Add non-silent sample\n result.push(float32Array[i]);\n }\n }\n \n // Handle trailing silence\n if (silenceStart !== -1 && silenceLength >= minSilenceSamples) {\n const shortSilenceSamples = Math.floor(0.3 * sampleRate);\n for (let j = 0; j < shortSilenceSamples; j++) {\n result.push(0);\n }\n } else if (silenceStart !== -1) {\n for (let j = silenceStart; j < float32Array.length; j++) {\n result.push(float32Array[j]);\n }\n }\n \n const processedArray = new Float32Array(result);\n \n // Safety check: ensure we haven't removed too much content\n const reductionPercentage = Math.round((1 - processedArray.length / float32Array.length) * 100);\n if (reductionPercentage > 80) {\n console.warn('[WARN] Excessive silence removal detected, skipping to preserve speech naturalness');\n const wavBuffer = this.float32ToWavFile(float32Array, sampleRate);\n return {\n buffer: wavBuffer,\n size: wavBuffer.byteLength,\n duration: float32Array.length / sampleRate,\n originalDuration: float32Array.length / sampleRate,\n reductionPercentage: 0\n };\n }\n \n const wavBuffer = this.float32ToWavFile(processedArray, sampleRate);\n \n console.log(\\`[SUCCESS] Silence removal complete. Original Duration: \\${(float32Array.length / sampleRate).toFixed(2)}s, Processed Duration: \\${(processedArray.length / sampleRate).toFixed(2)}s, Reduction: \\${reductionPercentage}%\\`);\n \n return {\n buffer: wavBuffer,\n size: wavBuffer.byteLength,\n duration: processedArray.length / sampleRate,\n originalDuration: float32Array.length / sampleRate,\n reductionPercentage: reductionPercentage\n };\n } catch (error) {\n throw new Error('Failed to remove silence: ' + error.message);\n }\n }\n };\n\n self.onmessage = function(e) {\n const { type, audioBuffer, options } = e.data;\n \n if (type === 'convertWav') {\n try {\n self.postMessage({ type: 'progress', data: { progress: 10, message: 'Starting conversion...' } });\n \n const result = helperFunctions.processAudioData(audioBuffer, options);\n \n self.postMessage({ type: 'progress', data: { progress: 50, message: 'Processing audio...' } });\n \n setTimeout(() => {\n self.postMessage({ type: 'progress', data: { progress: 90, message: 'Finalizing...' } });\n \n setTimeout(() => {\n self.postMessage({ \n type: 'complete', \n data: { \n buffer: result.buffer,\n size: result.size,\n duration: result.duration \n } \n });\n }, 100);\n }, 100);\n \n } catch (error) {\n self.postMessage({ \n type: 'error', \n error: error.message || 'Unknown conversion error' \n });\n }\n } else if (type === 'removeSilence') {\n try {\n self.postMessage({ type: 'progress', progress: 10, message: 'Analyzing audio...' });\n \n const result = helperFunctions.removeSilenceFromAudio(audioBuffer, options);\n \n self.postMessage({ type: 'progress', progress: 70, message: 'Removing silence...' });\n \n setTimeout(() => {\n self.postMessage({ type: 'progress', progress: 90, message: 'Finalizing...' });\n \n setTimeout(() => {\n self.postMessage({ \n type: 'complete', \n result: {\n data: result.buffer,\n name: options.fileName || 'processed_audio.wav',\n type: options.fileType || 'audio/wav',\n stats: {\n originalDuration: result.originalDuration,\n processedDuration: result.duration,\n reductionPercentage: result.reductionPercentage,\n originalSize: options.originalSize || 0,\n processedSize: result.size\n }\n }\n });\n }, 100);\n }, 100);\n \n } catch (error) {\n self.postMessage({ \n type: 'error', \n error: error.message || 'Unknown silence removal error' \n });\n }\n } else if (type === 'init') {\n // For compatibility with existing code\n self.postMessage({ type: 'ready' });\n }\n };\n `;\n\n const blob = new Blob([workerCode], { type: \"application/javascript\" });\n return URL.createObjectURL(blob);\n};\n\n// Legacy interface compatibility for existing code\ninterface UseFFmpegConverterReturn {\n ffmpeg: null;\n isLoaded: boolean;\n isConverting: boolean;\n progress: number;\n error: string | null;\n statusMessage: string;\n loadFFmpeg: () => Promise<boolean>;\n convertToWav: (\n audioData: Float32Array,\n sampleRate?: number,\n fileName?: string\n ) => Promise<File | null>;\n removeSilence: (file: File) => Promise<File | null>;\n reset: () => void;\n}\n\nconst useFFmpegConverter = (): UseFFmpegConverterReturn => {\n const [isLoaded, setIsLoaded] = useState(true); // Always loaded since we use embedded worker\n const [isConverting, setIsConverting] = useState(false);\n const [progress, setProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [statusMessage, setStatusMessage] = useState<string>(\"\");\n\n const loadFFmpeg = useCallback(async (): Promise<boolean> => {\n // No loading needed for embedded worker\n setIsLoaded(true);\n return true;\n }, []);\n\n const convertToWav = useCallback(\n async (\n audioData: Float32Array,\n sampleRate: number = 44100,\n fileName: string = \"recording.wav\"\n ): Promise<File | null> => {\n setIsConverting(true);\n setProgress(0);\n setError(null);\n setStatusMessage(\"Converting audio...\");\n\n try {\n // Create worker dynamically\n const workerUrl = createFFmpegWorker();\n const worker = new Worker(workerUrl);\n\n return new Promise<File>((resolve, reject) => {\n worker.onmessage = (e) => {\n const { type, data, error: workerError } = e.data;\n\n if (type === \"progress\") {\n setProgress(data.progress);\n setStatusMessage(data.message || `Converting... ${data.progress}%`);\n } else if (type === \"complete\") {\n setIsConverting(false);\n setProgress(100);\n setStatusMessage(\"Conversion complete\");\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n\n const blob = new Blob([data.buffer], { type: \"audio/wav\" });\n const file = new File([blob], fileName, { type: \"audio/wav\" });\n resolve(file);\n } else if (type === \"error\") {\n setIsConverting(false);\n setError(workerError);\n setStatusMessage(\"Conversion failed\");\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n reject(new Error(workerError));\n }\n };\n\n worker.onerror = (err) => {\n setIsConverting(false);\n setError(\"Worker error occurred\");\n setStatusMessage(\"Conversion failed\");\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n reject(err);\n };\n\n worker.postMessage({\n type: \"convertWav\",\n audioBuffer: audioData.buffer,\n sampleRate,\n options: { quality: 1, bitRate: 128000 },\n });\n });\n } catch (err) {\n setIsConverting(false);\n setError(err instanceof Error ? err.message : \"Unknown error\");\n setStatusMessage(\"Conversion failed\");\n throw err;\n }\n },\n []\n );\n\n const removeSilence = useCallback(async (file: File): Promise<File | null> => {\n // Validate input file\n if (!file) {\n setError(\"No file provided for processing\");\n return null;\n }\n\n // Check file size - 50MB limit\n const maxFileSize = 50 * 1024 * 1024; // 50MB\n if (file.size > maxFileSize) {\n console.warn(`File too large (${file.size} bytes), skipping silence removal`);\n return file; // Return original file\n }\n\n try {\n setIsConverting(true);\n setError(null);\n setProgress(0);\n setStatusMessage(\"Starting audio processing...\");\n\n // Read the file as array buffer\n const arrayBuffer = await file.arrayBuffer();\n \n console.log(`[INFO] Processing WAV file: ${file.size} bytes, name: ${file.name}`);\n\n // Parse WAV file header properly\n const dataView = new DataView(arrayBuffer);\n \n // Validate WAV file format\n const riffSignature = String.fromCharCode(\n dataView.getUint8(0),\n dataView.getUint8(1), \n dataView.getUint8(2),\n dataView.getUint8(3)\n );\n \n if (riffSignature !== 'RIFF') {\n console.error('Invalid WAV file: Missing RIFF header');\n return file; // Return original file\n }\n \n const waveSignature = String.fromCharCode(\n dataView.getUint8(8),\n dataView.getUint8(9),\n dataView.getUint8(10),\n dataView.getUint8(11)\n );\n \n if (waveSignature !== 'WAVE') {\n console.error('Invalid WAV file: Missing WAVE signature');\n return file; // Return original file\n }\n \n // Find the data chunk\n let dataChunkOffset = 12;\n let audioDataStart = -1;\n let audioDataLength = 0;\n \n while (dataChunkOffset < arrayBuffer.byteLength - 8) {\n const chunkId = String.fromCharCode(\n dataView.getUint8(dataChunkOffset),\n dataView.getUint8(dataChunkOffset + 1),\n dataView.getUint8(dataChunkOffset + 2),\n dataView.getUint8(dataChunkOffset + 3)\n );\n \n const chunkSize = dataView.getUint32(dataChunkOffset + 4, true);\n \n if (chunkId === 'data') {\n audioDataStart = dataChunkOffset + 8;\n audioDataLength = chunkSize;\n break;\n }\n \n dataChunkOffset += 8 + chunkSize;\n }\n \n if (audioDataStart === -1) {\n console.error('No audio data chunk found in WAV file');\n return file; // Return original file\n }\n \n console.log(`[AUDIO] Found audio data: start=${audioDataStart}, length=${audioDataLength} bytes`);\n \n // Extract audio data (assuming 16-bit PCM)\n const audioData = new Int16Array(arrayBuffer, audioDataStart, audioDataLength / 2);\n \n // Validate extracted audio data\n if (audioData.length === 0) {\n console.error('No audio data extracted from WAV file');\n return file; // Return original file\n }\n\n // Convert to Float32Array for processing\n const float32Data = new Float32Array(audioData.length);\n let nonZeroCount = 0;\n for (let i = 0; i < audioData.length; i++) {\n float32Data[i] = audioData[i] / 32768; // Convert to -1 to 1 range\n if (Math.abs(float32Data[i]) > 0.001) nonZeroCount++;\n }\n \n const audioPercentage = nonZeroCount / float32Data.length;\n console.log(`[INFO] Audio validation: ${audioData.length} samples, ${nonZeroCount} non-zero samples (${(audioPercentage * 100).toFixed(2)}%)`);\n \n // If very little audio content, skip silence removal\n if (audioPercentage < 0.01) {\n console.warn(`[WARN] Very little audio content (${(audioPercentage * 100).toFixed(2)}%), skipping silence removal`);\n return file;\n }\n\n // Create worker dynamically\n const workerUrl = createFFmpegWorker();\n const worker = new Worker(workerUrl);\n\n return new Promise<File | null>((resolve, reject) => {\n const messageHandler = (e: MessageEvent) => {\n const { type, progress: workerProgress, message, result, error } = e.data;\n\n switch (type) {\n case \"progress\":\n setProgress(workerProgress);\n setStatusMessage(message);\n break;\n\n case \"complete\":\n worker.removeEventListener(\"message\", messageHandler);\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n\n try {\n const processedFile = new File([new Uint8Array(result.data)], result.name, {\n type: result.type,\n });\n\n console.log(\"[INFO] Silence removal + audio compression results:\", result.stats);\n\n setProgress(100);\n setStatusMessage(\"Processing complete!\");\n\n setTimeout(() => {\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n }, 1000);\n\n resolve(processedFile);\n } catch (fileError) {\n console.error(\"Error creating processed file:\", fileError);\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n resolve(file); // Return original file\n }\n break;\n\n case \"error\":\n worker.removeEventListener(\"message\", messageHandler);\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n console.error(\"Worker processing error:\", error);\n setError(`Processing failed: ${error}`);\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n resolve(file); // Return original file instead of failing\n break;\n }\n };\n\n worker.addEventListener(\"message\", messageHandler);\n\n worker.onerror = (workerError) => {\n worker.removeEventListener(\"message\", messageHandler);\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n console.error(\"Worker error during processing:\", workerError);\n setError(\"Worker processing failed\");\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n resolve(file); // Return original file\n };\n\n // Start processing with original command structure\n worker.postMessage({\n type: \"removeSilence\",\n audioBuffer: float32Data.buffer,\n options: {\n silenceThreshold: 0.01, // Amplitude threshold for silence\n minSilenceDuration: 0.5, // Minimum silence duration to remove (seconds)\n sampleRate: 44100, // Assume standard sample rate\n fileName: file.name,\n fileType: file.type,\n originalSize: file.size,\n },\n }); \n console.log(`🚀 Sent ${float32Data.length} samples to silence removal worker`); });\n } catch (err) {\n console.error(\"Worker removeSilence failed:\", err);\n setError(\"Audio processing failed\");\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n return file; // Return original file\n }\n }, []);\n\n const reset = useCallback(() => {\n setIsConverting(false);\n setProgress(0);\n setError(null);\n setStatusMessage(\"\");\n }, []);\n\n return {\n ffmpeg: null,\n isLoaded,\n isConverting,\n progress,\n error,\n statusMessage,\n loadFFmpeg,\n convertToWav,\n removeSilence,\n reset,\n };\n};\n\nexport default useFFmpegConverter;\n","import React, { useCallback, useEffect, useRef } from \"react\";\n\ninterface AudioSession {\n id: string;\n audioChunks: Record<number, string>; // Change from array to object\n metadata: {\n patientId?: number;\n patientName?: string;\n patientHistory?: string;\n speciality: string;\n timestamp: number;\n totalChunks: number;\n completedChunks: number;\n chunkIndices: number[]; // Track which chunks we have\n };\n status: \"recording\" | \"processing\" | \"failed\" | \"completed\";\n retryCount: number;\n lastError?: string;\n}\n\ninterface AudioRecoveryHookReturn {\n createSession: (\n sessionId: string,\n metadata: {\n patientId?: number;\n patientName?: string;\n patientHistory?: string;\n speciality: string;\n }\n ) => Promise<void>;\n appendAudioToSession: (\n sessionId: string,\n audioData: Float32Array,\n sequence: number\n ) => Promise<void>;\n markSessionComplete: (sessionId: string) => Promise<void>;\n markSessionFailed: (sessionId: string, error?: string) => Promise<void>;\n retrySession: (sessionId: string) => Promise<boolean>;\n deleteSession: (sessionId: string) => Promise<void>;\n getFailedSession: () => Promise<AudioSession | null>;\n hasFailedSession: () => Promise<boolean>;\n clearFailedSessions: () => Promise<void>;\n}\n\nconst useAudioRecovery = (\n reprocessSession: (\n audioChunks: Float32Array[],\n metadata: AudioSession[\"metadata\"]\n ) => Promise<void>\n): AudioRecoveryHookReturn => {\n const dbRef = useRef<IDBDatabase | null>(null);\n const workerRef = useRef<Worker | null>(null);\n const pendingOperations = useRef<Map<string, { resolve: Function; reject: Function }>>(new Map());\n\n const DB_NAME = \"AudioSessionDB\";\n const STORE_NAME = \"audioSessions\";\n const DB_VERSION = 1;\n const MAX_RETRY_COUNT = 3;\n\n // Initialize the encoding worker\n const initWorker = useCallback(() => {\n if (!workerRef.current) {\n try {\n workerRef.current = new Worker(\"/audio-encoding-worker.js\");\n\n workerRef.current.onmessage = (e) => {\n const { type, id, result, error, progress, message } = e.data;\n const operation = pendingOperations.current.get(id);\n\n if (!operation) {\n console.warn(`No pending operation found for id: ${id}`);\n return;\n }\n\n switch (type) {\n case \"progress\":\n // Optional: You could emit progress events here\n break;\n\n case \"complete\":\n pendingOperations.current.delete(id);\n operation.resolve(result);\n break;\n\n case \"error\":\n pendingOperations.current.delete(id);\n operation.reject(new Error(error));\n break;\n }\n };\n\n workerRef.current.onerror = (error) => {\n console.error(\"Audio encoding worker error:\", error);\n // Reject all pending operations\n for (const [id, operation] of pendingOperations.current) {\n operation.reject(new Error(\"Worker crashed\"));\n }\n pendingOperations.current.clear();\n workerRef.current = null;\n };\n\n console.log(\"🎵 Audio encoding worker initialized\");\n } catch (error) {\n console.error(\"Failed to initialize audio encoding worker:\", error);\n workerRef.current = null;\n }\n }\n return workerRef.current;\n }, []);\n\n // Encode Float32Array to base64 using worker\n const encodeInWorker = useCallback(\n async (audioData: Float32Array): Promise<string> => {\n const worker = initWorker();\n\n if (!worker) {\n // Fallback to main thread if worker fails\n console.warn(\"Worker not available, falling back to main thread encoding\");\n return float32ArrayToBase64(audioData);\n }\n\n const operationId = `encode_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n return new Promise<string>((resolve, reject) => {\n // Store the operation\n pendingOperations.current.set(operationId, { resolve, reject });\n\n // Set timeout for the operation\n const timeoutId = setTimeout(() => {\n if (pendingOperations.current.has(operationId)) {\n pendingOperations.current.delete(operationId);\n reject(new Error(\"Worker encoding timeout\"));\n }\n }, 10000); // 10 second timeout\n\n // Override resolve/reject to clear timeout\n const originalResolve = resolve;\n const originalReject = reject;\n\n pendingOperations.current.set(operationId, {\n resolve: (result: string) => {\n clearTimeout(timeoutId);\n originalResolve(result);\n },\n reject: (error: Error) => {\n clearTimeout(timeoutId);\n originalReject(error);\n },\n });\n\n // Send work to worker\n worker.postMessage({\n command: \"encodeFloat32ToBase64\",\n id: operationId,\n data: {\n audioData: Array.from(audioData), // Convert to regular array for transfer\n },\n });\n });\n },\n [initWorker]\n );\n\n // Decode base64 to Float32Array using worker\n const decodeInWorker = useCallback(\n async (base64Data: string): Promise<Float32Array> => {\n const worker = initWorker();\n\n if (!worker) {\n // Fallback to main thread if worker fails\n console.warn(\"Worker not available, falling back to main thread decoding\");\n return base64ToFloat32Array(base64Data);\n }\n\n const operationId = `decode_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n return new Promise<Float32Array>((resolve, reject) => {\n // Store the operation\n pendingOperations.current.set(operationId, { resolve, reject });\n\n // Set timeout for the operation\n const timeoutId = setTimeout(() => {\n if (pendingOperations.current.has(operationId)) {\n pendingOperations.current.delete(operationId);\n reject(new Error(\"Worker decoding timeout\"));\n }\n }, 10000); // 10 second timeout\n\n // Override resolve/reject to clear timeout\n const originalResolve = resolve;\n const originalReject = reject;\n\n pendingOperations.current.set(operationId, {\n resolve: (result: number[]) => {\n clearTimeout(timeoutId);\n originalResolve(new Float32Array(result));\n },\n reject: (error: Error) => {\n clearTimeout(timeoutId);\n originalReject(error);\n },\n });\n\n // Send work to worker\n worker.postMessage({\n command: \"decodeBase64ToFloat32\",\n id: operationId,\n data: {\n base64Data,\n },\n });\n });\n },\n [initWorker]\n );\n\n // Initialize IndexedDB\n const initDB = useCallback(async (): Promise<IDBDatabase> => {\n if (dbRef.current) {\n return dbRef.current;\n }\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => {\n console.error(\"Failed to open IndexedDB:\", request.error);\n reject(request.error);\n };\n\n request.onsuccess = () => {\n dbRef.current = request.result;\n resolve(request.result);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n // Create object store if it doesn't exist\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: \"id\" });\n store.createIndex(\"status\", \"status\", { unique: false });\n store.createIndex(\"timestamp\", \"metadata.timestamp\", { unique: false });\n }\n };\n });\n }, []);\n\n // Convert Float32Array to base64\n const float32ArrayToBase64 = useCallback((audioData: Float32Array): string => {\n const buffer = new ArrayBuffer(audioData.length * 4);\n const view = new Float32Array(buffer);\n view.set(audioData);\n\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }, []);\n\n // Convert base64 back to Float32Array\n const base64ToFloat32Array = useCallback((base64: string): Float32Array => {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new Float32Array(bytes.buffer);\n }, []);\n\n // Create new session\n const createSession = useCallback(\n async (\n sessionId: string,\n metadata: {\n patientId?: number;\n patientName?: string;\n speciality: string;\n }\n ): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n const session: AudioSession = {\n id: sessionId,\n audioChunks: [],\n metadata: {\n ...metadata,\n timestamp: Date.now(),\n totalChunks: 0,\n completedChunks: 0,\n chunkIndices: [],\n },\n status: \"recording\",\n retryCount: 0,\n };\n\n await new Promise<void>((resolve, reject) => {\n const request = store.add(session);\n\n request.onsuccess = () => {\n console.log(`Created audio session ${sessionId}`);\n resolve();\n };\n\n request.onerror = () => {\n console.error(\"Failed to create session:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error creating session:\", error);\n throw error;\n }\n },\n [initDB]\n );\n\n const appendAudioToSession = useCallback(\n async (sessionId: string, audioData: Float32Array, sequence: number): Promise<void> => {\n try {\n const base64Audio = await encodeInWorker(audioData);\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n await new Promise<void>((resolve, reject) => {\n const getRequest = store.get(sessionId);\n\n getRequest.onsuccess = () => {\n const session = getRequest.result as AudioSession;\n if (!session) {\n resolve();\n return;\n }\n\n // Use object storage - no sparse arrays!\n const updatedSession = {\n ...session,\n audioChunks: { ...session.audioChunks },\n metadata: { ...session.metadata },\n };\n\n // Simply set the chunk\n updatedSession.audioChunks[sequence] = base64Audio;\n\n // Update metadata\n const chunkIndices = Object.keys(updatedSession.audioChunks)\n .map(Number)\n .sort((a, b) => a - b);\n updatedSession.metadata.chunkIndices = chunkIndices;\n updatedSession.metadata.completedChunks = chunkIndices.length;\n updatedSession.metadata.totalChunks = Math.max(\n updatedSession.metadata.totalChunks,\n sequence + 1\n );\n\n const updateRequest = store.put(updatedSession);\n updateRequest.onsuccess = () => resolve();\n updateRequest.onerror = () => reject(updateRequest.error);\n };\n\n getRequest.onerror = () => reject(getRequest.error);\n });\n } catch (error) {\n console.error(`Failed to append chunk ${sequence}:`, error);\n }\n },\n [initDB, encodeInWorker]\n );\n\n // Update retry to work with object storage\n const retrySession = useCallback(\n async (sessionId: string): Promise<boolean> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readonly\");\n const store = transaction.objectStore(STORE_NAME);\n\n const session = await new Promise<AudioSession>((resolve, reject) => {\n const request = store.get(sessionId);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n if (!session) return false;\n\n // Convert object chunks to ordered array\n const audioChunks: Float32Array[] = [];\n const chunkIndices = Object.keys(session.audioChunks)\n .map(Number)\n .sort((a, b) => a - b);\n\n console.log(\n `Found ${chunkIndices.length} chunks with indices: ${chunkIndices.slice(0, 10)}...`\n );\n\n for (const index of chunkIndices) {\n try {\n const base64Data = session.audioChunks[index];\n const float32Array = await decodeInWorker(base64Data);\n audioChunks.push(float32Array);\n } catch (error) {\n console.error(`Failed to decode chunk ${index}:`, error);\n }\n }\n\n if (audioChunks.length === 0) {\n console.error(\"No valid chunks found\");\n return false;\n }\n\n await reprocessSession(audioChunks, session.metadata);\n return true;\n } catch (error) {\n console.error(\"Retry failed:\", error);\n return false;\n }\n },\n [initDB, decodeInWorker, reprocessSession]\n );\n\n // Mark session as complete and delete it\n const markSessionComplete = useCallback(\n async (sessionId: string): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n await new Promise<void>((resolve, reject) => {\n const request = store.delete(sessionId);\n\n request.onsuccess = () => {\n console.log(`Deleted completed session ${sessionId}`);\n resolve();\n };\n\n request.onerror = () => {\n console.error(\"Failed to delete session:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error marking session complete:\", error);\n throw error;\n }\n },\n [initDB]\n );\n\n // Mark session as failed\n const markSessionFailed = useCallback(\n async (sessionId: string, error?: string): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n // Get existing session\n const getRequest = store.get(sessionId);\n\n await new Promise<void>((resolve, reject) => {\n getRequest.onsuccess = () => {\n const session = getRequest.result as AudioSession;\n\n if (!session) {\n reject(new Error(`Session ${sessionId} not found`));\n return;\n }\n\n // Update session status\n session.status = \"failed\";\n session.lastError = error;\n\n const updateRequest = store.put(session);\n updateRequest.onsuccess = () => {\n console.log(`Marked session ${sessionId} as failed`);\n resolve();\n };\n updateRequest.onerror = () => reject(updateRequest.error);\n };\n\n getRequest.onerror = () => reject(getRequest.error);\n });\n } catch (error) {\n console.error(\"Error marking session failed:\", error);\n throw error;\n }\n },\n [initDB]\n );\n\n // Delete specific session\n const deleteSession = useCallback(\n async (sessionId: string): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n await new Promise<void>((resolve, reject) => {\n const request = store.delete(sessionId);\n\n request.onsuccess = () => {\n console.log(`Deleted session ${sessionId}`);\n resolve();\n };\n\n request.onerror = () => {\n console.error(\"Failed to delete session:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error deleting session:\", error);\n throw error;\n }\n },\n [initDB]\n );\n\n // Get all failed sessions\n const getFailedSession = useCallback(async (): Promise<AudioSession | null> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readonly\");\n const store = transaction.objectStore(STORE_NAME);\n const index = store.index(\"status\");\n\n return new Promise((resolve, reject) => {\n const request = index.getAll(\"failed\");\n\n request.onsuccess = () => {\n resolve(request.result[0]);\n };\n\n request.onerror = () => {\n console.error(\"Failed to get failed sessions:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error getting failed sessions:\", error);\n return null;\n }\n }, [initDB]);\n\n // Check if there are failed sessions\n const hasFailedSession = useCallback(async (): Promise<boolean> => {\n const failedSession = await getFailedSession();\n return !!failedSession;\n }, [getFailedSession]);\n\n // Clear failed sessions\n const clearFailedSessions = useCallback(async (): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n await new Promise<void>((resolve, reject) => {\n const request = store.clear();\n\n request.onsuccess = () => {\n console.log(\"Cleared all audio sessions\");\n resolve();\n };\n\n request.onerror = () => {\n console.error(\"Failed to clear sessions:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error clearing sessions:\", error);\n throw error;\n }\n }, [initDB]);\n\n // Cleanup worker on unmount\n const cleanup = useCallback(() => {\n if (workerRef.current) {\n console.log(\"🧹 Cleaning up audio encoding worker\");\n workerRef.current.terminate();\n workerRef.current = null;\n }\n pendingOperations.current.clear();\n\n if (dbRef.current) {\n dbRef.current.close();\n dbRef.current = null;\n }\n }, []);\n\n // Add cleanup effect\n useEffect(() => {\n return cleanup;\n }, [cleanup]);\n\n return {\n createSession,\n appendAudioToSession,\n markSessionComplete,\n markSessionFailed,\n retrySession,\n deleteSession,\n getFailedSession,\n hasFailedSession,\n clearFailedSessions,\n };\n};\n\nexport default useAudioRecovery;\n","import React, { useState, useCallback } from \"react\";\n\ninterface TranscriptionResponse {\n transcription: string;\n classifiedInfo?: any;\n classification?: any;\n sessionId?: string | null;\n model?: string;\n processingTimes?: {\n transcriptionMs?: number;\n finalChunkProcessingMs?: number;\n totalProcessingMs?: number;\n };\n metadata?: {\n originalFormat: \"hl7\" | \"fhir\" | \"json\";\n processedAt: string;\n };\n}\n\ninterface SpecialitiesResponse {\n specialities?: Array<{\n value: string;\n label: string;\n description: string;\n }>;\n [key: string]: any;\n}\n\ninterface ApiResponse<T = any> {\n data?: T;\n [key: string]: any;\n}\n\ninterface HL7Segment {\n type: string;\n fields: string[];\n}\n\ninterface FHIRResource {\n resourceType: string;\n id?: string;\n text?: {\n status: string;\n div: string;\n };\n [key: string]: any;\n}\n\ninterface LoginResponse {\n user: {\n id: number;\n username: string;\n user_type: string[];\n };\n token: string;\n expiresAt: string;\n refreshToken: string;\n refreshTokenExpiresAt?: string;\n}\n\n// Add new interface for transcription request\ninterface TranscriptionRequest {\n sessionId?: string;\n model: string;\n doctorName: string;\n patientName: string;\n patientId?: number;\n removeSilence: boolean;\n skipDiarization: boolean;\n isFinalChunk: boolean;\n isPaused: boolean;\n userId?: number;\n sequence: number;\n speciality: string;\n retry?: boolean;\n}\n\n// Add new interfaces for dictation\ninterface DictationRequest {\n doctorName?: string;\n patientId?: string;\n sessionId?: string;\n language?: string;\n specialty?: string;\n [key: string]: any;\n}\n\ninterface DictationResponse {\n dictation: string;\n sessionId?: string | null;\n confidence?: number;\n language?: string;\n processingTimes?: {\n transcriptionMs?: number;\n totalProcessingMs?: number;\n // Add new fields for the dictation response\n audioSizeMB?: number;\n requestTimestamp?: number;\n processedAt?: string;\n dictationType?: string;\n };\n [key: string]: any;\n}\n\n// Add new interfaces for API Keys\ninterface ApiKeyRequest {\n id?: number;\n name?: string;\n type?: string;\n status?: string;\n user_id?: number;\n is_default?: boolean;\n [key: string]: any;\n}\n\ninterface ApiKeyResponse {\n id: number;\n key: string;\n name?: string;\n type?: string;\n status?: string;\n created_at: string;\n user_id: number;\n is_default: boolean;\n [key: string]: any;\n}\n\ninterface UseHL7FHIRConverterReturn {\n // Transcription-specific methods (keep as FormData for audio uploads)\n convertTranscriptionResponse: (\n response: any,\n format?: \"hl7\" | \"fhir\" | \"json\"\n ) => TranscriptionResponse;\n\n // Request formatting methods (audio uploads - keep as FormData)\n createHL7TranscriptionRequest: (audioFile: File, requestData: TranscriptionRequest) => FormData;\n createFHIRTranscriptionRequest: (audioFile: File, requestData: TranscriptionRequest) => FormData;\n\n // Dictation-specific methods\n createHL7DictationRequest: (audioFile: File, requestData: DictationRequest) => FormData;\n createFHIRDictationRequest: (audioFile: File, requestData: DictationRequest) => FormData;\n convertDictationResponse: (\n response: any,\n format?: \"hl7\" | \"fhir\" | \"json\" | \"auto\"\n ) => DictationResponse;\n convertHL7DictationToJson: (hl7Data: string) => DictationResponse;\n convertFHIRDictationToJson: (fhirData: any) => DictationResponse;\n\n isConverting: boolean;\n conversionError: string | null;\n clearError: () => void;\n}\n\nexport const useHL7FHIRConverter = (): UseHL7FHIRConverterReturn => {\n const [isConverting, setIsConverting] = useState(false);\n const [conversionError, setConversionError] = useState<string | null>(null);\n\n // Helper function to detect response format\n const detectFormat = useCallback((response: any): \"hl7\" | \"fhir\" | \"json\" => {\n // Check if it's a string that looks like HL7\n if (typeof response === \"string\") {\n if (\n response.startsWith(\"MSH|\") ||\n response.includes(\"\\rMSH|\") ||\n response.includes(\"\\nMSH|\") ||\n response.match(/^[A-Z]{3}\\|/)\n ) {\n return \"hl7\";\n }\n }\n\n // Check if it's FHIR format\n if (typeof response === \"object\" && response !== null) {\n if (\n response.resourceType ||\n (response.entry && Array.isArray(response.entry)) ||\n (response.resource && response.resource.resourceType)\n ) {\n return \"fhir\";\n }\n }\n\n return \"json\";\n }, []);\n\n // Helper function to unescape HL7 encoded text\n const unescapeHL7 = useCallback((text: string): string => {\n return text\n .replace(/\\\\E\\\\/g, \"\\\\\") // Escape character\n .replace(/\\\\F\\\\/g, \"|\") // Field separator\n .replace(/\\\\C\\\\/g, \"^\") // Component separator\n .replace(/\\\\R\\\\/g, \"~\") // Repetition separator\n .replace(/\\\\S\\\\/g, \"&\") // Escape & encoding\n .replace(/\\\\T\\\\/g, \"\\n\") // Newline\n .replace(/\\\\X0A\\\\/g, \"\\n\") // Hex newline\n .replace(/\\\\X0D\\\\/g, \"\\r\"); // Hex carriage return\n }, []);\n\n // Helper function to escape HL7 text\n const escapeHL7 = useCallback((text: string): string => {\n return text\n .replace(/\\\\/g, \"\\\\E\\\\\") // Escape character\n .replace(/\\|/g, \"\\\\F\\\\\") // Field separator\n .replace(/\\^/g, \"\\\\S\\\\\") // Component separator\n .replace(/~/g, \"\\\\R\\\\\") // Repetition separator\n .replace(/&/g, \"\\\\T\\\\\") // Escape & encoding\n .replace(/\\n/g, \"\\\\X0A\\\\\") // Newline\n .replace(/\\r/g, \"\\\\X0D\\\\\"); // Carriage return\n }, []);\n\n // Parse HL7 message into segments\n const parseHL7 = useCallback((hl7String: string): HL7Segment[] => {\n const segments: HL7Segment[] = [];\n const lines = hl7String.split(/[\\r\\n]+/);\n\n for (const line of lines) {\n if (line.trim()) {\n const fields = line.split(\"|\");\n if (fields.length > 0) {\n segments.push({\n type: fields[0],\n fields: fields.slice(1),\n });\n }\n }\n }\n\n return segments;\n }, []);\n\n // Convert HL7 transcription response to JSON\n const convertHL7TranscriptionToJson = useCallback(\n (hl7Data: string): TranscriptionResponse => {\n try {\n const segments = parseHL7(hl7Data);\n let transcription = \"\";\n let classifiedInfo: any = {};\n let sessionId = \"\";\n let metadata: any = {};\n let speciality: string = \"\";\n\n console.log(\"Parsing HL7 transcription segments:\", segments);\n\n for (const segment of segments) {\n switch (segment.type) {\n case \"MSH\": // Message Header\n if (segment.fields.length >= 10) {\n sessionId = segment.fields[9];\n }\n break;\n\n case \"TXA\": // Document Header\n if (segment.fields.length >= 2) {\n const docSessionId = segment.fields[1];\n if (docSessionId && docSessionId !== sessionId) {\n sessionId = docSessionId;\n }\n }\n break;\n\n case \"OBX\": // Observation/Result\n if (segment.fields.length >= 5) {\n const observationId = segment.fields[2];\n const observationValue = segment.fields[4];\n\n // Handle transcription content\n if (observationId?.includes(\"TRANSCRIPTION^\")) {\n const unescapedTranscription = unescapeHL7(observationValue || \"\");\n transcription += (transcription ? \"\\n\" : \"\") + unescapedTranscription;\n }\n // Handle classification data\n else if (observationId?.includes(\"^\")) {\n const fieldParts = observationId.split(\"^\");\n const fieldKey = fieldParts[1] || fieldParts[0];\n const cleanFieldKey = fieldKey.replace(/Part \\d+$/, \"\").trim();\n\n if (!classifiedInfo[cleanFieldKey]) {\n classifiedInfo[cleanFieldKey] = [];\n }\n\n let processedValue = observationValue || \"\";\n if (observationId.includes(\"ICD10\") && processedValue.includes(\"^\")) {\n processedValue = processedValue.split(\"^\")[0];\n }\n\n processedValue = unescapeHL7(processedValue);\n classifiedInfo[cleanFieldKey].push(processedValue);\n }\n // Handle direct classification JSON (legacy support)\n else if (observationId === \"CLASSIFICATION^Medical Classification\") {\n try {\n const classificationJson = unescapeHL7(observationValue || \"\");\n const parsedClassification = JSON.parse(classificationJson);\n Object.assign(classifiedInfo, parsedClassification);\n } catch (e) {\n console.error(\"Failed to parse classification JSON:\", e);\n }\n }\n }\n break;\n\n case \"NTE\": // Notes and Comments\n if (segment.fields.length >= 3) {\n const noteText = segment.fields[2];\n\n if (noteText?.startsWith(\"PROCESSING_METADATA:\")) {\n const metadataText = noteText.substring(\"PROCESSING_METADATA: \".length);\n const parts = metadataText.split(\", \");\n for (const part of parts) {\n const colonIndex = part.indexOf(\": \");\n if (colonIndex > 0) {\n const key = part.substring(0, colonIndex).trim();\n const value = part.substring(colonIndex + 2).trim();\n\n if (key === \"Model\") {\n metadata.model = value;\n } else if (key === \"Transcription\") {\n metadata.transcriptionMs = parseInt(value.replace(\"ms\", \"\"));\n } else if (key === \"Total\") {\n metadata.totalProcessingMs = parseInt(value.replace(\"ms\", \"\"));\n }\n }\n }\n }\n }\n break;\n }\n }\n\n const finalClassifiedInfo = {\n speciality: speciality,\n classifiedInfo: classifiedInfo,\n generatedAt: new Date().toISOString(),\n };\n\n return {\n transcription: transcription || \"No transcription found in HL7 message\",\n classifiedInfo: finalClassifiedInfo,\n sessionId: sessionId,\n model: metadata.model,\n processingTimes: {\n transcriptionMs: metadata.transcriptionMs,\n finalChunkProcessingMs: metadata.finalChunkProcessingMs,\n totalProcessingMs: metadata.totalProcessingMs,\n },\n metadata: {\n originalFormat: \"hl7\",\n processedAt: new Date().toISOString(),\n },\n };\n } catch (error) {\n console.error(\"HL7 transcription conversion error:\", error);\n throw new Error(\n `Failed to convert HL7 transcription data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n },\n [parseHL7, unescapeHL7]\n );\n\n // Convert HL7 specialities response to JSON\n const convertHL7SpecialitiesToJson = useCallback(\n (hl7Data: string): SpecialitiesResponse => {\n try {\n const segments = parseHL7(hl7Data);\n const specialities: Array<{ value: string; label: string; description: string }> = [];\n\n console.log(\"Parsing HL7 specialities segments:\", segments);\n\n // Track current speciality being built\n let currentSpeciality: { value: string; label: string; description: string } | null = null;\n\n for (const segment of segments) {\n switch (segment.type) {\n case \"OBX\": // Observation/Result\n if (segment.fields.length >= 5) {\n const observationId = segment.fields[2]; // Field 3 (0-indexed as 2)\n const observationValue = segment.fields[4]; // Field 5 (0-indexed as 4)\n\n // Handle speciality entry: SPECIALITY^Medical Speciality\n if (observationId?.includes(\"SPECIALITY^Medical Speciality\")) {\n // If we have a previous speciality without description, add it with label as description\n if (currentSpeciality) {\n if (!currentSpeciality.description) {\n currentSpeciality.description = currentSpeciality.label;\n }\n specialities.push(currentSpeciality);\n }\n\n // Parse the new speciality from format: value^label^source\n if (observationValue) {\n const parts = observationValue.split(\"^\");\n if (parts.length >= 2) {\n currentSpeciality = {\n value: unescapeHL7(parts[0]),\n label: unescapeHL7(parts[1]),\n description: \"\", // Will be filled by next SPEC_DESC segment\n };\n }\n }\n }\n // Handle description entry: SPEC_DESC^Speciality Description\n else if (observationId?.includes(\"SPEC_DESC^Speciality Description\")) {\n if (currentSpeciality && observationValue) {\n currentSpeciality.description = unescapeHL7(observationValue);\n // Add the complete speciality to the array\n specialities.push(currentSpeciality);\n currentSpeciality = null; // Reset for next speciality\n }\n }\n // Handle legacy format (single OBX with JSON data) - keep for backward compatibility\n else if (observationId?.includes(\"SPECIALITIES^\")) {\n try {\n const unescapedValue = unescapeHL7(observationValue || \"\");\n const specialityData = JSON.parse(unescapedValue);\n\n if (Array.isArray(specialityData)) {\n specialities.push(...specialityData);\n } else if (specialityData.value && specialityData.label) {\n specialities.push(specialityData);\n }\n } catch (e) {\n console.error(\"Failed to parse legacy specialities JSON data:\", e);\n }\n }\n }\n break;\n }\n }\n\n // Add any remaining speciality that didn't have a description\n if (currentSpeciality) {\n if (!currentSpeciality.description) {\n currentSpeciality.description = currentSpeciality.label;\n }\n specialities.push(currentSpeciality);\n }\n\n console.log(\"Parsed specialities:\", specialities);\n return { specialities };\n } catch (error) {\n console.error(\"HL7 specialities conversion error:\", error);\n throw new Error(\n `Failed to convert HL7 specialities data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n },\n [parseHL7, unescapeHL7]\n );\n\n // Convert FHIR transcription response to JSON\n const convertFHIRTranscriptionToJson = useCallback((fhirData: any): TranscriptionResponse => {\n try {\n let transcription = \"\";\n let classification: any = {};\n let classifiedInfo: any = null;\n let sessionId = \"\";\n\n // Handle different FHIR structures\n let resources: FHIRResource[] = [];\n\n if (fhirData.resourceType === \"Bundle\" && fhirData.entry) {\n resources = fhirData.entry.map((entry: any) => entry.resource);\n } else if (fhirData.resourceType) {\n resources = [fhirData];\n } else if (fhirData.resource) {\n resources = [fhirData.resource];\n }\n\n for (let i = 0; i < resources.length; i++) {\n const resource = resources[i];\n\n if (!resource || !resource.resourceType) continue;\n\n switch (resource.resourceType) {\n case \"DocumentReference\":\n if (resource.content && resource.content[0]?.attachment?.data) {\n try {\n transcription += atob(resource.content[0].attachment.data);\n } catch {\n transcription += resource.content[0].attachment.url || \"\";\n }\n }\n if (resource.description) {\n transcription += (transcription ? \"\\n\" : \"\") + resource.description;\n }\n break;\n\n case \"DiagnosticReport\":\n // Extract medical classification from conclusion field\n if (resource.conclusion) {\n try {\n // The conclusion contains JSON string with medical classification\n const conclusionData = JSON.parse(resource.conclusion);\n\n // Store the full classified info\n classifiedInfo = conclusionData;\n\n // Also populate classification for backward compatibility\n if (conclusionData.classifiedInfo) {\n classification = conclusionData.classifiedInfo;\n }\n } catch (parseError) {\n console.error(\"❌ Failed to parse DiagnosticReport conclusion:\", parseError);\n console.log(\"Raw conclusion:\", resource.conclusion);\n\n // Fallback: store as string if parsing fails\n if (!classification[\"Clinical Summary\"]) {\n classification[\"Clinical Summary\"] = [];\n }\n classification[\"Clinical Summary\"].push(resource.conclusion);\n }\n }\n break;\n\n case \"Condition\":\n if (resource.code?.text || resource.code?.coding?.[0]?.display) {\n if (!classification[\"Diagnosis\"]) {\n classification[\"Diagnosis\"] = [];\n }\n const diagnosis = resource.code.text || resource.code.coding[0].display;\n classification[\"Diagnosis\"].push(diagnosis);\n }\n break;\n\n case \"Composition\":\n // Extract transcription text from section array\n if (\n resource.section &&\n Array.isArray(resource.section) &&\n resource.section.length > 0\n ) {\n console.log(`📄 Processing ${resource.section.length} sections...`);\n for (const section of resource.section) {\n // Only extract text from \"Transcription\" section, not \"Medical Classification\"\n if (section.title === \"Transcription\" && section.text?.div) {\n const textContent = section.text.div.replace(/<[^>]*>/g, \"\");\n transcription += (transcription ? \"\\n\" : \"\") + textContent;\n console.log(`✅ Extracted transcription text (${textContent.length} chars)`);\n } else if (section.title === \"Medical Classification\") {\n console.log(\n \"ℹ️ Skipping Medical Classification section (handled by DiagnosticReport)\"\n );\n }\n }\n }\n // Fallback to resource.text.div if no sections found\n else if (resource.text?.div) {\n const textContent = resource.text.div.replace(/<[^>]*>/g, \"\");\n transcription += (transcription ? \"\\n\" : \"\") + textContent;\n }\n\n if (resource.identifier) {\n // Handle both single identifier object and array of identifiers\n const identifiers = Array.isArray(resource.identifier)\n ? resource.identifier\n : [resource.identifier];\n\n console.log(`📋 Found ${identifiers.length} identifier(s)`);\n\n for (let j = 0; j < identifiers.length; j++) {\n const identifier = identifiers[j];\n console.log(` [${j}] system: ${identifier.system}, value: ${identifier.value}`);\n\n if (\n identifier.system === \"http://nuxera.ai/session-identifier\" &&\n identifier.value\n ) {\n sessionId = identifier.value;\n break;\n }\n }\n }\n\n // 🔥 PRIORITY 2: Fallback to Composition.id if no session identifier found\n if (!sessionId && resource.id) {\n sessionId = resource.id;\n console.log(\n \"⚠️ [Priority 2] Using Composition.id as fallback session ID:\",\n sessionId\n );\n }\n break;\n\n case \"Task\":\n // Check Task.identifier for session ID (lower priority, for backward compatibility)\n if (!sessionId && resource.identifier && Array.isArray(resource.identifier)) {\n for (const identifier of resource.identifier) {\n if (identifier.system === \"http://nuxera.ai/session-id\" && identifier.value) {\n sessionId = identifier.value;\n console.log(\n \"✅ [Priority 3] Extracted session ID from Task.identifier:\",\n sessionId\n );\n break;\n }\n }\n }\n break;\n }\n }\n\n // 🔥 PRIORITY 4: Check Bundle.identifier only if we still don't have a session ID\n if (!sessionId && fhirData.resourceType === \"Bundle\" && fhirData.identifier?.value) {\n sessionId = fhirData.identifier.value;\n console.log(\"⚠️ [Priority 4] Using Bundle.identifier as last resort:\", sessionId);\n }\n\n // 🔥 PRIORITY 5: Use Bundle.id as absolute last resort\n if (!sessionId && fhirData.resourceType === \"Bundle\" && fhirData.id) {\n sessionId = fhirData.id;\n console.log(\"⚠️ [Priority 5] Using Bundle.id as absolute last resort:\", sessionId);\n }\n\n // Final fallback - generate session ID if still empty\n if (!sessionId) {\n sessionId = `session_${Date.now()}`;\n console.warn(\"⚠️⚠️ No session ID found in FHIR response, generated:\", sessionId);\n }\n\n return {\n transcription: transcription || \"No transcription found in FHIR data\",\n classification,\n classifiedInfo: classifiedInfo,\n sessionId: sessionId,\n metadata: {\n originalFormat: \"fhir\",\n processedAt: new Date().toISOString(),\n },\n };\n } catch (error) {\n console.error(\"❌ FHIR transcription conversion error:\", error);\n throw new Error(\n `Failed to convert FHIR transcription data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n }, []);\n\n // Transcription-specific converter\n const convertTranscriptionResponse = useCallback(\n (response: any, format: \"auto\" | \"hl7\" | \"fhir\" | \"json\" = \"auto\"): TranscriptionResponse => {\n setIsConverting(true);\n setConversionError(null);\n\n try {\n let detectedFormat = format;\n\n if (format === \"auto\") {\n detectedFormat = detectFormat(response);\n }\n\n let result: TranscriptionResponse;\n\n switch (detectedFormat) {\n case \"hl7\":\n result = convertHL7TranscriptionToJson(\n typeof response === \"string\" ? response : JSON.stringify(response)\n );\n break;\n\n case \"fhir\":\n result = convertFHIRTranscriptionToJson(response);\n break;\n\n case \"json\":\n default:\n const transcription = response.transcription || response.text || \"\";\n const sessionId = response.sessionId || `session_${Date.now()}`;\n\n result = {\n transcription: transcription,\n classifiedInfo: response.classifiedInfo,\n sessionId: sessionId,\n model: response.model,\n processingTimes: { ...response.processingTimes },\n metadata: {\n originalFormat: \"json\",\n processedAt: new Date().toISOString(),\n },\n };\n break;\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown conversion error\";\n setConversionError(errorMessage);\n console.error(\"Transcription conversion failed:\", error);\n\n return {\n transcription: \"Conversion failed - see raw response\",\n classification: { \"Conversion Error\": [errorMessage] },\n sessionId: `error_session_${Date.now()}`,\n metadata: {\n originalFormat: \"json\",\n processedAt: new Date().toISOString(),\n },\n };\n } finally {\n setIsConverting(false);\n }\n },\n [detectFormat, convertHL7TranscriptionToJson, convertFHIRTranscriptionToJson]\n );\n\n // Create HL7-formatted transcription request\n const createHL7TranscriptionRequest = useCallback(\n (audioFile: File, requestData: TranscriptionRequest): FormData => {\n const timestamp = new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"\");\n const messageControlId = `${Date.now()}${Math.random().toString(36).substr(2, 9)}`;\n\n // Build HL7 message\n const hl7Lines: string[] = [];\n\n // MSH - Message Header\n hl7Lines.push(\n `MSH|^~\\\\&|Nuxera-Client|CLIENT_FACILITY|Nuxera-Transcribe|Nuxera|${timestamp}||ORU^R01^ORU_R01|${messageControlId}|P|2.5`\n );\n\n // PID - Patient Identification\n const escapedPatientName = escapeHL7(requestData.patientName || \"Unknown Patient\");\n hl7Lines.push(\n `PID|1||${requestData.patientId || \"\"}||${escapedPatientName}^||${timestamp}|U||||||||||${\n requestData.userId || \"\"\n }|||||||||||||||`\n );\n\n // OBR - Observation Request\n hl7Lines.push(\n `OBR|1|${messageControlId}||TRANSCRIPTION^Audio Transcription Request|||${timestamp}||||||||${timestamp}|||F`\n );\n\n let obxSequence = 1;\n\n // OBX segments for request parameters\n if (requestData.sessionId) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|SESSION_ID^Session Identifier||${escapeHL7(\n requestData.sessionId\n )}|||||F|||${timestamp}`\n );\n }\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|MODEL^Transcription Model||${escapeHL7(\n requestData.model\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|DOCTOR_NAME^Doctor Name||${escapeHL7(\n requestData.doctorName\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|SPECIALITY^Medical Speciality||${escapeHL7(\n requestData.speciality\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|SEQUENCE^Sequence Number||${\n requestData.sequence\n }|||||F|||${timestamp}`\n );\n\n // Boolean parameters\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|REMOVE_SILENCE^Remove Silence||${\n requestData.removeSilence ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|SKIP_DIARIZATION^Skip Diarization||${\n requestData.skipDiarization ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|IS_FINAL^Final Chunk||${\n requestData.isFinalChunk ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|IS_PAUSED^Paused Chunk||${\n requestData.isPaused ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n\n if (requestData.retry) {\n hl7Lines.push(`OBX|${obxSequence++}|CWE|RETRY^Retry Request||Y^Yes|||||F|||${timestamp}`);\n }\n\n // Audio file metadata\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|AUDIO_FILENAME^Audio File Name||${escapeHL7(\n audioFile.name\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|AUDIO_SIZE^Audio File Size||${audioFile.size}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|AUDIO_TYPE^Audio File Type||${escapeHL7(\n audioFile.type\n )}|||||F|||${timestamp}`\n );\n\n // Join all lines with \\r\\n for proper HL7 format\n const hl7Message = hl7Lines.join(\"\\r\\n\") + \"\\r\\n\";\n\n console.log(\"Constructed HL7 Transcription Request:\\n\", hl7Message);\n\n // Create FormData with HL7 message and audio file\n const formData = new FormData();\n\n // Add the HL7 message as the request body\n const hl7Blob = new Blob([hl7Message], { type: \"text/plain\" });\n formData.append(\"hl7_request\", hl7Blob, \"transcription_request.hl7\");\n\n // Add the audio file\n formData.append(\"audio\", audioFile);\n\n return formData;\n },\n [escapeHL7]\n );\n\n // Create FHIR-formatted transcription request\n const createFHIRTranscriptionRequest = useCallback(\n (audioFile: File, requestData: TranscriptionRequest): FormData => {\n const timestamp = new Date().toISOString();\n const requestId = `transcription-request-${Date.now()}`;\n\n // Build FHIR Bundle\n const fhirBundle = {\n resourceType: \"Bundle\",\n id: requestId,\n timestamp: timestamp,\n type: \"message\",\n entry: [\n // MessageHeader\n {\n fullUrl: `urn:uuid:${requestId}-header`,\n resource: {\n resourceType: \"MessageHeader\",\n id: `${requestId}-header`,\n timestamp: timestamp,\n eventCoding: {\n system: \"http://nuxera.ai/events\",\n code: \"transcription-request\",\n display: \"Audio Transcription Request\",\n },\n source: {\n name: \"Nuxera Client\",\n endpoint: \"http://nuxera.ai/client\",\n },\n destination: [\n {\n name: \"Nuxera Transcription Service\",\n endpoint: \"http://nuxera.ai/transcription\",\n },\n ],\n focus: [\n {\n reference: `urn:uuid:${requestId}-task`,\n },\n ],\n },\n },\n\n // Patient\n {\n fullUrl: `urn:uuid:${requestId}-patient`,\n resource: {\n resourceType: \"Patient\",\n id: `${requestId}-patient`,\n identifier: requestData.patientId\n ? [\n {\n system: \"http://nuxera.ai/patient-id\",\n value: requestData.patientId.toString(),\n },\n ]\n : [],\n name: [\n {\n family: requestData.patientName || \"Unknown\",\n given: [\"Patient\"],\n },\n ],\n },\n },\n\n // Practitioner (Doctor)\n {\n fullUrl: `urn:uuid:${requestId}-practitioner`,\n resource: {\n resourceType: \"Practitioner\",\n id: `${requestId}-practitioner`,\n name: [\n {\n family: requestData.doctorName,\n given: [\"Dr.\"],\n },\n ],\n qualification: [\n {\n code: {\n coding: [\n {\n system: \"http://nuxera.ai/specialities\",\n code: requestData.speciality,\n display: requestData.speciality.replace(/_/g, \" \"),\n },\n ],\n },\n },\n ],\n },\n },\n\n // Task (Transcription Request)\n {\n fullUrl: `urn:uuid:${requestId}-task`,\n resource: {\n resourceType: \"Task\",\n id: `${requestId}-task`,\n status: \"requested\",\n intent: \"order\",\n code: {\n coding: [\n {\n system: \"http://nuxera.ai/task-codes\",\n code: \"audio-transcription\",\n display: \"Audio Transcription\",\n },\n ],\n },\n for: {\n reference: `urn:uuid:${requestId}-patient`,\n },\n requester: {\n reference: `urn:uuid:${requestId}-practitioner`,\n },\n authoredOn: timestamp,\n input: [\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"transcription-model\",\n },\n ],\n },\n valueString: requestData.model,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"sequence-number\",\n },\n ],\n },\n valueInteger: requestData.sequence,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"remove-silence\",\n },\n ],\n },\n valueBoolean: requestData.removeSilence,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"skip-diarization\",\n },\n ],\n },\n valueBoolean: requestData.skipDiarization,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"is-final-chunk\",\n },\n ],\n },\n valueBoolean: requestData.isFinalChunk,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"is-paused\",\n },\n ],\n },\n valueBoolean: requestData.isPaused,\n },\n ],\n },\n },\n\n // DocumentReference (Audio File)\n {\n fullUrl: `urn:uuid:${requestId}-audio`,\n resource: {\n resourceType: \"DocumentReference\",\n id: `${requestId}-audio`,\n status: \"current\",\n type: {\n coding: [\n {\n system: \"http://loinc.org\",\n code: \"11502-2\",\n display: \"Audio recording\",\n },\n ],\n },\n subject: {\n reference: `urn:uuid:${requestId}-patient`,\n },\n date: timestamp,\n content: [\n {\n attachment: {\n contentType: audioFile.type,\n size: audioFile.size,\n title: audioFile.name,\n creation: timestamp,\n },\n },\n ],\n },\n },\n ],\n };\n\n if (requestData.sessionId) {\n // Add session identifier\n fhirBundle.entry[3].resource.identifier = [\n {\n system: \"http://nuxera.ai/session-id\",\n value: requestData.sessionId,\n },\n ];\n }\n\n if (requestData.retry) {\n // Add retry indicator\n const taskEntry = fhirBundle.entry[3];\n if (taskEntry?.resource?.input) {\n taskEntry.resource.input.push({\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"retry-request\",\n },\n ],\n },\n valueBoolean: true,\n });\n }\n }\n\n console.log(\n \"Constructed FHIR Transcription Request Bundle:\",\n JSON.stringify(fhirBundle, null, 2)\n );\n\n // Create FormData with FHIR bundle and audio file\n const formData = new FormData();\n\n // Add the FHIR bundle as JSON\n const fhirBlob = new Blob([JSON.stringify(fhirBundle, null, 2)], {\n type: \"application/fhir+json\",\n });\n formData.append(\"fhir_request\", fhirBlob, \"transcription_request.json\");\n\n // Add the audio file\n formData.append(\"audio\", audioFile);\n\n // Add session ID as separate field if it exists (for server compatibility)\n // This ensures the server receives numeric session IDs in the expected location\n if (requestData.sessionId) {\n formData.append(\"sessionId\", requestData.sessionId);\n }\n\n // Add other critical fields to FormData for easier server-side parsing\n formData.append(\"sequence\", requestData.sequence.toString());\n formData.append(\"isFinalChunk\", requestData.isFinalChunk.toString());\n\n console.log(\n \"Created FHIR FormData with session ID:\",\n requestData.sessionId || \"none (first call)\"\n );\n\n return formData;\n },\n []\n );\n\n const clearError = useCallback(() => {\n setConversionError(null);\n }, []);\n\n // Add the dictation request creators (keep as FormData since they include audio files)\n const createHL7DictationRequest = useCallback(\n (audioFile: File, requestData: DictationRequest): FormData => {\n const timestamp = new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"\");\n const messageControlId = `DICTATE_${Date.now()}${Math.random().toString(36).substr(2, 9)}`;\n\n // Build HL7 message for dictation request\n const hl7Lines: string[] = [];\n\n // MSH - Message Header\n hl7Lines.push(\n `MSH|^~\\\\&|Nuxera-Client|CLIENT_FACILITY|Nuxera-Dictation|Nuxera|${timestamp}||MDM^T02^MDM_T02|${messageControlId}|P|2.5`\n );\n\n // EVN - Event Type\n hl7Lines.push(`EVN|T02|${timestamp}|||SYS^SYSTEM^NUXERA`);\n\n // PID - Patient Identification (if available)\n const patientId = requestData.patientId || \"unknown\";\n hl7Lines.push(\n `PID|1||${patientId}||PATIENT^||${timestamp}|U|||unknown||||||||${patientId}|||||||||||||||`\n );\n\n // TXA - Transcription Document Administration\n hl7Lines.push(\n `TXA|1|CN|TX|||${timestamp}|||${escapeHL7(\n requestData.doctorName || \"unknown\"\n )}||||||||IP||AV|||${timestamp}`\n );\n\n let obxSequence = 1;\n\n // OBX segments for dictation request data\n if (requestData.doctorName) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|DOCTOR_NAME^Doctor Name||${escapeHL7(\n requestData.doctorName\n )}|||||F|||${timestamp}`\n );\n }\n\n if (requestData.sessionId) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|SESSION_ID^Session ID||${escapeHL7(\n requestData.sessionId\n )}|||||F|||${timestamp}`\n );\n }\n\n if (requestData.language) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|LANGUAGE^Language||${escapeHL7(\n requestData.language\n )}|||||F|||${timestamp}`\n );\n }\n\n if (requestData.specialty) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|SPECIALTY^Specialty||${escapeHL7(\n requestData.specialty\n )}|||||F|||${timestamp}`\n );\n }\n\n // Audio file information\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|AUDIO_FILENAME^Audio Filename||${escapeHL7(\n audioFile.name\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|AUDIO_SIZE^Audio Size||${audioFile.size}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|AUDIO_TYPE^Audio Type||${escapeHL7(\n audioFile.type\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|REQUEST_TYPE^Request Type||DICTATION|||||F|||${timestamp}`\n );\n\n // Join all lines with \\r\\n for proper HL7 format\n const hl7Message = hl7Lines.join(\"\\r\\n\") + \"\\r\\n\";\n\n console.log(\"=== HL7 Dictation Request Debug ===\");\n console.log(\"Request Data:\", requestData);\n console.log(\"Audio File:\", {\n name: audioFile.name,\n size: audioFile.size,\n type: audioFile.type,\n });\n console.log(\"HL7 Message:\");\n console.log(hl7Message);\n console.log(\"=== End Debug ===\");\n\n // Create FormData with HL7 message and audio file\n const formData = new FormData();\n\n // Add the audio file\n formData.append(\"audio\", audioFile);\n\n // Add the HL7 request metadata\n const hl7Blob = new Blob([hl7Message], { type: \"text/plain; charset=utf-8\" });\n formData.append(\"hl7_request\", hl7Blob, `dictation_request.hl7`);\n\n return formData;\n },\n [escapeHL7]\n );\n\n const createFHIRDictationRequest = useCallback(\n (audioFile: File, requestData: DictationRequest): FormData => {\n const timestamp = new Date().toISOString();\n const requestId = `dictation-request-${Date.now()}`;\n\n // Build FHIR Bundle for dictation\n const fhirBundle = {\n resourceType: \"Bundle\",\n id: requestId,\n timestamp: timestamp,\n type: \"message\",\n entry: [\n // MessageHeader\n {\n fullUrl: `urn:uuid:${requestId}-header`,\n resource: {\n resourceType: \"MessageHeader\",\n id: `${requestId}-header`,\n timestamp: timestamp,\n eventCoding: {\n system: \"http://nuxera.ai/events\",\n code: \"dictation-request\",\n display: \"Audio Dictation Request\",\n },\n source: {\n name: \"Nuxera Client\",\n endpoint: \"http://nuxera.ai/client\",\n },\n destination: [\n {\n name: \"Nuxera Dictation Service\",\n endpoint: \"http://nuxera.ai/dictation\",\n },\n ],\n focus: [\n {\n reference: `urn:uuid:${requestId}-media`,\n },\n ],\n },\n },\n\n // Patient (if available)\n {\n fullUrl: `urn:uuid:${requestId}-patient`,\n resource: {\n resourceType: \"Patient\",\n id: `${requestId}-patient`,\n identifier: [\n {\n system: \"http://nuxera.ai/patient-id\",\n value: requestData.patientId || \"unknown\",\n },\n ],\n name: [\n {\n family: \"Patient\",\n given: [\"Unknown\"],\n },\n ],\n },\n },\n\n // Practitioner (Doctor)\n {\n fullUrl: `urn:uuid:${requestId}-practitioner`,\n resource: {\n resourceType: \"Practitioner\",\n id: `${requestId}-practitioner`,\n name: [\n {\n family: requestData.doctorName || \"Unknown\",\n given: [\"Dr.\"],\n },\n ],\n qualification: requestData.specialty\n ? [\n {\n code: {\n coding: [\n {\n system: \"http://snomed.info/sct\",\n code: \"specialty\",\n display: requestData.specialty,\n },\n ],\n },\n },\n ]\n : undefined,\n },\n },\n\n // Media (Audio file reference)\n {\n fullUrl: `urn:uuid:${requestId}-media`,\n resource: {\n resourceType: \"Media\",\n id: `${requestId}-media`,\n status: \"completed\",\n type: {\n coding: [\n {\n system: \"http://terminology.hl7.org/CodeSystem/media-type\",\n code: \"audio\",\n display: \"Audio\",\n },\n ],\n },\n subject: {\n reference: `urn:uuid:${requestId}-patient`,\n },\n operator: {\n reference: `urn:uuid:${requestId}-practitioner`,\n },\n createdDateTime: timestamp,\n content: {\n contentType: audioFile.type || \"audio/wav\",\n size: audioFile.size,\n title: audioFile.name,\n creation: timestamp,\n },\n extension: [\n {\n url: \"http://nuxera.ai/extensions/dictation-request\",\n extension: [\n {\n url: \"doctorName\",\n valueString: requestData.doctorName || \"\",\n },\n {\n url: \"sessionId\",\n valueString: requestData.sessionId || \"\",\n },\n {\n url: \"language\",\n valueString: requestData.language || \"\",\n },\n {\n url: \"specialty\",\n valueString: requestData.specialty || \"\",\n },\n {\n url: \"requestType\",\n valueString: \"DICTATION\",\n },\n ],\n },\n ],\n },\n },\n ],\n };\n\n console.log(\"=== FHIR Dictation Request Debug ===\");\n console.log(\"Request Data:\", requestData);\n console.log(\"Audio File:\", {\n name: audioFile.name,\n size: audioFile.size,\n type: audioFile.type,\n });\n console.log(\"FHIR Bundle:\", JSON.stringify(fhirBundle, null, 2));\n console.log(\"=== End Debug ===\");\n\n // Create FormData with FHIR bundle and audio file\n const formData = new FormData();\n\n // Add the audio file\n formData.append(\"audio\", audioFile);\n\n // Add the FHIR request metadata\n const fhirBlob = new Blob([JSON.stringify(fhirBundle, null, 2)], {\n type: \"application/fhir+json\",\n });\n formData.append(\"fhir_request\", fhirBlob, `dictation_request.json`);\n\n return formData;\n },\n []\n );\n\n // Update the convertHL7DictationToJson function\n const convertHL7DictationToJson = useCallback(\n (hl7Data: string): DictationResponse => {\n try {\n const segments = parseHL7(hl7Data);\n let dictationResponse: Partial<DictationResponse> = {};\n\n console.log(\"Parsing HL7 dictation segments:\", segments);\n\n for (const segment of segments) {\n switch (segment.type) {\n case \"MSH\": // Message Header\n // Extract message control ID as session ID\n if (segment.fields.length >= 10) {\n dictationResponse.sessionId = segment.fields[9];\n }\n break;\n\n case \"PID\": // Patient/User Identification\n // Extract user info if needed\n break;\n\n case \"OBR\": // Observation Request\n // Extract request info if needed\n if (segment.fields.length >= 3) {\n // Field 2 contains the request ID which can be used as session ID\n const requestId = segment.fields[1];\n if (requestId && !dictationResponse.sessionId) {\n dictationResponse.sessionId = requestId;\n }\n }\n break;\n\n case \"OBX\": // Observation/Result - contains dictation data\n if (segment.fields.length >= 5) {\n const observationId = segment.fields[2]; // Field 3 (0-indexed as 2)\n const observationValue = segment.fields[4]; // Field 5 (0-indexed as 4)\n\n if (!observationId || !observationValue) continue;\n\n // Parse each dictation field - Updated to match actual response format\n if (\n observationId.includes(\"DICTATION_TEXT^\") ||\n observationId.includes(\"DICTATION^Dictation Text\")\n ) {\n dictationResponse.dictation = unescapeHL7(observationValue);\n } else if (observationId.includes(\"SESSION_ID^Session ID\")) {\n dictationResponse.sessionId = unescapeHL7(observationValue);\n } else if (observationId.includes(\"CONFIDENCE^Confidence\")) {\n dictationResponse.confidence = parseFloat(unescapeHL7(observationValue)) || 0;\n } else if (observationId.includes(\"LANGUAGE^Language\")) {\n dictationResponse.language = unescapeHL7(observationValue);\n } else if (observationId.includes(\"TRANSCRIPTION_MS^Transcription Time\")) {\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.transcriptionMs =\n parseInt(unescapeHL7(observationValue)) || 0;\n } else if (observationId.includes(\"TOTAL_PROCESSING_MS^Total Processing Time\")) {\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.totalProcessingMs =\n parseInt(unescapeHL7(observationValue)) || 0;\n } else if (observationId.includes(\"AUDIO_SIZE^Audio File Size\")) {\n // Store audio size in a custom field if needed\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n // Extract numeric value from \"1.05 MB\" format\n const sizeMatch = observationValue.match(/(\\d+(?:\\.\\d+)?)/);\n if (sizeMatch) {\n dictationResponse.processingTimes.audioSizeMB = parseFloat(sizeMatch[1]);\n }\n }\n }\n break;\n\n case \"NTE\": // Notes and Comments - contains processing metadata\n if (segment.fields.length >= 3) {\n const noteText = segment.fields[2];\n\n if (noteText?.includes(\"REQUEST_TIMESTAMP:\")) {\n const timestampMatch = noteText.match(/REQUEST_TIMESTAMP:\\s*(\\d+)/);\n if (timestampMatch) {\n const requestTimestamp = parseInt(timestampMatch[1]);\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.requestTimestamp = requestTimestamp;\n }\n } else if (noteText?.includes(\"PROCESSED_AT:\")) {\n const processedMatch = noteText.match(/PROCESSED_AT:\\s*(.+)/);\n if (processedMatch) {\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.processedAt = processedMatch[1].trim();\n }\n } else if (noteText?.includes(\"DICTATION_TYPE:\")) {\n const typeMatch = noteText.match(/DICTATION_TYPE:\\s*(.+)/);\n if (typeMatch) {\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.dictationType = typeMatch[1].trim();\n }\n }\n }\n break;\n }\n }\n\n // Calculate processing times if we have request timestamp and processed at\n if (\n dictationResponse.processingTimes?.requestTimestamp &&\n dictationResponse.processingTimes?.processedAt\n ) {\n try {\n const processedAtMs = new Date(dictationResponse.processingTimes.processedAt).getTime();\n const requestMs = dictationResponse.processingTimes.requestTimestamp;\n if (processedAtMs && requestMs) {\n dictationResponse.processingTimes.totalProcessingMs = Math.round(\n processedAtMs - requestMs\n );\n }\n } catch (e) {\n console.warn(\"Could not calculate processing time:\", e);\n }\n }\n\n // Ensure required fields have default values\n const finalResponse: DictationResponse = {\n dictation: dictationResponse.dictation || \"\",\n sessionId: dictationResponse.sessionId || null,\n confidence: dictationResponse.confidence,\n language: dictationResponse.language,\n processingTimes: dictationResponse.processingTimes,\n };\n\n console.log(\"Converted HL7 dictation response:\", finalResponse);\n return finalResponse;\n } catch (error) {\n console.error(\"HL7 dictation conversion error:\", error);\n throw new Error(\n `Failed to convert HL7 dictation data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n },\n [parseHL7, unescapeHL7]\n );\n\n // Convert FHIR dictation response to JSON\n const convertFHIRDictationToJson = useCallback((fhirData: any): DictationResponse => {\n try {\n let dictationResponse: Partial<DictationResponse> = {};\n\n // 🔥 PARSE JSON STRING IF NEEDED\n let parsedData = fhirData;\n if (typeof fhirData === \"string\") {\n console.log(\"📝 Response is a string, parsing JSON...\");\n try {\n parsedData = JSON.parse(fhirData);\n console.log(\"✅ JSON parsed successfully\");\n } catch (e) {\n console.error(\"❌ Failed to parse JSON string:\", e);\n throw new Error(\"Invalid JSON response from server\");\n }\n }\n\n console.log(\"Parsing FHIR dictation data:\", parsedData);\n\n // Handle different FHIR structures\n let resources: FHIRResource[] = [];\n\n if (parsedData.resourceType === \"Bundle\" && parsedData.entry) {\n resources = parsedData.entry.map((entry: any) => entry.resource);\n console.log(`📦 Found ${resources.length} resources in Bundle`);\n } else if (parsedData.resourceType) {\n resources = [parsedData];\n } else if (parsedData.resource) {\n resources = [parsedData.resource];\n }\n\n for (let i = 0; i < resources.length; i++) {\n const resource = resources[i];\n console.log(`\\n--- Processing resource [${i}]: ${resource?.resourceType || \"unknown\"} ---`);\n\n if (!resource || !resource.resourceType) continue;\n\n switch (resource.resourceType) {\n case \"MessageHeader\":\n // Extract session ID from message header\n dictationResponse.sessionId = resource.id;\n console.log(\"✅ Session ID from MessageHeader:\", resource.id);\n break;\n\n case \"Media\":\n console.log(\"🎯 Found Media resource for dictation\");\n\n // Extract dictation text and metadata from extension\n if (resource.extension && Array.isArray(resource.extension)) {\n console.log(`📋 Processing ${resource.extension.length} extensions`);\n\n for (const ext of resource.extension) {\n console.log(\n ` Extension URL: ${ext.url}, valueString: ${ext.valueString || ext.valueInteger}`\n );\n\n switch (ext.url) {\n case \"http://nuxera.ai/extensions/transcription\":\n dictationResponse.dictation = ext.valueString || \"\";\n console.log(\"✅✅ Extracted dictation text:\", dictationResponse.dictation);\n break;\n\n case \"http://nuxera.ai/extensions/audio-size\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n // Extract numeric value from \"0.61 MB\" format\n const sizeMatch = ext.valueString?.match(/(\\d+(?:\\.\\d+)?)/);\n if (sizeMatch) {\n dictationResponse.processingTimes.audioSizeMB = parseFloat(sizeMatch[1]);\n }\n console.log(\n \"✅ Extracted audio size:\",\n dictationResponse.processingTimes.audioSizeMB\n );\n break;\n\n case \"http://nuxera.ai/extensions/processing-timestamp\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.requestTimestamp = ext.valueInteger;\n console.log(\"✅ Extracted processing timestamp:\", ext.valueInteger);\n break;\n\n case \"http://nuxera.ai/extensions/confidence\":\n dictationResponse.confidence = ext.valueDecimal || ext.valueInteger;\n break;\n\n case \"http://nuxera.ai/extensions/language\":\n dictationResponse.language = ext.valueString;\n break;\n\n case \"http://nuxera.ai/extensions/transcription-time\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.transcriptionMs = ext.valueInteger;\n break;\n\n case \"http://nuxera.ai/extensions/total-processing-time\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.totalProcessingMs = ext.valueInteger;\n break;\n }\n }\n }\n\n // Extract session ID from Media identifier if available\n if (!dictationResponse.sessionId && resource.identifier && resource.identifier[0]) {\n dictationResponse.sessionId = resource.identifier[0].value;\n console.log(\"✅ Session ID from Media.identifier:\", dictationResponse.sessionId);\n }\n\n // Use Media ID as session ID if still not found\n if (!dictationResponse.sessionId && resource.id) {\n dictationResponse.sessionId = resource.id;\n console.log(\"✅ Session ID from Media.id:\", dictationResponse.sessionId);\n }\n\n // Extract createdDateTime as processedAt if available\n if (resource.createdDateTime && dictationResponse.processingTimes) {\n dictationResponse.processingTimes.processedAt = resource.createdDateTime;\n }\n break;\n\n case \"DocumentReference\":\n // Legacy format - Extract dictation text and metadata\n if (resource.content && resource.content[0] && resource.content[0].attachment) {\n const attachment = resource.content[0].attachment;\n if (attachment.data) {\n // Base64 encoded text\n try {\n dictationResponse.dictation = atob(attachment.data);\n } catch (e) {\n dictationResponse.dictation = attachment.data;\n }\n }\n }\n\n // Extract metadata from extension (legacy)\n if (resource.extension) {\n for (const ext of resource.extension) {\n if (ext.url === \"http://nuxera.ai/extensions/dictation-response\") {\n for (const subExt of ext.extension || []) {\n switch (subExt.url) {\n case \"confidence\":\n dictationResponse.confidence = subExt.valueDecimal || subExt.valueInteger;\n break;\n case \"language\":\n dictationResponse.language = subExt.valueString;\n break;\n case \"transcriptionMs\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.transcriptionMs = subExt.valueInteger;\n break;\n case \"totalProcessingMs\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.totalProcessingMs = subExt.valueInteger;\n break;\n }\n }\n }\n }\n }\n break;\n\n case \"Observation\":\n // Legacy format - Extract dictation data from observation components\n if (resource.component && Array.isArray(resource.component)) {\n for (const component of resource.component) {\n const code = component.code?.coding?.[0]?.code;\n\n switch (code) {\n case \"dictation-text\":\n dictationResponse.dictation = component.valueString || \"\";\n break;\n case \"confidence\":\n dictationResponse.confidence = component.valueDecimal || component.valueInteger;\n break;\n case \"language\":\n dictationResponse.language = component.valueString;\n break;\n case \"transcription-time\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.transcriptionMs = component.valueInteger;\n break;\n case \"total-processing-time\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.totalProcessingMs = component.valueInteger;\n break;\n }\n }\n }\n\n // Extract session ID from identifier (legacy)\n if (!dictationResponse.sessionId && resource.identifier && resource.identifier[0]) {\n dictationResponse.sessionId = resource.identifier[0].value;\n }\n break;\n }\n }\n\n // Calculate processing times if we have request timestamp and processed at\n if (\n dictationResponse.processingTimes?.requestTimestamp &&\n dictationResponse.processingTimes?.processedAt\n ) {\n try {\n const processedAtMs = new Date(dictationResponse.processingTimes.processedAt).getTime();\n const requestMs = dictationResponse.processingTimes.requestTimestamp;\n if (processedAtMs && requestMs) {\n dictationResponse.processingTimes.totalProcessingMs = Math.round(\n processedAtMs - requestMs\n );\n console.log(\n \"✅ Calculated total processing time:\",\n dictationResponse.processingTimes.totalProcessingMs,\n \"ms\"\n );\n }\n } catch (e) {\n console.warn(\"Could not calculate processing time:\", e);\n }\n }\n\n // Ensure required fields have default values\n const finalResponse: DictationResponse = {\n dictation: dictationResponse.dictation || \"\",\n sessionId: dictationResponse.sessionId || null,\n confidence: dictationResponse.confidence,\n language: dictationResponse.language,\n processingTimes: dictationResponse.processingTimes,\n };\n\n console.log(\"✅✅ Converted FHIR dictation response:\", finalResponse);\n return finalResponse;\n } catch (error) {\n console.error(\"❌ FHIR dictation conversion error:\", error);\n throw new Error(\n `Failed to convert FHIR dictation data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n }, []);\n\n // Dictation-specific converter\n const convertDictationResponse = useCallback(\n (response: any, format: \"auto\" | \"hl7\" | \"fhir\" | \"json\" = \"auto\"): DictationResponse => {\n setIsConverting(true);\n setConversionError(null);\n\n try {\n let detectedFormat = format;\n\n if (format === \"auto\") {\n detectedFormat = detectFormat(response);\n }\n\n let result: DictationResponse;\n\n switch (detectedFormat) {\n case \"hl7\":\n result = convertHL7DictationToJson(\n typeof response === \"string\" ? response : JSON.stringify(response)\n );\n break;\n\n case \"fhir\":\n result = convertFHIRDictationToJson(response);\n break;\n\n case \"json\":\n default:\n // Handle direct JSON response\n result = response as DictationResponse;\n break;\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown conversion error\";\n setConversionError(errorMessage);\n console.error(\"Dictation conversion failed:\", error);\n\n // Return a default dictation object with error indication\n return {\n dictation: \"\",\n sessionId: null,\n confidence: undefined,\n language: undefined,\n processingTimes: undefined,\n };\n } finally {\n setIsConverting(false);\n }\n },\n [detectFormat, convertHL7DictationToJson, convertFHIRDictationToJson]\n );\n\n // Update HL7 API Key request creator to remove expiry_at\n const createHL7ApiKeyRequest = useCallback(\n (\n apiKeyData: ApiKeyRequest,\n operation:\n | \"create\"\n | \"update\"\n | \"setDefault\"\n | \"removeDefault\"\n | \"pause\"\n | \"resume\"\n | \"delete\" = \"create\"\n ): string => {\n const timestamp = new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"\");\n const messageControlId = `APIKEY_${Date.now()}${Math.random().toString(36).substr(2, 9)}`;\n\n const hl7Lines: string[] = [];\n\n // MSH - Message Header\n hl7Lines.push(\n `MSH|^~\\\\&|Nuxera-Client|CLIENT_FACILITY|Nuxera-ApiKeys|Nuxera|${timestamp}||ADT^A08^ADT_A08|${messageControlId}|P|2.5`\n );\n\n // EVN - Event Type\n const eventCode = getEventCodeForOperation(operation);\n hl7Lines.push(`EVN|${eventCode}|${timestamp}|||SYS^SYSTEM^NUXERA`);\n\n // PID - User Identification\n hl7Lines.push(\n `PID|1||${\n apiKeyData.user_id || \"unknown\"\n }||API_KEY_USER^||${timestamp}|U|||unknown||||||||${\n apiKeyData.user_id || \"\"\n }|||||||||||||||`\n );\n\n let obxSequence = 1;\n\n // OBX segments for API key data (remove expiry_at related fields)\n if (\n apiKeyData.id &&\n (operation === \"update\" ||\n operation === \"setDefault\" ||\n operation === \"removeDefault\" ||\n operation === \"pause\" ||\n operation === \"resume\" ||\n operation === \"delete\")\n ) {\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|API_KEY_ID^API Key ID||${apiKeyData.id}|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.old_id && operation === \"setDefault\") {\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|OLD_API_KEY_ID^Old API Key ID||${\n apiKeyData.old_id\n }|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.name && (operation === \"create\" || operation === \"update\")) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|API_KEY_NAME^API Key Name||${escapeHL7(\n apiKeyData.name\n )}|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.type && (operation === \"create\" || operation === \"update\")) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|API_KEY_TYPE^API Key Type||${escapeHL7(\n apiKeyData.type\n )}|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.status && (operation === \"create\" || operation === \"update\")) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|API_KEY_STATUS^API Key Status||${escapeHL7(\n apiKeyData.status\n )}|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.user_id && (operation === \"create\" || operation === \"update\")) {\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|USER_ID^User ID||${apiKeyData.user_id}|||||F|||${timestamp}`\n );\n }\n\n if (\n apiKeyData.is_default !== undefined &&\n (operation === \"create\" || operation === \"update\")\n ) {\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|IS_DEFAULT^Is Default||${\n apiKeyData.is_default ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n }\n\n // Add operation type\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|OPERATION^Operation Type||${escapeHL7(\n operation.toUpperCase()\n )}|||||F|||${timestamp}`\n );\n\n const hl7Message = hl7Lines.join(\"\\r\\n\") + \"\\r\\n\";\n\n console.log(\"=== HL7 API Key Request Debug ===\");\n console.log(\"Operation:\", operation);\n console.log(\"API Key Data:\", apiKeyData);\n console.log(\"HL7 Message:\");\n console.log(hl7Message);\n console.log(\"=== End Debug ===\");\n\n return hl7Message;\n },\n [escapeHL7]\n );\n\n // Helper function to get HL7 event codes for different operations\n const getEventCodeForOperation = (operation: string): string => {\n switch (operation) {\n case \"create\":\n return \"A04\"; // Register\n case \"update\":\n return \"A08\"; // Update\n case \"setDefault\":\n case \"removeDefault\":\n return \"A31\"; // Update person information\n case \"pause\":\n case \"resume\":\n return \"A37\"; // Unlink person information\n case \"delete\":\n return \"A23\"; // Delete person information\n default:\n return \"A08\"; // Default to update\n }\n };\n\n const createFHIRApiKeyRequest = useCallback(\n (\n apiKeyData: ApiKeyRequest,\n operation:\n | \"create\"\n | \"update\"\n | \"setDefault\"\n | \"removeDefault\"\n | \"pause\"\n | \"resume\"\n | \"delete\" = \"create\"\n ): string => {\n const timestamp = new Date().toISOString();\n const requestId = `api-key-${operation}-${Date.now()}`;\n\n // Build FHIR Bundle for API key\n const fhirBundle = {\n resourceType: \"Bundle\",\n id: requestId,\n timestamp: timestamp,\n type: \"transaction\",\n entry: [\n // MessageHeader\n {\n fullUrl: `urn:uuid:${requestId}-header`,\n resource: {\n resourceType: \"MessageHeader\",\n id: `${requestId}-header`,\n timestamp: timestamp,\n eventCoding: {\n system: \"http://nuxera.ai/events\",\n code: `api-key-${operation}`,\n display: `API Key ${\n operation.charAt(0).toUpperCase() + operation.slice(1)\n } Request`,\n },\n source: {\n name: \"Nuxera Client\",\n endpoint: \"http://nuxera.ai/client\",\n },\n destination: [\n {\n name: \"Nuxera API Key Service\",\n endpoint: \"http://nuxera.ai/api-keys\",\n },\n ],\n focus: [\n {\n reference: `urn:uuid:${requestId}-device`,\n },\n ],\n },\n },\n\n // Patient (User)\n {\n fullUrl: `urn:uuid:${requestId}-patient`,\n resource: {\n resourceType: \"Patient\",\n id: `${requestId}-patient`,\n identifier: [\n {\n system: \"http://nuxera.ai/user-id\",\n value: apiKeyData.user_id?.toString() || \"unknown\",\n },\n ],\n name: [\n {\n family: \"User\",\n given: [\"API Key Owner\"],\n },\n ],\n },\n request: {\n method: \"PUT\",\n url: `Patient/${requestId}-patient`,\n },\n },\n\n // Device (API Key)\n {\n fullUrl: `urn:uuid:${requestId}-device`,\n resource: {\n resourceType: \"Device\",\n id: `${requestId}-device`,\n status: getDeviceStatusForOperation(operation, apiKeyData.status),\n deviceName: [\n {\n name: apiKeyData.name || \"\",\n type: \"user-friendly-name\",\n },\n ],\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/device-types\",\n code: \"api-key\",\n display: \"API Key\",\n },\n ],\n },\n owner: {\n reference: `urn:uuid:${requestId}-patient`,\n },\n extension: [\n {\n url: \"http://nuxera.ai/extensions/api-key\",\n extension: [\n {\n url: \"keyType\",\n valueString: apiKeyData.type || \"\",\n },\n {\n url: \"isDefault\",\n valueBoolean: apiKeyData.is_default || false,\n },\n {\n url: \"operation\",\n valueString: operation.toUpperCase(),\n },\n ] as Array<{\n url: string;\n valueString?: string;\n valueBoolean?: boolean;\n valueInteger?: number;\n }>,\n },\n ],\n },\n request: {\n method: getHttpMethodForOperation(operation),\n url: getUrlForOperation(operation, apiKeyData.id, requestId),\n },\n },\n ],\n };\n\n // Add API key ID for operations that require it\n if (\n apiKeyData.id &&\n (operation === \"update\" ||\n operation === \"setDefault\" ||\n operation === \"removeDefault\" ||\n operation === \"pause\" ||\n operation === \"resume\" ||\n operation === \"delete\")\n ) {\n fhirBundle.entry[2].resource.identifier = [\n {\n system: \"http://nuxera.ai/api-key-id\",\n value: apiKeyData.id.toString(),\n },\n ];\n }\n\n // Add old API key ID for setDefault operation\n if (apiKeyData.old_id && operation === \"setDefault\") {\n const deviceExtension = fhirBundle.entry[2].resource.extension?.[0];\n if (deviceExtension?.extension) {\n deviceExtension.extension.push({\n url: \"oldApiKeyId\",\n valueInteger: apiKeyData.old_id,\n });\n }\n }\n\n console.log(\"=== FHIR API Key Request Debug ===\");\n console.log(\"Operation:\", operation);\n console.log(\"API Key Data:\", apiKeyData);\n console.log(\"FHIR Bundle:\", JSON.stringify(fhirBundle, null, 2));\n console.log(\"=== End Debug ===\");\n\n return JSON.stringify(fhirBundle);\n },\n []\n );\n\n // Helper functions for FHIR operations\n const getDeviceStatusForOperation = (operation: string, status?: string): string => {\n switch (operation) {\n case \"pause\":\n return \"inactive\";\n case \"resume\":\n return \"active\";\n case \"delete\":\n return \"entered-in-error\";\n default:\n return status || \"active\";\n }\n };\n\n const getHttpMethodForOperation = (operation: string): string => {\n switch (operation) {\n case \"create\":\n return \"POST\";\n case \"update\":\n case \"setDefault\":\n case \"removeDefault\":\n case \"pause\":\n case \"resume\":\n return \"PUT\";\n case \"delete\":\n return \"DELETE\";\n default:\n return \"PUT\";\n }\n };\n\n const getUrlForOperation = (\n operation: string,\n apiKeyId?: number | string,\n requestId?: string\n ): string => {\n switch (operation) {\n case \"create\":\n return \"Device\";\n case \"update\":\n case \"setDefault\":\n case \"removeDefault\":\n case \"pause\":\n case \"resume\":\n case \"delete\":\n return `Device/${apiKeyId || requestId + \"-device\"}`;\n default:\n return \"Device\";\n }\n };\n\n return {\n convertTranscriptionResponse,\n createHL7TranscriptionRequest,\n createFHIRTranscriptionRequest,\n createHL7DictationRequest,\n createFHIRDictationRequest,\n convertDictationResponse,\n convertHL7DictationToJson,\n convertFHIRDictationToJson,\n isConverting,\n conversionError,\n clearError,\n };\n};\n\nexport default useHL7FHIRConverter;\n","import React, { useEffect, useRef, useState, useCallback, MutableRefObject } from \"react\";\nimport useFFmpegConverter from \"./useFFmpegConverter\";\nimport useAudioRecovery from \"./useAudioRecovery\";\nimport pRetry, { AbortError } from \"p-retry\";\nimport useHL7FHIRConverter from \"./useHL7FHIRConverter\";\nimport { ClassificationInfoResponse } from \"../types\";\n\ninterface AudioRecorderHookProps {\n apiKey: string;\n apiBaseUrl?: string;\n speciality: string;\n patientId?: number;\n patientName?: string;\n patientHistory?: string;\n selectedFormat?: \"json\" | \"hl7\" | \"fhir\";\n skipDiarization?: boolean;\n silenceRemoval?: boolean;\n onTranscriptionUpdate: (text: string, sessionId: string) => void;\n onTranscriptionComplete: (\n text: string,\n classification: ClassificationInfoResponse,\n sessionId: string\n ) => void;\n}\n\ninterface UseAudioRecorderReturn {\n mediaStreamRef: MutableRefObject<MediaStream | null>;\n startRecording: () => void;\n stopRecording: () => void;\n pauseRecording: () => void;\n resumeRecording: () => void;\n isRecording: boolean;\n isPaused: boolean;\n isProcessing: boolean;\n error: string | null;\n transcriptionDone: boolean;\n // New microphone properties\n availableDevices: MediaDeviceInfo[];\n currentDeviceId: string | null;\n selectMicrophone: (deviceId: string) => Promise<void>;\n validateMicrophoneAccess: () => Promise<boolean>;\n audioLevel: number;\n noAudioDetected: boolean;\n\n // Recovery-related properties\n showRetrySessionPrompt: boolean;\n isRetryingSession: boolean;\n retryFailedSession: () => Promise<void>;\n clearAllSessions: () => Promise<void>;\n\n // Add FFmpeg status properties\n isConverting: boolean;\n progress: number;\n statusMessage: string;\n\n // Add test function for debugging\n testAudioCapture: () => Promise<void>;\n}\n\n// Internal API configuration - this will be used by the npm package\n// Change this URL to match your actual API endpoint before publishing\nconst API_BASE_URL = \"https://nuxera.cloud\";\n\n// Embedded Audio Processor Worker - no external files needed\nconst createAudioProcessorWorker = () => {\n const workerCode = `\n class AudioProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this._buffer = [];\n this._isStopped = false;\n this._isPaused = false;\n this._uploadChunk = false;\n this._uploadingChunk = false;\n \n this._audioLevelCheckInterval = 0;\n this._audioLevelCheckFrequency = 128;\n this._silentSampleCount = 0;\n this._maxSilentSamples = 44100 * 30;\n this._audioThreshold = 0.002; // Increased from 0.001 to better detect speech\n this._hasDetectedAudio = false;\n this._totalSilentTime = 0;\n this._lastAudioTime = 0;\n this._recordingStartTime = Date.now();\n this._initialSilenceThreshold = 44100 * 10;\n this._isInitialPhase = true;\n this._bufferSize = 0; // Track total samples in buffer\n\n this.port.onmessage = (event) => {\n if (event.data.command === \"stop\") {\n this._isStopped = true;\n // Ensure we have valid audio data before sending\n if (this._buffer.length > 0) {\n // Properly flatten the buffer by concatenating Float32Arrays\n let totalLength = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n totalLength += this._buffer[i].length;\n }\n \n const flat = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n flat.set(this._buffer[i], offset);\n offset += this._buffer[i].length;\n }\n \n this.port.postMessage(\n {\n command: \"finalChunk\",\n audioBuffer: flat.buffer,\n },\n [flat.buffer]\n );\n } else {\n // Send empty final chunk to complete the session\n const emptyBuffer = new Float32Array(1000);\n this.port.postMessage(\n {\n command: \"finalChunk\", \n audioBuffer: emptyBuffer.buffer,\n },\n [emptyBuffer.buffer]\n );\n }\n this._buffer = [];\n }\n\n if (event.data.command === \"uploadChunk\") {\n this._uploadChunk = true;\n }\n\n if (event.data.command === \"resetUploadChunk\") {\n this._uploadChunk = false;\n this._uploadingChunk = false;\n this._buffer = [];\n }\n\n if (event.data.command === \"pause\") {\n this._isPaused = true;\n }\n\n if (event.data.command === \"resume\") {\n this._isPaused = false;\n }\n };\n }\n\n process(inputs, outputs) {\n if (this._isStopped || this._isPaused) {\n return true;\n }\n\n const input = inputs[0];\n if (input && input.length > 0) {\n const samples = input[0];\n \n let audioLevel = 0;\n for (let i = 0; i < samples.length; i++) {\n audioLevel += Math.abs(samples[i]);\n }\n audioLevel /= samples.length;\n\n this._audioLevelCheckInterval++;\n if (this._audioLevelCheckInterval >= this._audioLevelCheckFrequency) {\n this.port.postMessage({\n command: \"audioLevel\",\n level: audioLevel,\n });\n this._audioLevelCheckInterval = 0;\n \n // Debug: Log audio capture status every few seconds\n if (this._audioLevelCheckInterval % 1000 === 0) {\n }\n }\n\n if (audioLevel > this._audioThreshold) {\n this._hasDetectedAudio = true;\n this._isInitialPhase = false;\n this._silentSampleCount = 0;\n this._lastAudioTime = Date.now();\n } else {\n this._silentSampleCount += samples.length;\n \n if (this._isInitialPhase && this._silentSampleCount > this._initialSilenceThreshold) {\n this.port.postMessage({\n command: \"noAudioDetected\",\n message: \"No audio input detected after 10 seconds. Please check your microphone.\"\n });\n return true;\n }\n \n if (this._hasDetectedAudio && this._silentSampleCount > this._maxSilentSamples) {\n this.port.postMessage({\n command: \"noAudioDetected\",\n message: \"No audio detected for 30 seconds. Recording may have issues.\"\n });\n }\n }\n\n this._buffer.push(new Float32Array(samples));\n this._bufferSize += samples.length;\n\n if (this._uploadChunk && !this._uploadingChunk) {\n this._uploadingChunk = true;\n\n // Properly flatten the buffer by concatenating Float32Arrays\n let totalLength = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n totalLength += this._buffer[i].length;\n }\n\n const flat = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n flat.set(this._buffer[i], offset);\n offset += this._buffer[i].length;\n }\n\n // Always send chunks to server - let server handle silence filtering\n if (this._bufferSize > 0) {\n this.port.postMessage(\n {\n command: \"chunk\",\n audioBuffer: flat.buffer,\n bufferDuration: this._bufferSize / 44100\n },\n [flat.buffer]\n );\n console.log('[UPLOAD] Sending chunk: ' + (this._bufferSize / 44100).toFixed(1) + 's');\n // Clear buffer after upload\n this._buffer = [];\n this._bufferSize = 0;\n }\n\n this._uploadChunk = false;\n this._uploadingChunk = false;\n }\n }\n\n return true;\n }\n }\n\n registerProcessor(\"audio-processor\", AudioProcessor);\n `;\n\n const blob = new Blob([workerCode], { type: \"application/javascript\" });\n return URL.createObjectURL(blob);\n};\n\nconst useAudioRecorder = ({\n apiKey,\n apiBaseUrl = API_BASE_URL,\n speciality,\n patientId,\n patientName,\n patientHistory,\n selectedFormat = \"json\",\n skipDiarization = true,\n silenceRemoval = true,\n onTranscriptionUpdate,\n onTranscriptionComplete,\n}: AudioRecorderHookProps): UseAudioRecorderReturn => {\n const [uploadChunkInterval, setUploadChunkInterval] = useState<number | null>(null);\n const [isRecording, setIsRecording] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [alreadyDoneTranscription, setAlreadyDoneTranscription] = useState(\"\");\n const [transcriptionDone, setTranscriptionDone] = useState(false);\n const [currentDeviceId, setCurrentDeviceId] = useState<string | null>(null);\n const [availableDevices, setAvailableDevices] = useState<MediaDeviceInfo[]>([]);\n\n // Add new state for audio monitoring\n const [audioLevel, setAudioLevel] = useState<number>(0);\n const [noAudioDetected, setNoAudioDetected] = useState(false);\n\n const audioSamplesRef = useRef<Float32Array[]>([]);\n const mediaStreamRef = React.useRef<MediaStream | null>(null);\n const processorRef = React.useRef<AudioWorkletNode | null>(null);\n const audioContextRef = React.useRef<AudioContext | null>(null);\n const sessionIdRef = React.useRef<string | null>(null); // This will be server session ID\n const localSessionIdRef = React.useRef<string | null>(null); // This will be our IndexedDB session ID\n\n const doctorName = \"asad\";\n\n const [selectedModel, setSelectedModel] = React.useState<string>(\"new-large\");\n\n const [isRetryingSession, setIsRetryingSession] = React.useState(false);\n const [showRetrySessionPrompt, setShowRetrySessionPrompt] = React.useState(false);\n\n // Use the provided apiKey or fall back to selectedApiKey\n const effectiveApiKey = apiKey;\n\n const {\n convertTranscriptionResponse,\n conversionError,\n clearError,\n createHL7TranscriptionRequest,\n createFHIRTranscriptionRequest,\n } = useHL7FHIRConverter();\n\n // Add helper function to combine audio chunks (moved before useAudioRecovery)\n const combineAudioChunks = React.useCallback((audioChunks: Float32Array[]): Float32Array => {\n const totalLength = audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combinedAudio = new Float32Array(totalLength);\n let offset = 0;\n\n for (const chunk of audioChunks) {\n combinedAudio.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combinedAudio;\n }, []);\n\n // Create a ref for uploadChunkToServer to avoid closure issues\n const uploadChunkToServerRef = React.useRef<\n | ((\n audioData: Float32Array,\n isFirst: boolean,\n sequence: number,\n isFinal: boolean,\n isPaused?: boolean\n ) => Promise<void>)\n | null\n >(null);\n\n // Update the useAudioRecovery callback with better logging\n const {\n createSession,\n appendAudioToSession,\n markSessionComplete,\n markSessionFailed,\n retrySession,\n deleteSession,\n getFailedSession,\n hasFailedSession,\n clearFailedSessions,\n } = useAudioRecovery(async (audioChunks, metadata) => {\n // Reprocess session callback - send combined audio as single final chunk\n try {\n console.log(\"🔄 Retry callback started with audio chunks:\", {\n chunksCount: audioChunks.length,\n totalSamples: audioChunks.reduce((sum, chunk) => sum + chunk.length, 0),\n chunkDetails: audioChunks.map((chunk, idx) => ({\n index: idx,\n length: chunk.length,\n hasData: chunk.length > 0,\n })),\n });\n\n if (audioChunks.length === 0) {\n throw new Error(\"No audio chunks provided for retry\");\n }\n\n // Combine all audio chunks into one\n const combinedAudio = combineAudioChunks(audioChunks);\n\n console.log(\"[AUDIO] Combined audio for retry:\", {\n combinedLength: combinedAudio.length,\n hasAudio: combinedAudio.length > 0,\n });\n\n if (combinedAudio.length === 0) {\n throw new Error(\"Combined audio is empty\");\n }\n\n // Check if uploadChunkToServer is available\n if (!uploadChunkToServerRef.current) {\n throw new Error(\"Upload function not yet initialized\");\n }\n\n // Generate a fresh session ID for retry (server will create new session)\n const newSessionId = `session_retry_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n console.log(\"🆔 Generated new retry session ID:\", newSessionId);\n\n // Send as first AND final chunk to create complete new session\n await uploadChunkToServerRef.current(combinedAudio, true, 0, true, false);\n\n console.log(\"[SUCCESS] Retry upload completed successfully\");\n } catch (error) {\n console.error(\"[ERROR] Retry session failed:\", error);\n throw error;\n }\n });\n\n const chunkQueueRef = React.useRef<\n {\n chunk: Float32Array | null;\n isFinal: boolean;\n sequence: number;\n isPaused?: boolean;\n }[]\n >([]);\n const isProcessingQueueRef = React.useRef(false);\n const sequenceCounterRef = React.useRef(0);\n const receivedTranscriptionsRef = React.useRef<Map<number, string>>(new Map());\n const nextExpectedSequenceRef = React.useRef(0);\n\n const selectedModelRef = React.useRef(selectedModel);\n const skipDiarizationRef = React.useRef(skipDiarization);\n const removeSilenceRef = React.useRef(silenceRemoval);\n const selectedFormatRef = React.useRef(selectedFormat);\n\n const {\n removeSilence,\n isLoaded,\n isConverting,\n loadFFmpeg,\n progress,\n statusMessage,\n convertToWav,\n } = useFFmpegConverter();\n\n // Add ref to track the current isLoaded value\n const isLoadedRef = React.useRef(isLoaded);\n\n // Update the ref whenever isLoaded changes\n React.useEffect(() => {\n isLoadedRef.current = isLoaded;\n console.log(`🔄 isLoadedRef updated to: ${isLoaded}`);\n }, [isLoaded]);\n\n React.useEffect(() => {\n selectedModelRef.current = selectedModel;\n }, [selectedModel]);\n\n React.useEffect(() => {\n skipDiarizationRef.current = skipDiarization;\n }, [skipDiarization]);\n\n React.useEffect(() => {\n removeSilenceRef.current = silenceRemoval;\n }, [silenceRemoval]);\n\n React.useEffect(() => {\n selectedFormatRef.current = selectedFormat;\n }, [selectedFormat]);\n\n React.useEffect(() => {\n // Use server session ID for callbacks, fallback to local session ID\n console.log(\"Triggering onTranscriptionUpdate with:\", {\n alreadyDoneTranscription,\n sessionId: sessionIdRef.current,\n localSessionId: localSessionIdRef.current,\n });\n if (alreadyDoneTranscription.length > 0) {\n onTranscriptionUpdate(\n alreadyDoneTranscription,\n sessionIdRef.current || localSessionIdRef.current || \"\"\n );\n }\n }, [alreadyDoneTranscription]);\n\n // Add useEffect to track speciality changes\n React.useEffect(() => {\n console.log(\"Speciality changed in useAudioRecorder:\", speciality);\n }, [speciality]);\n\n React.useEffect(() => {\n let isMounted = true;\n\n // Only initialize FFmpeg once\n if (!isLoadedRef.current) {\n (async () => {\n console.log(\"Initializing FFmpeg…\");\n try {\n const ok = await loadFFmpeg();\n if (isMounted) {\n console.log(\"FFmpeg init returned:\", ok);\n if (ok) {\n console.log(\"FFmpeg initialized successfully for audio recorder\");\n }\n }\n } catch (error) {\n if (isMounted) {\n console.error(\"FFmpeg initialization failed:\", error);\n }\n }\n })();\n } else {\n console.log(\"FFmpeg already initialized, skipping\");\n }\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n // Microphone validation and detection\n const validateMicrophoneAccess = React.useCallback(async (): Promise<boolean> => {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const audioInputDevices = devices.filter((device) => device.kind === \"audioinput\");\n\n setAvailableDevices(audioInputDevices);\n\n if (audioInputDevices.length === 0) {\n throw new Error(\"No microphone devices detected. Please connect a microphone.\");\n }\n\n // Test microphone access with actual getUserMedia call\n const testStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: currentDeviceId ? { exact: currentDeviceId } : undefined,\n },\n });\n\n // Get device information\n const audioTracks = testStream.getAudioTracks();\n if (audioTracks.length > 0) {\n const track = audioTracks[0];\n const settings = track.getSettings();\n setCurrentDeviceId(settings.deviceId || null);\n console.log();\n }\n\n // Clean up the test stream\n testStream.getTracks().forEach((track) => track.stop());\n\n return true;\n } catch (error) {\n console.error(\"Microphone validation failed:\", error);\n\n if (error instanceof Error) {\n let errorMessage = \"\";\n\n if (error.name === \"NotFoundError\" || error.name === \"DevicesNotFoundError\") {\n errorMessage = \"No microphone found. Please connect a microphone and refresh.\";\n } else if (error.name === \"NotAllowedError\" || error.name === \"PermissionDeniedError\") {\n errorMessage =\n \"Microphone access denied. Please allow microphone permissions in your browser settings.\";\n } else if (error.name === \"NotReadableError\" || error.name === \"TrackStartError\") {\n errorMessage = \"Microphone is busy. Please close other apps using the microphone.\";\n } else if (error.name === \"OverconstrainedError\") {\n errorMessage = \"Selected microphone is unavailable. Please choose another device.\";\n } else {\n errorMessage = error.message;\n }\n setError(errorMessage); // Set the main error state\n } else {\n const errorMessage = \"Microphone access error occurred.\";\n setError(errorMessage);\n }\n\n return false;\n }\n }, [currentDeviceId]);\n\n // Initial microphone check - only when component mounts or speciality changes\n React.useEffect(() => {\n if (speciality) {\n // Don't validate immediately, wait for user interaction\n console.log(\"Speciality set, microphone validation will happen on recording start\");\n }\n }, [speciality]);\n\n // Check for failed sessions on component mount instead of chunks\n React.useEffect(() => {\n const checkFailedSessions = async () => {\n const failedSession = await hasFailedSession();\n if (failedSession) {\n setShowRetrySessionPrompt(true);\n }\n };\n checkFailedSessions();\n }, [hasFailedSession]);\n\n // Update clear function to work with sessions\n const clearAllSessions = React.useCallback(async () => {\n await clearFailedSessions();\n setShowRetrySessionPrompt(false);\n }, [clearFailedSessions]);\n\n // Update the uploadChunkToServer function\n const uploadChunkToServer = React.useCallback(\n async (\n audioData: Float32Array | null,\n isFinalChunk: boolean,\n sequence: number,\n retry = false,\n isPausedChunk = false\n ) => {\n const currentIsLoaded = isLoadedRef.current;\n\n console.log(\"🔧 uploadChunkToServer called with:\", {\n isLoaded: currentIsLoaded,\n silenceRemovalEnabled: removeSilenceRef.current,\n hasRemoveSilenceFunction: typeof removeSilence === \"function\",\n isFinalChunk,\n sequence,\n audioDataLength: audioData?.length,\n requestFormat: selectedFormatRef.current, // Log the request format\n });\n\n processorRef.current?.port.postMessage({ command: \"resetUploadChunk\" });\n\n // Save chunk to local session first\n if (audioData && localSessionIdRef.current && !retry) {\n try {\n console.log(`[DB] Saving chunk ${sequence} to IndexedDB session ${localSessionIdRef.current}`);\n await appendAudioToSession(localSessionIdRef.current, audioData, sequence);\n console.log(`[DB] ✓ Successfully saved audio chunk ${sequence} to IndexedDB (${audioData.length} samples)`);\n } catch (error) {\n console.error(`[DB] ✗ Failed to save audio chunk ${sequence} to IndexedDB:`, error);\n }\n } else {\n console.log(`[DB] Skipping IndexedDB save: audioData=${!!audioData}, sessionId=${localSessionIdRef.current}, retry=${retry}`);\n }\n\n // Wrap the server call in p-retry\n try {\n const data = await pRetry(\n async (attemptNumber) => {\n console.log(`🔄 Transcribe attempt ${attemptNumber} for sequence ${sequence}`);\n\n // Prepare audio file first\n if (!audioData || audioData.length === 0) {\n console.log();\n if (retry) {\n throw new AbortError(\"No audio data provided for retry\");\n }\n throw new Error(\"No audio data provided\");\n }\n\n console.log();\n\n console.log(\n `[PROCESSING] Processing audio chunk: ${audioData.length} samples (${(audioData.length / 44100).toFixed(2)}s)`\n );\n\n // Log audio content for debugging (no longer skipping chunks)\n let maxAmplitude = 0;\n let nonZeroSamples = 0;\n\n for (let i = 0; i < audioData.length; i++) {\n const amplitude = Math.abs(audioData[i]);\n if (amplitude > maxAmplitude) maxAmplitude = amplitude;\n if (amplitude > 0.001) {\n nonZeroSamples++;\n }\n }\n\n const audioPercentage = nonZeroSamples / audioData.length;\n console.log(\n `[AUDIO] Audio stats: maxAmplitude=${maxAmplitude.toFixed(4)}, audioContent=${(audioPercentage * 100).toFixed(2)}%, sequence=${sequence}, isFinal=${isFinalChunk}`\n );\n\n const sampleRate = audioContextRef.current?.sampleRate || 16000;\n const timestamp = Date.now();\n const fileName = `audio-chunk-${timestamp}.wav`;\n\n let wavFile: File | null = await convertToWav(audioData, sampleRate, fileName);\n\n if (!wavFile) {\n throw new Error(\"WAV conversion failed through FFmpeg\");\n }\n\n console.log(`[INFO] Original WAV file: ${wavFile.size} bytes, ${wavFile.name}`);\n\n // Apply silence removal if enabled\n if (currentIsLoaded && removeSilenceRef.current) {\n try {\n console.log(\"[SILENCE] Attempting to remove silence from audio chunk...\");\n const processedFile = await removeSilence(wavFile);\n if (processedFile) {\n console.log(\n `[SUCCESS] Silence removed successfully: ${processedFile.size} bytes (was ${wavFile.size} bytes)`\n );\n\n // Check if the processed file is too small (less than 1KB indicates likely over-processing)\n if (processedFile.size < 1000) {\n console.warn(\n `[WARN] Processed file very small (${processedFile.size} bytes), using original file`\n );\n // Use original file if processed file is suspiciously small\n } else {\n wavFile = processedFile;\n }\n } else {\n console.warn(\"Silence removal returned null, using original file\");\n }\n } catch (silenceError) {\n console.warn(\"Silence removal failed, using original file:\", silenceError);\n }\n } else {\n console.log(\"[SILENCE] Silence removal disabled or not loaded\");\n }\n\n console.log(\n `[OUT] Final file for transcription: ${wavFile.size} bytes, ${wavFile.name}`\n );\n\n // Log warning for very small files but don't skip them - let server decide\n if (wavFile.size < 500) {\n console.warn(\n `[WARN] Small audio file (${wavFile.size} bytes) - may contain minimal audio data, sending to server anyway`\n );\n }\n\n // Prepare request data\n const requestData = {\n sessionId: retry ? undefined : sessionIdRef.current || undefined,\n model: selectedModelRef.current,\n doctorName: doctorName,\n patientName: patientName || \"\",\n patientId: patientId,\n removeSilence: removeSilenceRef.current,\n skipDiarization: skipDiarizationRef.current,\n isFinalChunk: isFinalChunk,\n isPaused: isPausedChunk,\n sequence: sequence,\n speciality: speciality,\n retry: retry,\n };\n\n let formData: FormData;\n let contentType: string | undefined;\n\n // Create request body based on selected format\n switch (selectedFormatRef.current) {\n case \"hl7\":\n formData = createHL7TranscriptionRequest(wavFile, requestData);\n contentType = \"multipart/form-data; hl7-request=true\";\n console.log(\"Created HL7-formatted request\");\n console.log(\"HL7 FormData entries:\", Array.from(formData.entries()));\n break;\n\n case \"fhir\":\n formData = createFHIRTranscriptionRequest(wavFile, requestData);\n contentType = \"multipart/form-data; fhir-request=true\";\n console.log(\"Created FHIR-formatted request\");\n console.log(\"FHIR FormData entries:\", Array.from(formData.entries()));\n break;\n\n case \"json\":\n default:\n // Original JSON format\n formData = new FormData();\n\n if (retry) {\n formData.append(\"retry\", \"true\");\n } else if (sessionIdRef.current) {\n formData.append(\"sessionId\", sessionIdRef.current);\n }\n\n formData.append(\"audio\", wavFile);\n formData.append(\"model\", selectedModelRef.current);\n formData.append(\"doctorName\", doctorName);\n formData.append(\"patientName\", patientName || \"\");\n if (patientHistory) formData.append(\"patientHistory\", patientHistory);\n if (patientId) formData.append(\"patientId\", patientId.toString());\n formData.append(\"removeSilence\", removeSilenceRef.current.toString());\n formData.append(\"skipDiarization\", skipDiarizationRef.current.toString());\n formData.append(\"isFinalChunk\", isFinalChunk.toString());\n formData.append(\"isPaused\", isPausedChunk.toString());\n formData.append(\"sequence\", sequence.toString());\n formData.append(\"speciality\", speciality);\n\n console.log(\"Created JSON-formatted request\");\n break;\n }\n\n // Prepare headers\n const headers: Record<string, string> = {\n \"x-api-key\": effectiveApiKey || \"\",\n \"x-response-format\": selectedFormatRef.current,\n \"x-request-format\": selectedFormatRef.current, // Add request format header\n };\n\n // Don't set Content-Type for FormData - let browser set it with boundary\n // if (contentType) {\n // headers[\"Content-Type\"] = contentType;\n // }\n\n const response = await fetch(`${apiBaseUrl}/api/transcribe`, {\n method: \"POST\",\n headers: headers,\n body: formData,\n });\n\n // Handle different types of errors\n if (!response.ok) {\n const errorText = await response.text();\n\n console.error(\"Transcription server error response:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorText,\n });\n\n let errorMessage = `HTTP ${response.status}`;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorMessage;\n } catch {\n errorMessage = errorText || errorMessage;\n }\n\n if (response.status === 401) {\n throw new AbortError(\n \"Transcription service authentication failed. Please check your API key configuration.\"\n );\n } else if (response.status >= 400 && response.status < 500) {\n throw new AbortError(`Client error: ${errorMessage}`);\n } else {\n throw new Error(`Server error: ${errorMessage}`);\n }\n }\n\n // Handle different response formats based on Content-Type\n\n let responseData: any;\n\n if (selectedFormatRef.current === \"json\") {\n responseData = await response.json();\n console.log(\"Parsed JSON response:\", responseData);\n } else if (selectedFormatRef.current === \"hl7\") {\n responseData = await response.text();\n console.log(\"Received HL7 response:\", responseData);\n } else if (selectedFormatRef.current === \"fhir\") {\n responseData = await response.json(); // FHIR is JSON-based\n console.log(\"Received FHIR response:\", responseData);\n } else {\n const responseText = await response.text();\n try {\n responseData = JSON.parse(responseText);\n console.log(\"Fallback: Parsed as JSON:\", responseData);\n } catch {\n responseData = responseText;\n console.log(\"Fallback: Using as text:\", responseData);\n }\n }\n\n // Convert the response using our converter hook\n const convertedData = convertTranscriptionResponse(\n responseData,\n selectedFormatRef.current\n );\n console.log(\"Original response:\", responseData);\n console.log(\"Converted response:\", convertedData);\n\n return convertedData;\n },\n {\n retries: 3,\n factor: 2,\n minTimeout: 1000,\n maxTimeout: 10000,\n randomize: true,\n onFailedAttempt: (error) => {\n console.warn(\n `[WARN] Transcribe attempt ${error.attemptNumber} failed for sequence ${sequence}:`,\n {\n error: error,\n retriesLeft: error.retriesLeft,\n }\n );\n\n if (error.retriesLeft > 0) {\n setError(\n `Network issue detected. Retrying... (${error.retriesLeft} attempts remaining)`\n );\n }\n },\n }\n );\n\n // Clear any conversion errors on success\n if (conversionError) {\n clearError();\n }\n\n // Clear any retry-related error messages on success\n if (error && error.includes(\"Retrying\")) {\n setError(null);\n }\n if (!data) {\n throw new Error(\"No data received from transcription server\");\n }\n\n console.log(`[SUCCESS] Received transcription for sequence ${sequence}:`, data);\n\n // Update server session ID when received from server\n if (retry && data.sessionId) {\n console.log(\n \"[SUCCESS] Retry successful - received new server session ID:\",\n data.sessionId\n );\n sessionIdRef.current = data.sessionId;\n } else if (!retry && data.sessionId && !sessionIdRef.current) {\n console.log(\"[SUCCESS] Received initial server session ID:\", data.sessionId);\n sessionIdRef.current = data.sessionId;\n }\n\n receivedTranscriptionsRef.current.set(sequence, data.transcription);\n\n // Append in order\n while (receivedTranscriptionsRef.current.has(nextExpectedSequenceRef.current)) {\n const t = receivedTranscriptionsRef.current.get(nextExpectedSequenceRef.current)!;\n setAlreadyDoneTranscription(t);\n receivedTranscriptionsRef.current.delete(nextExpectedSequenceRef.current);\n nextExpectedSequenceRef.current++;\n }\n\n if (isFinalChunk) {\n setTranscriptionDone(true);\n // Pass the converted data to the callback\n onTranscriptionComplete(data.transcription, data.classifiedInfo, sessionIdRef.current!);\n\n // Clear LOCAL session only on successful final chunk + medical note generation\n if (localSessionIdRef.current) {\n await markSessionComplete(localSessionIdRef.current);\n setShowRetrySessionPrompt(false);\n }\n }\n } catch (err) {\n console.error(`[ERROR] Upload error occurred after all retries:`, err);\n\n // Include conversion errors in error handling\n if (conversionError) {\n console.error(\"Conversion error during upload:\", conversionError);\n setError(`Data conversion failed: ${conversionError}`);\n }\n\n const isAbortError = err instanceof Error && err.name === \"AbortError\";\n const statusCode =\n err instanceof Error && err.message.includes(\"HTTP\")\n ? parseInt(err.message.split(\"HTTP\")[1].trim())\n : null;\n\n // Mark LOCAL session as failed but keep the audio data for retry\n if (localSessionIdRef.current) {\n await markSessionFailed(\n localSessionIdRef.current,\n err instanceof Error ? err.message : \"Unknown error\"\n );\n\n if (isFinalChunk) {\n setShowRetrySessionPrompt(true);\n }\n }\n\n // Set appropriate error messages for different scenarios\n if (\n err instanceof Error &&\n (err.message.includes(\"authentication failed\") || statusCode === 401)\n ) {\n setError(\n \"Authentication failed. Audio saved offline - please check your API key and retry.\"\n );\n } else if (\n err instanceof Error &&\n (err.message === \"Failed to fetch\" || err.name === \"TypeError\" || !navigator.onLine)\n ) {\n setError(\n \"No internet connection. Audio saved offline - transcription will start when connection is restored.\"\n );\n } else if (\n err instanceof Error &&\n (err.message.includes(\"HTTP 5\") || err.message.includes(\"Server error\"))\n ) {\n setError(\n \"Server error occurred after multiple attempts. Audio saved offline - you can retry transcription.\"\n );\n } else if (isAbortError) {\n setError(\n err instanceof Error\n ? err.message.replace(\n \"Transcription service authentication failed. Please check your API key configuration.\",\n \"Authentication failed. Audio saved offline - please check your API key and retry.\"\n )\n : \"Request failed. Audio saved offline - you can retry.\"\n );\n } else {\n setError(\n \"Transcription failed after multiple attempts. Audio saved offline - you can retry transcription.\"\n );\n }\n } finally {\n if (isFinalChunk) setIsProcessing(false);\n }\n },\n [\n selectedModel,\n silenceRemoval,\n skipDiarization,\n selectedFormat,\n patientName,\n patientHistory,\n onTranscriptionComplete,\n speciality,\n removeSilence,\n convertToWav,\n appendAudioToSession,\n markSessionComplete,\n markSessionFailed,\n getFailedSession,\n error,\n convertTranscriptionResponse,\n conversionError,\n clearError,\n createHL7TranscriptionRequest, // Add new dependencies\n createFHIRTranscriptionRequest,\n ]\n );\n\n // Assign the function to the ref for use in callbacks\n uploadChunkToServerRef.current = uploadChunkToServer;\n\n // Update the retry function to work with sessions\n const retryFailedSession = React.useCallback(async () => {\n setIsRetryingSession(true);\n try {\n const failedSession = await getFailedSession();\n\n if (failedSession) {\n const success = await retrySession(failedSession.id);\n if (success) {\n console.log(`Successfully retried session ${failedSession.id}`);\n setError(null);\n }\n }\n } catch (error) {\n console.error(\"Error retrying failed sessions:\", error);\n setError(\"Failed to retry sessions. Please try again.\");\n } finally {\n setIsRetryingSession(false);\n }\n }, [retrySession, getFailedSession]);\n\n const startRecording = React.useCallback(async () => {\n try {\n // Clear any previous errors\n setError(null);\n setNoAudioDetected(false);\n\n // Pre-flight microphone check\n const micValid = await validateMicrophoneAccess();\n if (!micValid) {\n return;\n }\n\n audioSamplesRef.current = [];\n\n // Always create a new session when starting recording\n if (!isPaused) {\n setAlreadyDoneTranscription(\"\");\n setTranscriptionDone(false);\n // Reset sequence tracking\n sequenceCounterRef.current = 0;\n nextExpectedSequenceRef.current = 0;\n receivedTranscriptionsRef.current.clear();\n\n // Create new LOCAL session ID for IndexedDB storage\n const localSessionId = `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n localSessionIdRef.current = localSessionId;\n\n // Reset server session ID (will be set when server responds)\n sessionIdRef.current = null;\n\n console.log(\"Created local session ID for IndexedDB:\", localSessionId);\n\n await createSession(localSessionId, {\n patientId,\n patientName: patientName || undefined,\n patientHistory: patientHistory || undefined,\n speciality,\n });\n }\n\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: currentDeviceId ? { exact: currentDeviceId } : undefined,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n mediaStreamRef.current = stream;\n\n // Track device info\n const audioTracks = stream.getAudioTracks();\n if (audioTracks.length > 0) {\n const track = audioTracks[0];\n const settings = track.getSettings();\n setCurrentDeviceId(settings.deviceId || null);\n console.log(\"Recording started with local session:\", localSessionIdRef.current);\n\n // Monitor for device disconnection\n track.addEventListener(\"ended\", () => {\n console.log(\"Audio track ended - device disconnected\");\n setError(\"Microphone disconnected. Session saved - please reconnect and retry.\");\n stopRecording();\n });\n }\n\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n\n // Create audio processor worker dynamically\n const processorUrl = createAudioProcessorWorker();\n await audioContext.audioWorklet.addModule(processorUrl);\n\n // Clean up the blob URL\n URL.revokeObjectURL(processorUrl);\n\n const processor = new AudioWorkletNode(audioContext, \"audio-processor\");\n\n processor.port.onmessage = (event) => {\n const {\n command,\n audioBuffer,\n level,\n silentDuration,\n hasDetectedAudio,\n isInitialPhase,\n totalRecordingTime,\n lastAudioTime,\n } = event.data;\n\n // Handle chunk messages (increment sequence only for actual chunks)\n if (command === \"finalChunk\" && audioBuffer) {\n const sequence = sequenceCounterRef.current++;\n const audioArray = new Float32Array(audioBuffer);\n console.log(`[RECEIVE] Final chunk: ${audioArray.length} samples, sequence: ${sequence}`);\n enqueueChunk(audioArray, true, sequence);\n } else if (command === \"chunk\" && audioBuffer) {\n const sequence = sequenceCounterRef.current++;\n const audioArray = new Float32Array(audioBuffer);\n console.log(`[RECEIVE] Chunk: ${audioArray.length} samples, sequence: ${sequence}`);\n enqueueChunk(audioArray, false, sequence);\n } else if (command === \"pauseChunk\" && audioBuffer) {\n const sequence = sequenceCounterRef.current++;\n console.log(`[RECEIVE] Pause chunk with audioBuffer, sequence: ${sequence}`);\n enqueueChunk(new Float32Array(audioBuffer), false, sequence, true);\n } else if (command === \"audioLevel\") {\n setAudioLevel(level);\n } else if (command === \"prolongedSilence\") {\n console.log(\n `Prolonged silence detected: ${Math.round(silentDuration)}s silent, ${Math.round(\n totalRecordingTime\n )}s total, last audio ${Math.round(lastAudioTime)}s ago`\n );\n } else if (command === \"noAudioDetected\") {\n console.log(\n `No audio detected: ${Math.round(\n silentDuration\n )}s silent, hasDetectedAudio: ${hasDetectedAudio}, isInitialPhase: ${isInitialPhase}`\n );\n setNoAudioDetected(true);\n\n let errorMessage;\n if (isInitialPhase && !hasDetectedAudio) {\n errorMessage = `No audio input detected for ${Math.round(\n silentDuration\n )} seconds. Please check your microphone setup.`;\n } else {\n errorMessage = `Extended silence detected (${Math.round(\n silentDuration\n )} seconds). Recording has been stopped.`;\n }\n\n setError(errorMessage);\n stopRecording();\n }\n };\n\n const source = audioContext.createMediaStreamSource(stream);\n source.connect(processor);\n\n audioContextRef.current = audioContext;\n processorRef.current = processor;\n setIsRecording(true);\n\n const intervalId = window.setInterval(() => {\n processorRef.current?.port.postMessage({ command: \"uploadChunk\" });\n }, 47000);\n setUploadChunkInterval(intervalId);\n } catch (err) {\n console.error(\"Recording start failed:\", err);\n // Error handling remains the same...\n }\n }, [\n validateMicrophoneAccess,\n isPaused,\n createSession,\n patientId,\n patientName,\n patientHistory,\n speciality,\n currentDeviceId,\n ]);\n\n const stopRecording = React.useCallback(async () => {\n console.log(\"Stopping recording...\");\n\n if (uploadChunkInterval) {\n clearInterval(uploadChunkInterval);\n setUploadChunkInterval(null);\n }\n\n if (processorRef.current) {\n console.log(\"Stopping recording and sending final chunk --> \", isPaused ? \"paused\" : \"final\");\n processorRef.current.port.postMessage({ command: \"stop\" });\n\n setTimeout(async () => {\n if (processorRef.current) {\n processorRef.current.disconnect();\n processorRef.current = null;\n }\n if (audioContextRef.current && audioContextRef.current.state !== \"closed\") {\n await audioContextRef.current.close();\n audioContextRef.current = null;\n }\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach((track) => track.stop());\n mediaStreamRef.current = null;\n }\n }, 500);\n }\n\n setIsRecording(false);\n }, [uploadChunkInterval]);\n\n // Device change monitoring\n React.useEffect(() => {\n const handleDeviceChange = async () => {\n console.log(\"Audio device change detected\");\n\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const audioInputDevices = devices.filter((device) => device.kind === \"audioinput\");\n setAvailableDevices(audioInputDevices);\n\n // If no audio devices are available, set error\n if (audioInputDevices.length === 0) {\n setError(\"No microphone devices detected. Please connect a microphone.\");\n return;\n }\n\n // Check if current device is still available during recording\n if (isRecording && currentDeviceId) {\n const currentDeviceExists = audioInputDevices.some(\n (device) => device.deviceId === currentDeviceId\n );\n if (!currentDeviceExists) {\n setError(\"Microphone disconnected during recording. Please reconnect and restart.\");\n stopRecording();\n }\n }\n } catch (error) {\n console.error(\"Device change detection failed:\", error);\n setError(\"Unable to detect audio devices. Please check your microphone permissions.\");\n }\n };\n\n navigator.mediaDevices.addEventListener(\"devicechange\", handleDeviceChange);\n\n return () => {\n navigator.mediaDevices.removeEventListener(\"devicechange\", handleDeviceChange);\n };\n }, [isRecording, currentDeviceId, stopRecording]);\n\n // Device selection handler\n const selectMicrophone = React.useCallback(\n async (deviceId: string) => {\n try {\n setCurrentDeviceId(deviceId);\n\n // Restart recording with new device if currently recording\n if (isRecording) {\n stopRecording();\n setTimeout(() => {\n startRecording();\n }, 1000);\n }\n } catch (error) {\n console.error(\"Device selection failed:\", error);\n setError(\"Failed to switch to selected microphone.\");\n }\n },\n [isRecording, stopRecording, startRecording]\n );\n\n const pauseRecording = React.useCallback(() => {\n if (!isRecording || isPaused) return;\n\n // Stop the upload chunk timer\n if (uploadChunkInterval) {\n clearInterval(uploadChunkInterval);\n setUploadChunkInterval(null);\n }\n\n setIsPaused(true);\n\n // Suspend the worklet processor (this will automatically send pauseChunk)\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"pause\" });\n }\n\n setIsRecording(false);\n }, [isRecording, isPaused, uploadChunkInterval]);\n\n // Add resumeRecording update to reset no audio detection\n const resumeRecording = React.useCallback(() => {\n if (!isPaused) return;\n setIsPaused(false);\n setIsRecording(true);\n setNoAudioDetected(false); // Reset no audio detection when resuming\n\n // Resume the worklet processor\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"resume\" });\n }\n\n // Restart the upload chunk timer\n const intervalId = window.setInterval(() => {\n processorRef.current?.port.postMessage({ command: \"uploadChunk\" });\n }, 47000);\n setUploadChunkInterval(intervalId);\n }, [isPaused]);\n\n const processNextChunkInQueue = React.useCallback(() => {\n if (isProcessingQueueRef.current || chunkQueueRef.current.length === 0) return;\n\n const { chunk, isFinal, sequence, isPaused = false } = chunkQueueRef.current.shift()!;\n console.log(`[QUEUE] Processing chunk ${sequence} from queue, remaining: ${chunkQueueRef.current.length}`);\n isProcessingQueueRef.current = true;\n\n uploadChunkToServer(chunk, isFinal, sequence, false, isPaused).finally(() => {\n console.log(`[QUEUE] Finished processing chunk ${sequence}`);\n isProcessingQueueRef.current = false;\n processNextChunkInQueue();\n });\n }, [uploadChunkToServer, isLoaded]);\n\n const enqueueChunk = React.useCallback(\n (\n audioData: Float32Array | null,\n isFinalChunk: boolean,\n sequence: number,\n isPausedChunk = false\n ) => {\n console.log(`[QUEUE] Enqueuing ${isFinalChunk ? 'FINAL' : isPausedChunk ? 'PAUSED' : 'regular'} chunk ${sequence}, samples: ${audioData?.length || 0}, queue size: ${chunkQueueRef.current.length}`);\n\n if (isFinalChunk) {\n setIsProcessing(true);\n }\n\n chunkQueueRef.current.push({\n chunk: audioData,\n isFinal: isFinalChunk,\n sequence,\n isPaused: isPausedChunk,\n });\n processNextChunkInQueue();\n },\n [processNextChunkInQueue, isLoaded]\n );\n\n const float32ToWavFile = (samples: Float32Array): File => {\n const sampleRate = audioContextRef.current?.sampleRate || 44100;\n const buffer = new ArrayBuffer(44 + samples.length * 2);\n const view = new DataView(buffer);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, \"RIFF\");\n view.setUint32(4, 36 + samples.length * 2, true);\n writeString(8, \"WAVE\");\n writeString(12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, \"data\");\n view.setUint32(40, samples.length * 2, true);\n\n let offset = 44;\n for (let i = 0; i < samples.length; i++) {\n const sample = Math.max(-1, Math.min(1, samples[i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n offset += 2;\n }\n\n // Create File instead of Blob\n const timestamp = Date.now();\n const filename = `audio-chunk-${timestamp}.wav`;\n\n return new File([view], filename, {\n type: \"audio/wav\",\n lastModified: timestamp,\n });\n };\n\n // Add a test function to verify audio capture\n const testAudioCapture = useCallback(async () => {\n try {\n console.log(\"Audio Test Starting audio capture test...\");\n\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: false,\n noiseSuppression: false,\n autoGainControl: false,\n },\n });\n\n console.log(\"Audio Test Got media stream:\", stream.id);\n\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const source = audioContext.createMediaStreamSource(stream);\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 256;\n source.connect(analyser);\n\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n\n let testCount = 0;\n const testInterval = setInterval(() => {\n analyser.getByteFrequencyData(dataArray);\n const average = dataArray.reduce((a, b) => a + b) / dataArray.length;\n const max = Math.max(...dataArray);\n\n console.log(\n `Audio Test Frame ${testCount}: avg=${average.toFixed(2)}, max=${max}, hasSound=${max > 10 ? \"YES\" : \"NO\"}`\n );\n\n testCount++;\n if (testCount >= 10) {\n clearInterval(testInterval);\n stream.getTracks().forEach((track) => track.stop());\n audioContext.close();\n console.log(\"Audio Test Audio capture test complete\");\n }\n }, 500);\n } catch (error) {\n console.error(\"Audio Test Audio capture test failed:\", error);\n }\n }, []);\n\n return {\n mediaStreamRef,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isRecording,\n isPaused,\n isProcessing,\n error: error,\n transcriptionDone,\n // New microphone features\n availableDevices,\n currentDeviceId,\n selectMicrophone,\n validateMicrophoneAccess,\n // Add audio monitoring properties\n audioLevel,\n noAudioDetected,\n // Add recovery-related properties\n showRetrySessionPrompt,\n isRetryingSession,\n retryFailedSession,\n clearAllSessions,\n // Add FFmpeg status - THIS IS THE MISSING PART\n isConverting,\n progress,\n statusMessage,\n // Add test function for debugging\n testAudioCapture,\n };\n};\n\nexport default useAudioRecorder;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Check, AlertCircle, X as XIcon } from \"lucide-react\";\n\nexport interface ToastProps {\n message: string;\n type: \"success\" | \"error\" | \"info\";\n onClose: () => void;\n duration?: number;\n onCancelRedirect?: () => void;\n}\n\nexport default function Toast({\n message,\n type,\n onClose,\n duration = 3000,\n onCancelRedirect,\n}: ToastProps) {\n React.useEffect(() => {\n const timer = setTimeout(() => {\n onClose();\n }, duration);\n\n return () => clearTimeout(timer);\n }, [onClose, duration]);\n\n const getIcon = () => {\n switch (type) {\n case \"success\":\n return <Check className=\"h-5 w-5\" />;\n case \"error\":\n return <AlertCircle className=\"h-5 w-5\" />;\n case \"info\":\n default:\n return <AlertCircle className=\"h-5 w-5\" />;\n }\n };\n\n const getColorClasses = () => {\n switch (type) {\n case \"success\":\n return \"bg-green-500 text-white\";\n case \"error\":\n return \"bg-red-500 text-white\";\n case \"info\":\n default:\n return \"bg-blue-500 text-white\";\n }\n };\n\n return (\n <div\n className={`fixed top-4 right-4 z-50 py-3 px-4 rounded-lg shadow-lg max-w-sm ${getColorClasses()}`}\n >\n <div className=\"flex items-center space-x-3\">\n {getIcon()}\n <span className=\"flex-1\">{message}</span>\n <button\n onClick={onClose}\n className=\"ml-2 hover:bg-white/20 rounded-full p-1 transition-colors\"\n >\n <XIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\ninterface AudioVisualizerImprovedProps {\n mediaStream: MediaStream | null;\n isRecording: boolean;\n forceLight?: boolean; // Add a prop to force light theme\n}\n\n// Color palette with complementary gradient stops for more sophisticated visuals\nconst COLORS = {\n primary: [\"rgba(139, 92, 246, 0.9)\", \"rgba(168, 85, 247, 0.8)\", \"rgba(192, 132, 252, 0.7)\"], // Purples\n accent: [\"rgba(79, 70, 229, 0.7)\", \"rgba(99, 102, 241, 0.6)\", \"rgba(129, 140, 248, 0.5)\"], // Indigos\n highlight: [\"rgba(236, 72, 153, 0.7)\", \"rgba(244, 114, 182, 0.6)\", \"rgba(249, 168, 212, 0.5)\"], // Pinks\n background: [\"rgba(76, 29, 149, 0.6)\", \"rgba(91, 33, 182, 0.3)\", \"rgba(30, 27, 75, 0.1)\"], // Dark purples\n};\n\ninterface Particle {\n x: number;\n y: number;\n vx: number;\n vy: number;\n size: number;\n color: string;\n life: number;\n maxLife: number;\n type: \"dot\" | \"circle\" | \"triangle\";\n}\n\nfunction createParticle(isIdle: boolean, x: number, y: number, intensity: number = 1): Particle {\n // Choose a particle type with weighted randomness\n const typeRandom = Math.random();\n let type: \"dot\" | \"circle\" | \"triangle\";\n if (typeRandom < 0.7) {\n type = \"dot\";\n } else if (typeRandom < 0.9) {\n type = \"circle\";\n } else {\n type = \"triangle\";\n }\n\n // Different colors for idle vs active\n let color: string;\n const hue = isIdle ? 260 + Math.random() * 40 : 290 + Math.random() * 50;\n const saturation = 70 + Math.random() * 30;\n const lightness = 50 + Math.random() * 30;\n color = `hsla(${hue}, ${saturation}%, ${lightness}%, 0.7)`;\n\n // Adjust velocity and life based on state\n const speed = isIdle ? 0.5 + Math.random() : 2 + Math.random() * 5 * intensity;\n const angle = Math.random() * Math.PI * 2;\n const maxLife = isIdle ? 80 + Math.random() * 40 : 50 + Math.random() * 30;\n\n return {\n x,\n y,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n size: 1 + Math.random() * 4 * intensity,\n color,\n life: 0,\n maxLife,\n type,\n };\n}\n\nexport default function AudioVisualizerImproved({\n mediaStream,\n isRecording,\n forceLight = true, // Default to light theme for login page\n}: AudioVisualizerImprovedProps) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n const animationFrameRef = React.useRef<number>(0);\n const analyserRef = React.useRef<AnalyserNode | null>(null);\n const dataArrayRef = React.useRef<Uint8Array<ArrayBuffer> | null>(null);\n const timeRef = React.useRef(0);\n const particlesRef = React.useRef<Particle[]>([]);\n const lastAudioLevelRef = React.useRef(0);\n const lastTimeRef = React.useRef(Date.now());\n const [isDarkMode, setIsDarkMode] = React.useState(false);\n\n React.useEffect(() => {\n // Detect dark mode after component mounts (client-side only)\n const checkDarkMode = () => {\n const darkModeEnabled = document.documentElement.classList.contains(\"dark\");\n setIsDarkMode(forceLight ? false : darkModeEnabled);\n };\n\n // Check initially\n checkDarkMode();\n\n // Setup mutation observer to watch for theme changes\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === \"class\" && mutation.target === document.documentElement) {\n checkDarkMode();\n }\n });\n });\n\n observer.observe(document.documentElement, { attributes: true });\n\n return () => {\n observer.disconnect();\n };\n }, [forceLight]);\n\n React.useEffect(() => {\n if (!canvasRef.current) return;\n\n const audioContext = new AudioContext();\n analyserRef.current = audioContext.createAnalyser();\n analyserRef.current.fftSize = 512; // Increased for more detailed frequency analysis\n const bufferLength = analyserRef.current.frequencyBinCount;\n dataArrayRef.current = new Uint8Array(new ArrayBuffer(bufferLength));\n\n if (mediaStream && isRecording) {\n const source = audioContext.createMediaStreamSource(mediaStream);\n source.connect(analyserRef.current);\n }\n\n // Create a pool of idle particles\n if (particlesRef.current.length === 0) {\n for (let i = 0; i < 20; i++) {\n const canvas = canvasRef.current;\n if (!canvas) continue;\n\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const radius = Math.min(canvas.width, canvas.height) * 0.25;\n const angle = Math.random() * Math.PI * 2;\n const x = centerX + Math.cos(angle) * radius * Math.random();\n const y = centerY + Math.sin(angle) * radius * Math.random();\n\n particlesRef.current.push(createParticle(true, x, y));\n }\n }\n\n // Handle particles\n const updateParticles = (\n ctx: CanvasRenderingContext2D,\n deltaTime: number,\n centerX: number,\n centerY: number\n ) => {\n const newParticles: Particle[] = [];\n\n particlesRef.current.forEach((p) => {\n // Update position\n p.x += p.vx * deltaTime;\n p.y += p.vy * deltaTime;\n\n // Update lifetime\n p.life += deltaTime;\n\n // Only keep particles that haven't exceeded their lifetime\n if (p.life < p.maxLife) {\n // Calculate alpha based on life\n const progress = p.life / p.maxLife;\n const alpha = progress < 0.2 ? progress / 0.2 : 1 - (progress - 0.2) / 0.8;\n\n // Draw particle based on type\n ctx.globalAlpha = alpha * 0.8;\n\n switch (p.type) {\n case \"dot\":\n ctx.beginPath();\n ctx.fillStyle = p.color;\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.fill();\n break;\n\n case \"circle\":\n ctx.beginPath();\n ctx.strokeStyle = p.color;\n ctx.lineWidth = p.size / 3;\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.stroke();\n break;\n\n case \"triangle\":\n ctx.beginPath();\n ctx.fillStyle = p.color;\n const angle = Math.atan2(p.vy, p.vx);\n const size = p.size * 1.5;\n\n ctx.moveTo(p.x + Math.cos(angle) * size, p.y + Math.sin(angle) * size);\n ctx.lineTo(\n p.x + Math.cos(angle + (2 * Math.PI) / 3) * size,\n p.y + Math.sin(angle + (2 * Math.PI) / 3) * size\n );\n ctx.lineTo(\n p.x + Math.cos(angle + (4 * Math.PI) / 3) * size,\n p.y + Math.sin(angle + (4 * Math.PI) / 3) * size\n );\n ctx.closePath();\n ctx.fill();\n break;\n }\n\n ctx.globalAlpha = 1;\n newParticles.push(p);\n }\n });\n\n // Add new idle particles if necessary\n if (newParticles.length < 10) {\n const count = Math.min(3, 10 - newParticles.length);\n for (let i = 0; i < count; i++) {\n const radius =\n Math.min(canvasRef.current?.width || 0, canvasRef.current?.height || 0) * 0.25;\n const angle = Math.random() * Math.PI * 2;\n const x = centerX + Math.cos(angle) * radius * Math.random();\n const y = centerY + Math.sin(angle) * radius * Math.random();\n\n newParticles.push(createParticle(true, x, y));\n }\n }\n\n particlesRef.current = newParticles;\n };\n\n const draw = () => {\n if (!canvasRef.current || !analyserRef.current || !dataArrayRef.current) return;\n\n const now = Date.now();\n const deltaTime = (now - lastTimeRef.current) / 16.667; // Normalize to 60fps\n lastTimeRef.current = now;\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\", { alpha: false })!;\n\n // Set canvas dimensions to match container\n canvas.width = canvas.offsetWidth;\n canvas.height = canvas.offsetHeight;\n\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // Get audio data if recording\n let avgAudioLevel = 0;\n let frequencyData: number[] = [];\n let suddenImpact = 0;\n\n if (mediaStream && isRecording) {\n analyserRef.current.getByteFrequencyData(dataArrayRef.current);\n\n // Create a normalized copy of the frequency data for easier use\n frequencyData = Array.from(dataArrayRef.current).map((v) => v / 255);\n\n // Calculate average audio level\n const sum = frequencyData.reduce((acc, val) => acc + val, 0);\n avgAudioLevel = sum / frequencyData.length;\n\n // Detect sudden volume changes for impact effects\n suddenImpact = Math.max(0, avgAudioLevel - lastAudioLevelRef.current);\n lastAudioLevelRef.current = avgAudioLevel * 0.2 + lastAudioLevelRef.current * 0.8; // Smooth transition\n } else {\n // When not recording, create some dummy frequency data for idle animation\n const count = 128;\n frequencyData = Array(count)\n .fill(0)\n .map((_, i) => {\n const angle = (i / count) * Math.PI * 2;\n return 0.1 + Math.sin(angle * 4 + timeRef.current) * 0.05;\n });\n }\n\n // Update time for animations (scaled by deltaTime)\n timeRef.current += 0.01 * deltaTime;\n\n // Ensure white background in light mode, dark in dark mode\n ctx.fillStyle = isDarkMode ? \"#121826\" : \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Create multiple overlapping background gradients - adapt for dark mode\n const createDynamicBackground = () => {\n // Main pulsating gradient\n const pulseIntensity =\n 0.5 + (isRecording ? avgAudioLevel * 0.5 : Math.sin(timeRef.current * 0.2) * 0.2);\n const mainGradient = ctx.createRadialGradient(\n centerX,\n centerY,\n 0,\n centerX,\n centerY,\n canvas.width * 0.6 * pulseIntensity\n );\n\n if (isDarkMode) {\n // Dark mode gradient\n mainGradient.addColorStop(0, \"rgba(91, 33, 182, 0.4)\"); // Dark purple at center\n mainGradient.addColorStop(0.4, \"rgba(67, 56, 202, 0.3)\"); // Indigo midway\n mainGradient.addColorStop(0.6, \"rgba(30, 41, 59, 0.2)\"); // Slate blue\n mainGradient.addColorStop(1, \"rgba(18, 24, 38, 0.0)\"); // Transparent to let dark background show\n } else {\n // Light mode gradient\n mainGradient.addColorStop(0, \"rgba(228, 228, 255, 0.7)\"); // Very light purple at center\n mainGradient.addColorStop(0.4, \"rgba(240, 240, 255, 0.5)\");\n mainGradient.addColorStop(0.6, \"rgba(245, 245, 255, 0.3)\"); // Almost white at edges\n mainGradient.addColorStop(1, \"rgba(255, 255, 255, 0.0)\"); // Transparent to let white background show\n }\n\n ctx.fillStyle = mainGradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Add subtle light sources that move around\n const lightCount = 3;\n for (let i = 0; i < lightCount; i++) {\n const angle = timeRef.current * 0.2 + (i / lightCount) * Math.PI * 2;\n const distance = canvas.width * 0.2 * (0.5 + Math.sin(timeRef.current * 0.3 + i) * 0.3);\n\n const lightX = centerX + Math.cos(angle) * distance;\n const lightY = centerY + Math.sin(angle) * distance;\n\n const lightGradient = ctx.createRadialGradient(\n lightX,\n lightY,\n 0,\n lightX,\n lightY,\n canvas.width * 0.4\n );\n\n // Use different colors for each light\n const alpha = 0.12 + Math.sin(timeRef.current + i) * 0.06;\n if (i === 0) {\n lightGradient.addColorStop(0, `rgba(192, 132, 252, ${alpha})`); // Purple\n lightGradient.addColorStop(1, \"rgba(192, 132, 252, 0)\");\n } else if (i === 1) {\n lightGradient.addColorStop(0, `rgba(129, 140, 248, ${alpha})`); // Indigo\n lightGradient.addColorStop(1, \"rgba(129, 140, 248, 0)\");\n } else {\n lightGradient.addColorStop(0, `rgba(244, 114, 182, ${alpha})`); // Pink\n lightGradient.addColorStop(1, \"rgba(244, 114, 182, 0)\");\n }\n\n ctx.fillStyle = lightGradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n };\n\n createDynamicBackground();\n\n // Update and draw particles\n updateParticles(ctx, deltaTime, centerX, centerY);\n\n // Draw main visualization elements\n if (isRecording) {\n // Draw spectrum visualization with improved style\n const drawCircularSpectrum = () => {\n const barCount = Math.min(frequencyData.length, 180); // Limit for performance\n const baseRadius = Math.min(canvas.width, canvas.height) * 0.22; // Reduced from 0.25 to 0.22\n\n // Draw circular frequency bars with enhanced styling\n ctx.save();\n\n // Add impact effect on sudden audio change\n if (suddenImpact > 0.08) {\n ctx.shadowBlur = 30 * suddenImpact;\n ctx.shadowColor = \"rgba(236, 72, 153, 0.7)\"; // Pink glow on impact\n\n // Add particles on impact\n const impactParticles = Math.floor(suddenImpact * 20);\n for (let i = 0; i < impactParticles; i++) {\n particlesRef.current.push(createParticle(false, centerX, centerY, suddenImpact * 5));\n }\n }\n\n // Draw frequency bars\n for (let i = 0; i < barCount; i++) {\n const value = frequencyData[i];\n const angle = (i / barCount) * Math.PI * 2;\n\n // Make the visualization more dynamic - higher frequencies have more variation\n const frequencyFactor = 0.5 + (i / barCount) * 1.5;\n const amplifiedValue = Math.pow(value, 1.5) * frequencyFactor;\n\n // Calculate bar dimensions\n const barHeight = baseRadius * 0.2 + amplifiedValue * baseRadius * 0.8;\n const barWidth = ((Math.PI * 2 * baseRadius) / barCount) * 1.2; // Slightly overlapping\n\n // Bar start and end points\n const innerRadius = baseRadius * (0.8 - amplifiedValue * 0.1); // Inner radius contracts with sound\n const outerRadius = innerRadius + barHeight;\n\n const x1 = centerX + Math.cos(angle) * innerRadius;\n const y1 = centerY + Math.sin(angle) * innerRadius;\n const x2 = centerX + Math.cos(angle) * outerRadius;\n const y2 = centerY + Math.sin(angle) * outerRadius;\n\n // Create gradient for each bar\n const gradient = ctx.createLinearGradient(x1, y1, x2, y2);\n\n // Use more sophisticated color mapping based on frequency\n const hue = 260 + (i / barCount) * 60; // 260-320 range (purples to magentas)\n const saturation = 80 + value * 20;\n const lightness = 50 + value * 30;\n const alpha = 0.5 + value * 0.5;\n\n gradient.addColorStop(\n 0,\n `hsla(${hue}, ${saturation}%, ${lightness - 20}%, ${alpha * 0.3})`\n );\n gradient.addColorStop(0.5, `hsla(${hue}, ${saturation}%, ${lightness}%, ${alpha})`);\n gradient.addColorStop(\n 1,\n `hsla(${hue}, ${saturation}%, ${lightness + 20}%, ${alpha * 0.8})`\n );\n\n // Draw bar with rounded caps for smoother look\n ctx.beginPath();\n ctx.strokeStyle = gradient;\n ctx.lineWidth = barWidth;\n ctx.lineCap = \"round\";\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n\n // Add glow proportional to value\n ctx.shadowBlur = 10 * value;\n ctx.shadowColor = `hsla(${hue}, 100%, 70%, 0.7)`;\n\n ctx.stroke();\n\n // Add particles at the end of loud frequency bars\n if (value > 0.7 && Math.random() < value * 0.05) {\n particlesRef.current.push(createParticle(false, x2, y2, value));\n }\n }\n\n // Add connecting elements between the bars\n ctx.beginPath();\n ctx.lineWidth = 2;\n\n const pathPoints: [number, number][] = [];\n const smoothFactor = 0.3;\n\n for (let i = 0; i < barCount; i++) {\n const value = frequencyData[i];\n const angle = (i / barCount) * Math.PI * 2;\n const radius = baseRadius * (1 + value * 0.8);\n\n const x = centerX + Math.cos(angle) * radius;\n const y = centerY + Math.sin(angle) * radius;\n\n pathPoints.push([x, y]);\n }\n\n // Draw a smooth curve through all points\n ctx.beginPath();\n ctx.moveTo(pathPoints[0][0], pathPoints[0][1]);\n\n for (let i = 0; i < pathPoints.length; i++) {\n const current = pathPoints[i];\n const next = pathPoints[(i + 1) % pathPoints.length];\n\n // Calculate control points for smooth curve\n const xc = (current[0] + next[0]) / 2;\n const yc = (current[1] + next[1]) / 2;\n\n ctx.quadraticCurveTo(current[0], current[1], xc, yc);\n }\n\n // Create gradient for the connecting curve\n const strokeGradient = ctx.createLinearGradient(\n centerX - baseRadius,\n centerY - baseRadius,\n centerX + baseRadius,\n centerY + baseRadius\n );\n\n strokeGradient.addColorStop(0, \"rgba(192, 132, 252, 0.4)\");\n strokeGradient.addColorStop(0.5, \"rgba(129, 140, 248, 0.3)\");\n strokeGradient.addColorStop(1, \"rgba(236, 72, 153, 0.4)\");\n\n ctx.strokeStyle = strokeGradient;\n ctx.lineWidth = 2;\n ctx.stroke();\n\n // Add a subtle fill\n const fillGradient = ctx.createRadialGradient(\n centerX,\n centerY,\n baseRadius * 0.5,\n centerX,\n centerY,\n baseRadius * 1.5\n );\n\n fillGradient.addColorStop(0, \"rgba(192, 132, 252, 0.03)\");\n fillGradient.addColorStop(0.7, \"rgba(129, 140, 248, 0.02)\");\n fillGradient.addColorStop(1, \"rgba(236, 72, 153, 0.01)\");\n\n ctx.fillStyle = fillGradient;\n ctx.fill();\n\n ctx.restore();\n };\n\n drawCircularSpectrum();\n\n // Add central element that pulses with the beat\n const drawCentralElement = () => {\n const bassValue = frequencyData.slice(0, 10).reduce((sum, val) => sum + val, 0) / 10;\n const pulseSize = 5 + bassValue * 40;\n\n // Multi-layered central element\n for (let i = 0; i < 3; i++) {\n const size = pulseSize * (1 - i * 0.2);\n const alpha = 0.7 - i * 0.2;\n\n ctx.beginPath();\n ctx.arc(centerX, centerY, size, 0, Math.PI * 2);\n\n const gradient = ctx.createRadialGradient(centerX, centerY, 0, centerX, centerY, size);\n\n gradient.addColorStop(0, `rgba(236, 72, 153, ${alpha})`); // Pink core\n gradient.addColorStop(0.5, `rgba(192, 132, 252, ${alpha * 0.8})`); // Purple mid\n gradient.addColorStop(1, `rgba(129, 140, 248, ${alpha * 0.1})`); // Indigo edge\n\n ctx.fillStyle = gradient;\n ctx.shadowBlur = 20 * bassValue;\n ctx.shadowColor = \"rgba(236, 72, 153, 0.8)\";\n ctx.fill();\n }\n };\n\n drawCentralElement();\n } else {\n // Idle animation when not recording\n const drawIdleAnimation = () => {\n const idleRadius = Math.min(canvas.width, canvas.height) * 0.22;\n\n // Multiple layers of animated circles\n for (let layer = 0; layer < 3; layer++) {\n ctx.beginPath();\n ctx.strokeStyle = `rgba(192, 132, 252, ${0.4 - layer * 0.1})`;\n ctx.lineWidth = 3 - layer * 0.7;\n\n const layerPoints = 120;\n const layerOffset = (layer * Math.PI) / 6;\n const layerSpeed = 1 - layer * 0.2;\n const layerRadius = idleRadius * (1 + layer * 0.15);\n\n ctx.beginPath();\n\n for (let i = 0; i < layerPoints; i++) {\n const angle = (i / layerPoints) * Math.PI * 2;\n const noise1 = Math.sin(angle * 5 + timeRef.current * layerSpeed) * 5;\n const noise2 = Math.cos(angle * 7 + timeRef.current * layerSpeed * 1.5) * 5;\n const wobble = noise1 + noise2;\n\n const x = centerX + Math.cos(angle + layerOffset) * (layerRadius + wobble);\n const y = centerY + Math.sin(angle + layerOffset) * (layerRadius + wobble);\n\n if (i === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n\n ctx.closePath();\n ctx.stroke();\n\n // Add subtle glow\n ctx.shadowBlur = 10;\n ctx.shadowColor = \"rgba(192, 132, 252, 0.5)\";\n }\n\n // Pulsating center\n const pulseSize = 8 + Math.sin(timeRef.current) * 4;\n\n // Multi-layered central dot\n for (let i = 0; i < 3; i++) {\n const size = pulseSize * (1 - i * 0.2);\n ctx.beginPath();\n ctx.arc(centerX, centerY, size, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(192, 132, 252, ${0.7 - i * 0.2})`;\n ctx.shadowBlur = 15;\n ctx.shadowColor = \"rgba(192, 132, 252, 0.8)\";\n ctx.fill();\n }\n };\n\n drawIdleAnimation();\n }\n\n animationFrameRef.current = requestAnimationFrame(draw);\n };\n\n draw();\n\n return () => {\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, [mediaStream, isRecording, isDarkMode]);\n\n return (\n <div className=\"w-full flex justify-center items-center overflow-visible\">\n <div className=\"px-4 py-2 w-full h-full\">\n <div className=\"w-full h-full aspect-square max-w-md mx-auto relative\">\n {/* Outer background circle */}\n <div\n className={`absolute inset-0 rounded-full ${isDarkMode ? \"bg-gray-900\" : \"bg-white\"}`}\n style={{\n background: isDarkMode\n ? \"linear-gradient(135deg, rgba(17, 24, 39, 0.4) 0%, rgba(17, 24, 39, 0.2) 100%)\"\n : \"white\",\n transform: \"scale(1.08)\",\n zIndex: -1,\n boxShadow: isDarkMode\n ? \"inset 0 0 30px rgba(0, 0, 0, 0.5)\"\n : \"inset 0 0 10px rgba(0, 0, 0, 0.05)\",\n }}\n ></div>\n {/* Canvas for visualization */}\n <canvas\n ref={canvasRef}\n className={`w-full h-full rounded-full ${isDarkMode ? \"bg-gray-900\" : \"bg-white\"}`}\n style={{\n boxShadow: isDarkMode ? \"inset 0 0 20px rgba(13, 18, 30, 0.8)\" : \"none\",\n background: isDarkMode\n ? \"linear-gradient(135deg, rgba(13, 18, 30, 1) 0%, rgba(13, 18, 30, 1) 100%)\"\n : \"white\",\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { AudioRecorderProps, APIResponse, APIOptions } from \"./types\";\nimport useAudioRecorder from \"./hooks/useAudioRecorder\";\nimport { Mic, Square, Loader2, Pause, Play, AlertTriangle } from \"lucide-react\";\nimport Toast from \"./components/Toast\";\nimport AudioVisualizerImproved from \"./components/AudioVisualizerImproved\";\n\n// Embedded minimal Tailwind utilities\nconst tailwindStyles = `\n .space-y-4 > :not([hidden]) ~ :not([hidden]) { margin-top: 1rem; }\n .bg-orange-50 { background-color: rgb(255 247 237); }\n .bg-blue-900 { background-color: rgb(30 58 138); }\n .text-yellow-200 { color: rgb(254 240 138); }\n .hover\\\\:bg-blue-700:hover { background-color: rgb(29 78 216); }\n .dark .dark\\\\:bg-orange-900\\\\/20 { background-color: rgb(194 65 12 / 0.2); }\n .border { border-width: 1px; }\n .border-orange-200 { border-color: rgb(254 215 170); }\n .dark .dark\\\\:border-orange-800 { border-color: rgb(154 52 18); }\n .rounded-lg { border-radius: 0.5rem; }\n .p-4 { padding: 1rem; }\n .flex { display: flex; }\n .items-start { align-items: flex-start; }\n .items-center { align-items: center; }\n .justify-center { justify-content: center; }\n .flex-shrink-0 { flex-shrink: 0; }\n .h-5 { height: 1.25rem; }\n .w-5 { width: 1.25rem; }\n .text-orange-400 { color: rgb(251 146 60); }\n .ml-3 { margin-left: 0.75rem; }\n .flex-1 { flex: 1 1 0%; }\n .text-sm { font-size: 0.875rem; line-height: 1.25rem; }\n .font-medium { font-weight: 500; }\n .text-orange-800 { color: rgb(154 52 18); }\n .dark .dark\\\\:text-orange-200 { color: rgb(254 215 170); }\n .mt-2 { margin-top: 0.5rem; }\n .text-orange-700 { color: rgb(194 65 12); }\n .dark .dark\\\\:text-orange-300 { color: rgb(253 186 116); }\n .list-disc { list-style-type: disc; }\n .list-inside { list-style-position: inside; }\n .bg-red-50 { background-color: rgb(254 242 242); }\n .dark .dark\\\\:bg-red-900\\\\/20 { background-color: rgb(127 29 29 / 0.2); }\n .border-red-200 { border-color: rgb(254 202 202); }\n .dark .dark\\\\:border-red-800 { border-color: rgb(153 27 27); }\n .text-red-400 { color: rgb(248 113 113); }\n .text-red-800 { color: rgb(153 27 27); }\n .dark .dark\\\\:text-red-200 { color: rgb(254 202 202); }\n .text-red-700 { color: rgb(185 28 28); }\n .dark .dark\\\\:text-red-300 { color: rgb(252 165 165); }\n .mt-4 { margin-top: 1rem; }\n .bg-red-600 { background-color: rgb(220 38 38); }\n .hover\\\\:bg-red-700:hover { background-color: rgb(185 28 28); }\n .text-white { color: rgb(255 255 255); }\n .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }\n .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }\n .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\n .px-4 { padding-left: 1rem; padding-right: 1rem; }\n .rounded { border-radius: 0.25rem; }\n .rounded-full { border-radius: 9999px; }\n .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }\n .bg-yellow-50 { background-color: rgb(254 252 232); }\n .dark .dark\\\\:bg-yellow-900\\\\/20 { background-color: rgb(133 77 14 / 0.2); }\n .border-yellow-200 { border-color: rgb(254 240 138); }\n .dark .dark\\\\:border-yellow-800 { border-color: rgb(133 77 14); }\n .text-yellow-400 { color: rgb(250 204 21); }\n .text-yellow-800 { color: rgb(133 77 14); }\n .dark .dark\\\\:text-yellow-200 { color: rgb(254 240 138); }\n .text-yellow-700 { color: rgb(161 98 7); }\n .dark .dark\\\\:text-yellow-300 { color: rgb(253 224 71); }\n .space-x-3 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.75rem; }\n .space-x-1 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.25rem; }\n .space-x-2 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.5rem; }\n .bg-yellow-600 { background-color: rgb(202 138 4); }\n .hover\\\\:bg-yellow-700:hover { background-color: rgb(161 98 7); }\n .disabled\\\\:opacity-50:disabled { opacity: 0.5; }\n .h-3 { height: 0.75rem; }\n .w-3 { width: 0.75rem; }\n .animate-spin { animation: spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n .bg-gray-600 { background-color: rgb(75 85 99); }\n .hover\\\\:bg-gray-700:hover { background-color: rgb(55 65 81); }\n .bg-blue-50 { background-color: rgb(239 246 255); }\n .dark .dark\\\\:bg-blue-900\\\\/20 { background-color: rgb(30 58 138 / 0.2); }\n .border-blue-200 { border-color: rgb(191 219 254); }\n .dark .dark\\\\:border-blue-800 { border-color: rgb(30 64 175); }\n .text-blue-600 { color: rgb(37 99 235); }\n .block { display: block; }\n .text-blue-700 { color: rgb(29 78 216); }\n .dark .dark\\\\:text-blue-300 { color: rgb(147 197 253); }\n .text-xs { font-size: 0.75rem; line-height: 1rem; }\n .dark .dark\\\\:text-blue-400 { color: rgb(96 165 250); }\n .mt-1 { margin-top: 0.25rem; }\n .bg-teal-600 { background-color: rgb(13 148 136); }\n .hover\\\\:bg-teal-700:hover { background-color: rgb(15 118 110); }\n .bg-green-600 { background-color: rgb(22 163 74); }\n .hover\\\\:bg-green-700:hover { background-color: rgb(21 128 61); }\n .bg-yellow-500 { background-color: rgb(234 179 8); }\n .hover\\\\:bg-yellow-600:hover { background-color: rgb(202 138 4); }\n .bg-gradient-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); }\n .from-orange-400 { --tw-gradient-from: #fb923c; --tw-gradient-to: rgb(251 146 60 / 0); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }\n .to-pink-500 { --tw-gradient-to: #ec4899; }\n .hover\\\\:from-orange-500:hover { --tw-gradient-from: #f97316; --tw-gradient-to: rgb(249 115 22 / 0); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }\n .hover\\\\:to-pink-600:hover { --tw-gradient-to: #db2777; }\n .opacity-50 { opacity: 0.5; }\n .cursor-not-allowed { cursor: not-allowed; }\n`;\n\n// Inject styles only once\nlet stylesInjected = false;\nconst injectTailwindStyles = () => {\n if (!stylesInjected && typeof document !== 'undefined') {\n const styleElement = document.createElement('style');\n styleElement.textContent = tailwindStyles;\n document.head.appendChild(styleElement);\n stylesInjected = true;\n }\n};\n\nconst AudioRecorder: React.FC<AudioRecorderProps> = ({\n apiKey,\n apiBaseUrl,\n speciality,\n patientId,\n patientName,\n patientHistory,\n selectedFormat = \"json\",\n onTranscriptionUpdate,\n onTranscriptionComplete,\n onSuccess,\n onError,\n className = \"\",\n style,\n}) => {\n // Inject Tailwind styles on component mount\n React.useEffect(() => {\n injectTailwindStyles();\n }, []);\n\n const {\n mediaStreamRef,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isRecording,\n isPaused,\n isProcessing,\n error,\n transcriptionDone,\n availableDevices,\n validateMicrophoneAccess,\n audioLevel,\n noAudioDetected,\n // Add recovery properties\n isRetryingSession,\n showRetrySessionPrompt,\n retryFailedSession,\n clearAllSessions,\n // Add FFmpeg processing status\n isConverting,\n progress,\n statusMessage,\n } = useAudioRecorder({\n apiKey: apiKey,\n apiBaseUrl: apiBaseUrl,\n speciality: speciality,\n patientName: patientName,\n patientId: patientId,\n patientHistory: patientHistory,\n selectedFormat: selectedFormat,\n onTranscriptionUpdate: (text, sessionId) => {\n console.log(\"onTranscriptionUpdate called with text:\", text, \"sessionId:\", sessionId);\n if (text.length > 0) {\n console.log(\"Transcription update:\", text, sessionId);\n onTranscriptionUpdate && onTranscriptionUpdate(text, sessionId);\n }\n },\n onTranscriptionComplete: (text, classification, sessionId) => {\n console.log(\n \"onTranscriptionComplete called with text:\",\n text,\n \"classification:\",\n classification,\n \"sessionId:\",\n sessionId\n );\n onTranscriptionComplete && onTranscriptionComplete(text, classification, sessionId);\n },\n });\n\n const isEmergencyOrInPatient = speciality === \"emergency\" || speciality === \"in_patient\";\n const buttonText = isEmergencyOrInPatient ? \"Start Recording\" : \"Start Transcription\";\n\n const errorHandledRef = React.useRef(false);\n\n const [isDisabled, setIsDisabled] = React.useState(false);\n\n const [userEmail] = React.useState<string>(localStorage.getItem(\"userEmail\") || \"\");\n const isKamcUser = userEmail.toLowerCase().endsWith(\"@kamc.net\");\n\n // Add state for toast notifications\n const [toast, setToast] = React.useState<{\n show: boolean;\n message: string;\n type: \"success\" | \"error\";\n }>({\n show: false,\n message: \"\",\n type: \"success\",\n });\n\n const handleStopClick = () => {\n setIsDisabled(true);\n stopRecording();\n };\n\n const handleStartRecording = () => {\n setIsDisabled(false); // Reset disabled state when starting a new recording\n startRecording();\n };\n\n React.useEffect(() => {\n if (error) {\n setToast({ show: true, message: error, type: \"error\" });\n }\n }, [error]);\n\n React.useEffect(() => {\n if (error && !errorHandledRef.current) {\n errorHandledRef.current = true;\n if (onError) {\n onError(error);\n }\n } else if (!error) {\n errorHandledRef.current = false;\n }\n }, [error, onError]);\n\n // Enhanced error detection to include no audio detection\n const isMicrophoneError =\n error &&\n (error.toLowerCase().includes(\"microphone\") ||\n error.toLowerCase().includes(\"not found\") ||\n error.toLowerCase().includes(\"no audio\") ||\n error.toLowerCase().includes(\"devices not found\") ||\n error.toLowerCase().includes(\"access denied\") ||\n error.toLowerCase().includes(\"permission\") ||\n error.toLowerCase().includes(\"not allowed\") ||\n error.toLowerCase().includes(\"busy\") ||\n error.toLowerCase().includes(\"media devices not supported\") ||\n availableDevices.length === 0 ||\n noAudioDetected);\n\n // Show no audio detected error specifically\n if (noAudioDetected || (error && error.includes(\"No audio input detected\"))) {\n return (\n <div className=\"bg-orange-50 dark:bg-orange-900/20 border border-orange-200 dark:border-orange-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-orange-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-orange-800 dark:text-orange-200\">\n No Audio Input Detected\n </h3>\n <div className=\"mt-2 text-sm text-orange-700 dark:text-orange-300\">\n <p>{error}</p>\n <ul className=\"mt-2 list-disc list-inside\">\n <li>Check if your microphone is properly connected</li>\n <li>Ensure you're speaking close enough to the microphone</li>\n <li>Try adjusting your microphone volume settings</li>\n <li>Test your microphone in other applications</li>\n <li>Make sure your browser has microphone permissions</li>\n <li>Please reload the page and try again</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // Show microphone/audio errors\n if (isMicrophoneError) {\n console.log(\"🔴 Showing microphone error UI\");\n return (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-red-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-red-800 dark:text-red-200\">\n Audio Input Issue\n </h3>\n <div className=\"mt-2 text-sm text-red-700 dark:text-red-300\">\n <p>{error}</p>\n </div>\n <div className=\"mt-4\">\n <button\n onClick={() => {\n console.log(\"🔄 Check Again button clicked\");\n validateMicrophoneAccess();\n }}\n className=\"bg-red-600 hover:bg-red-700 text-white px-3 py-1 rounded text-sm transition-colors\"\n >\n Check Again\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // // Show authentication error separately\n // if (error && error.includes(\"authentication failed\")) {\n // return (\n // <div className=\"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4\">\n // <div className=\"flex items-start\">\n // <div className=\"flex-shrink-0\">\n // <AlertTriangle className=\"h-5 w-5 text-yellow-400\" />\n // </div>\n // <div className=\"ml-3\">\n // <h3 className=\"text-sm font-medium text-yellow-800 dark:text-yellow-200\">\n // Service Configuration Required\n // </h3>\n // <div className=\"mt-2 text-sm text-yellow-700 dark:text-yellow-300\">\n // <p>\n // The transcription service requires proper configuration. Please contact your system\n // administrator.\n // </p>\n // </div>\n // </div>\n // </div>\n // </div>\n // );\n // }\n\n const closeToast = () => {\n setToast({ ...toast, show: false });\n };\n\n return (\n <div className=\"space-y-4\">\n {toast.show && (\n <Toast message={toast.message} type={toast.type} onClose={closeToast} duration={1} />\n )}\n {showRetrySessionPrompt && (\n <div className=\"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-yellow-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-yellow-800 dark:text-yellow-200\">\n Recording Sessions Available for Retry\n </h3>\n <div className=\"mt-2 text-sm text-yellow-700 dark:text-yellow-300\">\n <p>\n Recording session failed to complete transcription. Your audio has been saved\n offline and can be retried.\n </p>\n </div>\n <div className=\"mt-4 flex space-x-3\">\n <button\n onClick={retryFailedSession}\n disabled={isRetryingSession}\n className=\"flex items-center space-x-1 bg-yellow-600 hover:bg-yellow-700 text-white px-3 py-2 rounded text-sm transition-colors disabled:opacity-50\"\n >\n {isRetryingSession && <Loader2 className=\"h-3 w-3 animate-spin\" />}\n <span>{isRetryingSession ? \"Retrying...\" : \"Retry Transcription\"}</span>\n </button>\n <button\n onClick={clearAllSessions}\n className=\"bg-gray-600 hover:bg-gray-700 text-white px-3 py-2 rounded text-sm transition-colors\"\n >\n Clear Saved Sessions\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n {/* Show retry status */}\n {isRetryingSession && (\n <div className=\"flex items-center justify-center space-x-2 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4\">\n <Loader2 className=\"animate-spin h-5 w-5 text-blue-600\" />\n <div className=\"text-center\">\n <span className=\"block text-sm font-medium text-blue-700 dark:text-blue-300\">\n Retrying transcription with saved audio...\n </span>\n <span className=\"block text-xs text-blue-600 dark:text-blue-400 mt-1\">\n Please wait while we process your recording\n </span>\n </div>\n </div>\n )}\n {isRecording && !isPaused && mediaStreamRef.current && (\n <div\n className={`audio-recorder-container ${isRecording && !isPaused ? \"glow-active\" : \"\"}`}\n >\n <div className=\"edge-container\">\n <div className=\"edge edge-top\" />\n <div className=\"edge edge-right\" />\n <div className=\"edge edge-bottom\" />\n <div className=\"edge edge-left\" />\n </div>\n <div className=\"flex justify-center items-center\">\n <AudioVisualizerImproved\n mediaStream={mediaStreamRef.current}\n isRecording={isRecording && !isPaused} // Keep running even during FFmpeg processing!\n forceLight={false}\n />\n </div>\n </div>\n )}\n <div className=\"flex justify-center\">\n {isProcessing ? (\n <div className=\"flex items-center justify-center space-x-2 bg-teal-600 hover:bg-teal-700 text-white py-2 px-4 rounded-full\">\n <Loader2 className=\"animate-spin h-5 w-5\" />\n <span>Processing...</span>\n </div>\n ) : transcriptionDone ? (\n <div className=\"flex items-center justify-center space-x-2 bg-green-600 text-white py-2 px-4 rounded-full\">\n <span>Transcription Complete</span>\n </div>\n ) : isRecording || isPaused ? (\n <div className=\"flex space-x-2\">\n <button\n className={`flex items-center justify-center space-x-2 bg-red-600 hover:bg-red-700 text-white py-2 px-4 rounded-full transition-colors ${\n isDisabled ? \"opacity-50 cursor-not-allowed\" : \"\"\n }`}\n onClick={handleStopClick}\n disabled={isDisabled}\n >\n <Square className=\"h-5 w-5\" />\n <span>Stop</span>\n </button>\n {!isKamcUser &&\n (!isPaused ? (\n <button\n className=\"flex items-center justify-center space-x-2 bg-yellow-500 hover:bg-yellow-600 text-white py-2 px-4 rounded-full transition-colors\"\n onClick={pauseRecording}\n >\n <Pause className=\"h-5 w-5\" />\n <span>Pause</span>\n </button>\n ) : (\n <button\n className=\"flex items-center justify-center space-x-2 bg-green-600 hover:bg-green-700 text-white py-2 px-4 rounded-full transition-colors\"\n onClick={resumeRecording}\n >\n <Play className=\"h-5 w-5\" />\n <span>Resume</span>\n </button>\n ))}\n </div>\n ) : (\n <button\n className={\n className\n ? `flex items-center justify-center space-x-2 py-2 px-4 rounded-full transition-colors ${className}`\n : \"flex items-center justify-center space-x-2 bg-gradient-to-r from-orange-400 to-pink-500 hover:bg-gradient-to-r hover:from-orange-500 hover:to-pink-600 text-white py-2 px-4 rounded-full transition-colors\"\n }\n onClick={handleStartRecording}\n >\n <Mic className=\"h-5 w-5\" />\n <span>{buttonText}</span>\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default AudioRecorder;\n","import { useEffect, useRef, useState } from \"react\";\nimport useHL7FHIRConverter from \"./useHL7FHIRConverter\";\n\nconst API_BASE_URL = \"https://nuxera.cloud\";\n\ninterface AudioDictationHookProps {\n onDictationComplete: (message: string) => void;\n onDictationStart?: () => void;\n onProcessingStart?: () => void;\n onError?: (error: string) => void;\n\n apiKey?: string;\n apiBaseUrl?: string;\n appendMode?: boolean;\n // Add new props for HL7/FHIR support\n doctorName?: string;\n patientId?: string;\n sessionId?: string;\n language?: string;\n specialty?: string;\n selectedFormat?: \"json\" | \"hl7\" | \"fhir\";\n}\n\nconst useAudioDictation = ({\n onDictationComplete,\n onDictationStart,\n onProcessingStart,\n onError,\n apiKey,\n apiBaseUrl = API_BASE_URL,\n appendMode = true,\n doctorName = \"asad\",\n patientId,\n sessionId,\n language,\n specialty,\n selectedFormat = \"json\",\n}: AudioDictationHookProps) => {\n const [dictationError, setDictationError] = useState<string | null>(null);\n const [isDictating, setIsDictating] = useState<boolean>(false);\n const [isProcessing, setIsProcessing] = useState<boolean>(false);\n const audioContextRef = useRef<AudioContext | null>(null);\n const processorRef = useRef<AudioWorkletNode | null>(null);\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const audioSamplesRef = useRef<Float32Array[]>([]);\n\n const [audioBuffer, setAudioBuffer] = useState<Float32Array | null>(null);\n\n const { createHL7DictationRequest, createFHIRDictationRequest, convertDictationResponse } =\n useHL7FHIRConverter();\n\n // Use the provided apiKey or fall back to selectedApiKey\n const effectiveApiKey = apiKey;\n\n // Add cleanup effect for audio resources\n useEffect(() => {\n return () => {\n // Clean up on component unmount\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach((track) => track.stop());\n mediaStreamRef.current = null;\n }\n\n if (processorRef.current) {\n try {\n processorRef.current.disconnect();\n } catch (e) {\n console.error(\"Error disconnecting processor:\", e);\n }\n processorRef.current = null;\n }\n\n // Only close if the context is not already closed\n if (audioContextRef.current && audioContextRef.current.state !== \"closed\") {\n try {\n audioContextRef.current.close();\n } catch (e) {\n console.error(\"Error closing AudioContext:\", e);\n }\n }\n audioContextRef.current = null;\n };\n }, []);\n\n const startDictating = async () => {\n try {\n console.log(\"Starting recording\");\n // Reset audio chunks and buffer\n setAudioBuffer(null);\n audioSamplesRef.current = [];\n\n // Clear any previous errors\n setDictationError(null);\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaStreamRef.current = stream;\n\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n console.log(\"Loading audio-processor.js module...\");\n try {\n await audioContext.audioWorklet.addModule(\"/audio-processor.js\");\n console.log(\"Audio worklet module loaded successfully\");\n } catch (err) {\n console.error(\"Error loading audio worklet module:\", err);\n throw err;\n }\n\n const processor = new AudioWorkletNode(audioContext, \"audio-processor\");\n processor.port.onmessage = (event) => {\n console.log(\"Received message from processor:\", event.data.command);\n\n if (event.data.audioBuffer) {\n console.log(\"Received audio buffer\", event.data.audioBuffer.length);\n audioSamplesRef.current.push(new Float32Array(event.data.audioBuffer));\n }\n\n if (event.data.command === \"finalChunk\") {\n console.log(\"Received final chunk\");\n\n if (event.data.audioBuffer) {\n // Add the final chunk to our samples\n audioSamplesRef.current.push(new Float32Array(event.data.audioBuffer));\n }\n\n // Combine all samples into a single buffer\n const totalLength = audioSamplesRef.current.reduce(\n (acc, buffer) => acc + buffer.length,\n 0\n );\n\n if (totalLength > 0) {\n const combinedBuffer = new Float32Array(totalLength);\n let offset = 0;\n\n audioSamplesRef.current.forEach((buffer) => {\n combinedBuffer.set(buffer, offset);\n offset += buffer.length;\n });\n\n console.log(\"Combined buffer length:\", combinedBuffer.length);\n setAudioBuffer(combinedBuffer);\n } else {\n console.warn(\"Final chunk received but no audio data accumulated\");\n const errorMessage = \"No audio data was recorded\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n }\n };\n\n const source = audioContext.createMediaStreamSource(stream);\n source.connect(processor);\n\n audioContextRef.current = audioContext;\n processorRef.current = processor;\n\n setIsDictating(true);\n onDictationStart?.();\n console.log(\"Recording started successfully\");\n } catch (error) {\n console.error(\"Error starting dictation:\", error);\n setIsDictating(false);\n const errorMessage = \"An error occurred while starting dictation\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n };\n\n // Updated function to stop dictation\n const stopDictating = async () => {\n console.log(\"Stopping dictation\");\n\n try {\n // Send stop command to processor FIRST (before stopping tracks)\n if (processorRef.current) {\n console.log(\"Sending stop command to processor\");\n processorRef.current.port.postMessage({ command: \"stop\" });\n\n // Wait a bit for the processor to send the final chunk\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n // THEN stop media stream tracks\n if (mediaStreamRef.current) {\n console.log(\"Stopping media stream tracks\");\n mediaStreamRef.current.getTracks().forEach((track) => {\n track.stop();\n console.log(\"Track stopped:\", track.kind, track.readyState);\n });\n mediaStreamRef.current = null;\n }\n\n // Clean up processor\n if (processorRef.current) {\n console.log(\"Disconnecting processor\");\n try {\n processorRef.current.disconnect();\n processorRef.current = null;\n } catch (e) {\n console.error(\"Error disconnecting processor:\", e);\n processorRef.current = null;\n }\n }\n\n // Close audio context\n if (audioContextRef.current) {\n console.log(\"Closing audio context, current state:\", audioContextRef.current.state);\n try {\n if (audioContextRef.current.state !== \"closed\") {\n await audioContextRef.current.close();\n console.log(\"Audio context closed successfully\");\n }\n } catch (e) {\n console.error(\"Error closing AudioContext:\", e);\n }\n audioContextRef.current = null;\n }\n\n // Wait a bit more to ensure audioBuffer state is updated\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n // Check if we have audio data\n if (audioBuffer && audioBuffer.length > 0) {\n console.log(`Processing audio buffer of size ${audioBuffer.length} samples`);\n await processDictationAudio(audioBuffer);\n } else if (audioSamplesRef.current.length > 0) {\n console.log(\"No audio buffer but have samples, combining now\");\n const totalLength = audioSamplesRef.current.reduce((acc, buffer) => acc + buffer.length, 0);\n\n if (totalLength > 0) {\n const combinedBuffer = new Float32Array(totalLength);\n let offset = 0;\n\n audioSamplesRef.current.forEach((buffer) => {\n combinedBuffer.set(buffer, offset);\n offset += buffer.length;\n });\n\n console.log(`Created combined buffer of size ${combinedBuffer.length} samples`);\n await processDictationAudio(combinedBuffer);\n } else {\n console.error(\"No valid audio data found\");\n const errorMessage = \"No audio data recorded\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n } else {\n console.error(\"No audio data to process\");\n const errorMessage = \"No audio data to process\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n } catch (error) {\n console.error(\"Error stopping recording:\", error);\n const errorMessage = \"An error occurred while stopping dictation\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n } finally {\n setIsDictating(false);\n audioSamplesRef.current = [];\n setAudioBuffer(null);\n }\n };\n\n // Move encodeWAV function (unchanged)\n const encodeWAV = (samples: Float32Array) => {\n console.log(`Encoding WAV with ${samples.length} samples`);\n const sampleRate = audioContextRef.current?.sampleRate || 44100;\n console.log(`Using sample rate: ${sampleRate}Hz`);\n\n const buffer = new ArrayBuffer(44 + samples.length * 2);\n const view = new DataView(buffer);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, \"RIFF\");\n view.setUint32(4, 36 + samples.length * 2, true);\n writeString(8, \"WAVE\");\n writeString(12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, \"data\");\n view.setUint32(40, samples.length * 2, true);\n\n let offset = 44;\n for (let i = 0; i < samples.length; i++) {\n const sample = Math.max(-1, Math.min(1, samples[i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n offset += 2;\n }\n\n const wavBlob = new Blob([view], { type: \"audio/wav\" });\n console.log(`Created WAV blob: ${(wavBlob.size / 1024).toFixed(2)} KB`);\n return wavBlob;\n };\n\n // Updated processDictationAudio function to support different formats\n const processDictationAudio = async (audioData: Float32Array) => {\n try {\n console.log(`Processing dictation with audio data length: ${audioData.length}`);\n console.log(`Using format: ${selectedFormat}`);\n setIsProcessing(true);\n onProcessingStart?.();\n\n const wavBlob = encodeWAV(audioData);\n console.log(`Sending audio to dictation API (${wavBlob.size / 1024} KB)`);\n\n // Prepare request data\n const requestData = {\n doctorName,\n patientId,\n sessionId,\n language,\n specialty,\n };\n\n let requestBody: FormData;\n let headers: Record<string, string> = {\n \"x-api-key\": effectiveApiKey || \"\",\n };\n\n // Create request based on selected format\n switch (selectedFormat) {\n case \"hl7\":\n requestBody = createHL7DictationRequest(\n new File([wavBlob], \"dictation.wav\", { type: \"audio/wav\" }),\n requestData\n );\n headers[\"x-request-format\"] = \"hl7\";\n headers[\"x-response-format\"] = \"hl7\";\n console.log(\"Created HL7-formatted dictation request\");\n break;\n\n case \"fhir\":\n requestBody = createFHIRDictationRequest(\n new File([wavBlob], \"dictation.wav\", { type: \"audio/wav\" }),\n requestData\n );\n headers[\"x-request-format\"] = \"fhir\";\n headers[\"x-response-format\"] = \"fhir\";\n console.log(\"Created FHIR-formatted dictation request\");\n break;\n\n case \"json\":\n default:\n requestBody = new FormData();\n requestBody.append(\"audio\", wavBlob);\n requestBody.append(\"doctorName\", doctorName);\n if (patientId) requestBody.append(\"patientId\", patientId);\n if (sessionId) requestBody.append(\"sessionId\", sessionId);\n if (language) requestBody.append(\"language\", language);\n if (specialty) requestBody.append(\"specialty\", specialty);\n\n headers[\"x-request-format\"] = \"json\";\n headers[\"x-response-format\"] = \"json\";\n console.log(\"Created JSON-formatted dictation request\");\n break;\n }\n\n console.log(\"Request headers:\", headers);\n console.log(\"Sending request to API...\");\n\n const response = await fetch(`${apiBaseUrl}/api/dictate`, {\n method: \"POST\",\n body: requestBody,\n headers,\n });\n\n console.log(\"API response status:\", response.status);\n if (!response.ok) {\n throw new Error(`API request failed with status ${response.status}`);\n }\n\n // Handle different response formats\n let responseData: any;\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (selectedFormat === \"json\" || contentType.includes(\"application/json\")) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n\n console.log(\"Raw API response data:\", responseData);\n\n // Convert response using the converter\n const convertedData = convertDictationResponse(responseData, selectedFormat);\n console.log(\"Converted response data:\", convertedData);\n\n if (convertedData.dictation) {\n console.log(\"Dictation text received:\", convertedData.dictation);\n // Pass the dictation text to the callback\n // The parent component will handle appending/replacing\n onDictationComplete(convertedData.dictation);\n } else {\n console.error(\"No dictation text in response\");\n const errorMessage = \"No dictation text in response\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n } catch (error) {\n console.error(\"Error processing dictation audio:\", error);\n const errorMessage = \"An error occurred while processing dictation\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n } finally {\n setIsProcessing(false);\n setIsDictating(false);\n }\n };\n\n return { startDictating, stopDictating, dictationError, isDictating, isProcessing };\n};\n\nexport default useAudioDictation;\n","import * as React from \"react\";\nimport { Mic, Square, Loader2, AlertTriangle } from \"lucide-react\";\nimport useAudioDictation from \"./hooks/useAudioDictation\";\n\nexport interface AudioDictationProps {\n apiKey?: string;\n apiBaseUrl?: string;\n appendMode?: boolean;\n doctorName?: string;\n patientId?: string;\n sessionId?: string;\n language?: string;\n specialty?: string;\n selectedFormat?: \"json\" | \"hl7\" | \"fhir\";\n onDictationComplete: (message: string) => void;\n onDictationStart?: () => void;\n onProcessingStart?: () => void;\n onError?: (error: string) => void;\n className?: string;\n style?: React.CSSProperties;\n buttonText?: string;\n placeholder?: string;\n}\n\n// Embedded minimal Tailwind utilities for dictation component\nconst dictationStyles = `\n .dictation-button-recording {\n background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);\n background-size: 400% 400%;\n animation: gradientShift 2s ease infinite;\n }\n \n @keyframes gradientShift {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n\n .dictation-pulse {\n animation: dictationPulse 1.5s ease-in-out infinite;\n }\n\n @keyframes dictationPulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.05); opacity: 0.8; }\n }\n\n .bg-blue-600 { background-color: rgb(37 99 235); }\n .hover\\\\:bg-blue-700:hover { background-color: rgb(29 78 216); }\n .bg-red-600 { background-color: rgb(220 38 38); }\n .hover\\\\:bg-red-700:hover { background-color: rgb(185 28 28); }\n .bg-gray-600 { background-color: rgb(75 85 99); }\n .hover\\\\:bg-gray-700:hover { background-color: rgb(55 65 81); }\n .text-white { color: rgb(255 255 255); }\n .flex { display: flex; }\n .items-center { align-items: center; }\n .justify-center { justify-content: center; }\n .space-x-2 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.5rem; }\n .px-4 { padding-left: 1rem; padding-right: 1rem; }\n .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\n .rounded-lg { border-radius: 0.5rem; }\n .rounded-full { border-radius: 9999px; }\n .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }\n .duration-200 { transition-duration: 200ms; }\n .disabled\\\\:opacity-50:disabled { opacity: 0.5; }\n .disabled\\\\:cursor-not-allowed:disabled { cursor: not-allowed; }\n .h-5 { height: 1.25rem; }\n .w-5 { width: 1.25rem; }\n .h-6 { height: 1.5rem; }\n .w-6 { width: 1.5rem; }\n .text-sm { font-size: 0.875rem; line-height: 1.25rem; }\n .font-medium { font-weight: 500; }\n .animate-spin { animation: spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n .bg-red-50 { background-color: rgb(254 242 242); }\n .border { border-width: 1px; }\n .border-red-200 { border-color: rgb(254 202 202); }\n .text-red-800 { color: rgb(153 27 27); }\n .text-red-700 { color: rgb(185 28 28); }\n .p-3 { padding: 0.75rem; }\n .mt-2 { margin-top: 0.5rem; }\n .text-xs { font-size: 0.75rem; line-height: 1rem; }\n`;\n\n// Inject dictation styles only once\nlet dictationStylesInjected = false;\nconst injectDictationStyles = () => {\n if (!dictationStylesInjected && typeof document !== \"undefined\") {\n const styleElement = document.createElement(\"style\");\n styleElement.textContent = dictationStyles;\n document.head.appendChild(styleElement);\n dictationStylesInjected = true;\n }\n};\n\nconst AudioDictation: React.FC<AudioDictationProps> = ({\n apiKey,\n apiBaseUrl,\n appendMode = true,\n doctorName = \"doctor\",\n patientId,\n sessionId,\n language = \"en\",\n specialty = \"general\",\n selectedFormat = \"json\",\n onDictationComplete,\n onDictationStart,\n onProcessingStart,\n onError,\n className = \"\",\n style,\n buttonText,\n placeholder = \"Click to dictate...\",\n}) => {\n // Inject styles on component mount\n React.useEffect(() => {\n injectDictationStyles();\n }, []);\n\n const { startDictating, stopDictating, dictationError, isDictating, isProcessing } = useAudioDictation({\n onDictationComplete,\n onDictationStart,\n onProcessingStart,\n onError,\n apiKey,\n apiBaseUrl,\n appendMode,\n doctorName,\n patientId,\n sessionId,\n language,\n specialty,\n selectedFormat,\n });\n\n // Handle click to toggle dictation\n const handleToggleDictation = (e: React.MouseEvent) => {\n e.preventDefault();\n if (isProcessing) return;\n\n if (isDictating) {\n stopDictating();\n } else {\n startDictating();\n }\n };\n\n const getButtonContent = () => {\n if (isProcessing) {\n return (\n <>\n <Loader2 className=\"h-5 w-5 animate-spin\" />\n </>\n );\n }\n\n if (isDictating) {\n return (\n <>\n <Square className=\"h-5 w-5\" />\n </>\n );\n }\n\n return (\n <>\n <Mic className=\"h-5 w-5\" />\n </>\n );\n };\n\n const getButtonClass = () => {\n const baseClass =\n \"flex items-center justify-center space-x-2 px-4 py-2 rounded-lg font-medium transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed\";\n\n if (className) {\n return `${baseClass} ${className}`;\n }\n\n if (isProcessing) {\n return `${baseClass} bg-gray-600 text-white`;\n }\n\n if (isDictating) {\n return `${baseClass} dictation-button-recording text-white dictation-pulse`;\n }\n\n return `${baseClass} bg-blue-600 hover:bg-blue-700 text-white`;\n };\n\n if (dictationError) {\n return (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <div className=\"flex items-center space-x-2\">\n <AlertTriangle className=\"h-5 w-5 text-red-600\" />\n <div>\n <p className=\"text-sm font-medium text-red-800\">Dictation Error</p>\n <p className=\"text-xs text-red-700 mt-1\">{dictationError}</p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div style={style}>\n <button\n className={getButtonClass()}\n onClick={handleToggleDictation}\n disabled={isProcessing}\n title={isDictating ? \"Click to stop dictating\" : placeholder}\n >\n {getButtonContent()}\n </button>\n </div>\n );\n};\n\nexport default AudioDictation;\n","import React, { useState, useRef, useCallback, MutableRefObject } from \"react\";\nimport useFFmpegConverter from \"./useFFmpegConverter\";\n\ninterface AudioCaptureHookProps {\n onAudioChunk?: (audioData: Float32Array, sequence: number, isFinal: boolean) => void;\n onAudioComplete?: (finalAudio: Float32Array) => void;\n onAudioFile?: (audioFile: File) => void;\n silenceRemoval?: boolean;\n chunkDuration?: number; // Duration in seconds for each chunk\n format?: \"raw\" | \"wav\"; // Output format\n}\n\ninterface UseAudioCaptureReturn {\n mediaStreamRef: MutableRefObject<MediaStream | null>;\n startRecording: () => void;\n stopRecording: () => void;\n pauseRecording: () => void;\n resumeRecording: () => void;\n isRecording: boolean;\n isPaused: boolean;\n isProcessing: boolean;\n error: string | null;\n \n // Microphone properties\n availableDevices: MediaDeviceInfo[];\n currentDeviceId: string | null;\n selectMicrophone: (deviceId: string) => Promise<void>;\n validateMicrophoneAccess: () => Promise<boolean>;\n audioLevel: number;\n noAudioDetected: boolean;\n\n // FFmpeg status properties\n isConverting: boolean;\n progress: number;\n statusMessage: string;\n\n // Audio data properties\n recordingDuration: number;\n totalChunks: number;\n}\n\n// Embedded Audio Processor Worker for capturing audio\nconst createAudioCaptureWorker = () => {\n const workerCode = `\n class AudioCaptureProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this._buffer = [];\n this._isStopped = false;\n this._isPaused = false;\n this._chunkReady = false;\n this._processingChunk = false;\n \n this._audioLevelCheckInterval = 0;\n this._audioLevelCheckFrequency = 128;\n this._silentSampleCount = 0;\n this._maxSilentSamples = 44100 * 30;\n this._audioThreshold = 0.002;\n this._hasDetectedAudio = false;\n this._lastAudioTime = 0;\n this._recordingStartTime = Date.now();\n this._initialSilenceThreshold = 44100 * 10;\n this._isInitialPhase = true;\n this._bufferSize = 0;\n\n this.port.onmessage = (event) => {\n if (event.data.command === \"stop\") {\n this._isStopped = true;\n this._sendFinalChunk();\n }\n\n if (event.data.command === \"getChunk\") {\n this._chunkReady = true;\n }\n\n if (event.data.command === \"resetChunk\") {\n this._chunkReady = false;\n this._processingChunk = false;\n this._buffer = [];\n this._bufferSize = 0;\n }\n\n if (event.data.command === \"pause\") {\n this._isPaused = true;\n }\n\n if (event.data.command === \"resume\") {\n this._isPaused = false;\n }\n };\n }\n\n _sendFinalChunk() {\n if (this._buffer.length > 0) {\n const flat = this._flattenBuffer();\n this.port.postMessage({\n command: \"finalChunk\",\n audioBuffer: flat.buffer,\n duration: this._bufferSize / 44100\n }, [flat.buffer]);\n } else {\n // Send empty final chunk\n const emptyBuffer = new Float32Array(1000);\n this.port.postMessage({\n command: \"finalChunk\", \n audioBuffer: emptyBuffer.buffer,\n duration: 0\n }, [emptyBuffer.buffer]);\n }\n this._buffer = [];\n this._bufferSize = 0;\n }\n\n _flattenBuffer() {\n let totalLength = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n totalLength += this._buffer[i].length;\n }\n \n const flat = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n flat.set(this._buffer[i], offset);\n offset += this._buffer[i].length;\n }\n return flat;\n }\n\n process(inputs, outputs) {\n if (this._isStopped || this._isPaused) {\n return true;\n }\n\n const input = inputs[0];\n if (input && input.length > 0) {\n const samples = input[0];\n \n // Calculate audio level\n let audioLevel = 0;\n for (let i = 0; i < samples.length; i++) {\n audioLevel += Math.abs(samples[i]);\n }\n audioLevel /= samples.length;\n\n // Send audio level updates\n this._audioLevelCheckInterval++;\n if (this._audioLevelCheckInterval >= this._audioLevelCheckFrequency) {\n this.port.postMessage({\n command: \"audioLevel\",\n level: audioLevel,\n });\n this._audioLevelCheckInterval = 0;\n }\n\n // Check for audio activity\n if (audioLevel > this._audioThreshold) {\n this._hasDetectedAudio = true;\n this._isInitialPhase = false;\n this._silentSampleCount = 0;\n this._lastAudioTime = Date.now();\n } else {\n this._silentSampleCount += samples.length;\n \n if (this._isInitialPhase && this._silentSampleCount > this._initialSilenceThreshold) {\n this.port.postMessage({\n command: \"noAudioDetected\",\n message: \"No audio input detected after 10 seconds. Please check your microphone.\"\n });\n return true;\n }\n }\n\n // Buffer the audio\n this._buffer.push(new Float32Array(samples));\n this._bufferSize += samples.length;\n\n // Send chunk if ready\n if (this._chunkReady && !this._processingChunk) {\n this._processingChunk = true;\n \n const flat = this._flattenBuffer();\n this.port.postMessage({\n command: \"chunk\",\n audioBuffer: flat.buffer,\n duration: this._bufferSize / 44100,\n hasActivity: audioLevel > this._audioThreshold\n }, [flat.buffer]);\n \n this._buffer = [];\n this._bufferSize = 0;\n this._chunkReady = false;\n this._processingChunk = false;\n }\n }\n\n return true;\n }\n }\n\n registerProcessor(\"audio-capture-processor\", AudioCaptureProcessor);\n `;\n\n const blob = new Blob([workerCode], { type: \"application/javascript\" });\n return URL.createObjectURL(blob);\n};\n\nconst useAudioCapture = ({\n onAudioChunk,\n onAudioComplete,\n onAudioFile,\n silenceRemoval = false,\n chunkDuration = 30, // Default 30 seconds per chunk\n format = \"raw\"\n}: AudioCaptureHookProps): UseAudioCaptureReturn => {\n const [isRecording, setIsRecording] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [currentDeviceId, setCurrentDeviceId] = useState<string | null>(null);\n const [availableDevices, setAvailableDevices] = useState<MediaDeviceInfo[]>([]);\n const [audioLevel, setAudioLevel] = useState<number>(0);\n const [noAudioDetected, setNoAudioDetected] = useState(false);\n const [recordingDuration, setRecordingDuration] = useState(0);\n const [totalChunks, setTotalChunks] = useState(0);\n\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const processorRef = useRef<AudioWorkletNode | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const chunkIntervalRef = useRef<number | null>(null);\n const recordingStartTimeRef = useRef<number>(0);\n const durationIntervalRef = useRef<number | null>(null);\n const sequenceCounterRef = useRef(0);\n const allAudioChunksRef = useRef<Float32Array[]>([]);\n\n const {\n removeSilence,\n isLoaded,\n isConverting,\n progress,\n statusMessage,\n convertToWav,\n } = useFFmpegConverter();\n\n // Validate microphone access\n const validateMicrophoneAccess = useCallback(async (): Promise<boolean> => {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const audioInputDevices = devices.filter((device) => device.kind === \"audioinput\");\n\n setAvailableDevices(audioInputDevices);\n\n if (audioInputDevices.length === 0) {\n throw new Error(\"No microphone devices detected. Please connect a microphone.\");\n }\n\n const testStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: currentDeviceId ? { exact: currentDeviceId } : undefined,\n },\n });\n\n const audioTracks = testStream.getAudioTracks();\n if (audioTracks.length > 0) {\n const track = audioTracks[0];\n const settings = track.getSettings();\n setCurrentDeviceId(settings.deviceId || null);\n }\n\n testStream.getTracks().forEach((track) => track.stop());\n return true;\n } catch (error) {\n console.error(\"Microphone validation failed:\", error);\n\n if (error instanceof Error) {\n let errorMessage = \"\";\n if (error.name === \"NotFoundError\" || error.name === \"DevicesNotFoundError\") {\n errorMessage = \"No microphone devices found. Please connect a microphone.\";\n } else if (error.name === \"NotAllowedError\" || error.name === \"PermissionDeniedError\") {\n errorMessage = \"Microphone permission denied. Please allow access and try again.\";\n } else if (error.name === \"NotReadableError\" || error.name === \"TrackStartError\") {\n errorMessage = \"Microphone is busy or unavailable. Please close other applications using the microphone.\";\n } else if (error.name === \"OverconstrainedError\") {\n errorMessage = \"Selected microphone device is not available. Please select a different device.\";\n } else {\n errorMessage = `Microphone error: ${error.message}`;\n }\n setError(errorMessage);\n } else {\n setError(\"Microphone access error occurred.\");\n }\n return false;\n }\n }, [currentDeviceId]);\n\n // Process audio chunk\n const processAudioChunk = useCallback(async (\n audioData: Float32Array,\n sequence: number,\n isFinal: boolean\n ) => {\n try {\n setIsProcessing(true);\n \n let processedAudio = audioData;\n\n // Apply silence removal if enabled and FFmpeg is loaded\n if (silenceRemoval && isLoaded && typeof removeSilence === \"function\") {\n console.log(\"Applying silence removal to audio chunk...\");\n \n // Convert Float32Array to temporary file for processing\n const tempFile = float32ToWavFile(audioData);\n const processedFile = await removeSilence(tempFile);\n \n if (processedFile) {\n // Convert processed file back to Float32Array\n const arrayBuffer = await processedFile.arrayBuffer();\n const dataView = new DataView(arrayBuffer);\n \n // Skip WAV header (44 bytes) and convert back to Float32Array\n const samples = new Float32Array((arrayBuffer.byteLength - 44) / 2);\n for (let i = 0; i < samples.length; i++) {\n const int16 = dataView.getInt16(44 + i * 2, true);\n samples[i] = int16 / (int16 < 0 ? 0x8000 : 0x7fff);\n }\n processedAudio = samples;\n }\n }\n\n // Store chunk for final combination\n if (!isFinal) {\n allAudioChunksRef.current.push(processedAudio);\n }\n\n // Call chunk callback\n if (onAudioChunk) {\n onAudioChunk(processedAudio, sequence, isFinal);\n }\n\n // If final chunk, combine all audio and call completion callbacks\n if (isFinal) {\n // Combine all chunks\n const totalLength = allAudioChunksRef.current.reduce((sum, chunk) => sum + chunk.length, 0);\n const finalAudio = new Float32Array(totalLength);\n let offset = 0;\n\n for (const chunk of allAudioChunksRef.current) {\n finalAudio.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Call completion callback with raw audio\n if (onAudioComplete) {\n onAudioComplete(finalAudio);\n }\n\n // Convert to file format if requested\n if (onAudioFile && format === \"wav\") {\n const wavFile = await createWavFile(finalAudio);\n onAudioFile(wavFile);\n } else if (onAudioFile && format === \"raw\") {\n const rawFile = createRawFile(finalAudio);\n onAudioFile(rawFile);\n }\n\n // Clear stored chunks\n allAudioChunksRef.current = [];\n }\n\n } catch (error) {\n console.error(\"Error processing audio chunk:\", error);\n setError(`Audio processing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n } finally {\n setIsProcessing(false);\n }\n }, [silenceRemoval, isLoaded, removeSilence, onAudioChunk, onAudioComplete, onAudioFile, format]);\n\n // Create WAV file from Float32Array\n const createWavFile = useCallback(async (samples: Float32Array): Promise<File> => {\n if (isLoaded && typeof convertToWav === \"function\") {\n // Use FFmpeg for better quality conversion\n const result = await convertToWav(samples);\n return result || float32ToWavFile(samples); // Fallback if conversion fails\n } else {\n // Fallback to manual WAV creation\n return float32ToWavFile(samples);\n }\n }, [isLoaded, convertToWav]);\n\n // Create raw audio file\n const createRawFile = useCallback((samples: Float32Array): File => {\n const timestamp = Date.now();\n const filename = `audio-recording-${timestamp}.raw`;\n\n // Create a new ArrayBuffer and copy the data to ensure compatibility\n const buffer = new ArrayBuffer(samples.byteLength);\n const uint8Array = new Uint8Array(buffer);\n const sourceArray = new Uint8Array(samples.buffer, samples.byteOffset, samples.byteLength);\n uint8Array.set(sourceArray);\n\n return new File([buffer], filename, {\n type: \"application/octet-stream\",\n lastModified: timestamp,\n });\n }, []);\n\n // Manual WAV file creation\n const float32ToWavFile = (samples: Float32Array): File => {\n const sampleRate = audioContextRef.current?.sampleRate || 44100;\n const buffer = new ArrayBuffer(44 + samples.length * 2);\n const view = new DataView(buffer);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, \"RIFF\");\n view.setUint32(4, 36 + samples.length * 2, true);\n writeString(8, \"WAVE\");\n writeString(12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, \"data\");\n view.setUint32(40, samples.length * 2, true);\n\n let offset = 44;\n for (let i = 0; i < samples.length; i++) {\n const sample = Math.max(-1, Math.min(1, samples[i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n offset += 2;\n }\n\n const timestamp = Date.now();\n const filename = `audio-recording-${timestamp}.wav`;\n\n return new File([view], filename, {\n type: \"audio/wav\",\n lastModified: timestamp,\n });\n };\n\n // Start recording\n const startRecording = useCallback(async () => {\n try {\n setError(null);\n setNoAudioDetected(false);\n\n // Validate microphone access\n const micValid = await validateMicrophoneAccess();\n if (!micValid) return;\n\n // Reset counters\n sequenceCounterRef.current = 0;\n allAudioChunksRef.current = [];\n setTotalChunks(0);\n setRecordingDuration(0);\n recordingStartTimeRef.current = Date.now();\n\n // Get media stream\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: currentDeviceId ? { exact: currentDeviceId } : undefined,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n mediaStreamRef.current = stream;\n\n // Create audio context and processor\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const processorUrl = createAudioCaptureWorker();\n await audioContext.audioWorklet.addModule(processorUrl);\n URL.revokeObjectURL(processorUrl);\n\n const processor = new AudioWorkletNode(audioContext, \"audio-capture-processor\");\n\n processor.port.onmessage = (event) => {\n if (event.data.command === \"chunk\") {\n const audioData = new Float32Array(event.data.audioBuffer);\n const sequence = sequenceCounterRef.current++;\n setTotalChunks(sequence + 1);\n processAudioChunk(audioData, sequence, false);\n } else if (event.data.command === \"finalChunk\") {\n const audioData = new Float32Array(event.data.audioBuffer);\n const sequence = sequenceCounterRef.current++;\n processAudioChunk(audioData, sequence, true);\n } else if (event.data.command === \"audioLevel\") {\n setAudioLevel(event.data.level);\n } else if (event.data.command === \"noAudioDetected\") {\n setNoAudioDetected(true);\n setError(event.data.message);\n }\n };\n\n const source = audioContext.createMediaStreamSource(stream);\n source.connect(processor);\n\n audioContextRef.current = audioContext;\n processorRef.current = processor;\n setIsRecording(true);\n\n // Start chunk timer\n const chunkIntervalId = window.setInterval(() => {\n processor.port.postMessage({ command: \"getChunk\" });\n }, chunkDuration * 1000);\n chunkIntervalRef.current = chunkIntervalId;\n\n // Start duration timer\n const durationIntervalId = window.setInterval(() => {\n const elapsed = (Date.now() - recordingStartTimeRef.current) / 1000;\n setRecordingDuration(elapsed);\n }, 100);\n durationIntervalRef.current = durationIntervalId;\n\n } catch (err) {\n console.error(\"Recording start failed:\", err);\n setError(err instanceof Error ? err.message : \"Failed to start recording\");\n }\n }, [validateMicrophoneAccess, currentDeviceId, chunkDuration, processAudioChunk]);\n\n // Stop recording\n const stopRecording = useCallback(() => {\n console.log(\"Stopping recording...\");\n\n // Clear intervals\n if (chunkIntervalRef.current) {\n clearInterval(chunkIntervalRef.current);\n chunkIntervalRef.current = null;\n }\n\n if (durationIntervalRef.current) {\n clearInterval(durationIntervalRef.current);\n durationIntervalRef.current = null;\n }\n\n // Send final chunk\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"stop\" });\n }\n\n // Cleanup\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(track => track.stop());\n mediaStreamRef.current = null;\n }\n\n if (audioContextRef.current) {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n\n processorRef.current = null;\n setIsRecording(false);\n }, []);\n\n // Pause recording\n const pauseRecording = useCallback(() => {\n if (!isRecording || isPaused) return;\n\n if (chunkIntervalRef.current) {\n clearInterval(chunkIntervalRef.current);\n chunkIntervalRef.current = null;\n }\n\n if (durationIntervalRef.current) {\n clearInterval(durationIntervalRef.current);\n durationIntervalRef.current = null;\n }\n\n setIsPaused(true);\n\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"pause\" });\n }\n\n setIsRecording(false);\n }, [isRecording, isPaused]);\n\n // Resume recording\n const resumeRecording = useCallback(() => {\n if (!isPaused) return;\n\n setIsPaused(false);\n setIsRecording(true);\n setNoAudioDetected(false);\n\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"resume\" });\n }\n\n // Restart timers\n const chunkIntervalId = window.setInterval(() => {\n processorRef.current?.port.postMessage({ command: \"getChunk\" });\n }, chunkDuration * 1000);\n chunkIntervalRef.current = chunkIntervalId;\n\n const durationIntervalId = window.setInterval(() => {\n const elapsed = (Date.now() - recordingStartTimeRef.current) / 1000;\n setRecordingDuration(elapsed);\n }, 100);\n durationIntervalRef.current = durationIntervalId;\n }, [isPaused, chunkDuration]);\n\n // Select microphone\n const selectMicrophone = useCallback(async (deviceId: string) => {\n try {\n setCurrentDeviceId(deviceId);\n\n if (isRecording) {\n await stopRecording();\n await startRecording();\n }\n } catch (error) {\n console.error(\"Device selection failed:\", error);\n setError(\"Failed to switch to selected microphone.\");\n }\n }, [isRecording, stopRecording, startRecording]);\n\n return {\n mediaStreamRef,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isRecording,\n isPaused,\n isProcessing,\n error,\n availableDevices,\n currentDeviceId,\n selectMicrophone,\n validateMicrophoneAccess,\n audioLevel,\n noAudioDetected,\n isConverting,\n progress,\n statusMessage,\n recordingDuration,\n totalChunks,\n };\n};\n\nexport default useAudioCapture;","import * as React from \"react\";\nimport useAudioCapture from \"./hooks/useAudioCapture\";\nimport { Mic, Square, Loader2, Pause, Play, AlertTriangle, Download } from \"lucide-react\";\nimport Toast from \"./components/Toast\";\nimport AudioVisualizerImproved from \"./components/AudioVisualizerImproved\";\n\n// Embedded minimal Tailwind utilities (reusing from AudioRecorder)\nconst tailwindStyles = `\n .space-y-4 > :not([hidden]) ~ :not([hidden]) { margin-top: 1rem; }\n .bg-orange-50 { background-color: rgb(255 247 237); }\n .bg-blue-900 { background-color: rgb(30 58 138); }\n .text-yellow-200 { color: rgb(254 240 138); }\n .hover\\\\:bg-blue-700:hover { background-color: rgb(29 78 216); }\n .dark .dark\\\\:bg-orange-900\\\\/20 { background-color: rgb(194 65 12 / 0.2); }\n .border { border-width: 1px; }\n .border-orange-200 { border-color: rgb(254 215 170); }\n .dark .dark\\\\:border-orange-800 { border-color: rgb(154 52 18); }\n .rounded-lg { border-radius: 0.5rem; }\n .p-4 { padding: 1rem; }\n .flex { display: flex; }\n .items-start { align-items: flex-start; }\n .items-center { align-items: center; }\n .justify-center { justify-content: center; }\n .justify-between { justify-content: space-between; }\n .flex-shrink-0 { flex-shrink: 0; }\n .h-5 { height: 1.25rem; }\n .w-5 { width: 1.25rem; }\n .text-orange-400 { color: rgb(251 146 60); }\n .ml-3 { margin-left: 0.75rem; }\n .mr-2 { margin-right: 0.5rem; }\n .flex-1 { flex: 1 1 0%; }\n .text-sm { font-size: 0.875rem; line-height: 1.25rem; }\n .font-medium { font-weight: 500; }\n .text-orange-800 { color: rgb(154 52 18); }\n .dark .dark\\\\:text-orange-200 { color: rgb(254 215 170); }\n .mt-2 { margin-top: 0.5rem; }\n .text-orange-700 { color: rgb(194 65 12); }\n .dark .dark\\\\:text-orange-300 { color: rgb(253 186 116); }\n .list-disc { list-style-type: disc; }\n .list-inside { list-style-position: inside; }\n .bg-red-50 { background-color: rgb(254 242 242); }\n .dark .dark\\\\:bg-red-900\\\\/20 { background-color: rgb(127 29 29 / 0.2); }\n .border-red-200 { border-color: rgb(254 202 202); }\n .dark .dark\\\\:border-red-800 { border-color: rgb(153 27 27); }\n .text-red-400 { color: rgb(248 113 113); }\n .text-red-800 { color: rgb(153 27 27); }\n .dark .dark\\\\:text-red-200 { color: rgb(254 202 202); }\n .text-red-700 { color: rgb(185 28 28); }\n .dark .dark\\\\:text-red-300 { color: rgb(252 165 165); }\n .mt-4 { margin-top: 1rem; }\n .bg-red-600 { background-color: rgb(220 38 38); }\n .hover\\\\:bg-red-700:hover { background-color: rgb(185 28 28); }\n .text-white { color: rgb(255 255 255); }\n .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }\n .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }\n .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\n .px-4 { padding-left: 1rem; padding-right: 1rem; }\n .rounded { border-radius: 0.25rem; }\n .rounded-full { border-radius: 9999px; }\n .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }\n .bg-yellow-50 { background-color: rgb(254 252 232); }\n .dark .dark\\\\:bg-yellow-900\\\\/20 { background-color: rgb(133 77 14 / 0.2); }\n .border-yellow-200 { border-color: rgb(254 240 138); }\n .dark .dark\\\\:border-yellow-800 { border-color: rgb(133 77 14); }\n .text-yellow-400 { color: rgb(250 204 21); }\n .text-yellow-800 { color: rgb(133 77 14); }\n .dark .dark\\\\:text-yellow-200 { color: rgb(254 240 138); }\n .text-yellow-700 { color: rgb(161 98 7); }\n .dark .dark\\\\:text-yellow-300 { color: rgb(253 224 71); }\n .space-x-3 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.75rem; }\n .space-x-1 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.25rem; }\n .space-x-2 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.5rem; }\n .bg-yellow-600 { background-color: rgb(202 138 4); }\n .hover\\\\:bg-yellow-700:hover { background-color: rgb(161 98 7); }\n .disabled\\\\:opacity-50:disabled { opacity: 0.5; }\n .h-3 { height: 0.75rem; }\n .w-3 { width: 0.75rem; }\n .animate-spin { animation: spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n .bg-gray-600 { background-color: rgb(75 85 99); }\n .hover\\\\:bg-gray-700:hover { background-color: rgb(55 65 81); }\n .bg-blue-50 { background-color: rgb(239 246 255); }\n .dark .dark\\\\:bg-blue-900\\\\/20 { background-color: rgb(30 58 138 / 0.2); }\n .border-blue-200 { border-color: rgb(191 219 254); }\n .dark .dark\\\\:border-blue-800 { border-color: rgb(30 64 175); }\n .text-blue-600 { color: rgb(37 99 235); }\n .block { display: block; }\n .text-blue-700 { color: rgb(29 78 216); }\n .dark .dark\\\\:text-blue-300 { color: rgb(147 197 253); }\n .text-xs { font-size: 0.75rem; line-height: 1rem; }\n .dark .dark\\\\:text-blue-400 { color: rgb(96 165 250); }\n .mt-1 { margin-top: 0.25rem; }\n .bg-teal-600 { background-color: rgb(13 148 136); }\n .hover\\\\:bg-teal-700:hover { background-color: rgb(15 118 110); }\n .bg-green-600 { background-color: rgb(22 163 74); }\n .hover\\\\:bg-green-700:hover { background-color: rgb(21 128 61); }\n .bg-yellow-500 { background-color: rgb(234 179 8); }\n .hover\\\\:bg-yellow-600:hover { background-color: rgb(202 138 4); }\n .bg-gradient-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); }\n .from-purple-400 { --tw-gradient-from: #c084fc; --tw-gradient-to: rgb(192 132 252 / 0); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }\n .to-blue-500 { --tw-gradient-to: #3b82f6; }\n .hover\\\\:from-purple-500:hover { --tw-gradient-from: #a855f7; --tw-gradient-to: rgb(168 85 247 / 0); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }\n .hover\\\\:to-blue-600:hover { --tw-gradient-to: #2563eb; }\n .opacity-50 { opacity: 0.5; }\n .cursor-not-allowed { cursor: not-allowed; }\n .text-gray-600 { color: rgb(75 85 99); }\n .dark .dark\\\\:text-gray-300 { color: rgb(209 213 219); }\n .bg-gray-100 { background-color: rgb(243 244 246); }\n .dark .dark\\\\:bg-gray-800 { background-color: rgb(31 41 55); }\n .border-gray-200 { border-color: rgb(229 231 235); }\n .dark .dark\\\\:border-gray-700 { border-color: rgb(55 65 81); }\n .cursor-pointer { cursor: pointer; }\n .hover\\\\:bg-gray-200:hover { background-color: rgb(229 231 235); }\n .dark .dark\\\\:hover\\\\:bg-gray-700:hover { background-color: rgb(55 65 81); }\n`;\n\n// Inject styles only once\nlet stylesInjected = false;\nconst injectTailwindStyles = () => {\n if (!stylesInjected && typeof document !== 'undefined') {\n const styleElement = document.createElement('style');\n styleElement.textContent = tailwindStyles;\n document.head.appendChild(styleElement);\n stylesInjected = true;\n }\n};\n\nexport interface AudioCaptureProps {\n /**\n * Callback function called when an audio chunk is processed\n */\n onAudioChunk?: (audioData: Float32Array, sequence: number, isFinal: boolean) => void;\n\n /**\n * Callback function called when recording is complete with the final audio\n */\n onAudioComplete?: (finalAudio: Float32Array) => void;\n\n /**\n * Callback function called with the processed audio file\n */\n onAudioFile?: (audioFile: File) => void;\n\n /**\n * Enable silence removal processing (optional, defaults to false)\n */\n silenceRemoval?: boolean;\n\n /**\n * Duration in seconds for each audio chunk (optional, defaults to 30)\n */\n chunkDuration?: number;\n\n /**\n * Output format for audio file (optional, defaults to \"raw\")\n */\n format?: \"raw\" | \"wav\";\n\n /**\n * Show download button for audio file (optional, defaults to false)\n */\n showDownload?: boolean;\n\n /**\n * Additional CSS class names\n */\n className?: string;\n\n /**\n * Custom styles\n */\n style?: React.CSSProperties;\n}\n\nconst AudioCapture: React.FC<AudioCaptureProps> = ({\n onAudioChunk,\n onAudioComplete,\n onAudioFile,\n silenceRemoval = false,\n chunkDuration = 30,\n format = \"raw\",\n showDownload = false,\n className = \"\",\n style,\n}) => {\n // Inject Tailwind styles on component mount\n React.useEffect(() => {\n injectTailwindStyles();\n }, []);\n\n const {\n mediaStreamRef,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isRecording,\n isPaused,\n isProcessing,\n error,\n availableDevices,\n currentDeviceId,\n selectMicrophone,\n validateMicrophoneAccess,\n audioLevel,\n noAudioDetected,\n isConverting,\n progress,\n statusMessage,\n recordingDuration,\n totalChunks,\n } = useAudioCapture({\n onAudioChunk,\n onAudioComplete,\n onAudioFile,\n silenceRemoval,\n chunkDuration,\n format,\n });\n\n const [isDisabled, setIsDisabled] = React.useState(false);\n const [lastAudioFile, setLastAudioFile] = React.useState<File | null>(null);\n\n // Add state for toast notifications\n const [toast, setToast] = React.useState<{\n show: boolean;\n message: string;\n type: \"success\" | \"error\";\n }>({\n show: false,\n message: \"\",\n type: \"success\",\n });\n\n // Handle audio file callback\n React.useEffect(() => {\n if (onAudioFile) {\n const originalCallback = onAudioFile;\n onAudioFile = (file: File) => {\n setLastAudioFile(file);\n originalCallback(file);\n };\n }\n }, [onAudioFile]);\n\n const handleStopClick = () => {\n setIsDisabled(true);\n stopRecording();\n };\n\n const handleStartRecording = () => {\n setIsDisabled(false);\n setLastAudioFile(null);\n startRecording();\n };\n\n const handleDownload = () => {\n if (lastAudioFile) {\n const url = URL.createObjectURL(lastAudioFile);\n const a = document.createElement('a');\n a.href = url;\n a.download = lastAudioFile.name;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n setToast({\n show: true,\n message: `Downloaded ${lastAudioFile.name}`,\n type: \"success\"\n });\n }\n };\n\n React.useEffect(() => {\n if (error) {\n setToast({ show: true, message: error, type: \"error\" });\n }\n }, [error]);\n\n const closeToast = () => {\n setToast({ ...toast, show: false });\n };\n\n // Format duration\n const formatDuration = (seconds: number): string => {\n const minutes = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n };\n\n // Enhanced error detection to include no audio detection\n const isMicrophoneError =\n error &&\n (error.toLowerCase().includes(\"microphone\") ||\n error.toLowerCase().includes(\"not found\") ||\n error.toLowerCase().includes(\"no audio\") ||\n error.toLowerCase().includes(\"devices not found\") ||\n error.toLowerCase().includes(\"access denied\") ||\n error.toLowerCase().includes(\"permission\") ||\n error.toLowerCase().includes(\"not allowed\") ||\n error.toLowerCase().includes(\"busy\") ||\n error.toLowerCase().includes(\"media devices not supported\") ||\n availableDevices.length === 0 ||\n noAudioDetected);\n\n // Show no audio detected error specifically\n if (noAudioDetected || (error && error.includes(\"No audio input detected\"))) {\n return (\n <div className=\"bg-orange-50 dark:bg-orange-900/20 border border-orange-200 dark:border-orange-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-orange-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-orange-800 dark:text-orange-200\">\n No Audio Input Detected\n </h3>\n <div className=\"mt-2 text-sm text-orange-700 dark:text-orange-300\">\n <p>{error}</p>\n <ul className=\"mt-2 list-disc list-inside\">\n <li>Check if your microphone is properly connected</li>\n <li>Ensure you're speaking close enough to the microphone</li>\n <li>Try adjusting your microphone volume settings</li>\n <li>Test your microphone in other applications</li>\n <li>Make sure your browser has microphone permissions</li>\n <li>Please reload the page and try again</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // Show microphone/audio errors\n if (isMicrophoneError) {\n return (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-red-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-red-800 dark:text-red-200\">\n Audio Input Issue\n </h3>\n <div className=\"mt-2 text-sm text-red-700 dark:text-red-300\">\n <p>{error}</p>\n </div>\n <div className=\"mt-4\">\n <button\n onClick={() => {\n validateMicrophoneAccess();\n }}\n className=\"bg-red-600 hover:bg-red-700 text-white px-3 py-1 rounded text-sm transition-colors\"\n >\n Check Again\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {toast.show && (\n <Toast message={toast.message} type={toast.type} onClose={closeToast} duration={3} />\n )}\n\n {/* Recording Info Display */}\n {(isRecording || isPaused || recordingDuration > 0) && (\n <div className=\"bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4\">\n <div className=\"flex justify-between items-center\">\n <div className=\"text-sm text-gray-600 dark:text-gray-300\">\n <div className=\"flex space-x-4\">\n <span>Duration: {formatDuration(recordingDuration)}</span>\n <span>Chunks: {totalChunks}</span>\n <span>Format: {format.toUpperCase()}</span>\n {silenceRemoval && <span>Silence Removal: ON</span>}\n </div>\n </div>\n {showDownload && lastAudioFile && (\n <button\n onClick={handleDownload}\n className=\"flex items-center space-x-1 bg-blue-600 hover:bg-blue-700 text-white px-3 py-1 rounded text-sm transition-colors\"\n >\n <Download className=\"h-3 w-3\" />\n <span>Download</span>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Processing Status */}\n {(isProcessing || isConverting) && (\n <div className=\"flex items-center justify-center space-x-2 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4\">\n <Loader2 className=\"animate-spin h-5 w-5 text-blue-600\" />\n <div className=\"text-center\">\n <span className=\"block text-sm font-medium text-blue-700 dark:text-blue-300\">\n {isConverting ? `Processing Audio... ${Math.round(progress)}%` : \"Processing audio chunk...\"}\n </span>\n {statusMessage && (\n <span className=\"block text-xs text-blue-600 dark:text-blue-400 mt-1\">\n {statusMessage}\n </span>\n )}\n </div>\n </div>\n )}\n\n {/* Audio Visualizer */}\n {isRecording && !isPaused && mediaStreamRef.current && (\n <div\n className={`audio-recorder-container ${isRecording && !isPaused ? \"glow-active\" : \"\"}`}\n >\n <div className=\"edge-container\">\n <div className=\"edge edge-top\" />\n <div className=\"edge edge-right\" />\n <div className=\"edge edge-bottom\" />\n <div className=\"edge edge-left\" />\n </div>\n <div className=\"flex justify-center items-center\">\n <AudioVisualizerImproved\n mediaStream={mediaStreamRef.current}\n isRecording={isRecording && !isPaused}\n forceLight={false}\n />\n </div>\n </div>\n )}\n\n {/* Control Buttons */}\n <div className=\"flex justify-center\">\n {isProcessing ? (\n <div className=\"flex items-center justify-center space-x-2 bg-teal-600 hover:bg-teal-700 text-white py-2 px-4 rounded-full\">\n <Loader2 className=\"animate-spin h-5 w-5\" />\n <span>Processing...</span>\n </div>\n ) : isRecording || isPaused ? (\n <div className=\"flex space-x-2\">\n <button\n className={`flex items-center justify-center space-x-2 bg-red-600 hover:bg-red-700 text-white py-2 px-4 rounded-full transition-colors ${\n isDisabled ? \"opacity-50 cursor-not-allowed\" : \"\"\n }`}\n onClick={handleStopClick}\n disabled={isDisabled}\n >\n <Square className=\"h-5 w-5\" />\n <span>Stop</span>\n </button>\n {!isPaused ? (\n <button\n className=\"flex items-center justify-center space-x-2 bg-yellow-500 hover:bg-yellow-600 text-white py-2 px-4 rounded-full transition-colors\"\n onClick={pauseRecording}\n >\n <Pause className=\"h-5 w-5\" />\n <span>Pause</span>\n </button>\n ) : (\n <button\n className=\"flex items-center justify-center space-x-2 bg-green-600 hover:bg-green-700 text-white py-2 px-4 rounded-full transition-colors\"\n onClick={resumeRecording}\n >\n <Play className=\"h-5 w-5\" />\n <span>Resume</span>\n </button>\n )}\n </div>\n ) : (\n <button\n className={\n className\n ? `flex items-center justify-center space-x-2 py-2 px-4 rounded-full transition-colors ${className}`\n : \"flex items-center justify-center space-x-2 bg-gradient-to-r from-purple-400 to-blue-500 hover:bg-gradient-to-r hover:from-purple-500 hover:to-blue-600 text-white py-2 px-4 rounded-full transition-colors\"\n }\n onClick={handleStartRecording}\n >\n <Mic className=\"h-5 w-5\" />\n <span>Start Recording</span>\n </button>\n )}\n </div>\n\n {/* Microphone Selection */}\n {availableDevices.length > 1 && (\n <div className=\"mt-4\">\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n Select Microphone:\n </label>\n <select\n value={currentDeviceId || \"\"}\n onChange={(e) => selectMicrophone(e.target.value)}\n className=\"w-full p-2 border border-gray-200 dark:border-gray-700 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100\"\n disabled={isRecording}\n >\n {availableDevices.map((device) => (\n <option key={device.deviceId} value={device.deviceId}>\n {device.label || `Microphone ${device.deviceId.slice(0, 8)}`}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n );\n};\n\nexport default AudioCapture;"]}
1
+ {"version":3,"sources":["../src/hooks/useFFmpegConverter.ts","../src/hooks/useAudioRecovery.ts","../src/hooks/useHL7FHIRConverter.ts","../src/hooks/useAudioRecorder.ts","../src/components/Toast.tsx","../src/components/AudioVisualizerImproved.tsx","../src/AudioRecorder.tsx","../src/hooks/useAudioDictation.ts","../src/AudioDictation.tsx","../src/hooks/useAudioCapture.ts","../src/AudioCapture.tsx"],"names":["useState","useCallback","error","useRef","useEffect","React","pRetry","AbortError","isPaused","React4","jsx","Check","AlertCircle","jsxs","XIcon","React5","React6","AlertTriangle","Loader2","Square","Pause","Play","Mic","API_BASE_URL","offset","React7","Fragment","tailwindStyles","stylesInjected","injectTailwindStyles","React9","Download"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAM,qBAAqB,MAAM;AAC/B,EAAA,MAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","file":"index.js","sourcesContent":["import { useState, useCallback } from \"react\";\n\ninterface FFmpegConverterOptions {\n quality?: number;\n bitRate?: number;\n}\n\n// Embedded FFmpeg Worker - no external files needed\nconst createFFmpegWorker = () => {\n const workerCode = `\n let ffmpegModule = null;\n \n const helperFunctions = {\n float32ToWavFile: function(left, sampleRate = 44100) {\n const length = left.length;\n const buffer = new ArrayBuffer(44 + length * 2);\n const view = new DataView(buffer);\n \n const writeString = (offset, string) => {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i));\n }\n };\n \n const floatTo16BitPCM = (output, offset, input) => {\n for (let i = 0; i < input.length; i++, offset += 2) {\n const s = Math.max(-1, Math.min(1, input[i]));\n output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);\n }\n };\n \n writeString(0, 'RIFF');\n view.setUint32(4, 36 + length * 2, true);\n writeString(8, 'WAVE');\n writeString(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, 'data');\n view.setUint32(40, length * 2, true);\n \n floatTo16BitPCM(view, 44, left);\n \n return buffer;\n },\n \n processAudioData: function(audioBuffer, options = {}) {\n try {\n const { quality = 1, bitRate = 128000 } = options;\n const float32Array = new Float32Array(audioBuffer);\n const wavBuffer = this.float32ToWavFile(float32Array);\n \n return {\n buffer: wavBuffer,\n size: wavBuffer.byteLength,\n duration: float32Array.length / 44100\n };\n } catch (error) {\n throw new Error('Failed to process audio data: ' + error.message);\n }\n },\n \n removeSilenceFromAudio: function(audioBuffer, options = {}) {\n try {\n const {\n silenceThreshold = 0.005, // Reduced from 0.01 to be less aggressive\n minSilenceDuration = 1.0, // Increased from 0.5 to preserve natural pauses\n sampleRate = 44100\n } = options;\n \n const float32Array = new Float32Array(audioBuffer);\n const minSilenceSamples = Math.floor(minSilenceDuration * sampleRate);\n const result = [];\n \n let silenceStart = -1;\n let silenceLength = 0;\n let totalAudioSamples = 0;\n let totalSilentSamples = 0;\n \n // First pass: analyze audio content\n for (let i = 0; i < float32Array.length; i++) {\n const sample = Math.abs(float32Array[i]);\n if (sample > silenceThreshold) {\n totalAudioSamples++;\n } else {\n totalSilentSamples++;\n }\n }\n \n const audioPercentage = totalAudioSamples / float32Array.length;\n console.log(\\`[AUDIO] Audio content: \\${(audioPercentage * 100).toFixed(2)}%\\`);\n \n // If less than 5% is audio, skip silence removal to prevent over-processing\n if (audioPercentage < 0.05) {\n console.warn('[WARN] Audio content too low, skipping silence removal to preserve speech');\n const wavBuffer = this.float32ToWavFile(float32Array, sampleRate);\n return {\n buffer: wavBuffer,\n size: wavBuffer.byteLength,\n duration: float32Array.length / sampleRate,\n originalDuration: float32Array.length / sampleRate,\n reductionPercentage: 0\n };\n }\n \n // Second pass: remove long silences\n for (let i = 0; i < float32Array.length; i++) {\n const sample = Math.abs(float32Array[i]);\n \n if (sample < silenceThreshold) {\n if (silenceStart === -1) {\n silenceStart = i;\n }\n silenceLength++;\n } else {\n // End of silence detected\n if (silenceStart !== -1) {\n if (silenceLength < minSilenceSamples) {\n // Keep short silences (natural pauses)\n for (let j = silenceStart; j < i; j++) {\n result.push(float32Array[j]);\n }\n } else {\n // Replace long silences with shorter ones (0.3 seconds instead of 0.1)\n const shortSilenceSamples = Math.floor(0.3 * sampleRate);\n for (let j = 0; j < shortSilenceSamples; j++) {\n result.push(0);\n }\n }\n silenceStart = -1;\n silenceLength = 0;\n }\n \n // Add non-silent sample\n result.push(float32Array[i]);\n }\n }\n \n // Handle trailing silence\n if (silenceStart !== -1 && silenceLength >= minSilenceSamples) {\n const shortSilenceSamples = Math.floor(0.3 * sampleRate);\n for (let j = 0; j < shortSilenceSamples; j++) {\n result.push(0);\n }\n } else if (silenceStart !== -1) {\n for (let j = silenceStart; j < float32Array.length; j++) {\n result.push(float32Array[j]);\n }\n }\n \n const processedArray = new Float32Array(result);\n \n // Safety check: ensure we haven't removed too much content\n const reductionPercentage = Math.round((1 - processedArray.length / float32Array.length) * 100);\n if (reductionPercentage > 80) {\n console.warn('[WARN] Excessive silence removal detected, skipping to preserve speech naturalness');\n const wavBuffer = this.float32ToWavFile(float32Array, sampleRate);\n return {\n buffer: wavBuffer,\n size: wavBuffer.byteLength,\n duration: float32Array.length / sampleRate,\n originalDuration: float32Array.length / sampleRate,\n reductionPercentage: 0\n };\n }\n \n const wavBuffer = this.float32ToWavFile(processedArray, sampleRate);\n \n console.log(\\`[SUCCESS] Silence removal complete. Original Duration: \\${(float32Array.length / sampleRate).toFixed(2)}s, Processed Duration: \\${(processedArray.length / sampleRate).toFixed(2)}s, Reduction: \\${reductionPercentage}%\\`);\n \n return {\n buffer: wavBuffer,\n size: wavBuffer.byteLength,\n duration: processedArray.length / sampleRate,\n originalDuration: float32Array.length / sampleRate,\n reductionPercentage: reductionPercentage\n };\n } catch (error) {\n throw new Error('Failed to remove silence: ' + error.message);\n }\n }\n };\n\n self.onmessage = function(e) {\n const { type, audioBuffer, options } = e.data;\n \n if (type === 'convertWav') {\n try {\n self.postMessage({ type: 'progress', data: { progress: 10, message: 'Starting conversion...' } });\n \n const result = helperFunctions.processAudioData(audioBuffer, options);\n \n self.postMessage({ type: 'progress', data: { progress: 50, message: 'Processing audio...' } });\n \n setTimeout(() => {\n self.postMessage({ type: 'progress', data: { progress: 90, message: 'Finalizing...' } });\n \n setTimeout(() => {\n self.postMessage({ \n type: 'complete', \n data: { \n buffer: result.buffer,\n size: result.size,\n duration: result.duration \n } \n });\n }, 100);\n }, 100);\n \n } catch (error) {\n self.postMessage({ \n type: 'error', \n error: error.message || 'Unknown conversion error' \n });\n }\n } else if (type === 'removeSilence') {\n try {\n self.postMessage({ type: 'progress', progress: 10, message: 'Analyzing audio...' });\n \n const result = helperFunctions.removeSilenceFromAudio(audioBuffer, options);\n \n self.postMessage({ type: 'progress', progress: 70, message: 'Removing silence...' });\n \n setTimeout(() => {\n self.postMessage({ type: 'progress', progress: 90, message: 'Finalizing...' });\n \n setTimeout(() => {\n self.postMessage({ \n type: 'complete', \n result: {\n data: result.buffer,\n name: options.fileName || 'processed_audio.wav',\n type: options.fileType || 'audio/wav',\n stats: {\n originalDuration: result.originalDuration,\n processedDuration: result.duration,\n reductionPercentage: result.reductionPercentage,\n originalSize: options.originalSize || 0,\n processedSize: result.size\n }\n }\n });\n }, 100);\n }, 100);\n \n } catch (error) {\n self.postMessage({ \n type: 'error', \n error: error.message || 'Unknown silence removal error' \n });\n }\n } else if (type === 'init') {\n // For compatibility with existing code\n self.postMessage({ type: 'ready' });\n }\n };\n `;\n\n const blob = new Blob([workerCode], { type: \"application/javascript\" });\n return URL.createObjectURL(blob);\n};\n\n// Legacy interface compatibility for existing code\ninterface UseFFmpegConverterReturn {\n ffmpeg: null;\n isLoaded: boolean;\n isConverting: boolean;\n progress: number;\n error: string | null;\n statusMessage: string;\n loadFFmpeg: () => Promise<boolean>;\n convertToWav: (\n audioData: Float32Array,\n sampleRate?: number,\n fileName?: string\n ) => Promise<File | null>;\n removeSilence: (file: File) => Promise<File | null>;\n reset: () => void;\n}\n\nconst useFFmpegConverter = (): UseFFmpegConverterReturn => {\n const [isLoaded, setIsLoaded] = useState(true); // Always loaded since we use embedded worker\n const [isConverting, setIsConverting] = useState(false);\n const [progress, setProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [statusMessage, setStatusMessage] = useState<string>(\"\");\n\n const loadFFmpeg = useCallback(async (): Promise<boolean> => {\n // No loading needed for embedded worker\n setIsLoaded(true);\n return true;\n }, []);\n\n const convertToWav = useCallback(\n async (\n audioData: Float32Array,\n sampleRate: number = 44100,\n fileName: string = \"recording.wav\"\n ): Promise<File | null> => {\n setIsConverting(true);\n setProgress(0);\n setError(null);\n setStatusMessage(\"Converting audio...\");\n\n try {\n // Create worker dynamically\n const workerUrl = createFFmpegWorker();\n const worker = new Worker(workerUrl);\n\n return new Promise<File>((resolve, reject) => {\n worker.onmessage = (e) => {\n const { type, data, error: workerError } = e.data;\n\n if (type === \"progress\") {\n setProgress(data.progress);\n setStatusMessage(data.message || `Converting... ${data.progress}%`);\n } else if (type === \"complete\") {\n setIsConverting(false);\n setProgress(100);\n setStatusMessage(\"Conversion complete\");\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n\n const blob = new Blob([data.buffer], { type: \"audio/wav\" });\n const file = new File([blob], fileName, { type: \"audio/wav\" });\n resolve(file);\n } else if (type === \"error\") {\n setIsConverting(false);\n setError(workerError);\n setStatusMessage(\"Conversion failed\");\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n reject(new Error(workerError));\n }\n };\n\n worker.onerror = (err) => {\n setIsConverting(false);\n setError(\"Worker error occurred\");\n setStatusMessage(\"Conversion failed\");\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n reject(err);\n };\n\n worker.postMessage({\n type: \"convertWav\",\n audioBuffer: audioData.buffer,\n sampleRate,\n options: { quality: 1, bitRate: 128000 },\n });\n });\n } catch (err) {\n setIsConverting(false);\n setError(err instanceof Error ? err.message : \"Unknown error\");\n setStatusMessage(\"Conversion failed\");\n throw err;\n }\n },\n []\n );\n\n const removeSilence = useCallback(async (file: File): Promise<File | null> => {\n // Validate input file\n if (!file) {\n setError(\"No file provided for processing\");\n return null;\n }\n\n // Check file size - 50MB limit\n const maxFileSize = 50 * 1024 * 1024; // 50MB\n if (file.size > maxFileSize) {\n console.warn(`File too large (${file.size} bytes), skipping silence removal`);\n return file; // Return original file\n }\n\n try {\n setIsConverting(true);\n setError(null);\n setProgress(0);\n setStatusMessage(\"Starting audio processing...\");\n\n // Read the file as array buffer\n const arrayBuffer = await file.arrayBuffer();\n \n console.log(`[INFO] Processing WAV file: ${file.size} bytes, name: ${file.name}`);\n\n // Parse WAV file header properly\n const dataView = new DataView(arrayBuffer);\n \n // Validate WAV file format\n const riffSignature = String.fromCharCode(\n dataView.getUint8(0),\n dataView.getUint8(1), \n dataView.getUint8(2),\n dataView.getUint8(3)\n );\n \n if (riffSignature !== 'RIFF') {\n console.error('Invalid WAV file: Missing RIFF header');\n return file; // Return original file\n }\n \n const waveSignature = String.fromCharCode(\n dataView.getUint8(8),\n dataView.getUint8(9),\n dataView.getUint8(10),\n dataView.getUint8(11)\n );\n \n if (waveSignature !== 'WAVE') {\n console.error('Invalid WAV file: Missing WAVE signature');\n return file; // Return original file\n }\n \n // Find the data chunk\n let dataChunkOffset = 12;\n let audioDataStart = -1;\n let audioDataLength = 0;\n \n while (dataChunkOffset < arrayBuffer.byteLength - 8) {\n const chunkId = String.fromCharCode(\n dataView.getUint8(dataChunkOffset),\n dataView.getUint8(dataChunkOffset + 1),\n dataView.getUint8(dataChunkOffset + 2),\n dataView.getUint8(dataChunkOffset + 3)\n );\n \n const chunkSize = dataView.getUint32(dataChunkOffset + 4, true);\n \n if (chunkId === 'data') {\n audioDataStart = dataChunkOffset + 8;\n audioDataLength = chunkSize;\n break;\n }\n \n dataChunkOffset += 8 + chunkSize;\n }\n \n if (audioDataStart === -1) {\n console.error('No audio data chunk found in WAV file');\n return file; // Return original file\n }\n \n console.log(`[AUDIO] Found audio data: start=${audioDataStart}, length=${audioDataLength} bytes`);\n \n // Extract audio data (assuming 16-bit PCM)\n const audioData = new Int16Array(arrayBuffer, audioDataStart, audioDataLength / 2);\n \n // Validate extracted audio data\n if (audioData.length === 0) {\n console.error('No audio data extracted from WAV file');\n return file; // Return original file\n }\n\n // Convert to Float32Array for processing\n const float32Data = new Float32Array(audioData.length);\n let nonZeroCount = 0;\n for (let i = 0; i < audioData.length; i++) {\n float32Data[i] = audioData[i] / 32768; // Convert to -1 to 1 range\n if (Math.abs(float32Data[i]) > 0.001) nonZeroCount++;\n }\n \n const audioPercentage = nonZeroCount / float32Data.length;\n console.log(`[INFO] Audio validation: ${audioData.length} samples, ${nonZeroCount} non-zero samples (${(audioPercentage * 100).toFixed(2)}%)`);\n \n // If very little audio content, skip silence removal\n if (audioPercentage < 0.01) {\n console.warn(`[WARN] Very little audio content (${(audioPercentage * 100).toFixed(2)}%), skipping silence removal`);\n return file;\n }\n\n // Create worker dynamically\n const workerUrl = createFFmpegWorker();\n const worker = new Worker(workerUrl);\n\n return new Promise<File | null>((resolve, reject) => {\n const messageHandler = (e: MessageEvent) => {\n const { type, progress: workerProgress, message, result, error } = e.data;\n\n switch (type) {\n case \"progress\":\n setProgress(workerProgress);\n setStatusMessage(message);\n break;\n\n case \"complete\":\n worker.removeEventListener(\"message\", messageHandler);\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n\n try {\n const processedFile = new File([new Uint8Array(result.data)], result.name, {\n type: result.type,\n });\n\n console.log(\"[INFO] Silence removal + audio compression results:\", result.stats);\n\n setProgress(100);\n setStatusMessage(\"Processing complete!\");\n\n setTimeout(() => {\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n }, 1000);\n\n resolve(processedFile);\n } catch (fileError) {\n console.error(\"Error creating processed file:\", fileError);\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n resolve(file); // Return original file\n }\n break;\n\n case \"error\":\n worker.removeEventListener(\"message\", messageHandler);\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n console.error(\"Worker processing error:\", error);\n setError(`Processing failed: ${error}`);\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n resolve(file); // Return original file instead of failing\n break;\n }\n };\n\n worker.addEventListener(\"message\", messageHandler);\n\n worker.onerror = (workerError) => {\n worker.removeEventListener(\"message\", messageHandler);\n worker.terminate();\n URL.revokeObjectURL(workerUrl);\n console.error(\"Worker error during processing:\", workerError);\n setError(\"Worker processing failed\");\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n resolve(file); // Return original file\n };\n\n // Start processing with original command structure\n worker.postMessage({\n type: \"removeSilence\",\n audioBuffer: float32Data.buffer,\n options: {\n silenceThreshold: 0.01, // Amplitude threshold for silence\n minSilenceDuration: 0.5, // Minimum silence duration to remove (seconds)\n sampleRate: 44100, // Assume standard sample rate\n fileName: file.name,\n fileType: file.type,\n originalSize: file.size,\n },\n }); \n console.log(`🚀 Sent ${float32Data.length} samples to silence removal worker`); });\n } catch (err) {\n console.error(\"Worker removeSilence failed:\", err);\n setError(\"Audio processing failed\");\n setIsConverting(false);\n setProgress(0);\n setStatusMessage(\"\");\n return file; // Return original file\n }\n }, []);\n\n const reset = useCallback(() => {\n setIsConverting(false);\n setProgress(0);\n setError(null);\n setStatusMessage(\"\");\n }, []);\n\n return {\n ffmpeg: null,\n isLoaded,\n isConverting,\n progress,\n error,\n statusMessage,\n loadFFmpeg,\n convertToWav,\n removeSilence,\n reset,\n };\n};\n\nexport default useFFmpegConverter;\n","import React, { useCallback, useEffect, useRef } from \"react\";\n\ninterface AudioSession {\n id: string;\n audioChunks: Record<number, string>; // Change from array to object\n metadata: {\n patientId?: number;\n patientName?: string;\n patientHistory?: string;\n speciality: string;\n sampleRate: number; // Store original sample rate for correct WAV conversion on retry\n timestamp: number;\n totalChunks: number;\n completedChunks: number;\n chunkIndices: number[]; // Track which chunks we have\n };\n status: \"recording\" | \"processing\" | \"failed\" | \"completed\";\n retryCount: number;\n lastError?: string;\n}\n\ninterface AudioRecoveryHookReturn {\n createSession: (\n sessionId: string,\n metadata: {\n patientId?: number;\n patientName?: string;\n patientHistory?: string;\n speciality: string;\n sampleRate: number;\n }\n ) => Promise<void>;\n appendAudioToSession: (\n sessionId: string,\n audioData: Float32Array,\n sequence: number\n ) => Promise<void>;\n markSessionComplete: (sessionId: string) => Promise<void>;\n markSessionFailed: (sessionId: string, error?: string) => Promise<void>;\n retrySession: (sessionId: string) => Promise<boolean>;\n deleteSession: (sessionId: string) => Promise<void>;\n getFailedSession: () => Promise<AudioSession | null>;\n hasFailedSession: () => Promise<boolean>;\n clearFailedSessions: () => Promise<void>;\n}\n\nconst useAudioRecovery = (\n reprocessSession: (\n audioChunks: Float32Array[],\n metadata: AudioSession[\"metadata\"]\n ) => Promise<void>\n): AudioRecoveryHookReturn => {\n const dbRef = useRef<IDBDatabase | null>(null);\n const workerRef = useRef<Worker | null>(null);\n const pendingOperations = useRef<Map<string, { resolve: Function; reject: Function }>>(new Map());\n\n const DB_NAME = \"AudioSessionDB\";\n const STORE_NAME = \"audioSessions\";\n const DB_VERSION = 1;\n const MAX_RETRY_COUNT = 3;\n\n // Initialize the encoding worker\n const initWorker = useCallback(() => {\n if (!workerRef.current) {\n try {\n workerRef.current = new Worker(\"/audio-encoding-worker.js\");\n\n workerRef.current.onmessage = (e) => {\n const { type, id, result, error, progress, message } = e.data;\n const operation = pendingOperations.current.get(id);\n\n if (!operation) {\n console.warn(`No pending operation found for id: ${id}`);\n return;\n }\n\n switch (type) {\n case \"progress\":\n // Optional: You could emit progress events here\n break;\n\n case \"complete\":\n pendingOperations.current.delete(id);\n operation.resolve(result);\n break;\n\n case \"error\":\n pendingOperations.current.delete(id);\n operation.reject(new Error(error));\n break;\n }\n };\n\n workerRef.current.onerror = (error) => {\n console.error(\"Audio encoding worker error:\", error);\n // Reject all pending operations\n for (const [id, operation] of pendingOperations.current) {\n operation.reject(new Error(\"Worker crashed\"));\n }\n pendingOperations.current.clear();\n workerRef.current = null;\n };\n\n console.log(\"🎵 Audio encoding worker initialized\");\n } catch (error) {\n console.error(\"Failed to initialize audio encoding worker:\", error);\n workerRef.current = null;\n }\n }\n return workerRef.current;\n }, []);\n\n // Encode Float32Array to base64 using worker\n const encodeInWorker = useCallback(\n async (audioData: Float32Array): Promise<string> => {\n const worker = initWorker();\n\n if (!worker) {\n // Fallback to main thread if worker fails\n console.warn(\"Worker not available, falling back to main thread encoding\");\n return float32ArrayToBase64(audioData);\n }\n\n const operationId = `encode_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n return new Promise<string>((resolve, reject) => {\n // Store the operation\n pendingOperations.current.set(operationId, { resolve, reject });\n\n // Set timeout for the operation\n const timeoutId = setTimeout(() => {\n if (pendingOperations.current.has(operationId)) {\n pendingOperations.current.delete(operationId);\n reject(new Error(\"Worker encoding timeout\"));\n }\n }, 10000); // 10 second timeout\n\n // Override resolve/reject to clear timeout\n const originalResolve = resolve;\n const originalReject = reject;\n\n pendingOperations.current.set(operationId, {\n resolve: (result: string) => {\n clearTimeout(timeoutId);\n originalResolve(result);\n },\n reject: (error: Error) => {\n clearTimeout(timeoutId);\n originalReject(error);\n },\n });\n\n // Send work to worker\n worker.postMessage({\n command: \"encodeFloat32ToBase64\",\n id: operationId,\n data: {\n audioData: Array.from(audioData), // Convert to regular array for transfer\n },\n });\n });\n },\n [initWorker]\n );\n\n // Decode base64 to Float32Array using worker\n const decodeInWorker = useCallback(\n async (base64Data: string): Promise<Float32Array> => {\n const worker = initWorker();\n\n if (!worker) {\n // Fallback to main thread if worker fails\n console.warn(\"Worker not available, falling back to main thread decoding\");\n return base64ToFloat32Array(base64Data);\n }\n\n const operationId = `decode_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n return new Promise<Float32Array>((resolve, reject) => {\n // Store the operation\n pendingOperations.current.set(operationId, { resolve, reject });\n\n // Set timeout for the operation\n const timeoutId = setTimeout(() => {\n if (pendingOperations.current.has(operationId)) {\n pendingOperations.current.delete(operationId);\n reject(new Error(\"Worker decoding timeout\"));\n }\n }, 10000); // 10 second timeout\n\n // Override resolve/reject to clear timeout\n const originalResolve = resolve;\n const originalReject = reject;\n\n pendingOperations.current.set(operationId, {\n resolve: (result: number[]) => {\n clearTimeout(timeoutId);\n originalResolve(new Float32Array(result));\n },\n reject: (error: Error) => {\n clearTimeout(timeoutId);\n originalReject(error);\n },\n });\n\n // Send work to worker\n worker.postMessage({\n command: \"decodeBase64ToFloat32\",\n id: operationId,\n data: {\n base64Data,\n },\n });\n });\n },\n [initWorker]\n );\n\n // Initialize IndexedDB\n const initDB = useCallback(async (): Promise<IDBDatabase> => {\n if (dbRef.current) {\n return dbRef.current;\n }\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => {\n console.error(\"Failed to open IndexedDB:\", request.error);\n reject(request.error);\n };\n\n request.onsuccess = () => {\n dbRef.current = request.result;\n resolve(request.result);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n\n // Create object store if it doesn't exist\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, { keyPath: \"id\" });\n store.createIndex(\"status\", \"status\", { unique: false });\n store.createIndex(\"timestamp\", \"metadata.timestamp\", { unique: false });\n }\n };\n });\n }, []);\n\n // Convert Float32Array to base64\n const float32ArrayToBase64 = useCallback((audioData: Float32Array): string => {\n const buffer = new ArrayBuffer(audioData.length * 4);\n const view = new Float32Array(buffer);\n view.set(audioData);\n\n const bytes = new Uint8Array(buffer);\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }, []);\n\n // Convert base64 back to Float32Array\n const base64ToFloat32Array = useCallback((base64: string): Float32Array => {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return new Float32Array(bytes.buffer);\n }, []);\n\n // Create new session\n const createSession = useCallback(\n async (\n sessionId: string,\n metadata: {\n patientId?: number;\n patientName?: string;\n patientHistory?: string;\n speciality: string;\n sampleRate: number;\n }\n ): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n const session: AudioSession = {\n id: sessionId,\n audioChunks: {},\n metadata: {\n ...metadata,\n timestamp: Date.now(),\n totalChunks: 0,\n completedChunks: 0,\n chunkIndices: [],\n },\n status: \"recording\",\n retryCount: 0,\n };\n\n await new Promise<void>((resolve, reject) => {\n const request = store.add(session);\n\n request.onsuccess = () => {\n console.log(`Created audio session ${sessionId}`);\n resolve();\n };\n\n request.onerror = () => {\n console.error(\"Failed to create session:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error creating session:\", error);\n throw error;\n }\n },\n [initDB]\n );\n\n const appendAudioToSession = useCallback(\n async (sessionId: string, audioData: Float32Array, sequence: number): Promise<void> => {\n try {\n const base64Audio = await encodeInWorker(audioData);\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n await new Promise<void>((resolve, reject) => {\n const getRequest = store.get(sessionId);\n\n getRequest.onsuccess = () => {\n const session = getRequest.result as AudioSession;\n if (!session) {\n resolve();\n return;\n }\n\n // Use object storage - no sparse arrays!\n const updatedSession = {\n ...session,\n audioChunks: { ...session.audioChunks },\n metadata: { ...session.metadata },\n };\n\n // Simply set the chunk\n updatedSession.audioChunks[sequence] = base64Audio;\n\n // Update metadata\n const chunkIndices = Object.keys(updatedSession.audioChunks)\n .map(Number)\n .sort((a, b) => a - b);\n updatedSession.metadata.chunkIndices = chunkIndices;\n updatedSession.metadata.completedChunks = chunkIndices.length;\n updatedSession.metadata.totalChunks = Math.max(\n updatedSession.metadata.totalChunks,\n sequence + 1\n );\n\n const updateRequest = store.put(updatedSession);\n updateRequest.onsuccess = () => resolve();\n updateRequest.onerror = () => reject(updateRequest.error);\n };\n\n getRequest.onerror = () => reject(getRequest.error);\n });\n } catch (error) {\n console.error(`Failed to append chunk ${sequence}:`, error);\n }\n },\n [initDB, encodeInWorker]\n );\n\n // Update retry to work with object storage\n const retrySession = useCallback(\n async (sessionId: string): Promise<boolean> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readonly\");\n const store = transaction.objectStore(STORE_NAME);\n\n const session = await new Promise<AudioSession>((resolve, reject) => {\n const request = store.get(sessionId);\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n if (!session) return false;\n\n // Convert object chunks to ordered array\n const audioChunks: Float32Array[] = [];\n const chunkIndices = Object.keys(session.audioChunks)\n .map(Number)\n .sort((a, b) => a - b);\n\n console.log(\n `Found ${chunkIndices.length} chunks with indices: ${chunkIndices.slice(0, 10)}...`\n );\n\n for (const index of chunkIndices) {\n try {\n const base64Data = session.audioChunks[index];\n const float32Array = await decodeInWorker(base64Data);\n audioChunks.push(float32Array);\n } catch (error) {\n console.error(`Failed to decode chunk ${index}:`, error);\n }\n }\n\n if (audioChunks.length === 0) {\n console.error(\"No valid chunks found\");\n return false;\n }\n\n await reprocessSession(audioChunks, session.metadata);\n return true;\n } catch (error) {\n console.error(\"Retry failed:\", error);\n return false;\n }\n },\n [initDB, decodeInWorker, reprocessSession]\n );\n\n // Mark session as complete and delete it\n const markSessionComplete = useCallback(\n async (sessionId: string): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n await new Promise<void>((resolve, reject) => {\n const request = store.delete(sessionId);\n\n request.onsuccess = () => {\n console.log(`Deleted completed session ${sessionId}`);\n resolve();\n };\n\n request.onerror = () => {\n console.error(\"Failed to delete session:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error marking session complete:\", error);\n throw error;\n }\n },\n [initDB]\n );\n\n // Mark session as failed\n const markSessionFailed = useCallback(\n async (sessionId: string, error?: string): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n // Get existing session\n const getRequest = store.get(sessionId);\n\n await new Promise<void>((resolve, reject) => {\n getRequest.onsuccess = () => {\n const session = getRequest.result as AudioSession;\n\n if (!session) {\n reject(new Error(`Session ${sessionId} not found`));\n return;\n }\n\n // Update session status\n session.status = \"failed\";\n session.lastError = error;\n\n const updateRequest = store.put(session);\n updateRequest.onsuccess = () => {\n console.log(`Marked session ${sessionId} as failed`);\n resolve();\n };\n updateRequest.onerror = () => reject(updateRequest.error);\n };\n\n getRequest.onerror = () => reject(getRequest.error);\n });\n } catch (error) {\n console.error(\"Error marking session failed:\", error);\n throw error;\n }\n },\n [initDB]\n );\n\n // Delete specific session\n const deleteSession = useCallback(\n async (sessionId: string): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n await new Promise<void>((resolve, reject) => {\n const request = store.delete(sessionId);\n\n request.onsuccess = () => {\n console.log(`Deleted session ${sessionId}`);\n resolve();\n };\n\n request.onerror = () => {\n console.error(\"Failed to delete session:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error deleting session:\", error);\n throw error;\n }\n },\n [initDB]\n );\n\n // Get all failed sessions\n const getFailedSession = useCallback(async (): Promise<AudioSession | null> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readonly\");\n const store = transaction.objectStore(STORE_NAME);\n const index = store.index(\"status\");\n\n return new Promise((resolve, reject) => {\n const request = index.getAll(\"failed\");\n\n request.onsuccess = () => {\n resolve(request.result[0]);\n };\n\n request.onerror = () => {\n console.error(\"Failed to get failed sessions:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error getting failed sessions:\", error);\n return null;\n }\n }, [initDB]);\n\n // Check if there are failed sessions\n const hasFailedSession = useCallback(async (): Promise<boolean> => {\n const failedSession = await getFailedSession();\n return !!failedSession;\n }, [getFailedSession]);\n\n // Clear failed sessions\n const clearFailedSessions = useCallback(async (): Promise<void> => {\n try {\n const db = await initDB();\n const transaction = db.transaction([STORE_NAME], \"readwrite\");\n const store = transaction.objectStore(STORE_NAME);\n\n await new Promise<void>((resolve, reject) => {\n const request = store.clear();\n\n request.onsuccess = () => {\n console.log(\"Cleared all audio sessions\");\n resolve();\n };\n\n request.onerror = () => {\n console.error(\"Failed to clear sessions:\", request.error);\n reject(request.error);\n };\n });\n } catch (error) {\n console.error(\"Error clearing sessions:\", error);\n throw error;\n }\n }, [initDB]);\n\n // Cleanup worker on unmount\n const cleanup = useCallback(() => {\n if (workerRef.current) {\n console.log(\"🧹 Cleaning up audio encoding worker\");\n workerRef.current.terminate();\n workerRef.current = null;\n }\n pendingOperations.current.clear();\n\n if (dbRef.current) {\n dbRef.current.close();\n dbRef.current = null;\n }\n }, []);\n\n // Add cleanup effect\n useEffect(() => {\n return cleanup;\n }, [cleanup]);\n\n return {\n createSession,\n appendAudioToSession,\n markSessionComplete,\n markSessionFailed,\n retrySession,\n deleteSession,\n getFailedSession,\n hasFailedSession,\n clearFailedSessions,\n };\n};\n\nexport default useAudioRecovery;\n","import React, { useState, useCallback } from \"react\";\n\ninterface TranscriptionResponse {\n transcription: string;\n classifiedInfo?: any;\n classification?: any;\n sessionId?: string | null;\n model?: string;\n processingTimes?: {\n transcriptionMs?: number;\n finalChunkProcessingMs?: number;\n totalProcessingMs?: number;\n };\n metadata?: {\n originalFormat: \"hl7\" | \"fhir\" | \"json\";\n processedAt: string;\n };\n}\n\ninterface SpecialitiesResponse {\n specialities?: Array<{\n value: string;\n label: string;\n description: string;\n }>;\n [key: string]: any;\n}\n\ninterface ApiResponse<T = any> {\n data?: T;\n [key: string]: any;\n}\n\ninterface HL7Segment {\n type: string;\n fields: string[];\n}\n\ninterface FHIRResource {\n resourceType: string;\n id?: string;\n text?: {\n status: string;\n div: string;\n };\n [key: string]: any;\n}\n\ninterface LoginResponse {\n user: {\n id: number;\n username: string;\n user_type: string[];\n };\n token: string;\n expiresAt: string;\n refreshToken: string;\n refreshTokenExpiresAt?: string;\n}\n\n// Add new interface for transcription request\ninterface TranscriptionRequest {\n sessionId?: string;\n model: string;\n doctorName: string;\n patientName: string;\n patientId?: number;\n removeSilence: boolean;\n skipDiarization: boolean;\n isFinalChunk: boolean;\n isPaused: boolean;\n userId?: number;\n sequence: number;\n speciality: string;\n retry?: boolean;\n}\n\n// Add new interfaces for dictation\ninterface DictationRequest {\n doctorName?: string;\n patientId?: string;\n sessionId?: string;\n language?: string;\n specialty?: string;\n [key: string]: any;\n}\n\ninterface DictationResponse {\n dictation: string;\n sessionId?: string | null;\n confidence?: number;\n language?: string;\n processingTimes?: {\n transcriptionMs?: number;\n totalProcessingMs?: number;\n // Add new fields for the dictation response\n audioSizeMB?: number;\n requestTimestamp?: number;\n processedAt?: string;\n dictationType?: string;\n };\n [key: string]: any;\n}\n\n// Add new interfaces for API Keys\ninterface ApiKeyRequest {\n id?: number;\n name?: string;\n type?: string;\n status?: string;\n user_id?: number;\n is_default?: boolean;\n [key: string]: any;\n}\n\ninterface ApiKeyResponse {\n id: number;\n key: string;\n name?: string;\n type?: string;\n status?: string;\n created_at: string;\n user_id: number;\n is_default: boolean;\n [key: string]: any;\n}\n\ninterface UseHL7FHIRConverterReturn {\n // Transcription-specific methods (keep as FormData for audio uploads)\n convertTranscriptionResponse: (\n response: any,\n format?: \"hl7\" | \"fhir\" | \"json\"\n ) => TranscriptionResponse;\n\n // Request formatting methods (audio uploads - keep as FormData)\n createHL7TranscriptionRequest: (audioFile: File, requestData: TranscriptionRequest) => FormData;\n createFHIRTranscriptionRequest: (audioFile: File, requestData: TranscriptionRequest) => FormData;\n\n // Dictation-specific methods\n createHL7DictationRequest: (audioFile: File, requestData: DictationRequest) => FormData;\n createFHIRDictationRequest: (audioFile: File, requestData: DictationRequest) => FormData;\n convertDictationResponse: (\n response: any,\n format?: \"hl7\" | \"fhir\" | \"json\" | \"auto\"\n ) => DictationResponse;\n convertHL7DictationToJson: (hl7Data: string) => DictationResponse;\n convertFHIRDictationToJson: (fhirData: any) => DictationResponse;\n\n isConverting: boolean;\n conversionError: string | null;\n clearError: () => void;\n}\n\nexport const useHL7FHIRConverter = (): UseHL7FHIRConverterReturn => {\n const [isConverting, setIsConverting] = useState(false);\n const [conversionError, setConversionError] = useState<string | null>(null);\n\n // Helper function to detect response format\n const detectFormat = useCallback((response: any): \"hl7\" | \"fhir\" | \"json\" => {\n // Check if it's a string that looks like HL7\n if (typeof response === \"string\") {\n if (\n response.startsWith(\"MSH|\") ||\n response.includes(\"\\rMSH|\") ||\n response.includes(\"\\nMSH|\") ||\n response.match(/^[A-Z]{3}\\|/)\n ) {\n return \"hl7\";\n }\n }\n\n // Check if it's FHIR format\n if (typeof response === \"object\" && response !== null) {\n if (\n response.resourceType ||\n (response.entry && Array.isArray(response.entry)) ||\n (response.resource && response.resource.resourceType)\n ) {\n return \"fhir\";\n }\n }\n\n return \"json\";\n }, []);\n\n // Helper function to unescape HL7 encoded text\n const unescapeHL7 = useCallback((text: string): string => {\n return text\n .replace(/\\\\E\\\\/g, \"\\\\\") // Escape character\n .replace(/\\\\F\\\\/g, \"|\") // Field separator\n .replace(/\\\\C\\\\/g, \"^\") // Component separator\n .replace(/\\\\R\\\\/g, \"~\") // Repetition separator\n .replace(/\\\\S\\\\/g, \"&\") // Escape & encoding\n .replace(/\\\\T\\\\/g, \"\\n\") // Newline\n .replace(/\\\\X0A\\\\/g, \"\\n\") // Hex newline\n .replace(/\\\\X0D\\\\/g, \"\\r\"); // Hex carriage return\n }, []);\n\n // Helper function to escape HL7 text\n const escapeHL7 = useCallback((text: string): string => {\n return text\n .replace(/\\\\/g, \"\\\\E\\\\\") // Escape character\n .replace(/\\|/g, \"\\\\F\\\\\") // Field separator\n .replace(/\\^/g, \"\\\\S\\\\\") // Component separator\n .replace(/~/g, \"\\\\R\\\\\") // Repetition separator\n .replace(/&/g, \"\\\\T\\\\\") // Escape & encoding\n .replace(/\\n/g, \"\\\\X0A\\\\\") // Newline\n .replace(/\\r/g, \"\\\\X0D\\\\\"); // Carriage return\n }, []);\n\n // Parse HL7 message into segments\n const parseHL7 = useCallback((hl7String: string): HL7Segment[] => {\n const segments: HL7Segment[] = [];\n const lines = hl7String.split(/[\\r\\n]+/);\n\n for (const line of lines) {\n if (line.trim()) {\n const fields = line.split(\"|\");\n if (fields.length > 0) {\n segments.push({\n type: fields[0],\n fields: fields.slice(1),\n });\n }\n }\n }\n\n return segments;\n }, []);\n\n // Convert HL7 transcription response to JSON\n const convertHL7TranscriptionToJson = useCallback(\n (hl7Data: string): TranscriptionResponse => {\n try {\n const segments = parseHL7(hl7Data);\n let transcription = \"\";\n let classifiedInfo: any = {};\n let sessionId = \"\";\n let metadata: any = {};\n let speciality: string = \"\";\n\n console.log(\"Parsing HL7 transcription segments:\", segments);\n\n for (const segment of segments) {\n switch (segment.type) {\n case \"MSH\": // Message Header\n if (segment.fields.length >= 10) {\n sessionId = segment.fields[9];\n }\n break;\n\n case \"TXA\": // Document Header\n if (segment.fields.length >= 2) {\n const docSessionId = segment.fields[1];\n if (docSessionId && docSessionId !== sessionId) {\n sessionId = docSessionId;\n }\n }\n break;\n\n case \"OBX\": // Observation/Result\n if (segment.fields.length >= 5) {\n const observationId = segment.fields[2];\n const observationValue = segment.fields[4];\n\n // Handle transcription content\n if (observationId?.includes(\"TRANSCRIPTION^\")) {\n const unescapedTranscription = unescapeHL7(observationValue || \"\");\n transcription += (transcription ? \"\\n\" : \"\") + unescapedTranscription;\n }\n // Handle classification data\n else if (observationId?.includes(\"^\")) {\n const fieldParts = observationId.split(\"^\");\n const fieldKey = fieldParts[1] || fieldParts[0];\n const cleanFieldKey = fieldKey.replace(/Part \\d+$/, \"\").trim();\n\n if (!classifiedInfo[cleanFieldKey]) {\n classifiedInfo[cleanFieldKey] = [];\n }\n\n let processedValue = observationValue || \"\";\n if (observationId.includes(\"ICD10\") && processedValue.includes(\"^\")) {\n processedValue = processedValue.split(\"^\")[0];\n }\n\n processedValue = unescapeHL7(processedValue);\n classifiedInfo[cleanFieldKey].push(processedValue);\n }\n // Handle direct classification JSON (legacy support)\n else if (observationId === \"CLASSIFICATION^Medical Classification\") {\n try {\n const classificationJson = unescapeHL7(observationValue || \"\");\n const parsedClassification = JSON.parse(classificationJson);\n Object.assign(classifiedInfo, parsedClassification);\n } catch (e) {\n console.error(\"Failed to parse classification JSON:\", e);\n }\n }\n }\n break;\n\n case \"NTE\": // Notes and Comments\n if (segment.fields.length >= 3) {\n const noteText = segment.fields[2];\n\n if (noteText?.startsWith(\"PROCESSING_METADATA:\")) {\n const metadataText = noteText.substring(\"PROCESSING_METADATA: \".length);\n const parts = metadataText.split(\", \");\n for (const part of parts) {\n const colonIndex = part.indexOf(\": \");\n if (colonIndex > 0) {\n const key = part.substring(0, colonIndex).trim();\n const value = part.substring(colonIndex + 2).trim();\n\n if (key === \"Model\") {\n metadata.model = value;\n } else if (key === \"Transcription\") {\n metadata.transcriptionMs = parseInt(value.replace(\"ms\", \"\"));\n } else if (key === \"Total\") {\n metadata.totalProcessingMs = parseInt(value.replace(\"ms\", \"\"));\n }\n }\n }\n }\n }\n break;\n }\n }\n\n const finalClassifiedInfo = {\n speciality: speciality,\n classifiedInfo: classifiedInfo,\n generatedAt: new Date().toISOString(),\n };\n\n return {\n transcription: transcription || \"No transcription found in HL7 message\",\n classifiedInfo: finalClassifiedInfo,\n sessionId: sessionId,\n model: metadata.model,\n processingTimes: {\n transcriptionMs: metadata.transcriptionMs,\n finalChunkProcessingMs: metadata.finalChunkProcessingMs,\n totalProcessingMs: metadata.totalProcessingMs,\n },\n metadata: {\n originalFormat: \"hl7\",\n processedAt: new Date().toISOString(),\n },\n };\n } catch (error) {\n console.error(\"HL7 transcription conversion error:\", error);\n throw new Error(\n `Failed to convert HL7 transcription data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n },\n [parseHL7, unescapeHL7]\n );\n\n // Convert HL7 specialities response to JSON\n const convertHL7SpecialitiesToJson = useCallback(\n (hl7Data: string): SpecialitiesResponse => {\n try {\n const segments = parseHL7(hl7Data);\n const specialities: Array<{ value: string; label: string; description: string }> = [];\n\n console.log(\"Parsing HL7 specialities segments:\", segments);\n\n // Track current speciality being built\n let currentSpeciality: { value: string; label: string; description: string } | null = null;\n\n for (const segment of segments) {\n switch (segment.type) {\n case \"OBX\": // Observation/Result\n if (segment.fields.length >= 5) {\n const observationId = segment.fields[2]; // Field 3 (0-indexed as 2)\n const observationValue = segment.fields[4]; // Field 5 (0-indexed as 4)\n\n // Handle speciality entry: SPECIALITY^Medical Speciality\n if (observationId?.includes(\"SPECIALITY^Medical Speciality\")) {\n // If we have a previous speciality without description, add it with label as description\n if (currentSpeciality) {\n if (!currentSpeciality.description) {\n currentSpeciality.description = currentSpeciality.label;\n }\n specialities.push(currentSpeciality);\n }\n\n // Parse the new speciality from format: value^label^source\n if (observationValue) {\n const parts = observationValue.split(\"^\");\n if (parts.length >= 2) {\n currentSpeciality = {\n value: unescapeHL7(parts[0]),\n label: unescapeHL7(parts[1]),\n description: \"\", // Will be filled by next SPEC_DESC segment\n };\n }\n }\n }\n // Handle description entry: SPEC_DESC^Speciality Description\n else if (observationId?.includes(\"SPEC_DESC^Speciality Description\")) {\n if (currentSpeciality && observationValue) {\n currentSpeciality.description = unescapeHL7(observationValue);\n // Add the complete speciality to the array\n specialities.push(currentSpeciality);\n currentSpeciality = null; // Reset for next speciality\n }\n }\n // Handle legacy format (single OBX with JSON data) - keep for backward compatibility\n else if (observationId?.includes(\"SPECIALITIES^\")) {\n try {\n const unescapedValue = unescapeHL7(observationValue || \"\");\n const specialityData = JSON.parse(unescapedValue);\n\n if (Array.isArray(specialityData)) {\n specialities.push(...specialityData);\n } else if (specialityData.value && specialityData.label) {\n specialities.push(specialityData);\n }\n } catch (e) {\n console.error(\"Failed to parse legacy specialities JSON data:\", e);\n }\n }\n }\n break;\n }\n }\n\n // Add any remaining speciality that didn't have a description\n if (currentSpeciality) {\n if (!currentSpeciality.description) {\n currentSpeciality.description = currentSpeciality.label;\n }\n specialities.push(currentSpeciality);\n }\n\n console.log(\"Parsed specialities:\", specialities);\n return { specialities };\n } catch (error) {\n console.error(\"HL7 specialities conversion error:\", error);\n throw new Error(\n `Failed to convert HL7 specialities data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n },\n [parseHL7, unescapeHL7]\n );\n\n // Convert FHIR transcription response to JSON\n const convertFHIRTranscriptionToJson = useCallback((fhirData: any): TranscriptionResponse => {\n try {\n let transcription = \"\";\n let classification: any = {};\n let classifiedInfo: any = null;\n let sessionId = \"\";\n\n // Handle different FHIR structures\n let resources: FHIRResource[] = [];\n\n if (fhirData.resourceType === \"Bundle\" && fhirData.entry) {\n resources = fhirData.entry.map((entry: any) => entry.resource);\n } else if (fhirData.resourceType) {\n resources = [fhirData];\n } else if (fhirData.resource) {\n resources = [fhirData.resource];\n }\n\n for (let i = 0; i < resources.length; i++) {\n const resource = resources[i];\n\n if (!resource || !resource.resourceType) continue;\n\n switch (resource.resourceType) {\n case \"DocumentReference\":\n if (resource.content && resource.content[0]?.attachment?.data) {\n try {\n transcription += atob(resource.content[0].attachment.data);\n } catch {\n transcription += resource.content[0].attachment.url || \"\";\n }\n }\n if (resource.description) {\n transcription += (transcription ? \"\\n\" : \"\") + resource.description;\n }\n break;\n\n case \"DiagnosticReport\":\n // Extract medical classification from conclusion field\n if (resource.conclusion) {\n try {\n // The conclusion contains JSON string with medical classification\n const conclusionData = JSON.parse(resource.conclusion);\n\n // Store the full classified info\n classifiedInfo = conclusionData;\n\n // Also populate classification for backward compatibility\n if (conclusionData.classifiedInfo) {\n classification = conclusionData.classifiedInfo;\n }\n } catch (parseError) {\n console.error(\"❌ Failed to parse DiagnosticReport conclusion:\", parseError);\n console.log(\"Raw conclusion:\", resource.conclusion);\n\n // Fallback: store as string if parsing fails\n if (!classification[\"Clinical Summary\"]) {\n classification[\"Clinical Summary\"] = [];\n }\n classification[\"Clinical Summary\"].push(resource.conclusion);\n }\n }\n break;\n\n case \"Condition\":\n if (resource.code?.text || resource.code?.coding?.[0]?.display) {\n if (!classification[\"Diagnosis\"]) {\n classification[\"Diagnosis\"] = [];\n }\n const diagnosis = resource.code.text || resource.code.coding[0].display;\n classification[\"Diagnosis\"].push(diagnosis);\n }\n break;\n\n case \"Composition\":\n // Extract transcription text from section array\n if (\n resource.section &&\n Array.isArray(resource.section) &&\n resource.section.length > 0\n ) {\n console.log(`📄 Processing ${resource.section.length} sections...`);\n for (const section of resource.section) {\n // Only extract text from \"Transcription\" section, not \"Medical Classification\"\n if (section.title === \"Transcription\" && section.text?.div) {\n const textContent = section.text.div.replace(/<[^>]*>/g, \"\");\n transcription += (transcription ? \"\\n\" : \"\") + textContent;\n console.log(`✅ Extracted transcription text (${textContent.length} chars)`);\n } else if (section.title === \"Medical Classification\") {\n console.log(\n \"ℹ️ Skipping Medical Classification section (handled by DiagnosticReport)\"\n );\n }\n }\n }\n // Fallback to resource.text.div if no sections found\n else if (resource.text?.div) {\n const textContent = resource.text.div.replace(/<[^>]*>/g, \"\");\n transcription += (transcription ? \"\\n\" : \"\") + textContent;\n }\n\n if (resource.identifier) {\n // Handle both single identifier object and array of identifiers\n const identifiers = Array.isArray(resource.identifier)\n ? resource.identifier\n : [resource.identifier];\n\n console.log(`📋 Found ${identifiers.length} identifier(s)`);\n\n for (let j = 0; j < identifiers.length; j++) {\n const identifier = identifiers[j];\n console.log(` [${j}] system: ${identifier.system}, value: ${identifier.value}`);\n\n if (\n identifier.system === \"http://nuxera.ai/session-identifier\" &&\n identifier.value\n ) {\n sessionId = identifier.value;\n break;\n }\n }\n }\n\n // 🔥 PRIORITY 2: Fallback to Composition.id if no session identifier found\n if (!sessionId && resource.id) {\n sessionId = resource.id;\n console.log(\n \"⚠️ [Priority 2] Using Composition.id as fallback session ID:\",\n sessionId\n );\n }\n break;\n\n case \"Task\":\n // Check Task.identifier for session ID (lower priority, for backward compatibility)\n if (!sessionId && resource.identifier && Array.isArray(resource.identifier)) {\n for (const identifier of resource.identifier) {\n if (identifier.system === \"http://nuxera.ai/session-id\" && identifier.value) {\n sessionId = identifier.value;\n console.log(\n \"✅ [Priority 3] Extracted session ID from Task.identifier:\",\n sessionId\n );\n break;\n }\n }\n }\n break;\n }\n }\n\n // 🔥 PRIORITY 4: Check Bundle.identifier only if we still don't have a session ID\n if (!sessionId && fhirData.resourceType === \"Bundle\" && fhirData.identifier?.value) {\n sessionId = fhirData.identifier.value;\n console.log(\"⚠️ [Priority 4] Using Bundle.identifier as last resort:\", sessionId);\n }\n\n // 🔥 PRIORITY 5: Use Bundle.id as absolute last resort\n if (!sessionId && fhirData.resourceType === \"Bundle\" && fhirData.id) {\n sessionId = fhirData.id;\n console.log(\"⚠️ [Priority 5] Using Bundle.id as absolute last resort:\", sessionId);\n }\n\n // Final fallback - generate session ID if still empty\n if (!sessionId) {\n sessionId = `session_${Date.now()}`;\n console.warn(\"⚠️⚠️ No session ID found in FHIR response, generated:\", sessionId);\n }\n\n return {\n transcription: transcription || \"No transcription found in FHIR data\",\n classification,\n classifiedInfo: classifiedInfo,\n sessionId: sessionId,\n metadata: {\n originalFormat: \"fhir\",\n processedAt: new Date().toISOString(),\n },\n };\n } catch (error) {\n console.error(\"❌ FHIR transcription conversion error:\", error);\n throw new Error(\n `Failed to convert FHIR transcription data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n }, []);\n\n // Transcription-specific converter\n const convertTranscriptionResponse = useCallback(\n (response: any, format: \"auto\" | \"hl7\" | \"fhir\" | \"json\" = \"auto\"): TranscriptionResponse => {\n setIsConverting(true);\n setConversionError(null);\n\n try {\n let detectedFormat = format;\n\n if (format === \"auto\") {\n detectedFormat = detectFormat(response);\n }\n\n let result: TranscriptionResponse;\n\n switch (detectedFormat) {\n case \"hl7\":\n result = convertHL7TranscriptionToJson(\n typeof response === \"string\" ? response : JSON.stringify(response)\n );\n break;\n\n case \"fhir\":\n result = convertFHIRTranscriptionToJson(response);\n break;\n\n case \"json\":\n default:\n const transcription = response.transcription || response.text || \"\";\n const sessionId = response.sessionId || `session_${Date.now()}`;\n\n result = {\n transcription: transcription,\n classifiedInfo: response.classifiedInfo,\n sessionId: sessionId,\n model: response.model,\n processingTimes: { ...response.processingTimes },\n metadata: {\n originalFormat: \"json\",\n processedAt: new Date().toISOString(),\n },\n };\n break;\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown conversion error\";\n setConversionError(errorMessage);\n console.error(\"Transcription conversion failed:\", error);\n\n return {\n transcription: \"Conversion failed - see raw response\",\n classification: { \"Conversion Error\": [errorMessage] },\n sessionId: `error_session_${Date.now()}`,\n metadata: {\n originalFormat: \"json\",\n processedAt: new Date().toISOString(),\n },\n };\n } finally {\n setIsConverting(false);\n }\n },\n [detectFormat, convertHL7TranscriptionToJson, convertFHIRTranscriptionToJson]\n );\n\n // Create HL7-formatted transcription request\n const createHL7TranscriptionRequest = useCallback(\n (audioFile: File, requestData: TranscriptionRequest): FormData => {\n const timestamp = new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"\");\n const messageControlId = `${Date.now()}${Math.random().toString(36).substr(2, 9)}`;\n\n // Build HL7 message\n const hl7Lines: string[] = [];\n\n // MSH - Message Header\n hl7Lines.push(\n `MSH|^~\\\\&|Nuxera-Client|CLIENT_FACILITY|Nuxera-Transcribe|Nuxera|${timestamp}||ORU^R01^ORU_R01|${messageControlId}|P|2.5`\n );\n\n // PID - Patient Identification\n const escapedPatientName = escapeHL7(requestData.patientName || \"Unknown Patient\");\n hl7Lines.push(\n `PID|1||${requestData.patientId || \"\"}||${escapedPatientName}^||${timestamp}|U||||||||||${\n requestData.userId || \"\"\n }|||||||||||||||`\n );\n\n // OBR - Observation Request\n hl7Lines.push(\n `OBR|1|${messageControlId}||TRANSCRIPTION^Audio Transcription Request|||${timestamp}||||||||${timestamp}|||F`\n );\n\n let obxSequence = 1;\n\n // OBX segments for request parameters\n if (requestData.sessionId) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|SESSION_ID^Session Identifier||${escapeHL7(\n requestData.sessionId\n )}|||||F|||${timestamp}`\n );\n }\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|MODEL^Transcription Model||${escapeHL7(\n requestData.model\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|DOCTOR_NAME^Doctor Name||${escapeHL7(\n requestData.doctorName\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|SPECIALITY^Medical Speciality||${escapeHL7(\n requestData.speciality\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|SEQUENCE^Sequence Number||${\n requestData.sequence\n }|||||F|||${timestamp}`\n );\n\n // Boolean parameters\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|REMOVE_SILENCE^Remove Silence||${\n requestData.removeSilence ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|SKIP_DIARIZATION^Skip Diarization||${\n requestData.skipDiarization ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|IS_FINAL^Final Chunk||${\n requestData.isFinalChunk ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|IS_PAUSED^Paused Chunk||${\n requestData.isPaused ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n\n if (requestData.retry) {\n hl7Lines.push(`OBX|${obxSequence++}|CWE|RETRY^Retry Request||Y^Yes|||||F|||${timestamp}`);\n }\n\n // Audio file metadata\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|AUDIO_FILENAME^Audio File Name||${escapeHL7(\n audioFile.name\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|AUDIO_SIZE^Audio File Size||${audioFile.size}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|AUDIO_TYPE^Audio File Type||${escapeHL7(\n audioFile.type\n )}|||||F|||${timestamp}`\n );\n\n // Join all lines with \\r\\n for proper HL7 format\n const hl7Message = hl7Lines.join(\"\\r\\n\") + \"\\r\\n\";\n\n console.log(\"Constructed HL7 Transcription Request:\\n\", hl7Message);\n\n // Create FormData with HL7 message and audio file\n const formData = new FormData();\n\n // Add the HL7 message as the request body\n const hl7Blob = new Blob([hl7Message], { type: \"text/plain\" });\n formData.append(\"hl7_request\", hl7Blob, \"transcription_request.hl7\");\n\n // Add the audio file\n formData.append(\"audio\", audioFile);\n\n return formData;\n },\n [escapeHL7]\n );\n\n // Create FHIR-formatted transcription request\n const createFHIRTranscriptionRequest = useCallback(\n (audioFile: File, requestData: TranscriptionRequest): FormData => {\n const timestamp = new Date().toISOString();\n const requestId = `transcription-request-${Date.now()}`;\n\n // Build FHIR Bundle\n const fhirBundle = {\n resourceType: \"Bundle\",\n id: requestId,\n timestamp: timestamp,\n type: \"message\",\n entry: [\n // MessageHeader\n {\n fullUrl: `urn:uuid:${requestId}-header`,\n resource: {\n resourceType: \"MessageHeader\",\n id: `${requestId}-header`,\n timestamp: timestamp,\n eventCoding: {\n system: \"http://nuxera.ai/events\",\n code: \"transcription-request\",\n display: \"Audio Transcription Request\",\n },\n source: {\n name: \"Nuxera Client\",\n endpoint: \"http://nuxera.ai/client\",\n },\n destination: [\n {\n name: \"Nuxera Transcription Service\",\n endpoint: \"http://nuxera.ai/transcription\",\n },\n ],\n focus: [\n {\n reference: `urn:uuid:${requestId}-task`,\n },\n ],\n },\n },\n\n // Patient\n {\n fullUrl: `urn:uuid:${requestId}-patient`,\n resource: {\n resourceType: \"Patient\",\n id: `${requestId}-patient`,\n identifier: requestData.patientId\n ? [\n {\n system: \"http://nuxera.ai/patient-id\",\n value: requestData.patientId.toString(),\n },\n ]\n : [],\n name: [\n {\n family: requestData.patientName || \"Unknown\",\n given: [\"Patient\"],\n },\n ],\n },\n },\n\n // Practitioner (Doctor)\n {\n fullUrl: `urn:uuid:${requestId}-practitioner`,\n resource: {\n resourceType: \"Practitioner\",\n id: `${requestId}-practitioner`,\n name: [\n {\n family: requestData.doctorName,\n given: [\"Dr.\"],\n },\n ],\n qualification: [\n {\n code: {\n coding: [\n {\n system: \"http://nuxera.ai/specialities\",\n code: requestData.speciality,\n display: requestData.speciality.replace(/_/g, \" \"),\n },\n ],\n },\n },\n ],\n },\n },\n\n // Task (Transcription Request)\n {\n fullUrl: `urn:uuid:${requestId}-task`,\n resource: {\n resourceType: \"Task\",\n id: `${requestId}-task`,\n status: \"requested\",\n intent: \"order\",\n code: {\n coding: [\n {\n system: \"http://nuxera.ai/task-codes\",\n code: \"audio-transcription\",\n display: \"Audio Transcription\",\n },\n ],\n },\n for: {\n reference: `urn:uuid:${requestId}-patient`,\n },\n requester: {\n reference: `urn:uuid:${requestId}-practitioner`,\n },\n authoredOn: timestamp,\n input: [\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"transcription-model\",\n },\n ],\n },\n valueString: requestData.model,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"sequence-number\",\n },\n ],\n },\n valueInteger: requestData.sequence,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"remove-silence\",\n },\n ],\n },\n valueBoolean: requestData.removeSilence,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"skip-diarization\",\n },\n ],\n },\n valueBoolean: requestData.skipDiarization,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"is-final-chunk\",\n },\n ],\n },\n valueBoolean: requestData.isFinalChunk,\n },\n {\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"is-paused\",\n },\n ],\n },\n valueBoolean: requestData.isPaused,\n },\n ],\n },\n },\n\n // DocumentReference (Audio File)\n {\n fullUrl: `urn:uuid:${requestId}-audio`,\n resource: {\n resourceType: \"DocumentReference\",\n id: `${requestId}-audio`,\n status: \"current\",\n type: {\n coding: [\n {\n system: \"http://loinc.org\",\n code: \"11502-2\",\n display: \"Audio recording\",\n },\n ],\n },\n subject: {\n reference: `urn:uuid:${requestId}-patient`,\n },\n date: timestamp,\n content: [\n {\n attachment: {\n contentType: audioFile.type,\n size: audioFile.size,\n title: audioFile.name,\n creation: timestamp,\n },\n },\n ],\n },\n },\n ],\n };\n\n if (requestData.sessionId) {\n // Add session identifier\n fhirBundle.entry[3].resource.identifier = [\n {\n system: \"http://nuxera.ai/session-id\",\n value: requestData.sessionId,\n },\n ];\n }\n\n if (requestData.retry) {\n // Add retry indicator\n const taskEntry = fhirBundle.entry[3];\n if (taskEntry?.resource?.input) {\n taskEntry.resource.input.push({\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/input-types\",\n code: \"retry-request\",\n },\n ],\n },\n valueBoolean: true,\n });\n }\n }\n\n console.log(\n \"Constructed FHIR Transcription Request Bundle:\",\n JSON.stringify(fhirBundle, null, 2)\n );\n\n // Create FormData with FHIR bundle and audio file\n const formData = new FormData();\n\n // Add the FHIR bundle as JSON\n const fhirBlob = new Blob([JSON.stringify(fhirBundle, null, 2)], {\n type: \"application/fhir+json\",\n });\n formData.append(\"fhir_request\", fhirBlob, \"transcription_request.json\");\n\n // Add the audio file\n formData.append(\"audio\", audioFile);\n\n // Add session ID as separate field if it exists (for server compatibility)\n // This ensures the server receives numeric session IDs in the expected location\n if (requestData.sessionId) {\n formData.append(\"sessionId\", requestData.sessionId);\n }\n\n // Add other critical fields to FormData for easier server-side parsing\n formData.append(\"sequence\", requestData.sequence.toString());\n formData.append(\"isFinalChunk\", requestData.isFinalChunk.toString());\n\n console.log(\n \"Created FHIR FormData with session ID:\",\n requestData.sessionId || \"none (first call)\"\n );\n\n return formData;\n },\n []\n );\n\n const clearError = useCallback(() => {\n setConversionError(null);\n }, []);\n\n // Add the dictation request creators (keep as FormData since they include audio files)\n const createHL7DictationRequest = useCallback(\n (audioFile: File, requestData: DictationRequest): FormData => {\n const timestamp = new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"\");\n const messageControlId = `DICTATE_${Date.now()}${Math.random().toString(36).substr(2, 9)}`;\n\n // Build HL7 message for dictation request\n const hl7Lines: string[] = [];\n\n // MSH - Message Header\n hl7Lines.push(\n `MSH|^~\\\\&|Nuxera-Client|CLIENT_FACILITY|Nuxera-Dictation|Nuxera|${timestamp}||MDM^T02^MDM_T02|${messageControlId}|P|2.5`\n );\n\n // EVN - Event Type\n hl7Lines.push(`EVN|T02|${timestamp}|||SYS^SYSTEM^NUXERA`);\n\n // PID - Patient Identification (if available)\n const patientId = requestData.patientId || \"unknown\";\n hl7Lines.push(\n `PID|1||${patientId}||PATIENT^||${timestamp}|U|||unknown||||||||${patientId}|||||||||||||||`\n );\n\n // TXA - Transcription Document Administration\n hl7Lines.push(\n `TXA|1|CN|TX|||${timestamp}|||${escapeHL7(\n requestData.doctorName || \"unknown\"\n )}||||||||IP||AV|||${timestamp}`\n );\n\n let obxSequence = 1;\n\n // OBX segments for dictation request data\n if (requestData.doctorName) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|DOCTOR_NAME^Doctor Name||${escapeHL7(\n requestData.doctorName\n )}|||||F|||${timestamp}`\n );\n }\n\n if (requestData.sessionId) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|SESSION_ID^Session ID||${escapeHL7(\n requestData.sessionId\n )}|||||F|||${timestamp}`\n );\n }\n\n if (requestData.language) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|LANGUAGE^Language||${escapeHL7(\n requestData.language\n )}|||||F|||${timestamp}`\n );\n }\n\n if (requestData.specialty) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|SPECIALTY^Specialty||${escapeHL7(\n requestData.specialty\n )}|||||F|||${timestamp}`\n );\n }\n\n // Audio file information\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|AUDIO_FILENAME^Audio Filename||${escapeHL7(\n audioFile.name\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|AUDIO_SIZE^Audio Size||${audioFile.size}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|AUDIO_TYPE^Audio Type||${escapeHL7(\n audioFile.type\n )}|||||F|||${timestamp}`\n );\n\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|REQUEST_TYPE^Request Type||DICTATION|||||F|||${timestamp}`\n );\n\n // Join all lines with \\r\\n for proper HL7 format\n const hl7Message = hl7Lines.join(\"\\r\\n\") + \"\\r\\n\";\n\n console.log(\"=== HL7 Dictation Request Debug ===\");\n console.log(\"Request Data:\", requestData);\n console.log(\"Audio File:\", {\n name: audioFile.name,\n size: audioFile.size,\n type: audioFile.type,\n });\n console.log(\"HL7 Message:\");\n console.log(hl7Message);\n console.log(\"=== End Debug ===\");\n\n // Create FormData with HL7 message and audio file\n const formData = new FormData();\n\n // Add the audio file\n formData.append(\"audio\", audioFile);\n\n // Add the HL7 request metadata\n const hl7Blob = new Blob([hl7Message], { type: \"text/plain; charset=utf-8\" });\n formData.append(\"hl7_request\", hl7Blob, `dictation_request.hl7`);\n\n return formData;\n },\n [escapeHL7]\n );\n\n const createFHIRDictationRequest = useCallback(\n (audioFile: File, requestData: DictationRequest): FormData => {\n const timestamp = new Date().toISOString();\n const requestId = `dictation-request-${Date.now()}`;\n\n // Build FHIR Bundle for dictation\n const fhirBundle = {\n resourceType: \"Bundle\",\n id: requestId,\n timestamp: timestamp,\n type: \"message\",\n entry: [\n // MessageHeader\n {\n fullUrl: `urn:uuid:${requestId}-header`,\n resource: {\n resourceType: \"MessageHeader\",\n id: `${requestId}-header`,\n timestamp: timestamp,\n eventCoding: {\n system: \"http://nuxera.ai/events\",\n code: \"dictation-request\",\n display: \"Audio Dictation Request\",\n },\n source: {\n name: \"Nuxera Client\",\n endpoint: \"http://nuxera.ai/client\",\n },\n destination: [\n {\n name: \"Nuxera Dictation Service\",\n endpoint: \"http://nuxera.ai/dictation\",\n },\n ],\n focus: [\n {\n reference: `urn:uuid:${requestId}-media`,\n },\n ],\n },\n },\n\n // Patient (if available)\n {\n fullUrl: `urn:uuid:${requestId}-patient`,\n resource: {\n resourceType: \"Patient\",\n id: `${requestId}-patient`,\n identifier: [\n {\n system: \"http://nuxera.ai/patient-id\",\n value: requestData.patientId || \"unknown\",\n },\n ],\n name: [\n {\n family: \"Patient\",\n given: [\"Unknown\"],\n },\n ],\n },\n },\n\n // Practitioner (Doctor)\n {\n fullUrl: `urn:uuid:${requestId}-practitioner`,\n resource: {\n resourceType: \"Practitioner\",\n id: `${requestId}-practitioner`,\n name: [\n {\n family: requestData.doctorName || \"Unknown\",\n given: [\"Dr.\"],\n },\n ],\n qualification: requestData.specialty\n ? [\n {\n code: {\n coding: [\n {\n system: \"http://snomed.info/sct\",\n code: \"specialty\",\n display: requestData.specialty,\n },\n ],\n },\n },\n ]\n : undefined,\n },\n },\n\n // Media (Audio file reference)\n {\n fullUrl: `urn:uuid:${requestId}-media`,\n resource: {\n resourceType: \"Media\",\n id: `${requestId}-media`,\n status: \"completed\",\n type: {\n coding: [\n {\n system: \"http://terminology.hl7.org/CodeSystem/media-type\",\n code: \"audio\",\n display: \"Audio\",\n },\n ],\n },\n subject: {\n reference: `urn:uuid:${requestId}-patient`,\n },\n operator: {\n reference: `urn:uuid:${requestId}-practitioner`,\n },\n createdDateTime: timestamp,\n content: {\n contentType: audioFile.type || \"audio/wav\",\n size: audioFile.size,\n title: audioFile.name,\n creation: timestamp,\n },\n extension: [\n {\n url: \"http://nuxera.ai/extensions/dictation-request\",\n extension: [\n {\n url: \"doctorName\",\n valueString: requestData.doctorName || \"\",\n },\n {\n url: \"sessionId\",\n valueString: requestData.sessionId || \"\",\n },\n {\n url: \"language\",\n valueString: requestData.language || \"\",\n },\n {\n url: \"specialty\",\n valueString: requestData.specialty || \"\",\n },\n {\n url: \"requestType\",\n valueString: \"DICTATION\",\n },\n ],\n },\n ],\n },\n },\n ],\n };\n\n console.log(\"=== FHIR Dictation Request Debug ===\");\n console.log(\"Request Data:\", requestData);\n console.log(\"Audio File:\", {\n name: audioFile.name,\n size: audioFile.size,\n type: audioFile.type,\n });\n console.log(\"FHIR Bundle:\", JSON.stringify(fhirBundle, null, 2));\n console.log(\"=== End Debug ===\");\n\n // Create FormData with FHIR bundle and audio file\n const formData = new FormData();\n\n // Add the audio file\n formData.append(\"audio\", audioFile);\n\n // Add the FHIR request metadata\n const fhirBlob = new Blob([JSON.stringify(fhirBundle, null, 2)], {\n type: \"application/fhir+json\",\n });\n formData.append(\"fhir_request\", fhirBlob, `dictation_request.json`);\n\n return formData;\n },\n []\n );\n\n // Update the convertHL7DictationToJson function\n const convertHL7DictationToJson = useCallback(\n (hl7Data: string): DictationResponse => {\n try {\n const segments = parseHL7(hl7Data);\n let dictationResponse: Partial<DictationResponse> = {};\n\n console.log(\"Parsing HL7 dictation segments:\", segments);\n\n for (const segment of segments) {\n switch (segment.type) {\n case \"MSH\": // Message Header\n // Extract message control ID as session ID\n if (segment.fields.length >= 10) {\n dictationResponse.sessionId = segment.fields[9];\n }\n break;\n\n case \"PID\": // Patient/User Identification\n // Extract user info if needed\n break;\n\n case \"OBR\": // Observation Request\n // Extract request info if needed\n if (segment.fields.length >= 3) {\n // Field 2 contains the request ID which can be used as session ID\n const requestId = segment.fields[1];\n if (requestId && !dictationResponse.sessionId) {\n dictationResponse.sessionId = requestId;\n }\n }\n break;\n\n case \"OBX\": // Observation/Result - contains dictation data\n if (segment.fields.length >= 5) {\n const observationId = segment.fields[2]; // Field 3 (0-indexed as 2)\n const observationValue = segment.fields[4]; // Field 5 (0-indexed as 4)\n\n if (!observationId || !observationValue) continue;\n\n // Parse each dictation field - Updated to match actual response format\n if (\n observationId.includes(\"DICTATION_TEXT^\") ||\n observationId.includes(\"DICTATION^Dictation Text\")\n ) {\n dictationResponse.dictation = unescapeHL7(observationValue);\n } else if (observationId.includes(\"SESSION_ID^Session ID\")) {\n dictationResponse.sessionId = unescapeHL7(observationValue);\n } else if (observationId.includes(\"CONFIDENCE^Confidence\")) {\n dictationResponse.confidence = parseFloat(unescapeHL7(observationValue)) || 0;\n } else if (observationId.includes(\"LANGUAGE^Language\")) {\n dictationResponse.language = unescapeHL7(observationValue);\n } else if (observationId.includes(\"TRANSCRIPTION_MS^Transcription Time\")) {\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.transcriptionMs =\n parseInt(unescapeHL7(observationValue)) || 0;\n } else if (observationId.includes(\"TOTAL_PROCESSING_MS^Total Processing Time\")) {\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.totalProcessingMs =\n parseInt(unescapeHL7(observationValue)) || 0;\n } else if (observationId.includes(\"AUDIO_SIZE^Audio File Size\")) {\n // Store audio size in a custom field if needed\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n // Extract numeric value from \"1.05 MB\" format\n const sizeMatch = observationValue.match(/(\\d+(?:\\.\\d+)?)/);\n if (sizeMatch) {\n dictationResponse.processingTimes.audioSizeMB = parseFloat(sizeMatch[1]);\n }\n }\n }\n break;\n\n case \"NTE\": // Notes and Comments - contains processing metadata\n if (segment.fields.length >= 3) {\n const noteText = segment.fields[2];\n\n if (noteText?.includes(\"REQUEST_TIMESTAMP:\")) {\n const timestampMatch = noteText.match(/REQUEST_TIMESTAMP:\\s*(\\d+)/);\n if (timestampMatch) {\n const requestTimestamp = parseInt(timestampMatch[1]);\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.requestTimestamp = requestTimestamp;\n }\n } else if (noteText?.includes(\"PROCESSED_AT:\")) {\n const processedMatch = noteText.match(/PROCESSED_AT:\\s*(.+)/);\n if (processedMatch) {\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.processedAt = processedMatch[1].trim();\n }\n } else if (noteText?.includes(\"DICTATION_TYPE:\")) {\n const typeMatch = noteText.match(/DICTATION_TYPE:\\s*(.+)/);\n if (typeMatch) {\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.dictationType = typeMatch[1].trim();\n }\n }\n }\n break;\n }\n }\n\n // Calculate processing times if we have request timestamp and processed at\n if (\n dictationResponse.processingTimes?.requestTimestamp &&\n dictationResponse.processingTimes?.processedAt\n ) {\n try {\n const processedAtMs = new Date(dictationResponse.processingTimes.processedAt).getTime();\n const requestMs = dictationResponse.processingTimes.requestTimestamp;\n if (processedAtMs && requestMs) {\n dictationResponse.processingTimes.totalProcessingMs = Math.round(\n processedAtMs - requestMs\n );\n }\n } catch (e) {\n console.warn(\"Could not calculate processing time:\", e);\n }\n }\n\n // Ensure required fields have default values\n const finalResponse: DictationResponse = {\n dictation: dictationResponse.dictation || \"\",\n sessionId: dictationResponse.sessionId || null,\n confidence: dictationResponse.confidence,\n language: dictationResponse.language,\n processingTimes: dictationResponse.processingTimes,\n };\n\n console.log(\"Converted HL7 dictation response:\", finalResponse);\n return finalResponse;\n } catch (error) {\n console.error(\"HL7 dictation conversion error:\", error);\n throw new Error(\n `Failed to convert HL7 dictation data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n },\n [parseHL7, unescapeHL7]\n );\n\n // Convert FHIR dictation response to JSON\n const convertFHIRDictationToJson = useCallback((fhirData: any): DictationResponse => {\n try {\n let dictationResponse: Partial<DictationResponse> = {};\n\n // 🔥 PARSE JSON STRING IF NEEDED\n let parsedData = fhirData;\n if (typeof fhirData === \"string\") {\n console.log(\"📝 Response is a string, parsing JSON...\");\n try {\n parsedData = JSON.parse(fhirData);\n console.log(\"✅ JSON parsed successfully\");\n } catch (e) {\n console.error(\"❌ Failed to parse JSON string:\", e);\n throw new Error(\"Invalid JSON response from server\");\n }\n }\n\n console.log(\"Parsing FHIR dictation data:\", parsedData);\n\n // Handle different FHIR structures\n let resources: FHIRResource[] = [];\n\n if (parsedData.resourceType === \"Bundle\" && parsedData.entry) {\n resources = parsedData.entry.map((entry: any) => entry.resource);\n console.log(`📦 Found ${resources.length} resources in Bundle`);\n } else if (parsedData.resourceType) {\n resources = [parsedData];\n } else if (parsedData.resource) {\n resources = [parsedData.resource];\n }\n\n for (let i = 0; i < resources.length; i++) {\n const resource = resources[i];\n console.log(`\\n--- Processing resource [${i}]: ${resource?.resourceType || \"unknown\"} ---`);\n\n if (!resource || !resource.resourceType) continue;\n\n switch (resource.resourceType) {\n case \"MessageHeader\":\n // Extract session ID from message header\n dictationResponse.sessionId = resource.id;\n console.log(\"✅ Session ID from MessageHeader:\", resource.id);\n break;\n\n case \"Media\":\n console.log(\"🎯 Found Media resource for dictation\");\n\n // Extract dictation text and metadata from extension\n if (resource.extension && Array.isArray(resource.extension)) {\n console.log(`📋 Processing ${resource.extension.length} extensions`);\n\n for (const ext of resource.extension) {\n console.log(\n ` Extension URL: ${ext.url}, valueString: ${ext.valueString || ext.valueInteger}`\n );\n\n switch (ext.url) {\n case \"http://nuxera.ai/extensions/transcription\":\n dictationResponse.dictation = ext.valueString || \"\";\n console.log(\"✅✅ Extracted dictation text:\", dictationResponse.dictation);\n break;\n\n case \"http://nuxera.ai/extensions/audio-size\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n // Extract numeric value from \"0.61 MB\" format\n const sizeMatch = ext.valueString?.match(/(\\d+(?:\\.\\d+)?)/);\n if (sizeMatch) {\n dictationResponse.processingTimes.audioSizeMB = parseFloat(sizeMatch[1]);\n }\n console.log(\n \"✅ Extracted audio size:\",\n dictationResponse.processingTimes.audioSizeMB\n );\n break;\n\n case \"http://nuxera.ai/extensions/processing-timestamp\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.requestTimestamp = ext.valueInteger;\n console.log(\"✅ Extracted processing timestamp:\", ext.valueInteger);\n break;\n\n case \"http://nuxera.ai/extensions/confidence\":\n dictationResponse.confidence = ext.valueDecimal || ext.valueInteger;\n break;\n\n case \"http://nuxera.ai/extensions/language\":\n dictationResponse.language = ext.valueString;\n break;\n\n case \"http://nuxera.ai/extensions/transcription-time\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.transcriptionMs = ext.valueInteger;\n break;\n\n case \"http://nuxera.ai/extensions/total-processing-time\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.totalProcessingMs = ext.valueInteger;\n break;\n }\n }\n }\n\n // Extract session ID from Media identifier if available\n if (!dictationResponse.sessionId && resource.identifier && resource.identifier[0]) {\n dictationResponse.sessionId = resource.identifier[0].value;\n console.log(\"✅ Session ID from Media.identifier:\", dictationResponse.sessionId);\n }\n\n // Use Media ID as session ID if still not found\n if (!dictationResponse.sessionId && resource.id) {\n dictationResponse.sessionId = resource.id;\n console.log(\"✅ Session ID from Media.id:\", dictationResponse.sessionId);\n }\n\n // Extract createdDateTime as processedAt if available\n if (resource.createdDateTime && dictationResponse.processingTimes) {\n dictationResponse.processingTimes.processedAt = resource.createdDateTime;\n }\n break;\n\n case \"DocumentReference\":\n // Legacy format - Extract dictation text and metadata\n if (resource.content && resource.content[0] && resource.content[0].attachment) {\n const attachment = resource.content[0].attachment;\n if (attachment.data) {\n // Base64 encoded text\n try {\n dictationResponse.dictation = atob(attachment.data);\n } catch (e) {\n dictationResponse.dictation = attachment.data;\n }\n }\n }\n\n // Extract metadata from extension (legacy)\n if (resource.extension) {\n for (const ext of resource.extension) {\n if (ext.url === \"http://nuxera.ai/extensions/dictation-response\") {\n for (const subExt of ext.extension || []) {\n switch (subExt.url) {\n case \"confidence\":\n dictationResponse.confidence = subExt.valueDecimal || subExt.valueInteger;\n break;\n case \"language\":\n dictationResponse.language = subExt.valueString;\n break;\n case \"transcriptionMs\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.transcriptionMs = subExt.valueInteger;\n break;\n case \"totalProcessingMs\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.totalProcessingMs = subExt.valueInteger;\n break;\n }\n }\n }\n }\n }\n break;\n\n case \"Observation\":\n // Legacy format - Extract dictation data from observation components\n if (resource.component && Array.isArray(resource.component)) {\n for (const component of resource.component) {\n const code = component.code?.coding?.[0]?.code;\n\n switch (code) {\n case \"dictation-text\":\n dictationResponse.dictation = component.valueString || \"\";\n break;\n case \"confidence\":\n dictationResponse.confidence = component.valueDecimal || component.valueInteger;\n break;\n case \"language\":\n dictationResponse.language = component.valueString;\n break;\n case \"transcription-time\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.transcriptionMs = component.valueInteger;\n break;\n case \"total-processing-time\":\n if (!dictationResponse.processingTimes) {\n dictationResponse.processingTimes = {};\n }\n dictationResponse.processingTimes.totalProcessingMs = component.valueInteger;\n break;\n }\n }\n }\n\n // Extract session ID from identifier (legacy)\n if (!dictationResponse.sessionId && resource.identifier && resource.identifier[0]) {\n dictationResponse.sessionId = resource.identifier[0].value;\n }\n break;\n }\n }\n\n // Calculate processing times if we have request timestamp and processed at\n if (\n dictationResponse.processingTimes?.requestTimestamp &&\n dictationResponse.processingTimes?.processedAt\n ) {\n try {\n const processedAtMs = new Date(dictationResponse.processingTimes.processedAt).getTime();\n const requestMs = dictationResponse.processingTimes.requestTimestamp;\n if (processedAtMs && requestMs) {\n dictationResponse.processingTimes.totalProcessingMs = Math.round(\n processedAtMs - requestMs\n );\n console.log(\n \"✅ Calculated total processing time:\",\n dictationResponse.processingTimes.totalProcessingMs,\n \"ms\"\n );\n }\n } catch (e) {\n console.warn(\"Could not calculate processing time:\", e);\n }\n }\n\n // Ensure required fields have default values\n const finalResponse: DictationResponse = {\n dictation: dictationResponse.dictation || \"\",\n sessionId: dictationResponse.sessionId || null,\n confidence: dictationResponse.confidence,\n language: dictationResponse.language,\n processingTimes: dictationResponse.processingTimes,\n };\n\n console.log(\"✅✅ Converted FHIR dictation response:\", finalResponse);\n return finalResponse;\n } catch (error) {\n console.error(\"❌ FHIR dictation conversion error:\", error);\n throw new Error(\n `Failed to convert FHIR dictation data: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`\n );\n }\n }, []);\n\n // Dictation-specific converter\n const convertDictationResponse = useCallback(\n (response: any, format: \"auto\" | \"hl7\" | \"fhir\" | \"json\" = \"auto\"): DictationResponse => {\n setIsConverting(true);\n setConversionError(null);\n\n try {\n let detectedFormat = format;\n\n if (format === \"auto\") {\n detectedFormat = detectFormat(response);\n }\n\n let result: DictationResponse;\n\n switch (detectedFormat) {\n case \"hl7\":\n result = convertHL7DictationToJson(\n typeof response === \"string\" ? response : JSON.stringify(response)\n );\n break;\n\n case \"fhir\":\n result = convertFHIRDictationToJson(response);\n break;\n\n case \"json\":\n default:\n // Handle direct JSON response\n result = response as DictationResponse;\n break;\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown conversion error\";\n setConversionError(errorMessage);\n console.error(\"Dictation conversion failed:\", error);\n\n // Return a default dictation object with error indication\n return {\n dictation: \"\",\n sessionId: null,\n confidence: undefined,\n language: undefined,\n processingTimes: undefined,\n };\n } finally {\n setIsConverting(false);\n }\n },\n [detectFormat, convertHL7DictationToJson, convertFHIRDictationToJson]\n );\n\n // Update HL7 API Key request creator to remove expiry_at\n const createHL7ApiKeyRequest = useCallback(\n (\n apiKeyData: ApiKeyRequest,\n operation:\n | \"create\"\n | \"update\"\n | \"setDefault\"\n | \"removeDefault\"\n | \"pause\"\n | \"resume\"\n | \"delete\" = \"create\"\n ): string => {\n const timestamp = new Date().toISOString().replace(/[-:]/g, \"\").replace(/\\..+/, \"\");\n const messageControlId = `APIKEY_${Date.now()}${Math.random().toString(36).substr(2, 9)}`;\n\n const hl7Lines: string[] = [];\n\n // MSH - Message Header\n hl7Lines.push(\n `MSH|^~\\\\&|Nuxera-Client|CLIENT_FACILITY|Nuxera-ApiKeys|Nuxera|${timestamp}||ADT^A08^ADT_A08|${messageControlId}|P|2.5`\n );\n\n // EVN - Event Type\n const eventCode = getEventCodeForOperation(operation);\n hl7Lines.push(`EVN|${eventCode}|${timestamp}|||SYS^SYSTEM^NUXERA`);\n\n // PID - User Identification\n hl7Lines.push(\n `PID|1||${\n apiKeyData.user_id || \"unknown\"\n }||API_KEY_USER^||${timestamp}|U|||unknown||||||||${\n apiKeyData.user_id || \"\"\n }|||||||||||||||`\n );\n\n let obxSequence = 1;\n\n // OBX segments for API key data (remove expiry_at related fields)\n if (\n apiKeyData.id &&\n (operation === \"update\" ||\n operation === \"setDefault\" ||\n operation === \"removeDefault\" ||\n operation === \"pause\" ||\n operation === \"resume\" ||\n operation === \"delete\")\n ) {\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|API_KEY_ID^API Key ID||${apiKeyData.id}|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.old_id && operation === \"setDefault\") {\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|OLD_API_KEY_ID^Old API Key ID||${\n apiKeyData.old_id\n }|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.name && (operation === \"create\" || operation === \"update\")) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|API_KEY_NAME^API Key Name||${escapeHL7(\n apiKeyData.name\n )}|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.type && (operation === \"create\" || operation === \"update\")) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|API_KEY_TYPE^API Key Type||${escapeHL7(\n apiKeyData.type\n )}|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.status && (operation === \"create\" || operation === \"update\")) {\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|API_KEY_STATUS^API Key Status||${escapeHL7(\n apiKeyData.status\n )}|||||F|||${timestamp}`\n );\n }\n\n if (apiKeyData.user_id && (operation === \"create\" || operation === \"update\")) {\n hl7Lines.push(\n `OBX|${obxSequence++}|NM|USER_ID^User ID||${apiKeyData.user_id}|||||F|||${timestamp}`\n );\n }\n\n if (\n apiKeyData.is_default !== undefined &&\n (operation === \"create\" || operation === \"update\")\n ) {\n hl7Lines.push(\n `OBX|${obxSequence++}|CWE|IS_DEFAULT^Is Default||${\n apiKeyData.is_default ? \"Y^Yes\" : \"N^No\"\n }|||||F|||${timestamp}`\n );\n }\n\n // Add operation type\n hl7Lines.push(\n `OBX|${obxSequence++}|TX|OPERATION^Operation Type||${escapeHL7(\n operation.toUpperCase()\n )}|||||F|||${timestamp}`\n );\n\n const hl7Message = hl7Lines.join(\"\\r\\n\") + \"\\r\\n\";\n\n console.log(\"=== HL7 API Key Request Debug ===\");\n console.log(\"Operation:\", operation);\n console.log(\"API Key Data:\", apiKeyData);\n console.log(\"HL7 Message:\");\n console.log(hl7Message);\n console.log(\"=== End Debug ===\");\n\n return hl7Message;\n },\n [escapeHL7]\n );\n\n // Helper function to get HL7 event codes for different operations\n const getEventCodeForOperation = (operation: string): string => {\n switch (operation) {\n case \"create\":\n return \"A04\"; // Register\n case \"update\":\n return \"A08\"; // Update\n case \"setDefault\":\n case \"removeDefault\":\n return \"A31\"; // Update person information\n case \"pause\":\n case \"resume\":\n return \"A37\"; // Unlink person information\n case \"delete\":\n return \"A23\"; // Delete person information\n default:\n return \"A08\"; // Default to update\n }\n };\n\n const createFHIRApiKeyRequest = useCallback(\n (\n apiKeyData: ApiKeyRequest,\n operation:\n | \"create\"\n | \"update\"\n | \"setDefault\"\n | \"removeDefault\"\n | \"pause\"\n | \"resume\"\n | \"delete\" = \"create\"\n ): string => {\n const timestamp = new Date().toISOString();\n const requestId = `api-key-${operation}-${Date.now()}`;\n\n // Build FHIR Bundle for API key\n const fhirBundle = {\n resourceType: \"Bundle\",\n id: requestId,\n timestamp: timestamp,\n type: \"transaction\",\n entry: [\n // MessageHeader\n {\n fullUrl: `urn:uuid:${requestId}-header`,\n resource: {\n resourceType: \"MessageHeader\",\n id: `${requestId}-header`,\n timestamp: timestamp,\n eventCoding: {\n system: \"http://nuxera.ai/events\",\n code: `api-key-${operation}`,\n display: `API Key ${\n operation.charAt(0).toUpperCase() + operation.slice(1)\n } Request`,\n },\n source: {\n name: \"Nuxera Client\",\n endpoint: \"http://nuxera.ai/client\",\n },\n destination: [\n {\n name: \"Nuxera API Key Service\",\n endpoint: \"http://nuxera.ai/api-keys\",\n },\n ],\n focus: [\n {\n reference: `urn:uuid:${requestId}-device`,\n },\n ],\n },\n },\n\n // Patient (User)\n {\n fullUrl: `urn:uuid:${requestId}-patient`,\n resource: {\n resourceType: \"Patient\",\n id: `${requestId}-patient`,\n identifier: [\n {\n system: \"http://nuxera.ai/user-id\",\n value: apiKeyData.user_id?.toString() || \"unknown\",\n },\n ],\n name: [\n {\n family: \"User\",\n given: [\"API Key Owner\"],\n },\n ],\n },\n request: {\n method: \"PUT\",\n url: `Patient/${requestId}-patient`,\n },\n },\n\n // Device (API Key)\n {\n fullUrl: `urn:uuid:${requestId}-device`,\n resource: {\n resourceType: \"Device\",\n id: `${requestId}-device`,\n status: getDeviceStatusForOperation(operation, apiKeyData.status),\n deviceName: [\n {\n name: apiKeyData.name || \"\",\n type: \"user-friendly-name\",\n },\n ],\n type: {\n coding: [\n {\n system: \"http://nuxera.ai/device-types\",\n code: \"api-key\",\n display: \"API Key\",\n },\n ],\n },\n owner: {\n reference: `urn:uuid:${requestId}-patient`,\n },\n extension: [\n {\n url: \"http://nuxera.ai/extensions/api-key\",\n extension: [\n {\n url: \"keyType\",\n valueString: apiKeyData.type || \"\",\n },\n {\n url: \"isDefault\",\n valueBoolean: apiKeyData.is_default || false,\n },\n {\n url: \"operation\",\n valueString: operation.toUpperCase(),\n },\n ] as Array<{\n url: string;\n valueString?: string;\n valueBoolean?: boolean;\n valueInteger?: number;\n }>,\n },\n ],\n },\n request: {\n method: getHttpMethodForOperation(operation),\n url: getUrlForOperation(operation, apiKeyData.id, requestId),\n },\n },\n ],\n };\n\n // Add API key ID for operations that require it\n if (\n apiKeyData.id &&\n (operation === \"update\" ||\n operation === \"setDefault\" ||\n operation === \"removeDefault\" ||\n operation === \"pause\" ||\n operation === \"resume\" ||\n operation === \"delete\")\n ) {\n fhirBundle.entry[2].resource.identifier = [\n {\n system: \"http://nuxera.ai/api-key-id\",\n value: apiKeyData.id.toString(),\n },\n ];\n }\n\n // Add old API key ID for setDefault operation\n if (apiKeyData.old_id && operation === \"setDefault\") {\n const deviceExtension = fhirBundle.entry[2].resource.extension?.[0];\n if (deviceExtension?.extension) {\n deviceExtension.extension.push({\n url: \"oldApiKeyId\",\n valueInteger: apiKeyData.old_id,\n });\n }\n }\n\n console.log(\"=== FHIR API Key Request Debug ===\");\n console.log(\"Operation:\", operation);\n console.log(\"API Key Data:\", apiKeyData);\n console.log(\"FHIR Bundle:\", JSON.stringify(fhirBundle, null, 2));\n console.log(\"=== End Debug ===\");\n\n return JSON.stringify(fhirBundle);\n },\n []\n );\n\n // Helper functions for FHIR operations\n const getDeviceStatusForOperation = (operation: string, status?: string): string => {\n switch (operation) {\n case \"pause\":\n return \"inactive\";\n case \"resume\":\n return \"active\";\n case \"delete\":\n return \"entered-in-error\";\n default:\n return status || \"active\";\n }\n };\n\n const getHttpMethodForOperation = (operation: string): string => {\n switch (operation) {\n case \"create\":\n return \"POST\";\n case \"update\":\n case \"setDefault\":\n case \"removeDefault\":\n case \"pause\":\n case \"resume\":\n return \"PUT\";\n case \"delete\":\n return \"DELETE\";\n default:\n return \"PUT\";\n }\n };\n\n const getUrlForOperation = (\n operation: string,\n apiKeyId?: number | string,\n requestId?: string\n ): string => {\n switch (operation) {\n case \"create\":\n return \"Device\";\n case \"update\":\n case \"setDefault\":\n case \"removeDefault\":\n case \"pause\":\n case \"resume\":\n case \"delete\":\n return `Device/${apiKeyId || requestId + \"-device\"}`;\n default:\n return \"Device\";\n }\n };\n\n return {\n convertTranscriptionResponse,\n createHL7TranscriptionRequest,\n createFHIRTranscriptionRequest,\n createHL7DictationRequest,\n createFHIRDictationRequest,\n convertDictationResponse,\n convertHL7DictationToJson,\n convertFHIRDictationToJson,\n isConverting,\n conversionError,\n clearError,\n };\n};\n\nexport default useHL7FHIRConverter;\n","import React, { useEffect, useRef, useState, useCallback, MutableRefObject } from \"react\";\nimport useFFmpegConverter from \"./useFFmpegConverter\";\nimport useAudioRecovery from \"./useAudioRecovery\";\nimport pRetry, { AbortError } from \"p-retry\";\nimport useHL7FHIRConverter from \"./useHL7FHIRConverter\";\nimport { ClassificationInfoResponse } from \"../types\";\n\ninterface AudioRecorderHookProps {\n apiKey: string;\n apiBaseUrl?: string;\n speciality: string;\n patientId?: number;\n patientName?: string;\n patientHistory?: string;\n selectedFormat?: \"json\" | \"hl7\" | \"fhir\";\n skipDiarization?: boolean;\n silenceRemoval?: boolean;\n onTranscriptionUpdate: (text: string, sessionId: string) => void;\n onTranscriptionComplete: (\n text: string,\n classification: ClassificationInfoResponse,\n sessionId: string\n ) => void;\n}\n\ninterface UseAudioRecorderReturn {\n mediaStreamRef: MutableRefObject<MediaStream | null>;\n startRecording: () => void;\n stopRecording: () => void;\n pauseRecording: () => void;\n resumeRecording: () => void;\n isRecording: boolean;\n isPaused: boolean;\n isProcessing: boolean;\n error: string | null;\n transcriptionDone: boolean;\n // New microphone properties\n availableDevices: MediaDeviceInfo[];\n currentDeviceId: string | null;\n selectMicrophone: (deviceId: string) => Promise<void>;\n validateMicrophoneAccess: () => Promise<boolean>;\n audioLevel: number;\n noAudioDetected: boolean;\n\n // Recovery-related properties\n showRetrySessionPrompt: boolean;\n isRetryingSession: boolean;\n retryFailedSession: () => Promise<void>;\n clearAllSessions: () => Promise<void>;\n\n // Add FFmpeg status properties\n isConverting: boolean;\n progress: number;\n statusMessage: string;\n\n // Add test function for debugging\n testAudioCapture: () => Promise<void>;\n}\n\n// Internal API configuration - this will be used by the npm package\n// Change this URL to match your actual API endpoint before publishing\nconst API_BASE_URL = \"https://nuxera.cloud\";\n\n// Embedded Audio Processor Worker - no external files needed\nconst createAudioProcessorWorker = () => {\n const workerCode = `\n class AudioProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this._buffer = [];\n this._isStopped = false;\n this._isPaused = false;\n this._uploadChunk = false;\n this._uploadingChunk = false;\n \n this._audioLevelCheckInterval = 0;\n this._audioLevelCheckFrequency = 128;\n this._silentSampleCount = 0;\n this._maxSilentSamples = 44100 * 30;\n this._audioThreshold = 0.002; // Increased from 0.001 to better detect speech\n this._hasDetectedAudio = false;\n this._totalSilentTime = 0;\n this._lastAudioTime = 0;\n this._recordingStartTime = Date.now();\n this._initialSilenceThreshold = 44100 * 10;\n this._isInitialPhase = true;\n this._bufferSize = 0; // Track total samples in buffer\n\n this.port.onmessage = (event) => {\n if (event.data.command === \"stop\") {\n this._isStopped = true;\n // Ensure we have valid audio data before sending\n if (this._buffer.length > 0) {\n // Properly flatten the buffer by concatenating Float32Arrays\n let totalLength = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n totalLength += this._buffer[i].length;\n }\n \n const flat = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n flat.set(this._buffer[i], offset);\n offset += this._buffer[i].length;\n }\n \n this.port.postMessage(\n {\n command: \"finalChunk\",\n audioBuffer: flat.buffer,\n },\n [flat.buffer]\n );\n } else {\n // Send empty final chunk to complete the session\n const emptyBuffer = new Float32Array(1000);\n this.port.postMessage(\n {\n command: \"finalChunk\", \n audioBuffer: emptyBuffer.buffer,\n },\n [emptyBuffer.buffer]\n );\n }\n this._buffer = [];\n }\n\n if (event.data.command === \"uploadChunk\") {\n this._uploadChunk = true;\n }\n\n if (event.data.command === \"resetUploadChunk\") {\n // Only reset the upload flags, NOT the buffer\n // The buffer is cleared after chunk data is extracted and sent\n this._uploadChunk = false;\n this._uploadingChunk = false;\n // NOTE: Do NOT clear buffer here - it's cleared in the chunk upload logic after data is sent\n }\n\n if (event.data.command === \"pause\") {\n this._isPaused = true;\n }\n\n if (event.data.command === \"resume\") {\n this._isPaused = false;\n }\n };\n }\n\n process(inputs, outputs) {\n if (this._isStopped || this._isPaused) {\n return true;\n }\n\n const input = inputs[0];\n if (input && input.length > 0) {\n const samples = input[0];\n \n let audioLevel = 0;\n for (let i = 0; i < samples.length; i++) {\n audioLevel += Math.abs(samples[i]);\n }\n audioLevel /= samples.length;\n\n this._audioLevelCheckInterval++;\n if (this._audioLevelCheckInterval >= this._audioLevelCheckFrequency) {\n this.port.postMessage({\n command: \"audioLevel\",\n level: audioLevel,\n });\n this._audioLevelCheckInterval = 0;\n \n // Debug: Log audio capture status every few seconds\n if (this._audioLevelCheckInterval % 1000 === 0) {\n }\n }\n\n if (audioLevel > this._audioThreshold) {\n this._hasDetectedAudio = true;\n this._isInitialPhase = false;\n this._silentSampleCount = 0;\n this._lastAudioTime = Date.now();\n } else {\n this._silentSampleCount += samples.length;\n \n if (this._isInitialPhase && this._silentSampleCount > this._initialSilenceThreshold) {\n this.port.postMessage({\n command: \"noAudioDetected\",\n message: \"No audio input detected after 10 seconds. Please check your microphone.\"\n });\n return true;\n }\n \n if (this._hasDetectedAudio && this._silentSampleCount > this._maxSilentSamples) {\n this.port.postMessage({\n command: \"noAudioDetected\",\n message: \"No audio detected for 30 seconds. Recording may have issues.\"\n });\n }\n }\n\n this._buffer.push(new Float32Array(samples));\n this._bufferSize += samples.length;\n\n if (this._uploadChunk && !this._uploadingChunk) {\n this._uploadingChunk = true;\n\n // Properly flatten the buffer by concatenating Float32Arrays\n let totalLength = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n totalLength += this._buffer[i].length;\n }\n\n const flat = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n flat.set(this._buffer[i], offset);\n offset += this._buffer[i].length;\n }\n\n // Always send chunks to server - let server handle silence filtering\n if (this._bufferSize > 0) {\n this.port.postMessage(\n {\n command: \"chunk\",\n audioBuffer: flat.buffer,\n bufferDuration: this._bufferSize / 44100\n },\n [flat.buffer]\n );\n console.log('[UPLOAD] Sending chunk: ' + (this._bufferSize / 44100).toFixed(1) + 's');\n // Clear buffer after upload\n this._buffer = [];\n this._bufferSize = 0;\n }\n\n this._uploadChunk = false;\n this._uploadingChunk = false;\n }\n }\n\n return true;\n }\n }\n\n registerProcessor(\"audio-processor\", AudioProcessor);\n `;\n\n const blob = new Blob([workerCode], { type: \"application/javascript\" });\n return URL.createObjectURL(blob);\n};\n\nconst useAudioRecorder = ({\n apiKey,\n apiBaseUrl = API_BASE_URL,\n speciality,\n patientId,\n patientName,\n patientHistory,\n selectedFormat = \"json\",\n skipDiarization = true,\n silenceRemoval = true,\n onTranscriptionUpdate,\n onTranscriptionComplete,\n}: AudioRecorderHookProps): UseAudioRecorderReturn => {\n const [uploadChunkInterval, setUploadChunkInterval] = useState<number | null>(null);\n const [isRecording, setIsRecording] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [alreadyDoneTranscription, setAlreadyDoneTranscription] = useState(\"\");\n const [transcriptionDone, setTranscriptionDone] = useState(false);\n const [currentDeviceId, setCurrentDeviceId] = useState<string | null>(null);\n const [availableDevices, setAvailableDevices] = useState<MediaDeviceInfo[]>([]);\n\n // Add new state for audio monitoring\n const [audioLevel, setAudioLevel] = useState<number>(0);\n const [noAudioDetected, setNoAudioDetected] = useState(false);\n\n const audioSamplesRef = useRef<Float32Array[]>([]);\n const mediaStreamRef = React.useRef<MediaStream | null>(null);\n const processorRef = React.useRef<AudioWorkletNode | null>(null);\n const audioContextRef = React.useRef<AudioContext | null>(null);\n const sessionIdRef = React.useRef<string | null>(null); // This will be server session ID\n const localSessionIdRef = React.useRef<string | null>(null); // This will be our IndexedDB session ID\n\n const doctorName = \"asad\";\n\n const [selectedModel, setSelectedModel] = React.useState<string>(\"new-large\");\n\n const [isRetryingSession, setIsRetryingSession] = React.useState(false);\n const [showRetrySessionPrompt, setShowRetrySessionPrompt] = React.useState(false);\n\n // Track if a chunk upload has failed during the current recording session\n // If true, we skip further uploads but continue recording audio to IndexedDB\n const sessionHasFailedChunkRef = React.useRef(false);\n\n // Use the provided apiKey or fall back to selectedApiKey\n const effectiveApiKey = apiKey;\n\n const {\n convertTranscriptionResponse,\n conversionError,\n clearError,\n createHL7TranscriptionRequest,\n createFHIRTranscriptionRequest,\n } = useHL7FHIRConverter();\n\n // Add helper function to combine audio chunks (moved before useAudioRecovery)\n const combineAudioChunks = React.useCallback((audioChunks: Float32Array[]): Float32Array => {\n const totalLength = audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combinedAudio = new Float32Array(totalLength);\n let offset = 0;\n\n for (const chunk of audioChunks) {\n combinedAudio.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combinedAudio;\n }, []);\n\n // Create a ref for uploadChunkToServer to avoid closure issues\n const uploadChunkToServerRef = React.useRef<\n | ((\n audioData: Float32Array,\n isFirst: boolean,\n sequence: number,\n isFinal: boolean,\n isPaused?: boolean\n ) => Promise<void>)\n | null\n >(null);\n\n // Update the useAudioRecovery callback with better logging\n const {\n createSession,\n appendAudioToSession,\n markSessionComplete,\n markSessionFailed,\n retrySession,\n deleteSession,\n getFailedSession,\n clearFailedSessions,\n } = useAudioRecovery(async (audioChunks, metadata) => {\n // Reprocess session callback - send combined audio as single final chunk\n try {\n console.log(\"🔄 Retry callback started with audio chunks:\", {\n chunksCount: audioChunks.length,\n totalSamples: audioChunks.reduce((sum, chunk) => sum + chunk.length, 0),\n chunkDetails: audioChunks.map((chunk, idx) => ({\n index: idx,\n length: chunk.length,\n hasData: chunk.length > 0,\n })),\n });\n\n if (audioChunks.length === 0) {\n throw new Error(\"No audio chunks provided for retry\");\n }\n\n // Combine all audio chunks into one\n const combinedAudio = combineAudioChunks(audioChunks);\n\n console.log(\"[AUDIO] Combined audio for retry:\", {\n combinedLength: combinedAudio.length,\n hasAudio: combinedAudio.length > 0,\n });\n\n if (combinedAudio.length === 0) {\n throw new Error(\"Combined audio is empty\");\n }\n\n // Check if uploadChunkToServer is available\n if (!uploadChunkToServerRef.current) {\n throw new Error(\"Upload function not yet initialized\");\n }\n\n // Generate a fresh session ID for retry (server will create new session)\n const newSessionId = `session_retry_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n console.log(\"🆔 Generated new retry session ID:\", newSessionId);\n\n // Send as first AND final chunk to create complete new session\n await uploadChunkToServerRef.current(combinedAudio, true, 0, true, false);\n\n console.log(\"[SUCCESS] Retry upload completed successfully\");\n } catch (error) {\n console.error(\"[ERROR] Retry session failed:\", error);\n throw error;\n }\n });\n\n const chunkQueueRef = React.useRef<\n {\n chunk: Float32Array | null;\n isFinal: boolean;\n sequence: number;\n isPaused?: boolean;\n }[]\n >([]);\n const isProcessingQueueRef = React.useRef(false);\n const sequenceCounterRef = React.useRef(0);\n const receivedTranscriptionsRef = React.useRef<Map<number, string>>(new Map());\n const nextExpectedSequenceRef = React.useRef(0);\n\n const selectedModelRef = React.useRef(selectedModel);\n const skipDiarizationRef = React.useRef(skipDiarization);\n const removeSilenceRef = React.useRef(silenceRemoval);\n const selectedFormatRef = React.useRef(selectedFormat);\n\n const {\n removeSilence,\n isLoaded,\n isConverting,\n loadFFmpeg,\n progress,\n statusMessage,\n convertToWav,\n } = useFFmpegConverter();\n\n // Add ref to track the current isLoaded value\n const isLoadedRef = React.useRef(isLoaded);\n\n // Update the ref whenever isLoaded changes\n React.useEffect(() => {\n isLoadedRef.current = isLoaded;\n console.log(`🔄 isLoadedRef updated to: ${isLoaded}`);\n }, [isLoaded]);\n\n React.useEffect(() => {\n selectedModelRef.current = selectedModel;\n }, [selectedModel]);\n\n React.useEffect(() => {\n skipDiarizationRef.current = skipDiarization;\n }, [skipDiarization]);\n\n React.useEffect(() => {\n removeSilenceRef.current = silenceRemoval;\n }, [silenceRemoval]);\n\n React.useEffect(() => {\n selectedFormatRef.current = selectedFormat;\n }, [selectedFormat]);\n\n React.useEffect(() => {\n // Use server session ID for callbacks, fallback to local session ID\n console.log(\"Triggering onTranscriptionUpdate with:\", {\n alreadyDoneTranscription,\n sessionId: sessionIdRef.current,\n localSessionId: localSessionIdRef.current,\n });\n if (alreadyDoneTranscription.length > 0) {\n onTranscriptionUpdate(\n alreadyDoneTranscription,\n sessionIdRef.current || localSessionIdRef.current || \"\"\n );\n }\n }, [alreadyDoneTranscription]);\n\n // Add useEffect to track speciality changes\n React.useEffect(() => {\n console.log(\"Speciality changed in useAudioRecorder:\", speciality);\n }, [speciality]);\n\n React.useEffect(() => {\n let isMounted = true;\n\n // Only initialize FFmpeg once\n if (!isLoadedRef.current) {\n (async () => {\n console.log(\"Initializing FFmpeg…\");\n try {\n const ok = await loadFFmpeg();\n if (isMounted) {\n console.log(\"FFmpeg init returned:\", ok);\n if (ok) {\n console.log(\"FFmpeg initialized successfully for audio recorder\");\n }\n }\n } catch (error) {\n if (isMounted) {\n console.error(\"FFmpeg initialization failed:\", error);\n }\n }\n })();\n } else {\n console.log(\"FFmpeg already initialized, skipping\");\n }\n\n return () => {\n isMounted = false;\n };\n }, []);\n\n // Microphone validation and detection\n const validateMicrophoneAccess = React.useCallback(async (): Promise<boolean> => {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const audioInputDevices = devices.filter((device) => device.kind === \"audioinput\");\n\n setAvailableDevices(audioInputDevices);\n\n if (audioInputDevices.length === 0) {\n throw new Error(\"No microphone devices detected. Please connect a microphone.\");\n }\n\n // Test microphone access with actual getUserMedia call\n const testStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: currentDeviceId ? { exact: currentDeviceId } : undefined,\n },\n });\n\n // Get device information\n const audioTracks = testStream.getAudioTracks();\n if (audioTracks.length > 0) {\n const track = audioTracks[0];\n const settings = track.getSettings();\n setCurrentDeviceId(settings.deviceId || null);\n console.log();\n }\n\n // Clean up the test stream\n testStream.getTracks().forEach((track) => track.stop());\n\n return true;\n } catch (error) {\n console.error(\"Microphone validation failed:\", error);\n\n if (error instanceof Error) {\n let errorMessage = \"\";\n\n if (error.name === \"NotFoundError\" || error.name === \"DevicesNotFoundError\") {\n errorMessage = \"No microphone found. Please connect a microphone and refresh.\";\n } else if (error.name === \"NotAllowedError\" || error.name === \"PermissionDeniedError\") {\n errorMessage =\n \"Microphone access denied. Please allow microphone permissions in your browser settings.\";\n } else if (error.name === \"NotReadableError\" || error.name === \"TrackStartError\") {\n errorMessage = \"Microphone is busy. Please close other apps using the microphone.\";\n } else if (error.name === \"OverconstrainedError\") {\n errorMessage = \"Selected microphone is unavailable. Please choose another device.\";\n } else {\n errorMessage = error.message;\n }\n setError(errorMessage); // Set the main error state\n } else {\n const errorMessage = \"Microphone access error occurred.\";\n setError(errorMessage);\n }\n\n return false;\n }\n }, [currentDeviceId]);\n\n // Initial microphone check - only when component mounts or speciality changes\n React.useEffect(() => {\n if (speciality) {\n // Don't validate immediately, wait for user interaction\n console.log(\"Speciality set, microphone validation will happen on recording start\");\n }\n }, [speciality]);\n\n // NOTE: We no longer show retry prompt on mount - only when user stops recording after a failure\n // This ensures the user isn't interrupted with retry prompts from previous sessions\n // Failed sessions remain in IndexedDB and can be retried if the user starts a new recording\n\n // Update clear function to work with sessions\n const clearAllSessions = React.useCallback(async () => {\n await clearFailedSessions();\n setShowRetrySessionPrompt(false);\n }, [clearFailedSessions]);\n\n // Update the uploadChunkToServer function\n const uploadChunkToServer = React.useCallback(\n async (\n audioData: Float32Array | null,\n isFinalChunk: boolean,\n sequence: number,\n retry = false,\n isPausedChunk = false\n ) => {\n const currentIsLoaded = isLoadedRef.current;\n\n console.log(\"🔧 uploadChunkToServer called with:\", {\n isLoaded: currentIsLoaded,\n silenceRemovalEnabled: removeSilenceRef.current,\n hasRemoveSilenceFunction: typeof removeSilence === \"function\",\n isFinalChunk,\n sequence,\n audioDataLength: audioData?.length,\n requestFormat: selectedFormatRef.current,\n sessionHasFailed: sessionHasFailedChunkRef.current,\n });\n\n processorRef.current?.port.postMessage({ command: \"resetUploadChunk\" });\n\n // Save chunk to local session first (always save to IndexedDB regardless of failure state)\n if (audioData && localSessionIdRef.current && !retry) {\n try {\n console.log(`[DB] Saving chunk ${sequence} to IndexedDB session ${localSessionIdRef.current}`);\n await appendAudioToSession(localSessionIdRef.current, audioData, sequence);\n console.log(`[DB] ✓ Successfully saved audio chunk ${sequence} to IndexedDB (${audioData.length} samples)`);\n } catch (error) {\n console.error(`[DB] ✗ Failed to save audio chunk ${sequence} to IndexedDB:`, error);\n }\n } else {\n console.log(`[DB] Skipping IndexedDB save: audioData=${!!audioData}, sessionId=${localSessionIdRef.current}, retry=${retry}`);\n }\n\n // If a previous chunk has failed, skip server upload but continue recording\n // Show retry UI only when user stops recording (isFinalChunk)\n if (sessionHasFailedChunkRef.current && !retry) {\n console.log(`[SKIP] Session has failed chunk - skipping server upload for sequence ${sequence}, continuing to record audio`);\n if (isFinalChunk) {\n // User has stopped recording - now show the retry UI\n setShowRetrySessionPrompt(true);\n setIsProcessing(false);\n }\n return;\n }\n\n // Wrap the server call in p-retry\n try {\n const data = await pRetry(\n async (attemptNumber) => {\n console.log(`🔄 Transcribe attempt ${attemptNumber} for sequence ${sequence}`);\n\n // Prepare audio file first\n if (!audioData || audioData.length === 0) {\n console.log();\n if (retry) {\n throw new AbortError(\"No audio data provided for retry\");\n }\n throw new Error(\"No audio data provided\");\n }\n\n console.log();\n\n console.log(\n `[PROCESSING] Processing audio chunk: ${audioData.length} samples (${(audioData.length / 44100).toFixed(2)}s)`\n );\n\n // Log audio content for debugging (no longer skipping chunks)\n let maxAmplitude = 0;\n let nonZeroSamples = 0;\n\n for (let i = 0; i < audioData.length; i++) {\n const amplitude = Math.abs(audioData[i]);\n if (amplitude > maxAmplitude) maxAmplitude = amplitude;\n if (amplitude > 0.001) {\n nonZeroSamples++;\n }\n }\n\n const audioPercentage = nonZeroSamples / audioData.length;\n console.log(\n `[AUDIO] Audio stats: maxAmplitude=${maxAmplitude.toFixed(4)}, audioContent=${(audioPercentage * 100).toFixed(2)}%, sequence=${sequence}, isFinal=${isFinalChunk}`\n );\n\n const sampleRate = audioContextRef.current?.sampleRate || 16000;\n const timestamp = Date.now();\n const fileName = `audio-chunk-${timestamp}.wav`;\n\n let wavFile: File | null = await convertToWav(audioData, sampleRate, fileName);\n\n if (!wavFile) {\n throw new Error(\"WAV conversion failed through FFmpeg\");\n }\n\n console.log(`[INFO] Original WAV file: ${wavFile.size} bytes, ${wavFile.name}`);\n\n // Apply silence removal if enabled\n if (currentIsLoaded && removeSilenceRef.current) {\n try {\n console.log(\"[SILENCE] Attempting to remove silence from audio chunk...\");\n const processedFile = await removeSilence(wavFile);\n if (processedFile) {\n console.log(\n `[SUCCESS] Silence removed successfully: ${processedFile.size} bytes (was ${wavFile.size} bytes)`\n );\n\n // Check if the processed file is too small (less than 1KB indicates likely over-processing)\n if (processedFile.size < 1000) {\n console.warn(\n `[WARN] Processed file very small (${processedFile.size} bytes), using original file`\n );\n // Use original file if processed file is suspiciously small\n } else {\n wavFile = processedFile;\n }\n } else {\n console.warn(\"Silence removal returned null, using original file\");\n }\n } catch (silenceError) {\n console.warn(\"Silence removal failed, using original file:\", silenceError);\n }\n } else {\n console.log(\"[SILENCE] Silence removal disabled or not loaded\");\n }\n\n console.log(\n `[OUT] Final file for transcription: ${wavFile.size} bytes, ${wavFile.name}`\n );\n\n // Log warning for very small files but don't skip them - let server decide\n if (wavFile.size < 500) {\n console.warn(\n `[WARN] Small audio file (${wavFile.size} bytes) - may contain minimal audio data, sending to server anyway`\n );\n }\n\n // Prepare request data\n const requestData = {\n sessionId: retry ? undefined : sessionIdRef.current || undefined,\n model: selectedModelRef.current,\n doctorName: doctorName,\n patientName: patientName || \"\",\n patientId: patientId,\n removeSilence: removeSilenceRef.current,\n skipDiarization: skipDiarizationRef.current,\n isFinalChunk: isFinalChunk,\n isPaused: isPausedChunk,\n sequence: sequence,\n speciality: speciality,\n retry: retry,\n };\n\n let formData: FormData;\n let contentType: string | undefined;\n\n // Create request body based on selected format\n switch (selectedFormatRef.current) {\n case \"hl7\":\n formData = createHL7TranscriptionRequest(wavFile, requestData);\n contentType = \"multipart/form-data; hl7-request=true\";\n console.log(\"Created HL7-formatted request\");\n console.log(\"HL7 FormData entries:\", Array.from(formData.entries()));\n break;\n\n case \"fhir\":\n formData = createFHIRTranscriptionRequest(wavFile, requestData);\n contentType = \"multipart/form-data; fhir-request=true\";\n console.log(\"Created FHIR-formatted request\");\n console.log(\"FHIR FormData entries:\", Array.from(formData.entries()));\n break;\n\n case \"json\":\n default:\n // Original JSON format\n formData = new FormData();\n\n if (retry) {\n formData.append(\"retry\", \"true\");\n } else if (sessionIdRef.current) {\n formData.append(\"sessionId\", sessionIdRef.current);\n }\n\n formData.append(\"audio\", wavFile);\n formData.append(\"model\", selectedModelRef.current);\n formData.append(\"doctorName\", doctorName);\n formData.append(\"patientName\", patientName || \"\");\n if (patientHistory) formData.append(\"patientHistory\", patientHistory);\n if (patientId) formData.append(\"patientId\", patientId.toString());\n formData.append(\"removeSilence\", removeSilenceRef.current.toString());\n formData.append(\"skipDiarization\", skipDiarizationRef.current.toString());\n formData.append(\"isFinalChunk\", isFinalChunk.toString());\n formData.append(\"isPaused\", isPausedChunk.toString());\n formData.append(\"sequence\", sequence.toString());\n formData.append(\"speciality\", speciality);\n\n console.log(\"Created JSON-formatted request\");\n break;\n }\n\n // Prepare headers\n const headers: Record<string, string> = {\n \"x-api-key\": effectiveApiKey || \"\",\n \"x-response-format\": selectedFormatRef.current,\n \"x-request-format\": selectedFormatRef.current, // Add request format header\n };\n\n // Don't set Content-Type for FormData - let browser set it with boundary\n // if (contentType) {\n // headers[\"Content-Type\"] = contentType;\n // }\n\n const response = await fetch(`${apiBaseUrl}/api/transcribe`, {\n method: \"POST\",\n headers: headers,\n body: formData,\n });\n\n // Handle different types of errors\n if (!response.ok) {\n const errorText = await response.text();\n\n console.error(\"Transcription server error response:\", {\n status: response.status,\n statusText: response.statusText,\n body: errorText,\n });\n\n let errorMessage = `HTTP ${response.status}`;\n\n try {\n const errorData = JSON.parse(errorText);\n errorMessage = errorData.message || errorMessage;\n } catch {\n errorMessage = errorText || errorMessage;\n }\n\n if (response.status === 401) {\n throw new AbortError(\n \"Transcription service authentication failed. Please check your API key configuration.\"\n );\n } else if (response.status >= 400 && response.status < 500) {\n throw new AbortError(`Client error: ${errorMessage}`);\n } else {\n throw new Error(`Server error: ${errorMessage}`);\n }\n }\n\n // Handle different response formats based on Content-Type\n\n let responseData: any;\n\n if (selectedFormatRef.current === \"json\") {\n responseData = await response.json();\n console.log(\"Parsed JSON response:\", responseData);\n } else if (selectedFormatRef.current === \"hl7\") {\n responseData = await response.text();\n console.log(\"Received HL7 response:\", responseData);\n } else if (selectedFormatRef.current === \"fhir\") {\n responseData = await response.json(); // FHIR is JSON-based\n console.log(\"Received FHIR response:\", responseData);\n } else {\n const responseText = await response.text();\n try {\n responseData = JSON.parse(responseText);\n console.log(\"Fallback: Parsed as JSON:\", responseData);\n } catch {\n responseData = responseText;\n console.log(\"Fallback: Using as text:\", responseData);\n }\n }\n\n // Convert the response using our converter hook\n const convertedData = convertTranscriptionResponse(\n responseData,\n selectedFormatRef.current\n );\n console.log(\"Original response:\", responseData);\n console.log(\"Converted response:\", convertedData);\n\n return convertedData;\n },\n {\n retries: 3,\n factor: 2,\n minTimeout: 1000,\n maxTimeout: 10000,\n randomize: true,\n onFailedAttempt: (error) => {\n console.warn(\n `[WARN] Transcribe attempt ${error.attemptNumber} failed for sequence ${sequence}:`,\n {\n error: error,\n retriesLeft: error.retriesLeft,\n }\n );\n\n if (error.retriesLeft > 0) {\n setError(\n `Network issue detected. Retrying... (${error.retriesLeft} attempts remaining)`\n );\n }\n },\n }\n );\n\n // Clear any conversion errors on success\n if (conversionError) {\n clearError();\n }\n\n // Clear any retry-related error messages on success\n if (error && error.includes(\"Retrying\")) {\n setError(null);\n }\n if (!data) {\n throw new Error(\"No data received from transcription server\");\n }\n\n console.log(`[SUCCESS] Received transcription for sequence ${sequence}:`, data);\n\n // Update server session ID when received from server\n if (retry && data.sessionId) {\n console.log(\n \"[SUCCESS] Retry successful - received new server session ID:\",\n data.sessionId\n );\n sessionIdRef.current = data.sessionId;\n } else if (!retry && data.sessionId && !sessionIdRef.current) {\n console.log(\"[SUCCESS] Received initial server session ID:\", data.sessionId);\n sessionIdRef.current = data.sessionId;\n }\n\n receivedTranscriptionsRef.current.set(sequence, data.transcription);\n\n // Append in order\n while (receivedTranscriptionsRef.current.has(nextExpectedSequenceRef.current)) {\n const t = receivedTranscriptionsRef.current.get(nextExpectedSequenceRef.current)!;\n setAlreadyDoneTranscription(t);\n receivedTranscriptionsRef.current.delete(nextExpectedSequenceRef.current);\n nextExpectedSequenceRef.current++;\n }\n\n if (isFinalChunk) {\n setTranscriptionDone(true);\n // Pass the converted data to the callback\n onTranscriptionComplete(data.transcription, data.classifiedInfo, sessionIdRef.current!);\n\n // Clear LOCAL session only on successful final chunk + medical note generation\n if (localSessionIdRef.current) {\n await markSessionComplete(localSessionIdRef.current);\n setShowRetrySessionPrompt(false);\n }\n }\n } catch (err) {\n console.error(`[ERROR] Upload error occurred after all retries:`, err);\n\n // Include conversion errors in error handling\n if (conversionError) {\n console.error(\"Conversion error during upload:\", conversionError);\n setError(`Data conversion failed: ${conversionError}`);\n }\n\n const isAbortError = err instanceof Error && err.name === \"AbortError\";\n const statusCode =\n err instanceof Error && err.message.includes(\"HTTP\")\n ? parseInt(err.message.split(\"HTTP\")[1].trim())\n : null;\n\n // Mark LOCAL session as failed but keep the audio data for retry\n // Set the failed flag so subsequent chunks skip server upload but continue recording\n if (localSessionIdRef.current && !retry) {\n sessionHasFailedChunkRef.current = true;\n await markSessionFailed(\n localSessionIdRef.current,\n err instanceof Error ? err.message : \"Unknown error\"\n );\n console.log(`[FAIL] Chunk ${sequence} failed - session marked as failed, will continue recording audio locally`);\n\n // Only show retry UI when user stops recording (final chunk)\n if (isFinalChunk) {\n setShowRetrySessionPrompt(true);\n }\n }\n\n // Set appropriate error messages for different scenarios\n if (\n err instanceof Error &&\n (err.message.includes(\"authentication failed\") || statusCode === 401)\n ) {\n setError(\n \"Authentication failed. Audio saved offline - please check your API key and retry.\"\n );\n } else if (\n err instanceof Error &&\n (err.message === \"Failed to fetch\" || err.name === \"TypeError\" || !navigator.onLine)\n ) {\n setError(\n \"No internet connection. Audio saved offline - transcription will start when connection is restored.\"\n );\n } else if (\n err instanceof Error &&\n (err.message.includes(\"HTTP 5\") || err.message.includes(\"Server error\"))\n ) {\n setError(\n \"Server error occurred after multiple attempts. Audio saved offline - you can retry transcription.\"\n );\n } else if (isAbortError) {\n setError(\n err instanceof Error\n ? err.message.replace(\n \"Transcription service authentication failed. Please check your API key configuration.\",\n \"Authentication failed. Audio saved offline - please check your API key and retry.\"\n )\n : \"Request failed. Audio saved offline - you can retry.\"\n );\n } else {\n setError(\n \"Transcription failed after multiple attempts. Audio saved offline - you can retry transcription.\"\n );\n }\n } finally {\n if (isFinalChunk) setIsProcessing(false);\n }\n },\n [\n selectedModel,\n silenceRemoval,\n skipDiarization,\n selectedFormat,\n patientName,\n patientHistory,\n onTranscriptionComplete,\n speciality,\n removeSilence,\n convertToWav,\n appendAudioToSession,\n markSessionComplete,\n markSessionFailed,\n getFailedSession,\n error,\n convertTranscriptionResponse,\n conversionError,\n clearError,\n createHL7TranscriptionRequest, // Add new dependencies\n createFHIRTranscriptionRequest,\n ]\n );\n\n // Assign the function to the ref for use in callbacks\n uploadChunkToServerRef.current = uploadChunkToServer;\n\n // Update the retry function to work with sessions\n const retryFailedSession = React.useCallback(async () => {\n setIsRetryingSession(true);\n try {\n const failedSession = await getFailedSession();\n\n if (failedSession) {\n const success = await retrySession(failedSession.id);\n if (success) {\n console.log(`Successfully retried session ${failedSession.id}`);\n // Delete the session from IndexedDB after successful retry\n await deleteSession(failedSession.id);\n console.log(`Deleted session ${failedSession.id} from IndexedDB after successful retry`);\n setError(null);\n setShowRetrySessionPrompt(false);\n } else {\n // Retry failed - keep showing retry UI so user can try again\n console.log(`Retry failed for session ${failedSession.id} - keeping retry UI visible`);\n setShowRetrySessionPrompt(true);\n setError(\"Retry failed. Please check your connection and try again.\");\n }\n } else {\n // No failed session found - hide retry UI\n setShowRetrySessionPrompt(false);\n }\n } catch (error) {\n console.error(\"Error retrying failed sessions:\", error);\n setError(\"Failed to retry sessions. Please try again.\");\n // Keep retry UI visible on error so user can try again\n setShowRetrySessionPrompt(true);\n } finally {\n setIsRetryingSession(false);\n }\n }, [retrySession, getFailedSession, deleteSession]);\n\n const startRecording = React.useCallback(async () => {\n try {\n // Clear any previous errors\n setError(null);\n setNoAudioDetected(false);\n\n // Pre-flight microphone check\n const micValid = await validateMicrophoneAccess();\n if (!micValid) {\n return;\n }\n\n audioSamplesRef.current = [];\n\n // Always create a new session when starting recording\n if (!isPaused) {\n setAlreadyDoneTranscription(\"\");\n setTranscriptionDone(false);\n // Reset sequence tracking\n sequenceCounterRef.current = 0;\n nextExpectedSequenceRef.current = 0;\n receivedTranscriptionsRef.current.clear();\n\n // Reset failed chunk flag for new recording session\n sessionHasFailedChunkRef.current = false;\n chunkQueueRef.current = []; // Clear any pending chunks\n\n // Create new LOCAL session ID for IndexedDB storage\n const localSessionId = `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n localSessionIdRef.current = localSessionId;\n\n // Reset server session ID (will be set when server responds)\n sessionIdRef.current = null;\n\n console.log(\"Created local session ID for IndexedDB:\", localSessionId);\n // Note: Session will be created after audio context is initialized (need sampleRate)\n }\n\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: currentDeviceId ? { exact: currentDeviceId } : undefined,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n mediaStreamRef.current = stream;\n\n // Track device info\n const audioTracks = stream.getAudioTracks();\n if (audioTracks.length > 0) {\n const track = audioTracks[0];\n const settings = track.getSettings();\n setCurrentDeviceId(settings.deviceId || null);\n console.log(\"Recording started with local session:\", localSessionIdRef.current);\n\n // Monitor for device disconnection\n track.addEventListener(\"ended\", () => {\n console.log(\"Audio track ended - device disconnected\");\n setError(\"Microphone disconnected. Session saved - please reconnect and retry.\");\n stopRecording();\n });\n }\n\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n\n // Create session with actual sample rate now that we have audioContext\n if (!isPaused && localSessionIdRef.current) {\n await createSession(localSessionIdRef.current, {\n patientId,\n patientName: patientName || undefined,\n patientHistory: patientHistory || undefined,\n speciality,\n sampleRate: audioContext.sampleRate,\n });\n }\n\n // Create audio processor worker dynamically\n const processorUrl = createAudioProcessorWorker();\n await audioContext.audioWorklet.addModule(processorUrl);\n\n // Clean up the blob URL\n URL.revokeObjectURL(processorUrl);\n\n const processor = new AudioWorkletNode(audioContext, \"audio-processor\");\n\n processor.port.onmessage = (event) => {\n const {\n command,\n audioBuffer,\n level,\n silentDuration,\n hasDetectedAudio,\n isInitialPhase,\n totalRecordingTime,\n lastAudioTime,\n } = event.data;\n\n // Handle chunk messages (increment sequence only for actual chunks)\n if (command === \"finalChunk\" && audioBuffer) {\n const sequence = sequenceCounterRef.current++;\n const audioArray = new Float32Array(audioBuffer);\n console.log(`[RECEIVE] Final chunk: ${audioArray.length} samples, sequence: ${sequence}`);\n enqueueChunk(audioArray, true, sequence);\n } else if (command === \"chunk\" && audioBuffer) {\n const sequence = sequenceCounterRef.current++;\n const audioArray = new Float32Array(audioBuffer);\n console.log(`[RECEIVE] Chunk: ${audioArray.length} samples, sequence: ${sequence}`);\n enqueueChunk(audioArray, false, sequence);\n } else if (command === \"pauseChunk\" && audioBuffer) {\n const sequence = sequenceCounterRef.current++;\n console.log(`[RECEIVE] Pause chunk with audioBuffer, sequence: ${sequence}`);\n enqueueChunk(new Float32Array(audioBuffer), false, sequence, true);\n } else if (command === \"audioLevel\") {\n setAudioLevel(level);\n } else if (command === \"prolongedSilence\") {\n console.log(\n `Prolonged silence detected: ${Math.round(silentDuration)}s silent, ${Math.round(\n totalRecordingTime\n )}s total, last audio ${Math.round(lastAudioTime)}s ago`\n );\n } else if (command === \"noAudioDetected\") {\n console.log(\n `No audio detected: ${Math.round(\n silentDuration\n )}s silent, hasDetectedAudio: ${hasDetectedAudio}, isInitialPhase: ${isInitialPhase}`\n );\n setNoAudioDetected(true);\n\n let errorMessage;\n if (isInitialPhase && !hasDetectedAudio) {\n errorMessage = `No audio input detected for ${Math.round(\n silentDuration\n )} seconds. Please check your microphone setup.`;\n } else {\n errorMessage = `Extended silence detected (${Math.round(\n silentDuration\n )} seconds). Recording has been stopped.`;\n }\n\n setError(errorMessage);\n stopRecording();\n }\n };\n\n const source = audioContext.createMediaStreamSource(stream);\n source.connect(processor);\n\n audioContextRef.current = audioContext;\n processorRef.current = processor;\n setIsRecording(true);\n\n const intervalId = window.setInterval(() => {\n processorRef.current?.port.postMessage({ command: \"uploadChunk\" });\n }, 47000);\n setUploadChunkInterval(intervalId);\n } catch (err) {\n console.error(\"Recording start failed:\", err);\n // Error handling remains the same...\n }\n }, [\n validateMicrophoneAccess,\n isPaused,\n createSession,\n patientId,\n patientName,\n patientHistory,\n speciality,\n currentDeviceId,\n ]);\n\n const stopRecording = React.useCallback(async () => {\n console.log(\"Stopping recording...\");\n\n if (uploadChunkInterval) {\n clearInterval(uploadChunkInterval);\n setUploadChunkInterval(null);\n }\n\n if (processorRef.current) {\n console.log(\"Stopping recording and sending final chunk --> \", isPaused ? \"paused\" : \"final\");\n processorRef.current.port.postMessage({ command: \"stop\" });\n\n setTimeout(async () => {\n if (processorRef.current) {\n processorRef.current.disconnect();\n processorRef.current = null;\n }\n if (audioContextRef.current && audioContextRef.current.state !== \"closed\") {\n await audioContextRef.current.close();\n audioContextRef.current = null;\n }\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach((track) => track.stop());\n mediaStreamRef.current = null;\n }\n }, 500);\n }\n\n setIsRecording(false);\n\n // Check if session failed during recording - if so, show retry UI\n console.log(\"🔍 Stop recording - checking for failed session:\", {\n hasSessionFailed: sessionHasFailedChunkRef.current,\n localSessionId: localSessionIdRef.current,\n });\n if (sessionHasFailedChunkRef.current && localSessionIdRef.current) {\n console.log(\"⚠️ Recording stopped with failed session - showing retry UI\");\n setShowRetrySessionPrompt(true);\n }\n }, [uploadChunkInterval]);\n\n // Device change monitoring\n React.useEffect(() => {\n const handleDeviceChange = async () => {\n console.log(\"Audio device change detected\");\n\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const audioInputDevices = devices.filter((device) => device.kind === \"audioinput\");\n setAvailableDevices(audioInputDevices);\n\n // If no audio devices are available, set error\n if (audioInputDevices.length === 0) {\n setError(\"No microphone devices detected. Please connect a microphone.\");\n return;\n }\n\n // Check if current device is still available during recording\n if (isRecording && currentDeviceId) {\n const currentDeviceExists = audioInputDevices.some(\n (device) => device.deviceId === currentDeviceId\n );\n if (!currentDeviceExists) {\n setError(\"Microphone disconnected during recording. Please reconnect and restart.\");\n stopRecording();\n }\n }\n } catch (error) {\n console.error(\"Device change detection failed:\", error);\n setError(\"Unable to detect audio devices. Please check your microphone permissions.\");\n }\n };\n\n navigator.mediaDevices.addEventListener(\"devicechange\", handleDeviceChange);\n\n return () => {\n navigator.mediaDevices.removeEventListener(\"devicechange\", handleDeviceChange);\n };\n }, [isRecording, currentDeviceId, stopRecording]);\n\n // Device selection handler\n const selectMicrophone = React.useCallback(\n async (deviceId: string) => {\n try {\n setCurrentDeviceId(deviceId);\n\n // Restart recording with new device if currently recording\n if (isRecording) {\n stopRecording();\n setTimeout(() => {\n startRecording();\n }, 1000);\n }\n } catch (error) {\n console.error(\"Device selection failed:\", error);\n setError(\"Failed to switch to selected microphone.\");\n }\n },\n [isRecording, stopRecording, startRecording]\n );\n\n const pauseRecording = React.useCallback(() => {\n if (!isRecording || isPaused) return;\n\n // Stop the upload chunk timer\n if (uploadChunkInterval) {\n clearInterval(uploadChunkInterval);\n setUploadChunkInterval(null);\n }\n\n setIsPaused(true);\n\n // Suspend the worklet processor (this will automatically send pauseChunk)\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"pause\" });\n }\n\n setIsRecording(false);\n }, [isRecording, isPaused, uploadChunkInterval]);\n\n // Add resumeRecording update to reset no audio detection\n const resumeRecording = React.useCallback(() => {\n if (!isPaused) return;\n setIsPaused(false);\n setIsRecording(true);\n setNoAudioDetected(false); // Reset no audio detection when resuming\n\n // Resume the worklet processor\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"resume\" });\n }\n\n // Restart the upload chunk timer\n const intervalId = window.setInterval(() => {\n processorRef.current?.port.postMessage({ command: \"uploadChunk\" });\n }, 47000);\n setUploadChunkInterval(intervalId);\n }, [isPaused]);\n\n const processNextChunkInQueue = React.useCallback(async () => {\n // Don't process if already processing or queue is empty\n if (isProcessingQueueRef.current || chunkQueueRef.current.length === 0) {\n return;\n }\n\n const { chunk, isFinal, sequence, isPaused = false } = chunkQueueRef.current.shift()!;\n console.log(`[QUEUE] Processing chunk ${sequence} from queue, remaining: ${chunkQueueRef.current.length}`);\n isProcessingQueueRef.current = true;\n\n // uploadChunkToServer handles:\n // 1. Saving to IndexedDB (always, regardless of session failure state)\n // 2. Uploading to server (only if session hasn't failed)\n // 3. Marking session as failed on error\n uploadChunkToServer(chunk, isFinal, sequence, false, isPaused)\n .finally(() => {\n isProcessingQueueRef.current = false;\n processNextChunkInQueue(); // Continue processing remaining chunks\n });\n }, [uploadChunkToServer, isLoaded]);\n\n const enqueueChunk = React.useCallback(\n (\n audioData: Float32Array | null,\n isFinalChunk: boolean,\n sequence: number,\n isPausedChunk = false\n ) => {\n console.log(`[QUEUE] Enqueuing ${isFinalChunk ? 'FINAL' : isPausedChunk ? 'PAUSED' : 'regular'} chunk ${sequence}, samples: ${audioData?.length || 0}, queue size: ${chunkQueueRef.current.length}`);\n\n if (isFinalChunk) {\n // Only set processing state if session hasn't failed\n // If session has failed, we're just saving to IndexedDB (no server processing)\n if (!sessionHasFailedChunkRef.current) {\n setIsProcessing(true);\n } else {\n console.log(\"⚠️ Session has failed - skipping processing state (IndexedDB save only)\");\n }\n }\n\n chunkQueueRef.current.push({\n chunk: audioData,\n isFinal: isFinalChunk,\n sequence,\n isPaused: isPausedChunk,\n });\n processNextChunkInQueue();\n },\n [processNextChunkInQueue, isLoaded]\n );\n\n const float32ToWavFile = (samples: Float32Array): File => {\n const sampleRate = audioContextRef.current?.sampleRate || 44100;\n const buffer = new ArrayBuffer(44 + samples.length * 2);\n const view = new DataView(buffer);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, \"RIFF\");\n view.setUint32(4, 36 + samples.length * 2, true);\n writeString(8, \"WAVE\");\n writeString(12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, \"data\");\n view.setUint32(40, samples.length * 2, true);\n\n let offset = 44;\n for (let i = 0; i < samples.length; i++) {\n const sample = Math.max(-1, Math.min(1, samples[i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n offset += 2;\n }\n\n // Create File instead of Blob\n const timestamp = Date.now();\n const filename = `audio-chunk-${timestamp}.wav`;\n\n return new File([view], filename, {\n type: \"audio/wav\",\n lastModified: timestamp,\n });\n };\n\n // Add a test function to verify audio capture\n const testAudioCapture = useCallback(async () => {\n try {\n console.log(\"Audio Test Starting audio capture test...\");\n\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n echoCancellation: false,\n noiseSuppression: false,\n autoGainControl: false,\n },\n });\n\n console.log(\"Audio Test Got media stream:\", stream.id);\n\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const source = audioContext.createMediaStreamSource(stream);\n const analyser = audioContext.createAnalyser();\n\n analyser.fftSize = 256;\n source.connect(analyser);\n\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n\n let testCount = 0;\n const testInterval = setInterval(() => {\n analyser.getByteFrequencyData(dataArray);\n const average = dataArray.reduce((a, b) => a + b) / dataArray.length;\n const max = Math.max(...dataArray);\n\n console.log(\n `Audio Test Frame ${testCount}: avg=${average.toFixed(2)}, max=${max}, hasSound=${max > 10 ? \"YES\" : \"NO\"}`\n );\n\n testCount++;\n if (testCount >= 10) {\n clearInterval(testInterval);\n stream.getTracks().forEach((track) => track.stop());\n audioContext.close();\n console.log(\"Audio Test Audio capture test complete\");\n }\n }, 500);\n } catch (error) {\n console.error(\"Audio Test Audio capture test failed:\", error);\n }\n }, []);\n\n return {\n mediaStreamRef,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isRecording,\n isPaused,\n isProcessing,\n error: error,\n transcriptionDone,\n // New microphone features\n availableDevices,\n currentDeviceId,\n selectMicrophone,\n validateMicrophoneAccess,\n // Add audio monitoring properties\n audioLevel,\n noAudioDetected,\n // Add recovery-related properties\n showRetrySessionPrompt,\n isRetryingSession,\n retryFailedSession,\n clearAllSessions,\n // Add FFmpeg status - THIS IS THE MISSING PART\n isConverting,\n progress,\n statusMessage,\n // Add test function for debugging\n testAudioCapture,\n };\n};\n\nexport default useAudioRecorder;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Check, AlertCircle, X as XIcon } from \"lucide-react\";\n\nexport interface ToastProps {\n message: string;\n type: \"success\" | \"error\" | \"info\";\n onClose: () => void;\n duration?: number;\n onCancelRedirect?: () => void;\n}\n\nexport default function Toast({\n message,\n type,\n onClose,\n duration = 3000,\n onCancelRedirect,\n}: ToastProps) {\n React.useEffect(() => {\n const timer = setTimeout(() => {\n onClose();\n }, duration);\n\n return () => clearTimeout(timer);\n }, [onClose, duration]);\n\n const getIcon = () => {\n switch (type) {\n case \"success\":\n return <Check className=\"h-5 w-5\" />;\n case \"error\":\n return <AlertCircle className=\"h-5 w-5\" />;\n case \"info\":\n default:\n return <AlertCircle className=\"h-5 w-5\" />;\n }\n };\n\n const getColorClasses = () => {\n switch (type) {\n case \"success\":\n return \"bg-green-500 text-white\";\n case \"error\":\n return \"bg-red-500 text-white\";\n case \"info\":\n default:\n return \"bg-blue-500 text-white\";\n }\n };\n\n return (\n <div\n className={`fixed top-4 right-4 z-50 py-3 px-4 rounded-lg shadow-lg max-w-sm ${getColorClasses()}`}\n >\n <div className=\"flex items-center space-x-3\">\n {getIcon()}\n <span className=\"flex-1\">{message}</span>\n <button\n onClick={onClose}\n className=\"ml-2 hover:bg-white/20 rounded-full p-1 transition-colors\"\n >\n <XIcon className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\n\ninterface AudioVisualizerImprovedProps {\n mediaStream: MediaStream | null;\n isRecording: boolean;\n forceLight?: boolean; // Add a prop to force light theme\n}\n\n// Color palette with complementary gradient stops for more sophisticated visuals\nconst COLORS = {\n primary: [\"rgba(139, 92, 246, 0.9)\", \"rgba(168, 85, 247, 0.8)\", \"rgba(192, 132, 252, 0.7)\"], // Purples\n accent: [\"rgba(79, 70, 229, 0.7)\", \"rgba(99, 102, 241, 0.6)\", \"rgba(129, 140, 248, 0.5)\"], // Indigos\n highlight: [\"rgba(236, 72, 153, 0.7)\", \"rgba(244, 114, 182, 0.6)\", \"rgba(249, 168, 212, 0.5)\"], // Pinks\n background: [\"rgba(76, 29, 149, 0.6)\", \"rgba(91, 33, 182, 0.3)\", \"rgba(30, 27, 75, 0.1)\"], // Dark purples\n};\n\ninterface Particle {\n x: number;\n y: number;\n vx: number;\n vy: number;\n size: number;\n color: string;\n life: number;\n maxLife: number;\n type: \"dot\" | \"circle\" | \"triangle\";\n}\n\nfunction createParticle(isIdle: boolean, x: number, y: number, intensity: number = 1): Particle {\n // Choose a particle type with weighted randomness\n const typeRandom = Math.random();\n let type: \"dot\" | \"circle\" | \"triangle\";\n if (typeRandom < 0.7) {\n type = \"dot\";\n } else if (typeRandom < 0.9) {\n type = \"circle\";\n } else {\n type = \"triangle\";\n }\n\n // Different colors for idle vs active\n let color: string;\n const hue = isIdle ? 260 + Math.random() * 40 : 290 + Math.random() * 50;\n const saturation = 70 + Math.random() * 30;\n const lightness = 50 + Math.random() * 30;\n color = `hsla(${hue}, ${saturation}%, ${lightness}%, 0.7)`;\n\n // Adjust velocity and life based on state\n const speed = isIdle ? 0.5 + Math.random() : 2 + Math.random() * 5 * intensity;\n const angle = Math.random() * Math.PI * 2;\n const maxLife = isIdle ? 80 + Math.random() * 40 : 50 + Math.random() * 30;\n\n return {\n x,\n y,\n vx: Math.cos(angle) * speed,\n vy: Math.sin(angle) * speed,\n size: 1 + Math.random() * 4 * intensity,\n color,\n life: 0,\n maxLife,\n type,\n };\n}\n\nexport default function AudioVisualizerImproved({\n mediaStream,\n isRecording,\n forceLight = true, // Default to light theme for login page\n}: AudioVisualizerImprovedProps) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n const animationFrameRef = React.useRef<number>(0);\n const analyserRef = React.useRef<AnalyserNode | null>(null);\n const dataArrayRef = React.useRef<Uint8Array<ArrayBuffer> | null>(null);\n const timeRef = React.useRef(0);\n const particlesRef = React.useRef<Particle[]>([]);\n const lastAudioLevelRef = React.useRef(0);\n const lastTimeRef = React.useRef(Date.now());\n const [isDarkMode, setIsDarkMode] = React.useState(false);\n\n React.useEffect(() => {\n // Detect dark mode after component mounts (client-side only)\n const checkDarkMode = () => {\n const darkModeEnabled = document.documentElement.classList.contains(\"dark\");\n setIsDarkMode(forceLight ? false : darkModeEnabled);\n };\n\n // Check initially\n checkDarkMode();\n\n // Setup mutation observer to watch for theme changes\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === \"class\" && mutation.target === document.documentElement) {\n checkDarkMode();\n }\n });\n });\n\n observer.observe(document.documentElement, { attributes: true });\n\n return () => {\n observer.disconnect();\n };\n }, [forceLight]);\n\n React.useEffect(() => {\n if (!canvasRef.current) return;\n\n const audioContext = new AudioContext();\n analyserRef.current = audioContext.createAnalyser();\n analyserRef.current.fftSize = 512; // Increased for more detailed frequency analysis\n const bufferLength = analyserRef.current.frequencyBinCount;\n dataArrayRef.current = new Uint8Array(new ArrayBuffer(bufferLength));\n\n if (mediaStream && isRecording) {\n const source = audioContext.createMediaStreamSource(mediaStream);\n source.connect(analyserRef.current);\n }\n\n // Create a pool of idle particles\n if (particlesRef.current.length === 0) {\n for (let i = 0; i < 20; i++) {\n const canvas = canvasRef.current;\n if (!canvas) continue;\n\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const radius = Math.min(canvas.width, canvas.height) * 0.25;\n const angle = Math.random() * Math.PI * 2;\n const x = centerX + Math.cos(angle) * radius * Math.random();\n const y = centerY + Math.sin(angle) * radius * Math.random();\n\n particlesRef.current.push(createParticle(true, x, y));\n }\n }\n\n // Handle particles\n const updateParticles = (\n ctx: CanvasRenderingContext2D,\n deltaTime: number,\n centerX: number,\n centerY: number\n ) => {\n const newParticles: Particle[] = [];\n\n particlesRef.current.forEach((p) => {\n // Update position\n p.x += p.vx * deltaTime;\n p.y += p.vy * deltaTime;\n\n // Update lifetime\n p.life += deltaTime;\n\n // Only keep particles that haven't exceeded their lifetime\n if (p.life < p.maxLife) {\n // Calculate alpha based on life\n const progress = p.life / p.maxLife;\n const alpha = progress < 0.2 ? progress / 0.2 : 1 - (progress - 0.2) / 0.8;\n\n // Draw particle based on type\n ctx.globalAlpha = alpha * 0.8;\n\n switch (p.type) {\n case \"dot\":\n ctx.beginPath();\n ctx.fillStyle = p.color;\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.fill();\n break;\n\n case \"circle\":\n ctx.beginPath();\n ctx.strokeStyle = p.color;\n ctx.lineWidth = p.size / 3;\n ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n ctx.stroke();\n break;\n\n case \"triangle\":\n ctx.beginPath();\n ctx.fillStyle = p.color;\n const angle = Math.atan2(p.vy, p.vx);\n const size = p.size * 1.5;\n\n ctx.moveTo(p.x + Math.cos(angle) * size, p.y + Math.sin(angle) * size);\n ctx.lineTo(\n p.x + Math.cos(angle + (2 * Math.PI) / 3) * size,\n p.y + Math.sin(angle + (2 * Math.PI) / 3) * size\n );\n ctx.lineTo(\n p.x + Math.cos(angle + (4 * Math.PI) / 3) * size,\n p.y + Math.sin(angle + (4 * Math.PI) / 3) * size\n );\n ctx.closePath();\n ctx.fill();\n break;\n }\n\n ctx.globalAlpha = 1;\n newParticles.push(p);\n }\n });\n\n // Add new idle particles if necessary\n if (newParticles.length < 10) {\n const count = Math.min(3, 10 - newParticles.length);\n for (let i = 0; i < count; i++) {\n const radius =\n Math.min(canvasRef.current?.width || 0, canvasRef.current?.height || 0) * 0.25;\n const angle = Math.random() * Math.PI * 2;\n const x = centerX + Math.cos(angle) * radius * Math.random();\n const y = centerY + Math.sin(angle) * radius * Math.random();\n\n newParticles.push(createParticle(true, x, y));\n }\n }\n\n particlesRef.current = newParticles;\n };\n\n const draw = () => {\n if (!canvasRef.current || !analyserRef.current || !dataArrayRef.current) return;\n\n const now = Date.now();\n const deltaTime = (now - lastTimeRef.current) / 16.667; // Normalize to 60fps\n lastTimeRef.current = now;\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\", { alpha: false })!;\n\n // Set canvas dimensions to match container\n canvas.width = canvas.offsetWidth;\n canvas.height = canvas.offsetHeight;\n\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n\n // Get audio data if recording\n let avgAudioLevel = 0;\n let frequencyData: number[] = [];\n let suddenImpact = 0;\n\n if (mediaStream && isRecording) {\n analyserRef.current.getByteFrequencyData(dataArrayRef.current);\n\n // Create a normalized copy of the frequency data for easier use\n frequencyData = Array.from(dataArrayRef.current).map((v) => v / 255);\n\n // Calculate average audio level\n const sum = frequencyData.reduce((acc, val) => acc + val, 0);\n avgAudioLevel = sum / frequencyData.length;\n\n // Detect sudden volume changes for impact effects\n suddenImpact = Math.max(0, avgAudioLevel - lastAudioLevelRef.current);\n lastAudioLevelRef.current = avgAudioLevel * 0.2 + lastAudioLevelRef.current * 0.8; // Smooth transition\n } else {\n // When not recording, create some dummy frequency data for idle animation\n const count = 128;\n frequencyData = Array(count)\n .fill(0)\n .map((_, i) => {\n const angle = (i / count) * Math.PI * 2;\n return 0.1 + Math.sin(angle * 4 + timeRef.current) * 0.05;\n });\n }\n\n // Update time for animations (scaled by deltaTime)\n timeRef.current += 0.01 * deltaTime;\n\n // Ensure white background in light mode, dark in dark mode\n ctx.fillStyle = isDarkMode ? \"#121826\" : \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Create multiple overlapping background gradients - adapt for dark mode\n const createDynamicBackground = () => {\n // Main pulsating gradient\n const pulseIntensity =\n 0.5 + (isRecording ? avgAudioLevel * 0.5 : Math.sin(timeRef.current * 0.2) * 0.2);\n const mainGradient = ctx.createRadialGradient(\n centerX,\n centerY,\n 0,\n centerX,\n centerY,\n canvas.width * 0.6 * pulseIntensity\n );\n\n if (isDarkMode) {\n // Dark mode gradient\n mainGradient.addColorStop(0, \"rgba(91, 33, 182, 0.4)\"); // Dark purple at center\n mainGradient.addColorStop(0.4, \"rgba(67, 56, 202, 0.3)\"); // Indigo midway\n mainGradient.addColorStop(0.6, \"rgba(30, 41, 59, 0.2)\"); // Slate blue\n mainGradient.addColorStop(1, \"rgba(18, 24, 38, 0.0)\"); // Transparent to let dark background show\n } else {\n // Light mode gradient\n mainGradient.addColorStop(0, \"rgba(228, 228, 255, 0.7)\"); // Very light purple at center\n mainGradient.addColorStop(0.4, \"rgba(240, 240, 255, 0.5)\");\n mainGradient.addColorStop(0.6, \"rgba(245, 245, 255, 0.3)\"); // Almost white at edges\n mainGradient.addColorStop(1, \"rgba(255, 255, 255, 0.0)\"); // Transparent to let white background show\n }\n\n ctx.fillStyle = mainGradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n // Add subtle light sources that move around\n const lightCount = 3;\n for (let i = 0; i < lightCount; i++) {\n const angle = timeRef.current * 0.2 + (i / lightCount) * Math.PI * 2;\n const distance = canvas.width * 0.2 * (0.5 + Math.sin(timeRef.current * 0.3 + i) * 0.3);\n\n const lightX = centerX + Math.cos(angle) * distance;\n const lightY = centerY + Math.sin(angle) * distance;\n\n const lightGradient = ctx.createRadialGradient(\n lightX,\n lightY,\n 0,\n lightX,\n lightY,\n canvas.width * 0.4\n );\n\n // Use different colors for each light\n const alpha = 0.12 + Math.sin(timeRef.current + i) * 0.06;\n if (i === 0) {\n lightGradient.addColorStop(0, `rgba(192, 132, 252, ${alpha})`); // Purple\n lightGradient.addColorStop(1, \"rgba(192, 132, 252, 0)\");\n } else if (i === 1) {\n lightGradient.addColorStop(0, `rgba(129, 140, 248, ${alpha})`); // Indigo\n lightGradient.addColorStop(1, \"rgba(129, 140, 248, 0)\");\n } else {\n lightGradient.addColorStop(0, `rgba(244, 114, 182, ${alpha})`); // Pink\n lightGradient.addColorStop(1, \"rgba(244, 114, 182, 0)\");\n }\n\n ctx.fillStyle = lightGradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n };\n\n createDynamicBackground();\n\n // Update and draw particles\n updateParticles(ctx, deltaTime, centerX, centerY);\n\n // Draw main visualization elements\n if (isRecording) {\n // Draw spectrum visualization with improved style\n const drawCircularSpectrum = () => {\n const barCount = Math.min(frequencyData.length, 180); // Limit for performance\n const baseRadius = Math.min(canvas.width, canvas.height) * 0.22; // Reduced from 0.25 to 0.22\n\n // Draw circular frequency bars with enhanced styling\n ctx.save();\n\n // Add impact effect on sudden audio change\n if (suddenImpact > 0.08) {\n ctx.shadowBlur = 30 * suddenImpact;\n ctx.shadowColor = \"rgba(236, 72, 153, 0.7)\"; // Pink glow on impact\n\n // Add particles on impact\n const impactParticles = Math.floor(suddenImpact * 20);\n for (let i = 0; i < impactParticles; i++) {\n particlesRef.current.push(createParticle(false, centerX, centerY, suddenImpact * 5));\n }\n }\n\n // Draw frequency bars\n for (let i = 0; i < barCount; i++) {\n const value = frequencyData[i];\n const angle = (i / barCount) * Math.PI * 2;\n\n // Make the visualization more dynamic - higher frequencies have more variation\n const frequencyFactor = 0.5 + (i / barCount) * 1.5;\n const amplifiedValue = Math.pow(value, 1.5) * frequencyFactor;\n\n // Calculate bar dimensions\n const barHeight = baseRadius * 0.2 + amplifiedValue * baseRadius * 0.8;\n const barWidth = ((Math.PI * 2 * baseRadius) / barCount) * 1.2; // Slightly overlapping\n\n // Bar start and end points\n const innerRadius = baseRadius * (0.8 - amplifiedValue * 0.1); // Inner radius contracts with sound\n const outerRadius = innerRadius + barHeight;\n\n const x1 = centerX + Math.cos(angle) * innerRadius;\n const y1 = centerY + Math.sin(angle) * innerRadius;\n const x2 = centerX + Math.cos(angle) * outerRadius;\n const y2 = centerY + Math.sin(angle) * outerRadius;\n\n // Create gradient for each bar\n const gradient = ctx.createLinearGradient(x1, y1, x2, y2);\n\n // Use more sophisticated color mapping based on frequency\n const hue = 260 + (i / barCount) * 60; // 260-320 range (purples to magentas)\n const saturation = 80 + value * 20;\n const lightness = 50 + value * 30;\n const alpha = 0.5 + value * 0.5;\n\n gradient.addColorStop(\n 0,\n `hsla(${hue}, ${saturation}%, ${lightness - 20}%, ${alpha * 0.3})`\n );\n gradient.addColorStop(0.5, `hsla(${hue}, ${saturation}%, ${lightness}%, ${alpha})`);\n gradient.addColorStop(\n 1,\n `hsla(${hue}, ${saturation}%, ${lightness + 20}%, ${alpha * 0.8})`\n );\n\n // Draw bar with rounded caps for smoother look\n ctx.beginPath();\n ctx.strokeStyle = gradient;\n ctx.lineWidth = barWidth;\n ctx.lineCap = \"round\";\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n\n // Add glow proportional to value\n ctx.shadowBlur = 10 * value;\n ctx.shadowColor = `hsla(${hue}, 100%, 70%, 0.7)`;\n\n ctx.stroke();\n\n // Add particles at the end of loud frequency bars\n if (value > 0.7 && Math.random() < value * 0.05) {\n particlesRef.current.push(createParticle(false, x2, y2, value));\n }\n }\n\n // Add connecting elements between the bars\n ctx.beginPath();\n ctx.lineWidth = 2;\n\n const pathPoints: [number, number][] = [];\n const smoothFactor = 0.3;\n\n for (let i = 0; i < barCount; i++) {\n const value = frequencyData[i];\n const angle = (i / barCount) * Math.PI * 2;\n const radius = baseRadius * (1 + value * 0.8);\n\n const x = centerX + Math.cos(angle) * radius;\n const y = centerY + Math.sin(angle) * radius;\n\n pathPoints.push([x, y]);\n }\n\n // Draw a smooth curve through all points\n ctx.beginPath();\n ctx.moveTo(pathPoints[0][0], pathPoints[0][1]);\n\n for (let i = 0; i < pathPoints.length; i++) {\n const current = pathPoints[i];\n const next = pathPoints[(i + 1) % pathPoints.length];\n\n // Calculate control points for smooth curve\n const xc = (current[0] + next[0]) / 2;\n const yc = (current[1] + next[1]) / 2;\n\n ctx.quadraticCurveTo(current[0], current[1], xc, yc);\n }\n\n // Create gradient for the connecting curve\n const strokeGradient = ctx.createLinearGradient(\n centerX - baseRadius,\n centerY - baseRadius,\n centerX + baseRadius,\n centerY + baseRadius\n );\n\n strokeGradient.addColorStop(0, \"rgba(192, 132, 252, 0.4)\");\n strokeGradient.addColorStop(0.5, \"rgba(129, 140, 248, 0.3)\");\n strokeGradient.addColorStop(1, \"rgba(236, 72, 153, 0.4)\");\n\n ctx.strokeStyle = strokeGradient;\n ctx.lineWidth = 2;\n ctx.stroke();\n\n // Add a subtle fill\n const fillGradient = ctx.createRadialGradient(\n centerX,\n centerY,\n baseRadius * 0.5,\n centerX,\n centerY,\n baseRadius * 1.5\n );\n\n fillGradient.addColorStop(0, \"rgba(192, 132, 252, 0.03)\");\n fillGradient.addColorStop(0.7, \"rgba(129, 140, 248, 0.02)\");\n fillGradient.addColorStop(1, \"rgba(236, 72, 153, 0.01)\");\n\n ctx.fillStyle = fillGradient;\n ctx.fill();\n\n ctx.restore();\n };\n\n drawCircularSpectrum();\n\n // Add central element that pulses with the beat\n const drawCentralElement = () => {\n const bassValue = frequencyData.slice(0, 10).reduce((sum, val) => sum + val, 0) / 10;\n const pulseSize = 5 + bassValue * 40;\n\n // Multi-layered central element\n for (let i = 0; i < 3; i++) {\n const size = pulseSize * (1 - i * 0.2);\n const alpha = 0.7 - i * 0.2;\n\n ctx.beginPath();\n ctx.arc(centerX, centerY, size, 0, Math.PI * 2);\n\n const gradient = ctx.createRadialGradient(centerX, centerY, 0, centerX, centerY, size);\n\n gradient.addColorStop(0, `rgba(236, 72, 153, ${alpha})`); // Pink core\n gradient.addColorStop(0.5, `rgba(192, 132, 252, ${alpha * 0.8})`); // Purple mid\n gradient.addColorStop(1, `rgba(129, 140, 248, ${alpha * 0.1})`); // Indigo edge\n\n ctx.fillStyle = gradient;\n ctx.shadowBlur = 20 * bassValue;\n ctx.shadowColor = \"rgba(236, 72, 153, 0.8)\";\n ctx.fill();\n }\n };\n\n drawCentralElement();\n } else {\n // Idle animation when not recording\n const drawIdleAnimation = () => {\n const idleRadius = Math.min(canvas.width, canvas.height) * 0.22;\n\n // Multiple layers of animated circles\n for (let layer = 0; layer < 3; layer++) {\n ctx.beginPath();\n ctx.strokeStyle = `rgba(192, 132, 252, ${0.4 - layer * 0.1})`;\n ctx.lineWidth = 3 - layer * 0.7;\n\n const layerPoints = 120;\n const layerOffset = (layer * Math.PI) / 6;\n const layerSpeed = 1 - layer * 0.2;\n const layerRadius = idleRadius * (1 + layer * 0.15);\n\n ctx.beginPath();\n\n for (let i = 0; i < layerPoints; i++) {\n const angle = (i / layerPoints) * Math.PI * 2;\n const noise1 = Math.sin(angle * 5 + timeRef.current * layerSpeed) * 5;\n const noise2 = Math.cos(angle * 7 + timeRef.current * layerSpeed * 1.5) * 5;\n const wobble = noise1 + noise2;\n\n const x = centerX + Math.cos(angle + layerOffset) * (layerRadius + wobble);\n const y = centerY + Math.sin(angle + layerOffset) * (layerRadius + wobble);\n\n if (i === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n\n ctx.closePath();\n ctx.stroke();\n\n // Add subtle glow\n ctx.shadowBlur = 10;\n ctx.shadowColor = \"rgba(192, 132, 252, 0.5)\";\n }\n\n // Pulsating center\n const pulseSize = 8 + Math.sin(timeRef.current) * 4;\n\n // Multi-layered central dot\n for (let i = 0; i < 3; i++) {\n const size = pulseSize * (1 - i * 0.2);\n ctx.beginPath();\n ctx.arc(centerX, centerY, size, 0, Math.PI * 2);\n ctx.fillStyle = `rgba(192, 132, 252, ${0.7 - i * 0.2})`;\n ctx.shadowBlur = 15;\n ctx.shadowColor = \"rgba(192, 132, 252, 0.8)\";\n ctx.fill();\n }\n };\n\n drawIdleAnimation();\n }\n\n animationFrameRef.current = requestAnimationFrame(draw);\n };\n\n draw();\n\n return () => {\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, [mediaStream, isRecording, isDarkMode]);\n\n return (\n <div className=\"w-full flex justify-center items-center overflow-visible\">\n <div className=\"px-4 py-2 w-full h-full\">\n <div className=\"w-full h-full aspect-square max-w-md mx-auto relative\">\n {/* Outer background circle */}\n <div\n className={`absolute inset-0 rounded-full ${isDarkMode ? \"bg-gray-900\" : \"bg-white\"}`}\n style={{\n background: isDarkMode\n ? \"linear-gradient(135deg, rgba(17, 24, 39, 0.4) 0%, rgba(17, 24, 39, 0.2) 100%)\"\n : \"white\",\n transform: \"scale(1.08)\",\n zIndex: -1,\n boxShadow: isDarkMode\n ? \"inset 0 0 30px rgba(0, 0, 0, 0.5)\"\n : \"inset 0 0 10px rgba(0, 0, 0, 0.05)\",\n }}\n ></div>\n {/* Canvas for visualization */}\n <canvas\n ref={canvasRef}\n className={`w-full h-full rounded-full ${isDarkMode ? \"bg-gray-900\" : \"bg-white\"}`}\n style={{\n boxShadow: isDarkMode ? \"inset 0 0 20px rgba(13, 18, 30, 0.8)\" : \"none\",\n background: isDarkMode\n ? \"linear-gradient(135deg, rgba(13, 18, 30, 1) 0%, rgba(13, 18, 30, 1) 100%)\"\n : \"white\",\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { AudioRecorderProps, APIResponse, APIOptions } from \"./types\";\nimport useAudioRecorder from \"./hooks/useAudioRecorder\";\nimport { Mic, Square, Loader2, Pause, Play, AlertTriangle } from \"lucide-react\";\nimport Toast from \"./components/Toast\";\nimport AudioVisualizerImproved from \"./components/AudioVisualizerImproved\";\n\n// Embedded minimal Tailwind utilities\nconst tailwindStyles = `\n .space-y-4 > :not([hidden]) ~ :not([hidden]) { margin-top: 1rem; }\n .bg-orange-50 { background-color: rgb(255 247 237); }\n .bg-blue-900 { background-color: rgb(30 58 138); }\n .text-yellow-200 { color: rgb(254 240 138); }\n .hover\\\\:bg-blue-700:hover { background-color: rgb(29 78 216); }\n .dark .dark\\\\:bg-orange-900\\\\/20 { background-color: rgb(194 65 12 / 0.2); }\n .border { border-width: 1px; }\n .border-orange-200 { border-color: rgb(254 215 170); }\n .dark .dark\\\\:border-orange-800 { border-color: rgb(154 52 18); }\n .rounded-lg { border-radius: 0.5rem; }\n .p-4 { padding: 1rem; }\n .flex { display: flex; }\n .items-start { align-items: flex-start; }\n .items-center { align-items: center; }\n .justify-center { justify-content: center; }\n .flex-shrink-0 { flex-shrink: 0; }\n .h-5 { height: 1.25rem; }\n .w-5 { width: 1.25rem; }\n .text-orange-400 { color: rgb(251 146 60); }\n .ml-3 { margin-left: 0.75rem; }\n .flex-1 { flex: 1 1 0%; }\n .text-sm { font-size: 0.875rem; line-height: 1.25rem; }\n .font-medium { font-weight: 500; }\n .text-orange-800 { color: rgb(154 52 18); }\n .dark .dark\\\\:text-orange-200 { color: rgb(254 215 170); }\n .mt-2 { margin-top: 0.5rem; }\n .text-orange-700 { color: rgb(194 65 12); }\n .dark .dark\\\\:text-orange-300 { color: rgb(253 186 116); }\n .list-disc { list-style-type: disc; }\n .list-inside { list-style-position: inside; }\n .bg-red-50 { background-color: rgb(254 242 242); }\n .dark .dark\\\\:bg-red-900\\\\/20 { background-color: rgb(127 29 29 / 0.2); }\n .border-red-200 { border-color: rgb(254 202 202); }\n .dark .dark\\\\:border-red-800 { border-color: rgb(153 27 27); }\n .text-red-400 { color: rgb(248 113 113); }\n .text-red-800 { color: rgb(153 27 27); }\n .dark .dark\\\\:text-red-200 { color: rgb(254 202 202); }\n .text-red-700 { color: rgb(185 28 28); }\n .dark .dark\\\\:text-red-300 { color: rgb(252 165 165); }\n .mt-4 { margin-top: 1rem; }\n .bg-red-600 { background-color: rgb(220 38 38); }\n .hover\\\\:bg-red-700:hover { background-color: rgb(185 28 28); }\n .text-white { color: rgb(255 255 255); }\n .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }\n .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }\n .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\n .px-4 { padding-left: 1rem; padding-right: 1rem; }\n .rounded { border-radius: 0.25rem; }\n .rounded-full { border-radius: 9999px; }\n .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }\n .bg-yellow-50 { background-color: rgb(254 252 232); }\n .dark .dark\\\\:bg-yellow-900\\\\/20 { background-color: rgb(133 77 14 / 0.2); }\n .border-yellow-200 { border-color: rgb(254 240 138); }\n .dark .dark\\\\:border-yellow-800 { border-color: rgb(133 77 14); }\n .text-yellow-400 { color: rgb(250 204 21); }\n .text-yellow-800 { color: rgb(133 77 14); }\n .dark .dark\\\\:text-yellow-200 { color: rgb(254 240 138); }\n .text-yellow-700 { color: rgb(161 98 7); }\n .dark .dark\\\\:text-yellow-300 { color: rgb(253 224 71); }\n .space-x-3 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.75rem; }\n .space-x-1 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.25rem; }\n .space-x-2 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.5rem; }\n .bg-yellow-600 { background-color: rgb(202 138 4); }\n .hover\\\\:bg-yellow-700:hover { background-color: rgb(161 98 7); }\n .disabled\\\\:opacity-50:disabled { opacity: 0.5; }\n .h-3 { height: 0.75rem; }\n .w-3 { width: 0.75rem; }\n .animate-spin { animation: spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n .bg-gray-600 { background-color: rgb(75 85 99); }\n .hover\\\\:bg-gray-700:hover { background-color: rgb(55 65 81); }\n .bg-blue-50 { background-color: rgb(239 246 255); }\n .dark .dark\\\\:bg-blue-900\\\\/20 { background-color: rgb(30 58 138 / 0.2); }\n .border-blue-200 { border-color: rgb(191 219 254); }\n .dark .dark\\\\:border-blue-800 { border-color: rgb(30 64 175); }\n .text-blue-600 { color: rgb(37 99 235); }\n .block { display: block; }\n .text-blue-700 { color: rgb(29 78 216); }\n .dark .dark\\\\:text-blue-300 { color: rgb(147 197 253); }\n .text-xs { font-size: 0.75rem; line-height: 1rem; }\n .dark .dark\\\\:text-blue-400 { color: rgb(96 165 250); }\n .mt-1 { margin-top: 0.25rem; }\n .bg-teal-600 { background-color: rgb(13 148 136); }\n .hover\\\\:bg-teal-700:hover { background-color: rgb(15 118 110); }\n .bg-green-600 { background-color: rgb(22 163 74); }\n .hover\\\\:bg-green-700:hover { background-color: rgb(21 128 61); }\n .bg-yellow-500 { background-color: rgb(234 179 8); }\n .hover\\\\:bg-yellow-600:hover { background-color: rgb(202 138 4); }\n .bg-gradient-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); }\n .from-orange-400 { --tw-gradient-from: #fb923c; --tw-gradient-to: rgb(251 146 60 / 0); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }\n .to-pink-500 { --tw-gradient-to: #ec4899; }\n .hover\\\\:from-orange-500:hover { --tw-gradient-from: #f97316; --tw-gradient-to: rgb(249 115 22 / 0); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }\n .hover\\\\:to-pink-600:hover { --tw-gradient-to: #db2777; }\n .opacity-50 { opacity: 0.5; }\n .cursor-not-allowed { cursor: not-allowed; }\n`;\n\n// Inject styles only once\nlet stylesInjected = false;\nconst injectTailwindStyles = () => {\n if (!stylesInjected && typeof document !== 'undefined') {\n const styleElement = document.createElement('style');\n styleElement.textContent = tailwindStyles;\n document.head.appendChild(styleElement);\n stylesInjected = true;\n }\n};\n\nconst AudioRecorder: React.FC<AudioRecorderProps> = ({\n apiKey,\n apiBaseUrl,\n speciality,\n patientId,\n patientName,\n patientHistory,\n selectedFormat = \"json\",\n onTranscriptionUpdate,\n onTranscriptionComplete,\n onSuccess,\n onError,\n className = \"\",\n style,\n}) => {\n // Inject Tailwind styles on component mount\n React.useEffect(() => {\n injectTailwindStyles();\n }, []);\n\n const {\n mediaStreamRef,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isRecording,\n isPaused,\n isProcessing,\n error,\n transcriptionDone,\n availableDevices,\n validateMicrophoneAccess,\n audioLevel,\n noAudioDetected,\n // Add recovery properties\n isRetryingSession,\n showRetrySessionPrompt,\n retryFailedSession,\n clearAllSessions,\n // Add FFmpeg processing status\n isConverting,\n progress,\n statusMessage,\n } = useAudioRecorder({\n apiKey: apiKey,\n apiBaseUrl: apiBaseUrl,\n speciality: speciality,\n patientName: patientName,\n patientId: patientId,\n patientHistory: patientHistory,\n selectedFormat: selectedFormat,\n onTranscriptionUpdate: (text, sessionId) => {\n console.log(\"onTranscriptionUpdate called with text:\", text, \"sessionId:\", sessionId);\n if (text.length > 0) {\n console.log(\"Transcription update:\", text, sessionId);\n onTranscriptionUpdate && onTranscriptionUpdate(text, sessionId);\n }\n },\n onTranscriptionComplete: (text, classification, sessionId) => {\n console.log(\n \"onTranscriptionComplete called with text:\",\n text,\n \"classification:\",\n classification,\n \"sessionId:\",\n sessionId\n );\n onTranscriptionComplete && onTranscriptionComplete(text, classification, sessionId);\n },\n });\n\n const isEmergencyOrInPatient = speciality === \"emergency\" || speciality === \"in_patient\";\n const buttonText = isEmergencyOrInPatient ? \"Start Recording\" : \"Start Transcription\";\n\n const errorHandledRef = React.useRef(false);\n\n const [isDisabled, setIsDisabled] = React.useState(false);\n\n const [userEmail] = React.useState<string>(localStorage.getItem(\"userEmail\") || \"\");\n const isKamcUser = userEmail.toLowerCase().endsWith(\"@kamc.net\");\n\n // Add state for toast notifications\n const [toast, setToast] = React.useState<{\n show: boolean;\n message: string;\n type: \"success\" | \"error\";\n }>({\n show: false,\n message: \"\",\n type: \"success\",\n });\n\n const handleStopClick = () => {\n setIsDisabled(true);\n stopRecording();\n };\n\n const handleStartRecording = () => {\n setIsDisabled(false); // Reset disabled state when starting a new recording\n startRecording();\n };\n\n React.useEffect(() => {\n if (error) {\n setToast({ show: true, message: error, type: \"error\" });\n }\n }, [error]);\n\n React.useEffect(() => {\n if (error && !errorHandledRef.current) {\n errorHandledRef.current = true;\n if (onError) {\n onError(error);\n }\n } else if (!error) {\n errorHandledRef.current = false;\n }\n }, [error, onError]);\n\n // Enhanced error detection to include no audio detection\n const isMicrophoneError =\n error &&\n (error.toLowerCase().includes(\"microphone\") ||\n error.toLowerCase().includes(\"not found\") ||\n error.toLowerCase().includes(\"no audio\") ||\n error.toLowerCase().includes(\"devices not found\") ||\n error.toLowerCase().includes(\"access denied\") ||\n error.toLowerCase().includes(\"permission\") ||\n error.toLowerCase().includes(\"not allowed\") ||\n error.toLowerCase().includes(\"busy\") ||\n error.toLowerCase().includes(\"media devices not supported\") ||\n availableDevices.length === 0 ||\n noAudioDetected);\n\n // Show no audio detected error specifically\n if (noAudioDetected || (error && error.includes(\"No audio input detected\"))) {\n return (\n <div className=\"bg-orange-50 dark:bg-orange-900/20 border border-orange-200 dark:border-orange-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-orange-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-orange-800 dark:text-orange-200\">\n No Audio Input Detected\n </h3>\n <div className=\"mt-2 text-sm text-orange-700 dark:text-orange-300\">\n <p>{error}</p>\n <ul className=\"mt-2 list-disc list-inside\">\n <li>Check if your microphone is properly connected</li>\n <li>Ensure you're speaking close enough to the microphone</li>\n <li>Try adjusting your microphone volume settings</li>\n <li>Test your microphone in other applications</li>\n <li>Make sure your browser has microphone permissions</li>\n <li>Please reload the page and try again</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // Show microphone/audio errors\n if (isMicrophoneError) {\n console.log(\"🔴 Showing microphone error UI\");\n return (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-red-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-red-800 dark:text-red-200\">\n Audio Input Issue\n </h3>\n <div className=\"mt-2 text-sm text-red-700 dark:text-red-300\">\n <p>{error}</p>\n </div>\n <div className=\"mt-4\">\n <button\n onClick={() => {\n console.log(\"🔄 Check Again button clicked\");\n validateMicrophoneAccess();\n }}\n className=\"bg-red-600 hover:bg-red-700 text-white px-3 py-1 rounded text-sm transition-colors\"\n >\n Check Again\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // // Show authentication error separately\n // if (error && error.includes(\"authentication failed\")) {\n // return (\n // <div className=\"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4\">\n // <div className=\"flex items-start\">\n // <div className=\"flex-shrink-0\">\n // <AlertTriangle className=\"h-5 w-5 text-yellow-400\" />\n // </div>\n // <div className=\"ml-3\">\n // <h3 className=\"text-sm font-medium text-yellow-800 dark:text-yellow-200\">\n // Service Configuration Required\n // </h3>\n // <div className=\"mt-2 text-sm text-yellow-700 dark:text-yellow-300\">\n // <p>\n // The transcription service requires proper configuration. Please contact your system\n // administrator.\n // </p>\n // </div>\n // </div>\n // </div>\n // </div>\n // );\n // }\n\n const closeToast = () => {\n setToast({ ...toast, show: false });\n };\n\n return (\n <div className=\"space-y-4\">\n {toast.show && (\n <Toast message={toast.message} type={toast.type} onClose={closeToast} duration={1} />\n )}\n {showRetrySessionPrompt && (\n <div className=\"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-yellow-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-yellow-800 dark:text-yellow-200\">\n Recording Sessions Available for Retry\n </h3>\n <div className=\"mt-2 text-sm text-yellow-700 dark:text-yellow-300\">\n <p>\n Recording session failed to complete transcription. Your audio has been saved\n offline and can be retried.\n </p>\n </div>\n <div className=\"mt-4 flex space-x-3\">\n <button\n onClick={retryFailedSession}\n disabled={isRetryingSession}\n className=\"flex items-center space-x-1 bg-yellow-600 hover:bg-yellow-700 text-white px-3 py-2 rounded text-sm transition-colors disabled:opacity-50\"\n >\n {isRetryingSession && <Loader2 className=\"h-3 w-3 animate-spin\" />}\n <span>{isRetryingSession ? \"Retrying...\" : \"Retry Transcription\"}</span>\n </button>\n <button\n onClick={clearAllSessions}\n className=\"bg-gray-600 hover:bg-gray-700 text-white px-3 py-2 rounded text-sm transition-colors\"\n >\n Clear Saved Sessions\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n {/* Show retry status */}\n {isRetryingSession && (\n <div className=\"flex items-center justify-center space-x-2 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4\">\n <Loader2 className=\"animate-spin h-5 w-5 text-blue-600\" />\n <div className=\"text-center\">\n <span className=\"block text-sm font-medium text-blue-700 dark:text-blue-300\">\n Retrying transcription with saved audio...\n </span>\n <span className=\"block text-xs text-blue-600 dark:text-blue-400 mt-1\">\n Please wait while we process your recording\n </span>\n </div>\n </div>\n )}\n {isRecording && !isPaused && mediaStreamRef.current && (\n <div\n className={`audio-recorder-container ${isRecording && !isPaused ? \"glow-active\" : \"\"}`}\n >\n <div className=\"edge-container\">\n <div className=\"edge edge-top\" />\n <div className=\"edge edge-right\" />\n <div className=\"edge edge-bottom\" />\n <div className=\"edge edge-left\" />\n </div>\n <div className=\"flex justify-center items-center\">\n <AudioVisualizerImproved\n mediaStream={mediaStreamRef.current}\n isRecording={isRecording && !isPaused} // Keep running even during FFmpeg processing!\n forceLight={false}\n />\n </div>\n </div>\n )}\n <div className=\"flex justify-center\">\n {isProcessing ? (\n <div className=\"flex items-center justify-center space-x-2 bg-teal-600 hover:bg-teal-700 text-white py-2 px-4 rounded-full\">\n <Loader2 className=\"animate-spin h-5 w-5\" />\n <span>Processing...</span>\n </div>\n ) : transcriptionDone ? (\n <div className=\"flex items-center justify-center space-x-2 bg-green-600 text-white py-2 px-4 rounded-full\">\n <span>Transcription Complete</span>\n </div>\n ) : isRecording || isPaused ? (\n <div className=\"flex space-x-2\">\n <button\n className={`flex items-center justify-center space-x-2 bg-red-600 hover:bg-red-700 text-white py-2 px-4 rounded-full transition-colors ${\n isDisabled ? \"opacity-50 cursor-not-allowed\" : \"\"\n }`}\n onClick={handleStopClick}\n disabled={isDisabled}\n >\n <Square className=\"h-5 w-5\" />\n <span>Stop</span>\n </button>\n {!isKamcUser &&\n (!isPaused ? (\n <button\n className=\"flex items-center justify-center space-x-2 bg-yellow-500 hover:bg-yellow-600 text-white py-2 px-4 rounded-full transition-colors\"\n onClick={pauseRecording}\n >\n <Pause className=\"h-5 w-5\" />\n <span>Pause</span>\n </button>\n ) : (\n <button\n className=\"flex items-center justify-center space-x-2 bg-green-600 hover:bg-green-700 text-white py-2 px-4 rounded-full transition-colors\"\n onClick={resumeRecording}\n >\n <Play className=\"h-5 w-5\" />\n <span>Resume</span>\n </button>\n ))}\n </div>\n ) : (\n <button\n className={\n className\n ? `flex items-center justify-center space-x-2 py-2 px-4 rounded-full transition-colors ${className}`\n : \"flex items-center justify-center space-x-2 bg-gradient-to-r from-orange-400 to-pink-500 hover:bg-gradient-to-r hover:from-orange-500 hover:to-pink-600 text-white py-2 px-4 rounded-full transition-colors\"\n }\n onClick={handleStartRecording}\n >\n <Mic className=\"h-5 w-5\" />\n <span>{buttonText}</span>\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default AudioRecorder;\n","import { useEffect, useRef, useState } from \"react\";\nimport useHL7FHIRConverter from \"./useHL7FHIRConverter\";\n\nconst API_BASE_URL = \"https://nuxera.cloud\";\n\ninterface AudioDictationHookProps {\n onDictationComplete: (message: string) => void;\n onDictationStart?: () => void;\n onProcessingStart?: () => void;\n onError?: (error: string) => void;\n\n apiKey?: string;\n apiBaseUrl?: string;\n appendMode?: boolean;\n // Add new props for HL7/FHIR support\n doctorName?: string;\n patientId?: string;\n sessionId?: string;\n language?: string;\n specialty?: string;\n selectedFormat?: \"json\" | \"hl7\" | \"fhir\";\n}\n\nconst useAudioDictation = ({\n onDictationComplete,\n onDictationStart,\n onProcessingStart,\n onError,\n apiKey,\n apiBaseUrl = API_BASE_URL,\n appendMode = true,\n doctorName = \"asad\",\n patientId,\n sessionId,\n language,\n specialty,\n selectedFormat = \"json\",\n}: AudioDictationHookProps) => {\n const [dictationError, setDictationError] = useState<string | null>(null);\n const [isDictating, setIsDictating] = useState<boolean>(false);\n const [isProcessing, setIsProcessing] = useState<boolean>(false);\n const audioContextRef = useRef<AudioContext | null>(null);\n const processorRef = useRef<AudioWorkletNode | null>(null);\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const audioSamplesRef = useRef<Float32Array[]>([]);\n\n const [audioBuffer, setAudioBuffer] = useState<Float32Array | null>(null);\n\n const { createHL7DictationRequest, createFHIRDictationRequest, convertDictationResponse } =\n useHL7FHIRConverter();\n\n // Use the provided apiKey or fall back to selectedApiKey\n const effectiveApiKey = apiKey;\n\n // Add cleanup effect for audio resources\n useEffect(() => {\n return () => {\n // Clean up on component unmount\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach((track) => track.stop());\n mediaStreamRef.current = null;\n }\n\n if (processorRef.current) {\n try {\n processorRef.current.disconnect();\n } catch (e) {\n console.error(\"Error disconnecting processor:\", e);\n }\n processorRef.current = null;\n }\n\n // Only close if the context is not already closed\n if (audioContextRef.current && audioContextRef.current.state !== \"closed\") {\n try {\n audioContextRef.current.close();\n } catch (e) {\n console.error(\"Error closing AudioContext:\", e);\n }\n }\n audioContextRef.current = null;\n };\n }, []);\n\n const startDictating = async () => {\n try {\n console.log(\"Starting recording\");\n // Reset audio chunks and buffer\n setAudioBuffer(null);\n audioSamplesRef.current = [];\n\n // Clear any previous errors\n setDictationError(null);\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n mediaStreamRef.current = stream;\n\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n console.log(\"Loading audio-processor.js module...\");\n try {\n await audioContext.audioWorklet.addModule(\"/audio-processor.js\");\n console.log(\"Audio worklet module loaded successfully\");\n } catch (err) {\n console.error(\"Error loading audio worklet module:\", err);\n throw err;\n }\n\n const processor = new AudioWorkletNode(audioContext, \"audio-processor\");\n processor.port.onmessage = (event) => {\n console.log(\"Received message from processor:\", event.data.command);\n\n if (event.data.audioBuffer) {\n console.log(\"Received audio buffer\", event.data.audioBuffer.length);\n audioSamplesRef.current.push(new Float32Array(event.data.audioBuffer));\n }\n\n if (event.data.command === \"finalChunk\") {\n console.log(\"Received final chunk\");\n\n if (event.data.audioBuffer) {\n // Add the final chunk to our samples\n audioSamplesRef.current.push(new Float32Array(event.data.audioBuffer));\n }\n\n // Combine all samples into a single buffer\n const totalLength = audioSamplesRef.current.reduce(\n (acc, buffer) => acc + buffer.length,\n 0\n );\n\n if (totalLength > 0) {\n const combinedBuffer = new Float32Array(totalLength);\n let offset = 0;\n\n audioSamplesRef.current.forEach((buffer) => {\n combinedBuffer.set(buffer, offset);\n offset += buffer.length;\n });\n\n console.log(\"Combined buffer length:\", combinedBuffer.length);\n setAudioBuffer(combinedBuffer);\n } else {\n console.warn(\"Final chunk received but no audio data accumulated\");\n const errorMessage = \"No audio data was recorded\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n }\n };\n\n const source = audioContext.createMediaStreamSource(stream);\n source.connect(processor);\n\n audioContextRef.current = audioContext;\n processorRef.current = processor;\n\n setIsDictating(true);\n onDictationStart?.();\n console.log(\"Recording started successfully\");\n } catch (error) {\n console.error(\"Error starting dictation:\", error);\n setIsDictating(false);\n const errorMessage = \"An error occurred while starting dictation\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n };\n\n // Updated function to stop dictation\n const stopDictating = async () => {\n console.log(\"Stopping dictation\");\n\n try {\n // Send stop command to processor FIRST (before stopping tracks)\n if (processorRef.current) {\n console.log(\"Sending stop command to processor\");\n processorRef.current.port.postMessage({ command: \"stop\" });\n\n // Wait a bit for the processor to send the final chunk\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n // THEN stop media stream tracks\n if (mediaStreamRef.current) {\n console.log(\"Stopping media stream tracks\");\n mediaStreamRef.current.getTracks().forEach((track) => {\n track.stop();\n console.log(\"Track stopped:\", track.kind, track.readyState);\n });\n mediaStreamRef.current = null;\n }\n\n // Clean up processor\n if (processorRef.current) {\n console.log(\"Disconnecting processor\");\n try {\n processorRef.current.disconnect();\n processorRef.current = null;\n } catch (e) {\n console.error(\"Error disconnecting processor:\", e);\n processorRef.current = null;\n }\n }\n\n // Close audio context\n if (audioContextRef.current) {\n console.log(\"Closing audio context, current state:\", audioContextRef.current.state);\n try {\n if (audioContextRef.current.state !== \"closed\") {\n await audioContextRef.current.close();\n console.log(\"Audio context closed successfully\");\n }\n } catch (e) {\n console.error(\"Error closing AudioContext:\", e);\n }\n audioContextRef.current = null;\n }\n\n // Wait a bit more to ensure audioBuffer state is updated\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n // Check if we have audio data\n if (audioBuffer && audioBuffer.length > 0) {\n console.log(`Processing audio buffer of size ${audioBuffer.length} samples`);\n await processDictationAudio(audioBuffer);\n } else if (audioSamplesRef.current.length > 0) {\n console.log(\"No audio buffer but have samples, combining now\");\n const totalLength = audioSamplesRef.current.reduce((acc, buffer) => acc + buffer.length, 0);\n\n if (totalLength > 0) {\n const combinedBuffer = new Float32Array(totalLength);\n let offset = 0;\n\n audioSamplesRef.current.forEach((buffer) => {\n combinedBuffer.set(buffer, offset);\n offset += buffer.length;\n });\n\n console.log(`Created combined buffer of size ${combinedBuffer.length} samples`);\n await processDictationAudio(combinedBuffer);\n } else {\n console.error(\"No valid audio data found\");\n const errorMessage = \"No audio data recorded\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n } else {\n console.error(\"No audio data to process\");\n const errorMessage = \"No audio data to process\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n } catch (error) {\n console.error(\"Error stopping recording:\", error);\n const errorMessage = \"An error occurred while stopping dictation\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n } finally {\n setIsDictating(false);\n audioSamplesRef.current = [];\n setAudioBuffer(null);\n }\n };\n\n // Move encodeWAV function (unchanged)\n const encodeWAV = (samples: Float32Array) => {\n console.log(`Encoding WAV with ${samples.length} samples`);\n const sampleRate = audioContextRef.current?.sampleRate || 44100;\n console.log(`Using sample rate: ${sampleRate}Hz`);\n\n const buffer = new ArrayBuffer(44 + samples.length * 2);\n const view = new DataView(buffer);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, \"RIFF\");\n view.setUint32(4, 36 + samples.length * 2, true);\n writeString(8, \"WAVE\");\n writeString(12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, \"data\");\n view.setUint32(40, samples.length * 2, true);\n\n let offset = 44;\n for (let i = 0; i < samples.length; i++) {\n const sample = Math.max(-1, Math.min(1, samples[i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n offset += 2;\n }\n\n const wavBlob = new Blob([view], { type: \"audio/wav\" });\n console.log(`Created WAV blob: ${(wavBlob.size / 1024).toFixed(2)} KB`);\n return wavBlob;\n };\n\n // Updated processDictationAudio function to support different formats\n const processDictationAudio = async (audioData: Float32Array) => {\n try {\n console.log(`Processing dictation with audio data length: ${audioData.length}`);\n console.log(`Using format: ${selectedFormat}`);\n setIsProcessing(true);\n onProcessingStart?.();\n\n const wavBlob = encodeWAV(audioData);\n console.log(`Sending audio to dictation API (${wavBlob.size / 1024} KB)`);\n\n // Prepare request data\n const requestData = {\n doctorName,\n patientId,\n sessionId,\n language,\n specialty,\n };\n\n let requestBody: FormData;\n let headers: Record<string, string> = {\n \"x-api-key\": effectiveApiKey || \"\",\n };\n\n // Create request based on selected format\n switch (selectedFormat) {\n case \"hl7\":\n requestBody = createHL7DictationRequest(\n new File([wavBlob], \"dictation.wav\", { type: \"audio/wav\" }),\n requestData\n );\n headers[\"x-request-format\"] = \"hl7\";\n headers[\"x-response-format\"] = \"hl7\";\n console.log(\"Created HL7-formatted dictation request\");\n break;\n\n case \"fhir\":\n requestBody = createFHIRDictationRequest(\n new File([wavBlob], \"dictation.wav\", { type: \"audio/wav\" }),\n requestData\n );\n headers[\"x-request-format\"] = \"fhir\";\n headers[\"x-response-format\"] = \"fhir\";\n console.log(\"Created FHIR-formatted dictation request\");\n break;\n\n case \"json\":\n default:\n requestBody = new FormData();\n requestBody.append(\"audio\", wavBlob);\n requestBody.append(\"doctorName\", doctorName);\n if (patientId) requestBody.append(\"patientId\", patientId);\n if (sessionId) requestBody.append(\"sessionId\", sessionId);\n if (language) requestBody.append(\"language\", language);\n if (specialty) requestBody.append(\"specialty\", specialty);\n\n headers[\"x-request-format\"] = \"json\";\n headers[\"x-response-format\"] = \"json\";\n console.log(\"Created JSON-formatted dictation request\");\n break;\n }\n\n console.log(\"Request headers:\", headers);\n console.log(\"Sending request to API...\");\n\n const response = await fetch(`${apiBaseUrl}/api/dictate`, {\n method: \"POST\",\n body: requestBody,\n headers,\n });\n\n console.log(\"API response status:\", response.status);\n if (!response.ok) {\n throw new Error(`API request failed with status ${response.status}`);\n }\n\n // Handle different response formats\n let responseData: any;\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n if (selectedFormat === \"json\" || contentType.includes(\"application/json\")) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n\n console.log(\"Raw API response data:\", responseData);\n\n // Convert response using the converter\n const convertedData = convertDictationResponse(responseData, selectedFormat);\n console.log(\"Converted response data:\", convertedData);\n\n if (convertedData.dictation) {\n console.log(\"Dictation text received:\", convertedData.dictation);\n // Pass the dictation text to the callback\n // The parent component will handle appending/replacing\n onDictationComplete(convertedData.dictation);\n } else {\n console.error(\"No dictation text in response\");\n const errorMessage = \"No dictation text in response\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n }\n } catch (error) {\n console.error(\"Error processing dictation audio:\", error);\n const errorMessage = \"An error occurred while processing dictation\";\n setDictationError(errorMessage);\n onError?.(errorMessage);\n } finally {\n setIsProcessing(false);\n setIsDictating(false);\n }\n };\n\n return { startDictating, stopDictating, dictationError, isDictating, isProcessing };\n};\n\nexport default useAudioDictation;\n","import * as React from \"react\";\nimport { Mic, Square, Loader2, AlertTriangle } from \"lucide-react\";\nimport useAudioDictation from \"./hooks/useAudioDictation\";\n\nexport interface AudioDictationProps {\n apiKey?: string;\n apiBaseUrl?: string;\n appendMode?: boolean;\n doctorName?: string;\n patientId?: string;\n sessionId?: string;\n language?: string;\n specialty?: string;\n selectedFormat?: \"json\" | \"hl7\" | \"fhir\";\n onDictationComplete: (message: string) => void;\n onDictationStart?: () => void;\n onProcessingStart?: () => void;\n onError?: (error: string) => void;\n className?: string;\n style?: React.CSSProperties;\n buttonText?: string;\n placeholder?: string;\n}\n\n// Embedded minimal Tailwind utilities for dictation component\nconst dictationStyles = `\n .dictation-button-recording {\n background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);\n background-size: 400% 400%;\n animation: gradientShift 2s ease infinite;\n }\n \n @keyframes gradientShift {\n 0% { background-position: 0% 50%; }\n 50% { background-position: 100% 50%; }\n 100% { background-position: 0% 50%; }\n }\n\n .dictation-pulse {\n animation: dictationPulse 1.5s ease-in-out infinite;\n }\n\n @keyframes dictationPulse {\n 0%, 100% { transform: scale(1); opacity: 1; }\n 50% { transform: scale(1.05); opacity: 0.8; }\n }\n\n .bg-blue-600 { background-color: rgb(37 99 235); }\n .hover\\\\:bg-blue-700:hover { background-color: rgb(29 78 216); }\n .bg-red-600 { background-color: rgb(220 38 38); }\n .hover\\\\:bg-red-700:hover { background-color: rgb(185 28 28); }\n .bg-gray-600 { background-color: rgb(75 85 99); }\n .hover\\\\:bg-gray-700:hover { background-color: rgb(55 65 81); }\n .text-white { color: rgb(255 255 255); }\n .flex { display: flex; }\n .items-center { align-items: center; }\n .justify-center { justify-content: center; }\n .space-x-2 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.5rem; }\n .px-4 { padding-left: 1rem; padding-right: 1rem; }\n .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\n .rounded-lg { border-radius: 0.5rem; }\n .rounded-full { border-radius: 9999px; }\n .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }\n .duration-200 { transition-duration: 200ms; }\n .disabled\\\\:opacity-50:disabled { opacity: 0.5; }\n .disabled\\\\:cursor-not-allowed:disabled { cursor: not-allowed; }\n .h-5 { height: 1.25rem; }\n .w-5 { width: 1.25rem; }\n .h-6 { height: 1.5rem; }\n .w-6 { width: 1.5rem; }\n .text-sm { font-size: 0.875rem; line-height: 1.25rem; }\n .font-medium { font-weight: 500; }\n .animate-spin { animation: spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n .bg-red-50 { background-color: rgb(254 242 242); }\n .border { border-width: 1px; }\n .border-red-200 { border-color: rgb(254 202 202); }\n .text-red-800 { color: rgb(153 27 27); }\n .text-red-700 { color: rgb(185 28 28); }\n .p-3 { padding: 0.75rem; }\n .mt-2 { margin-top: 0.5rem; }\n .text-xs { font-size: 0.75rem; line-height: 1rem; }\n`;\n\n// Inject dictation styles only once\nlet dictationStylesInjected = false;\nconst injectDictationStyles = () => {\n if (!dictationStylesInjected && typeof document !== \"undefined\") {\n const styleElement = document.createElement(\"style\");\n styleElement.textContent = dictationStyles;\n document.head.appendChild(styleElement);\n dictationStylesInjected = true;\n }\n};\n\nconst AudioDictation: React.FC<AudioDictationProps> = ({\n apiKey,\n apiBaseUrl,\n appendMode = true,\n doctorName = \"doctor\",\n patientId,\n sessionId,\n language = \"en\",\n specialty = \"general\",\n selectedFormat = \"json\",\n onDictationComplete,\n onDictationStart,\n onProcessingStart,\n onError,\n className = \"\",\n style,\n buttonText,\n placeholder = \"Click to dictate...\",\n}) => {\n // Inject styles on component mount\n React.useEffect(() => {\n injectDictationStyles();\n }, []);\n\n const { startDictating, stopDictating, dictationError, isDictating, isProcessing } = useAudioDictation({\n onDictationComplete,\n onDictationStart,\n onProcessingStart,\n onError,\n apiKey,\n apiBaseUrl,\n appendMode,\n doctorName,\n patientId,\n sessionId,\n language,\n specialty,\n selectedFormat,\n });\n\n // Handle click to toggle dictation\n const handleToggleDictation = (e: React.MouseEvent) => {\n e.preventDefault();\n if (isProcessing) return;\n\n if (isDictating) {\n stopDictating();\n } else {\n startDictating();\n }\n };\n\n const getButtonContent = () => {\n if (isProcessing) {\n return (\n <>\n <Loader2 className=\"h-5 w-5 animate-spin\" />\n </>\n );\n }\n\n if (isDictating) {\n return (\n <>\n <Square className=\"h-5 w-5\" />\n </>\n );\n }\n\n return (\n <>\n <Mic className=\"h-5 w-5\" />\n </>\n );\n };\n\n const getButtonClass = () => {\n const baseClass =\n \"flex items-center justify-center space-x-2 px-4 py-2 rounded-lg font-medium transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed\";\n\n if (className) {\n return `${baseClass} ${className}`;\n }\n\n if (isProcessing) {\n return `${baseClass} bg-gray-600 text-white`;\n }\n\n if (isDictating) {\n return `${baseClass} dictation-button-recording text-white dictation-pulse`;\n }\n\n return `${baseClass} bg-blue-600 hover:bg-blue-700 text-white`;\n };\n\n if (dictationError) {\n return (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <div className=\"flex items-center space-x-2\">\n <AlertTriangle className=\"h-5 w-5 text-red-600\" />\n <div>\n <p className=\"text-sm font-medium text-red-800\">Dictation Error</p>\n <p className=\"text-xs text-red-700 mt-1\">{dictationError}</p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div style={style}>\n <button\n className={getButtonClass()}\n onClick={handleToggleDictation}\n disabled={isProcessing}\n title={isDictating ? \"Click to stop dictating\" : placeholder}\n >\n {getButtonContent()}\n </button>\n </div>\n );\n};\n\nexport default AudioDictation;\n","import React, { useState, useRef, useCallback, MutableRefObject } from \"react\";\nimport useFFmpegConverter from \"./useFFmpegConverter\";\n\ninterface AudioCaptureHookProps {\n onAudioChunk?: (audioData: Float32Array, sequence: number, isFinal: boolean) => void;\n onAudioComplete?: (finalAudio: Float32Array) => void;\n onAudioFile?: (audioFile: File) => void;\n silenceRemoval?: boolean;\n chunkDuration?: number; // Duration in seconds for each chunk\n format?: \"raw\" | \"wav\"; // Output format\n}\n\ninterface UseAudioCaptureReturn {\n mediaStreamRef: MutableRefObject<MediaStream | null>;\n startRecording: () => void;\n stopRecording: () => void;\n pauseRecording: () => void;\n resumeRecording: () => void;\n isRecording: boolean;\n isPaused: boolean;\n isProcessing: boolean;\n error: string | null;\n \n // Microphone properties\n availableDevices: MediaDeviceInfo[];\n currentDeviceId: string | null;\n selectMicrophone: (deviceId: string) => Promise<void>;\n validateMicrophoneAccess: () => Promise<boolean>;\n audioLevel: number;\n noAudioDetected: boolean;\n\n // FFmpeg status properties\n isConverting: boolean;\n progress: number;\n statusMessage: string;\n\n // Audio data properties\n recordingDuration: number;\n totalChunks: number;\n}\n\n// Embedded Audio Processor Worker for capturing audio\nconst createAudioCaptureWorker = () => {\n const workerCode = `\n class AudioCaptureProcessor extends AudioWorkletProcessor {\n constructor() {\n super();\n this._buffer = [];\n this._isStopped = false;\n this._isPaused = false;\n this._chunkReady = false;\n this._processingChunk = false;\n \n this._audioLevelCheckInterval = 0;\n this._audioLevelCheckFrequency = 128;\n this._silentSampleCount = 0;\n this._maxSilentSamples = 44100 * 30;\n this._audioThreshold = 0.002;\n this._hasDetectedAudio = false;\n this._lastAudioTime = 0;\n this._recordingStartTime = Date.now();\n this._initialSilenceThreshold = 44100 * 10;\n this._isInitialPhase = true;\n this._bufferSize = 0;\n\n this.port.onmessage = (event) => {\n if (event.data.command === \"stop\") {\n this._isStopped = true;\n this._sendFinalChunk();\n }\n\n if (event.data.command === \"getChunk\") {\n this._chunkReady = true;\n }\n\n if (event.data.command === \"resetChunk\") {\n this._chunkReady = false;\n this._processingChunk = false;\n this._buffer = [];\n this._bufferSize = 0;\n }\n\n if (event.data.command === \"pause\") {\n this._isPaused = true;\n }\n\n if (event.data.command === \"resume\") {\n this._isPaused = false;\n }\n };\n }\n\n _sendFinalChunk() {\n if (this._buffer.length > 0) {\n const flat = this._flattenBuffer();\n this.port.postMessage({\n command: \"finalChunk\",\n audioBuffer: flat.buffer,\n duration: this._bufferSize / 44100\n }, [flat.buffer]);\n } else {\n // Send empty final chunk\n const emptyBuffer = new Float32Array(1000);\n this.port.postMessage({\n command: \"finalChunk\", \n audioBuffer: emptyBuffer.buffer,\n duration: 0\n }, [emptyBuffer.buffer]);\n }\n this._buffer = [];\n this._bufferSize = 0;\n }\n\n _flattenBuffer() {\n let totalLength = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n totalLength += this._buffer[i].length;\n }\n \n const flat = new Float32Array(totalLength);\n let offset = 0;\n for (let i = 0; i < this._buffer.length; i++) {\n flat.set(this._buffer[i], offset);\n offset += this._buffer[i].length;\n }\n return flat;\n }\n\n process(inputs, outputs) {\n if (this._isStopped || this._isPaused) {\n return true;\n }\n\n const input = inputs[0];\n if (input && input.length > 0) {\n const samples = input[0];\n \n // Calculate audio level\n let audioLevel = 0;\n for (let i = 0; i < samples.length; i++) {\n audioLevel += Math.abs(samples[i]);\n }\n audioLevel /= samples.length;\n\n // Send audio level updates\n this._audioLevelCheckInterval++;\n if (this._audioLevelCheckInterval >= this._audioLevelCheckFrequency) {\n this.port.postMessage({\n command: \"audioLevel\",\n level: audioLevel,\n });\n this._audioLevelCheckInterval = 0;\n }\n\n // Check for audio activity\n if (audioLevel > this._audioThreshold) {\n this._hasDetectedAudio = true;\n this._isInitialPhase = false;\n this._silentSampleCount = 0;\n this._lastAudioTime = Date.now();\n } else {\n this._silentSampleCount += samples.length;\n \n if (this._isInitialPhase && this._silentSampleCount > this._initialSilenceThreshold) {\n this.port.postMessage({\n command: \"noAudioDetected\",\n message: \"No audio input detected after 10 seconds. Please check your microphone.\"\n });\n return true;\n }\n }\n\n // Buffer the audio\n this._buffer.push(new Float32Array(samples));\n this._bufferSize += samples.length;\n\n // Send chunk if ready\n if (this._chunkReady && !this._processingChunk) {\n this._processingChunk = true;\n \n const flat = this._flattenBuffer();\n this.port.postMessage({\n command: \"chunk\",\n audioBuffer: flat.buffer,\n duration: this._bufferSize / 44100,\n hasActivity: audioLevel > this._audioThreshold\n }, [flat.buffer]);\n \n this._buffer = [];\n this._bufferSize = 0;\n this._chunkReady = false;\n this._processingChunk = false;\n }\n }\n\n return true;\n }\n }\n\n registerProcessor(\"audio-capture-processor\", AudioCaptureProcessor);\n `;\n\n const blob = new Blob([workerCode], { type: \"application/javascript\" });\n return URL.createObjectURL(blob);\n};\n\nconst useAudioCapture = ({\n onAudioChunk,\n onAudioComplete,\n onAudioFile,\n silenceRemoval = false,\n chunkDuration = 30, // Default 30 seconds per chunk\n format = \"raw\"\n}: AudioCaptureHookProps): UseAudioCaptureReturn => {\n const [isRecording, setIsRecording] = useState(false);\n const [isPaused, setIsPaused] = useState(false);\n const [isProcessing, setIsProcessing] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [currentDeviceId, setCurrentDeviceId] = useState<string | null>(null);\n const [availableDevices, setAvailableDevices] = useState<MediaDeviceInfo[]>([]);\n const [audioLevel, setAudioLevel] = useState<number>(0);\n const [noAudioDetected, setNoAudioDetected] = useState(false);\n const [recordingDuration, setRecordingDuration] = useState(0);\n const [totalChunks, setTotalChunks] = useState(0);\n\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const processorRef = useRef<AudioWorkletNode | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const chunkIntervalRef = useRef<number | null>(null);\n const recordingStartTimeRef = useRef<number>(0);\n const durationIntervalRef = useRef<number | null>(null);\n const sequenceCounterRef = useRef(0);\n const allAudioChunksRef = useRef<Float32Array[]>([]);\n\n const {\n removeSilence,\n isLoaded,\n isConverting,\n progress,\n statusMessage,\n convertToWav,\n } = useFFmpegConverter();\n\n // Validate microphone access\n const validateMicrophoneAccess = useCallback(async (): Promise<boolean> => {\n try {\n const devices = await navigator.mediaDevices.enumerateDevices();\n const audioInputDevices = devices.filter((device) => device.kind === \"audioinput\");\n\n setAvailableDevices(audioInputDevices);\n\n if (audioInputDevices.length === 0) {\n throw new Error(\"No microphone devices detected. Please connect a microphone.\");\n }\n\n const testStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: currentDeviceId ? { exact: currentDeviceId } : undefined,\n },\n });\n\n const audioTracks = testStream.getAudioTracks();\n if (audioTracks.length > 0) {\n const track = audioTracks[0];\n const settings = track.getSettings();\n setCurrentDeviceId(settings.deviceId || null);\n }\n\n testStream.getTracks().forEach((track) => track.stop());\n return true;\n } catch (error) {\n console.error(\"Microphone validation failed:\", error);\n\n if (error instanceof Error) {\n let errorMessage = \"\";\n if (error.name === \"NotFoundError\" || error.name === \"DevicesNotFoundError\") {\n errorMessage = \"No microphone devices found. Please connect a microphone.\";\n } else if (error.name === \"NotAllowedError\" || error.name === \"PermissionDeniedError\") {\n errorMessage = \"Microphone permission denied. Please allow access and try again.\";\n } else if (error.name === \"NotReadableError\" || error.name === \"TrackStartError\") {\n errorMessage = \"Microphone is busy or unavailable. Please close other applications using the microphone.\";\n } else if (error.name === \"OverconstrainedError\") {\n errorMessage = \"Selected microphone device is not available. Please select a different device.\";\n } else {\n errorMessage = `Microphone error: ${error.message}`;\n }\n setError(errorMessage);\n } else {\n setError(\"Microphone access error occurred.\");\n }\n return false;\n }\n }, [currentDeviceId]);\n\n // Process audio chunk\n const processAudioChunk = useCallback(async (\n audioData: Float32Array,\n sequence: number,\n isFinal: boolean\n ) => {\n try {\n setIsProcessing(true);\n \n let processedAudio = audioData;\n\n // Apply silence removal if enabled and FFmpeg is loaded\n if (silenceRemoval && isLoaded && typeof removeSilence === \"function\") {\n console.log(\"Applying silence removal to audio chunk...\");\n \n // Convert Float32Array to temporary file for processing\n const tempFile = float32ToWavFile(audioData);\n const processedFile = await removeSilence(tempFile);\n \n if (processedFile) {\n // Convert processed file back to Float32Array\n const arrayBuffer = await processedFile.arrayBuffer();\n const dataView = new DataView(arrayBuffer);\n \n // Skip WAV header (44 bytes) and convert back to Float32Array\n const samples = new Float32Array((arrayBuffer.byteLength - 44) / 2);\n for (let i = 0; i < samples.length; i++) {\n const int16 = dataView.getInt16(44 + i * 2, true);\n samples[i] = int16 / (int16 < 0 ? 0x8000 : 0x7fff);\n }\n processedAudio = samples;\n }\n }\n\n // Store chunk for final combination\n if (!isFinal) {\n allAudioChunksRef.current.push(processedAudio);\n }\n\n // Call chunk callback\n if (onAudioChunk) {\n onAudioChunk(processedAudio, sequence, isFinal);\n }\n\n // If final chunk, combine all audio and call completion callbacks\n if (isFinal) {\n // Combine all chunks\n const totalLength = allAudioChunksRef.current.reduce((sum, chunk) => sum + chunk.length, 0);\n const finalAudio = new Float32Array(totalLength);\n let offset = 0;\n\n for (const chunk of allAudioChunksRef.current) {\n finalAudio.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Call completion callback with raw audio\n if (onAudioComplete) {\n onAudioComplete(finalAudio);\n }\n\n // Convert to file format if requested\n if (onAudioFile && format === \"wav\") {\n const wavFile = await createWavFile(finalAudio);\n onAudioFile(wavFile);\n } else if (onAudioFile && format === \"raw\") {\n const rawFile = createRawFile(finalAudio);\n onAudioFile(rawFile);\n }\n\n // Clear stored chunks\n allAudioChunksRef.current = [];\n }\n\n } catch (error) {\n console.error(\"Error processing audio chunk:\", error);\n setError(`Audio processing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n } finally {\n setIsProcessing(false);\n }\n }, [silenceRemoval, isLoaded, removeSilence, onAudioChunk, onAudioComplete, onAudioFile, format]);\n\n // Create WAV file from Float32Array\n const createWavFile = useCallback(async (samples: Float32Array): Promise<File> => {\n if (isLoaded && typeof convertToWav === \"function\") {\n // Use FFmpeg for better quality conversion\n const result = await convertToWav(samples);\n return result || float32ToWavFile(samples); // Fallback if conversion fails\n } else {\n // Fallback to manual WAV creation\n return float32ToWavFile(samples);\n }\n }, [isLoaded, convertToWav]);\n\n // Create raw audio file\n const createRawFile = useCallback((samples: Float32Array): File => {\n const timestamp = Date.now();\n const filename = `audio-recording-${timestamp}.raw`;\n\n // Create a new ArrayBuffer and copy the data to ensure compatibility\n const buffer = new ArrayBuffer(samples.byteLength);\n const uint8Array = new Uint8Array(buffer);\n const sourceArray = new Uint8Array(samples.buffer, samples.byteOffset, samples.byteLength);\n uint8Array.set(sourceArray);\n\n return new File([buffer], filename, {\n type: \"application/octet-stream\",\n lastModified: timestamp,\n });\n }, []);\n\n // Manual WAV file creation\n const float32ToWavFile = (samples: Float32Array): File => {\n const sampleRate = audioContextRef.current?.sampleRate || 44100;\n const buffer = new ArrayBuffer(44 + samples.length * 2);\n const view = new DataView(buffer);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, \"RIFF\");\n view.setUint32(4, 36 + samples.length * 2, true);\n writeString(8, \"WAVE\");\n writeString(12, \"fmt \");\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true);\n view.setUint16(22, 1, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * 2, true);\n view.setUint16(32, 2, true);\n view.setUint16(34, 16, true);\n writeString(36, \"data\");\n view.setUint32(40, samples.length * 2, true);\n\n let offset = 44;\n for (let i = 0; i < samples.length; i++) {\n const sample = Math.max(-1, Math.min(1, samples[i]));\n view.setInt16(offset, sample < 0 ? sample * 0x8000 : sample * 0x7fff, true);\n offset += 2;\n }\n\n const timestamp = Date.now();\n const filename = `audio-recording-${timestamp}.wav`;\n\n return new File([view], filename, {\n type: \"audio/wav\",\n lastModified: timestamp,\n });\n };\n\n // Start recording\n const startRecording = useCallback(async () => {\n try {\n setError(null);\n setNoAudioDetected(false);\n\n // Validate microphone access\n const micValid = await validateMicrophoneAccess();\n if (!micValid) return;\n\n // Reset counters\n sequenceCounterRef.current = 0;\n allAudioChunksRef.current = [];\n setTotalChunks(0);\n setRecordingDuration(0);\n recordingStartTimeRef.current = Date.now();\n\n // Get media stream\n const stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: currentDeviceId ? { exact: currentDeviceId } : undefined,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n mediaStreamRef.current = stream;\n\n // Create audio context and processor\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const processorUrl = createAudioCaptureWorker();\n await audioContext.audioWorklet.addModule(processorUrl);\n URL.revokeObjectURL(processorUrl);\n\n const processor = new AudioWorkletNode(audioContext, \"audio-capture-processor\");\n\n processor.port.onmessage = (event) => {\n if (event.data.command === \"chunk\") {\n const audioData = new Float32Array(event.data.audioBuffer);\n const sequence = sequenceCounterRef.current++;\n setTotalChunks(sequence + 1);\n processAudioChunk(audioData, sequence, false);\n } else if (event.data.command === \"finalChunk\") {\n const audioData = new Float32Array(event.data.audioBuffer);\n const sequence = sequenceCounterRef.current++;\n processAudioChunk(audioData, sequence, true);\n } else if (event.data.command === \"audioLevel\") {\n setAudioLevel(event.data.level);\n } else if (event.data.command === \"noAudioDetected\") {\n setNoAudioDetected(true);\n setError(event.data.message);\n }\n };\n\n const source = audioContext.createMediaStreamSource(stream);\n source.connect(processor);\n\n audioContextRef.current = audioContext;\n processorRef.current = processor;\n setIsRecording(true);\n\n // Start chunk timer\n const chunkIntervalId = window.setInterval(() => {\n processor.port.postMessage({ command: \"getChunk\" });\n }, chunkDuration * 1000);\n chunkIntervalRef.current = chunkIntervalId;\n\n // Start duration timer\n const durationIntervalId = window.setInterval(() => {\n const elapsed = (Date.now() - recordingStartTimeRef.current) / 1000;\n setRecordingDuration(elapsed);\n }, 100);\n durationIntervalRef.current = durationIntervalId;\n\n } catch (err) {\n console.error(\"Recording start failed:\", err);\n setError(err instanceof Error ? err.message : \"Failed to start recording\");\n }\n }, [validateMicrophoneAccess, currentDeviceId, chunkDuration, processAudioChunk]);\n\n // Stop recording\n const stopRecording = useCallback(() => {\n console.log(\"Stopping recording...\");\n\n // Clear intervals\n if (chunkIntervalRef.current) {\n clearInterval(chunkIntervalRef.current);\n chunkIntervalRef.current = null;\n }\n\n if (durationIntervalRef.current) {\n clearInterval(durationIntervalRef.current);\n durationIntervalRef.current = null;\n }\n\n // Send final chunk\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"stop\" });\n }\n\n // Cleanup\n if (mediaStreamRef.current) {\n mediaStreamRef.current.getTracks().forEach(track => track.stop());\n mediaStreamRef.current = null;\n }\n\n if (audioContextRef.current) {\n audioContextRef.current.close();\n audioContextRef.current = null;\n }\n\n processorRef.current = null;\n setIsRecording(false);\n }, []);\n\n // Pause recording\n const pauseRecording = useCallback(() => {\n if (!isRecording || isPaused) return;\n\n if (chunkIntervalRef.current) {\n clearInterval(chunkIntervalRef.current);\n chunkIntervalRef.current = null;\n }\n\n if (durationIntervalRef.current) {\n clearInterval(durationIntervalRef.current);\n durationIntervalRef.current = null;\n }\n\n setIsPaused(true);\n\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"pause\" });\n }\n\n setIsRecording(false);\n }, [isRecording, isPaused]);\n\n // Resume recording\n const resumeRecording = useCallback(() => {\n if (!isPaused) return;\n\n setIsPaused(false);\n setIsRecording(true);\n setNoAudioDetected(false);\n\n if (processorRef.current) {\n processorRef.current.port.postMessage({ command: \"resume\" });\n }\n\n // Restart timers\n const chunkIntervalId = window.setInterval(() => {\n processorRef.current?.port.postMessage({ command: \"getChunk\" });\n }, chunkDuration * 1000);\n chunkIntervalRef.current = chunkIntervalId;\n\n const durationIntervalId = window.setInterval(() => {\n const elapsed = (Date.now() - recordingStartTimeRef.current) / 1000;\n setRecordingDuration(elapsed);\n }, 100);\n durationIntervalRef.current = durationIntervalId;\n }, [isPaused, chunkDuration]);\n\n // Select microphone\n const selectMicrophone = useCallback(async (deviceId: string) => {\n try {\n setCurrentDeviceId(deviceId);\n\n if (isRecording) {\n await stopRecording();\n await startRecording();\n }\n } catch (error) {\n console.error(\"Device selection failed:\", error);\n setError(\"Failed to switch to selected microphone.\");\n }\n }, [isRecording, stopRecording, startRecording]);\n\n return {\n mediaStreamRef,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isRecording,\n isPaused,\n isProcessing,\n error,\n availableDevices,\n currentDeviceId,\n selectMicrophone,\n validateMicrophoneAccess,\n audioLevel,\n noAudioDetected,\n isConverting,\n progress,\n statusMessage,\n recordingDuration,\n totalChunks,\n };\n};\n\nexport default useAudioCapture;","import * as React from \"react\";\nimport useAudioCapture from \"./hooks/useAudioCapture\";\nimport { Mic, Square, Loader2, Pause, Play, AlertTriangle, Download } from \"lucide-react\";\nimport Toast from \"./components/Toast\";\nimport AudioVisualizerImproved from \"./components/AudioVisualizerImproved\";\n\n// Embedded minimal Tailwind utilities (reusing from AudioRecorder)\nconst tailwindStyles = `\n .space-y-4 > :not([hidden]) ~ :not([hidden]) { margin-top: 1rem; }\n .bg-orange-50 { background-color: rgb(255 247 237); }\n .bg-blue-900 { background-color: rgb(30 58 138); }\n .text-yellow-200 { color: rgb(254 240 138); }\n .hover\\\\:bg-blue-700:hover { background-color: rgb(29 78 216); }\n .dark .dark\\\\:bg-orange-900\\\\/20 { background-color: rgb(194 65 12 / 0.2); }\n .border { border-width: 1px; }\n .border-orange-200 { border-color: rgb(254 215 170); }\n .dark .dark\\\\:border-orange-800 { border-color: rgb(154 52 18); }\n .rounded-lg { border-radius: 0.5rem; }\n .p-4 { padding: 1rem; }\n .flex { display: flex; }\n .items-start { align-items: flex-start; }\n .items-center { align-items: center; }\n .justify-center { justify-content: center; }\n .justify-between { justify-content: space-between; }\n .flex-shrink-0 { flex-shrink: 0; }\n .h-5 { height: 1.25rem; }\n .w-5 { width: 1.25rem; }\n .text-orange-400 { color: rgb(251 146 60); }\n .ml-3 { margin-left: 0.75rem; }\n .mr-2 { margin-right: 0.5rem; }\n .flex-1 { flex: 1 1 0%; }\n .text-sm { font-size: 0.875rem; line-height: 1.25rem; }\n .font-medium { font-weight: 500; }\n .text-orange-800 { color: rgb(154 52 18); }\n .dark .dark\\\\:text-orange-200 { color: rgb(254 215 170); }\n .mt-2 { margin-top: 0.5rem; }\n .text-orange-700 { color: rgb(194 65 12); }\n .dark .dark\\\\:text-orange-300 { color: rgb(253 186 116); }\n .list-disc { list-style-type: disc; }\n .list-inside { list-style-position: inside; }\n .bg-red-50 { background-color: rgb(254 242 242); }\n .dark .dark\\\\:bg-red-900\\\\/20 { background-color: rgb(127 29 29 / 0.2); }\n .border-red-200 { border-color: rgb(254 202 202); }\n .dark .dark\\\\:border-red-800 { border-color: rgb(153 27 27); }\n .text-red-400 { color: rgb(248 113 113); }\n .text-red-800 { color: rgb(153 27 27); }\n .dark .dark\\\\:text-red-200 { color: rgb(254 202 202); }\n .text-red-700 { color: rgb(185 28 28); }\n .dark .dark\\\\:text-red-300 { color: rgb(252 165 165); }\n .mt-4 { margin-top: 1rem; }\n .bg-red-600 { background-color: rgb(220 38 38); }\n .hover\\\\:bg-red-700:hover { background-color: rgb(185 28 28); }\n .text-white { color: rgb(255 255 255); }\n .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }\n .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }\n .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }\n .px-4 { padding-left: 1rem; padding-right: 1rem; }\n .rounded { border-radius: 0.25rem; }\n .rounded-full { border-radius: 9999px; }\n .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }\n .bg-yellow-50 { background-color: rgb(254 252 232); }\n .dark .dark\\\\:bg-yellow-900\\\\/20 { background-color: rgb(133 77 14 / 0.2); }\n .border-yellow-200 { border-color: rgb(254 240 138); }\n .dark .dark\\\\:border-yellow-800 { border-color: rgb(133 77 14); }\n .text-yellow-400 { color: rgb(250 204 21); }\n .text-yellow-800 { color: rgb(133 77 14); }\n .dark .dark\\\\:text-yellow-200 { color: rgb(254 240 138); }\n .text-yellow-700 { color: rgb(161 98 7); }\n .dark .dark\\\\:text-yellow-300 { color: rgb(253 224 71); }\n .space-x-3 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.75rem; }\n .space-x-1 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.25rem; }\n .space-x-2 > :not([hidden]) ~ :not([hidden]) { margin-left: 0.5rem; }\n .bg-yellow-600 { background-color: rgb(202 138 4); }\n .hover\\\\:bg-yellow-700:hover { background-color: rgb(161 98 7); }\n .disabled\\\\:opacity-50:disabled { opacity: 0.5; }\n .h-3 { height: 0.75rem; }\n .w-3 { width: 0.75rem; }\n .animate-spin { animation: spin 1s linear infinite; }\n @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }\n .bg-gray-600 { background-color: rgb(75 85 99); }\n .hover\\\\:bg-gray-700:hover { background-color: rgb(55 65 81); }\n .bg-blue-50 { background-color: rgb(239 246 255); }\n .dark .dark\\\\:bg-blue-900\\\\/20 { background-color: rgb(30 58 138 / 0.2); }\n .border-blue-200 { border-color: rgb(191 219 254); }\n .dark .dark\\\\:border-blue-800 { border-color: rgb(30 64 175); }\n .text-blue-600 { color: rgb(37 99 235); }\n .block { display: block; }\n .text-blue-700 { color: rgb(29 78 216); }\n .dark .dark\\\\:text-blue-300 { color: rgb(147 197 253); }\n .text-xs { font-size: 0.75rem; line-height: 1rem; }\n .dark .dark\\\\:text-blue-400 { color: rgb(96 165 250); }\n .mt-1 { margin-top: 0.25rem; }\n .bg-teal-600 { background-color: rgb(13 148 136); }\n .hover\\\\:bg-teal-700:hover { background-color: rgb(15 118 110); }\n .bg-green-600 { background-color: rgb(22 163 74); }\n .hover\\\\:bg-green-700:hover { background-color: rgb(21 128 61); }\n .bg-yellow-500 { background-color: rgb(234 179 8); }\n .hover\\\\:bg-yellow-600:hover { background-color: rgb(202 138 4); }\n .bg-gradient-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); }\n .from-purple-400 { --tw-gradient-from: #c084fc; --tw-gradient-to: rgb(192 132 252 / 0); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }\n .to-blue-500 { --tw-gradient-to: #3b82f6; }\n .hover\\\\:from-purple-500:hover { --tw-gradient-from: #a855f7; --tw-gradient-to: rgb(168 85 247 / 0); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }\n .hover\\\\:to-blue-600:hover { --tw-gradient-to: #2563eb; }\n .opacity-50 { opacity: 0.5; }\n .cursor-not-allowed { cursor: not-allowed; }\n .text-gray-600 { color: rgb(75 85 99); }\n .dark .dark\\\\:text-gray-300 { color: rgb(209 213 219); }\n .bg-gray-100 { background-color: rgb(243 244 246); }\n .dark .dark\\\\:bg-gray-800 { background-color: rgb(31 41 55); }\n .border-gray-200 { border-color: rgb(229 231 235); }\n .dark .dark\\\\:border-gray-700 { border-color: rgb(55 65 81); }\n .cursor-pointer { cursor: pointer; }\n .hover\\\\:bg-gray-200:hover { background-color: rgb(229 231 235); }\n .dark .dark\\\\:hover\\\\:bg-gray-700:hover { background-color: rgb(55 65 81); }\n`;\n\n// Inject styles only once\nlet stylesInjected = false;\nconst injectTailwindStyles = () => {\n if (!stylesInjected && typeof document !== 'undefined') {\n const styleElement = document.createElement('style');\n styleElement.textContent = tailwindStyles;\n document.head.appendChild(styleElement);\n stylesInjected = true;\n }\n};\n\nexport interface AudioCaptureProps {\n /**\n * Callback function called when an audio chunk is processed\n */\n onAudioChunk?: (audioData: Float32Array, sequence: number, isFinal: boolean) => void;\n\n /**\n * Callback function called when recording is complete with the final audio\n */\n onAudioComplete?: (finalAudio: Float32Array) => void;\n\n /**\n * Callback function called with the processed audio file\n */\n onAudioFile?: (audioFile: File) => void;\n\n /**\n * Enable silence removal processing (optional, defaults to false)\n */\n silenceRemoval?: boolean;\n\n /**\n * Duration in seconds for each audio chunk (optional, defaults to 30)\n */\n chunkDuration?: number;\n\n /**\n * Output format for audio file (optional, defaults to \"raw\")\n */\n format?: \"raw\" | \"wav\";\n\n /**\n * Show download button for audio file (optional, defaults to false)\n */\n showDownload?: boolean;\n\n /**\n * Additional CSS class names\n */\n className?: string;\n\n /**\n * Custom styles\n */\n style?: React.CSSProperties;\n}\n\nconst AudioCapture: React.FC<AudioCaptureProps> = ({\n onAudioChunk,\n onAudioComplete,\n onAudioFile,\n silenceRemoval = false,\n chunkDuration = 30,\n format = \"raw\",\n showDownload = false,\n className = \"\",\n style,\n}) => {\n // Inject Tailwind styles on component mount\n React.useEffect(() => {\n injectTailwindStyles();\n }, []);\n\n const {\n mediaStreamRef,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n isRecording,\n isPaused,\n isProcessing,\n error,\n availableDevices,\n currentDeviceId,\n selectMicrophone,\n validateMicrophoneAccess,\n audioLevel,\n noAudioDetected,\n isConverting,\n progress,\n statusMessage,\n recordingDuration,\n totalChunks,\n } = useAudioCapture({\n onAudioChunk,\n onAudioComplete,\n onAudioFile,\n silenceRemoval,\n chunkDuration,\n format,\n });\n\n const [isDisabled, setIsDisabled] = React.useState(false);\n const [lastAudioFile, setLastAudioFile] = React.useState<File | null>(null);\n\n // Add state for toast notifications\n const [toast, setToast] = React.useState<{\n show: boolean;\n message: string;\n type: \"success\" | \"error\";\n }>({\n show: false,\n message: \"\",\n type: \"success\",\n });\n\n // Handle audio file callback\n React.useEffect(() => {\n if (onAudioFile) {\n const originalCallback = onAudioFile;\n onAudioFile = (file: File) => {\n setLastAudioFile(file);\n originalCallback(file);\n };\n }\n }, [onAudioFile]);\n\n const handleStopClick = () => {\n setIsDisabled(true);\n stopRecording();\n };\n\n const handleStartRecording = () => {\n setIsDisabled(false);\n setLastAudioFile(null);\n startRecording();\n };\n\n const handleDownload = () => {\n if (lastAudioFile) {\n const url = URL.createObjectURL(lastAudioFile);\n const a = document.createElement('a');\n a.href = url;\n a.download = lastAudioFile.name;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n\n setToast({\n show: true,\n message: `Downloaded ${lastAudioFile.name}`,\n type: \"success\"\n });\n }\n };\n\n React.useEffect(() => {\n if (error) {\n setToast({ show: true, message: error, type: \"error\" });\n }\n }, [error]);\n\n const closeToast = () => {\n setToast({ ...toast, show: false });\n };\n\n // Format duration\n const formatDuration = (seconds: number): string => {\n const minutes = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${minutes}:${secs.toString().padStart(2, '0')}`;\n };\n\n // Enhanced error detection to include no audio detection\n const isMicrophoneError =\n error &&\n (error.toLowerCase().includes(\"microphone\") ||\n error.toLowerCase().includes(\"not found\") ||\n error.toLowerCase().includes(\"no audio\") ||\n error.toLowerCase().includes(\"devices not found\") ||\n error.toLowerCase().includes(\"access denied\") ||\n error.toLowerCase().includes(\"permission\") ||\n error.toLowerCase().includes(\"not allowed\") ||\n error.toLowerCase().includes(\"busy\") ||\n error.toLowerCase().includes(\"media devices not supported\") ||\n availableDevices.length === 0 ||\n noAudioDetected);\n\n // Show no audio detected error specifically\n if (noAudioDetected || (error && error.includes(\"No audio input detected\"))) {\n return (\n <div className=\"bg-orange-50 dark:bg-orange-900/20 border border-orange-200 dark:border-orange-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-orange-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-orange-800 dark:text-orange-200\">\n No Audio Input Detected\n </h3>\n <div className=\"mt-2 text-sm text-orange-700 dark:text-orange-300\">\n <p>{error}</p>\n <ul className=\"mt-2 list-disc list-inside\">\n <li>Check if your microphone is properly connected</li>\n <li>Ensure you're speaking close enough to the microphone</li>\n <li>Try adjusting your microphone volume settings</li>\n <li>Test your microphone in other applications</li>\n <li>Make sure your browser has microphone permissions</li>\n <li>Please reload the page and try again</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // Show microphone/audio errors\n if (isMicrophoneError) {\n return (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4\">\n <div className=\"flex items-start\">\n <div className=\"flex-shrink-0\">\n <AlertTriangle className=\"h-5 w-5 text-red-400\" />\n </div>\n <div className=\"ml-3 flex-1\">\n <h3 className=\"text-sm font-medium text-red-800 dark:text-red-200\">\n Audio Input Issue\n </h3>\n <div className=\"mt-2 text-sm text-red-700 dark:text-red-300\">\n <p>{error}</p>\n </div>\n <div className=\"mt-4\">\n <button\n onClick={() => {\n validateMicrophoneAccess();\n }}\n className=\"bg-red-600 hover:bg-red-700 text-white px-3 py-1 rounded text-sm transition-colors\"\n >\n Check Again\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n {toast.show && (\n <Toast message={toast.message} type={toast.type} onClose={closeToast} duration={3} />\n )}\n\n {/* Recording Info Display */}\n {(isRecording || isPaused || recordingDuration > 0) && (\n <div className=\"bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4\">\n <div className=\"flex justify-between items-center\">\n <div className=\"text-sm text-gray-600 dark:text-gray-300\">\n <div className=\"flex space-x-4\">\n <span>Duration: {formatDuration(recordingDuration)}</span>\n <span>Chunks: {totalChunks}</span>\n <span>Format: {format.toUpperCase()}</span>\n {silenceRemoval && <span>Silence Removal: ON</span>}\n </div>\n </div>\n {showDownload && lastAudioFile && (\n <button\n onClick={handleDownload}\n className=\"flex items-center space-x-1 bg-blue-600 hover:bg-blue-700 text-white px-3 py-1 rounded text-sm transition-colors\"\n >\n <Download className=\"h-3 w-3\" />\n <span>Download</span>\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Processing Status */}\n {(isProcessing || isConverting) && (\n <div className=\"flex items-center justify-center space-x-2 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-4\">\n <Loader2 className=\"animate-spin h-5 w-5 text-blue-600\" />\n <div className=\"text-center\">\n <span className=\"block text-sm font-medium text-blue-700 dark:text-blue-300\">\n {isConverting ? `Processing Audio... ${Math.round(progress)}%` : \"Processing audio chunk...\"}\n </span>\n {statusMessage && (\n <span className=\"block text-xs text-blue-600 dark:text-blue-400 mt-1\">\n {statusMessage}\n </span>\n )}\n </div>\n </div>\n )}\n\n {/* Audio Visualizer */}\n {isRecording && !isPaused && mediaStreamRef.current && (\n <div\n className={`audio-recorder-container ${isRecording && !isPaused ? \"glow-active\" : \"\"}`}\n >\n <div className=\"edge-container\">\n <div className=\"edge edge-top\" />\n <div className=\"edge edge-right\" />\n <div className=\"edge edge-bottom\" />\n <div className=\"edge edge-left\" />\n </div>\n <div className=\"flex justify-center items-center\">\n <AudioVisualizerImproved\n mediaStream={mediaStreamRef.current}\n isRecording={isRecording && !isPaused}\n forceLight={false}\n />\n </div>\n </div>\n )}\n\n {/* Control Buttons */}\n <div className=\"flex justify-center\">\n {isProcessing ? (\n <div className=\"flex items-center justify-center space-x-2 bg-teal-600 hover:bg-teal-700 text-white py-2 px-4 rounded-full\">\n <Loader2 className=\"animate-spin h-5 w-5\" />\n <span>Processing...</span>\n </div>\n ) : isRecording || isPaused ? (\n <div className=\"flex space-x-2\">\n <button\n className={`flex items-center justify-center space-x-2 bg-red-600 hover:bg-red-700 text-white py-2 px-4 rounded-full transition-colors ${\n isDisabled ? \"opacity-50 cursor-not-allowed\" : \"\"\n }`}\n onClick={handleStopClick}\n disabled={isDisabled}\n >\n <Square className=\"h-5 w-5\" />\n <span>Stop</span>\n </button>\n {!isPaused ? (\n <button\n className=\"flex items-center justify-center space-x-2 bg-yellow-500 hover:bg-yellow-600 text-white py-2 px-4 rounded-full transition-colors\"\n onClick={pauseRecording}\n >\n <Pause className=\"h-5 w-5\" />\n <span>Pause</span>\n </button>\n ) : (\n <button\n className=\"flex items-center justify-center space-x-2 bg-green-600 hover:bg-green-700 text-white py-2 px-4 rounded-full transition-colors\"\n onClick={resumeRecording}\n >\n <Play className=\"h-5 w-5\" />\n <span>Resume</span>\n </button>\n )}\n </div>\n ) : (\n <button\n className={\n className\n ? `flex items-center justify-center space-x-2 py-2 px-4 rounded-full transition-colors ${className}`\n : \"flex items-center justify-center space-x-2 bg-gradient-to-r from-purple-400 to-blue-500 hover:bg-gradient-to-r hover:from-purple-500 hover:to-blue-600 text-white py-2 px-4 rounded-full transition-colors\"\n }\n onClick={handleStartRecording}\n >\n <Mic className=\"h-5 w-5\" />\n <span>Start Recording</span>\n </button>\n )}\n </div>\n\n {/* Microphone Selection */}\n {availableDevices.length > 1 && (\n <div className=\"mt-4\">\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n Select Microphone:\n </label>\n <select\n value={currentDeviceId || \"\"}\n onChange={(e) => selectMicrophone(e.target.value)}\n className=\"w-full p-2 border border-gray-200 dark:border-gray-700 rounded bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100\"\n disabled={isRecording}\n >\n {availableDevices.map((device) => (\n <option key={device.deviceId} value={device.deviceId}>\n {device.label || `Microphone ${device.deviceId.slice(0, 8)}`}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n );\n};\n\nexport default AudioCapture;"]}