import React, { Component } from 'react'; interface Leader { number_edits: number; username: string; } interface LeaderboardProps {} interface LeaderboardState { leaders: Leader[]; fetching: boolean; //We need to track the state of the radio buttons to ensure their current state is shown correctly when the view is (re)rendered number_limit: number; time_limit: number; } class LeaderboardPage extends Component { constructor(props) { super(props); this.state = { leaders: [], fetching: false, number_limit: 10, time_limit: -1 }; this.getLeaders = this.getLeaders.bind(this); this.renderTableData = this.renderTableData.bind(this); this.handleChange = this.handleChange.bind(this); } handleChange(e) { if(e.target.name == 'number_limit'){ this.getLeaders(e.target.value, this.state.time_limit); this.setState({number_limit: e.target.value}); } else { this.getLeaders(this.state.number_limit, e.target.value); this.setState({time_limit: e.target.value}); } } componentDidMount() { this.getLeaders(this.state.number_limit, this.state.time_limit); } getLeaders(number_limit: number, time_limit: number) { this.setState({ fetching: true }); fetch( `/api/leaderboard/leaders?number_limit=${number_limit}&time_limit=${time_limit}` ).then( (res) => res.json() ).then((data) => { if (data && data.leaders){ this.setState({ leaders: data.leaders, fetching: false }); } else { console.error(data); this.setState({ leaders: [], fetching: false }); } }).catch((err) => { console.error(err); this.setState({ leaders: [], fetching: false }); }); } renderTableData() { return this.state.leaders.map((u, i) => { const username = u.username; const number_edits = u.number_edits; return ( {i+1} {username} {number_edits.toLocaleString()} ); }); } render() { return (

Leaderboard

{this.renderTableData()}
# Username Contributions
); } } export default LeaderboardPage;