From a65d6d9127c3fa7f6a8ecaec5d1ffd1f47c2bc98 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Tue, 3 Sep 2024 00:08:53 +0300 Subject: refactor: port to typescript --- frontend/src/components/pages/summary.js | 650 ------------------------------- 1 file changed, 650 deletions(-) delete mode 100644 frontend/src/components/pages/summary.js (limited to 'frontend/src/components/pages/summary.js') diff --git a/frontend/src/components/pages/summary.js b/frontend/src/components/pages/summary.js deleted file mode 100644 index d276408..0000000 --- a/frontend/src/components/pages/summary.js +++ /dev/null @@ -1,650 +0,0 @@ -import React, { useEffect } from 'react'; -import { useLocation, Link } 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 + ' year ago';} - if (interval > 1) {return interval + ' years ago';} - - interval = Math.floor(seconds / 2592000); - if (interval === 1) {return interval + ' month ago';} - if (interval > 1) {return interval + ' months ago';} - - interval = Math.floor(seconds / 86400); - if (interval === 1) {return interval + ' day ago';} - if (interval > 1) {return interval + ' days ago';} - - interval = Math.floor(seconds / 3600); - if (interval === 1) {return interval + ' hour ago';} - if (interval > 1) {return interval + ' hours ago';} - - interval = Math.floor(seconds / 60); - if (interval === 1) {return interval + ' minute ago';} - 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){ - console.log(data) - -let current_chapter = data.map.chapter_name -let isCoop = false; -if (data.map.game_name == "Portal 2 - Cooperative") { - isCoop = true -} - -current_chapter = data.map.chapter_name.split(" ") -// current_chapter = current_chapter.split("-") -current_chapter = current_chapter[1] - -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 ( -
- ) -} - - -} - - -- cgit v1.2.3