Skip to content

Commit 5ca8c42

Browse files
chore(site): move ssh keys management to react-query (#9625)
1 parent 6db89b0 commit 5ca8c42

File tree

5 files changed

+57
-148
lines changed

5 files changed

+57
-148
lines changed

site/src/api/queries/sshKeys.ts

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

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

+31-23
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
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 { regenerateUserSSHKey, userSSHKey } from "api/queries/sshKeys";
6+
import { displaySuccess } from "components/GlobalSnackbar/utils";
7+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
78

89
export const Language = {
910
title: "SSH keys",
@@ -15,40 +16,47 @@ export const Language = {
1516
};
1617

1718
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-
};
19+
const [isConfirmingRegeneration, setIsConfirmingRegeneration] =
20+
useState(false);
21+
const queryClient = useQueryClient();
22+
const userSSHKeyQuery = useQuery(userSSHKey("me"));
23+
const regenerateSSHKeyMutationOptions = regenerateUserSSHKey(
24+
"me",
25+
queryClient,
26+
);
27+
const regenerateSSHKeyMutation = useMutation({
28+
...regenerateSSHKeyMutationOptions,
29+
onSuccess: (newKey) => {
30+
regenerateSSHKeyMutationOptions.onSuccess(newKey);
31+
displaySuccess("SSH Key regenerated successfully.");
32+
setIsConfirmingRegeneration(false);
33+
},
34+
});
2635

2736
return (
2837
<>
2938
<Section title={Language.title}>
3039
<SSHKeysPageView
31-
isLoading={isLoading}
32-
hasLoaded={hasLoaded}
33-
getSSHKeyError={getSSHKeyError}
34-
regenerateSSHKeyError={regenerateSSHKeyError}
35-
sshKey={sshKey}
36-
onRegenerateClick={onRegenerateClick}
40+
isLoading={userSSHKeyQuery.isLoading}
41+
getSSHKeyError={userSSHKeyQuery.error}
42+
regenerateSSHKeyError={regenerateSSHKeyMutation.error}
43+
sshKey={userSSHKeyQuery.data}
44+
onRegenerateClick={() => {
45+
setIsConfirmingRegeneration(true);
46+
}}
3747
/>
3848
</Section>
3949

4050
<ConfirmDialog
4151
type="delete"
4252
hideCancel={false}
43-
open={sshState.matches("confirmSSHKeyRegenerate")}
44-
confirmLoading={sshState.matches("regeneratingSSHKey")}
53+
open={isConfirmingRegeneration}
54+
confirmLoading={regenerateSSHKeyMutation.isLoading}
4555
title={Language.regenerateDialogTitle}
4656
confirmText={Language.confirmLabel}
47-
onConfirm={() => {
48-
sshSend({ type: "CONFIRM_REGENERATE_SSH_KEY" });
49-
}}
57+
onConfirm={regenerateSSHKeyMutation.mutate}
5058
onClose={() => {
51-
sshSend({ type: "CANCEL_REGENERATE_SSH_KEY" });
59+
setIsConfirmingRegeneration(false);
5260
}}
5361
description={<>{Language.regenerateDialogMessage}</>}
5462
/>

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

+1-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,7 @@ export const Loading: Story = {
3029

3130
export const WithGetSSHKeyError: Story = {
3231
args: {
33-
hasLoaded: false,
32+
sshKey: undefined,
3433
getSSHKeyError: mockApiError({
3534
message: "Failed to get SSH key",
3635
}),

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)