daily-examples/custom/live-transcription/contexts/TranscriptionProvider.js

93 lines
2.7 KiB
JavaScript

import React, {
createContext,
useCallback,
useContext,
useEffect,
useState,
} from 'react';
import { useCallState } from '@custom/shared/contexts/CallProvider';
import { nanoid } from 'nanoid';
import PropTypes from 'prop-types';
export const TranscriptionContext = createContext();
export const TranscriptionProvider = ({ children }) => {
const { callObject } = useCallState();
const [transcriptionHistory, setTranscriptionHistory] = useState([]);
const [hasNewMessages, setHasNewMessages] = useState(false);
const [isTranscribing, setIsTranscribing] = useState(false);
const handleNewMessage = useCallback(
(e) => {
const participants = callObject.participants();
// Collect only transcription messages, and gather enough
// words to be able to post messages at sentence intervals
if (e.fromId === 'transcription' && e.data?.is_final) {
// Get the sender's current display name or the local name
const sender = e.data?.session_id !== participants.local.session_id
? participants[e.data.session_id].user_name
: participants.local.user_name;
setTranscriptionHistory((oldState) => [
...oldState,
{ sender, message: e.data.text, id: nanoid() },
]);
}
setHasNewMessages(true);
},
[callObject]
);
const handleTranscriptionStarted = useCallback(() => {
console.log('💬 Transcription started');
setIsTranscribing(true);
}, []);
const handleTranscriptionStopped = useCallback(() => {
console.log('💬 Transcription stopped');
setIsTranscribing(false);
}, []);
const handleTranscriptionError = useCallback(() => {
console.log('❗ Transcription error!');
setIsTranscribing(false);
}, []);
useEffect(() => {
if (!callObject) {
return false;
}
console.log(`💬 Transcription provider listening for app messages`);
callObject.on('app-message', handleNewMessage);
callObject.on('transcription-started', handleTranscriptionStarted);
callObject.on('transcription-stopped', handleTranscriptionStopped);
callObject.on('transcription-error', handleTranscriptionError);
return () => callObject.off('app-message', handleNewMessage);
}, [callObject, handleNewMessage, handleTranscriptionStarted, handleTranscriptionStopped, handleTranscriptionError]);
return (
<TranscriptionContext.Provider
value={{
isTranscribing,
transcriptionHistory,
hasNewMessages,
setHasNewMessages,
}}
>
{children}
</TranscriptionContext.Provider>
);
};
TranscriptionProvider.propTypes = {
children: PropTypes.node,
};
export const useTranscription = () => useContext(TranscriptionContext);