Criticisms
This commit is contained in:
@@ -30,7 +30,7 @@ const CriticismsDetail: FC = () => {
|
|||||||
<Fragment>
|
<Fragment>
|
||||||
<div>
|
<div>
|
||||||
{t('criticisms.criticism')}
|
{t('criticisms.criticism')}
|
||||||
{' #' + getDetail.data?.data?.criticism?.numericId}
|
{/* {' #' + getDetail.data?.data?.criticism?.numericId} */}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='flex-1 mt-4 bg-white p-8 rounded-2xl'>
|
<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 { useDeleteCriticismsDetail, useGetCriticismsList } from './hooks/useCriticismsData'
|
||||||
// import { useTranslation } from 'react-i18next'
|
// import { useTranslation } from 'react-i18next'
|
||||||
import { Link } from 'react-router-dom'
|
import { Link } from 'react-router-dom'
|
||||||
import { Eye, Trash } from 'iconsax-react'
|
import { Eye } from 'iconsax-react'
|
||||||
import { Paths } from '../../config/Paths'
|
import { Paths } from '../../config/Paths'
|
||||||
import type { CriticismsItemTypes } from './types/CriticismsTypes'
|
import type { CriticismsItemTypes } from './types/CriticismsTypes'
|
||||||
import moment from 'moment-jalaali'
|
import moment from 'moment-jalaali'
|
||||||
import DefaulModal from '../../components/DefaulModal'
|
|
||||||
import Table from '../../components/Table'
|
import Table from '../../components/Table'
|
||||||
import type { ColumnType } from '../../components/types/TableTypes'
|
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 CriticismsList: FC = () => {
|
||||||
|
|
||||||
const [itemId, setItemId] = useState<string>('')
|
|
||||||
const [page, setPage] = useState<number>(1)
|
const [page, setPage] = useState<number>(1)
|
||||||
const [openConfrim, setOpenConfrim] = useState(false)
|
|
||||||
const getCriticismsList = useGetCriticismsList(page)
|
const getCriticismsList = useGetCriticismsList(page)
|
||||||
const deleteCriticisms = useDeleteCriticismsDetail()
|
const deleteCriticisms = useDeleteCriticismsDetail()
|
||||||
|
|
||||||
@@ -36,28 +36,19 @@ const CriticismsList: FC = () => {
|
|||||||
return translations[key] || key;
|
return translations[key] || key;
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleDelete = (id?: string, confrim: boolean = false) => {
|
const handleDelete = (id: string) => {
|
||||||
if (confrim) {
|
deleteCriticisms.mutate(id, {
|
||||||
|
onSuccess: () => {
|
||||||
deleteCriticisms.mutate(itemId, {
|
getCriticismsList.refetch()
|
||||||
onSuccess: () => {
|
},
|
||||||
getCriticismsList.refetch()
|
onError: (error) => {
|
||||||
setOpenConfrim(false)
|
toast(extractErrorMessage(error), 'error')
|
||||||
setItemId('')
|
}
|
||||||
}
|
})
|
||||||
})
|
|
||||||
} else if (id) {
|
|
||||||
setItemId(id)
|
|
||||||
setOpenConfrim(true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define table columns
|
// Define table columns
|
||||||
const columns: ColumnType<CriticismsItemTypes>[] = [
|
const columns: ColumnType<CriticismsItemTypes>[] = [
|
||||||
{
|
|
||||||
title: t('criticisms.number'),
|
|
||||||
key: 'numericId',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: t('criticisms.title_criticisms'),
|
title: t('criticisms.title_criticisms'),
|
||||||
key: 'title',
|
key: 'title',
|
||||||
@@ -76,9 +67,14 @@ const CriticismsList: FC = () => {
|
|||||||
title: t('detail'),
|
title: t('detail'),
|
||||||
key: 'detail',
|
key: 'detail',
|
||||||
render: (item) => (
|
render: (item) => (
|
||||||
<Link to={Paths.criticisms.detail + item.id}>
|
<div className='flex gap-2 items-center'>
|
||||||
<Eye size={20} color='#8C90A3' />
|
<Link to={Paths.criticisms.detail + item.id}>
|
||||||
</Link>
|
<Eye size={20} color='#8C90A3' />
|
||||||
|
</Link>
|
||||||
|
<TrashWithConfrim
|
||||||
|
onDelete={() => handleDelete(item.id)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
@@ -93,13 +89,6 @@ const CriticismsList: FC = () => {
|
|||||||
columns={columns}
|
columns={columns}
|
||||||
data={getCriticismsList.data?.data?.criticisms}
|
data={getCriticismsList.data?.data?.criticisms}
|
||||||
isLoading={getCriticismsList.isPending}
|
isLoading={getCriticismsList.isPending}
|
||||||
rowActions={(item) => [
|
|
||||||
{
|
|
||||||
label: t('delete'),
|
|
||||||
onClick: () => handleDelete(String(item.id)),
|
|
||||||
icon: <Trash size={20} color='#8C90A3' />,
|
|
||||||
}
|
|
||||||
]}
|
|
||||||
pagination={{
|
pagination={{
|
||||||
currentPage: page,
|
currentPage: page,
|
||||||
totalPages: getCriticismsList.data?.data?.pager?.totalPages || 1,
|
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>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,130 +1,23 @@
|
|||||||
import { useMutation, useQuery } from "@tanstack/react-query";
|
import { useMutation, useQuery } from "@tanstack/react-query";
|
||||||
// import * as api from "../service/CriticismsService";
|
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,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useGetCriticismsList = (page: number) => {
|
export const useGetCriticismsList = (page: number) => {
|
||||||
// Commented out API call - using static data instead
|
return useQuery({
|
||||||
// return useQuery({
|
queryKey: ["criticisms", page],
|
||||||
// queryKey: ["criticisms", page],
|
queryFn: () => api.getCriticismsList(page),
|
||||||
// queryFn: () => api.getCriticismsList(page),
|
});
|
||||||
// });
|
|
||||||
|
|
||||||
return {
|
|
||||||
data: staticCriticismsData,
|
|
||||||
isPending: false,
|
|
||||||
isLoading: false,
|
|
||||||
refetch: () => Promise.resolve(staticCriticismsData),
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useDeleteCriticismsDetail = () => {
|
export const useDeleteCriticismsDetail = () => {
|
||||||
// Commented out API call - using mock function instead
|
return useMutation({
|
||||||
// return useMutation({
|
mutationFn: (id: string) => api.deleteCriticisms(id),
|
||||||
// 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,
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useGetDetailCriticisms = (id: string) => {
|
export const useGetDetailCriticisms = (id: string) => {
|
||||||
// Commented out API call - using static data instead
|
return useQuery({
|
||||||
// return useQuery({
|
queryKey: ["criticisms", id],
|
||||||
// queryKey: ["criticisms", id],
|
queryFn: () => api.getCriticismsDetail(id),
|
||||||
// queryFn: () => api.getCriticismsDetail(id),
|
enabled: !!id,
|
||||||
// enabled: !!id,
|
});
|
||||||
// });
|
|
||||||
|
|
||||||
const criticism = staticCriticismsData.data.criticisms.find(
|
|
||||||
(item) => item.id === id
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
data: {
|
|
||||||
data: {
|
|
||||||
criticism: criticism || null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
isPending: false,
|
|
||||||
isLoading: false,
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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) => {
|
export const getCriticismsList = async (page: number) => {
|
||||||
// const { data } = await axios.get(`/criticisms?page=${page}`);
|
const { data } = await axios.get(`/admin/criticisms?page=${page}`);
|
||||||
// return data;
|
return data;
|
||||||
// };
|
};
|
||||||
|
|
||||||
// export const getCriticismsDetail = async (id: string) => {
|
export const getCriticismsDetail = async (id: string) => {
|
||||||
// const { data } = await axios.get(`/criticisms/${id}`);
|
const { data } = await axios.get(`/admin/criticisms/${id}`);
|
||||||
// return data;
|
return data;
|
||||||
// };
|
};
|
||||||
|
|
||||||
// export const deleteCriticisms = async (id: string) => {
|
export const deleteCriticisms = async (id: string) => {
|
||||||
// const { data } = await axios.delete(`/criticisms/${id}`);
|
const { data } = await axios.delete(`/admin/criticisms/${id}`);
|
||||||
// return data;
|
return data;
|
||||||
// };
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user