UNPKG

@copilotkit/react-ui

Version:

<div align="center"> <a href="https://copilotkit.ai" target="_blank"> <img src="https://github.com/copilotkit/copilotkit/raw/main/assets/banner.png" alt="CopilotKit Logo"> </a>

195 lines (194 loc) 7.61 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // src/hooks/use-push-to-talk.tsx var use_push_to_talk_exports = {}; __export(use_push_to_talk_exports, { checkMicrophonePermission: () => checkMicrophonePermission, requestMicAndPlaybackPermission: () => requestMicAndPlaybackPermission, usePushToTalk: () => usePushToTalk }); module.exports = __toCommonJS(use_push_to_talk_exports); var import_react_core = require("@copilotkit/react-core"); var import_react = require("react"); var checkMicrophonePermission = () => __async(void 0, null, function* () { try { const permissionStatus = yield navigator.permissions.query({ name: "microphone" }); if (permissionStatus.state === "granted") { return true; } else { return false; } } catch (err) { console.error("Error checking microphone permission", err); } }); var requestMicAndPlaybackPermission = () => __async(void 0, null, function* () { try { const stream = yield navigator.mediaDevices.getUserMedia({ audio: true }); const audioContext = new window.AudioContext(); yield audioContext.resume(); return { stream, audioContext }; } catch (err) { console.error("Error requesting microphone and playback permissions", err); return null; } }); var startRecording = (mediaStreamRef, mediaRecorderRef, audioContextRef, recordedChunks, onStop) => __async(void 0, null, function* () { if (!mediaStreamRef.current || !audioContextRef.current) { mediaStreamRef.current = yield navigator.mediaDevices.getUserMedia({ audio: true }); audioContextRef.current = new window.AudioContext(); yield audioContextRef.current.resume(); } mediaRecorderRef.current = new MediaRecorder(mediaStreamRef.current); mediaRecorderRef.current.start(1e3); mediaRecorderRef.current.ondataavailable = (event) => { recordedChunks.push(event.data); }; mediaRecorderRef.current.onstop = onStop; }); var stopRecording = (mediaRecorderRef) => { if (mediaRecorderRef.current && mediaRecorderRef.current.state !== "inactive") { mediaRecorderRef.current.stop(); } }; var transcribeAudio = (recordedChunks, transcribeAudioUrl) => __async(void 0, null, function* () { const completeBlob = new Blob(recordedChunks, { type: "audio/mp4" }); const formData = new FormData(); formData.append("file", completeBlob, "recording.mp4"); const response = yield fetch(transcribeAudioUrl, { method: "POST", body: formData }); if (!response.ok) { throw new Error(`Error: ${response.statusText}`); } const transcription = yield response.json(); return transcription.text; }); var playAudioResponse = (text, textToSpeechUrl, audioContext) => { const encodedText = encodeURIComponent(text); const url = `${textToSpeechUrl}?text=${encodedText}`; fetch(url).then((response) => response.arrayBuffer()).then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer)).then((audioBuffer) => { const source = audioContext.createBufferSource(); source.buffer = audioBuffer; source.connect(audioContext.destination); source.start(0); }).catch((error) => { console.error("Error with decoding audio data", error); }); }; var usePushToTalk = ({ sendFunction, inProgress }) => { const [pushToTalkState, setPushToTalkState] = (0, import_react.useState)("idle"); const mediaStreamRef = (0, import_react.useRef)(null); const audioContextRef = (0, import_react.useRef)(null); const mediaRecorderRef = (0, import_react.useRef)(null); const recordedChunks = (0, import_react.useRef)([]); const generalContext = (0, import_react_core.useCopilotContext)(); const messagesContext = (0, import_react_core.useCopilotMessagesContext)(); const context = __spreadValues(__spreadValues({}, generalContext), messagesContext); const [startReadingFromMessageId, setStartReadingFromMessageId] = (0, import_react.useState)(null); (0, import_react.useEffect)(() => { if (pushToTalkState === "recording") { startRecording( mediaStreamRef, mediaRecorderRef, audioContextRef, recordedChunks.current, () => { setPushToTalkState("transcribing"); } ); } else { stopRecording(mediaRecorderRef); if (pushToTalkState === "transcribing") { transcribeAudio(recordedChunks.current, context.copilotApiConfig.transcribeAudioUrl).then( (transcription) => __async(void 0, null, function* () { recordedChunks.current = []; setPushToTalkState("idle"); const message = yield sendFunction(transcription); setStartReadingFromMessageId(message.id); }) ); } } return () => { stopRecording(mediaRecorderRef); }; }, [pushToTalkState]); (0, import_react.useEffect)(() => { if (inProgress === false && startReadingFromMessageId) { const lastMessageIndex = context.messages.findIndex( (message) => message.id === startReadingFromMessageId ); const messagesAfterLast = context.messages.slice(lastMessageIndex + 1).filter( (message) => message.isTextMessage() && message.role === "assistant" ); const text = messagesAfterLast.map((message) => message.content).join("\n"); playAudioResponse(text, context.copilotApiConfig.textToSpeechUrl, audioContextRef.current); setStartReadingFromMessageId(null); } }, [startReadingFromMessageId, inProgress]); return { pushToTalkState, setPushToTalkState }; }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { checkMicrophonePermission, requestMicAndPlaybackPermission, usePushToTalk }); //# sourceMappingURL=use-push-to-talk.js.map