/* Copyright 2022-2024 New Vector Ltd. SPDX-License-Identifier: AGPL-3.0-only Please see LICENSE in the repository root for full details. */ import { MatrixClient } from "matrix-js-sdk/src/client"; import { useTranslation } from "react-i18next"; import { MatrixError } from "matrix-js-sdk/src/matrix"; import { Heading, Text } from "@vector-im/compound-web"; import { Link } from "../button/Link"; import { useLoadGroupCall, GroupCallStatus, CallTerminatedMessage, } from "./useLoadGroupCall"; import { ErrorView, FullScreenView } from "../FullScreenView"; interface Props { client: MatrixClient; roomIdOrAlias: string; viaServers: string[]; children: (groupCallState: GroupCallStatus) => JSX.Element; } export function GroupCallLoader({ client, roomIdOrAlias, viaServers, children, }: Props): JSX.Element { const { t } = useTranslation(); const groupCallState = useLoadGroupCall(client, roomIdOrAlias, viaServers); switch (groupCallState.kind) { case "loaded": case "waitForInvite": case "canKnock": return children(groupCallState); case "loading": return (

{t("common.loading")}

); case "failed": if ((groupCallState.error as MatrixError).errcode === "M_NOT_FOUND") { return ( {t("group_call_loader.failed_heading")} {t("group_call_loader.failed_text")} {/* XXX: A 'create it for me' button would be the obvious UX here. Two screens already have dupes of this flow, let's make a common component and put it here. */} {t("common.home")} ); } else if (groupCallState.error instanceof CallTerminatedMessage) { return ( {groupCallState.error.message} {groupCallState.error.messageBody} {groupCallState.error.reason && ( <> {t("group_call_loader.reason")}: "{groupCallState.error.reason}" )} {t("common.home")} ); } else { return ; } } }