import React from 'react' import { invoke } from '@tauri-apps/api' import { dataDir } from '@tauri-apps/api/path' import DirInput from '../common/DirInput' import Menu from './Menu' import Tr, { getLanguages, translate } from '../../../utils/language' import { setConfigOption, getConfig, getConfigOption } from '../../../utils/configuration' import Checkbox from '../common/Checkbox' import Divider from './Divider' import { getThemeList } from '../../../utils/themes' import * as server from '../../../utils/server' import './Options.css' import BigButton from '../common/BigButton' import DownloadHandler from '../../../utils/download' import * as meta from '../../../utils/metadata' interface IProps { closeFn: () => void downloadManager: DownloadHandler } interface IState { game_install_path: string grasscutter_path: string java_path: string grasscutter_with_game: boolean language_options: { [key: string]: string }[] current_language: string bg_url_or_path: string themes: string[] theme: string encryption: boolean patch_metadata: boolean use_internal_proxy: boolean swag: boolean // Swag stuff akebi_path: string migoto_path: string } export default class Options extends React.Component { constructor(props: IProps) { super(props) this.state = { game_install_path: '', grasscutter_path: '', java_path: '', grasscutter_with_game: false, language_options: [], current_language: 'en', bg_url_or_path: '', themes: ['default'], theme: '', encryption: false, patch_metadata: false, use_internal_proxy: false, swag: false, // Swag stuff akebi_path: '', migoto_path: '', } this.setGameExecutable = this.setGameExecutable.bind(this) this.setGrasscutterJar = this.setGrasscutterJar.bind(this) this.setJavaPath = this.setJavaPath.bind(this) this.setAkebi = this.setAkebi.bind(this) this.setMigoto = this.setMigoto.bind(this) this.toggleGrasscutterWithGame = this.toggleGrasscutterWithGame.bind(this) this.setCustomBackground = this.setCustomBackground.bind(this) this.toggleEncryption = this.toggleEncryption.bind(this) this.restoreMetadata = this.restoreMetadata.bind(this) this.toggleMetadata = this.toggleMetadata.bind(this) this.toggleProxy = this.toggleProxy.bind(this) } async componentDidMount() { const config = await getConfig() const languages = await getLanguages() // Remove jar from path const path = config.grasscutter_path.replace(/\\/g, '/') const folderPath = path.substring(0, path.lastIndexOf('/')) const encEnabled = await server.encryptionEnabled(folderPath + '/config.json') this.setState({ game_install_path: config.game_install_path || '', grasscutter_path: config.grasscutter_path || '', java_path: config.java_path || '', grasscutter_with_game: config.grasscutter_with_game || false, language_options: languages, current_language: config.language || 'en', bg_url_or_path: config.customBackground || '', themes: (await getThemeList()).map((t) => t.name), theme: config.theme || 'default', encryption: await translate(encEnabled ? 'options.enabled' : 'options.disabled'), patch_metadata: config.patch_metadata || false, use_internal_proxy: config.use_internal_proxy || false, swag: config.swag_mode || false, // Swag stuff akebi_path: config.akebi_path || '', }) this.forceUpdate() } setGameExecutable(value: string) { setConfigOption('game_install_path', value) this.setState({ game_install_path: value, }) } setGrasscutterJar(value: string) { setConfigOption('grasscutter_path', value) this.setState({ grasscutter_path: value, }) } setJavaPath(value: string) { setConfigOption('java_path', value) this.setState({ java_path: value, }) } setAkebi(value: string) { setConfigOption('akebi_path', value) this.setState({ akebi_path: value, }) } setMigoto(value: string) { setConfigOption('migoto_path', value) this.setState({ migoto_path: value, }) } async setLanguage(value: string) { await setConfigOption('language', value) window.location.reload() } async setTheme(value: string) { await setConfigOption('theme', value) window.location.reload() } async toggleGrasscutterWithGame() { const changedVal = !(await getConfigOption('grasscutter_with_game')) setConfigOption('grasscutter_with_game', changedVal) this.setState({ grasscutter_with_game: changedVal, }) } async setCustomBackground(value: string) { const isUrl = /^(?:http(s)?:\/\/)/gm.test(value) if (!value) return await setConfigOption('customBackground', '') if (!isUrl) { const filename = value.replace(/\\/g, '/').split('/').pop() const localBgPath = ((await dataDir()) as string).replace(/\\/g, '/') await setConfigOption('customBackground', `${localBgPath}/cultivation/bg/${filename}`) // Copy the file over to the local directory await invoke('copy_file', { path: value.replace(/\\/g, '/'), newPath: `${localBgPath}cultivation/bg/`, }) window.location.reload() } else { await setConfigOption('customBackground', value) window.location.reload() } } async toggleEncryption() { const config = await getConfig() // Check if grasscutter path is set if (!config.grasscutter_path) { alert('Grasscutter not set!') return } // Remove jar from path const path = config.grasscutter_path.replace(/\\/g, '/') const folderPath = path.substring(0, path.lastIndexOf('/')) await server.toggleEncryption(folderPath + '/config.json') this.setState({ encryption: await translate( (await server.encryptionEnabled(folderPath + '/config.json')) ? 'options.enabled' : 'options.disabled' ), }) } async restoreMetadata() { console.log(this.props) await meta.restoreMetadata(this.props.downloadManager) } async installCert() { await invoke('generate_ca_files', { path: (await dataDir()) + 'cultivation', }) } async toggleMetadata() { const changedVal = !(await getConfigOption('patch_metadata')) await setConfigOption('patch_metadata', changedVal) this.setState({ patch_metadata: changedVal, }) } async toggleProxy() { const changedVal = !(await getConfigOption('use_internal_proxy')) await setConfigOption('use_internal_proxy', changedVal) this.setState({ use_internal_proxy: changedVal, }) } render() { return ( {this.state.swag && ( <> )} ) } }