import { useState, useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { Box, Button, CircularProgress, TextField, Typography, FormControl, InputLabel, Select, MenuItem, Checkbox, FormControlLabel, } from "@mui/material"; import { useGetPublicationsById } from "../../hooks/publications/useGetPublicationById"; import { useCreatePublication } from "../../hooks/publications/useCreatePublication"; import { useUpdatePublication } from "../../hooks/publications/useUpdatePublication"; import type { PublicationPayload, UpdatePublicationPayload, } from "../../api/publications"; import { useCategories } from "../../hooks/categories/useCategories"; import { toast } from "react-toastify"; const PublicationForm = () => { const { id } = useParams<{ id: string }>(); const isUpdate = Boolean(id); const navigate = useNavigate(); const [file, setFile] = useState(null); const [contentType, setContentType] = useState<"image" | "video">("image"); const [status, setStatus] = useState<"public" | "pending">("public"); const [description, setDescription] = useState(""); const [isPinned, setIsPinned] = useState(false); const [category, setCategory] = useState(0); const { data: publication, isLoading } = useGetPublicationsById( id ? Number(id) : undefined ); const { data: categories } = useCategories(); const createMutation = useCreatePublication(); const updateMutation = useUpdatePublication(); const previewUrl = file ? URL.createObjectURL(file) : null; useEffect(() => { return () => { if (previewUrl) URL.revokeObjectURL(previewUrl); }; }, [previewUrl]); useEffect(() => { if (publication) { setContentType(publication.content_type); setStatus(publication.status); setDescription(publication.description); setIsPinned(publication.is_pinned); setCategory(publication.category); } }, [publication]); if (isUpdate && isLoading) return ; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (isUpdate && id) { const payload: UpdatePublicationPayload = { content_type: contentType, status, description, is_pinned: isPinned, category, file: file ?? undefined, }; updateMutation.mutate( { id: Number(id), payload }, { onSuccess: () => navigate("/publications") } ); } else { if (!file) { toast.error("File is required"); return; } const payload: PublicationPayload = { file, content_type: contentType, status, description, is_pinned: isPinned, category, }; createMutation.mutate(payload, { onSuccess: () => navigate("/publications"), }); } }; return ( {isUpdate ? "Update Publication" : "Create Publication"}
Content Type {file && (contentType === "image" ? ( ) : ( ))} {!file && isUpdate && publication && (contentType === publication.content_type ? ( publication.content_type === "image" && publication.image ? ( ) : publication.video ? ( ) : null ) : ( Current publication is a {publication.content_type}.
Select a new {contentType} file to replace it.
))}
setDescription(e.target.value)} fullWidth required sx={{ mb: 3 }} /> Status setIsPinned(e.target.checked)} /> } label="Pinned" sx={{ mb: 3 }} /> setCategory(Number(e.target.value))} fullWidth required sx={{ mb: 3 }} > {categories?.map((cat) => ( {cat.name} ))}
); }; export default PublicationForm;