import React from "react"; import ReactMarkdown from "react-markdown"; import { useNavigate } from "react-router-dom"; import { MapSummary } from "@customTypes/Map"; import { ModMenuContent } from "@customTypes/Content"; import { API } from "@api/Api"; import "@css/ModMenu.css"; import useConfirm from "@hooks/UseConfirm"; interface ModMenuProps { token?: string; data: MapSummary; selectedRun: number; mapID: string; } const ModMenu: React.FC = ({ token, data, selectedRun, mapID, }) => { const { confirm, ConfirmDialogComponent } = useConfirm(); 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 ( await confirm( "Edit Map Summary Image", "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 ( await confirm( "Edit Map Summary Route", "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 ( await confirm( "Create Map Summary Route", "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 ( await confirm( "Delete Map Summary Route", `Are you sure you want to submit this to the database?\n ${data.summary.routes[selectedRun].category.name}\n${data.summary.routes[selectedRun].history.score_count} portals\n${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, data.summary.routes, selectedRun]); 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 ( <> {ConfirmDialogComponent}
{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: