import React from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useForm, Controller } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { toast } from 'sonner'; import { api } from '../lib/api'; import type { ApiResponse } from '../lib/api'; import type { Blog } from '../types'; import PageHeader from '../components/ui/PageHeader'; import SearchableSelect from '../components/ui/SearchableSelect'; const schema = z.object({ title: z.string().min(3, 'عنوان الزامی است'), summary: z.string().optional(), content: z.string().min(10, 'محتوا الزامی است'), tags: z.string().optional(), status: z.enum(['draft', 'published']), }); type FormData = z.infer; export default function BlogFormPage() { const { uuid } = useParams<{ uuid: string }>(); const navigate = useNavigate(); const qc = useQueryClient(); const isEdit = !!uuid; const { data, isLoading } = useQuery({ queryKey: ['blog', uuid], queryFn: () => api.get>(`/api/v1/blog/${uuid}`), enabled: isEdit, }); const blog = data?.data; const { register, handleSubmit, control, reset, formState: { errors, isSubmitting } } = useForm({ resolver: zodResolver(schema), defaultValues: { status: 'draft' }, values: blog ? { title: blog.title, summary: blog.summary ?? '', content: blog.content, tags: blog.tags?.join(', ') ?? '', status: blog.status, } : undefined, }); const createMutation = useMutation({ mutationFn: (d: FormData) => api.post>('/api/v1/blog', { ...d, tags: d.tags ? d.tags.split(',').map((t) => t.trim()).filter(Boolean) : [], }), onSuccess: () => { toast.success('مقاله ذخیره شد'); qc.invalidateQueries({ queryKey: ['blogs'] }); navigate('/admin/blogs'); }, onError: (err: Error) => toast.error(err.message), }); const updateMutation = useMutation({ mutationFn: (d: FormData) => api.patch>(`/api/v1/blog/${uuid}`, { ...d, tags: d.tags ? d.tags.split(',').map((t) => t.trim()).filter(Boolean) : [], }), onSuccess: () => { toast.success('مقاله بروزرسانی شد'); qc.invalidateQueries({ queryKey: ['blogs'] }); qc.invalidateQueries({ queryKey: ['blog', uuid] }); navigate('/admin/blogs'); }, onError: (err: Error) => toast.error(err.message), }); const onSubmit = (d: FormData) => { if (isEdit) updateMutation.mutate(d); else createMutation.mutate(d); }; if (isEdit && isLoading) { return (
{Array.from({ length: 5 }).map((_, i) => (
))}
); } return (
{errors.title &&

{errors.title.message}

}