-
Notifications
You must be signed in to change notification settings - Fork 67
Expand file tree
/
Copy pathIncomingCallDialog.tsx
More file actions
111 lines (102 loc) · 3.5 KB
/
IncomingCallDialog.tsx
File metadata and controls
111 lines (102 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { useEffect } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import { useConversationUsernameWithFallback } from '../../hooks/useParamSelector';
import { CallManager } from '../../session/utils';
import { ed25519Str } from '../../session/utils/String';
import { callTimeoutMs } from '../../session/utils/calling/CallManager';
import { getHasIncomingCall, getHasIncomingCallFrom } from '../../state/selectors/call';
import { Avatar, AvatarSize } from '../avatar/Avatar';
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
import { tr } from '../../localization/localeTools';
import {
ModalBasicHeader,
ModalActionsContainer,
SessionWrapperModal,
} from '../SessionWrapperModal';
export const CallWindow = styled.div`
position: absolute;
z-index: 9;
padding: 1rem;
top: 50vh;
left: 50vw;
transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
background-color: var(--modal-background-content-color);
border: var(--default-borders);
`;
const IncomingCallAvatarContainer = styled.div`
padding: 15px;
`;
export const IncomingCallDialog = () => {
const hasIncomingCall = useSelector(getHasIncomingCall);
const incomingCallFromPubkey = useSelector(getHasIncomingCallFrom);
useEffect(() => {
let timeout: NodeJS.Timeout;
if (incomingCallFromPubkey) {
// eslint-disable-next-line @typescript-eslint/no-misused-promises
timeout = global.setTimeout(async () => {
if (incomingCallFromPubkey) {
window.log.info(
`call missed with ${ed25519Str(
incomingCallFromPubkey
)} as the dialog was not interacted with for ${callTimeoutMs} ms`
);
await CallManager.USER_rejectIncomingCallRequest(incomingCallFromPubkey);
}
}, callTimeoutMs);
}
return () => {
if (timeout) {
global.clearTimeout(timeout);
}
};
}, [incomingCallFromPubkey]);
const handleAcceptIncomingCall = async () => {
if (incomingCallFromPubkey) {
await CallManager.USER_acceptIncomingCallRequest(incomingCallFromPubkey);
}
};
const handleDeclineIncomingCall = async () => {
// close the modal
if (incomingCallFromPubkey) {
await CallManager.USER_rejectIncomingCallRequest(incomingCallFromPubkey);
}
};
const from = useConversationUsernameWithFallback(true, incomingCallFromPubkey);
if (!hasIncomingCall || !incomingCallFromPubkey) {
return null;
}
if (hasIncomingCall) {
return (
<SessionWrapperModal
modalId="confirmModal"
headerChildren={
<ModalBasicHeader title={tr('callsIncoming', { name: from ?? tr('unknown') })} />
}
buttonChildren={
<ModalActionsContainer buttonType={SessionButtonType.Simple}>
<SessionButton
text={tr('accept')}
buttonType={SessionButtonType.Simple}
onClick={handleAcceptIncomingCall}
buttonColor={SessionButtonColor.Danger}
/>
<SessionButton
text={tr('decline')}
buttonType={SessionButtonType.Simple}
onClick={handleDeclineIncomingCall}
/>
</ModalActionsContainer>
}
>
<IncomingCallAvatarContainer>
<Avatar size={AvatarSize.XL} pubkey={incomingCallFromPubkey} />
</IncomingCallAvatarContainer>
</SessionWrapperModal>
);
}
// display spinner while connecting
return null;
};