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 { toast } from 'sonner'; import { CKEditor } from '@ckeditor/ckeditor5-react'; import ClassicEditor from '@ckeditor/ckeditor5-build-classic'; import { api } from '../lib/api'; import type { ApiResponse } from '../lib/api'; import type { Blog } from '../types'; import { blogFormSchema, blogDefaults, buildBlogPayload } from '../lib/blogForm'; import type { BlogFormData } from '../lib/blogForm'; import PageHeader from '../components/ui/PageHeader'; import SearchableSelect from '../components/ui/SearchableSelect'; import BlogSeoFields from '../components/BlogSeoFields'; interface RepMe { cities: { id: number; name: string }[] } export default function RepresentationBlogFormPage() { const { uuid } = useParams<{ uuid: string }>(); const navigate = useNavigate(); const qc = useQueryClient(); const isEdit = !!uuid; const meQuery = useQuery({ queryKey: ['rep-me-cities'], queryFn: () => api.get>('/api/v1/representation/me'), staleTime: 5 * 60_000, }); const cityOptions = (meQuery.data?.data?.cities ?? []).map((c) => ({ value: c.id, label: c.name })); const { data, isLoading } = useQuery({ queryKey: ['rep-blog', uuid], queryFn: () => api.get>(`/api/v1/representation/blog/${uuid}`), enabled: isEdit, }); const blog = data?.data?.data; const { register, handleSubmit, control, formState: { errors, isSubmitting } } = useForm({ resolver: zodResolver(blogFormSchema), defaultValues: blogDefaults(), values: blog ? (blogDefaults(blog) as BlogFormData) : undefined, }); const createMutation = useMutation({ mutationFn: (d: BlogFormData) => api.post>('/api/v1/representation/blog', buildBlogPayload(d)), onSuccess: () => { toast.success('مقاله ذخیره شد'); qc.invalidateQueries({ queryKey: ['rep-blogs'] }); navigate('/admin/representation-blogs'); }, onError: (err: Error) => toast.error(err.message), }); const updateMutation = useMutation({ mutationFn: (d: BlogFormData) => api.patch>(`/api/v1/representation/blog/${uuid}`, buildBlogPayload(d)), onSuccess: () => { toast.success('مقاله بروزرسانی شد'); qc.invalidateQueries({ queryKey: ['rep-blogs'] }); qc.invalidateQueries({ queryKey: ['rep-blog', uuid] }); navigate('/admin/representation-blogs'); }, onError: (err: Error) => toast.error(err.message), }); const onSubmit = (d: BlogFormData) => { if (!d.city_id) { toast.error('انتخاب شهر الزامی است'); return; } 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}

}