mirror of
https://github.com/gosticks/react-table.git
synced 2026-08-24 19:00:18 +00:00
57 lines
1.3 KiB
JavaScript
Executable File
57 lines
1.3 KiB
JavaScript
Executable File
import React from 'react'
|
|
//
|
|
import { types } from '../actions'
|
|
|
|
export const defaultState = {}
|
|
|
|
const defaultReducer = (old, newState) => newState
|
|
|
|
export const useTableState = (
|
|
initialState = {},
|
|
overrides,
|
|
{ reducer = defaultReducer, useState: userUseState = React.useState } = {}
|
|
) => {
|
|
let [state, setState] = userUseState({
|
|
...defaultState,
|
|
...initialState,
|
|
})
|
|
|
|
const overriddenState = React.useMemo(() => {
|
|
const newState = {
|
|
...state,
|
|
}
|
|
if (overrides) {
|
|
Object.keys(overrides).forEach(key => {
|
|
newState[key] = overrides[key]
|
|
})
|
|
}
|
|
return newState
|
|
}, [overrides, state])
|
|
|
|
const overriddenStateRef = React.useRef()
|
|
overriddenStateRef.current = overriddenState
|
|
|
|
const reducedSetState = React.useCallback(
|
|
(updater, type) => {
|
|
if (!types[type]) {
|
|
console.info({
|
|
stateUpdaterFn: updater,
|
|
actionType: type,
|
|
currentState: overriddenStateRef.current,
|
|
})
|
|
throw new Error('Detected an unknown table action! (Details Above)')
|
|
}
|
|
return setState(old => {
|
|
const newState = updater(old)
|
|
return reducer(old, newState, type)
|
|
})
|
|
},
|
|
[reducer, setState]
|
|
)
|
|
|
|
return React.useMemo(() => [overriddenState, reducedSetState], [
|
|
overriddenState,
|
|
reducedSetState,
|
|
])
|
|
}
|