"use client"; import { useMemo, useState } from "react"; import { useTranslations } from "next-intl"; import { MediaPicker } from "./media-picker"; import { RichText } from "./rich-text"; import { slugify } from "@/lib/format"; export function ArticleForm({ action, defaultValues, }: { action: (formData: FormData) => Promise; edit?: boolean; defaultValues?: { title?: string; slug?: string; image?: string; shortStory?: string; fullStory?: string; }; }) { const t = useTranslations("pages.admin.articles.form"); const [title, setTitle] = useState(defaultValues?.title ?? ""); const [slug, setSlug] = useState(defaultValues?.slug ?? ""); const [slugTouched, setSlugTouched] = useState(Boolean(defaultValues?.slug)); const [image, setImage] = useState(defaultValues?.image ?? ""); const [imageError, setImageError] = useState(false); const suggestedSlug = useMemo(() => slugify(title), [title]); return (
{t("image")}
{ setImage(e.target.value); setImageError(false); }} placeholder={t("imagePlaceholder")} className="input input-bordered flex-1" /> { setImage(url); setImageError(false); }} current={image} />
{image && !imageError ? ( // eslint-disable-next-line @next/next/no-img-element preview setImageError(true)} className="mt-2 rounded-lg border border-[var(--admin-text-muted)]/14 object-cover" style={{ maxHeight: 160 }} /> ) : null} {imageError ? (

Image not found — enter a valid URL or browse.

) : null}