import React from 'react'; import ReactMarkdown from 'react-markdown'; import { MapSummary } from '../types/Map'; import { ModMenuContent } from '../types/Content'; import { API } from '../api/Api'; import "../css/ModMenu.css" import { useNavigate } from 'react-router-dom'; interface ModMenuProps { token?: string; data: MapSummary; selectedRun: number; mapID: string; } const ModMenu: React.FC = ({ token, data, selectedRun, mapID }) => { const [menu, setMenu] = React.useState(0); const [showButton, setShowButton] = React.useState(true); const [routeContent, setRouteContent] = React.useState({ id: 0, name: "", score: 0, date: "", showcase: "", description: "No description available.", category_id: 1, }); const [image, setImage] = React.useState(""); const [md, setMd] = React.useState(""); const navigate = useNavigate(); function compressImage(file: File): Promise { const reader = new FileReader(); reader.readAsDataURL(file); return new Promise(resolve => { reader.onload = () => { const img = new Image(); if (typeof reader.result === "string") { img.src = reader.result; img.onload = () => { let { width, height } = img; if (width > 550) { height *= 550 / width; width = 550; } if (height > 320) { width *= 320 / height; height = 320; } const canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; canvas.getContext('2d')!.drawImage(img, 0, 0, width, height); resolve(canvas.toDataURL(file.type, 0.6)); }; } }; }); }; const _edit_map_summary_image = async () => { if (window.confirm("Are you sure you want to submit this to the database?")) { if (token) { const success = await API.put_map_image(token, mapID, image); if (success) { navigate(0); } else { alert("Error. Check logs.") } } } }; const _edit_map_summary_route = async () => { if (window.confirm("Are you sure you want to submit this to the database?")) { if (token) { routeContent.date += "T00:00:00Z"; const success = await API.put_map_summary(token, mapID, routeContent); if (success) { navigate(0); } else { alert("Error. Check logs.") } } } }; const _create_map_summary_route = async () => { if (window.confirm("Are you sure you want to submit this to the database?")) { if (token) { routeContent.date += "T00:00:00Z"; const success = await API.post_map_summary(token, mapID, routeContent); if (success) { navigate(0); } else { alert("Error. Check logs.") } } } }; const _delete_map_summary_route = async () => { if (window.confirm(`Are you sure you want to delete this run from the database? ${data.summary.routes[selectedRun].category.name} ${data.summary.routes[selectedRun].history.score_count} portals ${data.summary.routes[selectedRun].history.runner_name}`)) { if (token) { const success = await API.delete_map_summary(token, mapID, data.summary.routes[selectedRun].route_id); if (success) { navigate(0); } else { alert("Error. Check logs.") } } } }; React.useEffect(() => { if (menu === 3) { // add route setRouteContent({ id: 0, name: "", score: 0, date: "", showcase: "", description: "No description available.", category_id: 1, }); setMd("No description available."); } if (menu === 2) { // edit route setRouteContent({ id: data.summary.routes[selectedRun].route_id, name: data.summary.routes[selectedRun].history.runner_name, score: data.summary.routes[selectedRun].history.score_count, date: data.summary.routes[selectedRun].history.date.split("T")[0], showcase: data.summary.routes[selectedRun].showcase, description: data.summary.routes[selectedRun].description, category_id: data.summary.routes[selectedRun].category.id, }); setMd(data.summary.routes[selectedRun].description); } }, [menu]); React.useEffect(() => { const modview = document.querySelector("div#modview") as HTMLElement if (modview) { showButton ? modview.style.transform = "translateY(-68%)" : modview.style.transform = "translateY(0%)" } const modview_block = document.querySelector("#modview_block") as HTMLElement if (modview_block) { showButton ? modview_block.style.display = "none" : modview_block.style.display = "block" } }, [showButton]) return ( <>
{showButton ? ( ) : ( )}
{// Edit Image menu === 1 && (
Current Image: missing
New Image: { if (e.target.files) { compressImage(e.target.files[0]) .then(d => setImage(d)); } }} /> {image ? () : }
)} {// Edit Route menu === 2 && (
Route ID:
Runner Name: { setRouteContent({ ...routeContent, name: e.target.value, }); }} />
Score: { setRouteContent({ ...routeContent, score: parseInt(e.target.value), }); }} />
Date: { setRouteContent({ ...routeContent, date: e.target.value, }); }} />
Showcase Video: { setRouteContent({ ...routeContent, showcase: e.target.value, }); }} />
Description: