Skip to content

Commit 653ce12

Browse files
fix: refactor secret queries (#663)
1 parent 2725570 commit 653ce12

File tree

8 files changed

+76
-56
lines changed

8 files changed

+76
-56
lines changed

src/app/settings/secrets/EditSecretDialog.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import EyeIcon from "@/assets/icons/eye.svg?react";
22
import Plus from "@/assets/icons/plus.svg?react";
33
import Trash from "@/assets/icons/trash.svg?react";
4-
import { useGetSecretDetail } from "@/data/secrets/get-secret-detail";
4+
import { secretQueries } from "@/data/secrets";
55
import { useUpdateSecret } from "@/data/secrets/update-secret-query";
66
import { isFetchError } from "@/lib/fetch-error";
77
import { UpdateSecret } from "@/types/secret";
88
import { zodResolver } from "@hookform/resolvers/zod";
9-
import { useQueryClient } from "@tanstack/react-query";
9+
import { useQuery, useQueryClient } from "@tanstack/react-query";
1010
import {
1111
Button,
1212
DialogClose,
@@ -49,7 +49,11 @@ interface EditSecretProps {
4949
}
5050

5151
export function EditSecret({ secretId, isSecretNameEditable }: EditSecretProps) {
52-
const { data: secretDetail, isLoading, isError } = useGetSecretDetail(secretId);
52+
const {
53+
data: secretDetail,
54+
isLoading,
55+
isError
56+
} = useQuery({ ...secretQueries.secretDetail(secretId) });
5357

5458
const {
5559
handleSubmit,

src/app/settings/secrets/SecretsTable.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Pagination from "@/components/Pagination";
22
import { SearchField } from "@/components/SearchField";
3-
import { useAllSecrets } from "@/data/secrets/secrets-all-query";
3+
import { secretQueries } from "@/data/secrets";
44
import { useCurrentUser } from "@/data/users/current-user-query";
55
import { useQuery } from "@tanstack/react-query";
66
import { DataTable, Skeleton } from "@zenml-io/react-component-library";
@@ -13,10 +13,10 @@ import { useSecretOverviewSearchParams } from "./service";
1313
export default function SecretsTable() {
1414
const navigate = useNavigate();
1515
const queryParams = useSecretOverviewSearchParams();
16-
const { data: secretsData } = useAllSecrets(
17-
{ params: { ...queryParams, sort_by: "desc:created" } },
18-
{ throwOnError: true }
19-
);
16+
const { data: secretsData } = useQuery({
17+
...secretQueries.secretList({ ...queryParams, sort_by: "desc:created" }),
18+
throwOnError: true
19+
});
2020
const { data: currentUser } = useCurrentUser();
2121

2222
const userId = currentUser?.id || "";

src/app/settings/secrets/secretsDetail/DeleteKeyAlert.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { useGetSecretDetail } from "@/data/secrets/get-secret-detail";
1+
import { secretQueries } from "@/data/secrets";
22
import { useUpdateSecret } from "@/data/secrets/update-secret-query";
33
import { isFetchError } from "@/lib/fetch-error";
44
import { UpdateSecret } from "@/types/secret";
5-
import { useQueryClient } from "@tanstack/react-query";
5+
import { useQuery, useQueryClient } from "@tanstack/react-query";
66
import {
77
AlertDialogCancel,
88
AlertDialogContent,
@@ -16,7 +16,11 @@ import {
1616
import { ChangeEvent, useState } from "react";
1717

1818
export function DeleteKeyAlert({ secretId, keyName }: { secretId: string; keyName: string }) {
19-
const { data: secretDetail, isLoading, isError } = useGetSecretDetail(secretId);
19+
const {
20+
data: secretDetail,
21+
isLoading,
22+
isError
23+
} = useQuery({ ...secretQueries.secretDetail(secretId) });
2024
const queryClient = useQueryClient();
2125
const { mutate } = useUpdateSecret({
2226
onError(error) {
@@ -66,7 +70,7 @@ export function DeleteKeyAlert({ secretId, keyName }: { secretId: string; keyNam
6670
</AlertDialogHeader>
6771
<div className="gap-5 p-5">
6872
<p className="text-text-md text-theme-text-secondary">
69-
Are you sure you want to delete this eky?
73+
Are you sure you want to delete this key?
7074
</p>
7175
<p className="text-text-md text-theme-text-secondary">This action cannot be undone.</p>
7276
<h3 className="font-inter text-sm mb-1 mt-4 text-left font-medium leading-5">

src/app/settings/secrets/secretsDetail/SecretDetailTable.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { useGetSecretDetail } from "@/data/secrets/get-secret-detail";
1+
import { secretQueries } from "@/data/secrets";
2+
import { useQuery } from "@tanstack/react-query";
23
import { Button, DataTable, Dialog, DialogTrigger, Input } from "@zenml-io/react-component-library";
34
import { useMemo, useState } from "react";
45
import { EditSecretDialog } from "../EditSecretDialog";
@@ -7,7 +8,7 @@ import { getSecretDetailColumn } from "./columns";
78
export default function SecretDetailTable({ secretId }: { secretId: string }) {
89
const [searchTerm, setSearchTerm] = useState("");
910

10-
const { data: secretDetail } = useGetSecretDetail(secretId);
11+
const { data: secretDetail } = useQuery({ ...secretQueries.secretDetail(secretId) });
1112

1213
// Prepare data for DataTable
1314
const secretDetailData = useMemo(() => {

src/app/settings/secrets/secretsDetail/page.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
import { useGetSecretDetail } from "@/data/secrets/get-secret-detail";
1+
import { secretQueries } from "@/data/secrets";
2+
import { useQuery } from "@tanstack/react-query";
23
import { Box } from "@zenml-io/react-component-library";
3-
import { useParams } from "react-router-dom";
4-
import SecretDetailTable from "./SecretDetailTable";
54
import { useEffect } from "react";
5+
import { useParams } from "react-router-dom";
66
import { useBreadcrumbsContext } from "../../../../layouts/AuthenticatedLayout/BreadcrumbsContext";
7+
import SecretDetailTable from "./SecretDetailTable";
78

89
export default function SecretDetailsPage() {
9-
const { secretId } = useParams<{ secretId: string }>() || "";
10+
const { secretId } = useParams<{ secretId: string }>();
1011
const { setCurrentBreadcrumbData } = useBreadcrumbsContext();
11-
const { data: secretDetail } = useGetSecretDetail(secretId || "");
12+
const { data: secretDetail } = useQuery({ ...secretQueries.secretDetail(secretId || "") });
1213

1314
useEffect(() => {
1415
secretDetail &&
Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import { FetchError } from "@/lib/fetch-error";
22
import { notFound } from "@/lib/not-found-error";
33
import { Secret } from "@/types/secret";
4-
import { useQuery, UseQueryOptions } from "@tanstack/react-query";
54
import { apiPaths, createApiPath } from "../api";
65
import { fetcher } from "../fetch";
76

8-
export async function getSecretDetail(secretId: string) {
7+
export async function fetchSecretDetail(secretId: string): Promise<Secret> {
98
const url = createApiPath(apiPaths.secrets.detail(secretId));
109
const res = await fetcher(url, {
1110
method: "GET",
@@ -17,22 +16,21 @@ export async function getSecretDetail(secretId: string) {
1716
if (res.status === 404) notFound();
1817

1918
if (!res.ok) {
19+
const errorData: string = await res
20+
.json()
21+
.then((data) => {
22+
if (Array.isArray(data.detail)) {
23+
return data.detail[1];
24+
}
25+
return data.detail;
26+
})
27+
.catch(() => `Failed to fetch secret ${secretId}`);
28+
2029
throw new FetchError({
21-
message: "Error fetching secret details",
2230
status: res.status,
23-
statusText: res.statusText
31+
statusText: res.statusText,
32+
message: errorData
2433
});
2534
}
2635
return res.json();
2736
}
28-
29-
export function useGetSecretDetail(
30-
secretId: string,
31-
options?: Omit<UseQueryOptions<Secret, FetchError>, "queryFn" | "queryKey">
32-
) {
33-
return useQuery<Secret, FetchError>({
34-
queryFn: () => getSecretDetail(secretId),
35-
queryKey: ["secrets", secretId],
36-
...options
37-
});
38-
}

src/data/secrets/index.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { ListSecretsParams } from "@/types/secret";
2+
import { queryOptions } from "@tanstack/react-query";
3+
import { fetchAllSecrets } from "./secrets-all-query";
4+
import { fetchSecretDetail } from "./get-secret-detail";
5+
6+
export const secretQueries = {
7+
all: ["secrets"],
8+
secretList: (queryParams: ListSecretsParams) =>
9+
queryOptions({
10+
queryKey: [...secretQueries.all, queryParams],
11+
queryFn: async () => fetchAllSecrets({ params: queryParams })
12+
}),
13+
secretDetail: (secretId: string) =>
14+
queryOptions({
15+
queryKey: [...secretQueries.all, secretId],
16+
queryFn: async () => fetchSecretDetail(secretId)
17+
})
18+
};
Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
1-
import { apiPaths, createApiPath } from "../api";
21
import { FetchError } from "@/lib/fetch-error";
32
import { notFound } from "@/lib/not-found-error";
4-
import { fetcher } from "../fetch";
5-
import { useQuery, UseQueryOptions } from "@tanstack/react-query";
6-
import { ListSecretsParams, SecretsPage } from "@/types/secret";
73
import { objectToSearchParams } from "@/lib/url";
4+
import { ListSecretsParams, SecretsPage } from "@/types/secret";
5+
import { apiPaths, createApiPath } from "../api";
6+
import { fetcher } from "../fetch";
87

98
type SecretsOverview = {
109
params: ListSecretsParams;
1110
};
1211

13-
export function getSecretsQueryKey({ params }: SecretsOverview) {
14-
return ["secrets", params];
15-
}
16-
17-
export async function fetchAllSecrets({ params }: SecretsOverview) {
12+
export async function fetchAllSecrets({ params }: SecretsOverview): Promise<SecretsPage> {
1813
const url = createApiPath(apiPaths.secrets.all + "?" + objectToSearchParams(params));
1914
const res = await fetcher(url, {
2015
method: "GET",
@@ -26,22 +21,21 @@ export async function fetchAllSecrets({ params }: SecretsOverview) {
2621
if (res.status === 404) notFound();
2722

2823
if (!res.ok) {
24+
const errorData: string = await res
25+
.json()
26+
.then((data) => {
27+
if (Array.isArray(data.detail)) {
28+
return data.detail[1];
29+
}
30+
return data.detail;
31+
})
32+
.catch(() => "Failed to fetch secrets");
33+
2934
throw new FetchError({
30-
message: "Error while fetching secrets",
3135
status: res.status,
32-
statusText: res.statusText
36+
statusText: res.statusText,
37+
message: errorData
3338
});
3439
}
3540
return res.json();
3641
}
37-
38-
export function useAllSecrets(
39-
params: SecretsOverview,
40-
options?: Omit<UseQueryOptions<SecretsPage, FetchError>, "queryKey" | "queryFn">
41-
) {
42-
return useQuery<SecretsPage, FetchError>({
43-
queryKey: getSecretsQueryKey(params),
44-
queryFn: () => fetchAllSecrets(params),
45-
...options
46-
});
47-
}

0 commit comments

Comments
 (0)