import React from 'react'; import { useLocation } from "react-router-dom"; import ReactMarkdown from 'react-markdown' import "./summary.css"; import img4 from "../../imgs/4.png" import img5 from "../../imgs/5.png" import img6 from "../../imgs/6.png" import img12 from "../../imgs/12.png" import img13 from "../../imgs/13.png" import Modview from "./summary_modview.js" export default function Summary(prop) { const {token,mod} = prop const fakedata={} //for debug const location = useLocation() //fetching data const [data, setData] = React.useState(null); React.useEffect(() => { setData(null) setDiscussionThread(null) setCreatePostState(0) setSelectedRun(0) setCatState(1) fetch(`https://lp.ardapektezol.com/api/v1/maps/${location.pathname.split('/')[2]}/summary`) .then(r => r.json()) .then(d => { if(Object.keys(fakedata).length!==0){setData(fakedata)} else{setData(d.data)} if(d.data.summary.routes.length===0){d.data.summary.routes[0]={"category": "","history": {"score_count": 0,},"rating": 0,"description": "","showcase": ""}} }) // eslint-disable-next-line }, [location.pathname]); const [pageNumber, setPageNumber] = React.useState(1); const [lbData, setLbData] = React.useState(null); React.useEffect(() => { fetch(`https://lp.ardapektezol.com/api/v1/maps/${location.pathname.split('/')[2]}/leaderboards?page=${pageNumber}`) .then(r => r.json()) .then(d => setLbData(d)) // eslint-disable-next-line }, [pageNumber,location.pathname]); const [discussions,setDiscussions] = React.useState(null) function fetchDiscussions() { fetch(`https://lp.ardapektezol.com/api/v1/maps/${location.pathname.split('/')[2]}/discussions`) .then(r=>r.json()) .then(d=>setDiscussions(d.data.discussions)) } React.useEffect(()=>{ fetchDiscussions() },[location.pathname]) const [discussionThread,setDiscussionThread] = React.useState(null) function openDiscussion(x){ fetch(`https://lp.ardapektezol.com/api/v1/maps/${location.pathname.split('/')[2]}/discussions/${x}`) .then(r=>r.json()) .then(d=>setDiscussionThread(d.data.discussion)) } const [discussionSearch, setDiscussionSearch] = React.useState("") const [navState, setNavState] = React.useState(0); // eslint-disable-next-line React.useEffect(() => {NavClick();}, [[],navState]); function NavClick() { if(data!==null){ const btn = document.querySelectorAll("#section2 button.nav-button"); btn.forEach((e) => {e.style.backgroundColor = "#2b2e46"}); btn[navState].style.backgroundColor = "#202232"; document.querySelectorAll("section").forEach((e,i)=>i>=2?e.style.display="none":"") if(navState === 0){document.querySelectorAll(".summary1").forEach((e) => {e.style.display = "grid"});} if(navState === 1){document.querySelectorAll(".summary2").forEach((e) => {e.style.display = "block"});} if(navState === 2){document.querySelectorAll(".summary3").forEach((e) => {e.style.display = "block"});} }} const [catState, setCatState] = React.useState(1); // eslint-disable-next-line React.useEffect(() => {CatClick();}, [[],catState]); function CatClick() { if(data!==null){ const btn = document.querySelectorAll("#section3 #category span button"); btn.forEach((e) => {e.style.backgroundColor = "#2b2e46"}); btn[catState-1].style.backgroundColor = "#202232"; }} React.useEffect(()=>{ if(data!==null && data.summary.routes.filter(e=>e.category.id===catState).length!==0){ selectRun(0,catState)} // eslint-disable-next-line },[catState,data]) const [hisState, setHisState] = React.useState(0); // eslint-disable-next-line React.useEffect(() => {HisClick();}, [[],hisState]); function HisClick() { if(data!==null){ const btn = document.querySelectorAll("#section3 #history span button"); btn.forEach((e) => {e.style.backgroundColor = "#2b2e46"}); btn[hisState].style.backgroundColor = "#202232"; }} const [selectedRun,setSelectedRun] = React.useState(0) function selectRun(x,y){ let r = document.querySelectorAll("button.record") r.forEach(e=>e.style.backgroundColor="#2b2e46") r[x].style.backgroundColor="#161723" if(data!==null && data.summary.routes.length!==0 && data.summary.routes.length!==0){ if(y===2){x+=data.summary.routes.filter(e=>e.category.id<2).length} if(y===3){x+=data.summary.routes.filter(e=>e.category.id<3).length} if(y===4){x+=data.summary.routes.filter(e=>e.category.id<4).length} setSelectedRun(x) } } function graph(state) { // this is such a mess let graph = data.summary.routes.filter(e=>e.category.id===catState) let graph_score = [] data.summary.routes.filter(e=>e.category.id===catState).forEach(e=>graph_score.push(e.history.score_count)) let graph_dates = [] data.summary.routes.filter(e=>e.category.id===catState).forEach(e=>graph_dates.push(e.history.date.split("T")[0])) let graph_max = graph[graph.length-1].history.score_count let graph_numbers = [] for (let i=graph_max;i>=0;i--){ graph_numbers[i]=i } switch (state) { case 1: //numbers return graph_numbers .reverse().map(e=>( graph_score.includes(e) || e===0 ? {e}
:
)) case 2: // graph let g = 0 let h = 0 return graph_numbers.map((e,j)=>( { graph_score.map((e,i)=>( <> =h ? "1px dashed white" : "0" }} > {g===h && graph_score.includes(graph_max-j) ? : ""} =h ? g-1>=h ? "1px dashed #2b2e46" : "1px solid white" : "0" : "0"}} > =h ? g-1>=h ? "1px dashed #2b2e46" : "1px solid white" : "0" : "0"}} > )) } )) case 3: // dates return graph_dates .reverse().map(e=>( {e} )) default: break; } } const [vid,setVid] = React.useState("") React.useEffect(()=>{ if(data!==null){ let showcase = data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].showcase showcase.length>6 ? setVid("https://www.youtube.com/embed/"+YouTubeGetID(showcase)) : setVid("") } // eslint-disable-next-line },[[],selectedRun]) function YouTubeGetID(url){ url = url.split(/(vi\/|v=|\/v\/|youtu\.be\/|\/embed\/)/); return (url[2] !== undefined) ? url[2].split(/[^0-9a-z_]/i)[0] : url[0]; } function TimeAgo(date) { // const seconds = Math.floor((new Date() - date) / 1000); const seconds = Math.floor(((new Date(new Date() - (date.getTimezoneOffset()*-60000))) - date) / 1000); let interval = Math.floor(seconds / 31536000); if (interval > 1) {return interval + ' years ago';} interval = Math.floor(seconds / 2592000); if (interval > 1) {return interval + ' months ago';} interval = Math.floor(seconds / 86400); if (interval > 1) {return interval + ' days ago';} interval = Math.floor(seconds / 3600); if (interval > 1) {return interval + ' hours ago';} interval = Math.floor(seconds / 60); if (interval > 1) {return interval + ' minutes ago';} if(seconds < 10) return 'just now'; return Math.floor(seconds) + ' seconds ago'; }; function TicksToTime(ticks) { let seconds = Math.floor(ticks/60) let minutes = Math.floor(seconds/60) let hours = Math.floor(minutes/60) let milliseconds = Math.floor((ticks%60)*1000/60) seconds = seconds % 60; minutes = minutes % 60; return `${hours===0?"":hours+":"}${minutes===0?"":hours>0?minutes.toString().padStart(2, '0')+":":(minutes+":")}${minutes>0?seconds.toString().padStart(2, '0'):seconds}.${milliseconds.toString().padStart(3, '0')} (${ticks})`; } function PostComment() { fetch(`https://lp.ardapektezol.com/api/v1/maps/${location.pathname.split('/')[2]}/discussions/${discussionThread.id}`,{ method:"POST", headers:{authorization:token}, body:JSON.stringify({"comment":document.querySelector("#discussion-send>input").value}) }) .then(r=>r.json()) .then(d=>{ document.querySelector("#discussion-send>input").value="" openDiscussion(discussionThread.id) }) } const [createPostState,setCreatePostState] = React.useState(0) function CreatePost() { fetch(`https://lp.ardapektezol.com/api/v1/maps/${location.pathname.split('/')[2]}/discussions`,{ method:"POST", headers:{authorization:token}, body:JSON.stringify({"title":document.querySelector("#discussion-create-title").value,"content":document.querySelector("#discussion-create-content").value}) }) .then(r=>r.json()) .then(d=>{ setCreatePostState(0) fetchDiscussions() }) } function DeletePost(post) { if(window.confirm(`Are you sure you want to remove post: ${post.title}?`)){ console.log("deleted",post.id) fetch(`https://lp.ardapektezol.com/api/v1/maps/${location.pathname.split('/')[2]}/discussions/${post.id}`,{ method:"DELETE", headers:{authorization:token}, }) .then(r=>r.json()) .then(d=>{ fetchDiscussions() }) } } if(data!==null){ return ( <> {token!==null?mod===true?:"":""}

