Use one callback instead of two in `RecoveryPanel`

florianduros/encryption-tab
Florian Duros 2025-01-06 17:44:36 +01:00
parent 1a0e6dcc45
commit 0b254e51a0
No known key found for this signature in database
GPG Key ID: A5BBB4041B493F15
3 changed files with 20 additions and 25 deletions

View File

@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
import React, { JSX, MouseEventHandler, useCallback, useEffect, useState } from "react";
import React, { JSX, useCallback, useEffect, useState } from "react";
import { Button, InlineSpinner } from "@vector-im/compound-web";
import KeyIcon from "@vector-im/compound-design-tokens/assets/web/icons/key";
@ -27,19 +27,15 @@ type State = "loading" | "missing_backup" | "secrets_not_cached" | "good";
interface RecoveryPanelProps {
/**
* Callback for when the user clicks the button to set up their recovery key.
* Callback for when the user wants to set up or change their recovery key.
*/
onSetUpRecoveryClick: MouseEventHandler<HTMLButtonElement>;
/**
* Callback for when the user clicks the button to change their recovery key.
*/
onChangingRecoveryKeyClick: MouseEventHandler<HTMLButtonElement>;
onChangeRecoveryKeyClick: (setupNewKey: boolean) => void;
}
/**
* This component allows the user to set up or change their recovery key.
*/
export function RecoveryPanel({ onSetUpRecoveryClick, onChangingRecoveryKeyClick }: RecoveryPanelProps): JSX.Element {
export function RecoveryPanel({ onChangeRecoveryKeyClick }: RecoveryPanelProps): JSX.Element {
const [state, setState] = useState<State>("loading");
const isMissingBackup = state === "missing_backup";
@ -71,7 +67,7 @@ export function RecoveryPanel({ onSetUpRecoveryClick, onChangingRecoveryKeyClick
break;
case "missing_backup":
content = (
<Button size="sm" kind="primary" Icon={KeyIcon} onClick={onSetUpRecoveryClick}>
<Button size="sm" kind="primary" Icon={KeyIcon} onClick={() => onChangeRecoveryKeyClick(true)}>
{_t("settings|encryption|recovery|set_up_recovery")}
</Button>
);
@ -90,7 +86,7 @@ export function RecoveryPanel({ onSetUpRecoveryClick, onChangingRecoveryKeyClick
break;
case "good":
content = (
<Button size="sm" kind="secondary" Icon={KeyIcon} onClick={onChangingRecoveryKeyClick}>
<Button size="sm" kind="secondary" Icon={KeyIcon} onClick={() => onChangeRecoveryKeyClick(false)}>
{_t("settings|encryption|recovery|change_recovery_key")}
</Button>
);

View File

@ -44,8 +44,9 @@ export function EncryptionUserSettingsTab(): JSX.Element {
case "main":
content = (
<RecoveryPanel
onChangingRecoveryKeyClick={() => setState("change_recovery_key")}
onSetUpRecoveryClick={() => setState("set_recovery_key")}
onChangeRecoveryKeyClick={(setupNewKey) =>
setupNewKey ? setState("set_recovery_key") : setState("change_recovery_key")
}
/>
);
break;

View File

@ -29,13 +29,11 @@ describe("<RecoveryPanel />", () => {
mocked(accessSecretStorage).mockClear().mockResolvedValue();
});
function renderRecoverPanel(
props = {
onSetUpRecoveryClick: jest.fn(),
onChangingRecoveryKeyClick: jest.fn(),
},
) {
return render(<RecoveryPanel {...props} />, withClientContextRenderOptions(matrixClient));
function renderRecoverPanel(onChangeRecoveryKeyClick = jest.fn()) {
return render(
<RecoveryPanel onChangeRecoveryKeyClick={onChangeRecoveryKeyClick} />,
withClientContextRenderOptions(matrixClient),
);
}
it("should be in loading state when checking backup and the cached keys", () => {
@ -51,14 +49,14 @@ describe("<RecoveryPanel />", () => {
it("should ask to set up a recovery key when there is no key backup", async () => {
const user = userEvent.setup();
const onSetUpRecoveryClick = jest.fn();
const { asFragment } = renderRecoverPanel({ onSetUpRecoveryClick, onChangingRecoveryKeyClick: jest.fn() });
const onChangeRecoveryKeyClick = jest.fn();
const { asFragment } = renderRecoverPanel(onChangeRecoveryKeyClick);
await waitFor(() => screen.getByRole("button", { name: "Set up recovery" }));
expect(asFragment()).toMatchSnapshot();
await user.click(screen.getByRole("button", { name: "Set up recovery" }));
expect(onSetUpRecoveryClick).toHaveBeenCalled();
expect(onChangeRecoveryKeyClick).toHaveBeenCalledWith(true);
});
it("should ask to enter the recovery key when secrets are not cached", async () => {
@ -86,12 +84,12 @@ describe("<RecoveryPanel />", () => {
});
const user = userEvent.setup();
const onChangingRecoveryKeyClick = jest.fn();
const { asFragment } = renderRecoverPanel({ onSetUpRecoveryClick: jest.fn(), onChangingRecoveryKeyClick });
const onChangeRecoveryKeyClick = jest.fn();
const { asFragment } = renderRecoverPanel(onChangeRecoveryKeyClick);
await waitFor(() => screen.getByRole("button", { name: "Change recovery key" }));
expect(asFragment()).toMatchSnapshot();
await user.click(screen.getByRole("button", { name: "Change recovery key" }));
expect(onChangingRecoveryKeyClick).toHaveBeenCalled();
expect(onChangeRecoveryKeyClick).toHaveBeenCalledWith(false);
});
});