import React from "react"; import {useState, useRef, useCallback} from "react"; import {useTranscriptionStore} from "../stores/transcriptionStore"; import { SUPPORTED_AUDIO_FORMATS, SUPPORTED_VIDEO_FORMATS, CODEC_INFO, } from "../utils/mediaTypes"; import TranscriptionSideBar from "../components/TranscriptionSideBar"; import TranscriptionPlayer from "../components/TranscriptionPlayer"; import MediaRecorder from "../components/MediaRecorder"; import {useDragAndDrop} from "../hooks/useDragAndDrop"; import {CloudArrowUpIcon} from "@heroicons/react/24/outline"; import ErrorBoundary from "../components/ErrorBoundary"; export default function TranscriptionPage() { const {isRecording, setFile, stopRecording} = useTranscriptionStore(); // Sidebar resizing state const [sidebarWidth, setSidebarWidth] = useState(256); // Default 256px (w-64) const [isResizing, setIsResizing] = useState(false); const sidebarRef = useRef(null); // Drag and drop functionality const {isDragActive, dragProps} = useDragAndDrop({ onFileDropped: setFile, acceptedTypes: ["audio/*"], }); // Handle sidebar resizing const handleMouseDown = useCallback((e: React.MouseEvent) => { e.preventDefault(); setIsResizing(true); }, []); const handleMouseMove = useCallback( (e: MouseEvent) => { if (!isResizing) return; const newWidth = Math.max(200, Math.min(600, e.clientX)); // Min 200px, max 600px setSidebarWidth(newWidth); }, [isResizing] ); const handleMouseUp = useCallback(() => { setIsResizing(false); }, []); // Add global mouse event listeners React.useEffect(() => { if (isResizing) { document.addEventListener("mousemove", handleMouseMove); document.addEventListener("mouseup", handleMouseUp); document.body.style.userSelect = "none"; // Prevent text selection during drag document.body.style.cursor = "ew-resize"; } return () => { document.removeEventListener("mousemove", handleMouseMove); document.removeEventListener("mouseup", handleMouseUp); document.body.style.userSelect = ""; document.body.style.cursor = ""; }; }, [isResizing, handleMouseMove, handleMouseUp]); return (
{/* Drag Overlay */} {isDragActive && (
Drop your audio file here
Supports audio files only
{/* Audio formats section */}
Audio Formats
{SUPPORTED_AUDIO_FORMATS.join(" • ")}
{/* Codec info */}
Best with standard codecs:{" "} {CODEC_INFO.audio.common.slice(0, 2).join(", ")}
)} {/* Sidebar with Resize Handle */}
{/* Drag Handle */}
{/* Main Content */} {isRecording ? (
stopRecording()} onCancel={() => stopRecording()} />
) : ( )}
); }