"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { FeaturedImageField, GalleryImagesField, TagsField, type LocalImage, } from "@/components/catalog/CatalogFormFields"; import CatalogCategorySelect from "@/components/catalog/CatalogCategorySelect"; import RichTextArea from "@/components/RichTextArea"; import { createMeshkeeProduct, listMeshkeeEntityCategories, uploadMeshkeeMediaFile, type MeshkeeEntityCategory, } from "@/services/meshkee-catalog"; import styles from "./CatalogForm.module.css"; export default function AddProductForm({ meshkeeId, listHref, title, lead, }: { meshkeeId: string; listHref: string; title: string; lead: string; }) { const router = useRouter(); const [categories, setCategories] = useState([]); const [categoryId, setCategoryId] = useState(""); const [nameFa, setNameFa] = useState(""); const [nameEn, setNameEn] = useState(""); const [summary, setSummary] = useState(""); const [description, setDescription] = useState(""); const [thumbnail, setThumbnail] = useState(null); const [gallery, setGallery] = useState([]); 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, "product"); 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 (!nameEn.trim() && !nameFa.trim()) { setError("Enter a product name."); return; } if (!categoryId) { setError("Select a category."); return; } setSaving(true); setError(""); try { let featuredMediaId: string | undefined; if (thumbnail?.file) { featuredMediaId = ( await uploadMeshkeeMediaFile(meshkeeId, thumbnail.file) ).id; } else if (thumbnail?.mediaId) { featuredMediaId = thumbnail.mediaId; } const galleryMediaIds: string[] = []; for (const item of gallery) { if (item.mediaId) { galleryMediaIds.push(item.mediaId); continue; } if (item.file) { galleryMediaIds.push( (await uploadMeshkeeMediaFile(meshkeeId, item.file)).id, ); } } await createMeshkeeProduct(meshkeeId, { title: nameEn.trim() || nameFa.trim(), nameFa: nameFa.trim() || undefined, summary: summary.trim() || undefined, descriptionHtml: description || undefined, categoryId, featuredMediaId, galleryMediaIds, 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 product."); } finally { setSaving(false); } } return (

{title}

{lead}

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

Media

Identity

Content