mirror of
https://github.com/vector-im/element-call.git
synced 2026-11-13 01:12:29 +00:00
The remaining reads of the widget global were all asking one of two different questions, so they get two different answers. The app shell — the auth hooks, automatic guest registration, the group call loader's diagnostic and the initial mute state — wants to know whether Element Call was launched as a widget. That is a property of the URL it was launched with, so expose the isWidget that computeUrlParams already computed internally, documented as being for shell use only. The call interface — whether to offer the profile settings tab — wants to know something about its host, so it asks the bridge. A host that can dismiss Element Call owns the user's account, so their profile is not ours to edit; this reuses the close capability as a proxy, with a TODO alongside the others. ClientContext also takes supportsReactions from the bridge rather than checking four widget capabilities itself, which removes widgetApi from InitResult — a field that was always null outside widget mode. Note this changes behaviour for a malformed widget URL: one carrying a widget ID and parent URL but missing the room, user, device or base URL would previously have fallen back to registering a guest user, and will now not.
62 lines
1.9 KiB
TypeScript
62 lines
1.9 KiB
TypeScript
/*
|
|
Copyright 2022-2024 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE in the repository root for full details.
|
|
*/
|
|
|
|
import { useCallback } from "react";
|
|
import { secureRandomString } from "matrix-js-sdk/lib/randomstring";
|
|
|
|
import { useClient } from "../ClientContext";
|
|
import { useInteractiveRegistration } from "../auth/useInteractiveRegistration";
|
|
import { generateRandomName } from "../auth/generateRandomName";
|
|
import { useRecaptcha } from "../auth/useRecaptcha";
|
|
import { useUrlParams } from "../UrlParams";
|
|
|
|
interface UseRegisterPasswordlessUserType {
|
|
privacyPolicyUrl?: string;
|
|
registerPasswordlessUser: (displayName: string) => Promise<void>;
|
|
recaptchaId?: string;
|
|
}
|
|
|
|
export function useRegisterPasswordlessUser(): UseRegisterPasswordlessUserType {
|
|
const { setClient } = useClient();
|
|
const { isWidget } = useUrlParams();
|
|
const { privacyPolicyUrl, recaptchaKey, register } =
|
|
useInteractiveRegistration();
|
|
const { execute, reset, recaptchaId } = useRecaptcha(recaptchaKey);
|
|
|
|
const registerPasswordlessUser = useCallback(
|
|
async (displayName: string) => {
|
|
if (!setClient) {
|
|
throw new Error("No client context");
|
|
}
|
|
if (isWidget) {
|
|
throw new Error(
|
|
"Registration was skipped: We should never try to register password-less user in embedded mode.",
|
|
);
|
|
}
|
|
|
|
try {
|
|
const recaptchaResponse = await execute();
|
|
const userName = generateRandomName();
|
|
const [client, session] = await register(
|
|
userName,
|
|
secureRandomString(16),
|
|
displayName,
|
|
recaptchaResponse,
|
|
true,
|
|
);
|
|
setClient(client, session);
|
|
} catch (e) {
|
|
reset();
|
|
throw e;
|
|
}
|
|
},
|
|
[execute, reset, register, setClient, isWidget],
|
|
);
|
|
|
|
return { privacyPolicyUrl, registerPasswordlessUser, recaptchaId };
|
|
}
|