@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
106 lines • 3.67 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
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; }
import "core-js/modules/web.dom-collections.iterator.js";
import React from 'react';
export function useHandleSortState(config) {
let defaults = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
direction: 'off',
modes: ['asc', 'desc', 'off']
};
const initialState = React.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.useState(initialState);
const sortHandler = React.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;
}
}
export default useHandleSortState;
//# sourceMappingURL=useHandleSortState.js.map