Skip to content

Instantly share code, notes, and snippets.

View aigoncharov's full-sized avatar

Andrey Goncharov aigoncharov

View GitHub Profile
const catsGetAsync = async (dispatch) => {
dispatch(new CatsGetInit())
try {
const res = await fetch('https://cats.com/api/v1/cats')
const body = await res.json()
dispatch(new CatsGetSuccess(body))
} catch (error) {
dispatch(new CatsGetError(error))
dispatch(new GlobalErrorInit(error))
}
class CatsGetInit extends ActionStandard {}
class CatsGetSuccess extends ActionStandard {}
class CatsGetError extends ActionStandard {}
const reducerCatsLoading = createReducer(
false,
reducerLoadingMap(CatsGetInit, CatsGetSuccess, CatsGetError),
)
const reducerCatsData = createReducer(undefined, {
[CatsGetSuccess.type]: () => action.payload,
import { createSelector } from 'reselect'
const actionTypeCatsGetInit = 'CATS_GET_INIT'
const actionTypeCatsGetSuccess = 'CATS_GET_SUCCESS'
const actionTypeCatsGetError = 'CATS_GET_ERROR'
const actionCatsGetInit = () => ({ type: actionTypeCatsGetInit })
const actionCatsGetSuccess = (payload) => ({ type: actionTypeCatsGetSuccess, payload })
const actionCatsGetError = (error) => ({ type: actionTypeCatsGetError, payload: error })
const makeSelectorCatsData = () =>
createSelector(
(state) => state.cats.data,
(cats) => cats,
)
const makeSelectorCatsLoading = () =>
createSelector(
(state) => state.cats.loading,
(loading) => loading,
)
const selectorCatsData = (state) => state.cats.data
const selectorCatsLoading = (state) => state.cats.loading
const makeSelectorCatNames = () =>
createSelector(
(state) => state.cats.data,
(cats) => cats.data.reduce((accum, { name }) => `${accum} ${name}`, ''),
)
const createReducer = (initialState, reducerMap) => (
state = initialState,
action,
) => {
// Pick a reducer from the object by key
const reducer = reducerMap[action.type]
if (!reducer) {
return state
}
// Run the reducer if present
const createReducer = (initialState, reducerMap) => (
state = initialState,
action,
) => {
// Pick a reducer from the object by key
const reducer = state[action.type]
if (!reducer) {
return state
}
// Run the reducer if present
class ActionStandard {
get static type () {
return `prefix/${this.name}`
}
constructor(payload) {
return {
type: this.constructor.type,
payload,
error: payload instanceof Error
}
@aigoncharov
aigoncharov / jedi-reducer-switch-case-1.js
Last active February 11, 2019 19:01
Reducer organization - taking a step further
const actionTypeJediCreateInit = 'jedi-app/jedi-create-init'
const actionTypeJediCreateSuccess = 'jedi-app/jedi-create-success'
const actionTypeJediCreateError = 'jedi-app/jedi-create-error'
const reducerJediInitialState = {
loading: false,
// List of our jedi
data: [],
error: undefined,
}