Fix sync CallEvent peerId for call link roomIds
Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com>
This commit is contained in:
parent
fffdf7f42c
commit
173a7b729a
5 changed files with 74 additions and 17 deletions
|
@ -74,3 +74,7 @@ export function InAnotherCallAndCallActive(
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function MissingCallLink(args: CallLinkDetailsProps): JSX.Element {
|
||||||
|
return <CallLinkDetails {...args} callLink={undefined} />;
|
||||||
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ function toUrlWithoutProtocol(url: URL): string {
|
||||||
|
|
||||||
export type CallLinkDetailsProps = Readonly<{
|
export type CallLinkDetailsProps = Readonly<{
|
||||||
callHistoryGroup: CallHistoryGroup;
|
callHistoryGroup: CallHistoryGroup;
|
||||||
callLink: CallLinkType;
|
callLink: CallLinkType | undefined;
|
||||||
isAnybodyInCall: boolean;
|
isAnybodyInCall: boolean;
|
||||||
isInCall: boolean;
|
isInCall: boolean;
|
||||||
isInAnotherCall: boolean;
|
isInAnotherCall: boolean;
|
||||||
|
@ -58,6 +58,11 @@ export function CallLinkDetails({
|
||||||
}: CallLinkDetailsProps): JSX.Element {
|
}: CallLinkDetailsProps): JSX.Element {
|
||||||
const [isDeleteCallLinkModalOpen, setIsDeleteCallLinkModalOpen] =
|
const [isDeleteCallLinkModalOpen, setIsDeleteCallLinkModalOpen] =
|
||||||
useState(false);
|
useState(false);
|
||||||
|
|
||||||
|
if (!callLink) {
|
||||||
|
return renderMissingCallLink({ callHistoryGroup, i18n });
|
||||||
|
}
|
||||||
|
|
||||||
const webUrl = linkCallRoute.toWebUrl({
|
const webUrl = linkCallRoute.toWebUrl({
|
||||||
key: callLink.rootKey,
|
key: callLink.rootKey,
|
||||||
});
|
});
|
||||||
|
@ -256,3 +261,35 @@ export function CallLinkDetails({
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function renderMissingCallLink({
|
||||||
|
callHistoryGroup,
|
||||||
|
i18n,
|
||||||
|
}: Pick<CallLinkDetailsProps, 'callHistoryGroup' | 'i18n'>): JSX.Element {
|
||||||
|
return (
|
||||||
|
<div className="CallLinkDetails__Container">
|
||||||
|
<header className="CallLinkDetails__Header">
|
||||||
|
<Avatar
|
||||||
|
className="CallLinkDetails__HeaderAvatar"
|
||||||
|
i18n={i18n}
|
||||||
|
badge={undefined}
|
||||||
|
conversationType="callLink"
|
||||||
|
size={AvatarSize.SIXTY_FOUR}
|
||||||
|
acceptedMessageRequest
|
||||||
|
isMe={false}
|
||||||
|
sharedGroupNames={[]}
|
||||||
|
title={i18n('icu:calling__call-link-default-title')}
|
||||||
|
/>
|
||||||
|
<div className="CallLinkDetails__HeaderDetails">
|
||||||
|
<h1 className="CallLinkDetails__HeaderTitle">
|
||||||
|
{i18n('icu:calling__call-link-default-title')}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<CallHistoryGroupPanelSection
|
||||||
|
callHistoryGroup={callHistoryGroup}
|
||||||
|
i18n={i18n}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import {
|
||||||
} from '../selectors/calling';
|
} from '../selectors/calling';
|
||||||
import { useGlobalModalActions } from '../ducks/globalModals';
|
import { useGlobalModalActions } from '../ducks/globalModals';
|
||||||
import { useCallingActions } from '../ducks/calling';
|
import { useCallingActions } from '../ducks/calling';
|
||||||
import * as log from '../../logging/log';
|
|
||||||
import { strictAssert } from '../../util/assert';
|
import { strictAssert } from '../../util/assert';
|
||||||
import type { CallLinkRestrictions } from '../../types/CallLink';
|
import type { CallLinkRestrictions } from '../../types/CallLink';
|
||||||
import { isAnybodyInGroupCall } from '../ducks/callingHelpers';
|
import { isAnybodyInGroupCall } from '../ducks/callingHelpers';
|
||||||
|
@ -77,11 +76,6 @@ export const SmartCallLinkDetails = memo(function SmartCallLinkDetails({
|
||||||
activeCall && callLink && activeCall.conversationId === callLink.roomId
|
activeCall && callLink && activeCall.conversationId === callLink.roomId
|
||||||
);
|
);
|
||||||
|
|
||||||
if (callLink == null) {
|
|
||||||
log.error(`SmartCallLinkDetails: callLink not found for room ${roomId}`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CallLinkDetails
|
<CallLinkDetails
|
||||||
callHistoryGroup={callHistoryGroup}
|
callHistoryGroup={callHistoryGroup}
|
||||||
|
|
|
@ -252,10 +252,14 @@ const peerIdInBytesSchema = z.instanceof(Uint8Array).transform(value => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// groupId or call link roomId
|
// groupId
|
||||||
return Bytes.toBase64(value);
|
return Bytes.toBase64(value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const roomIdInBytesSchema = z
|
||||||
|
.instanceof(Uint8Array)
|
||||||
|
.transform(value => Bytes.toHex(value));
|
||||||
|
|
||||||
const longToStringSchema = z
|
const longToStringSchema = z
|
||||||
.instanceof(Long)
|
.instanceof(Long)
|
||||||
.transform(long => long.toString());
|
.transform(long => long.toString());
|
||||||
|
@ -264,14 +268,29 @@ const longToNumberSchema = z
|
||||||
.instanceof(Long)
|
.instanceof(Long)
|
||||||
.transform(long => long.toNumber());
|
.transform(long => long.toNumber());
|
||||||
|
|
||||||
export const callEventNormalizeSchema = z.object({
|
export const callEventNormalizeSchema = z
|
||||||
peerId: peerIdInBytesSchema,
|
.object({
|
||||||
callId: longToStringSchema,
|
callId: longToStringSchema,
|
||||||
timestamp: longToNumberSchema,
|
timestamp: longToNumberSchema,
|
||||||
type: z.nativeEnum(Proto.SyncMessage.CallEvent.Type),
|
direction: z.nativeEnum(Proto.SyncMessage.CallEvent.Direction),
|
||||||
direction: z.nativeEnum(Proto.SyncMessage.CallEvent.Direction),
|
event: z.nativeEnum(Proto.SyncMessage.CallEvent.Event),
|
||||||
event: z.nativeEnum(Proto.SyncMessage.CallEvent.Event),
|
})
|
||||||
});
|
.and(
|
||||||
|
z.union([
|
||||||
|
z.object({
|
||||||
|
type: z
|
||||||
|
.nativeEnum(Proto.SyncMessage.CallEvent.Type)
|
||||||
|
.refine(val => val === Proto.SyncMessage.CallEvent.Type.AD_HOC_CALL),
|
||||||
|
peerId: roomIdInBytesSchema,
|
||||||
|
}),
|
||||||
|
z.object({
|
||||||
|
type: z
|
||||||
|
.nativeEnum(Proto.SyncMessage.CallEvent.Type)
|
||||||
|
.refine(val => val !== Proto.SyncMessage.CallEvent.Type.AD_HOC_CALL),
|
||||||
|
peerId: peerIdInBytesSchema,
|
||||||
|
}),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
export const callLogEventNormalizeSchema = z.object({
|
export const callLogEventNormalizeSchema = z.object({
|
||||||
type: z.nativeEnum(Proto.SyncMessage.CallLogEvent.Type),
|
type: z.nativeEnum(Proto.SyncMessage.CallLogEvent.Type),
|
||||||
|
|
|
@ -338,10 +338,13 @@ function shouldSyncStatus(callStatus: CallStatus) {
|
||||||
return statusToProto[callStatus] != null;
|
return statusToProto[callStatus] != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For outgoing sync messages. peerId contains direct or group conversationId or
|
||||||
|
// call link peerId. Locally conversationId is Base64 encoded but roomIds
|
||||||
|
// are hex encoded.
|
||||||
export function getBytesForPeerId(callHistory: CallHistoryDetails): Uint8Array {
|
export function getBytesForPeerId(callHistory: CallHistoryDetails): Uint8Array {
|
||||||
let peerId =
|
let peerId =
|
||||||
callHistory.mode === CallMode.Adhoc
|
callHistory.mode === CallMode.Adhoc
|
||||||
? Bytes.fromBase64(callHistory.peerId)
|
? Bytes.fromHex(callHistory.peerId)
|
||||||
: uuidToBytes(callHistory.peerId);
|
: uuidToBytes(callHistory.peerId);
|
||||||
if (peerId.length === 0) {
|
if (peerId.length === 0) {
|
||||||
peerId = Bytes.fromBase64(callHistory.peerId);
|
peerId = Bytes.fromBase64(callHistory.peerId);
|
||||||
|
|
Loading…
Reference in a new issue