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