@jeremyckahn/farmhand
Version:
A farming game
39 lines (27 loc) • 1.15 kB
text/typescript
import { useMemo } from 'react'
import * as reducers from '../../game-logic/reducers/index.js'
import { FarmhandReducers } from './FarmhandReducers.js'
export const useFarmhandReducers = (setState: (updater: any) => void) => {
return useMemo(() => {
const boundReducers: Record<string, Function> = {}
Object.assign(boundReducers, reducers) // Ensure all pure reducers are accessible as fallbacks
const reducerNames = Object.getOwnPropertyNames(
FarmhandReducers.prototype
).filter(k => k !== 'constructor') as Array<keyof typeof FarmhandReducers>
for (const reducerName of reducerNames) {
const reducer = (reducers as any)[reducerName] as Function
if (typeof reducer !== 'function') continue
// Bound version triggers setState
boundReducers[reducerName as string] = (...args: any[]) => {
setState((prevState: any) => {
const nextState = reducer(prevState, ...args)
if (!nextState || nextState === prevState) {
return prevState
}
return { ...nextState }
})
}
}
return boundReducers
}, [setState])
}