mirror of
https://github.com/vector-im/element-call.git
synced 2026-07-18 18:59:23 +00:00
Merge pull request #4032 from element-hq/toger5/lobby-remove-minimise-add-back-button
Add primary button icon configuration and set it left arrow in lobby
This commit is contained in:
@@ -6,18 +6,22 @@ Please see LICENSE in the repository root for full details.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {
|
import {
|
||||||
createContext,
|
|
||||||
type FC,
|
|
||||||
type MouseEvent,
|
|
||||||
type ReactNode,
|
|
||||||
use,
|
use,
|
||||||
useCallback,
|
useCallback,
|
||||||
useEffect,
|
useEffect,
|
||||||
useMemo,
|
useMemo,
|
||||||
useState,
|
useState,
|
||||||
|
createContext,
|
||||||
|
type FC,
|
||||||
|
type MouseEvent,
|
||||||
|
type ReactNode,
|
||||||
} from "react";
|
} from "react";
|
||||||
import { Heading, IconButton, Tooltip } from "@vector-im/compound-web";
|
import { Heading, IconButton, Tooltip } from "@vector-im/compound-web";
|
||||||
import { CollapseIcon } from "@vector-im/compound-design-tokens/assets/web/icons";
|
import {
|
||||||
|
ArrowLeftIcon,
|
||||||
|
ChevronLeftIcon,
|
||||||
|
CollapseIcon,
|
||||||
|
} from "@vector-im/compound-design-tokens/assets/web/icons";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { logger } from "matrix-js-sdk/lib/logger";
|
import { logger } from "matrix-js-sdk/lib/logger";
|
||||||
|
|
||||||
@@ -28,6 +32,7 @@ import styles from "./AppBar.module.css";
|
|||||||
interface AppBarContext {
|
interface AppBarContext {
|
||||||
setTitle: (value: string) => void;
|
setTitle: (value: string) => void;
|
||||||
setSecondaryButton: (value: ReactNode) => void;
|
setSecondaryButton: (value: ReactNode) => void;
|
||||||
|
setPrimaryButtonIconKind: (value: "back" | "minimise") => void;
|
||||||
setHidden: (value: boolean) => void;
|
setHidden: (value: boolean) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,11 +58,22 @@ export const AppBar: FC<Props> = ({ children }) => {
|
|||||||
const [secondaryButton, setSecondaryButton] = useState<ReactNode | null>(
|
const [secondaryButton, setSecondaryButton] = useState<ReactNode | null>(
|
||||||
null,
|
null,
|
||||||
);
|
);
|
||||||
|
const [primaryButtonIcon, setPrimaryButtonIconKind] = useState<
|
||||||
|
"back" | "minimise"
|
||||||
|
>("minimise");
|
||||||
|
|
||||||
const context = useMemo(
|
const context = useMemo(
|
||||||
() => ({ setTitle, setSecondaryButton, setHidden }),
|
() => ({
|
||||||
[setTitle, setHidden, setSecondaryButton],
|
setTitle,
|
||||||
|
setSecondaryButton,
|
||||||
|
setHidden,
|
||||||
|
setPrimaryButtonIconKind,
|
||||||
|
}),
|
||||||
|
[setTitle, setHidden, setSecondaryButton, setPrimaryButtonIconKind],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const BackIcon = platform === "android" ? ArrowLeftIcon : ChevronLeftIcon;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div
|
<div
|
||||||
@@ -71,8 +87,17 @@ export const AppBar: FC<Props> = ({ children }) => {
|
|||||||
>
|
>
|
||||||
<LeftNav>
|
<LeftNav>
|
||||||
<Tooltip label={t("common.back")}>
|
<Tooltip label={t("common.back")}>
|
||||||
<IconButton size="24px" onClick={onBackClick}>
|
<IconButton
|
||||||
<CollapseIcon aria-hidden />
|
// We render the back button (PrimaryButtonIcon) the same size as the native os.
|
||||||
|
// We render the minimise icon (default) smaller as per designs.
|
||||||
|
size={primaryButtonIcon === "back" ? "32px" : "24px"}
|
||||||
|
onClick={onBackClick}
|
||||||
|
>
|
||||||
|
{primaryButtonIcon === "back" ? (
|
||||||
|
<BackIcon aria-hidden />
|
||||||
|
) : (
|
||||||
|
<CollapseIcon aria-hidden />
|
||||||
|
)}
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</LeftNav>
|
</LeftNav>
|
||||||
@@ -107,6 +132,22 @@ export function useAppBarTitle(title: string): void {
|
|||||||
}, [title, setTitle]);
|
}, [title, setTitle]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* React hook which sets the primary button icon kind. Can only be "minimise" or "back"
|
||||||
|
* It is an error to call this hook from multiple sites in the same component tree.
|
||||||
|
*/
|
||||||
|
export function useAppBarPrimaryButtonIconKind(
|
||||||
|
icon: "back" | "minimise",
|
||||||
|
): void {
|
||||||
|
const setIconKind = use(AppBarContext)?.setPrimaryButtonIconKind;
|
||||||
|
useEffect(() => {
|
||||||
|
if (setIconKind !== undefined) {
|
||||||
|
setIconKind(icon);
|
||||||
|
return (): void => setIconKind("minimise");
|
||||||
|
}
|
||||||
|
}, [setIconKind, icon]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* React hook which sets the title to be shown in the app bar, if present. It is
|
* React hook which sets the title to be shown in the app bar, if present. It is
|
||||||
* an error to call this hook from multiple sites in the same component tree.
|
* an error to call this hook from multiple sites in the same component tree.
|
||||||
|
|||||||
@@ -11,6 +11,10 @@ import { BrowserRouter } from "react-router-dom";
|
|||||||
import { TooltipProvider } from "@vector-im/compound-web";
|
import { TooltipProvider } from "@vector-im/compound-web";
|
||||||
import { type MatrixClient } from "matrix-js-sdk";
|
import { type MatrixClient } from "matrix-js-sdk";
|
||||||
import { axe } from "vitest-axe";
|
import { axe } from "vitest-axe";
|
||||||
|
import {
|
||||||
|
ArrowLeftIcon,
|
||||||
|
ChevronLeftIcon,
|
||||||
|
} from "@vector-im/compound-design-tokens/assets/web/icons";
|
||||||
|
|
||||||
import { LobbyView } from "./LobbyView";
|
import { LobbyView } from "./LobbyView";
|
||||||
import { E2eeType } from "../e2ee/e2eeType";
|
import { E2eeType } from "../e2ee/e2eeType";
|
||||||
@@ -20,6 +24,7 @@ import { type ProcessorState } from "../livekit/TrackProcessorContext";
|
|||||||
import { type EncryptionSystem } from "../e2ee/sharedKeyManagement";
|
import { type EncryptionSystem } from "../e2ee/sharedKeyManagement";
|
||||||
import lobbyStyles from "./LobbyView.module.css";
|
import lobbyStyles from "./LobbyView.module.css";
|
||||||
import headerStyles from "../Header.module.css";
|
import headerStyles from "../Header.module.css";
|
||||||
|
import { AppBar } from "../AppBar";
|
||||||
|
|
||||||
vi.mock("@livekit/components-react", () => ({
|
vi.mock("@livekit/components-react", () => ({
|
||||||
usePreviewTracks: (): unknown[] => [],
|
usePreviewTracks: (): unknown[] => [],
|
||||||
@@ -47,6 +52,13 @@ const mockClient = {
|
|||||||
getDeviceId: () => "DEVICE",
|
getDeviceId: () => "DEVICE",
|
||||||
} as Partial<MatrixClient> as MatrixClient;
|
} as Partial<MatrixClient> as MatrixClient;
|
||||||
|
|
||||||
|
const platformMock = vi.hoisted(() => vi.fn(() => "desktop"));
|
||||||
|
vi.mock("../Platform", () => ({
|
||||||
|
get platform(): string {
|
||||||
|
return platformMock();
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
const matrixInfo = {
|
const matrixInfo = {
|
||||||
userId: "@user:example.org",
|
userId: "@user:example.org",
|
||||||
displayName: "Test User",
|
displayName: "Test User",
|
||||||
@@ -60,25 +72,32 @@ const matrixInfo = {
|
|||||||
|
|
||||||
function renderLobbyView(
|
function renderLobbyView(
|
||||||
props: Partial<Parameters<typeof LobbyView>[0]> = {},
|
props: Partial<Parameters<typeof LobbyView>[0]> = {},
|
||||||
|
withAppBar = false,
|
||||||
|
platform = "android",
|
||||||
): ReturnType<typeof render> {
|
): ReturnType<typeof render> {
|
||||||
|
platformMock.mockReturnValue(platform);
|
||||||
const mediaDevices = mockMediaDevices({});
|
const mediaDevices = mockMediaDevices({});
|
||||||
const muteStates = mockMuteStates();
|
const muteStates = mockMuteStates();
|
||||||
|
const hideHeader = withAppBar ? true : false;
|
||||||
|
const lobbyView = (
|
||||||
|
<LobbyView
|
||||||
|
client={mockClient}
|
||||||
|
matrixInfo={matrixInfo}
|
||||||
|
muteStates={muteStates}
|
||||||
|
onEnter={() => {}}
|
||||||
|
confineToRoom={false}
|
||||||
|
hideHeader={hideHeader}
|
||||||
|
participantCount={3}
|
||||||
|
onShareClick={null}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
return render(
|
return render(
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<MediaDevicesContext value={mediaDevices}>
|
<MediaDevicesContext value={mediaDevices}>
|
||||||
<TooltipProvider>
|
<TooltipProvider>
|
||||||
<LobbyView
|
{withAppBar && <AppBar>{lobbyView}</AppBar>}
|
||||||
client={mockClient}
|
{!withAppBar && lobbyView}
|
||||||
matrixInfo={matrixInfo}
|
|
||||||
muteStates={muteStates}
|
|
||||||
onEnter={() => {}}
|
|
||||||
confineToRoom={false}
|
|
||||||
hideHeader={false}
|
|
||||||
participantCount={3}
|
|
||||||
onShareClick={null}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
</TooltipProvider>
|
</TooltipProvider>
|
||||||
</MediaDevicesContext>
|
</MediaDevicesContext>
|
||||||
</BrowserRouter>,
|
</BrowserRouter>,
|
||||||
@@ -97,9 +116,10 @@ describe("LobbyView", () => {
|
|||||||
|
|
||||||
it("renders without header", () => {
|
it("renders without header", () => {
|
||||||
const { container } = renderLobbyView({ hideHeader: true });
|
const { container } = renderLobbyView({ hideHeader: true });
|
||||||
expect(
|
const els = container.getElementsByClassName(headerStyles.header);
|
||||||
container.getElementsByClassName(headerStyles.header).length,
|
for (const el of els) {
|
||||||
).toBeFalsy();
|
expect(el).not.toBeVisible();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it("renders with waiting for invite state", () => {
|
it("renders with waiting for invite state", () => {
|
||||||
@@ -108,4 +128,56 @@ describe("LobbyView", () => {
|
|||||||
});
|
});
|
||||||
expect(getByTestId("lobby_joinCall")).toHaveClass(lobbyStyles.wait);
|
expect(getByTestId("lobby_joinCall")).toHaveClass(lobbyStyles.wait);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("renders with AppBar android", async () => {
|
||||||
|
const { container } = renderLobbyView(
|
||||||
|
{
|
||||||
|
waitingForInvite: true,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
"android",
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
container.getElementsByClassName(headerStyles.header).length,
|
||||||
|
).toBeTruthy();
|
||||||
|
// Check that the primary button uses ArrowLeftIcon (the back/return icon),
|
||||||
|
// not the default CollapseIcon
|
||||||
|
const { container: iconContainer } = render(<ArrowLeftIcon />);
|
||||||
|
const expectedSvgPath = iconContainer
|
||||||
|
.querySelector("path")!
|
||||||
|
.getAttribute("d");
|
||||||
|
const primaryButtonSvgPath = container
|
||||||
|
.querySelector(".leftNav button")
|
||||||
|
?.querySelector("path")
|
||||||
|
?.getAttribute("d");
|
||||||
|
expect(primaryButtonSvgPath).toBe(expectedSvgPath);
|
||||||
|
expect(container).toMatchSnapshot();
|
||||||
|
expect(await axe(container)).toHaveNoViolations();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("renders with AppBar ios", async () => {
|
||||||
|
const { container } = renderLobbyView(
|
||||||
|
{
|
||||||
|
waitingForInvite: true,
|
||||||
|
},
|
||||||
|
true,
|
||||||
|
"ios",
|
||||||
|
);
|
||||||
|
expect(
|
||||||
|
container.getElementsByClassName(headerStyles.header).length,
|
||||||
|
).toBeTruthy();
|
||||||
|
// Check that the primary button uses ArrowLeftIcon (the back/return icon),
|
||||||
|
// not the default CollapseIcon
|
||||||
|
const { container: iconContainer } = render(<ChevronLeftIcon />);
|
||||||
|
const expectedSvgPath = iconContainer
|
||||||
|
.querySelector("path")!
|
||||||
|
.getAttribute("d");
|
||||||
|
const primaryButtonSvgPath = container
|
||||||
|
.querySelector(".leftNav button")
|
||||||
|
?.querySelector("path")
|
||||||
|
?.getAttribute("d");
|
||||||
|
expect(primaryButtonSvgPath).toBe(expectedSvgPath);
|
||||||
|
expect(container).toMatchSnapshot();
|
||||||
|
expect(await axe(container)).toHaveNoViolations();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ import { CallFooter, type FooterSnapshot } from "../components/CallFooter";
|
|||||||
import { useCallViewKeyboardShortcuts } from "../useCallViewKeyboardShortcuts";
|
import { useCallViewKeyboardShortcuts } from "../useCallViewKeyboardShortcuts";
|
||||||
import { createLobbyFooterViewModel } from "../components/CallFooterViewModel";
|
import { createLobbyFooterViewModel } from "../components/CallFooterViewModel";
|
||||||
import { type ViewModel } from "../state/ViewModel";
|
import { type ViewModel } from "../state/ViewModel";
|
||||||
|
import { useAppBarPrimaryButtonIconKind } from "../AppBar";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
client: MatrixClient;
|
client: MatrixClient;
|
||||||
@@ -85,8 +86,9 @@ export const LobbyView: FC<Props> = ({
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
usePageTitle(matrixInfo.roomName);
|
|
||||||
|
|
||||||
|
usePageTitle(matrixInfo.roomName);
|
||||||
|
useAppBarPrimaryButtonIconKind("back");
|
||||||
const audioEnabled = useBehavior(muteStates.audio.enabled$);
|
const audioEnabled = useBehavior(muteStates.audio.enabled$);
|
||||||
const videoEnabled = useBehavior(muteStates.video.enabled$);
|
const videoEnabled = useBehavior(muteStates.video.enabled$);
|
||||||
const toggleAudio = useBehavior(muteStates.audio.toggle$);
|
const toggleAudio = useBehavior(muteStates.audio.toggle$);
|
||||||
|
|||||||
@@ -1,5 +1,481 @@
|
|||||||
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
||||||
|
|
||||||
|
exports[`LobbyView > renders with AppBar android 1`] = `
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="bar"
|
||||||
|
style="display: block;"
|
||||||
|
>
|
||||||
|
<header
|
||||||
|
class="header"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="nav leftNav"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
aria-labelledby="_r_36_"
|
||||||
|
class="_icon-button_1215g_8"
|
||||||
|
data-kind="primary"
|
||||||
|
role="button"
|
||||||
|
style="--cpd-icon-button-size: 32px;"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="_indicator-icon_147l5_17"
|
||||||
|
style="--cpd-icon-button-size: 100%;"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="1em"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="1em"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M12.207 5.293a1 1 0 0 1 0 1.414L7.914 11H18.5a1 1 0 1 1 0 2H7.914l4.293 4.293a1 1 0 0 1-1.414 1.414l-6-6a1 1 0 0 1 0-1.414l6-6a1 1 0 0 1 1.414 0"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="nav rightNav"
|
||||||
|
/>
|
||||||
|
</header>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="inRoom"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="content"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="preview"
|
||||||
|
>
|
||||||
|
<video
|
||||||
|
disablepictureinpicture=""
|
||||||
|
playsinline=""
|
||||||
|
tabindex="-1"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="avatarContainer"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span
|
||||||
|
aria-label="@user:example.org"
|
||||||
|
class="_avatar_va14e_8 _avatar-imageless_va14e_55"
|
||||||
|
data-color="6"
|
||||||
|
data-type="round"
|
||||||
|
role="img"
|
||||||
|
style="--cpd-avatar-size: NaNpx;"
|
||||||
|
>
|
||||||
|
T
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="buttonBar"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
aria-disabled="true"
|
||||||
|
class="_button_1nw83_8 join wait"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="md"
|
||||||
|
data-testid="lobby_joinCall"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
Join call
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a
|
||||||
|
class="_link_k9ljz_8"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="md"
|
||||||
|
href="/"
|
||||||
|
rel="noreferrer noopener"
|
||||||
|
>
|
||||||
|
Back to recents
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="footer"
|
||||||
|
data-testid="footer-container"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="settingsLogoContainer"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
aria-labelledby="_r_3c_"
|
||||||
|
class="_icon-button_1215g_8 settingsOnlyShowWide"
|
||||||
|
data-kind="secondary"
|
||||||
|
data-testid="settings-bottom-left"
|
||||||
|
role="button"
|
||||||
|
style="--cpd-icon-button-size: 32px;"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="_indicator-icon_147l5_17"
|
||||||
|
style="--cpd-icon-button-size: 100%;"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="1em"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="1em"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M12 20q-.825 0-1.412-.587A1.93 1.93 0 0 1 10 18q0-.824.588-1.413A1.93 1.93 0 0 1 12 16q.825 0 1.412.587Q14 17.176 14 18t-.588 1.413A1.93 1.93 0 0 1 12 20m0-6q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m0-6q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 6q0-.824.588-1.412A1.93 1.93 0 0 1 12 4q.825 0 1.412.588Q14 5.175 14 6q0 .824-.588 1.412A1.93 1.93 0 0 1 12 8"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="buttons"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
aria-labelledby="_r_3h_"
|
||||||
|
class="_button_1nw83_8 settingsOnlyShowNarrow _has-icon_1nw83_60 _icon-only_1nw83_53"
|
||||||
|
data-kind="secondary"
|
||||||
|
data-size="lg"
|
||||||
|
data-testid="settings-bottom-center"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M12 20q-.825 0-1.412-.587A1.93 1.93 0 0 1 10 18q0-.824.588-1.413A1.93 1.93 0 0 1 12 16q.825 0 1.412.587Q14 17.176 14 18t-.588 1.413A1.93 1.93 0 0 1 12 20m0-6q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m0-6q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 6q0-.824.588-1.412A1.93 1.93 0 0 1 12 4q.825 0 1.412.588Q14 5.175 14 6q0 .824-.588 1.412A1.93 1.93 0 0 1 12 8"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
aria-busy="false"
|
||||||
|
aria-checked="false"
|
||||||
|
aria-disabled="true"
|
||||||
|
aria-labelledby="_r_3m_"
|
||||||
|
class="_button_1nw83_8 _has-icon_1nw83_60 _icon-only_1nw83_53"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="lg"
|
||||||
|
data-testid="incall_mute"
|
||||||
|
role="switch"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M8 8v-.006l6.831 6.832-.002.002 1.414 1.415.003-.003 1.414 1.414-.003.003L20.5 20.5a1 1 0 0 1-1.414 1.414l-3.022-3.022A7.95 7.95 0 0 1 13 19.938V21a1 1 0 0 1-2 0v-1.062A8 8 0 0 1 4 12a1 1 0 1 1 2 0 6 6 0 0 0 8.587 5.415l-1.55-1.55A4.005 4.005 0 0 1 8 12v-1.172L2.086 4.914A1 1 0 0 1 3.5 3.5zm9.417 6.583 1.478 1.477A7.96 7.96 0 0 0 20 12a1 1 0 0 0-2 0c0 .925-.21 1.8-.583 2.583M8.073 5.238l7.793 7.793q.132-.495.134-1.031V6a4 4 0 0 0-7.927-.762"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
aria-busy="false"
|
||||||
|
aria-checked="false"
|
||||||
|
aria-disabled="true"
|
||||||
|
aria-labelledby="_r_3r_"
|
||||||
|
class="_button_1nw83_8 _has-icon_1nw83_60 _icon-only_1nw83_53"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="lg"
|
||||||
|
data-testid="incall_videomute"
|
||||||
|
role="switch"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M2.747 2.753 4.35 4.355l.007-.003L18 17.994v.012l3.247 3.247a1 1 0 0 1-1.414 1.414l-2.898-2.898A2 2 0 0 1 16 20H6a4 4 0 0 1-4-4V8c0-.892.292-1.715.785-2.38L1.333 4.166a1 1 0 0 1 1.414-1.414M18 15.166 6.834 4H16a2 2 0 0 1 2 2v4.286l3.35-2.871a1 1 0 0 1 1.65.76v7.65a1 1 0 0 1-1.65.76L18 13.715z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
aria-labelledby="_r_40_"
|
||||||
|
class="_button_1nw83_8 endCall _has-icon_1nw83_60 _icon-only_1nw83_53 _destructive_1nw83_110"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="lg"
|
||||||
|
data-testid="incall_leave"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="m2.765 16.02-2.47-2.416A1.02 1.02 0 0 1 0 12.852q0-.456.295-.751a15.6 15.6 0 0 1 5.316-3.786A15.9 15.9 0 0 1 12 7q3.355 0 6.39 1.329a16 16 0 0 1 5.315 3.772q.295.294.295.751t-.295.752l-2.47 2.416a1.047 1.047 0 0 1-1.396.108l-3.114-2.363a1.1 1.1 0 0 1-.322-.376 1.1 1.1 0 0 1-.108-.483v-2.27a13.6 13.6 0 0 0-2.12-.524C13.459 9.996 12 9.937 12 9.937s-1.459.059-2.174.175q-1.074.174-2.121.523v2.271q0 .268-.108.483a1.1 1.1 0 0 1-.322.376l-3.114 2.363a1.047 1.047 0 0 1-1.396-.107"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`LobbyView > renders with AppBar ios 1`] = `
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
class="bar"
|
||||||
|
style="display: block;"
|
||||||
|
>
|
||||||
|
<header
|
||||||
|
class="header"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="nav leftNav"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
aria-labelledby="_r_4a_"
|
||||||
|
class="_icon-button_1215g_8"
|
||||||
|
data-kind="primary"
|
||||||
|
role="button"
|
||||||
|
style="--cpd-icon-button-size: 32px;"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="_indicator-icon_147l5_17"
|
||||||
|
style="--cpd-icon-button-size: 100%;"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="1em"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="1em"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="m13.3 17.3-4.6-4.6a.9.9 0 0 1-.213-.325A1.1 1.1 0 0 1 8.425 12q0-.2.062-.375A.9.9 0 0 1 8.7 11.3l4.6-4.6a.95.95 0 0 1 .7-.275q.425 0 .7.275a.95.95 0 0 1 .275.7.95.95 0 0 1-.275.7L10.8 12l3.9 3.9a.95.95 0 0 1 .275.7.95.95 0 0 1-.275.7.95.95 0 0 1-.7.275.95.95 0 0 1-.7-.275"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="nav rightNav"
|
||||||
|
/>
|
||||||
|
</header>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="inRoom"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="content"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="preview"
|
||||||
|
>
|
||||||
|
<video
|
||||||
|
disablepictureinpicture=""
|
||||||
|
playsinline=""
|
||||||
|
tabindex="-1"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
class="avatarContainer"
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<span
|
||||||
|
aria-label="@user:example.org"
|
||||||
|
class="_avatar_va14e_8 _avatar-imageless_va14e_55"
|
||||||
|
data-color="6"
|
||||||
|
data-type="round"
|
||||||
|
role="img"
|
||||||
|
style="--cpd-avatar-size: NaNpx;"
|
||||||
|
>
|
||||||
|
T
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="buttonBar"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
aria-disabled="true"
|
||||||
|
class="_button_1nw83_8 join wait"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="md"
|
||||||
|
data-testid="lobby_joinCall"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
Join call
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a
|
||||||
|
class="_link_k9ljz_8"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="md"
|
||||||
|
href="/"
|
||||||
|
rel="noreferrer noopener"
|
||||||
|
>
|
||||||
|
Back to recents
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="footer"
|
||||||
|
data-testid="footer-container"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="settingsLogoContainer"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
aria-labelledby="_r_4g_"
|
||||||
|
class="_icon-button_1215g_8 settingsOnlyShowWide"
|
||||||
|
data-kind="secondary"
|
||||||
|
data-testid="settings-bottom-left"
|
||||||
|
role="button"
|
||||||
|
style="--cpd-icon-button-size: 32px;"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="_indicator-icon_147l5_17"
|
||||||
|
style="--cpd-icon-button-size: 100%;"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="1em"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="1em"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M6 14q-.824 0-1.412-.588A1.93 1.93 0 0 1 4 12q0-.825.588-1.412A1.93 1.93 0 0 1 6 10q.824 0 1.412.588Q8 11.175 8 12t-.588 1.412A1.93 1.93 0 0 1 6 14m6 0q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m6 0q-.824 0-1.413-.588A1.93 1.93 0 0 1 16 12q0-.825.587-1.412A1.93 1.93 0 0 1 18 10q.824 0 1.413.588Q20 11.175 20 12t-.587 1.412A1.93 1.93 0 0 1 18 14"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="buttons"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
aria-labelledby="_r_4l_"
|
||||||
|
class="_button_1nw83_8 settingsOnlyShowNarrow _has-icon_1nw83_60 _icon-only_1nw83_53"
|
||||||
|
data-kind="secondary"
|
||||||
|
data-size="lg"
|
||||||
|
data-testid="settings-bottom-center"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M6 14q-.824 0-1.412-.588A1.93 1.93 0 0 1 4 12q0-.825.588-1.412A1.93 1.93 0 0 1 6 10q.824 0 1.412.588Q8 11.175 8 12t-.588 1.412A1.93 1.93 0 0 1 6 14m6 0q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m6 0q-.824 0-1.413-.588A1.93 1.93 0 0 1 16 12q0-.825.587-1.412A1.93 1.93 0 0 1 18 10q.824 0 1.413.588Q20 11.175 20 12t-.587 1.412A1.93 1.93 0 0 1 18 14"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
aria-busy="false"
|
||||||
|
aria-checked="false"
|
||||||
|
aria-disabled="true"
|
||||||
|
aria-labelledby="_r_4q_"
|
||||||
|
class="_button_1nw83_8 _has-icon_1nw83_60 _icon-only_1nw83_53"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="lg"
|
||||||
|
data-testid="incall_mute"
|
||||||
|
role="switch"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M8 8v-.006l6.831 6.832-.002.002 1.414 1.415.003-.003 1.414 1.414-.003.003L20.5 20.5a1 1 0 0 1-1.414 1.414l-3.022-3.022A7.95 7.95 0 0 1 13 19.938V21a1 1 0 0 1-2 0v-1.062A8 8 0 0 1 4 12a1 1 0 1 1 2 0 6 6 0 0 0 8.587 5.415l-1.55-1.55A4.005 4.005 0 0 1 8 12v-1.172L2.086 4.914A1 1 0 0 1 3.5 3.5zm9.417 6.583 1.478 1.477A7.96 7.96 0 0 0 20 12a1 1 0 0 0-2 0c0 .925-.21 1.8-.583 2.583M8.073 5.238l7.793 7.793q.132-.495.134-1.031V6a4 4 0 0 0-7.927-.762"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
aria-busy="false"
|
||||||
|
aria-checked="false"
|
||||||
|
aria-disabled="true"
|
||||||
|
aria-labelledby="_r_4v_"
|
||||||
|
class="_button_1nw83_8 _has-icon_1nw83_60 _icon-only_1nw83_53"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="lg"
|
||||||
|
data-testid="incall_videomute"
|
||||||
|
role="switch"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M2.747 2.753 4.35 4.355l.007-.003L18 17.994v.012l3.247 3.247a1 1 0 0 1-1.414 1.414l-2.898-2.898A2 2 0 0 1 16 20H6a4 4 0 0 1-4-4V8c0-.892.292-1.715.785-2.38L1.333 4.166a1 1 0 0 1 1.414-1.414M18 15.166 6.834 4H16a2 2 0 0 1 2 2v4.286l3.35-2.871a1 1 0 0 1 1.65.76v7.65a1 1 0 0 1-1.65.76L18 13.715z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
aria-labelledby="_r_54_"
|
||||||
|
class="_button_1nw83_8 endCall _has-icon_1nw83_60 _icon-only_1nw83_53 _destructive_1nw83_110"
|
||||||
|
data-kind="primary"
|
||||||
|
data-size="lg"
|
||||||
|
data-testid="incall_leave"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
aria-hidden="true"
|
||||||
|
fill="currentColor"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="m2.765 16.02-2.47-2.416A1.02 1.02 0 0 1 0 12.852q0-.456.295-.751a15.6 15.6 0 0 1 5.316-3.786A15.9 15.9 0 0 1 12 7q3.355 0 6.39 1.329a16 16 0 0 1 5.315 3.772q.295.294.295.751t-.295.752l-2.47 2.416a1.047 1.047 0 0 1-1.396.108l-3.114-2.363a1.1 1.1 0 0 1-.322-.376 1.1 1.1 0 0 1-.108-.483v-2.27a13.6 13.6 0 0 0-2.12-.524C13.459 9.996 12 9.937 12 9.937s-1.459.059-2.174.175q-1.074.174-2.121.523v2.271q0 .268-.108.483a1.1 1.1 0 0 1-.322.376l-3.114 2.363a1.047 1.047 0 0 1-1.396-.107"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`LobbyView > renders with header and participant count 1`] = `
|
exports[`LobbyView > renders with header and participant count 1`] = `
|
||||||
<div>
|
<div>
|
||||||
<div
|
<div
|
||||||
@@ -168,7 +644,7 @@ exports[`LobbyView > renders with header and participant count 1`] = `
|
|||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
d="M6 14q-.824 0-1.412-.588A1.93 1.93 0 0 1 4 12q0-.825.588-1.412A1.93 1.93 0 0 1 6 10q.824 0 1.412.588Q8 11.175 8 12t-.588 1.412A1.93 1.93 0 0 1 6 14m6 0q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m6 0q-.824 0-1.413-.588A1.93 1.93 0 0 1 16 12q0-.825.587-1.412A1.93 1.93 0 0 1 18 10q.824 0 1.413.588Q20 11.175 20 12t-.587 1.412A1.93 1.93 0 0 1 18 14"
|
d="M12 20q-.825 0-1.412-.587A1.93 1.93 0 0 1 10 18q0-.824.588-1.413A1.93 1.93 0 0 1 12 16q.825 0 1.412.587Q14 17.176 14 18t-.588 1.413A1.93 1.93 0 0 1 12 20m0-6q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m0-6q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 6q0-.824.588-1.412A1.93 1.93 0 0 1 12 4q.825 0 1.412.588Q14 5.175 14 6q0 .824-.588 1.412A1.93 1.93 0 0 1 12 8"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
@@ -299,7 +775,7 @@ exports[`LobbyView > renders with header and participant count 1`] = `
|
|||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
d="M6 14q-.824 0-1.412-.588A1.93 1.93 0 0 1 4 12q0-.825.588-1.412A1.93 1.93 0 0 1 6 10q.824 0 1.412.588Q8 11.175 8 12t-.588 1.412A1.93 1.93 0 0 1 6 14m6 0q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m6 0q-.824 0-1.413-.588A1.93 1.93 0 0 1 16 12q0-.825.587-1.412A1.93 1.93 0 0 1 18 10q.824 0 1.413.588Q20 11.175 20 12t-.587 1.412A1.93 1.93 0 0 1 18 14"
|
d="M12 20q-.825 0-1.412-.587A1.93 1.93 0 0 1 10 18q0-.824.588-1.413A1.93 1.93 0 0 1 12 16q.825 0 1.412.587Q14 17.176 14 18t-.588 1.413A1.93 1.93 0 0 1 12 20m0-6q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 12q0-.825.588-1.412A1.93 1.93 0 0 1 12 10q.825 0 1.412.588Q14 11.175 14 12t-.588 1.412A1.93 1.93 0 0 1 12 14m0-6q-.825 0-1.412-.588A1.93 1.93 0 0 1 10 6q0-.824.588-1.412A1.93 1.93 0 0 1 12 4q.825 0 1.412.588Q14 5.175 14 6q0 .824-.588 1.412A1.93 1.93 0 0 1 12 8"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
Reference in New Issue
Block a user