/* global appLocalizer */ import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { __ } from '@wordpress/i18n'; import { getApiLink, FormGroupWrapper, FormGroup, TableCard, BasicInputUI, ButtonInputUI, ChoiceToggleUI, TextAreaUI, PopupUI, TableRow, QueryProps, CategoryCount, InfoItem, } from 'zyra'; import Popup from '../../../src/components/Popup/Popup'; import { formatLocalDate, getUrl } from '../../../src/services/commonFunction'; type StoreQueriesRow = { id: number; product_name: string; product_link: string; question_text: string; answer_text?: string | null; author_name?: string; question_date?: string; time_ago?: string; question_visibility?: string; }; type StoreOption = { label: string; value: number; }; const Queries: React.FC = () => { const [rows, setRows] = useState([]); const [isLoading, setIsLoading] = useState(false); const [totalRows, setTotalRows] = useState(0); const [rowIds, setRowIds] = useState([]); const [store, setStore] = useState(null); const [categoryCounts, setCategoryCounts] = useState< CategoryCount[] | null >(null); const [selectedQueries, setSelectedQueries] = useState(null); const [answer, setAnswer] = useState(''); const [queries, setQueries] = useState(''); const [selectedQn, setSelectedQn] = useState<{ id: number; } | null>(null); const [confirmOpen, setConfirmOpen] = useState(false); const handleConfirmDelete = () => { if (!selectedQn) { return; } axios({ method: 'DELETE', url: getApiLink(appLocalizer, `customer-queries/${selectedQn.id}`), headers: { 'X-WP-Nonce': appLocalizer.nonce, }, }) .then(() => { doRefreshTableData({}); }) .finally(() => { setConfirmOpen(false); setSelectedQn(null); }); }; const fetchQueriesById = (id: number) => { return axios .get(getApiLink(appLocalizer, `customer-queries/${id}`), { headers: { 'X-WP-Nonce': appLocalizer.nonce }, }) .then((response) => { const item = response.data; setSelectedQueries({ id: item.id, product_name: item.product_name, product_link: item.product_link, question_text: item.question_text, answer_text: item.answer_text || '', author_name: item.author_name, question_date: item.question_date, question_visibility: item.question_visibility || 'public', }); setQueries(item.question_text); setAnswer(item.answer_text || ''); }); }; useEffect(() => { axios .get(getApiLink(appLocalizer, 'stores'), { headers: { 'X-WP-Nonce': appLocalizer.nonce }, params: { options: true }, }) .then((response) => { const options = (response.data || []).map((store) => ({ label: store.store_name, value: store.id, })); setStore(options); setIsLoading(false); }) .catch(() => { setStore([]); setIsLoading(false); }); }, []); const handleSaveAnswer = () => { if (!selectedQueries) { return; } axios .post( getApiLink( appLocalizer, `customer-queries/${selectedQueries.id}` ), { question_text: queries, answer_text: answer, question_visibility: selectedQueries.question_visibility || 'public', }, { headers: { 'X-WP-Nonce': appLocalizer.nonce } } ) .then(() => { doRefreshTableData({}); // Reset popup setSelectedQueries(null); setAnswer(''); }) .catch(() => { alert('Failed to save answer'); }); }; const headers = { product_name: { label: __('Product', 'multivendorx'), render: (row: any) => ( ), }, question_text: { label: __('Question', 'multivendorx'), render: (row: any) => (
{__('Q:', 'multivendorx')} {row.question_text}
{row.answer_text && (
{__('A:', 'multivendorx')} {row.answer_text}
)}
{__('By', 'multivendorx')} {row.author_name}
), }, question_date: { label: __('Date', 'multivendorx'), type: 'date', }, total_votes: { label: __('Votes', 'multivendorx'), }, question_visibility: { label: __('Visibility', 'multivendorx'), type: 'status' , statusClass: (row) => `${row.status}`, }, action: { type: 'action', label: __('Action', 'multivendorx'), actions: [ { label: __('Answer', 'multivendorx'), icon: 'answer', onClick: (row) => fetchQueriesById(row.id), }, { label: __('Delete', 'multivendorx'), icon: 'delete', onClick: (row) => { setSelectedQn({ id: row.id }); setConfirmOpen(true); }, }, ], }, }; const filters = [ { key: 'storeId', label: __('Stores', 'multivendorx'), type: 'select', options: store, }, { key: 'questionVisibility', label: __('Status', 'multivendorx'), type: 'select', options: [ { label: __('All', 'multivendorx'), value: '' }, { label: __('Public', 'multivendorx'), value: 'public' }, { label: __('Private', 'multivendorx'), value: 'private' }, ], }, { key: 'created_at', label: __('Created Date', 'multivendorx'), type: 'date', }, ]; const doRefreshTableData = (query: QueryProps) => { setIsLoading(true); axios .get(getApiLink(appLocalizer, 'customer-queries'), { headers: { 'X-WP-Nonce': appLocalizer.nonce }, params: { page: query.paged || 1, row: query.per_page || 10, status: query.categoryFilter || '', search_value: query.searchValue || '', store_id: query?.filter?.storeId, start_date: query.filter?.created_at?.startDate ? formatLocalDate(query.filter.created_at.startDate) : '', end_date: query.filter?.created_at?.endDate ? formatLocalDate(query.filter.created_at.endDate) : '', question_visibility: query?.filter?.questionVisibility, order_by: query.orderby, order: query.order, }, }) .then((response) => { const items = response.data || []; const ids = items .filter((item) => item?.id != null) .map((item) => item.id); setRowIds(ids); setRows(items); window.multivendorxCustomerStore?.setCount( 'customer-queries', Number(response.headers['x-wp-status-unanswered']) || 0 ); setCategoryCounts([ { value: 'all', label: __('All', 'multivendorx'), count: Number(response.headers['x-wp-total']) || 0, }, { value: 'has_answer', label: __('Answered', 'multivendorx'), count: Number(response.headers['x-wp-status-answered']) || 0, }, { value: 'no_answer', label: __('Unanswered', 'multivendorx'), count: Number( response.headers['x-wp-status-unanswered'] ) || 0, }, ]); setTotalRows(Number(response.headers['x-wp-total']) || 0); setIsLoading(false); }) .catch((error) => { setRows([]); setTotalRows(0); setIsLoading(false); console.error(error); }); }; return ( <> setConfirmOpen(false)} width={31.25} > { setConfirmOpen(false); setSelectedQn(null); }} /> {selectedQueries && ( setSelectedQueries(null)} width={30} height="70%" header={{ icon: 'question', title: __('Answer Question', 'multivendorx'), description: __( 'Ensure unanswered customer questions are addressed and helpful information is available to buyers.', 'multivendorx' ), }} footer={ setSelectedQueries(null), }, { icon: 'save', text: __('Save Answer', 'multivendorx'), onClick: () => handleSaveAnswer(), }, ]} /> } > setQueries(value)} /> setAnswer(value)} /> setSelectedQueries((prev) => prev ? { ...prev, question_visibility: value, } : prev ) } /> )} ); }; export default Queries;