"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 { createMeshkeePortfolio, listMeshkeeEntityCategories, uploadMeshkeeMediaFile, type MeshkeeEntityCategory, } from "@/services/meshkee-catalog"; import styles from "./CatalogForm.module.css"; export default function AddPortfolioForm({ meshkeeId, listHref, title, lead, }: { meshkeeId: string; listHref: string; title: string; lead: string; }) { const router = useRouter(); const [categories, setCategories] = useState([]); const [categoryId, setCategoryId] = useState(""); const [titleFa, setTitleFa] = useState(""); const [titleEn, setTitleEn] = useState(""); const [abstract, setAbstract] = useState(""); const [projectUrl, setProjectUrl] = useState(""); const [mainTextHtml, setMainTextHtml] = useState(""); const [titleImage, setTitleImage] = 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, "portfolio"); 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 (!titleFa.trim()) { setError("Enter a Persian title."); return; } setSaving(true); setError(""); try { let featuredMediaId: string | undefined; if (titleImage?.file) { featuredMediaId = ( await uploadMeshkeeMediaFile(meshkeeId, titleImage.file) ).id; } 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 createMeshkeePortfolio(meshkeeId, { titleFa: titleFa.trim(), titleEn: titleEn.trim() || undefined, abstract: abstract.trim() || undefined, projectUrl: projectUrl.trim() || undefined, mainTextHtml: mainTextHtml || undefined, categoryId: categoryId || undefined, 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 portfolio.", ); } finally { setSaving(false); } } return (

{title}

{lead}

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

Media

Identity

Content