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.
101 lines
3.5 KiB
React
101 lines
3.5 KiB
React
5 years ago
|
// 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' }));
|