import React from 'react' // Major Components import TopBar from './components/TopBar' import ServerLaunchSection from './components/ServerLaunchSection' import MainProgressBar from './components/common/MainProgressBar' import Options from './components/menu/Options' import MiniDialog from './components/MiniDialog' import DownloadList from './components/common/DownloadList' import Downloads from './components/menu/Downloads' import NewsSection from './components/news/NewsSection' import Game from './components/menu/Game' import RightBar from './components/RightBar' import { getConfigOption, setConfigOption } from '../utils/configuration' import { invoke } from '@tauri-apps/api' import { listen } from '@tauri-apps/api/event' import { dataDir } from '@tauri-apps/api/path' import { appWindow } from '@tauri-apps/api/window' import { unpatchGame } from '../utils/metadata' import DownloadHandler from '../utils/download' // Graphics import cogBtn from '../resources/icons/cog.svg' import downBtn from '../resources/icons/download.svg' import wrenchBtn from '../resources/icons/wrench.svg' interface IProps { downloadHandler: DownloadHandler } interface IState { isDownloading: boolean optionsOpen: boolean miniDownloadsOpen: boolean downloadsOpen: boolean gameDownloadsOpen: boolean migotoSet: boolean } export class Main extends React.Component { constructor(props: IProps) { super(props) this.state = { isDownloading: false, optionsOpen: false, miniDownloadsOpen: false, downloadsOpen: false, gameDownloadsOpen: false, migotoSet: false, } listen('lang_error', (payload) => { console.log(payload) }) listen('jar_extracted', ({ payload }: { payload: string }) => { setConfigOption('grasscutter_path', payload) }) // Emitted for metadata replacing-purposes listen('game_closed', async () => { const wasPatched = await getConfigOption('patch_metadata') if (wasPatched) { const unpatched = await unpatchGame() if (!unpatched) { alert( `Could not unpatch game! (You should be able to find your metadata backup in ${await dataDir()}\\cultivation\\)` ) } } }) let min = false // periodically check if we need to min/max based on whether the game is open setInterval(async () => { const gameOpen = await invoke('is_game_running') if (gameOpen && !min) { appWindow.minimize() min = true } else if (!gameOpen && min) { appWindow.unminimize() min = false } }, 1000) } async componentDidMount() { const cert_generated = await getConfigOption('cert_generated') this.setState({ migotoSet: !!(await getConfigOption('migoto_path')), }) if (!cert_generated) { // Generate the certificate await invoke('generate_ca_files', { path: (await dataDir()) + 'cultivation', }) await setConfigOption('cert_generated', true) } // Period check to only show progress bar when downloading files setInterval(() => { this.setState({ isDownloading: this.props.downloadHandler.getDownloads().filter((d) => d.status !== 'finished')?.length > 0, }) }, 1000) } render() { return ( <>
this.setState({ optionsOpen: !this.state.optionsOpen })} className="TopButton" > settings
this.setState({ downloadsOpen: !this.state.downloadsOpen })} > downloads
{this.state.migotoSet && (
{ // Create and dispatch a custom "openMods" event const event = new CustomEvent('changePage', { detail: 'modding' }) window.dispatchEvent(event) }} className="TopButton" > mods
)} {/*
this.setState({ gameDownloadsOpen: !this.state.gameDownloadsOpen })}> game
*/}
{ // Mini downloads section this.state.miniDownloadsOpen ? (
{ this.setState({ miniDownloadsOpen: false }) }} >
) : null } { // Download menu this.state.downloadsOpen ? ( this.setState({ downloadsOpen: false })} /> ) : null } { // Options menu this.state.optionsOpen ? ( this.setState({ optionsOpen: !this.state.optionsOpen })} /> ) : null } { // Game downloads menu this.state.gameDownloadsOpen ? ( this.setState({ gameDownloadsOpen: false })} /> ) : null }
this.setState({ miniDownloadsOpen: !this.state.miniDownloadsOpen })} > {this.state.isDownloading ? : null}
) } }