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;