UNPKG

rapida-react

Version:

An easy to use react client for building generative ai application using Rapida platform.

88 lines (84 loc) 2.56 kB
import { agentInputMediaDeviceChangeObservable, browserMediaDeviceObserver, useMaybeVoiceAgent } from "./chunk-5UOY4SG5.mjs"; // src/hooks/use-select-input-device-agent.ts import * as React2 from "react"; // src/hooks/use-observable-state.ts import * as React from "react"; function useObservableState(observable, startWith, resetWhenObservableChanges = true) { const [state, setState] = React.useState(startWith); React.useEffect(() => { if (resetWhenObservableChanges) { setState(startWith); } if (typeof window === "undefined" || !observable) return; const subscription = observable.subscribe(setState); return () => subscription.unsubscribe(); }, [observable, resetWhenObservableChanges]); return state; } // src/hooks/use-select-input-device-agent.ts import { BehaviorSubject } from "rxjs"; function useSelectInputDeviceAgent({ requestPermissions, onError }) { const voiceAgentContext = useMaybeVoiceAgent(); const deviceObserver = React2.useMemo( () => browserMediaDeviceObserver("audioinput", onError, requestPermissions), [requestPermissions, onError] ); const devices = useObservableState( deviceObserver, [] ); const [currentDeviceId, setCurrentDeviceId] = React2.useState( voiceAgentContext?.inputMediaDevice ?? "" ); const { className, activeDeviceObservable, setActiveMediaDevice } = React2.useMemo( () => setupDeviceSelector("audioinput", voiceAgentContext), [voiceAgentContext] ); React2.useEffect(() => { const listener = activeDeviceObservable.subscribe((deviceId) => { if (deviceId && deviceId !== currentDeviceId) { setCurrentDeviceId(deviceId); } }); return () => { listener?.unsubscribe(); }; }, [activeDeviceObservable]); return { devices, className, activeDeviceId: currentDeviceId, setActiveMediaDevice }; } function setupDeviceSelector(_, agent) { const activeDeviceSubject = new BehaviorSubject( void 0 ); const activeDeviceObservable = agent ? agentInputMediaDeviceChangeObservable(agent) : activeDeviceSubject.asObservable(); const setActiveMediaDevice = async (id) => { if (agent) { await agent.setInputMediaDevice(id); } else if (activeDeviceSubject.value !== id) { activeDeviceSubject.next(id); } }; const className = "media-device-select"; return { className, activeDeviceObservable, setActiveMediaDevice }; } export { useObservableState, useSelectInputDeviceAgent }; //# sourceMappingURL=chunk-FHDCWUKE.mjs.map