import "./postCreation.css"; import "./loginAndSignUpPage.css"; import { useState, useEffect, useRef } from 'react'; import { useNavigate } from "react-router-dom"; import Chip from '@mui/material/Chip'; import Autocomplete from '@mui/material/Autocomplete'; import TextField from '@mui/material/TextField'; import ButtonPrimary from "../components/buttons/buttonRotkehlchen/ButtonRotkehlchen"; import api from "../api/axios"; import { useAuth } from "../api/Auth"; import {Box,Card,CardMedia,CardActionArea,IconButton} from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; import { createTheme, ThemeProvider } from '@mui/material/styles'; const theme = createTheme({ palette: { primary: { main:'#e79a0e;' } } }); function PostCreation(){ const {user} = useAuth(); interface ImageItem { src: string; title: string; } 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(null); 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 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(files); }; 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) =>{ 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;