From 347877687301ec43367105a7f8c49fe16129fc00 Mon Sep 17 00:00:00 2001 From: jbion Date: Sun, 5 May 2019 11:22:58 +0200 Subject: Convert redux sagas to TypeScript --- frontend/src/sagas/gameBrowser.ts | 55 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 frontend/src/sagas/gameBrowser.ts (limited to 'frontend/src/sagas/gameBrowser.ts') diff --git a/frontend/src/sagas/gameBrowser.ts b/frontend/src/sagas/gameBrowser.ts new file mode 100644 index 00000000..868ec471 --- /dev/null +++ b/frontend/src/sagas/gameBrowser.ts @@ -0,0 +1,55 @@ +import { push } from 'react-router-redux'; +import { eventChannel, SagaIterator } from 'redux-saga'; +import { all, apply, call, put, take } from 'redux-saga/effects'; +import { ApiLobby } from '../api/model'; +import { SevenWondersSession } from '../api/sevenWondersApi'; +import { actions as gameActions, REQUEST_CREATE_GAME, REQUEST_JOIN_GAME } from '../redux/actions/lobby'; + +function* watchGames(session: SevenWondersSession): any { + const gamesChannel = yield eventChannel(session.watchGames()); + try { + while (true) { + const gameList = yield take(gamesChannel); + yield put(gameActions.updateGames(gameList)); + } + } finally { + yield apply(gamesChannel, gamesChannel.close); + } +} + +function* watchLobbyJoined(session: SevenWondersSession): any { + const joinedLobbyChannel = yield eventChannel(session.watchLobbyJoined()); + try { + const joinedLobby: ApiLobby = yield take(joinedLobbyChannel); + yield put(gameActions.updateGames([joinedLobby])); + yield put(gameActions.enterLobby(joinedLobby.id)); + yield put(push(`/lobby/${joinedLobby.id}`)); + } finally { + yield apply(joinedLobbyChannel, joinedLobbyChannel.close); + } +} + +function* createGame(session: SevenWondersSession): SagaIterator { + while (true) { + const { gameName } = yield take(REQUEST_CREATE_GAME); + // $FlowFixMe + yield apply(session, session.createGame, [gameName]); + } +} + +function* joinGame(session: SevenWondersSession): SagaIterator { + while (true) { + const { gameId } = yield take(REQUEST_JOIN_GAME); + // $FlowFixMe + yield apply(session, session.joinGame, [gameId]); + } +} + +export function* gameBrowserSaga(session: SevenWondersSession): SagaIterator { + yield all([ + call(watchGames, session), + call(watchLobbyJoined, session), + call(createGame, session), + call(joinGame, session), + ]); +} -- cgit