diff --git a/package-lock.json b/package-lock.json
index 65852f7..cc0a599 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3277,6 +3277,14 @@
}
}
},
+ "react-bootstrap-icons": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/react-bootstrap-icons/-/react-bootstrap-icons-1.6.1.tgz",
+ "integrity": "sha512-0xoFKK0soRBx7F0+R8lHmNp7THqaCMnAKm2SfySeTTmyk2HOG6SMXuoqlEI8SPZu2ez4u3dHlrXoo5/2IGWCeA==",
+ "requires": {
+ "prop-types": "^15.7.2"
+ }
+ },
"react-dom": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
diff --git a/package.json b/package.json
index 02243ef..140001a 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,7 @@
"next": "11.1.2",
"react": "17.0.2",
"react-bootstrap": "^2.0.0",
+ "react-bootstrap-icons": "^1.6.1",
"react-dom": "17.0.2",
"swr": "^1.0.1"
},
diff --git a/pages/index.js b/pages/index.js
index 5a6b0e2..83fa9cf 100644
--- a/pages/index.js
+++ b/pages/index.js
@@ -6,6 +6,8 @@ import ToggleButtonGroup from 'react-bootstrap/ButtonGroup'
import ToggleButton from 'react-bootstrap/Button'
import useSWR from 'swr'
import Table from 'react-bootstrap/Table'
+import Spinner from 'react-bootstrap/Spinner'
+import {CameraReelsFill} from 'react-bootstrap-icons'
import 'bootstrap/dist/css/bootstrap.min.css';
@@ -44,6 +46,71 @@ function getLeaderboard(categoryID,variables) {
}
}
+function getPlatform(platformID) {
+ const { data,error } = useSWR("https://www.speedrun.com/api/v1/platforms/"+platformID,fetcher)
+
+ return {
+ platform: data?.data.name,
+ isLoading: !error && !data,
+ isError: error
+ }
+}
+
+function getVersion(versionID) {
+ const { data,error } = useSWR("https://www.speedrun.com/api/v1/variables/p85me3lg",fetcher)
+
+ return {
+ version: data?.data.values.values[versionID].label,
+ isLoading: !error && !data,
+ isError: error
+ }
+}
+
+function getPlayer(playerID) {
+ const { data,error } = useSWR("https://www.speedrun.com/api/v1/users/"+playerID,fetcher)
+ return {
+ name: data?.data.names.international,
+ link: data?.data.weblink,
+ color1: data?.data["name-style"]["color-from"]?.dark,
+ color2: data?.data["name-style"]["color-to"]?.dark,
+ country_code: data?.data.location?.country.code,
+ country_name: data?.data.location?.country.names.international,
+ twitch: data?.data.twitch?.uri,
+ youtube: data?.data.youtube?.uri,
+ icon: data?.data.assets.icon.uri,
+ image: data?.data.assets.image.uri,
+ isLoading: !error && !data,
+ isError: error
+ }
+}
+
+function Player(p) {
+ const {data}=p
+ const playerData=getPlayer(data.id)
+ return <> {data.rel==="guest"?data.name:playerData.name}>
+}
+
+function TimeDisplay(time) {
+ const hrs = Math.floor(time/3600)>0?Math.floor(time/3600):"";
+ const min = Math.floor(time/60)>0?Math.floor(time/60%60):"00";
+ const sec = Math.floor(time%60)>0?Math.floor(time%60):"00";
+ const millis = time%1>0?Math.round(time%1*1000):"";
+
+ return <>{(hrs>0?hrs+":":"")+min.toLocaleString('en-US',{minimumIntegerDigits:2})+":"+sec.toLocaleString('en-US',{minimumIntegerDigits:2})}{millis>0&&{"."+millis.toLocaleString('en-US',{minimumIntegerDigits:3})+""}}>
+}
+
+function Platform(p) {
+ const {data} = p
+ const playerData=getPlatform(data)
+ return <>{playerData.platform??""}>
+}
+
+function Version(p) {
+ const {data} = p
+ const versionData=getVersion(data)
+ return <>{versionData.version??""}>
+}
+
function Leaderboard(p) {
const {data} = p
return