"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import CategoryTreeSelect from "@/components/CategoryTreeSelect"; import { FeaturedImageField, TagsField, type LocalImage, } from "@/components/catalog/CatalogFormFields"; import RichTextArea from "@/components/RichTextArea"; import type { MeshkeeCategory } from "@/services/meshkee-categories"; import { uploadWebsiteMedia } from "@/services/website-media"; import { createWebsiteBlogPost, listWebsiteBlogCategories, type WebsiteBlogCategory, } from "@/services/website-blog"; import styles from "@/components/catalog/CatalogForm.module.css"; import local from "./WebsiteBlogForm.module.css"; export default function WebsiteBlogForm() { const router = useRouter(); const [categories, setCategories] = useState([]); const [categoryId, setCategoryId] = useState(""); const [title, setTitle] = useState(""); const [abstract, setAbstract] = useState(""); const [mainTextHtml, setMainTextHtml] = useState(""); const [image, setImage] = useState(null); const [tags, setTags] = useState([]); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); useEffect(() => { let cancelled = false; void (async () => { try { const items = await listWebsiteBlogCategories(); if (!cancelled) setCategories(items); } catch (err) { if (!cancelled) { setError( err instanceof Error ? err.message : "Could not load categories.", ); } } })(); return () => { cancelled = true; }; }, []); async function onSubmit(event?: React.FormEvent) { event?.preventDefault(); if (!title.trim()) { setError("Enter a title."); return; } setSaving(true); setError(""); try { if (!categoryId) { setError("Choose a category."); setSaving(false); return; } let imageUrl: string | undefined; if (image?.file) { imageUrl = await uploadWebsiteMedia(image.file); } await createWebsiteBlogPost({ title: title.trim(), categoryId, abstract: abstract.trim() || undefined, mainTextHtml: mainTextHtml || undefined, imageUrl, tags, }); router.push("/website/blog"); router.refresh(); } catch (err) { setError(err instanceof Error ? err.message : "Could not create post."); } finally { setSaving(false); } } const busy = saving; const treeCategories: MeshkeeCategory[] = categories.map((item) => ({ id: item.id, parentId: item.parentId, name: item.name, nameFa: null, slug: "", description: null, icon: null, sortOrder: 0, tags: [], })); return (

Add blog post

Publish a story on the IranBay website.

Back
{error ? (
{error}
) : null}

Post

setCategoryId(ids[0] ?? "")} />