{"ast":null,"code":"var _jsxFileName = \"D:\\\\Project\\\\UC_Trains_Voice\\\\react-demo\\\\src\\\\gavt\\\\GavtCali.tsx\",\n  _s = $RefreshSig$();\nimport React, { useState, useEffect } from 'react';\nimport { Divider, Steps, Breadcrumb, Button, message } from 'antd';\nimport { Link } 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...\", \"To measure your resonance for a vowel, we want you to sustain JUST the vowel sound...\", \"Follow the steps to record your voice.\", \"Review and complete the calibration.\"];\nconst recordingSteps = [{\n  key: 'vowel1',\n  title: '“ee” like in “seed”'\n}, {\n  key: 'vowel2',\n  title: '“ih” like in “hid”'\n}, {\n  key: 'vowel3',\n  title: '“eh” like in “head”'\n}];\nconst GavtCali = () => {\n  _s();\n  const [currentStep, setCurrentStep] = useState(0);\n  const [audioURLs, setAudioURLs] = useState({});\n  const [mediaRecorder, setMediaRecorder] = useState(null);\n  const [recordingStates, setRecordingStates] = useState({});\n  const [activeRecordingStepKey, setActiveRecordingStepKey] = useState(null);\n  useEffect(() => {\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\n        recorder.ondataavailable = event => {\n          audioChunks.push(event.data); // 收集数据块\n        };\n        recorder.onstop = () => {\n          console.log(audioChunks);\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); // Debug output\n          console.log('Active recording step key:', activeRecordingStepKey);\n          if (activeRecordingStepKey) {\n            // 确保 activeRecordingStepKey 是有效的\n            setAudioURLs(prev => ({\n              ...prev,\n              [activeRecordingStepKey]: newAudioURL\n            }));\n            console.log(`Recording for ${activeRecordingStepKey} complete!`); // Debug output\n          }\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      setActiveRecordingStepKey(key); // 设置当前录音步骤键\n      message.info('Recording started!');\n    } else if (isRecording && mediaRecorder) {\n      mediaRecorder.stop();\n      setRecordingStates(prev => ({\n        ...prev,\n        [key]: false\n      }));\n      setActiveRecordingStepKey(null); // 清除当前录音步骤键\n      message.info('Recording stopped!');\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); // 检查是否有任何步骤正在录音\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: 106,\n            columnNumber: 23\n          }, this),\n          onClick: () => handlePlayback(currentRecording),\n          children: \"Play\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 105,\n          columnNumber: 13\n        }, this), /*#__PURE__*/_jsxDEV(Button, {\n          icon: /*#__PURE__*/_jsxDEV(AudioOutlined, {}, void 0, false, {\n            fileName: _jsxFileName,\n            lineNumber: 113,\n            columnNumber: 23\n          }, this),\n          onClick: () => {\n            console.log(`Deleting recording for ${stepKey}`); // Debug output\n            setAudioURLs(prev => {\n              const newUrls = {\n                ...prev\n              };\n              delete newUrls[stepKey];\n              return newUrls;\n            });\n            toggleRecording(stepKey);\n          },\n          children: \"Re-record\"\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 112,\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: 129,\n          columnNumber: 33\n        }, this) : /*#__PURE__*/_jsxDEV(AudioOutlined, {}, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 129,\n          columnNumber: 59\n        }, this),\n        onClick: () => toggleRecording(stepKey),\n        shape: \"circle\",\n        type: isRecording ? \"default\" : \"primary\",\n        disabled: anyRecordingActive && !isRecording // 如果有其他步骤正在录音并且当前步骤没有录音，则禁用按钮\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 128,\n        columnNumber: 11\n      }, this)\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 101,\n      columnNumber: 9\n    }, this);\n  };\n  const renderStepContent = () => {\n    if (currentStep === 2) {\n      return /*#__PURE__*/_jsxDEV(\"div\", {\n        children: /*#__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: 147,\n            columnNumber: 15\n          }, this))\n        }, void 0, false, {\n          fileName: _jsxFileName,\n          lineNumber: 145,\n          columnNumber: 11\n        }, this)\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 144,\n        columnNumber: 9\n      }, this);\n    } else {\n      return /*#__PURE__*/_jsxDEV(\"p\", {\n        children: stepsDescriptions[currentStep]\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 153,\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: 164,\n          columnNumber: 22\n        }, this)\n      }, {\n        title: 'Calibration'\n      }]\n    }, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 160,\n      columnNumber: 1\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: 172,\n      columnNumber: 7\n    }, this), /*#__PURE__*/_jsxDEV(Divider, {}, void 0, false, {\n      fileName: _jsxFileName,\n      lineNumber: 173,\n      columnNumber: 7\n    }, this), renderStepContent(), /*#__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: 177,\n        columnNumber: 9\n      }, this), /*#__PURE__*/_jsxDEV(Button, {\n        type: \"primary\",\n        onClick: () => setCurrentStep(currentStep + 1),\n        disabled: currentStep === stepsTitles.length - 1,\n        children: currentStep === stepsTitles.length - 1 ? 'Finish' : 'Next'\n      }, void 0, false, {\n        fileName: _jsxFileName,\n        lineNumber: 178,\n        columnNumber: 9\n      }, this)]\n    }, void 0, true, {\n      fileName: _jsxFileName,\n      lineNumber: 176,\n      columnNumber: 7\n    }, this)]\n  }, void 0, true, {\n    fileName: _jsxFileName,\n    lineNumber: 158,\n    columnNumber: 5\n  }, this);\n};\n_s(GavtCali, \"EPj/9s+eIUlZcvY2s1rQ5j/Isaw=\");\n_c = GavtCali;\nexport default GavtCali;\nvar _c;\n$RefreshReg$(_c, \"GavtCali\");","map":{"version":3,"names":["React","useState","useEffect","Divider","Steps","Breadcrumb","Button","message","Link","AudioOutlined","PlayCircleOutlined","PauseCircleOutlined","jsxDEV","_jsxDEV","Fragment","_Fragment","stepsTitles","stepsDescriptions","recordingSteps","key","title","GavtCali","_s","currentStep","setCurrentStep","audioURLs","setAudioURLs","mediaRecorder","setMediaRecorder","recordingStates","setRecordingStates","activeRecordingStepKey","setActiveRecordingStepKey","setupRecorder","stream","navigator","mediaDevices","getUserMedia","audio","recorder","MediaRecorder","audioChunks","ondataavailable","event","push","data","onstop","console","log","audioBlob","Blob","type","newAudioURL","URL","createObjectURL","prev","error","getTracks","forEach","track","stop","toggleRecording","isRecording","start","info","handlePlayback","audioUrl","Audio","play","renderRecordingControls","stepKey","currentRecording","anyRecordingActive","Object","values","some","state","children","icon","fileName","_jsxFileName","lineNumber","columnNumber","onClick","newUrls","shape","disabled","renderStepContent","current","direction","map","step","Step","description","style","display","flexDirection","alignItems","marginTop","width","marginBottom","alignSelf","items","to","progressDot","index","toString","length","_c","$RefreshReg$"],"sources":["D:/Project/UC_Trains_Voice/react-demo/src/gavt/GavtCali.tsx"],"sourcesContent":["import React, { useState, useEffect } from 'react';\r\nimport { Divider, Steps, Breadcrumb, Button, message } from 'antd';\r\nimport { Link } 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    \"To measure your resonance for a vowel, we want you to sustain JUST the vowel sound...\",\r\n    \"Follow the steps to record your voice.\",\r\n    \"Review and complete the calibration.\"\r\n];\r\n\r\nconst recordingSteps = [\r\n  { key: 'vowel1', title: '“ee” like in “seed”' },\r\n  { key: 'vowel2', title: '“ih” like in “hid”' },\r\n  { key: 'vowel3', title: '“eh” like in “head”' }\r\n];\r\n\r\ninterface AudioURLs {\r\n  [key: string]: string;\r\n}\r\n\r\nconst GavtCali: React.FC = () => {\r\n  const [currentStep, setCurrentStep] = useState(0);\r\n  const [audioURLs, setAudioURLs] = useState<AudioURLs>({});\r\n  const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);\r\n  const [recordingStates, setRecordingStates] = useState<Record<string, boolean>>({});\r\n  const [activeRecordingStepKey, setActiveRecordingStepKey] = useState<string | null>(null);\r\n\r\n\r\n  useEffect(() => {\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            console.log(audioChunks);\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); // Debug output\r\n            console.log('Active recording step key:', activeRecordingStepKey);\r\n            if (activeRecordingStepKey) {  // 确保 activeRecordingStepKey 是有效的\r\n              setAudioURLs(prev => ({ ...prev, [activeRecordingStepKey]: newAudioURL }));\r\n              console.log(`Recording for ${activeRecordingStepKey} complete!`); // Debug output\r\n            }\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    if (!isRecording && mediaRecorder) {\r\n      mediaRecorder.start();\r\n      setRecordingStates(prev => ({ ...prev, [key]: true }));\r\n      setActiveRecordingStepKey(key); // 设置当前录音步骤键\r\n      message.info('Recording started!');\r\n    } else if (isRecording && mediaRecorder) {\r\n      mediaRecorder.stop();\r\n      setRecordingStates(prev => ({ ...prev, [key]: false }));\r\n      setActiveRecordingStepKey(null); // 清除当前录音步骤键\r\n      message.info('Recording stopped!');\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); // 检查是否有任何步骤正在录音\r\n\r\n    return (\r\n        <div>\r\n        {currentRecording ? (\r\n          <>\r\n            {/* 回放按钮 */}\r\n            <Button\r\n                icon={<PlayCircleOutlined />}\r\n                onClick={() => handlePlayback(currentRecording)}\r\n            >\r\n              Play\r\n            </Button>\r\n            {/* 重录按钮 */}\r\n            <Button\r\n                icon={<AudioOutlined />}\r\n                onClick={() => {\r\n                    console.log(`Deleting recording for ${stepKey}`); // Debug output\r\n                    setAudioURLs(prev => {\r\n                    const newUrls = { ...prev };\r\n                    delete newUrls[stepKey];\r\n                    return newUrls;\r\n                    });\r\n                    toggleRecording(stepKey);\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} // 如果有其他步骤正在录音并且当前步骤没有录音，则禁用按钮\r\n          >\r\n          </Button>\r\n        )}\r\n      </div>\r\n    );\r\n  };\r\n\r\n  const renderStepContent = () => {\r\n    if (currentStep === 2) {\r\n      return (\r\n        <div>\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 {\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\r\n<Breadcrumb\r\n        style={{ marginBottom: '20px', alignSelf: 'start' }}\r\n        items={[\r\n            {\r\n              title: <Link to=\"/gavt\">Gavt Home</Link>,\r\n            },\r\n            {\r\n              title:'Calibration',\r\n            }\r\n          ]}\r\n      />\r\n\r\n      <Steps progressDot current={currentStep} items={stepsTitles.map((title, index) => ({ key: index.toString(), title }))} />\r\n      <Divider />\r\n      {renderStepContent()}\r\n\r\n      <div style={{ marginTop: '20px' }}>\r\n        <Button disabled={currentStep === 0} onClick={() => setCurrentStep(currentStep - 1)}>Previous</Button>\r\n        <Button type=\"primary\" onClick={() => setCurrentStep(currentStep + 1)} disabled={currentStep === stepsTitles.length - 1}>\r\n          {currentStep === stepsTitles.length - 1 ? 'Finish' : '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":[]}