{data.map.map_name}

{data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].history.score_count} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].history.score_count === 1 ? ` portal` : ` portals` }

{data.map.is_coop? :}
{data.summary.routes.filter(e=>e.category.id===catState).length===0 ?
There are no records for this map.
: <>
Date Record First completion

{data.summary.routes .sort((a, b) => a.history.score_count - b.history.score_count) .filter(e=>e.category.id===catState) .map((r, index) => ( ))}
}
{data.summary.routes.filter(e=>e.category.id===catState).length===0 ?
There are no records for this map.
:
{graph(1)}
{graph(2)}
{graph(3)}
}
Difficulty {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 0 ? (N/A):null} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 1 ? (Very easy):null} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 2 ? (Easy):null} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 3 ? (Medium):null} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 4 ? (Hard):null} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 5 ? (Very hard):null}
{data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 1 ? (
) : (
)} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 2 ? (
) : (
)} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 3 ? (
) : (
)} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 4 ? (
) : (
)} {data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].rating === 5 ? (
) : (
)}
Completion count
{catState===1?data.summary.routes[selectedRun].completion_count:"N/A"}
{data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].showcase!=="" ? : ""}

Route description

{data.summary.routes.sort((a,b)=>a.category.id - b.category.id)[selectedRun].description}
{/* Leaderboards */} {lbData===null?"":lbData.success===false?(

Map is not available for competitive boards.

):lbData.data.records.length===0?(

No records found.

):(
Place {lbData.data.map.is_coop?(
Host Partner
):( Runner )} Portals Time Date
{lbData.data.pagination.current_page}/{lbData.data.pagination.total_pages}

{lbData.data.records.map((r, index) => ( {r.placement} {lbData.data.map.is_coop?(
  {r.host.user_name}   {r.partner.user_name}
):(
  {r.user.user_name}
)} {r.score_count} {TicksToTime(r.score_time)} { TimeAgo(new Date(r.record_date.replace("T"," ").replace("Z",""))) } {lbData.data.map.is_coop?( ):( )}
))}
)} {/* Discussions */}
{discussionThread === null ? ( createPostState === 0 ? ( discussions !== null ? ( // Main screen <> {discussions.filter(f=>f.title.includes(discussionSearch)).sort((a, b) => new Date(b.updated_at) - new Date(a.updated_at)) .map((e, i) => (
::} {e.creator.user_name}: {e.content} last updated: {TimeAgo(new Date(e.updated_at.replace("T"," ").replace("Z","")))}
))} ):( // Main screen (no posts) <> no discussions ) ):( // Creating post
Create post
)):( // Post screen
{discussionThread.title}
{discussionThread.creator.user_name} {TimeAgo(new Date(discussionThread.created_at.replace("T"," ").replace("Z","")))} {discussionThread.content}
{discussionThread.comments!==null? discussionThread.comments.sort((a, b) => new Date(a.date) - new Date(b.date)) .map(e=>( <>
{e.user.user_name} {TimeAgo(new Date(e.date.replace("T"," ").replace("Z","")))} {e.comment}
)):""}
e.key==="Enter"?PostComment():""}/>
)}
) }else{ return (
) } }