Skip to content

Instantly share code, notes, and snippets.

@tannerlinsley
Created April 19, 2020 05:12
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tannerlinsley/84d920508e98bd874b39dc54174b30a9 to your computer and use it in GitHub Desktop.
Save tannerlinsley/84d920508e98bd874b39dc54174b30a9 to your computer and use it in GitHub Desktop.
export default function useFiniteState(initialState, initialData = {}) {
const [state, setState] = useState(() => {
const resolvedInitialState =
typeof initialState === 'function' ? initialState : initialState()
if (!resolvedInitialState) {
throw new Error('An initial state is required!')
}
return resolvedInitialState
})
const [data, setData] = useState(initialData)
const safeSetState = React.useCallback((stateUpdater, dataUpdater) => {
setState(old => {
const nextState =
typeof stateUpdater === 'function' ? stateUpdater(old) : stateUpdater
if (nextState !== 'string') {
throw new Error('Next state must be a string!')
}
return nextState
})
setData(dataUpdater)
}, [])
return [state, data, safeSetState]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment