diff --git a/src/ui/components/menu/Downloads.tsx b/src/ui/components/menu/Downloads.tsx index a12716e..59b2057 100644 --- a/src/ui/components/menu/Downloads.tsx +++ b/src/ui/components/menu/Downloads.tsx @@ -12,6 +12,7 @@ import { getConfigOption, setConfigOption } from '../../../utils/configuration' import { invoke } from '@tauri-apps/api' import { listen } from '@tauri-apps/api/event' import HelpButton from '../common/HelpButton' +import { getVersionCache, VersionData } from '../../../utils/resources' interface IProps { closeFn: () => void; @@ -24,6 +25,7 @@ interface IState { repo_downloading: boolean grasscutter_set: boolean resources_exist: boolean + version_data: VersionData | null } export default class Downloads extends React.Component { @@ -35,7 +37,8 @@ export default class Downloads extends React.Component { resources_downloading: this.props.downloadManager.downloadingResources(), repo_downloading: this.props.downloadManager.downloadingRepo(), grasscutter_set: false, - resources_exist: false + resources_exist: false, + version_data: null } this.getGrasscutterFolder = this.getGrasscutterFolder.bind(this) @@ -49,6 +52,11 @@ export default class Downloads extends React.Component { async componentDidMount() { const gc_path = await getConfigOption('grasscutter_path') + const versionData = await getVersionCache() + + this.setState({ + version_data: versionData, + }) listen('jar_extracted', () => { this.setState({ grasscutter_set: true }, this.forceUpdate) @@ -103,7 +111,7 @@ export default class Downloads extends React.Component { async downloadGrasscutterStableRepo() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(STABLE_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', () =>{ + this.props.downloadManager.addDownload(this.state.version_data?.stable, folder + '\\grasscutter_repo.zip', () =>{ unzip(folder + '\\grasscutter_repo.zip', folder + '\\', this.toggleButtons) }) @@ -112,7 +120,7 @@ export default class Downloads extends React.Component { async downloadGrasscutterDevRepo() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(DEV_REPO_DOWNLOAD, folder + '\\grasscutter_repo.zip', () =>{ + this.props.downloadManager.addDownload(this.state.version_data?.dev, folder + '\\grasscutter_repo.zip', () =>{ unzip(folder + '\\grasscutter_repo.zip', folder + '\\', this.toggleButtons) }) @@ -121,7 +129,7 @@ export default class Downloads extends React.Component { async downloadGrasscutterStable() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(STABLE_DOWNLOAD, folder + '\\grasscutter.zip', () =>{ + this.props.downloadManager.addDownload(this.state.version_data?.stableJar, folder + '\\grasscutter.zip', () =>{ unzip(folder + '\\grasscutter.zip', folder + '\\', this.toggleButtons) }) @@ -133,7 +141,7 @@ export default class Downloads extends React.Component { async downloadGrasscutterLatest() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(DEV_DOWNLOAD, folder + '\\grasscutter.zip', () =>{ + this.props.downloadManager.addDownload(this.state.version_data?.devJar, folder + '\\grasscutter.zip', () =>{ unzip(folder + '\\grasscutter.zip', folder + '\\', this.toggleButtons) }) @@ -145,7 +153,7 @@ export default class Downloads extends React.Component { async downloadResources() { const folder = await this.getGrasscutterFolder() - this.props.downloadManager.addDownload(RESOURCES_DOWNLOAD, folder + '\\resources.zip', async () => { + this.props.downloadManager.addDownload(this.state.version_data?.resources, folder + '\\resources.zip', async () => { // Delete the existing folder if it exists if (await invoke('dir_exists', { path: folder + '\\resources' diff --git a/src/ui/components/menu/Options.tsx b/src/ui/components/menu/Options.tsx index 2ee3f92..f474952 100644 --- a/src/ui/components/menu/Options.tsx +++ b/src/ui/components/menu/Options.tsx @@ -12,6 +12,7 @@ import * as server from '../../../utils/server' import './Options.css' import BigButton from '../common/BigButton' +import { cacheLauncherResources, getVersions } from '../../../utils/resources' interface IProps { closeFn: () => void; @@ -20,6 +21,7 @@ interface IProps { interface IState { game_install_path: string grasscutter_path: string + client_version: string java_path: string grasscutter_with_game: boolean language_options: { [key: string]: string }[], @@ -41,6 +43,7 @@ export default class Options extends React.Component { this.state = { game_install_path: '', grasscutter_path: '', + client_version: '', java_path: '', grasscutter_with_game: false, language_options: [], @@ -58,6 +61,7 @@ export default class Options extends React.Component { this.setGameExec = this.setGameExec.bind(this) this.setGrasscutterJar = this.setGrasscutterJar.bind(this) this.setJavaPath = this.setJavaPath.bind(this) + this.setClientVersion = this.setClientVersion.bind(this) this.setAkebi = this.setAkebi.bind(this) this.toggleGrasscutterWithGame = this.toggleGrasscutterWithGame.bind(this) this.setCustomBackground = this.setCustomBackground.bind(this) @@ -77,6 +81,7 @@ export default class Options extends React.Component { game_install_path: config.game_install_path || '', grasscutter_path: config.grasscutter_path || '', java_path: config.java_path || '', + client_version: config.client_version || '', grasscutter_with_game: config.grasscutter_with_game || false, language_options: languages, current_language: config.language || 'en', @@ -101,6 +106,16 @@ export default class Options extends React.Component { }) } + async setClientVersion(value: string) { + setConfigOption('client_version', value) + + await cacheLauncherResources() + + this.setState({ + client_version: value + }) + } + setGrasscutterJar(value: string) { setConfigOption('grasscutter_path', value) @@ -199,6 +214,25 @@ export default class Options extends React.Component { + { this.state.swag && (