folx-tv/client/replit_integrations/audio/useVoiceRecorder.ts
sebastjanartic 308e602c73 Fix hero card aspect ratio and add horoscope generation functionality
Introduce horoscope generation via OpenAI API, including new API endpoints and database schema. Adjust card components in `home.tsx` to use `aspect-[16/9]` for consistent image sizing, resolving previous height stretching issues. Update dependencies in `package.json`.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 413891e8-d784-4bea-b9f5-91a5a68316b4
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: ca1aa952-242c-43c1-9e28-47aed39cee1b
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/413891e8-d784-4bea-b9f5-91a5a68316b4/nTLKCC5
Replit-Helium-Checkpoint-Created: true
2026-02-28 20:25:58 +00:00

53 lines
1.5 KiB
TypeScript

/**
* React hook for voice recording using MediaRecorder API.
* Records audio in WebM/Opus format for efficient streaming.
*/
import { useRef, useCallback, useState } from "react";
export type RecordingState = "idle" | "recording" | "stopped";
export function useVoiceRecorder() {
const [state, setState] = useState<RecordingState>("idle");
const mediaRecorderRef = useRef<MediaRecorder | null>(null);
const chunksRef = useRef<Blob[]>([]);
const startRecording = useCallback(async (): Promise<void> => {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const recorder = new MediaRecorder(stream, {
mimeType: "audio/webm;codecs=opus",
});
mediaRecorderRef.current = recorder;
chunksRef.current = [];
recorder.ondataavailable = (e) => {
if (e.data.size > 0) chunksRef.current.push(e.data);
};
recorder.start(100); // Collect chunks every 100ms
setState("recording");
}, []);
const stopRecording = useCallback((): Promise<Blob> => {
return new Promise((resolve) => {
const recorder = mediaRecorderRef.current;
if (!recorder || recorder.state !== "recording") {
resolve(new Blob());
return;
}
recorder.onstop = () => {
const blob = new Blob(chunksRef.current, { type: "audio/webm" });
recorder.stream.getTracks().forEach((t) => t.stop());
setState("stopped");
resolve(blob);
};
recorder.stop();
});
}, []);
return { state, startRecording, stopRecording };
}