/* 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() this.setSelected('commits') } setSelected(item: string) { this.setState({ selected: item }, () => { this.showNews() }) } async showLatestCommits() { // Just use official API const response: string = await invoke('req_get', { url: 'https://api.github.com/repos/Grasscutters/Grasscutter/commits', }) 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, try again anyways 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: Grasscutter 1.4.8 - Cultivation 1.0.26 ) break default: news = ( Unknown ) break } this.setState({ news: <>{news}, }) } render() { return (
this.setSelected('commits')} >
this.setSelected('latest_version')} >
{this.state.news}
) } }