import { useEffect, useMemo, useState, type ReactNode } from "react"; import { Link, useNavigate, useParams } from "react-router-dom"; import { getJSON, getJSONAuth, postJSON, putJSON, uploadFile, type Category, } from "../../api"; import { getToken } from "../../admin/token"; import { useAdminT } from "../../admin/useAdminT"; import { resourceTypeDisplay } from "../../resourceTypeLabels"; import { adminUiPrefix } from "../../adminPaths"; import { useAdminRouterMode } from "../../adminRouterMode"; const types = [ "image", "video", "music", "ppt", "pdf", "text", "link", "archive", ] as const; export function AdminResourceForm() { const { id } = useParams(); const isNew = !id || id === "new"; const t = useAdminT(); const mode = useAdminRouterMode(); const token = getToken(); const nav = useNavigate(); const [cats, setCats] = useState([]); const [title, setTitle] = useState(""); const [description, setDescription] = useState(""); const [rtype, setRtype] = useState("image"); const [language, setLanguage] = useState("zh"); const [categoryId, setCategoryId] = useState(1); const [coverImage, setCoverImage] = useState(""); const [fileUrl, setFileUrl] = useState(""); const [previewUrl, setPreviewUrl] = useState(""); const [externalUrl, setExternalUrl] = useState(""); const [bodyText, setBodyText] = useState(""); const [badgeLabel, setBadgeLabel] = useState(""); const [isPublic, setIsPublic] = useState(true); const [isDownloadable, setIsDownloadable] = useState(true); const [isRecommended, setIsRecommended] = useState(false); const [sortOrder, setSortOrder] = useState(0); const [status, setStatus] = useState("published"); const [tags, setTags] = useState(""); const [err, setErr] = useState(null); useEffect(() => { getJSON("/api/categories?lang=zh") .then(setCats) .catch(() => setCats([])); }, []); useEffect(() => { if (isNew || !id) return; getJSONAuth(`/api/admin/resources/${id}`, token) .then((r) => { setTitle(r.title || ""); setDescription(r.description || ""); setRtype(r.type || "image"); setLanguage(r.language || "zh"); setCategoryId(r.categoryId || 1); setCoverImage(r.coverImage || ""); setFileUrl(r.fileUrl || ""); setPreviewUrl(r.previewUrl || ""); setExternalUrl(r.externalUrl || ""); setBodyText(r.bodyText || ""); setBadgeLabel(r.badgeLabel || ""); setIsPublic(!!r.isPublic); setIsDownloadable(!!r.isDownloadable); setIsRecommended(!!r.isRecommended); setSortOrder(r.sortOrder || 0); setStatus(r.status || "draft"); setTags((r.tags || []).join(", ")); }) .catch((e) => setErr(String(e))); }, [id, isNew, token]); const payload = useMemo( () => ({ title, description, type: rtype, language, categoryId, coverImage, fileUrl, previewUrl, externalUrl, bodyText, badgeLabel, isPublic, isDownloadable, isRecommended, sortOrder, status, tags: tags .split(",") .map((x) => x.trim()) .filter(Boolean), }), [ title, description, rtype, language, categoryId, coverImage, fileUrl, previewUrl, externalUrl, bodyText, badgeLabel, isPublic, isDownloadable, isRecommended, sortOrder, status, tags, ], ); return (

{isNew ? t("newResource") : t("adminEditResource")}

← {t("backToList")}
{err ?
{err}
: null}
setTitle(e.target.value)} /> setSortOrder(Number(e.target.value))} />