import React from 'react'; import { Icon, IconButton, Icons, Line, Text, Tooltip, TooltipProvider } from 'folds'; import { useAtom } from 'jotai'; import { MicLevelBars } from './MicLevelBars'; import * as css from './styles.css'; import { MobileTouchTarget } from '../../styles/mobile.css'; import { callChatAtom } from '../../state/callEmbed'; import { AsyncStatus, useAsyncCallback } from '../../hooks/useAsyncCallback'; export function ControlDivider() { return ( ); } type MicrophoneButtonProps = { enabled: boolean; onToggle: () => Promise; /** [Gitea #146] Your input level, 0–3 bars; shown only while unmuted. */ level?: number; }; export function MicrophoneButton({ enabled, onToggle, level = 0 }: MicrophoneButtonProps) { const [micState, toggleMic] = useAsyncCallback(onToggle); const loading = micState.status === AsyncStatus.Loading; return ( {enabled ? 'Turn Off Microphone' : 'Turn On Microphone'} } > {(anchorRef) => ( {enabled && } )} ); } type SoundButtonProps = { enabled: boolean; onToggle: () => void; }; export function SoundButton({ enabled, onToggle }: SoundButtonProps) { return ( {enabled ? 'Deafen' : 'Undeafen'} } > {(anchorRef) => ( onToggle()} // No aria-pressed on these call toggles (#187 DP7/8): their labels already // name the action ("Deafen" / "Undeafen"), and pressed-state on top // read as "Deafen, pressed" while NOT deafened. aria-label={enabled ? 'Deafen' : 'Undeafen'} outlined > )} ); } type VideoButtonProps = { enabled: boolean; onToggle: () => Promise; disabled?: boolean; }; export function VideoButton({ enabled, onToggle, disabled }: VideoButtonProps) { const [videoState, toggleVideo] = useAsyncCallback(onToggle); const loading = videoState.status === AsyncStatus.Loading; return ( {disabled ? 'Camera disabled in settings' : enabled ? 'Stop Camera' : 'Start Camera'} } > {(anchorRef) => ( )} ); } type ScreenShareButtonProps = { enabled: boolean; onToggle: () => void; }; export function ScreenShareButton({ enabled, onToggle }: ScreenShareButtonProps) { return ( {enabled ? 'Stop Screenshare' : 'Start Screenshare'} } > {(anchorRef) => ( onToggle()} aria-label={enabled ? 'Stop Screenshare' : 'Start Screenshare'} outlined > )} ); } export const FullscreenIcon = () => ( ); export const ExitFullscreenIcon = () => ( ); type FullscreenButtonProps = { isFullscreen: boolean; onToggle: () => void; }; export function FullscreenButton({ isFullscreen, onToggle }: FullscreenButtonProps) { return ( {isFullscreen ? 'Exit Fullscreen' : 'Fullscreen'} } > {(anchorRef) => ( {isFullscreen ? : } )} ); } type ScreenshareAudioButtonProps = { muted: boolean; onToggle: () => void; }; export function ScreenshareAudioButton({ muted, onToggle }: ScreenshareAudioButtonProps) { return ( {muted ? 'Unmute Screenshare Audio' : 'Mute Screenshare Audio'} } > {(anchorRef) => ( )} ); } export function ChatButton() { const [chat, setChat] = useAtom(callChatAtom); return ( {chat ? 'Close Chat' : 'Open Chat'} } > {(anchorRef) => ( setChat(!chat)} aria-label={chat ? 'Close Chat' : 'Open Chat'} outlined > )} ); }