Connect frontend to backend
This commit is contained in:
@@ -3,6 +3,6 @@ import { AppModule } from './app.module';
|
|||||||
|
|
||||||
async function bootstrap() {
|
async function bootstrap() {
|
||||||
const app = await NestFactory.create(AppModule);
|
const app = await NestFactory.create(AppModule);
|
||||||
await app.listen(3000);
|
await app.listen(3500);
|
||||||
}
|
}
|
||||||
bootstrap();
|
bootstrap();
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
"name": "ts-onlinetime-ranks",
|
"name": "ts-onlinetime-ranks",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"proxy": "http://localhost:3500",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@testing-library/jest-dom": "^4.2.4",
|
"@testing-library/jest-dom": "^4.2.4",
|
||||||
"@testing-library/react": "^9.3.2",
|
"@testing-library/react": "^9.3.2",
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
height: 100vh;
|
|
||||||
color: whitesmoke;
|
color: whitesmoke;
|
||||||
background-color: #282c34;
|
background-color: #282c34;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,67 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import './App.scss';
|
import './App.scss';
|
||||||
import Mock from "./mock/Mock";
|
import UserStatsMockService from "./mock/UserStatsMockService";
|
||||||
import TableEntry from "./models/TableEntry";
|
import TableEntry from "./models/TableEntry";
|
||||||
import {SinusBot} from "@support-pp/sinusbot-ts";
|
import UserStatsService from "./services/UserStatsService";
|
||||||
import SinusBotService from "./services/SinusBotService";
|
import {findDOMNode} from "react-dom";
|
||||||
|
|
||||||
|
interface State {
|
||||||
|
error?: any,
|
||||||
|
isLoaded: boolean,
|
||||||
|
users?: TableEntry[]
|
||||||
|
}
|
||||||
|
|
||||||
export default class App extends React.Component {
|
export default class App extends React.Component {
|
||||||
|
|
||||||
//private tableContent: TableEntry[] = Mock.tableContent;
|
private apiService: UserStatsService = new UserStatsService();
|
||||||
|
|
||||||
state = {
|
state: State = {
|
||||||
error: null,
|
error: null,
|
||||||
isLoaded: false,
|
isLoaded: false,
|
||||||
users: [],
|
users: undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
this.setState({isLoaded: false})
|
||||||
|
this.apiService.getStats()
|
||||||
|
.then(data => this.setState({
|
||||||
|
isLoaded: true,
|
||||||
|
users: data
|
||||||
|
}))
|
||||||
|
.catch(error => this.setState({
|
||||||
|
isLoaded: true,
|
||||||
|
error: error
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate() {
|
||||||
|
const element = findDOMNode(this);
|
||||||
|
if (element != null) {
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
renderTableData() {
|
||||||
|
const { error, isLoaded, users } = this.state;
|
||||||
|
if (users != null && isLoaded) {
|
||||||
|
return users.map((entry, index) => {
|
||||||
|
const placement = index + 1;
|
||||||
|
const placementClassName = placement === 1 ? "first-place"
|
||||||
|
: (placement === 2 ? "second-place"
|
||||||
|
: (placement === 3 ? "third-place"
|
||||||
|
: undefined))
|
||||||
|
return (
|
||||||
|
<tr key={index} className={placementClassName}>
|
||||||
|
<td>{placement}</td>
|
||||||
|
<td>{entry.name}</td>
|
||||||
|
<td>{entry.onlineTime}</td>
|
||||||
|
</tr>
|
||||||
|
)
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { error, isLoaded, users } = this.state;
|
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<div className="App">
|
||||||
<p className="title">Humenius' TeamSpeak 3-Ranking</p>
|
<p className="title">Humenius' TeamSpeak 3-Ranking</p>
|
||||||
@@ -33,33 +74,15 @@ export default class App extends React.Component {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{
|
{this.renderTableData()}
|
||||||
users.map((tableEntry: TableEntry, i) => {
|
|
||||||
let className;
|
|
||||||
switch (i+1) {
|
|
||||||
case 1: className = "first-place"; break;
|
|
||||||
case 2: className = "second-place"; break;
|
|
||||||
case 3: className = "third-place"; break;
|
|
||||||
default: className = ""; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<tr key={i} className={className}>
|
|
||||||
<td>{i+1}</td>
|
|
||||||
<td>{tableEntry.name}</td>
|
|
||||||
<td>{tableEntry.onlineTime}</td>
|
|
||||||
</tr>
|
|
||||||
);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<footer>
|
<footer>
|
||||||
Made by <a href="https://humenius.me"
|
Made by <a href="https://humenius.me"
|
||||||
>Humenius</a>.
|
>Humenius</a>.
|
||||||
Powered by <a href="https://reactjs.org/"
|
Powered by <a href="https://reactjs.org/"
|
||||||
>React</a>.
|
>React</a>.
|
||||||
<br />
|
<br/>
|
||||||
<a href="ts3server://ts.humenius.me">
|
<a href="ts3server://ts.humenius.me">
|
||||||
Click here to join my TeamSpeak server
|
Click here to join my TeamSpeak server
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
import TableEntry from "../models/TableEntry";
|
|
||||||
|
|
||||||
class Mock {
|
|
||||||
public static tableContent: TableEntry[] = [
|
|
||||||
{ name: "Humen", onlineTime: "0d 1h 0m 0m" },
|
|
||||||
{ name: "Humen", onlineTime: "0d 1h 0m 0m" },
|
|
||||||
{ name: "Humen", onlineTime: "0d 1h 0m 0m" },
|
|
||||||
{ name: "Humen", onlineTime: "0d 1h 0m 0m" },
|
|
||||||
{ name: "Humen", onlineTime: "0d 1h 0m 0m" },
|
|
||||||
{ name: "Humen", onlineTime: "0d 1h 0m 0m" }
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Mock;
|
|
||||||
22
frontend/src/mock/UserStatsMockService.ts
Normal file
22
frontend/src/mock/UserStatsMockService.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import TableEntry from "../models/TableEntry";
|
||||||
|
import UserStatsService from "../services/UserStatsService";
|
||||||
|
|
||||||
|
export default class UserStatsMockService extends UserStatsService {
|
||||||
|
private readonly entries: TableEntry[];
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.entries = [
|
||||||
|
{ name: "Humen", onlineTime: "0d 1h 0m 0s" },
|
||||||
|
{ name: "Humen", onlineTime: "0d 1h 0m 0s" },
|
||||||
|
{ name: "Humen", onlineTime: "0d 1h 0m 0s" },
|
||||||
|
{ name: "Humen", onlineTime: "0d 1h 0m 0s" },
|
||||||
|
{ name: "Humen", onlineTime: "0d 1h 0m 0s" },
|
||||||
|
{ name: "Humen", onlineTime: "0d 1h 0m 0s" }
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
async getStats(): Promise<TableEntry[]> {
|
||||||
|
return Promise.resolve(this.entries);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
interface TableEntry {
|
export default interface TableEntry {
|
||||||
name: string;
|
name: string;
|
||||||
onlineTime: string;
|
onlineTime: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default TableEntry;
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
interface TunakillUser {
|
|
||||||
name: string;
|
|
||||||
time: number;
|
|
||||||
uid: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default TunakillUser;
|
|
||||||
18
frontend/src/services/UserStatsService.ts
Normal file
18
frontend/src/services/UserStatsService.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import TableEntry from "../models/TableEntry";
|
||||||
|
|
||||||
|
export default class UserStatsService {
|
||||||
|
|
||||||
|
private apiURL = '/stats'
|
||||||
|
|
||||||
|
private requestInit: RequestInit = {
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
async getStats(): Promise<TableEntry[]> {
|
||||||
|
return fetch(this.apiURL, this.requestInit)
|
||||||
|
.then(res => { console.log(res); return res; })
|
||||||
|
.then(res => res.json())
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user