From 6878da0db22b47c1dd526b561005f64e84d1e99a Mon Sep 17 00:00:00 2001 From: Ardeman Date: Thu, 13 Mar 2025 07:01:53 +0800 Subject: [PATCH] refactor: transform payload status to number in subscribe plan requests and update type definitions --- app/apis/admin/create-subscribe-plan.ts | 6 +- app/apis/admin/delete-tags.ts | 2 +- app/apis/admin/update-subscribe-plan.ts | 6 +- app/apis/common/get-news.ts | 2 +- app/apis/common/get-subscribe-plan.ts | 2 +- app/components/ui/input.tsx | 3 +- app/components/ui/select.tsx | 98 ++++++++++++++++++++ app/pages/dashboard-contents/index.tsx | 4 +- app/pages/dashboard-subscribe-plan/index.tsx | 8 +- app/pages/form-subscribe-plan/index.tsx | 39 ++++---- 10 files changed, 142 insertions(+), 28 deletions(-) create mode 100644 app/components/ui/select.tsx diff --git a/app/apis/admin/create-subscribe-plan.ts b/app/apis/admin/create-subscribe-plan.ts index dfacc2c..c075b9f 100644 --- a/app/apis/admin/create-subscribe-plan.ts +++ b/app/apis/admin/create-subscribe-plan.ts @@ -16,9 +16,13 @@ type TParameters = { export const createSubscribePlanRequest = async (parameters: TParameters) => { const { payload, ...restParameters } = parameters try { + const transformedPayload = { + ...payload, + status: Number(payload.status), + } const { data } = await HttpServer(restParameters).post( '/api/subscribe-plan/create', - payload, + transformedPayload, ) return subscribePlanResponseSchema.parse(data) } catch (error) { diff --git a/app/apis/admin/delete-tags.ts b/app/apis/admin/delete-tags.ts index 916d8b1..51223dc 100644 --- a/app/apis/admin/delete-tags.ts +++ b/app/apis/admin/delete-tags.ts @@ -14,7 +14,7 @@ type TParameters = { payload: TTagsId } & THttpServer -export type TDeleteTagsSchema = z.infer +export type TDeleteTagsResponse = z.infer export const deleteTagsRequest = async (parameters: TParameters) => { const { payload, ...restParameters } = parameters const { id } = payload diff --git a/app/apis/admin/update-subscribe-plan.ts b/app/apis/admin/update-subscribe-plan.ts index 11e4db0..bde93d5 100644 --- a/app/apis/admin/update-subscribe-plan.ts +++ b/app/apis/admin/update-subscribe-plan.ts @@ -17,9 +17,13 @@ export const updateSubscribePlanRequest = async (parameters: TParameters) => { const { payload, ...restParameters } = parameters const { id, ...restPayload } = payload try { + const transformedPayload = { + ...restPayload, + status: Number(payload.status), + } const { data } = await HttpServer(restParameters).put( `/api/subscribe-plan/${id}/update`, - restPayload, + transformedPayload, ) return subscribePlanResponseSchema.parse(data) } catch (error) { diff --git a/app/apis/common/get-news.ts b/app/apis/common/get-news.ts index d58aca1..67114e3 100644 --- a/app/apis/common/get-news.ts +++ b/app/apis/common/get-news.ts @@ -29,7 +29,7 @@ const dataResponseSchema = z.object({ }) export type TNewsResponse = z.infer -export type TAuthor = z.infer +export type TAuthorResponse = z.infer type TParameters = { categories?: string[] tags?: string[] diff --git a/app/apis/common/get-subscribe-plan.ts b/app/apis/common/get-subscribe-plan.ts index bad3d8f..a7394e3 100644 --- a/app/apis/common/get-subscribe-plan.ts +++ b/app/apis/common/get-subscribe-plan.ts @@ -15,7 +15,7 @@ const subscribePlanResponseSchema = z.object({ data: z.array(subscribePlanSchema), }) -export type TSubscribePlanSchema = z.infer +export type TSubscribePlanResponse = z.infer export const getSubscribePlan = async (parameters?: THttpServer) => { try { diff --git a/app/components/ui/input.tsx b/app/components/ui/input.tsx index 7dfb802..6449a53 100644 --- a/app/components/ui/input.tsx +++ b/app/components/ui/input.tsx @@ -63,8 +63,9 @@ export const Input = >( = Omit< + ComponentProps<'select'>, + 'size' +> & { + id: string + label?: ReactNode + name: Path + rules?: RegisterOptions + containerClassName?: string + labelClassName?: string + placeholder?: string + options?: { + name: string + value: string | number + }[] +} + +export const Select = >( + properties: TSelectProperties, +) => { + const { + id, + label, + name, + rules, + disabled, + placeholder, + options, + className, + labelClassName, + containerClassName, + ...restProperties + } = properties + const { + control, + formState: { errors }, + } = useRemixFormContext() + + const error: FieldError = get(errors, name) + + return ( + + + ( + + + {options?.map(({ value, name }) => ( + + ))} + + )} + /> + + ) +} diff --git a/app/pages/dashboard-contents/index.tsx b/app/pages/dashboard-contents/index.tsx index 24aba1e..68af6e0 100644 --- a/app/pages/dashboard-contents/index.tsx +++ b/app/pages/dashboard-contents/index.tsx @@ -3,7 +3,7 @@ import DataTable, { type DataTableSlots } from 'datatables.net-react' import { Link, useRouteLoaderData } from 'react-router' import type { TCategoryResponse } from '~/apis/common/get-categories' -import type { TAuthor } from '~/apis/common/get-news' +import type { TAuthorResponse } from '~/apis/common/get-news' import type { TTagResponse } from '~/apis/common/get-tags' import { Button } from '~/components/ui/button' import { UiTable } from '~/components/ui/table' @@ -58,7 +58,7 @@ export const ContentsPage = () => { ] const dataSlot: DataTableSlots = { 1: (value: string) => formatDate(value), - 2: (value: TAuthor) => ( + 2: (value: TAuthorResponse) => (
{value.name}
ID: {value.id.slice(0, 8)}
diff --git a/app/pages/dashboard-subscribe-plan/index.tsx b/app/pages/dashboard-subscribe-plan/index.tsx index 188b5ae..a94c300 100644 --- a/app/pages/dashboard-subscribe-plan/index.tsx +++ b/app/pages/dashboard-subscribe-plan/index.tsx @@ -2,7 +2,7 @@ import DT from 'datatables.net-dt' import DataTable from 'datatables.net-react' import { Link, useRouteLoaderData } from 'react-router' -import type { TSubscribePlanSchema } from '~/apis/common/get-subscribe-plan' +import type { TSubscribePlanResponse } from '~/apis/common/get-subscribe-plan' import { Button } from '~/components/ui/button' import { getStatusBadge, type TColorBadge } from '~/components/ui/color-badge' import { UiTable } from '~/components/ui/table' @@ -66,8 +66,10 @@ export const SubscribePlanPage = () => { {value === 1 ? 'Active' : 'Inactive'} ), - 6: (value: string, _type: unknown, data: TSubscribePlanSchema) => - data.code !== 'basic' && ( + 6: (value: string, _type: unknown, data: TSubscribePlanResponse) => + data.code === 'basic' ? ( + '' + ) : (