"use client"; import Link from "next/link"; import { useRouter, useSearchParams } from "next/navigation"; import { ChangeEvent, FormEvent, Suspense, useEffect, useRef, useState, } from "react"; import ClothesShell from "@/components/clothes/ClothesShell"; import CategoryTreeSelect from "@/components/ui/CategoryTreeSelect"; import ImageCropper from "@/components/ui/ImageCropper"; import { FormModal } from "@/components/ui/Modal"; import RichTextArea from "@/components/ui/RichTextArea"; import { CategoryNode } from "@/data/clothes"; import { ApiError, uploadMedia } from "@/lib/api"; import { createBlog, fetchBlog, fetchBlogCategoriesTree, updateBlog, } from "@/lib/blog-api"; const DEFAULT_IMAGE = "/images/ahmad-ebadi-r5IzkiO08JU-unsplash.jpg"; function NewBlogPostForm() { const router = useRouter(); const searchParams = useSearchParams(); const editId = searchParams.get("edit"); const fileRef = useRef(null); const [title, setTitle] = useState(""); const [categoryId, setCategoryId] = useState(""); const [categoryTree, setCategoryTree] = useState([]); const [abstract, setAbstract] = useState(""); const [body, setBody] = useState(""); const [imagePreview, setImagePreview] = useState(DEFAULT_IMAGE); const [imageFile, setImageFile] = useState(null); const [tags, setTags] = useState([]); const [tagInput, setTagInput] = useState(""); const [metaOpen, setMetaOpen] = useState(false); const [metaTitle, setMetaTitle] = useState(""); const [metaDescription, setMetaDescription] = useState(""); const [metaKeywords, setMetaKeywords] = useState(""); const [saving, setSaving] = useState(false); const [loading, setLoading] = useState(Boolean(editId)); const [error, setError] = useState(null); const hasMeta = Boolean( metaTitle.trim() || metaDescription.trim() || metaKeywords.trim(), ); useEffect(() => { let cancelled = false; (async () => { try { const cats = await fetchBlogCategoriesTree(); if (!cancelled) setCategoryTree(cats); } catch { /* optional */ } })(); return () => { cancelled = true; }; }, []); useEffect(() => { if (!editId) return; let cancelled = false; (async () => { setLoading(true); setError(null); try { const post = await fetchBlog(editId); if (cancelled) return; setTitle(post.title); setCategoryId(post.categoryId || ""); setAbstract(post.abstract); setBody(post.body); setImagePreview(post.image); setTags(post.tags); setMetaTitle(post.metaTitle); setMetaDescription(post.metaDescription); setMetaKeywords(post.metaKeywords); } catch (err) { if (!cancelled) { setError( err instanceof ApiError ? err.message : "بارگذاری مطلب ناموفق بود.", ); } } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [editId]); function handleImageChange(event: ChangeEvent) { const file = event.target.files?.[0]; if (!file) return; setImageFile(file); setImagePreview(URL.createObjectURL(file)); } function addTag() { const next = tagInput.trim(); if (!next || tags.includes(next)) return; setTags((prev) => [...prev, next]); setTagInput(""); } async function handleSubmit(event: FormEvent) { event.preventDefault(); if (!title.trim()) { setError("عنوان الزامی است."); return; } setSaving(true); setError(null); try { let imageUrl: string | undefined; let imageKey: string | undefined; if (imageFile) { const uploaded = await uploadMedia(imageFile, "blog"); imageUrl = uploaded.url; imageKey = uploaded.storageKey; } const payload = { title: title.trim(), summary: abstract.trim() || undefined, body: body || undefined, metaTitle: metaTitle.trim() || undefined, metaDescription: metaDescription.trim() || undefined, published: true, ...(categoryId ? { categoryId } : editId ? { categoryId: null } : {}), ...(imageUrl ? { imageUrl, imageKey } : {}), }; if (editId) { await updateBlog(editId, payload); } else { await createBlog(payload); } router.push("/blog"); router.refresh(); } catch (err) { setError( err instanceof ApiError ? err.message : "ثبت مطلب ناموفق بود.", ); } finally { setSaving(false); } } function saveMeta(event: FormEvent) { event.preventDefault(); setMetaOpen(false); } return ( <> {loading ? (

در حال بارگذاری...

) : (
{error ? (

{error}

) : null}
setTitle(e.target.value)} placeholder="عنوان مطلب" required />