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: