import React from 'react'; import fs from 'fs'; import { exec } from 'child_process'; import { inject, observer } from 'mobx-react'; import { AppState, ServerType } from '../../state/AppState'; import { toast } from '../../util'; import { Modal } from '../Modal/Modal'; import './ServerList.scss'; interface Props { AppState?: AppState; } interface State { showModal: boolean; editModal: boolean; editServerIndex: number; modalTitle: string; modalServerName: string; modalRealmList: string; modalWebsiteURL: string; } @inject('AppState') @observer export class ServerList extends React.Component { constructor(props: Props) { super(props); this.state = this.defaultState; } private get defaultState(): State { return { showModal: false, editModal: false, editServerIndex: undefined, modalTitle: '', modalServerName: '', modalRealmList: '', modalWebsiteURL: '', }; } private async play(): Promise { const { directory } = this.props.AppState.selectedExpansion; if (directory === '') { toast.error('Please set your root WoW directory'); return; } try { // set the realm list await this.setRealmList(); // launch wow exec(`"${directory}/WoW.exe"`, err => { if (err) { toast.error('Unable to find WoW.exe in current directory'); } }); } catch { toast.error('Unable to find realmlist.wtf in current directory'); } } private setRealmList(): Promise { const { directory } = this.props.AppState.selectedExpansion; const { realmlist } = this.props.AppState.selectedServer; return new Promise((resolve, reject) => { fs.stat(`${directory}/realmlist.wtf`, readErr => { // return if we can't find realmlist.wtf if (readErr) { reject(readErr); return; } fs.writeFile(`${directory}/realmlist.wtf`, `set realmlist ${realmlist}`, err => { err ? reject(err) : resolve(); }); }); }); } private modalOnCancel(): void { this.setState(this.defaultState); } private modalOnDelete(): void { if (confirm('Are you sure you want to delete this server?')) { this.props.AppState.deleteServer(this.state.editServerIndex); this.setState(this.defaultState); } } private modalOnSave(): void { const { modalServerName, modalRealmList, modalWebsiteURL } = this.state; if (modalServerName === '' || modalRealmList === '' || modalWebsiteURL === '') { toast.error('All fields are required'); return; } const newServer: ServerType = { name: modalServerName, realmlist: modalRealmList, website: modalWebsiteURL, }; // edit server if (this.state.editModal) { this.props.AppState.editServer(this.state.editServerIndex, newServer); toast.success('Saved'); this.setState(this.defaultState); } else { // else add new server if (!this.props.AppState.addServer(newServer)) { toast.error('Server already exists'); } else { toast.success('Saved'); this.setState(this.defaultState); } } } private addServerClick(): void { this.setState({ showModal: true, editModal: false, modalTitle: 'New Server', }); } private editServerClick(serverIndex: number): void { const server = this.props.AppState.selectedExpansion.servers[serverIndex]; this.setState({ showModal: true, editModal: true, editServerIndex: serverIndex, modalTitle: server.name, modalServerName: server.name, modalRealmList: server.realmlist, modalWebsiteURL: server.website, }); } private renderItems(): any { const { AppState } = this.props; return this.props.AppState.selectedExpansion.servers.map((server, index) => { const selected = AppState.selectedExpansion.selectedServerIndex === index ? ' selected' : ''; return (
AppState.setSelectedServerIndex(index, true)}>
{server.name}
this.editServerClick(index)}/>
); }); } private renderModal(): any { const { showModal, editModal, modalTitle, modalServerName, modalRealmList, modalWebsiteURL } = this.state; return (
this.setState({ modalServerName: e.target.value })} />
this.setState({ modalRealmList: e.target.value })} />
this.setState({ modalWebsiteURL: e.target.value })} />
{editModal && this.modalOnDelete()}/>}
); } public render(): any { const { selectedServer } = this.props.AppState; return (
{this.renderModal()}
Servers
{this.renderItems()}
); } }