import React, { useState, useEffect } from 'react'; import './App.css'; import { useAudioVideo, useMeetingManager, useToggleLocalMute, ControlBar, ControlBarButton, Meeting, LeaveMeeting, AudioInputControl, Input, DeviceLabels, Record, Pause, Remove, VideoInputControl, AudioOutputControl, } from 'amazon-chime-sdk-component-library-react'; import { API, Auth } from 'aws-amplify'; import '@aws-amplify/ui-react/styles.css'; import '@cloudscape-design/global-styles/index.css'; import { MeetingSessionConfiguration } from 'amazon-chime-sdk-js'; import {Loader} from "@aws-amplify/ui-react"; import {muteMicrophoneContinueTranscribe} from "./TranscribeClient"; import {tMeetingControlBarInput} from "./types"; const MeetingControlBar = (props: tMeetingControlBarInput) => { const [meetingId, setMeetingId] = useState(''); const [requestId, setRequestId] = useState(''); const audioVideo = useAudioVideo(); const meetingManager = useMeetingManager(); const { muted, toggleMute } = useToggleLocalMute(); const [isLoading, setLoading] = useState(false); const { transcribeStatus, setTranscribeStatus, setSourceLanguage, sourceLanguages, setLocalMute, microphoneStream, } = props; useEffect(() => { setLocalMute(muted); // Keep transcription but turn off voice input. if(muted){ muteMicrophoneContinueTranscribe(microphoneStream) } }, [toggleMute]); const JoinButtonProps = { icon: , onClick: () => handleJoin(), label: 'Join', }; const LeaveButtonProps = { icon: , onClick: () => handleLeave(), label: 'Leave', }; const EndButtonProps = { icon: , onClick: () => handleEnd(), label: 'End', }; const TranscribeButtonProps = { icon: transcribeStatus ? : , popOver: sourceLanguages?.map((sourceLanguage) => ({ onClick: () => setSourceLanguage(sourceLanguage.code), children: {sourceLanguage.language}, })), onClick: () => handleTranscribe(), label: 'Transcribe', }; const handleLeave = async () => { await meetingManager.leave(); }; const handleEnd = async () => { console.log(`Auth ${JSON.stringify(await Auth.currentUserInfo())}`); try { await API.post('meetingApi', '/end', { body: { meetingId: meetingId } }); } catch (err) { console.log(`{err in handleEnd: ${err}`); } }; const handleJoin = async () => { setLoading(true); const email = (await Auth.currentUserInfo()).attributes.email; const name = (await Auth.currentUserInfo()).attributes.name; try { const attendeeCapabilities = { Audio: 'None', Content: 'SendReceive', Video: 'SendReceive', }; const joinResponse = await API.post('meetingApi', '/create', { body: { name: name, email: email, requestId: requestId, attendeeCapabilities: attendeeCapabilities }, }); const meetingSessionConfiguration = new MeetingSessionConfiguration( joinResponse.Meeting, joinResponse.Attendee, ); const options = { deviceLabels: DeviceLabels.AudioAndVideo, }; await meetingManager.join(meetingSessionConfiguration, options); await meetingManager.start(); meetingManager.invokeDeviceProvider(DeviceLabels.AudioAndVideo); setMeetingId(joinResponse.Meeting.MeetingId); setLoading(false) } catch (err) { console.log(`err in handleJoin: ${err}`); } }; const handleTranscribe = async () => { setTranscribeStatus(!transcribeStatus); }; return ( ) => setRequestId(e.target.value)} sizing={'md'} value={requestId} placeholder='Request ID' type='text' /> {isLoading && } {!audioVideo && } {audioVideo && ( <> )} ); }; export default MeetingControlBar;