import { useState, useEffect, useRef } from "react"; import { useNavigate } from "react-router-dom"; import { Box, Card, CardMedia, CardActionArea, IconButton, Typography, } from "@mui/material"; import Chip from "@mui/material/Chip"; import Autocomplete from "@mui/material/Autocomplete"; import TextField from "@mui/material/TextField"; import CloseIcon from "@mui/icons-material/Close"; import { createTheme, ThemeProvider } from "@mui/material/styles"; import api from "../../api/axios"; import { useAuth } from "../../api/Auth"; import ButtonPrimary from "../../components/buttons/buttonRotkehlchen/ButtonRotkehlchen"; import "./postCreation.css"; const theme = createTheme({ palette: { primary: { main: "#e79a0e;", }, }, }); function PostCreation() { const { user } = useAuth(); interface ImageItem { src: string; title: string; } const [isSend, setIsSend] = useState(false); const [options, setOptions] = useState([]); const [tags, setTags] = useState([]); const [description, setDescription] = useState(""); const [selectedImage, setSelectedImage] = useState(); const [data, setData] = useState([]); const navigate = useNavigate(); const [fileList, setFileList] = useState([]); const inputFile = useRef(null); useEffect(() => { let cancelled = false; (async () => { try { const res = await api.get("/posts/tags"); // GET /api/posts/tags if (!cancelled) setOptions(res.data); } catch (err) { console.log(err); } })(); return () => { cancelled = true; }; }, []); const handleChange = (event: React.ChangeEvent) => { setDescription(event.target.value); }; const handleTags = (event: any, newValue: string[]) => { newValue.forEach((val) => { if (!options.includes(val)) { setOptions((prev) => [...prev, val]); } }); setTags(newValue); }; const handleImageUpload = (event: React.ChangeEvent) => { const files = event.target.files; if (files && files.length > 0) { const fileArr = Array.from(files); const newItems: ImageItem[] = Array.from(files).map((file) => ({ src: URL.createObjectURL(file), title: file.name, })); const lastImageUrl = newItems[newItems.length - 1].src; setData((prev) => [...prev, ...newItems]); setSelectedImage(lastImageUrl); setFileList((prev) => [...prev, ...fileArr]); } }; const onEmptyImgClick = () => { if (inputFile.current) { inputFile.current?.click(); } }; const handleDelete = (idx: number) => { setData((prev) => prev.filter((_, i) => i !== idx)); if (idx - 1 < 0) { if (data.length == 1) { setSelectedImage(""); } else { setSelectedImage(data[idx + 1].src); } } else { setSelectedImage(data[idx - 1].src); } }; const onSubmit = async (event: React.FormEvent) => { if (!isSend) { setIsSend(true); event.preventDefault(); if (!fileList) { return; } const fData = new FormData(); files.forEach((file, i) => { fData.append(`images`, file, file.name); }); fData.append("status", "PUBLIC"); fData.append("description", description); tags.forEach((tag) => { fData.append("tags", tag); }); try { await api.post("/posts/upload", fData); navigate(`/profile/${user?.username}`); } catch (error: any) { console.log(error); } } }; const onCancel = () => { navigate(`/profile/${user?.username}`); }; const files = fileList ? [...fileList] : []; return (

Create Post

{selectedImage ? ( Add an Image ) : ( )}

Description*

*": { scrollSnapAlign: "center" }, "::-webkit-scrollbar": { display: "none" }, }} > {/* Upload card */} {/* Image cards */} {data.map((item, idx) => ( setSelectedImage(item.src)} > {/* Delete button */} { e.stopPropagation(); handleDelete(idx); }} sx={{ position: "absolute", top: 2, right: 2, backgroundColor: "background.paper", zIndex: 1, }} > ))} value.map((tags: string, index: number) => { const { key, ...itemProps } = getItemProps({ index }); return ( ); }) } renderInput={(params) => ( )} />
); } export default PostCreation;