Skip to content

Commit 1d5f390

Browse files
committed
Implements certificate delete ui
1 parent d2048e5 commit 1d5f390

File tree

7 files changed

+68
-2
lines changed

7 files changed

+68
-2
lines changed

frontend/src/api/npm/base.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,21 @@ export async function put(
9999
const response = await fetch(apiUrl, { method, headers, body, signal });
100100
return processResponse(response, skipCamelize);
101101
}
102+
103+
interface DeleteArgs {
104+
url: string;
105+
}
106+
export async function del(
107+
{ url }: DeleteArgs,
108+
abortController?: AbortController,
109+
) {
110+
const apiUrl = buildUrl({ url });
111+
const method = "DELETE";
112+
const headers = {
113+
...buildAuthHeader(),
114+
[contentTypeHeader]: "application/json",
115+
};
116+
const signal = abortController?.signal;
117+
const response = await fetch(apiUrl, { method, headers, signal });
118+
return processResponse(response);
119+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import * as api from "./base";
2+
3+
export async function deleteCertificate(
4+
id: number,
5+
abortController?: AbortController,
6+
): Promise<boolean> {
7+
const { result } = await api.del(
8+
{
9+
url: `/certificates/${id}`,
10+
},
11+
abortController,
12+
);
13+
return result;
14+
}

frontend/src/api/npm/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export * from "./createCertificate";
22
export * from "./createCertificateAuthority";
33
export * from "./createDNSProvider";
44
export * from "./createUser";
5+
export * from "./deleteCertificate";
56
export * from "./getAccessLists";
67
export * from "./getCertificate";
78
export * from "./getCertificateAuthorities";

frontend/src/components/SiteWrapper.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useEffect, ReactNode } from "react";
22

33
import { Box, Container, useToast } from "@chakra-ui/react";
44
import { useQueryClient } from "@tanstack/react-query";
5+
56
import { getSSEToken, SSEMessage } from "src/api/npm";
67
import { Footer, Navigation } from "src/components";
78
import { intl } from "src/locale";

frontend/src/locale/src/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,9 @@
347347
"certificate.create": {
348348
"defaultMessage": "Create Certificate"
349349
},
350+
"certificate.deleted": {
351+
"defaultMessage": "Certificate has been deleted"
352+
},
350353
"certificate.renewal-requested": {
351354
"defaultMessage": "Renewal has been queued"
352355
},

frontend/src/pages/Certificates/Table.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export interface TableProps {
2828
filters: TableFilter[];
2929
onTableEvent: any;
3030
onRenewal: (id: number) => void;
31+
onDelete: (id: number) => void;
3132
}
3233
function Table({
3334
data,
@@ -36,6 +37,7 @@ function Table({
3637
sortBy,
3738
filters,
3839
onRenewal,
40+
onDelete,
3941
}: TableProps) {
4042
const [editId, setEditId] = useState(0);
4143
const [columns, tableData] = useMemo(() => {
@@ -113,7 +115,7 @@ function Table({
113115
title: intl.formatMessage({
114116
id: "action.delete",
115117
}),
116-
onClick: (_: any, { id }: any) => alert(id),
118+
onClick: (_: any, { id }: any) => onDelete(id),
117119
icon: <FiTrash2 />,
118120
disabled: (data: any) => data.isReadonly,
119121
},

frontend/src/pages/Certificates/TableWrapper.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useEffect, useReducer, useState } from "react";
33
import { Alert, AlertIcon, useToast } from "@chakra-ui/react";
44
import { useQueryClient } from "@tanstack/react-query";
55

6-
import { renewCertificate } from "src/api/npm";
6+
import { renewCertificate, deleteCertificate } from "src/api/npm";
77
import { EmptyList, SpinnerPage, tableEventReducer } from "src/components";
88
import { useCertificates } from "src/hooks";
99
import { intl } from "src/locale";
@@ -68,6 +68,32 @@ function TableWrapper() {
6868
}
6969
};
7070

71+
const deleteCert = async (id: number) => {
72+
try {
73+
await deleteCertificate(id);
74+
toast({
75+
description: intl.formatMessage({
76+
id: `certificate.deleted`,
77+
}),
78+
status: "success",
79+
position: "top",
80+
duration: 3000,
81+
isClosable: true,
82+
});
83+
setTimeout(() => {
84+
queryClient.invalidateQueries({ queryKey: ["certificates"] });
85+
}, 500);
86+
} catch (err: any) {
87+
toast({
88+
description: err.message,
89+
status: "error",
90+
position: "top",
91+
duration: 3000,
92+
isClosable: true,
93+
});
94+
}
95+
};
96+
7197
if (isFetching || isLoading || !tableData) {
7298
return <SpinnerPage />;
7399
}
@@ -105,6 +131,7 @@ function TableWrapper() {
105131
filters={filters}
106132
onTableEvent={dispatch}
107133
onRenewal={renewCert}
134+
onDelete={deleteCert}
108135
/>
109136
);
110137
}

0 commit comments

Comments
 (0)