import { useForm, useFieldArray } from 'react-hook-form' import { z } from 'zod' import { zodResolver } from '@hookform/resolvers/zod' import { AlertTriangle } from 'lucide-react' import { toast } from 'sonner' import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form' import { Table, TableBody, TableCell, TableRow } from '@/components/ui/table' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { Button } from '@/components/ui/button' import VideoPlayer from '@/components/video-player' import { useEvaluations } from './evaluations-provider' import { useEvaluation } from '@/hooks/evaluations/useEvaluation' import { useUpdateEvaluationDetails } from '@/hooks/evaluations/useUpdateEvaluationDetails' import { type Evaluation } from '@/types/evaluations.types' const schema = z.object({ pros_comment: z.string(), cons_comment: z.string(), suggestion: z.string(), summary: z.string(), score: z.number({ error: 'نمره ارزیابی الزامی است' }), items: z.array( z.object({ item_id: z.number(), name: z.string(), score: z.number({ error: 'نمره آیتم الزامی است' }), }) ), }) type FormValues = z.infer function getDefaultValues(evaluation: Evaluation): FormValues { return { pros_comment: evaluation.pros_comment ?? '', cons_comment: evaluation.cons_comment ?? '', suggestion: evaluation.suggestion ?? '', summary: evaluation.summary ?? '', score: evaluation.score ? Number(evaluation.score) : 0, items: evaluation.items.map((item) => ({ item_id: item.item.id, name: item.item.name, score: item.score, })), } } export function EvaluationsEditDialog() { const { open, setOpen, currentRow } = useEvaluations() const opened = open === 'edit' const { data: evaluation, isLoading } = useEvaluation( opened ? (currentRow?.id as number) : '' ) const mediaSrc = evaluation?.media?.[0]?.url const handleClose = () => setOpen(null) return ( ویرایش ارزیابی {isLoading || !evaluation ? (
در حال دریافت اطلاعات...
) : (
{mediaSrc && } {evaluation.items.length === 0 ? (
ارزیابی برای این کاربر یافت نشد.
) : ( )}
)}
) } type EvaluationEditFormProps = { evaluation: Evaluation onClose: () => void } function EvaluationEditForm({ evaluation, onClose }: EvaluationEditFormProps) { const { mutate, isPending } = useUpdateEvaluationDetails() const form = useForm({ resolver: zodResolver(schema), defaultValues: getDefaultValues(evaluation), }) const { fields } = useFieldArray({ control: form.control, name: 'items', }) const onSubmit = (values: FormValues) => { mutate( { id: evaluation.id, payload: { pros_comment: values.pros_comment, cons_comment: values.cons_comment, suggestion: values.suggestion, summary: values.summary, score: values.score, items: values.items.map((item) => ({ item_id: item.item_id, score: item.score, })), }, }, { onSuccess: () => { toast.success('ویرایش ارزیابی با موفقیت انجام شد.') onClose() }, onError: () => { toast.error('خطا در ویرایش ارزیابی!') }, } ) } return (

نتیجه ارزیابی

{fields.map((fieldItem, index) => ( {fieldItem.name} (
100 / { const value = e.target.value field.onChange( value === '' ? 0 : Number(value) ) }} />
)} />
))} مجموع عملکرد (
100 / { const value = e.target.value field.onChange( value === '' ? 0 : Number(value) ) }} />
)} />
( نقاط قوت: