murmuraba
Version:
Real-time audio noise reduction with advanced chunked processing for web applications
98 lines (97 loc) • 2.91 kB
JavaScript
import { useState, useCallback } from 'react';
export function useRecordingState() {
const [recordingState, setRecordingState] = useState({
isRecording: false,
isPaused: false,
recordingTime: 0,
chunks: [],
playingChunks: {},
expandedChunk: null
});
const startRecording = useCallback(() => {
setRecordingState(prev => ({
...prev,
isRecording: true,
isPaused: false,
recordingTime: 0,
chunks: []
}));
}, []);
const stopRecording = useCallback(() => {
setRecordingState(prev => ({
...prev,
isRecording: false,
isPaused: false,
recordingTime: 0
}));
}, []);
const pauseRecording = useCallback(() => {
setRecordingState(prev => ({
...prev,
isPaused: true
}));
}, []);
const resumeRecording = useCallback(() => {
setRecordingState(prev => ({
...prev,
isPaused: false
}));
}, []);
const addChunk = useCallback((chunk) => {
setRecordingState(prev => ({
...prev,
chunks: [...prev.chunks, chunk]
}));
}, []);
const toggleChunkPlayback = useCallback((chunkId, isPlaying, audioType) => {
setRecordingState(prev => ({
...prev,
playingChunks: {
...prev.playingChunks,
[chunkId]: isPlaying
},
chunks: prev.chunks.map(chunk => chunk.id === chunkId
? {
...chunk,
isPlaying,
currentlyPlayingType: isPlaying ? audioType : null
}
: {
...chunk,
isPlaying: false, // Stop other chunks when starting new one
currentlyPlayingType: null
})
}));
}, []);
const toggleChunkExpansion = useCallback((chunkId) => {
setRecordingState(prev => ({
...prev,
expandedChunk: prev.expandedChunk === chunkId ? null : chunkId,
chunks: prev.chunks.map(chunk => chunk.id === chunkId ? { ...chunk, isExpanded: !chunk.isExpanded } : chunk)
}));
}, []);
const clearRecordings = useCallback(() => {
setRecordingState(prev => ({
...prev,
chunks: []
}));
}, []);
const updateRecordingTime = useCallback((time) => {
setRecordingState(prev => ({
...prev,
recordingTime: time
}));
}, []);
return {
recordingState,
startRecording,
stopRecording,
pauseRecording,
resumeRecording,
addChunk,
toggleChunkPlayback,
toggleChunkExpansion,
clearRecordings,
updateRecordingTime
};
}