"use client"; import ToggleButton, { ToggleButtonClassNames } from "@/components/button/ToggleButton"; import TabContainer, { TabContainerClassNames, TabContainerRenderType } from "@/components/tab/TabContainer"; import { TabHeader } from "@/components/tab/TabHeader"; import { toast, toastLoginRequired } from "@/components/Toast"; import Comment from "@/components/utils/Comment"; import RateSelectionBar from "@/components/utils/RateSelectionBar"; import { Button } from "@/components/ui/button"; import { getToken } from "@/lib/api/func"; import { extractErrorMessage } from "@/lib/func"; import { glassSurfaceFlat } from "@/lib/styles/glassSurface"; import clsx from "clsx"; import { useParams, useRouter } from "next/navigation"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { useGetProfile } from "../../../(Profile)/profile/hooks/userProfileData"; import { NegativePointEnum, PositivePointEnum } from "../enum/ReviewPoints"; import { useCreateReview, useGetFoodReviews } from "../hooks/useFoodData"; import { CreateReviewType } from "../types/ReviewTypes"; import { isReviewApproved } from "../../about/types/Types"; type Props = { foodId: string; }; const positivePointsArray = [ PositivePointEnum.GREAT_TASTE, PositivePointEnum.FAST_DELIVERY, PositivePointEnum.GOOD_QUALITY, PositivePointEnum.GOOD_PORTION_SIZE, PositivePointEnum.FRIENDLY_SERVICE, ]; const negativePointsArray = [ NegativePointEnum.SMALL_PORTION, NegativePointEnum.SLOW_DELIVERY, NegativePointEnum.POOR_QUALITY, NegativePointEnum.OVERPRICED, NegativePointEnum.UNFRIENDLY_SERVICE, ]; function FoodReviewsSection({ foodId }: Props) { const { t } = useTranslation("rating"); const { name } = useParams(); const router = useRouter(); const { isSuccess } = useGetProfile(); const { data: reviewsData, isLoading: reviewsLoading } = useGetFoodReviews(foodId); const { mutate: createReview, isPending } = useCreateReview(foodId); const [rating, setRating] = useState(5); const [comment, setComment] = useState(""); const [positivePoints, setPositivePoints] = useState([]); const [negativePoints, setNegativePoints] = useState([]); const [formKey, setFormKey] = useState(0); const reviews = (reviewsData?.data || []).filter(isReviewApproved); const sortedReviews = [...reviews].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); const getTranslationKey = (point: string, isPositive: boolean): string => { const basePath = isPositive ? "Tabs.Strengths.Options" : "Tabs.Weeknesses.Options"; return `${basePath}.${point}`; }; const handleToggle = (pointValue: string, isPositive: boolean) => (checked: boolean) => { const setter = isPositive ? setPositivePoints : setNegativePoints; if (checked) { setter((prev) => [...prev, pointValue]); } else { setter((prev) => prev.filter((p) => p !== pointValue)); } }; const handleRatingChange = (value: number[]) => { setRating(value[0]); }; const resetForm = () => { setRating(5); setComment(""); setPositivePoints([]); setNegativePoints([]); setFormKey((prev) => prev + 1); }; const formatDate = (dateString: string) => { const date = new Date(dateString); return date.toLocaleDateString("fa-IR", { year: "numeric", month: "long", day: "numeric", }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const token = await getToken(); if (!token || !isSuccess) { toastLoginRequired(() => router.push(`/${name}/auth`), "error"); return; } if (rating === 0) { toast(t("Errors.RatingRequired") || "لطفا امتیاز خود را انتخاب کنید", "error"); return; } const reviewData: CreateReviewType = { foodId, rating, comment, positivePoints, negativePoints, }; createReview(reviewData, { onSuccess: () => { toast(t("Success") || "نظر شما با موفقیت ثبت شد", "success"); resetForm(); }, onError: (error) => { toast(extractErrorMessage(error, t("Errors.SubmitFailed") || "خطا در ثبت نظر"), "error"); }, }); }; const negativePointsView = (
{negativePointsArray.map((point) => ( {t(getTranslationKey(point, false))} ))}
); const positivePointsView = (
{positivePointsArray.map((point) => ( {t(getTranslationKey(point, true))} ))}
); return (

ثبت نظر