Criticisms
This commit is contained in:
@@ -30,7 +30,7 @@ const CriticismsDetail: FC = () => {
|
||||
<Fragment>
|
||||
<div>
|
||||
{t('criticisms.criticism')}
|
||||
{' #' + getDetail.data?.data?.criticism?.numericId}
|
||||
{/* {' #' + getDetail.data?.data?.criticism?.numericId} */}
|
||||
</div>
|
||||
|
||||
<div className='flex-1 mt-4 bg-white p-8 rounded-2xl'>
|
||||
|
||||
@@ -2,19 +2,19 @@ import { type FC, useState } from 'react'
|
||||
import { useDeleteCriticismsDetail, useGetCriticismsList } from './hooks/useCriticismsData'
|
||||
// import { useTranslation } from 'react-i18next'
|
||||
import { Link } from 'react-router-dom'
|
||||
import { Eye, Trash } from 'iconsax-react'
|
||||
import { Eye } from 'iconsax-react'
|
||||
import { Paths } from '../../config/Paths'
|
||||
import type { CriticismsItemTypes } from './types/CriticismsTypes'
|
||||
import moment from 'moment-jalaali'
|
||||
import DefaulModal from '../../components/DefaulModal'
|
||||
import Table from '../../components/Table'
|
||||
import type { ColumnType } from '../../components/types/TableTypes'
|
||||
import TrashWithConfrim from '@/components/TrashWithConfrim'
|
||||
import { toast } from '@/shared/toast'
|
||||
import { extractErrorMessage } from '@/config/func'
|
||||
|
||||
const CriticismsList: FC = () => {
|
||||
|
||||
const [itemId, setItemId] = useState<string>('')
|
||||
const [page, setPage] = useState<number>(1)
|
||||
const [openConfrim, setOpenConfrim] = useState(false)
|
||||
const getCriticismsList = useGetCriticismsList(page)
|
||||
const deleteCriticisms = useDeleteCriticismsDetail()
|
||||
|
||||
@@ -36,28 +36,19 @@ const CriticismsList: FC = () => {
|
||||
return translations[key] || key;
|
||||
};
|
||||
|
||||
const handleDelete = (id?: string, confrim: boolean = false) => {
|
||||
if (confrim) {
|
||||
|
||||
deleteCriticisms.mutate(itemId, {
|
||||
const handleDelete = (id: string) => {
|
||||
deleteCriticisms.mutate(id, {
|
||||
onSuccess: () => {
|
||||
getCriticismsList.refetch()
|
||||
setOpenConfrim(false)
|
||||
setItemId('')
|
||||
},
|
||||
onError: (error) => {
|
||||
toast(extractErrorMessage(error), 'error')
|
||||
}
|
||||
})
|
||||
} else if (id) {
|
||||
setItemId(id)
|
||||
setOpenConfrim(true)
|
||||
}
|
||||
}
|
||||
|
||||
// Define table columns
|
||||
const columns: ColumnType<CriticismsItemTypes>[] = [
|
||||
{
|
||||
title: t('criticisms.number'),
|
||||
key: 'numericId',
|
||||
},
|
||||
{
|
||||
title: t('criticisms.title_criticisms'),
|
||||
key: 'title',
|
||||
@@ -76,9 +67,14 @@ const CriticismsList: FC = () => {
|
||||
title: t('detail'),
|
||||
key: 'detail',
|
||||
render: (item) => (
|
||||
<div className='flex gap-2 items-center'>
|
||||
<Link to={Paths.criticisms.detail + item.id}>
|
||||
<Eye size={20} color='#8C90A3' />
|
||||
</Link>
|
||||
<TrashWithConfrim
|
||||
onDelete={() => handleDelete(item.id)}
|
||||
/>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
];
|
||||
@@ -93,13 +89,6 @@ const CriticismsList: FC = () => {
|
||||
columns={columns}
|
||||
data={getCriticismsList.data?.data?.criticisms}
|
||||
isLoading={getCriticismsList.isPending}
|
||||
rowActions={(item) => [
|
||||
{
|
||||
label: t('delete'),
|
||||
onClick: () => handleDelete(String(item.id)),
|
||||
icon: <Trash size={20} color='#8C90A3' />,
|
||||
}
|
||||
]}
|
||||
pagination={{
|
||||
currentPage: page,
|
||||
totalPages: getCriticismsList.data?.data?.pager?.totalPages || 1,
|
||||
@@ -107,31 +96,6 @@ const CriticismsList: FC = () => {
|
||||
}}
|
||||
/>
|
||||
|
||||
<DefaulModal
|
||||
open={openConfrim}
|
||||
close={() => setOpenConfrim(false)}
|
||||
isHeader={true}
|
||||
title_header={t('delete_confirmation')}
|
||||
>
|
||||
<div className="p-4">
|
||||
<p className="mb-6">{t('are_you_sure_delete')}</p>
|
||||
<div className="flex gap-3 justify-end">
|
||||
<button
|
||||
onClick={() => setOpenConfrim(false)}
|
||||
className="px-4 py-2 bg-gray-200 rounded-lg"
|
||||
>
|
||||
{t('cancel')}
|
||||
</button>
|
||||
<button
|
||||
onClick={() => handleDelete('', true)}
|
||||
disabled={deleteCriticisms.isPending}
|
||||
className="px-4 py-2 bg-red-500 text-white rounded-lg disabled:opacity-50"
|
||||
>
|
||||
{deleteCriticisms.isPending ? t('deleting') : t('delete')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</DefaulModal>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,130 +1,23 @@
|
||||
import { useMutation, useQuery } from "@tanstack/react-query";
|
||||
// import * as api from "../service/CriticismsService";
|
||||
import type { CriticismsItemTypes } from "../types/CriticismsTypes";
|
||||
|
||||
// Static data for development
|
||||
const staticCriticismsData = {
|
||||
data: {
|
||||
criticisms: [
|
||||
{
|
||||
id: "1",
|
||||
numericId: "1001",
|
||||
title: "مشکل در سیستم پرداخت",
|
||||
content:
|
||||
"سلام، من در هنگام پرداخت با مشکل مواجه شدم. سیستم پرداخت به درستی کار نمیکند و پس از وارد کردن اطلاعات کارت، خطای عجیبی نمایش داده میشود. لطفاً این مشکل را بررسی کنید.",
|
||||
createdAt: new Date("2024-01-15T10:30:00"),
|
||||
isRead: false,
|
||||
files: [
|
||||
{ id: "f1", fileUrl: "https://example.com/files/payment-error.png" },
|
||||
{ id: "f2", fileUrl: "https://example.com/files/screenshot.jpg" },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "2",
|
||||
numericId: "1002",
|
||||
title: "کیفیت محصول مطابق انتظار نبود",
|
||||
content:
|
||||
"محصولی که سفارش دادم کیفیت مناسبی نداشت و با توضیحات ارائه شده در سایت مطابقت نداشت. انتظار داشتم کیفیت بهتری داشته باشد.",
|
||||
createdAt: new Date("2024-01-14T14:20:00"),
|
||||
isRead: true,
|
||||
files: [
|
||||
{ id: "f3", fileUrl: "https://example.com/files/product-photo.jpg" },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "3",
|
||||
numericId: "1003",
|
||||
title: "تاخیر در ارسال سفارش",
|
||||
content:
|
||||
"سفارش من با تاخیر زیادی ارسال شد. زمان تحویل اعلام شده رعایت نشد و این موضوع باعث نارضایتی من شده است.",
|
||||
createdAt: new Date("2024-01-13T09:15:00"),
|
||||
isRead: false,
|
||||
files: [],
|
||||
},
|
||||
{
|
||||
id: "4",
|
||||
numericId: "1004",
|
||||
title: "مشکل در پشتیبانی آنلاین",
|
||||
content:
|
||||
"سیستم چت آنلاین سایت به درستی کار نمیکند و نمیتوانم با پشتیبانی ارتباط برقرار کنم. لطفاً این مشکل را حل کنید.",
|
||||
createdAt: new Date("2024-01-12T16:45:00"),
|
||||
isRead: true,
|
||||
files: [
|
||||
{ id: "f4", fileUrl: "https://example.com/files/chat-error.png" },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: "5",
|
||||
numericId: "1005",
|
||||
title: "پیشنهاد بهبود رابط کاربری",
|
||||
content:
|
||||
"رابط کاربری سایت نیاز به بهبود دارد. منوها کمی پیچیده هستند و یافتن محصولات مورد نظر دشوار است. پیشنهاد میکنم طراحی سادهتری استفاده کنید.",
|
||||
createdAt: new Date("2024-01-11T11:30:00"),
|
||||
isRead: false,
|
||||
files: [],
|
||||
},
|
||||
] as CriticismsItemTypes[],
|
||||
pager: {
|
||||
totalPages: 2,
|
||||
currentPage: 1,
|
||||
totalItems: 5,
|
||||
},
|
||||
},
|
||||
};
|
||||
import * as api from "../service/CriticismsService";
|
||||
|
||||
export const useGetCriticismsList = (page: number) => {
|
||||
// Commented out API call - using static data instead
|
||||
// return useQuery({
|
||||
// queryKey: ["criticisms", page],
|
||||
// queryFn: () => api.getCriticismsList(page),
|
||||
// });
|
||||
|
||||
return {
|
||||
data: staticCriticismsData,
|
||||
isPending: false,
|
||||
isLoading: false,
|
||||
refetch: () => Promise.resolve(staticCriticismsData),
|
||||
};
|
||||
return useQuery({
|
||||
queryKey: ["criticisms", page],
|
||||
queryFn: () => api.getCriticismsList(page),
|
||||
});
|
||||
};
|
||||
|
||||
export const useDeleteCriticismsDetail = () => {
|
||||
// Commented out API call - using mock function instead
|
||||
// return useMutation({
|
||||
// mutationFn: (id: string) => api.deleteCriticisms(id),
|
||||
// });
|
||||
|
||||
return {
|
||||
mutate: (id: string, options?: { onSuccess?: () => void }) => {
|
||||
// Mock delete - just call onSuccess after a brief delay
|
||||
setTimeout(() => {
|
||||
if (options?.onSuccess) {
|
||||
options.onSuccess();
|
||||
}
|
||||
}, 500);
|
||||
},
|
||||
isPending: false,
|
||||
};
|
||||
return useMutation({
|
||||
mutationFn: (id: string) => api.deleteCriticisms(id),
|
||||
});
|
||||
};
|
||||
|
||||
export const useGetDetailCriticisms = (id: string) => {
|
||||
// Commented out API call - using static data instead
|
||||
// return useQuery({
|
||||
// queryKey: ["criticisms", id],
|
||||
// queryFn: () => api.getCriticismsDetail(id),
|
||||
// enabled: !!id,
|
||||
// });
|
||||
|
||||
const criticism = staticCriticismsData.data.criticisms.find(
|
||||
(item) => item.id === id
|
||||
);
|
||||
|
||||
return {
|
||||
data: {
|
||||
data: {
|
||||
criticism: criticism || null,
|
||||
},
|
||||
},
|
||||
isPending: false,
|
||||
isLoading: false,
|
||||
};
|
||||
return useQuery({
|
||||
queryKey: ["criticisms", id],
|
||||
queryFn: () => api.getCriticismsDetail(id),
|
||||
enabled: !!id,
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
// API service functions commented out - using static data instead
|
||||
// import axios from "../../../config/axios";
|
||||
import axios from "@/config/axios";
|
||||
|
||||
// export const getCriticismsList = async (page: number) => {
|
||||
// const { data } = await axios.get(`/criticisms?page=${page}`);
|
||||
// return data;
|
||||
// };
|
||||
export const getCriticismsList = async (page: number) => {
|
||||
const { data } = await axios.get(`/admin/criticisms?page=${page}`);
|
||||
return data;
|
||||
};
|
||||
|
||||
// export const getCriticismsDetail = async (id: string) => {
|
||||
// const { data } = await axios.get(`/criticisms/${id}`);
|
||||
// return data;
|
||||
// };
|
||||
export const getCriticismsDetail = async (id: string) => {
|
||||
const { data } = await axios.get(`/admin/criticisms/${id}`);
|
||||
return data;
|
||||
};
|
||||
|
||||
// export const deleteCriticisms = async (id: string) => {
|
||||
// const { data } = await axios.delete(`/criticisms/${id}`);
|
||||
// return data;
|
||||
// };
|
||||
export const deleteCriticisms = async (id: string) => {
|
||||
const { data } = await axios.delete(`/admin/criticisms/${id}`);
|
||||
return data;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user