diff --git a/src/api/inquiries.api.ts b/src/api/inquiries.api.ts index 7be424e..feac680 100644 --- a/src/api/inquiries.api.ts +++ b/src/api/inquiries.api.ts @@ -16,10 +16,10 @@ export const inquiriesApi = { }, updateAnswer(inquiryId: string, payload: InquiryAnswerRequest) { - return client.patch>(`/inquiries/${inquiryId}/answer`, payload) // PATCH + return client.patch>(`/inquiries/${inquiryId}/answer`, payload) }, - delete(inquiryId: string) { - return client.delete(`/inquiries/${inquiryId}`) + deleteAnswer(inquiryId: string) { + return client.delete>(`/inquiries/${inquiryId}/answer`) }, } \ No newline at end of file diff --git a/src/views/inquiries/InquiriesPage.vue b/src/views/inquiries/InquiriesPage.vue index 57e2bc1..8a8dc17 100644 --- a/src/views/inquiries/InquiriesPage.vue +++ b/src/views/inquiries/InquiriesPage.vue @@ -4,7 +4,6 @@ import { useRouter } from 'vue-router' import { toast } from 'vue-sonner' import DashboardLayout from '@/layouts/DashboardLayout.vue' import BaseSpinner from '@/components/common/BaseSpinner.vue' -import ConfirmDialog from '@/components/common/ConfirmDialog.vue' import { inquiriesApi } from '@/api/inquiries.api' import type { Inquiry } from '@/types/inquiry' import type { ProblemDetail } from '@/types/api' @@ -12,9 +11,6 @@ import type { ProblemDetail } from '@/types/api' const router = useRouter() const inquiries = ref([]) const isLoading = ref(false) -const isDeleting = ref(false) -const selectedInquiry = ref(null) -const showDeleteDialog = ref(false) const typeLabel = (type: Inquiry['type']) => { const map = { USAGE: '이용', BUG: '버그', IMPROVEMENT: '개선', ETC: '기타' } @@ -34,36 +30,14 @@ const fetchInquiries = async () => { } } -const handleDelete = async () => { - if (!selectedInquiry.value) return - isDeleting.value = true - try { - await inquiriesApi.delete(selectedInquiry.value.id) - toast.success('문의가 삭제되었습니다.') - showDeleteDialog.value = false - await fetchInquiries() - } catch (error: unknown) { - const problem = (error as any)?.response?.data as ProblemDetail | undefined - toast.error(problem?.detail || '삭제에 실패했습니다.') - } finally { - isDeleting.value = false - } -} - -const openDelete = (e: Event, inquiry: Inquiry) => { - e.stopPropagation() - selectedInquiry.value = inquiry - showDeleteDialog.value = true -} - const statusLabel = (status: Inquiry['status']) => { return status === 'PENDING' ? '대기' : '답변완료' } const statusClass = (status: Inquiry['status']) => { return status === 'PENDING' - ? 'bg-yellow-50 text-yellow-600' - : 'bg-primary/10 text-primary' + ? 'bg-yellow-50 text-yellow-600' + : 'bg-primary/10 text-primary' } const formatDate = (dateStr: string) => { @@ -77,7 +51,7 @@ onMounted(fetchInquiries) \ No newline at end of file diff --git a/src/views/inquiries/InquiryDetailPage.vue b/src/views/inquiries/InquiryDetailPage.vue index 205ed9a..360cc22 100644 --- a/src/views/inquiries/InquiryDetailPage.vue +++ b/src/views/inquiries/InquiryDetailPage.vue @@ -6,6 +6,7 @@ import { ChevronLeft } from 'lucide-vue-next' import DashboardLayout from '@/layouts/DashboardLayout.vue' import BaseSpinner from '@/components/common/BaseSpinner.vue' import BaseButton from '@/components/common/BaseButton.vue' +import ConfirmDialog from '@/components/common/ConfirmDialog.vue' import { inquiriesApi } from '@/api/inquiries.api' import type { InquiryDetail } from '@/types/inquiry' import type { ProblemDetail } from '@/types/api' @@ -16,6 +17,9 @@ const router = useRouter() const inquiry = ref(null) const isLoading = ref(false) const isSubmitting = ref(false) +const isDeletingAnswer = ref(false) +const showDeleteAnswerDialog = ref(false) +const isEditing = ref(false) const answerContent = ref('') const typeLabel = (type: InquiryDetail['type']) => { @@ -52,11 +56,11 @@ const handleSubmitAnswer = async () => { if (inquiry.value?.adminAnswer) { await inquiriesApi.updateAnswer(id, payload) toast.success('답변이 수정되었습니다.') - router.push('/inquiries') } else { await inquiriesApi.answer(id, payload) toast.success('답변이 등록되었습니다.') } + isEditing.value = false await fetchInquiry() } catch (error: unknown) { const problem = (error as any)?.response?.data as ProblemDetail | undefined @@ -66,6 +70,28 @@ const handleSubmitAnswer = async () => { } } +const handleDeleteAnswer = async () => { + isDeletingAnswer.value = true + try { + const id = route.params.id as string + await inquiriesApi.deleteAnswer(id) + toast.success('답변이 삭제되었습니다.') + showDeleteAnswerDialog.value = false + isEditing.value = false + await fetchInquiry() + } catch (error: unknown) { + const problem = (error as any)?.response?.data as ProblemDetail | undefined + toast.error(problem?.detail || '답변 삭제에 실패했습니다.') + } finally { + isDeletingAnswer.value = false + } +} + +const cancelEdit = () => { + isEditing.value = false + answerContent.value = inquiry.value?.adminAnswer ?? '' +} + const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleDateString('ko-KR', { year: 'numeric', month: '2-digit', day: '2-digit', @@ -78,15 +104,15 @@ onMounted(fetchInquiry)