"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { FeaturedImageField, TagsField, type LocalImage, } from "@/components/catalog/CatalogFormFields"; import CatalogCategorySelect from "@/components/catalog/CatalogCategorySelect"; import RichTextArea from "@/components/RichTextArea"; import { createMeshkeeBlog, listMeshkeeEntityCategories, uploadMeshkeeMediaFile, type MeshkeeEntityCategory, } from "@/services/meshkee-catalog"; import styles from "./CatalogForm.module.css"; const BLOG_TYPES = [ { value: "blog", label: "Blog" }, { value: "article", label: "Article" }, { value: "news", label: "News" }, ] as const; export default function AddBlogForm({ meshkeeId, listHref, title, lead, }: { meshkeeId: string; listHref: string; title: string; lead: string; }) { const router = useRouter(); const [categories, setCategories] = useState([]); const [categoryId, setCategoryId] = useState(""); const [type, setType] = useState<"blog" | "article" | "news">("blog"); const [postTitle, setPostTitle] = useState(""); const [abstract, setAbstract] = useState(""); const [mainTextHtml, setMainTextHtml] = useState(""); const [titleImage, setTitleImage] = useState(null); const [tags, setTags] = useState([]); const [seoMetaTitle, setSeoMetaTitle] = useState(""); const [seoMetaDescription, setSeoMetaDescription] = useState(""); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); useEffect(() => { let cancelled = false; void (async () => { try { const items = await listMeshkeeEntityCategories(meshkeeId, "blog"); if (!cancelled) setCategories(items); } catch (err) { if (!cancelled) { setError( err instanceof Error ? err.message : "Could not load categories.", ); } } })(); return () => { cancelled = true; }; }, [meshkeeId]); async function onSubmit(event?: React.FormEvent) { event?.preventDefault(); if (!postTitle.trim()) { setError("Enter a title."); return; } setSaving(true); setError(""); try { let featuredMediaId: string | undefined; if (titleImage?.file) { featuredMediaId = ( await uploadMeshkeeMediaFile(meshkeeId, titleImage.file) ).id; } await createMeshkeeBlog(meshkeeId, { title: postTitle.trim(), type, abstract: abstract.trim() || undefined, mainTextHtml: mainTextHtml || undefined, categoryId: categoryId || undefined, featuredMediaId, tags, seoMetaTitle: seoMetaTitle.trim() || null, seoMetaDescription: seoMetaDescription.trim() || null, }); router.push(listHref); router.refresh(); } catch (err) { setError(err instanceof Error ? err.message : "Could not create blog post."); } finally { setSaving(false); } } return (

{title}

{lead}

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

Media

Identity

Content