UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

115 lines (114 loc) 3.04 kB
"use client"; import _includesInstanceProperty from "core-js-pure/stable/instance/includes.js"; import { useMemo, useState } from 'react'; export function useHandleSortState(config, defaults = { direction: 'off', modes: ['asc', 'desc', 'off'] }) { const initialState = useMemo(() => { return Object.entries(config).reduce((acc, [name, opts]) => { acc[name] = { ...defaults, ...opts }; return acc; }, {}); }, [config, defaults]); const [internalState, setState] = useState(initialState); const sortHandler = useMemo(() => { const list = Object.entries(internalState); return list.reduce((acc, [name, opts]) => { acc[name] = () => { const state = { ...internalState[name] }; if (!state.active && state.lastDirection) { state.direction = state.lastDirection; state.active = true; state.lastDirection = null; } else if (!state.active && state.direction !== 'off') { state.active = true; } else { state.direction = getNextMode({ direction: state.direction, opts, defaults }); state.active = state.direction !== 'off'; } if (!state.active) { state.sortedBefore = true; } else { state.sortedBefore = undefined; } setState({ ...list.reduce((acc, [name, opts]) => { acc[name] = opts; acc[name].active = false; if (opts.direction !== 'off') { acc[name].lastDirection = opts.direction; } return acc; }, {}), [name]: state }); }; return acc; }, {}); }, [internalState]); let activeSortName = null; const sortState = Object.entries(internalState).reduce((acc, [name, { active, direction, sortedBefore }]) => { const reversed = direction === 'off' ? undefined : direction === 'desc'; if (active) { activeSortName = name; } else { active = false; } acc[name] = { active, direction, reversed }; if (sortedBefore && !active) { acc[name].sortedBefore = true; } return acc; }, {}); return { sortState, sortHandler, activeSortName }; function getNextMode({ direction, opts, defaults }) { const modes = defaults.modes.filter(mode => { var _context; return _includesInstanceProperty(_context = opts.modes).call(_context, mode); }); if (!_includesInstanceProperty(modes).call(modes, direction)) { direction = modes[0]; } let next = direction; for (let i = 0, l = modes.length; i < l; i++) { const mode = modes[i]; if (direction === mode) { let c = i + 1; if (c >= l) { c = 0; } next = modes[c]; break; } } return next; } } export default useHandleSortState; //# sourceMappingURL=useHandleSortState.js.map