packages/storybook8/stories/Composites/CallComposite/1ton/components/SimpleInboundHomeScreen.tsx (106 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. import { Call, CallAgent, IncomingCall, IncomingCallEvent } from '@azure/communication-calling'; import { CommunicationUserIdentifier } from '@azure/communication-common'; import { CallClientState } from '@azure/communication-react'; import { Stack, Text, TextField, IStackTokens, mergeStyles } from '@fluentui/react'; import React, { useEffect, useRef, useState } from 'react'; import { IncomingCallToast } from './IncomingCallAlerts'; export interface HomeScreenProps { callState: CallClientState; callAgent: CallAgent; userId?: CommunicationUserIdentifier; onAcceptIncomingCall(call: Call): void; } export const HomeScreen = (props: HomeScreenProps): JSX.Element => { const { callState, callAgent, userId, onAcceptIncomingCall } = props; const headerTitle = 'Inbound Azure Communication User Sample'; const [incomingCall, setIncomingCall] = useState<IncomingCall>(); const interval = useRef<NodeJS.Timeout>(); // @TODO: Add a method in declarative callAgent to get a declarative Incoming Call Object. Use that object here. console.log('incoming calls', callState.incomingCalls); /** * Subscribe to incoming call events. */ useEffect(() => { const incomingCallListener: IncomingCallEvent = ({ incomingCall }) => { setIncomingCall(incomingCall); }; callAgent.on('incomingCall', incomingCallListener); return () => { callAgent.off('incomingCall', incomingCallListener); }; }, [callAgent]); /** * Incoming Call Ringtone */ useEffect(() => { if (incomingCall) { const audio = new Audio('https://cdn.freesound.org/previews/29/29621_98464-lq.mp3'); interval.current = setInterval(() => { audio.pause(); audio.currentTime = 0; audio.play(); }, 3000); } else { if (interval.current) { clearInterval(interval.current); } } return () => { if (interval.current) { clearInterval(interval.current); } }; }, [incomingCall]); const onRejectCall = (): void => { if (incomingCall) { incomingCall.reject(); } setIncomingCall(undefined); }; const onAcceptCall = async (): Promise<void> => { if (incomingCall) { const call = await incomingCall.accept(); onAcceptIncomingCall(call); } setIncomingCall(undefined); }; return ( <> {incomingCall && ( <Stack style={{ position: 'absolute', bottom: '2rem', right: '2rem' }}> <IncomingCallToast callerName={incomingCall.callerInfo.displayName} onClickAccept={onAcceptCall} onClickReject={onRejectCall} /> </Stack> )} <Stack horizontal wrap horizontalAlign="center" verticalAlign="center" className={containerStyle}> <Stack className={infoContainerStyle}> <Text role={'heading'} aria-level={1} className={headerStyle}> {headerTitle} </Text> <Stack className={configContainerStyle} tokens={configContainerStackTokens}> <TextField readOnly contentEditable={false} label="Your User ID" value={userId?.communicationUserId} /> </Stack> </Stack> </Stack> </> ); }; const infoContainerStyle = mergeStyles({ padding: '0.5rem', width: '20rem' }); const containerStyle = mergeStyles({ height: '100%', width: '100% ' }); const configContainerStyle = mergeStyles({ minWidth: '10rem', width: 'auto', height: 'auto' }); const configContainerStackTokens: IStackTokens = { childrenGap: '1.25rem' }; const headerStyle = mergeStyles({ fontWeight: 600, fontSize: '1.25rem', // 20px lineHeight: '1.75rem', // 28px width: '20rem', marginBottom: '1.5rem' });