Skip to content

Instantly share code, notes, and snippets.

View tomkis's full-sized avatar

Tomáš Weiss tomkis

View GitHub Profile
const changeScene = async (
{ store, commands$ }: CommandContext,
nextSceneId: number
) => {
logger.debug(`Changing scene - ${nextSceneId} requested`);
const activeScene = getActiveScene(store.getState());
const activeSceneId = getActiveSceneId(store.getState());
if (activeSceneId === nextSceneId) {
@tomkis
tomkis / react-router-redux.js
Last active January 11, 2017 03:08
react-router-redux with react-router 4.x
import React, { Component } from 'react';
import Match from 'react-router/Match';
import { connect } from 'react-redux';
import * as ActionTypes from '../constants/actionTypes';
import buildActionCreators from '../helpers/buildActionCreators';
const EMPTY_PROPS = {};
const createMountableComponent = (Cmp, routeId) => connect(
@tomkis
tomkis / main.js
Created September 2, 2016 11:32
redux-observable epic hot reloading
// main.js
import { Subject } from 'rxjs';
import { createStore, compose, applyMiddleware } from 'redux';
import pingPongReducer from './pingPongReducer';
import pingPongEpic from './pingPongEpic';
const buildEpicSubscriber = () => {
let subscription = null;
@tomkis
tomkis / redux-saga-confirmation-dialog.js
Last active March 14, 2019 15:02
Implementing confirmation dialog via redux-saga
import { select, put, take } from 'redux-saga/effects';
function* emptySaga() {}
export function* withConfirmation(text, onConfirm, onCancel = emptySaga) {
yield put({ type: 'ShowConfirmationDialog', payload: text });
const { type } = yield take([
'ConfirmationDialogConfirmed',
'ConfirmationDialogCanceled'
@tomkis
tomkis / redux-elm-routing.js
Created June 2, 2016 15:36
redux-elm with react-router
///
/// <---- rootView.js
///
import { view } from 'redux-elm';
import buildRouting from './buildRouting';
export default view(({ history }) => buildRouting(history));
import { createStore, applyMiddleware } from 'redux';
import { Observable, Subject } from 'rxjs';
const api = type => {
console.log(`calling API ${type}`);
return new Promise(res => setTimeout(() => res(), 500));
};
const actionOrder = (actions, order) => actions.every((action, index) => action.type === order[index]);
const actionPredicate = actions => filterableAction => actions.some(action => action === filterableAction.type);
import api from './path/to/api'
import { take } from 'redux-saga'
function* watchSave() {
while(true) {
const { data } = yield take('SAVE_DATA');
// Just naive example that callbacks do not propagate yield*
yield* data
.forEach(function*(record) {
@tomkis
tomkis / rxjs-saga.js
Last active May 13, 2018 14:01
rxjs-saga.js
import { createStore, applyMiddleware } from 'redux';
import { Observable, Subject } from 'rxjs';
const api = (url, fail) => {
console.log(`Loading API ${url}`);
return new Promise((res, rej) => setTimeout(() => fail ? rej(`data-${url}`) : res('SUCCESS'), 1000));
};
const customSaga = iterable =>
iterable
// Current Redux way
const view = props => (
<div>
<button onClick={props.dispatch({type: 'FOO'})}>FooBar</button>
<button onClick={props.dispatch({type: 'BAR'})}>FooBar</button>
<button onClick={props.dispatch({type: 'BAZ'})}>Baz</button>
</div>
);
const store = createStore(rootReducer);
@tomkis
tomkis / reducers-as-generators.js
Created November 20, 2015 16:18
what if your reducers were generators?
// You can defer the side-effect execution in middlewares
const sideEffect = appState => dispatch => localStorage.setItem('counter', appState);
function plainOldReducer(appState) {
return appState + 1;
}
// Composition simply work
function nestedReducer*(appState, action) {
if (action === FOO) {