Skip to content

Commit 096e98b

Browse files
committed
chore(site): move ssh keys management to react-query
1 parent 13acf59 commit 096e98b

File tree

5 files changed

+47
-146
lines changed

5 files changed

+47
-146
lines changed

site/src/api/queries/sshKeys.ts

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2+
import * as API from "api/api";
3+
4+
const getUserSSHKeyQueryKey = (userId: string) => [userId, "sshKey"];
5+
6+
export const useUserSSHKey = (userId: string) => {
7+
return useQuery({
8+
queryKey: getUserSSHKeyQueryKey(userId),
9+
queryFn: () => API.getUserSSHKey(userId),
10+
});
11+
};
12+
13+
export const useRegenerateUserSSHKey = (
14+
userId: string,
15+
onSuccess: () => void,
16+
) => {
17+
const queryClient = useQueryClient();
18+
return useMutation({
19+
mutationFn: () => API.regenerateUserSSHKey(userId),
20+
onSuccess: (newKey) => {
21+
queryClient.setQueryData(getUserSSHKeyQueryKey(userId), newKey);
22+
onSuccess();
23+
},
24+
});
25+
};

site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.tsx

+21-21
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { useMachine } from "@xstate/react";
2-
import { PropsWithChildren, FC } from "react";
3-
import { sshKeyMachine } from "xServices/sshKey/sshKeyXService";
1+
import { PropsWithChildren, FC, useState } from "react";
42
import { ConfirmDialog } from "../../../components/Dialogs/ConfirmDialog/ConfirmDialog";
53
import { Section } from "../../../components/SettingsLayout/Section";
64
import { SSHKeysPageView } from "./SSHKeysPageView";
5+
import { useRegenerateUserSSHKey, useUserSSHKey } from "api/queries/sshKeys";
6+
import { displaySuccess } from "components/GlobalSnackbar/utils";
77

88
export const Language = {
99
title: "SSH keys",
@@ -15,40 +15,40 @@ export const Language = {
1515
};
1616

1717
export const SSHKeysPage: FC<PropsWithChildren<unknown>> = () => {
18-
const [sshState, sshSend] = useMachine(sshKeyMachine);
19-
const isLoading = sshState.matches("gettingSSHKey");
20-
const hasLoaded = sshState.matches("loaded");
21-
const { getSSHKeyError, regenerateSSHKeyError, sshKey } = sshState.context;
22-
23-
const onRegenerateClick = () => {
24-
sshSend({ type: "REGENERATE_SSH_KEY" });
25-
};
18+
const [isConfirmingRegeneration, setIsConfirmingRegeneration] =
19+
useState(false);
20+
const userSSHKeyQuery = useUserSSHKey("me");
21+
const regenerateUserSSHKeyMutation = useRegenerateUserSSHKey("me", () => {
22+
displaySuccess("SSH Key regenerated successfully.");
23+
setIsConfirmingRegeneration(false);
24+
});
2625

2726
return (
2827
<>
2928
<Section title={Language.title}>
3029
<SSHKeysPageView
31-
isLoading={isLoading}
32-
hasLoaded={hasLoaded}
33-
getSSHKeyError={getSSHKeyError}
34-
regenerateSSHKeyError={regenerateSSHKeyError}
35-
sshKey={sshKey}
36-
onRegenerateClick={onRegenerateClick}
30+
isLoading={userSSHKeyQuery.isLoading}
31+
getSSHKeyError={userSSHKeyQuery.error}
32+
regenerateSSHKeyError={regenerateUserSSHKeyMutation.error}
33+
sshKey={userSSHKeyQuery.data}
34+
onRegenerateClick={() => {
35+
setIsConfirmingRegeneration(true);
36+
}}
3737
/>
3838
</Section>
3939

4040
<ConfirmDialog
4141
type="delete"
4242
hideCancel={false}
43-
open={sshState.matches("confirmSSHKeyRegenerate")}
44-
confirmLoading={sshState.matches("regeneratingSSHKey")}
43+
open={isConfirmingRegeneration}
44+
confirmLoading={regenerateUserSSHKeyMutation.isLoading}
4545
title={Language.regenerateDialogTitle}
4646
confirmText={Language.confirmLabel}
4747
onConfirm={() => {
48-
sshSend({ type: "CONFIRM_REGENERATE_SSH_KEY" });
48+
regenerateUserSSHKeyMutation.mutate();
4949
}}
5050
onClose={() => {
51-
sshSend({ type: "CANCEL_REGENERATE_SSH_KEY" });
51+
setIsConfirmingRegeneration(false);
5252
}}
5353
description={<>{Language.regenerateDialogMessage}</>}
5454
/>

site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.stories.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const meta: Meta<typeof SSHKeysPageView> = {
77
component: SSHKeysPageView,
88
args: {
99
isLoading: false,
10-
hasLoaded: true,
1110
sshKey: {
1211
user_id: "test-user-id",
1312
created_at: "2022-07-28T07:45:50.795918897Z",
@@ -30,7 +29,6 @@ export const Loading: Story = {
3029

3130
export const WithGetSSHKeyError: Story = {
3231
args: {
33-
hasLoaded: false,
3432
getSSHKeyError: mockApiError({
3533
message: "Failed to get SSH key",
3634
}),

site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.tsx

+1-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ export const Language = {
1414

1515
export interface SSHKeysPageViewProps {
1616
isLoading: boolean;
17-
hasLoaded: boolean;
1817
getSSHKeyError?: unknown;
1918
regenerateSSHKeyError?: unknown;
2019
sshKey?: GitSSHKey;
@@ -25,7 +24,6 @@ export const SSHKeysPageView: FC<
2524
React.PropsWithChildren<SSHKeysPageViewProps>
2625
> = ({
2726
isLoading,
28-
hasLoaded,
2927
getSSHKeyError,
3028
regenerateSSHKeyError,
3129
sshKey,
@@ -49,7 +47,7 @@ export const SSHKeysPageView: FC<
4947
{Boolean(regenerateSSHKeyError) && (
5048
<ErrorAlert error={regenerateSSHKeyError} dismissible />
5149
)}
52-
{hasLoaded && sshKey && (
50+
{sshKey && (
5351
<>
5452
<p className={styles.description}>
5553
The following public key is used to authenticate Git in workspaces.

site/src/xServices/sshKey/sshKeyXService.ts

-120
This file was deleted.

0 commit comments

Comments
 (0)