UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

116 lines (115 loc) 4.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.useHandleSortState = useHandleSortState; require("core-js/modules/web.dom-collections.iterator.js"); var _react = _interopRequireDefault(require("react")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function useHandleSortState(config) { let defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { direction: 'off', modes: ['asc', 'desc', 'off'] }; const initialState = _react.default.useMemo(() => { return Object.entries(config).reduce((acc, _ref) => { let [name, opts] = _ref; acc[name] = _objectSpread(_objectSpread({}, defaults), opts); return acc; }, {}); }, [config, defaults]); const [internalState, setState] = _react.default.useState(initialState); const sortHandler = _react.default.useMemo(() => { const list = Object.entries(internalState); return list.reduce((acc, _ref2) => { let [name, opts] = _ref2; acc[name] = () => { const state = _objectSpread({}, 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'; } setState(_objectSpread(_objectSpread({}, list.reduce((acc, _ref3) => { let [name, opts] = _ref3; 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, _ref4) => { let [name, { active, direction }] = _ref4; const reversed = direction === 'off' ? undefined : direction === 'desc'; if (active) { activeSortName = name; } else { active = false; } acc[name] = { active, direction, reversed }; return acc; }, {}); return { sortState, sortHandler, activeSortName }; function getNextMode(_ref5) { let { direction, opts, defaults } = _ref5; const modes = defaults.modes.filter(mode => { return opts.modes.includes(mode); }); if (!modes.includes(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; } } var _default = exports.default = useHandleSortState; //# sourceMappingURL=useHandleSortState.js.map