mirror of
https://gitlab.com/MrFry/qmining-page
synced 2025-04-01 20:23:44 +02:00
Added ranklist
This commit is contained in:
parent
b2982425f1
commit
ebad81a75e
5 changed files with 7936 additions and 1 deletions
7741
package-lock.json
generated
Normal file
7741
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
|
@ -27,6 +27,10 @@
|
|||
"href": "/contribute",
|
||||
"text": "Contribute"
|
||||
},
|
||||
"ranklist": {
|
||||
"href": "/ranklist",
|
||||
"text": "Ranklista"
|
||||
},
|
||||
"feedback": {
|
||||
"href": "/feedback",
|
||||
"text": "Feedback",
|
||||
|
|
|
@ -40,7 +40,6 @@ export default function Index(props) {
|
|||
return resp.json()
|
||||
})
|
||||
.then((data) => {
|
||||
console.log(data)
|
||||
setMotd(data.motd)
|
||||
setUserSpecificMotd(data.userSpecificMotd)
|
||||
})
|
||||
|
|
124
src/pages/ranklist.js
Normal file
124
src/pages/ranklist.js
Normal file
|
@ -0,0 +1,124 @@
|
|||
import React, { useState, useEffect } from 'react'
|
||||
import fetch from 'unfetch'
|
||||
|
||||
import LoadingIndicator from '../components/LoadingIndicator'
|
||||
import Sleep from '../components/sleep'
|
||||
|
||||
import styles from './ranklist.module.css'
|
||||
import constants from '../constants.json'
|
||||
|
||||
const selectOptions = {
|
||||
newQuestions: { name: 'Beküldött új kérdések' },
|
||||
allQuestions: { name: 'Megoldott kérdések' },
|
||||
count: { name: 'Megoldott tesztek' },
|
||||
}
|
||||
|
||||
async function getListFromServer() {
|
||||
return new Promise((resolve, reject) => {
|
||||
console.info('Fetching data')
|
||||
fetch(`${constants.apiUrl}ranklist`, {
|
||||
credentials: 'include',
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
})
|
||||
.then((resp) => {
|
||||
return resp.json()
|
||||
})
|
||||
.then((data) => {
|
||||
resolve(data)
|
||||
})
|
||||
.catch((error) => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function sortDataBy(data, key) {
|
||||
return data.sort((a, b) => {
|
||||
if (a[key] < b[key]) {
|
||||
return 1
|
||||
} else if (a[key] > b[key]) {
|
||||
return -1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export default function RankList() {
|
||||
const [ranklist, setRanklist] = useState(null)
|
||||
const [selfUserId, setSelfUserId] = useState(null)
|
||||
const [key, setKey] = useState('newQuestions')
|
||||
|
||||
const getList = () => {
|
||||
setRanklist(null)
|
||||
getListFromServer(key)
|
||||
.then((data) => {
|
||||
setRanklist(data.list)
|
||||
// setSelfUserId(data.selfUserId)
|
||||
setSelfUserId(723)
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error(error)
|
||||
setRanklist(null)
|
||||
})
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
getList()
|
||||
}, [])
|
||||
|
||||
if (!ranklist) {
|
||||
return <LoadingIndicator />
|
||||
}
|
||||
|
||||
const list = sortDataBy(ranklist, key)
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div>
|
||||
<div
|
||||
className={styles.infoText}
|
||||
>{`A felhasználó ID-d: #${selfUserId}`}</div>
|
||||
<Sleep />
|
||||
<div className={styles.table}>
|
||||
<div className={styles.headerRow}>
|
||||
<div>{'Rank'}</div>
|
||||
<div>{'Felhasználó ID'}</div>
|
||||
{Object.keys(selectOptions).map((listKey) => {
|
||||
const val = selectOptions[listKey]
|
||||
return (
|
||||
<div
|
||||
className={`${styles.clickable} ${listKey === key &&
|
||||
styles.selected}`}
|
||||
key={listKey}
|
||||
onClick={() => {
|
||||
setKey(listKey)
|
||||
}}
|
||||
>
|
||||
{val.name}
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
{list.map((listItem, i) => {
|
||||
return (
|
||||
<div
|
||||
className={`${styles.row} ${listItem.userId === selfUserId &&
|
||||
styles.selfRow}`}
|
||||
key={i}
|
||||
>
|
||||
<div>{i + 1}</div>
|
||||
<div>{'#' + listItem.userId}</div>
|
||||
{Object.keys(selectOptions).map((listKey) => {
|
||||
const val = listItem[listKey]
|
||||
return <div key={listKey}>{val}</div>
|
||||
})}
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
67
src/pages/ranklist.module.css
Normal file
67
src/pages/ranklist.module.css
Normal file
|
@ -0,0 +1,67 @@
|
|||
.row,
|
||||
.headerRow {
|
||||
display: flex;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.row:hover {
|
||||
background-color: #333333;
|
||||
}
|
||||
|
||||
.row div,
|
||||
.headerRow div {
|
||||
flex: 1;
|
||||
padding: 0px 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.headerRow div {
|
||||
padding: 15px 5px;
|
||||
}
|
||||
|
||||
.row :nth-child(1),
|
||||
.headerRow :nth-child(1) {
|
||||
flex: 0 30px;
|
||||
}
|
||||
|
||||
.row :nth-child(2),
|
||||
.headerRow :nth-child(2) {
|
||||
flex: 0 100px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.table {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.table :nth-child(1) {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.clickable:hover {
|
||||
background-color: #666666;
|
||||
}
|
||||
|
||||
.selfRow {
|
||||
background-color: #9999ff;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.selfRow:hover {
|
||||
background-color: #9999ee;
|
||||
}
|
||||
|
||||
.infoText {
|
||||
text-align: center;
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.selected {
|
||||
color: #9999ff;
|
||||
}
|
||||
|
||||
.clickable {
|
||||
cursor: pointer;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue