import { Box, Chip, Icon, IconButton, Icons, Spinner, Text, Tooltip, TooltipProvider } from 'folds'; import React, { useCallback } from 'react'; import { StatusDivider } from './components'; import { CallEmbed, useCallControlState } from '../../plugins/call'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; type MicrophoneButtonProps = { enabled: boolean; onToggle: () => Promise; }; function MicrophoneButton({ enabled, onToggle }: MicrophoneButtonProps) { return ( {enabled ? 'Turn Off Microphone' : 'Turn On Microphone'} } > {(anchorRef) => ( onToggle()} outlined > )} ); } type SoundButtonProps = { enabled: boolean; onToggle: () => void; }; function SoundButton({ enabled, onToggle }: SoundButtonProps) { return ( {enabled ? 'Turn Off Sound' : 'Turn On Sound'} } > {(anchorRef) => ( onToggle()} outlined > )} ); } type VideoButtonProps = { enabled: boolean; onToggle: () => Promise; }; function VideoButton({ enabled, onToggle }: VideoButtonProps) { return ( {enabled ? 'Stop Camera' : 'Start Camera'} } > {(anchorRef) => ( onToggle()} outlined > )} ); } type ScreenShareButtonProps = { enabled: boolean; onToggle: () => void; }; function ScreenShareButton({ enabled, onToggle }: ScreenShareButtonProps) { return ( {enabled ? 'Stop Screenshare' : 'Start Screenshare'} } > {(anchorRef) => ( )} ); } export function CallControl({ callEmbed, compact }: { callEmbed: CallEmbed; compact: boolean }) { const { microphone, video, sound, screenshare } = useCallControlState(callEmbed.control); const [hangupState, hangup] = useAsyncCallback( useCallback(() => callEmbed.hangup(), [callEmbed]) ); const exiting = hangupState.status === AsyncStatus.Loading || hangupState.status === AsyncStatus.Success; return ( callEmbed.control.toggleMicrophone()} /> callEmbed.control.toggleSound()} /> {!compact && } callEmbed.control.toggleVideo()} /> {!compact && ( callEmbed.control.toggleScreenshare()} /> )} ) : ( ) } disabled={exiting} outlined onClick={hangup} > {!compact && ( End )} ); }