From cac446007f1397f3e83ab4f89fd7064f35bd76f7 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 2 Mar 2025 12:09:18 +0330 Subject: [PATCH] review admin --- .env | 2 +- src/config/Pages.ts | 1 + src/langs/fa.json | 15 ++- src/pages/service/Reviews.tsx | 104 ++++++++++++++++++++ src/pages/service/hooks/useServiceData.ts | 14 +++ src/pages/service/service/ServiceService.ts | 15 +++ src/pages/service/types/ServiceTypes.ts | 19 ++++ src/router/Main.tsx | 2 + src/shared/components/ServicesSubMenu.tsx | 5 + 9 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 src/pages/service/Reviews.tsx diff --git a/.env b/.env index 973222e..85e6213 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ VITE_TOKEN_NAME = 'admin_token' VITE_REFRESH_TOKEN_NAME = 'admin_refresh_token' VITE_BASE_URL = 'https://api.danakcorp.com' -# VITE_BASE_URL = 'http://192.168.0.245:4000' \ No newline at end of file +# VITE_BASE_URL = 'http://192.168.1.124:4000' \ No newline at end of file diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 3cbafee..f65f7fa 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -13,6 +13,7 @@ export const Pages = { list: "/services/list", category: "/services/category", plan: "/services/plan/", + review: "/services/reviews", }, transactions: "/transactions", receipts: { diff --git a/src/langs/fa.json b/src/langs/fa.json index be9368b..789450a 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -83,7 +83,20 @@ "user_list": "لیست کاربران", "add_user": "افزودن کاربر", "role_list": "لیست نقش ها", - "role_create": "افزودن نقش" + "role_create": "افزودن نقش", + "reviews": "نظرات" + }, + "review": { + "title": "عنوان", + "comment": "نظر", + "user": "کاربر", + "service": "سرویس", + "date": "تاریخ", + "status": "وضعیت", + "approved": "تایید شده", + "rejected": "رد شده", + "approve": "تایید", + "reject": "رد" }, "header": { "search": "جستجو" diff --git a/src/pages/service/Reviews.tsx b/src/pages/service/Reviews.tsx new file mode 100644 index 0000000..54a352a --- /dev/null +++ b/src/pages/service/Reviews.tsx @@ -0,0 +1,104 @@ +import { FC, useState } from 'react' +import { useChangeStatusReview, useGetReviews } from './hooks/useServiceData' +import { useTranslation } from 'react-i18next' +import Td from '../../components/Td' +import { ReviewItemType } from './types/ServiceTypes' +import moment from 'moment-jalaali' +import Button from '../../components/Button' +import { CloseCircle, TickCircle } from 'iconsax-react' + +enum ReviewStatusEnum { + PENDING = 'PENDING', + APPROVED = 'APPROVED', + REJECTED = 'REJECTED' +} + +const Reviews: FC = () => { + + const { t } = useTranslation('global') + const [loadingType, setLoadingType] = useState(ReviewStatusEnum.PENDING) + const [loadingId, setLoadingId] = useState('') + const getReviews = useGetReviews() + const changeStatusReview = useChangeStatusReview() + + const handleChange = (status: ReviewStatusEnum, id: string) => { + setLoadingType(status) + setLoadingId(id) + changeStatusReview.mutate({ status, id }, { + onSuccess: () => { + getReviews.refetch() + } + }) + } + + return ( +
+
+ + + + + + + { + getReviews.data?.data?.reviews?.map((item: ReviewItemType) => ( + + + + + )) + } + +
+ + + + + +
+ + + + +
+ {moment(item.createdAt).format('jYYYY-jMM-jDD HH:mm')} +
+
+ { + item.status === 'PENDING' ? +
+ + +
+ : + t('review.' + item.status.toLowerCase()) + } +
+
+
+ ) +} + +export default Reviews \ No newline at end of file diff --git a/src/pages/service/hooks/useServiceData.ts b/src/pages/service/hooks/useServiceData.ts index 466f31b..4ecf41e 100644 --- a/src/pages/service/hooks/useServiceData.ts +++ b/src/pages/service/hooks/useServiceData.ts @@ -132,3 +132,17 @@ export const useUpdatePlan = (id: string) => { mutationFn: (variables: UpdatePlanType) => api.updatePlan(id, variables), }); }; + +export const useGetReviews = (page: number = 1) => { + return useQuery({ + queryKey: ["reviews", page], + queryFn: () => api.getReviews(page), + }); +}; + +export const useChangeStatusReview = () => { + return useMutation({ + mutationFn: (variables: { status: string; id: string }) => + api.changeStatusReview(variables), + }); +}; diff --git a/src/pages/service/service/ServiceService.ts b/src/pages/service/service/ServiceService.ts index 234e63a..e7fd359 100644 --- a/src/pages/service/service/ServiceService.ts +++ b/src/pages/service/service/ServiceService.ts @@ -115,3 +115,18 @@ export const updatePlan = async (id: string, params: UpdatePlanType) => { const { data } = await axios.patch(`/subscriptions/${id}`, params); return data; }; + +export const getReviews = async (page: number) => { + const { data } = await axios.get(`/danak-services/reviews?page=${page}`); + return data; +}; + +export const changeStatusReview = async (params: { + status: string; + id: string; +}) => { + const { data } = await axios.patch( + `/danak-services/reviews/${params.id}/${params.status}` + ); + return data; +}; diff --git a/src/pages/service/types/ServiceTypes.ts b/src/pages/service/types/ServiceTypes.ts index cfa06ba..d0fe1d1 100644 --- a/src/pages/service/types/ServiceTypes.ts +++ b/src/pages/service/types/ServiceTypes.ts @@ -82,3 +82,22 @@ export type UpdatePlanType = { isActive?: boolean; serviceId?: string; }; + +export type ReviewItemType = { + id: string; + comment: string; + createdAt: string; + rating: number; + service: { + id: string; + name: string; + }; + status: "APPROVED" | "PENDING" | "REJECTED"; + title: string; + user: { + id: string; + firstName: string; + lastName: string; + profilePic: string; + }; +}; diff --git a/src/router/Main.tsx b/src/router/Main.tsx index 7626e77..580ad54 100644 --- a/src/router/Main.tsx +++ b/src/router/Main.tsx @@ -54,6 +54,7 @@ import CreateLearning from '../pages/learning/Create' import Plans from '../pages/service/Plans' import GroupCreate from '../pages/users/GroupCreate' import GroupList from '../pages/users/GroupList' +import Reviews from '../pages/service/Reviews' const MainRouter: FC = () => { @@ -80,6 +81,7 @@ const MainRouter: FC = () => { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/shared/components/ServicesSubMenu.tsx b/src/shared/components/ServicesSubMenu.tsx index 47b9ae0..299717a 100644 --- a/src/shared/components/ServicesSubMenu.tsx +++ b/src/shared/components/ServicesSubMenu.tsx @@ -44,6 +44,11 @@ const ServicesSubMenu: FC = () => { isActive={isActive('category')} link={Pages.services.category} /> + )