diff --git a/src/api/delete.ts b/src/api/delete.ts new file mode 100644 index 0000000..63512ee --- /dev/null +++ b/src/api/delete.ts @@ -0,0 +1,20 @@ +import apiClient from '@/api/apiClient'; + +export interface DeleteResponse { + success: boolean; + message?: string; +} + +export const deleteWine: (wineId: number) => Promise = async (wineId) => { + const response = await apiClient.delete( + `/${process.env.NEXT_PUBLIC_TEAM}/wines/${wineId}`, + ); + return response.data; +}; + +export const deleteReview = async (reviewId: number): Promise => { + const response = await apiClient.delete( + `/${process.env.NEXT_PUBLIC_TEAM}/reviews/${reviewId}`, + ); + return response.data; +}; diff --git a/src/assets/icons/Star.svg b/src/assets/icons/Star.svg deleted file mode 100644 index a109d75..0000000 --- a/src/assets/icons/Star.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/components/Modal/DeleteModal/DeleteModal.tsx b/src/components/Modal/DeleteModal/DeleteModal.tsx new file mode 100644 index 0000000..ea6ff8b --- /dev/null +++ b/src/components/Modal/DeleteModal/DeleteModal.tsx @@ -0,0 +1,91 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { AxiosError } from 'axios'; + +import { deleteReview, deleteWine, DeleteResponse } from '@/api/delete'; +import BasicModal from '@/components/common/Modal/BasicModal'; +import { Button } from '@/components/ui/button'; + +interface DeleteModalProps { + type: 'wine' | 'review'; + id: number; + showDeleteModal: boolean; + setShowDeleteModal: (state: boolean) => void; +} + +const DeleteModal = ({ type, id, showDeleteModal, setShowDeleteModal }: DeleteModalProps) => { + const queryClient = useQueryClient(); + + const deleteWineMutation = useMutation({ + mutationFn: (id) => deleteWine(id), + }); + const deleteReviewMutation = useMutation({ + mutationFn: (id) => deleteReview(id), + }); + + const handleDelete = () => { + if (type === 'wine') { + deleteWineMutation.mutate(id, { + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['wines'] }); //삭제후 관련데이터 바로 갱신 + console.log('와인 삭제 성공'); + setShowDeleteModal(false); + }, + onError: (error) => { + console.error('와인 삭제 실패', error); + }, + }); + } else if (type === 'review') { + deleteReviewMutation.mutate(id, { + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['reviews'] }); + console.log('리뷰 삭제 성공'); + setShowDeleteModal(false); + }, + onError: (error) => { + console.error('리뷰 삭제 실패', error); + }, + }); + } + }; + + return ( +
+ setShowDeleteModal(isOpen)} + showCloseButton={false} + buttons={ +
+ + +
+ } + > + + 정말로 삭제하시겠습니까? + +
+
+ ); +}; +export default DeleteModal; diff --git a/src/components/common/winelist/WineCard.tsx b/src/components/common/winelist/WineCard.tsx index 962dc6b..01b28ac 100644 --- a/src/components/common/winelist/WineCard.tsx +++ b/src/components/common/winelist/WineCard.tsx @@ -2,7 +2,7 @@ import React from 'react'; import Link from 'next/link'; -import StarIcon from '@/assets/icons/Star.svg'; +import StarIcon from '@/assets/icons/star.svg'; import { ImageCard } from '@/components/common/card/ImageCard'; import { cn } from '@/lib/utils'; diff --git a/src/components/common/winelist/WineListCard.tsx b/src/components/common/winelist/WineListCard.tsx index 1885618..6d3fa36 100644 --- a/src/components/common/winelist/WineListCard.tsx +++ b/src/components/common/winelist/WineListCard.tsx @@ -1,7 +1,7 @@ import Link from 'next/link'; import NextIcon from '@/assets/icons/Next.svg'; -import StarIcon from '@/assets/icons/Star.svg'; +import StarIcon from '@/assets/icons/star.svg'; import { ImageCard } from '@/components/common/card/ImageCard'; import { Button } from '@/components/ui/button'; import { cn } from '@/lib/utils';