diff --git a/app/apis/admin/delete-categories.ts b/app/apis/admin/delete-categories.ts new file mode 100644 index 0000000..373169f --- /dev/null +++ b/app/apis/admin/delete-categories.ts @@ -0,0 +1,27 @@ +import { z } from 'zod' + +import { HttpServer, type THttpServer } from '~/libs/http-server' +import type { TCategorySchema } from '~/pages/form-category' + +const deleteCategoriesResponseSchema = z.object({ + data: z.object({ + Message: z.string(), + }), +}) + +type TParameters = { + id: TCategorySchema['id'] +} & THttpServer + +export const deleteCategoriesRequest = async (parameters: TParameters) => { + const { id, ...restParameters } = parameters + try { + const { data } = await HttpServer(restParameters).delete( + `/api/category/${id}/delete`, + ) + return deleteCategoriesResponseSchema.parse(data) + } catch (error) { + // eslint-disable-next-line unicorn/no-useless-promise-resolve-reject + return Promise.reject(error) + } +} diff --git a/app/pages/dashboard-categories/index.tsx b/app/pages/dashboard-categories/index.tsx index fc1c09b..3cc2f1a 100644 --- a/app/pages/dashboard-categories/index.tsx +++ b/app/pages/dashboard-categories/index.tsx @@ -1,8 +1,11 @@ +import { PencilSquareIcon, TrashIcon } from '@heroicons/react/20/solid' import DT, { type Config, type ConfigColumns } from 'datatables.net-dt' import DataTable, { type DataTableSlots } from 'datatables.net-react' +import { useState } from 'react' import { Link, useRouteLoaderData } from 'react-router' import type { TCategoryResponse } from '~/apis/common/get-categories' +import { DialogDelete } from '~/components/dialog/delete' import { Button } from '~/components/ui/button' import { UiTable } from '~/components/ui/table' import { TitleDashboard } from '~/components/ui/title-dashboard' @@ -12,7 +15,7 @@ export const CategoriesPage = () => { const loaderData = useRouteLoaderData( 'routes/_admin.lg-admin._dashboard', ) - + const [selectedCategory, setSelectedCategory] = useState() DataTable.use(DT) const dataTable = loaderData?.categoriesData?.sort((a, b) => { @@ -55,15 +58,26 @@ export const CategoriesPage = () => {
Kode: {data.code}
), - 3: (value: string) => ( - + 3: (value: string, _type: unknown, data: TCategoryResponse) => ( +
+ + +
), } const dataOptions: Config = { @@ -95,6 +109,15 @@ export const CategoriesPage = () => { slots={dataSlot} title="Daftar Kategori" /> + + setSelectedCategory(undefined)} + title="Kategori" + fetcherAction={`/actions/admin/categories/delete/${selectedCategory?.id}`} + > +

{selectedCategory?.name}

+
) } diff --git a/app/routes/actions.admin.categories.delete.$id.ts b/app/routes/actions.admin.categories.delete.$id.ts new file mode 100644 index 0000000..44d107b --- /dev/null +++ b/app/routes/actions.admin.categories.delete.$id.ts @@ -0,0 +1,48 @@ +import { data } from 'react-router' +import { XiorError } from 'xior' + +import { deleteCategoriesRequest } from '~/apis/admin/delete-categories' +import { handleCookie } from '~/libs/cookies' + +import type { Route } from './+types/actions.admin.categories.delete.$id' + +export const action = async ({ request, params }: Route.ActionArgs) => { + const { staffToken: accessToken } = await handleCookie(request) + const { id } = params + try { + const { data: categoryData } = await deleteCategoriesRequest({ + accessToken, + id, + }) + + return data( + { + success: true, + categoryData, + }, + { + status: 200, + statusText: 'OK', + }, + ) + } catch (error) { + if (error instanceof XiorError) { + return data( + { + success: false, + message: error?.response?.data?.error?.message || error.message, + }, + { + status: error?.response?.status || 500, + }, + ) + } + return data( + { + success: false, + message: 'Internal server error', + }, + { status: 500 }, + ) + } +}