"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 ? (
در حال بارگذاری...
) : (
)}
setMetaOpen(false)}
onSubmit={saveMeta}
submitLabel="ذخیره متا"
>
setMetaTitle(e.target.value)}
placeholder="SEO title"
/>
setMetaKeywords(e.target.value)}
placeholder="keyword, keyword"
/>
>
);
}
export default function NewBlogPostPage() {
return (
در حال بارگذاری...
}
>
);
}