summaryrefslogtreecommitdiff
path: root/frontend/src/sagas/game.ts
diff options
context:
space:
mode:
authorjbion <joffrey.bion@amadeus.com>2019-05-05 11:22:58 +0200
committerjbion <joffrey.bion@amadeus.com>2019-05-06 18:33:14 +0200
commit347877687301ec43367105a7f8c49fe16129fc00 (patch)
tree4999cf1978527658f70a21ce59d5f5d08a7169fd /frontend/src/sagas/game.ts
parentConvert reducers to typescript (diff)
downloadseven-wonders-347877687301ec43367105a7f8c49fe16129fc00.tar.gz
seven-wonders-347877687301ec43367105a7f8c49fe16129fc00.tar.bz2
seven-wonders-347877687301ec43367105a7f8c49fe16129fc00.zip
Convert redux sagas to TypeScript
Diffstat (limited to 'frontend/src/sagas/game.ts')
-rw-r--r--frontend/src/sagas/game.ts81
1 files changed, 81 insertions, 0 deletions
diff --git a/frontend/src/sagas/game.ts b/frontend/src/sagas/game.ts
new file mode 100644
index 00000000..a60ab2d3
--- /dev/null
+++ b/frontend/src/sagas/game.ts
@@ -0,0 +1,81 @@
+import { eventChannel, SagaIterator } from 'redux-saga';
+import { apply, call, put, take } from 'redux-saga/effects';
+import { ApiPlayerTurnInfo, ApiPreparedCard, ApiTable } from '../api/model';
+import { SevenWondersSession } from '../api/sevenWondersApi';
+import { actions, REQUEST_PREPARE_MOVE, REQUEST_SAY_READY } from '../redux/actions/game';
+import { ENTER_GAME } from '../redux/actions/lobby';
+
+function* watchPlayerReady(session: SevenWondersSession, gameId: number) {
+ const channel = yield eventChannel(session.watchPlayerReady(gameId));
+ try {
+ while (true) {
+ const username = yield take(channel);
+ yield put(actions.receivePlayerReady(username));
+ }
+ } finally {
+ yield apply(channel, channel.close);
+ }
+}
+
+function* watchTableUpdates(session: SevenWondersSession, gameId: number) {
+ const channel = yield eventChannel(session.watchTableUpdates(gameId));
+ try {
+ while (true) {
+ const table: ApiTable = yield take(channel);
+ yield put(actions.receiveTableUpdate(table));
+ }
+ } finally {
+ yield apply(channel, channel.close);
+ }
+}
+
+function* watchPreparedCards(session: SevenWondersSession, gameId: number) {
+ const channel = yield eventChannel(session.watchPreparedCards(gameId));
+ try {
+ while (true) {
+ const preparedCard: ApiPreparedCard = yield take(channel);
+ yield put(actions.receivePreparedCard(preparedCard));
+ }
+ } finally {
+ yield apply(channel, channel.close);
+ }
+}
+
+function* sayReady(session: SevenWondersSession): SagaIterator {
+ while (true) {
+ yield take(REQUEST_SAY_READY);
+ yield apply(session, session.sayReady);
+ }
+}
+
+function* prepareMove(session: SevenWondersSession): SagaIterator {
+ while (true) {
+ let action = yield take(REQUEST_PREPARE_MOVE);
+ yield apply(session, session.prepareMove, [action.move]);
+ }
+}
+
+function* watchTurnInfo(session: SevenWondersSession) {
+ const channel = yield eventChannel(session.watchTurnInfo());
+ try {
+ while (true) {
+ const turnInfo: ApiPlayerTurnInfo = yield take(channel);
+ yield put(actions.receiveTurnInfo(turnInfo));
+ }
+ } finally {
+ yield apply(channel, channel.close);
+ }
+}
+
+export function* gameSaga(session: SevenWondersSession): SagaIterator {
+ const { gameId } = yield take(ENTER_GAME);
+ console.log('Entered game!', gameId);
+ yield [
+ call(watchPlayerReady, session, gameId),
+ call(watchTableUpdates, session, gameId),
+ call(watchPreparedCards, session, gameId),
+ call(sayReady, session),
+ call(prepareMove, session),
+ call(watchTurnInfo, session)
+ ];
+}
bgstack15