import { SessionIconButton } from '../icon'; import { animation, contextMenu, Item, Menu } from 'react-contexify'; import { InputItem } from '../../../session/utils/CallManager'; import { setFullScreenCall } from '../../../state/ducks/conversations'; import { CallManager, ToastUtils } from '../../../session/utils'; import React from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { getHasOngoingCallWithPubkey } from '../../../state/selectors/conversations'; import { DropDownAndToggleButton } from '../icon/DropDownAndToggleButton'; import styled from 'styled-components'; const videoTriggerId = 'video-menu-trigger-id'; const audioTriggerId = 'audio-menu-trigger-id'; const audioOutputTriggerId = 'audio-output-menu-trigger-id'; export const VideoInputButton = ({ currentConnectedCameras, localStreamVideoIsMuted, hideArrowIcon = false, }: { currentConnectedCameras: Array; localStreamVideoIsMuted: boolean; hideArrowIcon?: boolean; }) => { return ( <> { void handleCameraToggle(currentConnectedCameras, localStreamVideoIsMuted); }} onArrowClick={e => { showVideoInputMenu(currentConnectedCameras, e); }} hidePopoverArrow={hideArrowIcon} /> ); }; export const AudioInputButton = ({ currentConnectedAudioInputs, isAudioMuted, hideArrowIcon = false, }: { currentConnectedAudioInputs: Array; isAudioMuted: boolean; hideArrowIcon?: boolean; }) => { return ( <> { void handleMicrophoneToggle(currentConnectedAudioInputs, isAudioMuted); }} onArrowClick={e => { showAudioInputMenu(currentConnectedAudioInputs, e); }} hidePopoverArrow={hideArrowIcon} /> ); }; export const AudioOutputButton = ({ currentConnectedAudioOutputs, }: // isAudioOutputMuted, // hideArrowIcon = false, { currentConnectedAudioOutputs: Array; isAudioOutputMuted: boolean; hideArrowIcon?: boolean; }) => { return ( <> {/* { void handleSpeakerToggle(currentConnectedAudioOutputs, isAudioOutputMuted); }} onArrowClick={e => { showAudioOutputMenu(currentConnectedAudioOutputs, e); }} hidePopoverArrow={hideArrowIcon} /> */} ); }; const VideoInputMenu = ({ triggerId, camerasList, }: { triggerId: string; camerasList: Array; }) => { return ( {camerasList.map(m => { return ( { void CallManager.selectCameraByDeviceId(m.deviceId); }} > {m.label.substr(0, 40)} ); })} ); }; const AudioInputMenu = ({ triggerId, audioInputsList, }: { triggerId: string; audioInputsList: Array; }) => { return ( {audioInputsList.map(m => { return ( { void CallManager.selectAudioInputByDeviceId(m.deviceId); }} > {m.label.substr(0, 40)} ); })} ); }; const AudioOutputMenu = ({ triggerId, audioOutputsList, }: { triggerId: string; audioOutputsList: Array; }) => { return ( {audioOutputsList.map(m => { return ( { void CallManager.selectAudioOutputByDeviceId(m.deviceId); }} > {m.label.substr(0, 40)} ); })} ); }; const ShowInFullScreenButton = ({ isFullScreen }: { isFullScreen: boolean }) => { const dispatch = useDispatch(); const showInFullScreen = () => { if (isFullScreen) { dispatch(setFullScreenCall(false)); } else { dispatch(setFullScreenCall(true)); } }; return ( ); }; export const HangUpButton = () => { const ongoingCallPubkey = useSelector(getHasOngoingCallWithPubkey); const handleEndCall = async () => { // call method to end call connection if (ongoingCallPubkey) { await CallManager.USER_hangup(ongoingCallPubkey); } }; return ( ); }; const showAudioInputMenu = ( currentConnectedAudioInputs: Array, e: React.MouseEvent ) => { if (currentConnectedAudioInputs.length === 0) { ToastUtils.pushNoAudioInputFound(); return; } contextMenu.show({ id: audioTriggerId, event: e, }); }; // const showAudioOutputMenu = ( // currentConnectedAudioOutputs: Array, // e: React.MouseEvent // ) => { // if (currentConnectedAudioOutputs.length === 0) { // ToastUtils.pushNoAudioOutputFound(); // return; // } // contextMenu.show({ // id: audioOutputTriggerId, // event: e, // }); // }; const showVideoInputMenu = ( currentConnectedCameras: Array, e: React.MouseEvent ) => { if (currentConnectedCameras.length === 0) { ToastUtils.pushNoCameraFound(); return; } contextMenu.show({ id: videoTriggerId, event: e, }); }; const handleCameraToggle = async ( currentConnectedCameras: Array, localStreamVideoIsMuted: boolean ) => { if (!currentConnectedCameras.length) { ToastUtils.pushNoCameraFound(); return; } if (localStreamVideoIsMuted) { // select the first one await CallManager.selectCameraByDeviceId(currentConnectedCameras[0].deviceId); } else { await CallManager.selectCameraByDeviceId(CallManager.DEVICE_DISABLED_DEVICE_ID); } }; const handleMicrophoneToggle = async ( currentConnectedAudioInputs: Array, isAudioMuted: boolean ) => { if (!currentConnectedAudioInputs.length) { ToastUtils.pushNoAudioInputFound(); return; } if (isAudioMuted) { // selects the first one await CallManager.selectAudioInputByDeviceId(currentConnectedAudioInputs[0].deviceId); } else { await CallManager.selectAudioInputByDeviceId(CallManager.DEVICE_DISABLED_DEVICE_ID); } }; // const handleSpeakerToggle = async ( // currentConnectedAudioOutputs: Array, // isAudioOutputMuted: boolean // ) => { // if (!currentConnectedAudioOutputs.length) { // ToastUtils.pushNoAudioInputFound(); // return; // } // if (isAudioOutputMuted) { // // selects the first one // await CallManager.selectAudioOutputByDeviceId(currentConnectedAudioOutputs[0].deviceId); // } else { // await CallManager.selectAudioOutputByDeviceId(CallManager.DEVICE_DISABLED_DEVICE_ID); // } // }; const StyledCallWindowControls = styled.div` position: absolute; bottom: 0px; width: 100%; height: 100%; align-items: flex-end; padding: 10px; border-radius: 10px; margin-left: auto; margin-right: auto; left: 0; right: 0; transition: all 0.25s ease-in-out; display: flex; justify-content: center; opacity: 0; &:hover { opacity: 1; } `; export const CallWindowControls = ({ currentConnectedCameras, currentConnectedAudioInputs, currentConnectedAudioOutputs, isAudioMuted, isAudioOutputMuted, remoteStreamVideoIsMuted, localStreamVideoIsMuted, isFullScreen, }: { isAudioMuted: boolean; isAudioOutputMuted: boolean; localStreamVideoIsMuted: boolean; remoteStreamVideoIsMuted: boolean; currentConnectedAudioInputs: Array; currentConnectedAudioOutputs: Array; currentConnectedCameras: Array; isFullScreen: boolean; }) => { return ( {!remoteStreamVideoIsMuted && } ); };