import { useEffect, useRef, useState } from "react"; import {MdAdd, MdClose, MdDelete, MdOutlineInfo, MdSearch} from "react-icons/md"; import { Tag } from "../network/models.ts"; import { network } from "../network/network.ts"; import { LuInfo } from "react-icons/lu"; import {useNavigate, useParams} from "react-router"; import showToast from "../components/toast.ts"; import { useTranslation } from "react-i18next"; import { app } from "../app.ts"; import { ErrorAlert } from "../components/alert.tsx"; import Loading from "../components/loading.tsx"; export default function EditResourcePage() { const [title, setTitle] = useState("") const [altTitles, setAltTitles] = useState([]) const [tags, setTags] = useState([]) const [article, setArticle] = useState("") const [images, setImages] = useState([]) const [isUploading, setUploading] = useState(false) const [error, setError] = useState(null) const [isSubmitting, setSubmitting] = useState(false) const [isLoading, setLoading] = useState(true) const navigate = useNavigate() const { t } = useTranslation(); useEffect(() => { document.title = t("Edit Resource"); }, [t]) const {rid} = useParams() const id = parseInt(rid || "") useEffect(() => { if (isNaN(id)) { return } network.getResourceDetails(id).then((res) => { if (res.success) { const data = res.data! setTitle(data.title) setAltTitles(data.alternativeTitles) setTags(data.tags) setArticle(data.article) setImages(data.images.map(i => i.id)) setLoading(false) } else { showToast({ message: t("Failed to load resource"), type: "error" }) } }) }, [id, t]); const handleSubmit = async () => { if (isSubmitting) { return } if (!title) { setError(t("Title cannot be empty")) return } for (let i = 0; i < altTitles.length; i++) { if (!altTitles[i]) { setError(t("Alternative title cannot be empty")) return } } if (!tags || tags.length === 0) { setError(t("At least one tag required")) return } if (!article) { setError(t("Description cannot be empty")) return } const res = await network.editResource(id, { title: title, alternative_titles: altTitles, tags: tags.map((tag) => tag.id), article: article, images: images, }) if (res.success) { setSubmitting(false) navigate("/resources/" + id.toString(), { replace: true }) } else { setSubmitting(false) setError(res.message) } } const addImage = () => { if (isUploading) { return } const input = document.createElement("input") input.type = "file" input.accept = "image/*" input.onchange = async () => { const files = input.files if (!files || files.length === 0) { return } const image = files[0] setUploading(true) const res = await network.uploadImage(image) if (res.success) { setUploading(false) setImages([...images, res.data!]) } else { setUploading(false) showToast({ message: t("Failed to upload image"), type: "error" }) } } input.click() } if (isNaN(id)) { return } if (!app.user) { return } if (isLoading) { return } return

{t("Edit Resource")}

{t("All information can be modified after publishing")}

{t("Title")}

setTitle(e.target.value)} />

{t("Alternative Titles")}

{ altTitles.map((title, index) => { return
{ const newAltTitles = [...altTitles] newAltTitles[index] = e.target.value setAltTitles(newAltTitles) }} />
}) }

{t("Tags")}

{ tags.map((tag, index) => { return {tag.name} { const newTags = [...tags] newTags.splice(index, 1) setTags(newTags) }}> }) }

{ setTags([...tags, tag]) }} />

{t("Description")}