From 3925898855d81ff428e1a1fcd0a481db0fddc68a Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 26 Oct 2025 15:01:45 +0330 Subject: [PATCH] Add approve and answer functionality to Questions page --- src/pages/products/Questions.tsx | 30 ++++++++++++- .../products/components/QuestionModal.tsx | 42 +++++++++++++++++-- src/pages/products/hooks/useProductData.ts | 12 ++++++ src/pages/products/service/ProductService.ts | 10 +++++ 4 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/pages/products/Questions.tsx b/src/pages/products/Questions.tsx index 1d92fb7..347fb09 100644 --- a/src/pages/products/Questions.tsx +++ b/src/pages/products/Questions.tsx @@ -1,5 +1,5 @@ import { type FC, useState } from 'react' -import { useGetProductQuestions } from './hooks/useProductData' +import { useGetProductQuestions, useApproveProductQuestion, useAnswerProductQuestion } from './hooks/useProductData' import { type ProductQuestionType } from './types/Types' import PageLoading from '../../components/PageLoading' import Error from '../../components/Error' @@ -14,7 +14,9 @@ const Questions: FC = () => { const [currentPage, setCurrentPage] = useState(1); const [selectedQuestion, setSelectedQuestion] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); - const { data, isLoading, error } = useGetProductQuestions(currentPage); + const { data, isLoading, error, refetch } = useGetProductQuestions(currentPage); + const approveMutation = useApproveProductQuestion(); + const answerMutation = useAnswerProductQuestion(); if (isLoading) { return ( @@ -63,6 +65,26 @@ const Questions: FC = () => { setSelectedQuestion(null); }; + const handleApproveQuestion = async (questionId: string) => { + try { + await approveMutation.mutateAsync(questionId); + await refetch(); + handleCloseModal(); + } catch (error) { + console.error('خطا در تایید سوال:', error); + } + }; + + const handleAnswerQuestion = async (questionId: string, answer: string) => { + try { + await answerMutation.mutateAsync({ id: questionId, answer }); + await refetch(); + handleCloseModal(); + } catch (error) { + console.error('خطا در پاسخ به سوال:', error); + } + }; + return (
@@ -152,6 +174,10 @@ const Questions: FC = () => { isOpen={isModalOpen} onClose={handleCloseModal} question={selectedQuestion} + onApprove={handleApproveQuestion} + onAnswer={handleAnswerQuestion} + isApproving={approveMutation.isPending} + isAnswering={answerMutation.isPending} />
) diff --git a/src/pages/products/components/QuestionModal.tsx b/src/pages/products/components/QuestionModal.tsx index 6db982a..4715028 100644 --- a/src/pages/products/components/QuestionModal.tsx +++ b/src/pages/products/components/QuestionModal.tsx @@ -1,16 +1,19 @@ -import { type FC } from 'react' +import { type FC, useState } from 'react' import { type ProductQuestionType } from '../types/Types' import DefaulModal from '../../../components/DefaulModal' import StatusWithText from '../../../components/StatusWithText' import { Button } from '@/components/ui/button' -import { TickCircle } from 'iconsax-react' +import { Textarea } from '@/components/Textarea' +import { TickCircle, Send } from 'iconsax-react' interface QuestionModalProps { isOpen: boolean onClose: () => void question: ProductQuestionType | null onApprove?: (questionId: string) => void + onAnswer?: (questionId: string, answer: string) => void isApproving?: boolean + isAnswering?: boolean } const QuestionModal: FC = ({ @@ -18,8 +21,11 @@ const QuestionModal: FC = ({ onClose, question, onApprove, - isApproving = false + onAnswer, + isApproving = false, + isAnswering = false }) => { + const [answer, setAnswer] = useState(''); const getStatusVariant = (status: string) => { switch (status) { case 'accepted': return 'success'; @@ -44,6 +50,13 @@ const QuestionModal: FC = ({ } }; + const handleAnswer = () => { + if (question && onAnswer && answer.trim()) { + onAnswer(question._id, answer.trim()); + setAnswer(''); + } + }; + return ( = ({ تاریخ ارسال: {question.createdAt} + {/* بخش پاسخ دادن */} + {onAnswer && ( +
+

پاسخ به سوال:

+