You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
farm/src/main.jsx

101 lines
3.5 KiB
React

// Copyright 2020 Thomas Hintz
//
// This file is part of the Alpha Centauri Farming project.
//
// The Alpha Centauri Farming project is free software: you can
// redistribute it and/or modify it under the terms of the GNU General
// Public License as published by the Free Software Foundation, either
// version 3 of the License, or (at your option) any later version.
//
// The Alpha Centauri Farming project is distributed in the hope that
// it will be useful, but WITHOUT ANY WARRANTY; without even the
// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with the Alpha Centauri Farming project. If not, see
// <https://www.gnu.org/licenses/>.
require('./style.scss');
import React, { Fragment } from 'react'
import ReactDOM from 'react-dom'
import { Provider, connect } from 'react-redux'
import * as Ws from './websocket.js'
import { rootId } from './constants.js'
import App from './components/app/App.jsx'
import { initialize, handleMessage as handleMessageFarm } from './components/farm/interface.js'
import { setStartGames, startOrJoinGame } from './components/start/actions.js'
import { play } from './components/app/actions.js'
import { createStore } from 'redux'
import rootReducer from './rootReducers.js'
const store = createStore(rootReducer);
const unsubscribe = store.subscribe(() => console.log(store.getState()));
function makeDiv(id) {
const element = document.createElement('div');
element.id = id;
return element;
}
document.body.appendChild(makeDiv(rootId));
window.store = store;
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById(rootId)
);
const unsubscribeNewOrJoinGame = store.subscribe(() => {
const state = store.getState();
if (state.start.msg) {
unsubscribeNewOrJoinGame();
Ws.sendCommand(state.start.msg);
}
});
let autostart = new URL(window.location.href).searchParams.get('autostart');
function handleMessage(evt) {
const data = JSON.parse(evt.data),
type = data.event;
if (data.event === 'error') {
console.log('error:' + data.exn);
} else if (data.event === 'new-game-started') {
initialize(store, Ws.sendCommand);
Ws.setMainOnMessage(handleMessageFarm);
Ws.setSecondaryOnMessage(handleMessageFarm);
Ws.sendCommand({ type: 'init' })
store.dispatch(play());
} else if (data.event === 'start-init') {
store.dispatch(setStartGames(data.games.games));
if (autostart) {
if (data.games.games.length === 0) {
store.dispatch(startOrJoinGame({ type: 'new-game',
playerName: 'a',
checkedColor: 'green',
gameName: 'a' }));
} else {
store.dispatch(startOrJoinGame({ type: 'join-game',
playerName: 'Player ' + data.games.games[0].colors[0],
checkedColor: data.games.games[0].colors[0],
gameName: data.games.games[0].name }));
}
}
}
}
Ws.openMain('web-socket');
Ws.openSecondary('push-web-socket');
Ws.setMainOnMessage(handleMessage);
Ws.setSecondaryOnMessage(handleMessage);
Ws.setMainOnOpen(() => Ws.sendCommand({ type: 'main-init' }));