{"ast":null,"code":"var _jsxFileName = \"D:\\\\Project\\\\UC_Trains_Voice\\\\react-demo\\\\src\\\\gavt\\\\GavtCali.tsx\",\n  _s = $RefreshSig$();\nimport React, { useState, useEffect, useRef } from 'react';\nimport { Divider, Steps, Breadcrumb, Button, Table } from 'antd';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { AudioOutlined, PlayCircleOutlined, PauseCircleOutlined } from '@ant-design/icons';\nimport { jsxDEV as _jsxDEV, Fragment as _Fragment } from \"react/jsx-dev-runtime\";\nconst stepsTitles = ['Instruction', 'Before You Start', 'Record Your Voice', 'Complete'];\nconst stepsDescriptions = [`This module will record your production of different vowel sounds so we can provide resonance targets customized to your voice. \n    If you do not want to complete this procedure right now, or if you experience any technical difficulty, \n    you can use resonance targets derived from a published reference sample of cis women or men (under the “Reference Targets” tab). \n    It should take around five minutes to complete the customization process.`, `To measure your resonance for a vowel, we want you to sustain JUST the vowel sound for about two seconds. \n    (We will give you a key word to identify the vowel, but you should produce only the vowel sound, not the whole word.) \n    Try to produce the vowel in a way that feels natural and comfortable to you. We will use our measurements from this production as a baseline for any changes in resonance. \n    Everyone's vowels will be a bit different depending on their dialect or language background. That's OK!\n    When you are ready to produce the vowel, click “start” and sustain the vowel for about two seconds, then click “stop.” `, `Follow the steps to record your voice. Click button to start, pronounce just the vowel for around 2 seconds, then click to stop. \n    Click play to listen to your recording. If you are satisfied with the recording, continue to record the next vowel.\n    If you are not satisfied, you can re-record the vowel. After you have recorded all the vowels, click “Next” to complete the calibration process`, `You're done with calibration! Now you can start practicing matching a target resonance.\n     You will be asked what type of target you would like to match, such as slightly darker or moderately brighter.`];\nconst recordingSteps = [{\n  key: '/i/',\n  title: '“ee” like in “seed”'\n}, {\n  key: '/ɪ/',\n  title: '“ih” like in “hid”'\n}, {\n  key: '/ɛ/',\n  title: '“eh” like in “head”'\n}, {\n  key: '/æ/',\n  title: '“ae” like in “sad”  '\n}, {\n  key: '/ɑ/',\n  title: '“ah” like in “god”'\n}, {\n  key: '/ɔ/',\n  title: '“aw” like in “lawn”'\n}, {\n  key: '/ʌ/',\n  title: '“uh” like in “bud”'\n}, {\n  key: '/u/',\n  title: ' “ooh” like in “spoon” '\n}, {\n  key: '/ʊ/',\n  title: ' “oo” like in “good” '\n}];\nconst GavtCali = () => {\n  _s();\n  const [currentStep, setCurrentStep] = useState(0);\n  const [audioURLs, setAudioURLs] = useState({}); // Store the audio URL for each vowel\n  const [mediaRecorder, setMediaRecorder] = useState(null);\n  const [recordingStates, setRecordingStates] = useState({});\n  const [results, setResults] = useState({});\n  const activeRecordingStepKeyRef = useRef(null); // Store the key of the active recording step\n  const navigate = useNavigate();\n  useEffect(() => {\n    // ----------------- Recorder -------------------\n    async function setupRecorder() {\n      try {\n        const stream = await navigator.mediaDevices.getUserMedia({\n          audio: true\n        });\n        const recorder = new MediaRecorder(stream);\n        setMediaRecorder(recorder);\n        let audioChunks = [];\n        recorder.ondataavailable = event => {\n          audioChunks.push(event.data);\n        };\n        recorder.onstop = () => {\n          const audioBlob = new Blob(audioChunks, {\n            type: 'audio/mp4'\n          });\n          const newAudioURL = URL.createObjectURL(audioBlob);\n          console.log('Audio Blob:', audioBlob, 'Audio URL:', newAudioURL);\n          const key = activeRecordingStepKeyRef.current;\n          if (key) {\n            setAudioURLs(prev => ({\n              ...prev,\n              [key]: newAudioURL\n            }));\n            console.log(`Recording for ${key} complete!`);\n          }\n          activeRecordingStepKeyRef.current = null;\n          audioChunks = [];\n        };\n      } catch (error) {\n        console.error('Error setting up the media recorder:', error);\n      }\n    }\n    setupRecorder();\n    return () => {\n      mediaRecorder === null || mediaRecorder === void 0 ? void 0 : mediaRecorder.stream.getTracks().forEach(track => track.stop());\n    };\n  }, []);\n  const toggleRecording = key => {\n    console.log(`Toggling recording for ${key}...`);\n    const isRecording = recordingStates[key];\n    if (!isRecording && mediaRecorder) {\n      mediaRecorder.start();\n      setRecordingStates(prev => ({\n        ...prev,\n        [key]: true\n      }));\n      activeRecordingStepKeyRef.current = key;\n    } else if (isRecording && mediaRecorder) {\n      mediaRecorder.stop();\n      setRecordingStates(prev => ({\n        ...prev,\n        [key]: false\n      }));\n    }\n  };\n  const handlePlayback = audioUrl => {\n    new Audio(audioUrl).play();\n  };\n  const renderRecordingControls = stepKey => {\n    const isRecording = recordingStates[stepKey];\n    const currentRecording = audioURLs[stepKey];\n    const anyRecordingActive = Object.values(recordingStates).some(state => state); // Check if any recording is active\n\n    return /*#__PURE__*/_jsxDEV(\"div\", {\n      children: currentRecording ? /*#__PURE__*/_jsxDEV(_Fragment, {\n        children: [/*#__PURE__*/_jsxDEV(Button, {\n          icon: /*#__PURE__*/_jsxDEV(PlayCircleOutlined, {}, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 128,\n            columnNumber: 23\n          }, this),\n          onClick: () => handlePlayback(currentRecording),\n          children: \"Play\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 127,\n          columnNumber: 13\n        }, this), /*#__PURE__*/_jsxDEV(Button, {\n          icon: /*#__PURE__*/_jsxDEV(AudioOutlined, {}, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 134,\n            columnNumber: 23\n          }, this),\n          onClick: () => {\n            console.log(`Deleting recording for ${stepKey}`);\n            setAudioURLs(prev => {\n              const newUrls = {\n                ...prev\n              };\n              delete newUrls[stepKey];\n              return newUrls;\n            });\n            setRecordingStates(prev => ({\n              ...prev,\n              [stepKey]: false\n            }));\n          },\n          children: \"Re-record\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 133,\n          columnNumber: 13\n        }, this)]\n      }, void 0, true) : /*#__PURE__*/_jsxDEV(Button, {\n        icon: isRecording ? /*#__PURE__*/_jsxDEV(PauseCircleOutlined, {}, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 150,\n          columnNumber: 33\n        }, this) : /*#__PURE__*/_jsxDEV(AudioOutlined, {}, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 150,\n          columnNumber: 59\n        }, this),\n        onClick: () => toggleRecording(stepKey),\n        shape: \"circle\",\n        type: isRecording ? \"default\" : \"primary\",\n        disabled: anyRecordingActive && !isRecording // Disable other recording buttons when one is active\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 149,\n        columnNumber: 11\n      }, this)\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 124,\n      columnNumber: 9\n    }, this);\n  };\n  const allRecordingsComplete = recordingSteps.every(step => audioURLs[step.key]);\n\n  //------------------Fake F2 Data-------------------\n  const handleAnalyzeAll = async () => {\n    const newResults = {};\n    for (const key of Object.keys(audioURLs)) {\n      const result = Math.random() * 1000;\n      newResults[key] = result;\n    }\n    setResults(newResults);\n    console.log('Analysis complete:', newResults);\n    localStorage.setItem('analysisResults', JSON.stringify(newResults));\n    setCurrentStep(currentStep + 1);\n  };\n\n  // ----------------- Draw Table -------------------\n\n  const columns = [{\n    title: 'Vowel',\n    dataIndex: 'vowel',\n    key: 'vowel'\n  }, {\n    title: 'Result',\n    dataIndex: 'result',\n    key: 'result'\n  }];\n  const dataSource = Object.keys(results).map(key => ({\n    key,\n    vowel: key,\n    result: results[key].toFixed(2)\n  }));\n\n  // ----------------- Handle Restart and Save -------------------\n  const handleRestart = () => {\n    setCurrentStep(0);\n    setAudioURLs({});\n    setRecordingStates({});\n  };\n  const handleSaveAndReturn = () => {\n    navigate('/gavt');\n  };\n\n  // ----------------- Step Setting -------------------\n  const renderStepContent = () => {\n    if (currentStep === 2) {\n      return /*#__PURE__*/_jsxDEV(\"div\", {\n        children: [/*#__PURE__*/_jsxDEV(\"p\", {\n          children: stepsDescriptions[currentStep]\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 207,\n          columnNumber: 13\n        }, this), /*#__PURE__*/_jsxDEV(Steps, {\n          current: -1,\n          direction: \"vertical\",\n          children: recordingSteps.map(step => /*#__PURE__*/_jsxDEV(Steps.Step, {\n            title: step.title,\n            description: renderRecordingControls(step.key)\n          }, step.key, false, {\n            fileName: _jsxFileName,\n            lineNumber: 210,\n            columnNumber: 15\n          }, this))\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 208,\n          columnNumber: 11\n        }, this)]\n      }, void 0, true, {\n        fileName: _jsxFileName,\n        lineNumber: 206,\n        columnNumber: 9\n      }, this);\n    } else if (currentStep === 3) {\n      return /*#__PURE__*/_jsxDEV(\"div\", {\n        children: [/*#__PURE__*/_jsxDEV(\"p\", {\n          children: stepsDescriptions[currentStep]\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 218,\n          columnNumber: 17\n        }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n          children: [/*#__PURE__*/_jsxDEV(Button, {\n            onClick: handleRestart,\n            children: \"Restart\"\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 220,\n            columnNumber: 21\n          }, this), /*#__PURE__*/_jsxDEV(Button, {\n            onClick: handleSaveAndReturn,\n            type: \"primary\",\n            children: \"Save results and back to HOME\"\n          }, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 221,\n            columnNumber: 21\n          }, this)]\n        }, void 0, true, {\n          fileName: _jsxFileName,\n          lineNumber: 219,\n          columnNumber: 17\n        }, this)]\n      }, void 0, true, {\n        fileName: _jsxFileName,\n        lineNumber: 217,\n        columnNumber: 13\n      }, this);\n    } else {\n      return /*#__PURE__*/_jsxDEV(\"p\", {\n        children: stepsDescriptions[currentStep]\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 227,\n        columnNumber: 14\n      }, this);\n    }\n  };\n  return /*#__PURE__*/_jsxDEV(\"div\", {\n    style: {\n      display: 'flex',\n      flexDirection: 'column',\n      alignItems: 'center',\n      marginTop: '20px',\n      width: '80%'\n    },\n    children: [/*#__PURE__*/_jsxDEV(Breadcrumb, {\n      style: {\n        marginBottom: '20px',\n        alignSelf: 'start'\n      },\n      items: [{\n        title: /*#__PURE__*/_jsxDEV(Link, {\n          to: \"/gavt\",\n          children: \"Gavt Home\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 236,\n          columnNumber: 25\n        }, this)\n      }, {\n        title: 'Calibration'\n      }]\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 233,\n      columnNumber: 9\n    }, this), /*#__PURE__*/_jsxDEV(Steps, {\n      progressDot: true,\n      current: currentStep,\n      items: stepsTitles.map((title, index) => ({\n        key: index.toString(),\n        title\n      }))\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 240,\n      columnNumber: 9\n    }, this), /*#__PURE__*/_jsxDEV(Divider, {}, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 242,\n      columnNumber: 9\n    }, this), renderStepContent(), currentStep === 3 && /*#__PURE__*/_jsxDEV(Table, {\n      dataSource: dataSource,\n      columns: columns,\n      pagination: false\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 246,\n      columnNumber: 13\n    }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n      style: {\n        marginTop: '20px'\n      },\n      children: [/*#__PURE__*/_jsxDEV(Button, {\n        disabled: currentStep === 0,\n        onClick: () => setCurrentStep(currentStep - 1),\n        children: \"Previous\"\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 249,\n        columnNumber: 13\n      }, this), /*#__PURE__*/_jsxDEV(Button, {\n        type: \"primary\",\n        onClick: () => {\n          if (currentStep === 2) {\n            handleAnalyzeAll();\n          } else if (currentStep === 3) {\n            handleSaveAndReturn();\n          } else {\n            setCurrentStep(currentStep + 1);\n          }\n        },\n        disabled: currentStep === 2 && !allRecordingsComplete,\n        children: currentStep === stepsTitles.length - 1 ? 'Save and Back to HOME' : 'Next'\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 250,\n        columnNumber: 13\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 248,\n      columnNumber: 9\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 232,\n    columnNumber: 5\n  }, this);\n};\n_s(GavtCali, \"RDKOlUYFgY3v0QvzR4rAhIuw4E8=\", false, function () {\n  return [useNavigate];\n});\n_c = GavtCali;\nexport default GavtCali;\nvar _c;\n$RefreshReg$(_c, \"GavtCali\");","map":{"version":3,"names":["React","useState","useEffect","useRef","Divider","Steps","Breadcrumb","Button","Table","Link","useNavigate","AudioOutlined","PlayCircleOutlined","PauseCircleOutlined","jsxDEV","_jsxDEV","Fragment","_Fragment","stepsTitles","stepsDescriptions","recordingSteps","key","title","GavtCali","_s","currentStep","setCurrentStep","audioURLs","setAudioURLs","mediaRecorder","setMediaRecorder","recordingStates","setRecordingStates","results","setResults","activeRecordingStepKeyRef","navigate","setupRecorder","stream","navigator","mediaDevices","getUserMedia","audio","recorder","MediaRecorder","audioChunks","ondataavailable","event","push","data","onstop","audioBlob","Blob","type","newAudioURL","URL","createObjectURL","console","log","current","prev","error","getTracks","forEach","track","stop","toggleRecording","isRecording","start","handlePlayback","audioUrl","Audio","play","renderRecordingControls","stepKey","currentRecording","anyRecordingActive","Object","values","some","state","children","icon","fileName","_jsxFileName","lineNumber","columnNumber","onClick","newUrls","shape","disabled","allRecordingsComplete","every","step","handleAnalyzeAll","newResults","keys","result","Math","random","localStorage","setItem","JSON","stringify","columns","dataIndex","dataSource","map","vowel","toFixed","handleRestart","handleSaveAndReturn","renderStepContent","direction","Step","description","style","display","flexDirection","alignItems","marginTop","width","marginBottom","alignSelf","items","to","progressDot","index","toString","pagination","length","_c","$RefreshReg$"],"sources":["D:/Project/UC_Trains_Voice/react-demo/src/gavt/GavtCali.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\r\nimport { Divider, Steps, Breadcrumb, Button, message, Table } from 'antd';\r\nimport { Link, useNavigate } from 'react-router-dom';\r\nimport { AudioOutlined, PlayCircleOutlined, PauseCircleOutlined } from '@ant-design/icons';\r\n\r\nconst stepsTitles = [\r\n  'Instruction',\r\n  'Before You Start',\r\n  'Record Your Voice',\r\n  'Complete'\r\n];\r\n\r\nconst stepsDescriptions = [\r\n    `This module will record your production of different vowel sounds so we can provide resonance targets customized to your voice. \r\n    If you do not want to complete this procedure right now, or if you experience any technical difficulty, \r\n    you can use resonance targets derived from a published reference sample of cis women or men (under the “Reference Targets” tab). \r\n    It should take around five minutes to complete the customization process.`,\r\n\r\n    `To measure your resonance for a vowel, we want you to sustain JUST the vowel sound for about two seconds. \r\n    (We will give you a key word to identify the vowel, but you should produce only the vowel sound, not the whole word.) \r\n    Try to produce the vowel in a way that feels natural and comfortable to you. We will use our measurements from this production as a baseline for any changes in resonance. \r\n    Everyone's vowels will be a bit different depending on their dialect or language background. That's OK!\r\n    When you are ready to produce the vowel, click “start” and sustain the vowel for about two seconds, then click “stop.” `,\r\n\r\n    `Follow the steps to record your voice. Click button to start, pronounce just the vowel for around 2 seconds, then click to stop. \r\n    Click play to listen to your recording. If you are satisfied with the recording, continue to record the next vowel.\r\n    If you are not satisfied, you can re-record the vowel. After you have recorded all the vowels, click “Next” to complete the calibration process`,\r\n\r\n    `You're done with calibration! Now you can start practicing matching a target resonance.\r\n     You will be asked what type of target you would like to match, such as slightly darker or moderately brighter.`\r\n];\r\n\r\nconst recordingSteps = [\r\n  { key: '/i/', title: '“ee” like in “seed”' },\r\n  { key: '/ɪ/', title: '“ih” like in “hid”' },\r\n  { key: '/ɛ/', title: '“eh” like in “head”' },\r\n  { key: '/æ/', title: '“ae” like in “sad”  ' },\r\n  { key: '/ɑ/', title: '“ah” like in “god”' },\r\n  { key: '/ɔ/', title: '“aw” like in “lawn”' },\r\n  { key: '/ʌ/', title: '“uh” like in “bud”' },\r\n  { key: '/u/', title: ' “ooh” like in “spoon” ' },\r\n  { key: '/ʊ/', title: ' “oo” like in “good” ' }\r\n];\r\n\r\ninterface AudioURLs {\r\n  [key: string]: string;\r\n}\r\n\r\ninterface AnalysisResults {\r\n    [key: string]: number;\r\n}\r\n\r\nconst GavtCali: React.FC = () => {\r\n  const [currentStep, setCurrentStep] = useState(0);\r\n  const [audioURLs, setAudioURLs] = useState<AudioURLs>({}); // Store the audio URL for each vowel\r\n  const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);\r\n  const [recordingStates, setRecordingStates] = useState<Record<string, boolean>>({});\r\n  const [results, setResults] = useState<AnalysisResults>({});\r\n  const activeRecordingStepKeyRef = useRef<string | null>(null); // Store the key of the active recording step\r\n  const navigate = useNavigate();\r\n\r\n  useEffect(() => {\r\n    // ----------------- Recorder -------------------\r\n    async function setupRecorder() {\r\n      try {\r\n        const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\r\n        const recorder = new MediaRecorder(stream);\r\n        setMediaRecorder(recorder);\r\n  \r\n        let audioChunks: BlobPart[] = [];\r\n  \r\n        recorder.ondataavailable = (event: BlobEvent) => {\r\n          audioChunks.push(event.data);\r\n        };\r\n  \r\n        recorder.onstop = () => {\r\n            const audioBlob = new Blob(audioChunks, { type: 'audio/mp4' });\r\n            const newAudioURL = URL.createObjectURL(audioBlob);\r\n            console.log('Audio Blob:', audioBlob, 'Audio URL:', newAudioURL);\r\n            const key = activeRecordingStepKeyRef.current;\r\n            if (key) {\r\n              setAudioURLs(prev => ({ ...prev, [key]: newAudioURL }));\r\n              console.log(`Recording for ${key} complete!`);\r\n            }\r\n            activeRecordingStepKeyRef.current = null;\r\n            audioChunks = [];\r\n          };\r\n      } catch (error) {\r\n        console.error('Error setting up the media recorder:', error);\r\n      }\r\n    }\r\n  \r\n    setupRecorder();\r\n  \r\n    return () => {\r\n      mediaRecorder?.stream.getTracks().forEach(track => track.stop());\r\n    };\r\n  }, []); \r\n\r\n  const toggleRecording = (key: string) => {\r\n    console.log(`Toggling recording for ${key}...`)\r\n    const isRecording = recordingStates[key];\r\n\r\n    if (!isRecording && mediaRecorder) {\r\n      mediaRecorder.start();\r\n      setRecordingStates(prev => ({ ...prev, [key]: true }));\r\n      activeRecordingStepKeyRef.current = key;\r\n    } else if (isRecording && mediaRecorder) {\r\n      mediaRecorder.stop();\r\n      setRecordingStates(prev => ({ ...prev, [key]: false }));\r\n    }\r\n  };\r\n\r\n  const handlePlayback = (audioUrl: string) => {\r\n    new Audio(audioUrl).play();\r\n  };\r\n\r\n  const renderRecordingControls = (stepKey: string) => {\r\n    const isRecording = recordingStates[stepKey];\r\n    const currentRecording = audioURLs[stepKey];\r\n    const anyRecordingActive = Object.values(recordingStates).some(state => state); // Check if any recording is active\r\n\r\n    return (\r\n        <div>\r\n        {currentRecording ? (\r\n          <>\r\n            <Button\r\n                icon={<PlayCircleOutlined />}\r\n                onClick={() => handlePlayback(currentRecording)}\r\n            >\r\n              Play\r\n            </Button>\r\n            <Button\r\n                icon={<AudioOutlined />}\r\n                onClick={() => {\r\n                    console.log(`Deleting recording for ${stepKey}`);\r\n                    setAudioURLs(prev => {\r\n                        const newUrls = { ...prev };\r\n                        delete newUrls[stepKey];\r\n                        return newUrls;\r\n                    });\r\n                    setRecordingStates(prev => ({ ...prev, [stepKey]: false }));\r\n                }}\r\n            >\r\n              Re-record\r\n            </Button>\r\n          </>\r\n        ) : (\r\n          <Button\r\n            icon={isRecording ? <PauseCircleOutlined /> : <AudioOutlined />}\r\n            onClick={() => toggleRecording(stepKey)}\r\n            shape='circle'\r\n            type={isRecording ? \"default\" : \"primary\"}\r\n            disabled={anyRecordingActive && !isRecording} // Disable other recording buttons when one is active\r\n          >\r\n          </Button>\r\n        )}\r\n      </div>\r\n    );\r\n  };\r\n\r\n  const allRecordingsComplete = recordingSteps.every(step => audioURLs[step.key])\r\n\r\n  //------------------Fake F2 Data-------------------\r\n  const handleAnalyzeAll = async () => {\r\n    const newResults: AnalysisResults = {};\r\n    for (const key of Object.keys(audioURLs)) {\r\n      const result = Math.random() * 1000;\r\n      newResults[key] = result;\r\n    }\r\n    setResults(newResults);\r\n    console.log('Analysis complete:', newResults);\r\n    localStorage.setItem('analysisResults', JSON.stringify(newResults));\r\n    setCurrentStep(currentStep + 1);\r\n  };\r\n\r\n  // ----------------- Draw Table -------------------\r\n\r\n  const columns = [\r\n    { title: 'Vowel', dataIndex: 'vowel', key: 'vowel' },\r\n    { title: 'Result', dataIndex: 'result', key: 'result' }\r\n  ];\r\n\r\n  const dataSource = Object.keys(results).map(key => ({\r\n    key,\r\n    vowel: key,\r\n    result: results[key].toFixed(2)\r\n  }));\r\n\r\n  // ----------------- Handle Restart and Save -------------------\r\n  const handleRestart = () => {\r\n    setCurrentStep(0);\r\n    setAudioURLs({});\r\n    setRecordingStates({});\r\n  };\r\n\r\n  const handleSaveAndReturn = () => {\r\n    navigate('/gavt');\r\n  };\r\n\r\n\r\n  // ----------------- Step Setting -------------------\r\n  const renderStepContent = () => {\r\n    if (currentStep === 2) {\r\n      return (    \r\n        <div>\r\n            <p>{stepsDescriptions[currentStep]}</p>\r\n          <Steps current={-1} direction=\"vertical\">\r\n            {recordingSteps.map(step => (\r\n              <Steps.Step key={step.key} title={step.title} description={renderRecordingControls(step.key)} />\r\n            ))}\r\n          </Steps>\r\n        </div>\r\n      );\r\n    } else if (currentStep === 3) {\r\n        return(\r\n            <div>\r\n                <p>{stepsDescriptions[currentStep]}</p>\r\n                <div>\r\n                    <Button onClick={handleRestart}>Restart</Button>\r\n                    <Button onClick={handleSaveAndReturn} type=\"primary\">Save results and back to HOME</Button>\r\n            </div>\r\n            </div>\r\n        );\r\n\r\n    } else {\r\n      return <p>{stepsDescriptions[currentStep]}</p>;\r\n    }\r\n  };\r\n\r\n  return (\r\n    <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginTop: '20px', width: '80%' }}>\r\n        <Breadcrumb\r\n            style={{ marginBottom: '20px', alignSelf: 'start' }}\r\n            items={[\r\n                {title: <Link to=\"/gavt\">Gavt Home</Link>,},\r\n                {title:'Calibration',}\r\n            ]}\r\n        />\r\n        <Steps progressDot current={currentStep} items={stepsTitles.map((title, index) => ({ key: index.toString(), title }))} />\r\n\r\n        <Divider />\r\n\r\n        {renderStepContent()}\r\n        {currentStep === 3 && (\r\n            <Table dataSource={dataSource} columns={columns} pagination={false}/>\r\n        )}\r\n        <div style={{ marginTop: '20px' }}>\r\n            <Button disabled={currentStep === 0} onClick={() => setCurrentStep(currentStep - 1)}>Previous</Button>\r\n            <Button\r\n                type=\"primary\"\r\n                onClick={() => {\r\n                    if (currentStep === 2) {\r\n                        handleAnalyzeAll();\r\n                    } else if (currentStep === 3) {\r\n                        handleSaveAndReturn();\r\n                    } else {\r\n                        setCurrentStep(currentStep + 1);\r\n                    }}\r\n                }\r\n                disabled={ currentStep === 2 && !allRecordingsComplete }>\r\n                {currentStep === stepsTitles.length - 1 ? 'Save and Back to HOME' : 'Next'}\r\n            </Button>\r\n        </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default GavtCali;\r\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}