UNPKG

@spaced-out/ui-design-system

Version:
71 lines (70 loc) 2.98 kB
"use strict"; 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); // eslint-disable-next-line unused-imports/no-unused-vars 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, sortDirection, sortKey, handleSortClick }; }