Skip to content

Instantly share code, notes, and snippets.

View aigoncharov's full-sized avatar

Andrey Goncharov aigoncharov

View GitHub Profile
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
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 makeSelectorCatNames = () =>
createSelector(
(state) => state.cats.data,
(cats) => cats.data.reduce((accum, { name }) => `${accum} ${name}`, ''),
)
const selectorCatsData = (state) => state.cats.data
const selectorCatsLoading = (state) => state.cats.loading
const makeSelectorCatsData = () =>
createSelector(
(state) => state.cats.data,
(cats) => cats,
)
const makeSelectorCatsLoading = () =>
createSelector(
(state) => state.cats.loading,
(loading) => loading,
)
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 })
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,
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 GlobalErrorInit extends ActionStandard {}
class GlobalErrorClear extends ActionStandard {}
const reducerError = createReducer(undefined, {
[GlobalErrorInit.type]: (state, action) => action.payload,
[GlobalErrorClear.type]: (state, action) => undefined,
})
class ActionStandard {
get static type () {
return `prefix/${this.name}`
}
constructor(payload) {
this.type = this.constructor.type
this.payload = payload
this.error = payload instanceof Error
}
}