From bb5db5019d627f6d0ac0eee698c287cacf3dcc6d Mon Sep 17 00:00:00 2001 From: bagusajisaputroo Date: Thu, 24 Apr 2025 16:56:38 +0700 Subject: [PATCH] feedbackmember+detail+review --- .../feedback-member/FeedbackMember.tsx | 15 +- .../feedback-member/blocks/EditDialog.tsx | 189 +++++++ .../feedback-member/blocks/FeedbackDetail.tsx | 481 +++++++++++------- .../hooks/ManageFeedbackMemberContext.tsx | 142 +++--- .../hooks/useManageFeedbackMemberContext.tsx | 4 +- 5 files changed, 568 insertions(+), 263 deletions(-) create mode 100644 src/pages/members/feedback-member/blocks/EditDialog.tsx diff --git a/src/pages/members/feedback-member/FeedbackMember.tsx b/src/pages/members/feedback-member/FeedbackMember.tsx index d8d8810..242b47c 100644 --- a/src/pages/members/feedback-member/FeedbackMember.tsx +++ b/src/pages/members/feedback-member/FeedbackMember.tsx @@ -1,17 +1,23 @@ import { Container, DataGridInner } from '@/components'; -import { ManageFeedbackMemberProvider } from './hooks/ManageFeedbackMemberContext'; +import { ManageFeedbackMemberProvider } from './hooks/ManageFeedbackMemberContext'; // import EditDialog from './blocks/EditDialog'; // import DeleteDialog from './blocks/DeleteDialog'; import { Breadcrumbs, Link } from '@mui/material'; import { Helmet } from 'react-helmet'; +import FeedbackDetail from './blocks/FeedbackDetail'; +import EditDialog from './blocks/EditDialog'; const FeedbackMemberMaster = () => { return ( <> - TPAY | Manage Provider + + TPAY | Manage Provider + -

Manage Feedback Member

+

+ Manage Feedback Member +

Dashboard @@ -28,9 +34,12 @@ const FeedbackMemberMaster = () => {
+ + {/* */} + {/* */}
diff --git a/src/pages/members/feedback-member/blocks/EditDialog.tsx b/src/pages/members/feedback-member/blocks/EditDialog.tsx new file mode 100644 index 0000000..53a0715 --- /dev/null +++ b/src/pages/members/feedback-member/blocks/EditDialog.tsx @@ -0,0 +1,189 @@ +import { useState, useEffect } from 'react'; +import { Dialog, DialogContent } from '@/components/ui/dialog'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue +} from '@/components/ui/select'; +import { useCallApi } from '@/hooks'; +import { apiConfig } from '@/config/api.config'; +import { getAuth } from '@/auth'; +import { useManageFeedbackContext } from '../hooks/useManageFeedbackMemberContext'; +import { Button } from '@/components/ui/button'; +import { toast } from 'sonner'; +import { X } from 'lucide-react'; + +const API_URL = apiConfig.service_feedback; + +// Define status types +type StatusCode = 'W' | 'N' | 'Y'; + +// Status display mapping for Select component +const statusDisplayMap: Record = { + W: 'Waiting Follow Up', + N: 'Rejected', + Y: 'Accepted' +}; + +const EditDialog = () => { + const [loading, setLoading] = useState(false); + const { PutData, GetData } = useCallApi(); + const { handleEditDialog, showEditDialog, selectedFeedback, handleDetailDialog, refreshData } = + useManageFeedbackContext(); + + const [reviewNotes, setReviewNotes] = useState(''); + const [status, setStatus] = useState('Y'); // Default to Accepted + + useEffect(() => { + if (showEditDialog && selectedFeedback) { + fetchFeedbackDetail(); + } + }, [showEditDialog, selectedFeedback]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setLoading(true); + + try { + const username = getAuth()?.user.username; + const payload = { + review_by: username, + review_notes: reviewNotes, + status: status + }; + + const response = await PutData(`${API_URL}/feedback/update/${selectedFeedback}`, payload); + + if (response?.status) { + toast.success('Feedback reviewed successfully'); + + // Close the edit dialog + handleEditDialog(false, null); + + // First close the detail dialog to reset its state + handleDetailDialog(false, null); + + // Refresh the main data grid first + refreshData(); + + // Wait a tiny bit then reopen the detail with refreshed data + setTimeout(() => { + handleDetailDialog(true, selectedFeedback); + }, 300); + } else { + toast.error(response?.message || 'Failed to update feedback'); + } + } catch (error) { + console.error('Error updating feedback:', error); + toast.error('An error occurred while updating feedback'); + } finally { + setLoading(false); + } + }; + + const fetchFeedbackDetail = async () => { + if (!selectedFeedback) return; + try { + setLoading(true); + const response = await GetData(`${API_URL}/feedback/detail/${selectedFeedback}`, { + id: selectedFeedback + }); + + if (!response || !response.data) { + console.error('Invalid response format'); + return; + } + + const data = response.data; + console.log('Fetched data:', data); + + setReviewNotes(data.review_notes || ''); + + const currentStatus = (data.status as StatusCode) || 'Y'; + setStatus(currentStatus); + } catch (error) { + console.error('Error fetching feedback details:', error); + } finally { + setLoading(false); + } + }; + + return ( + handleEditDialog(open, null)}> + +
+
+
+

Review Feedback

+

Review and update feedback status

+
+ +
+ +
+
+
+ +