Design updates to calling lobby
This commit is contained in:
parent
091f3653e7
commit
58c18ac420
4 changed files with 98 additions and 77 deletions
|
@ -230,8 +230,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin lonely-local-video-preview {
|
@mixin lonely-local-video-preview {
|
||||||
object-fit: cover;
|
max-height: calc(100% - 24px);
|
||||||
opacity: 0.6;
|
height: auto;
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
width: calc(100% - 24px);
|
||||||
|
border-radius: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Buttons
|
// --- Buttons
|
||||||
|
|
|
@ -5235,7 +5235,10 @@ button.module-image__border-overlay:focus {
|
||||||
}
|
}
|
||||||
|
|
||||||
&__local-preview-fullsize {
|
&__local-preview-fullsize {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
justify-content: center;
|
||||||
left: 0;
|
left: 0;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
@ -5245,6 +5248,12 @@ button.module-image__border-overlay:focus {
|
||||||
video {
|
video {
|
||||||
@include lonely-local-video-preview;
|
@include lonely-local-video-preview;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&--presenting {
|
||||||
|
video {
|
||||||
|
transform: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__footer {
|
&__footer {
|
||||||
|
|
|
@ -3,14 +3,17 @@
|
||||||
|
|
||||||
.module-CallingLobby {
|
.module-CallingLobby {
|
||||||
&__local-preview {
|
&__local-preview {
|
||||||
@include lonely-local-video-preview;
|
|
||||||
height: 100%;
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
|
|
||||||
&--camera-is-on {
|
&--camera-is-on {
|
||||||
transform: rotateY(180deg);
|
@include lonely-local-video-preview;
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
&--camera-is-off {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -211,6 +211,8 @@ export const CallScreen: React.FC<PropsType> = ({
|
||||||
remoteParticipant => remoteParticipant.hasRemoteVideo
|
remoteParticipant => remoteParticipant.hasRemoteVideo
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const isSendingVideo = hasLocalVideo || presentingSource;
|
||||||
|
|
||||||
let isRinging: boolean;
|
let isRinging: boolean;
|
||||||
let hasCallStarted: boolean;
|
let hasCallStarted: boolean;
|
||||||
let headerMessage: string | undefined;
|
let headerMessage: string | undefined;
|
||||||
|
@ -278,9 +280,80 @@ export const CallScreen: React.FC<PropsType> = ({
|
||||||
throw missingCaseError(activeCall);
|
throw missingCaseError(activeCall);
|
||||||
}
|
}
|
||||||
|
|
||||||
const isLonelyInGroup =
|
let lonelyInGroupNode: ReactNode;
|
||||||
|
let localPreviewNode: ReactNode;
|
||||||
|
if (
|
||||||
activeCall.callMode === CallMode.Group &&
|
activeCall.callMode === CallMode.Group &&
|
||||||
!activeCall.remoteParticipants.length;
|
!activeCall.remoteParticipants.length
|
||||||
|
) {
|
||||||
|
lonelyInGroupNode = (
|
||||||
|
<div
|
||||||
|
className={classNames(
|
||||||
|
'module-ongoing-call__local-preview-fullsize',
|
||||||
|
presentingSource &&
|
||||||
|
'module-ongoing-call__local-preview-fullsize--presenting'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{isSendingVideo ? (
|
||||||
|
<video ref={localVideoRef} autoPlay />
|
||||||
|
) : (
|
||||||
|
<CallBackgroundBlur avatarPath={me.avatarPath} color={me.color}>
|
||||||
|
<Avatar
|
||||||
|
acceptedMessageRequest
|
||||||
|
avatarPath={me.avatarPath}
|
||||||
|
color={me.color || AvatarColors[0]}
|
||||||
|
noteToSelf={false}
|
||||||
|
conversationType="direct"
|
||||||
|
i18n={i18n}
|
||||||
|
isMe
|
||||||
|
name={me.name}
|
||||||
|
phoneNumber={me.phoneNumber}
|
||||||
|
profileName={me.profileName}
|
||||||
|
title={me.title}
|
||||||
|
// `sharedGroupNames` makes no sense for yourself, but `<Avatar>` needs it
|
||||||
|
// to determine blurring.
|
||||||
|
sharedGroupNames={[]}
|
||||||
|
size={80}
|
||||||
|
/>
|
||||||
|
<div className="module-calling__camera-is-off">
|
||||||
|
{i18n('calling__your-video-is-off')}
|
||||||
|
</div>
|
||||||
|
</CallBackgroundBlur>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
localPreviewNode = isSendingVideo ? (
|
||||||
|
<video
|
||||||
|
className={classNames(
|
||||||
|
'module-ongoing-call__footer__local-preview__video',
|
||||||
|
presentingSource &&
|
||||||
|
'module-ongoing-call__footer__local-preview__video--presenting'
|
||||||
|
)}
|
||||||
|
ref={localVideoRef}
|
||||||
|
autoPlay
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<CallBackgroundBlur avatarPath={me.avatarPath} color={me.color}>
|
||||||
|
<Avatar
|
||||||
|
acceptedMessageRequest
|
||||||
|
avatarPath={me.avatarPath}
|
||||||
|
color={me.color || AvatarColors[0]}
|
||||||
|
noteToSelf={false}
|
||||||
|
conversationType="direct"
|
||||||
|
i18n={i18n}
|
||||||
|
isMe
|
||||||
|
name={me.name}
|
||||||
|
phoneNumber={me.phoneNumber}
|
||||||
|
profileName={me.profileName}
|
||||||
|
title={me.title}
|
||||||
|
// See comment above about `sharedGroupNames`.
|
||||||
|
sharedGroupNames={[]}
|
||||||
|
size={80}
|
||||||
|
/>
|
||||||
|
</CallBackgroundBlur>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let videoButtonType: CallingButtonType;
|
let videoButtonType: CallingButtonType;
|
||||||
if (presentingSource) {
|
if (presentingSource) {
|
||||||
|
@ -305,12 +378,6 @@ export const CallScreen: React.FC<PropsType> = ({
|
||||||
});
|
});
|
||||||
|
|
||||||
const isGroupCall = activeCall.callMode === CallMode.Group;
|
const isGroupCall = activeCall.callMode === CallMode.Group;
|
||||||
const localPreviewVideoClass = classNames({
|
|
||||||
'module-ongoing-call__footer__local-preview__video': true,
|
|
||||||
'module-ongoing-call__footer__local-preview__video--presenting': Boolean(
|
|
||||||
presentingSource
|
|
||||||
),
|
|
||||||
});
|
|
||||||
|
|
||||||
let presentingButtonType: CallingButtonType;
|
let presentingButtonType: CallingButtonType;
|
||||||
if (presentingSource) {
|
if (presentingSource) {
|
||||||
|
@ -320,7 +387,6 @@ export const CallScreen: React.FC<PropsType> = ({
|
||||||
} else {
|
} else {
|
||||||
presentingButtonType = CallingButtonType.PRESENTING_OFF;
|
presentingButtonType = CallingButtonType.PRESENTING_OFF;
|
||||||
}
|
}
|
||||||
const isSendingVideo = hasLocalVideo || presentingSource;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
@ -375,41 +441,7 @@ export const CallScreen: React.FC<PropsType> = ({
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{remoteParticipantsElement}
|
{remoteParticipantsElement}
|
||||||
{isSendingVideo && isLonelyInGroup ? (
|
{lonelyInGroupNode}
|
||||||
<div className="module-ongoing-call__local-preview-fullsize">
|
|
||||||
<video
|
|
||||||
className={localPreviewVideoClass}
|
|
||||||
ref={localVideoRef}
|
|
||||||
autoPlay
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
) : null}
|
|
||||||
{!isSendingVideo && isLonelyInGroup ? (
|
|
||||||
<div className="module-ongoing-call__local-preview-fullsize">
|
|
||||||
<CallBackgroundBlur avatarPath={me.avatarPath} color={me.color}>
|
|
||||||
<Avatar
|
|
||||||
acceptedMessageRequest
|
|
||||||
avatarPath={me.avatarPath}
|
|
||||||
color={me.color || AvatarColors[0]}
|
|
||||||
noteToSelf={false}
|
|
||||||
conversationType="direct"
|
|
||||||
i18n={i18n}
|
|
||||||
isMe
|
|
||||||
name={me.name}
|
|
||||||
phoneNumber={me.phoneNumber}
|
|
||||||
profileName={me.profileName}
|
|
||||||
title={me.title}
|
|
||||||
// `sharedGroupNames` makes no sense for yourself, but `<Avatar>` needs it
|
|
||||||
// to determine blurring.
|
|
||||||
sharedGroupNames={[]}
|
|
||||||
size={80}
|
|
||||||
/>
|
|
||||||
<div className="module-calling__camera-is-off">
|
|
||||||
{i18n('calling__your-video-is-off')}
|
|
||||||
</div>
|
|
||||||
</CallBackgroundBlur>
|
|
||||||
</div>
|
|
||||||
) : null}
|
|
||||||
<div className="module-ongoing-call__footer">
|
<div className="module-ongoing-call__footer">
|
||||||
{/* This layout-only element is not ideal.
|
{/* This layout-only element is not ideal.
|
||||||
See the comment in _modules.css for more. */}
|
See the comment in _modules.css for more. */}
|
||||||
|
@ -450,33 +482,7 @@ export const CallScreen: React.FC<PropsType> = ({
|
||||||
'module-ongoing-call__footer__local-preview--audio-muted': !hasLocalAudio,
|
'module-ongoing-call__footer__local-preview--audio-muted': !hasLocalAudio,
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
{isSendingVideo && !isLonelyInGroup ? (
|
{localPreviewNode}
|
||||||
<video
|
|
||||||
className={localPreviewVideoClass}
|
|
||||||
ref={localVideoRef}
|
|
||||||
autoPlay
|
|
||||||
/>
|
|
||||||
) : null}
|
|
||||||
{!isSendingVideo && !isLonelyInGroup ? (
|
|
||||||
<CallBackgroundBlur avatarPath={me.avatarPath} color={me.color}>
|
|
||||||
<Avatar
|
|
||||||
acceptedMessageRequest
|
|
||||||
avatarPath={me.avatarPath}
|
|
||||||
color={me.color || AvatarColors[0]}
|
|
||||||
noteToSelf={false}
|
|
||||||
conversationType="direct"
|
|
||||||
i18n={i18n}
|
|
||||||
isMe
|
|
||||||
name={me.name}
|
|
||||||
phoneNumber={me.phoneNumber}
|
|
||||||
profileName={me.profileName}
|
|
||||||
title={me.title}
|
|
||||||
// See comment above about `sharedGroupNames`.
|
|
||||||
sharedGroupNames={[]}
|
|
||||||
size={80}
|
|
||||||
/>
|
|
||||||
</CallBackgroundBlur>
|
|
||||||
) : null}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in a new issue