/* eslint-disable indent */ import { invoke } from '@tauri-apps/api/tauri' import React from 'react' import Tr from '../../../utils/language' import './NewsSection.css' interface IProps { selected?: string; } interface IState { selected: string; news?: JSX.Element; commitList?: JSX.Element[]; } interface GrasscutterAPIResponse { commits: { gc_stable: CommitResponse[]; gc_dev: CommitResponse[]; cultivation: CommitResponse[]; } } interface CommitResponse { sha: string; commit: Commit; } interface Commit { author: { name: string; }; message: string; } export default class NewsSection extends React.Component { constructor(props: IProps) { super(props) this.state = { selected: props.selected || 'commits', } this.setSelected = this.setSelected.bind(this) this.showNews = this.showNews.bind(this) } componentDidMount() { // Call showNews off the bat this.showNews() } setSelected(item: string) { this.setState({ selected: item }, () => { this.showNews() }) } async showLatestCommits() { if (!this.state.commitList) { const response: string = await invoke('req_get', { url: 'https://api.grasscutter.io/cultivation/query' }) let grasscutterApiResponse: GrasscutterAPIResponse | null = null try { grasscutterApiResponse = JSON.parse(response) } catch(e) { grasscutterApiResponse = null } let commits: CommitResponse[] if (grasscutterApiResponse?.commits == null) { // If it didn't work, use official API const response: string = await invoke('req_get', { url: 'https://api.github.com/repos/Grasscutters/Grasscutter/commits' }) commits = JSON.parse(response) } else { commits = grasscutterApiResponse.commits.gc_stable } // Probably rate-limited if (!Array.isArray(commits)) return // Get only first 5 const commitsList = commits.slice(0, 10) const commitsListHtml = commitsList.map((commitResponse: CommitResponse) => { return ( {commitResponse.commit.author.name} {commitResponse.commit.message} ) }) this.setState({ commitList: commitsListHtml, news: <>{commitsListHtml} }) } return this.state.commitList } async showNews() { let news: JSX.Element | JSX.Element[] = switch(this.state.selected) { case 'commits': { const commits = await this.showLatestCommits() if (commits != null) { news = commits } break } case 'latest_version': news = Latest version break default: news = Unknown break } this.setState({ news: <>{news} }) } render() { return (
this.setSelected('commits')}>
this.setSelected('latest_version')}>
{this.state.news}
) } }