diff --git a/apps/cs/src/app/providers/app-provider.tsx b/apps/cs/src/app/providers/app-provider.tsx index fb4b65f27..6fd488b90 100644 --- a/apps/cs/src/app/providers/app-provider.tsx +++ b/apps/cs/src/app/providers/app-provider.tsx @@ -6,6 +6,7 @@ import { AuthWrapper } from "@/entities/auth"; import { MenuWrapper } from "@/entities/menu"; import { StoreProvider } from "@/shared/providers"; import { AlertDialog } from "@/shared/ui/alert-dialog"; +import { ConfirmDialog } from "@/shared/ui/confirm-dialog"; const AppProvider = ({ children }: Readonly<{ children: React.ReactNode }>) => { const queryClient = new QueryClient(); @@ -16,6 +17,7 @@ const AppProvider = ({ children }: Readonly<{ children: React.ReactNode }>) => { {children} + diff --git a/apps/cs/src/entities/posting/model/posting-interface.ts b/apps/cs/src/entities/posting/model/posting-interface.ts index 3adaf3404..0c9d65a51 100644 --- a/apps/cs/src/entities/posting/model/posting-interface.ts +++ b/apps/cs/src/entities/posting/model/posting-interface.ts @@ -32,10 +32,17 @@ export const withModePostSchema = postSchema }) .omit({ siteNm: true, + pstgTypeNm: true, + pstgPrdSeNm: true, }); +export const postingFormSchema = z.object({ + pstg: z.array(withModePostSchema), +}); + export type Post = z.infer; export type WithModePost = z.infer; +export type PostingFormData = z.infer; export interface PostService { getPostingHistory: (params: PostingParams) => Promise>; diff --git a/apps/cs/src/entities/posting/ui/posting-dialog.tsx b/apps/cs/src/entities/posting/ui/posting-dialog.tsx index 7a91d510e..df07e2182 100644 --- a/apps/cs/src/entities/posting/ui/posting-dialog.tsx +++ b/apps/cs/src/entities/posting/ui/posting-dialog.tsx @@ -1,7 +1,9 @@ import dayjs from "dayjs"; import { useState } from "react"; +import { zodResolver } from "@hookform/resolvers/zod"; import { useFieldArray, useForm } from "react-hook-form"; -import { useQuery } from "@tanstack/react-query"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import { useConfirm } from "@frontend-opensource/use-react-hooks"; import { Dialog, DialogTrigger, @@ -19,13 +21,22 @@ import { Checkbox, Select, DateRangePicker, + DialogClose, + DialogFooter, } from "@common/components/ui"; import { cn } from "@common/components/lib"; import { CodeSelect } from "@/entities/code"; import { SiteApi, type Site } from "@/entities/site"; import type { PageableList } from "@/shared/model"; import { ENDPOINT } from "@/shared/config"; -import { type PostingType } from "../model/posting-interface"; +import { PostingApi } from "../api/posting-service"; +import { + postingFormSchema, + type PostingFormData, + type PostingType, + type WithModePost, +} from "../model/posting-interface"; +import { useAlertStore } from "@/shared/lib/use-alert-store"; type DateRange = { from: string; @@ -49,6 +60,8 @@ const POSTING_TYPE_LABEL = { } as const; function PostingDialog({ postingType, postingTargets }: PostingDialogProps) { + const { confirm } = useConfirm(); + const { setMessage: alert } = useAlertStore((state) => state); const [selectedRows, setSelectedRows] = useState([]); const [rememberPeriodCode, setRememberPeriodCode] = useState< Record @@ -62,7 +75,16 @@ function PostingDialog({ postingType, postingTargets }: PostingDialogProps) { queryFn: () => SiteApi.getSiteList({}), }); - const form = useForm(); + const { mutateAsync: requestPosting } = useMutation({ + mutationFn: (data: WithModePost[]) => PostingApi.requestPosting(data), + onSuccess: () => { + alert("저장되었습니다."); + }, + }); + + const form = useForm({ + resolver: zodResolver(postingFormSchema), + }); const { fields, append, replace } = useFieldArray({ control: form.control, name: "pstg", @@ -172,6 +194,13 @@ function PostingDialog({ postingType, postingTargets }: PostingDialogProps) { }); }; + const handleSave = async () => { + if (await confirm("저장하시겠습니까?")) { + const data = form.getValues("pstg"); + await requestPosting(data); + } + }; + return ( @@ -196,7 +225,7 @@ function PostingDialog({ postingType, postingTargets }: PostingDialogProps) { ))} -
+
@@ -258,6 +287,16 @@ function PostingDialog({ postingType, postingTargets }: PostingDialogProps) {
+ + + + + +
); diff --git a/apps/cs/src/shared/ui/confirm-dialog.tsx b/apps/cs/src/shared/ui/confirm-dialog.tsx index 8f9ce2264..4223d197e 100644 --- a/apps/cs/src/shared/ui/confirm-dialog.tsx +++ b/apps/cs/src/shared/ui/confirm-dialog.tsx @@ -9,7 +9,7 @@ import { } from "@common/components/ui"; type ConfirmDialogProps = { - open: boolean; + open?: boolean; confirmButtonProps?: ButtonProps & { label?: string }; cancelButtonProps?: ButtonProps & { label?: string }; }; @@ -19,9 +19,9 @@ function ConfirmDialog({ confirmButtonProps, cancelButtonProps, }: ConfirmDialogProps) { - const { message, onConfirm, onCancel } = useConfirm(); + const { message, isOpen, onConfirm, onCancel } = useConfirm(); return ( - +

{message}