@spaced-out/ui-design-system
Version:
Sense UI components library
70 lines (69 loc) • 2.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useSortableEntries = useSortableEntries;
var React = _interopRequireWildcard(require("react"));
var _get = _interopRequireDefault(require("lodash/get"));
var _sortBy = _interopRequireDefault(require("lodash/sortBy"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function useSortableEntries(entries, idName, _ref) {
let {
defaultSortKey = 'id',
defaultSortDirection = 'original',
onSort,
enableInternalSorting = true
} = _ref;
const [sortKey, setSortKey] = React.useState(defaultSortKey);
const [sortDirection, setSortDirection] = React.useState(defaultSortDirection);
const getNextDirection = direction => {
switch (direction) {
case 'original':
return 'desc';
case 'asc':
return 'original';
case 'desc':
return 'asc';
default:
return 'original';
}
};
const advanceSortDirection = dir => {
const nextDirection = getNextDirection(dir);
setSortDirection(_dir => nextDirection);
return nextDirection;
};
const handleSortClick = React.useCallback(nextSortKey => {
let nextSortDirection;
if (nextSortKey === sortKey) {
nextSortDirection = advanceSortDirection(sortDirection);
} else {
setSortKey(nextSortKey);
nextSortDirection = 'desc';
}
setSortDirection(nextSortDirection);
onSort?.(nextSortKey, nextSortDirection);
}, [sortKey, sortDirection, entries]);
const sortedEntries = React.useMemo(() => {
if (!enableInternalSorting || sortDirection === 'original') {
return entries;
}
const caseInsensitiveSortFunction = entry => {
if (typeof entry[sortKey] === 'string') {
return entry[sortKey].toLowerCase();
}
return entry[sortKey];
};
const sortedAsc = (0, _sortBy.default)(entries, caseInsensitiveSortFunction);
return sortDirection === 'asc' ? sortedAsc : sortedAsc.reverse();
}, [sortDirection, sortKey, entries, enableInternalSorting]);
const sortedKeys = React.useMemo(() => sortedEntries.map(ent => (0, _get.default)(ent, idName)), [sortedEntries]);
return {
sortedEntries,
sortedKeys: sortedKeys,
sortDirection,
sortKey: sortKey,
handleSortClick: handleSortClick
};
}