rapida-react
Version:
An easy to use react client for building generative ai application using Rapida platform.
88 lines (84 loc) • 2.56 kB
JavaScript
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