diff --git a/ts/components/session/calling/InConversationCallContainer.tsx b/ts/components/session/calling/InConversationCallContainer.tsx
index a2db31e70..667bdde48 100644
--- a/ts/components/session/calling/InConversationCallContainer.tsx
+++ b/ts/components/session/calling/InConversationCallContainer.tsx
@@ -24,6 +24,7 @@ import {
useOurAvatarPath,
useOurConversationUsername,
} from '../../../hooks/useParamSelector';
+import { useModuloWithTripleDots } from '../../../hooks/useModuloWithTripleDots';
const VideoContainer = styled.div`
height: 100%;
@@ -258,20 +259,26 @@ const StyledCenteredLabel = styled.div`
const RingingLabel = () => {
const ongoingCallWithFocusedIsRinging = useSelector(getHasOngoingCallWithFocusedConvoIsOffering);
+
+ const modulatedStr = useModuloWithTripleDots(window.i18n('ringing'), 3, 1000);
if (!ongoingCallWithFocusedIsRinging) {
return null;
}
- return {window.i18n('ringing')};
+ return {modulatedStr};
};
const ConnectingLabel = () => {
const ongoingCallWithFocusedIsConnecting = useSelector(
getHasOngoingCallWithFocusedConvosIsConnecting
);
+
+ const modulatedStr = useModuloWithTripleDots(window.i18n('establishingConnection'), 3, 1000);
+
if (!ongoingCallWithFocusedIsConnecting) {
return null;
}
- return {window.i18n('establishingConnection')};
+
+ return {modulatedStr};
};
// tslint:disable-next-line: max-func-body-length
diff --git a/ts/components/session/calling/IncomingCallDialog.tsx b/ts/components/session/calling/IncomingCallDialog.tsx
index 73990a0de..5e7db9e6f 100644
--- a/ts/components/session/calling/IncomingCallDialog.tsx
+++ b/ts/components/session/calling/IncomingCallDialog.tsx
@@ -1,9 +1,10 @@
-import React from 'react';
+import React, { useEffect } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import _ from 'underscore';
import { useAvatarPath, useConversationUsername } from '../../../hooks/useParamSelector';
+import { ed25519Str } from '../../../session/onions/onionPath';
import { CallManager } from '../../../session/utils';
import { getHasIncomingCall, getHasIncomingCallFrom } from '../../../state/selectors/conversations';
import { Avatar, AvatarSize } from '../../Avatar';
@@ -27,10 +28,34 @@ const IncomingCallAvatatContainer = styled.div`
padding: 0 0 2rem 0;
`;
+const timeoutMs = 60000;
+
export const IncomingCallDialog = () => {
const hasIncomingCall = useSelector(getHasIncomingCall);
const incomingCallFromPubkey = useSelector(getHasIncomingCallFrom);
+ useEffect(() => {
+ let timeout: NodeJS.Timeout;
+ if (incomingCallFromPubkey) {
+ timeout = global.setTimeout(async () => {
+ if (incomingCallFromPubkey) {
+ window.log.info(
+ `call missed with ${ed25519Str(
+ incomingCallFromPubkey
+ )} as dialog was not interacted with for ${timeoutMs} ms`
+ );
+ await CallManager.USER_rejectIncomingCallRequest(incomingCallFromPubkey);
+ }
+ }, timeoutMs);
+ }
+
+ return () => {
+ if (timeout) {
+ global.clearTimeout(timeout);
+ }
+ };
+ }, [incomingCallFromPubkey]);
+
//#region input handlers
const handleAcceptIncomingCall = async () => {
if (incomingCallFromPubkey) {
diff --git a/ts/hooks/useModulo.ts b/ts/hooks/useModulo.ts
new file mode 100644
index 000000000..1d71d1482
--- /dev/null
+++ b/ts/hooks/useModulo.ts
@@ -0,0 +1,17 @@
+import React from 'react';
+// tslint:disable-next-line: no-submodule-imports
+import useInterval from 'react-use/lib/useInterval';
+
+export function useModulo(loopBackAt: number, delay: number) {
+ const [count, setCount] = React.useState(0);
+
+ useInterval(() => {
+ if (count >= loopBackAt) {
+ setCount(0);
+ } else {
+ setCount(count + 1);
+ }
+ }, delay);
+ console.warn('useModulo', count);
+ return { count };
+}
diff --git a/ts/hooks/useModuloWithTripleDots.ts b/ts/hooks/useModuloWithTripleDots.ts
new file mode 100644
index 000000000..9f951eadd
--- /dev/null
+++ b/ts/hooks/useModuloWithTripleDots.ts
@@ -0,0 +1,14 @@
+import { useModulo } from './useModulo';
+
+export function useModuloWithTripleDots(
+ localizedString: string,
+ loopBackAt: number,
+ delay: number
+) {
+ const modulo = useModulo(loopBackAt, delay);
+
+ if (localizedString.endsWith('...')) {
+ return localizedString.slice(0, localizedString.length - (loopBackAt - modulo.count));
+ }
+ return localizedString;
+}
diff --git a/ts/session/utils/CallManager.ts b/ts/session/utils/CallManager.ts
index 4c0eb7154..cf45136a8 100644
--- a/ts/session/utils/CallManager.ts
+++ b/ts/session/utils/CallManager.ts
@@ -698,7 +698,7 @@ export async function USER_hangup(fromSender: string) {
timestamp: Date.now(),
uuid: currentCallUUID,
});
- await getMessageQueue().sendToPubKeyNonDurably(PubKey.cast(fromSender), endCallMessage);
+ void getMessageQueue().sendToPubKeyNonDurably(PubKey.cast(fromSender), endCallMessage);
}
window.inboxStore?.dispatch(endCall({ pubkey: fromSender }));
@@ -825,7 +825,7 @@ export async function handleCallTypeOffer(
}
}
-async function handleMissedCall(
+export async function handleMissedCall(
sender: string,
incomingOfferTimestamp: number,
isBecauseOfCallPermission: boolean