diff --git a/client/src/Pages/UploadPage.tsx b/client/src/Pages/UploadPage.tsx index 4982a20..75dd846 100644 --- a/client/src/Pages/UploadPage.tsx +++ b/client/src/Pages/UploadPage.tsx @@ -14,6 +14,8 @@ import { import { CloudUpload as CloudUploadIcon, VolumeUp as VolumeUpIcon, + Mic as MicIcon, + Stop as StopIcon } from "@mui/icons-material"; import StepperComponent from "../components/StepperComponent"; import { useWebSocket } from "../contexts/WebSocketContext"; @@ -29,6 +31,38 @@ function UploadPage() { const [isDragging, setIsDragging] = useState(false); const [upload, setUpload] = useState(false); const [inputEnabled, setInputEnabled] = useState(false); + const [isRecording, setIsRecording] = useState(false); + const [mediaRecorder, setMediaRecorder] = useState(null); + + const startRecording = async () => { + try { + const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + const recorder = new MediaRecorder(stream); + setMediaRecorder(recorder); + + const chunks: Blob[] = []; + recorder.ondataavailable = (e) => chunks.push(e.data); + recorder.onstop = () => { + const blob = new Blob(chunks, { type: "audio/wav" }); + const file = new File([blob], "recording.wav", { type: "audio/wav" }); + validateAndSetFile(file); + handleUpload(file); + }; + + recorder.start(); + setIsRecording(true); + } catch (error) { + console.error("Failed to start recording:", error); + showErrorToast("Failed to start recording"); + } + }; + + const stopRecording = () => { + if (mediaRecorder) { + mediaRecorder.stop(); + setIsRecording(false); + } + }; const showErrorToast = (message: string) => { setToastMessage(message); @@ -220,8 +254,52 @@ function UploadPage() { - Upload Your Media + Upload or Record Your Media + document.getElementById("fileInput")?.click()} + > + + + + {file ? file.name : "Drop your file here or click to browse files"} + + Supported formats: MP3, WAV, AAC, OGG + document.getElementById("fileInput")?.click()} > - - - - - {file ? file.name : "Drop your file here or click to browse files"} - - - Max file size: 100MB - - {file && ( - - {file.type.includes("audio") ? : null} - {file.type} - {(file.size / (1024 * 1024)).toFixed(2)} MB - - )} + -