@flanksource/clicky-ui
Version:
Flanksource Clicky UI — React component library built on shadcn/ui with light/dark and density theming.
43 lines (42 loc) • 1.39 kB
JavaScript
import { useState, useMemo } from "react";
function resolvePath(obj, path) {
return path.split(".").reduce((o, k) => {
if (o && typeof o === "object") return o[k];
return void 0;
}, obj);
}
function useSort(items, options = {}) {
const { defaultKey, defaultDir = "asc", resolvers } = options;
const [sort, setSort] = useState(
defaultKey ? { key: defaultKey, dir: defaultDir } : null
);
function toggle(key) {
setSort((prev) => {
if ((prev == null ? void 0 : prev.key) === key) {
return prev.dir === "asc" ? { key, dir: "desc" } : null;
}
return { key, dir: "asc" };
});
}
const sorted = useMemo(() => {
if (!items) return [];
if (!sort) return items;
const { key, dir } = sort;
const resolver = resolvers == null ? void 0 : resolvers[key];
const get = (item) => resolver ? resolver(item) : resolvePath(item, key);
return [...items].sort((a, b) => {
const av = get(a);
const bv = get(b);
if (av == null && bv == null) return 0;
if (av == null) return 1;
if (bv == null) return -1;
const cmp = typeof av === "number" && typeof bv === "number" ? av - bv : String(av).localeCompare(String(bv));
return dir === "asc" ? cmp : -cmp;
});
}, [items, sort, resolvers]);
return { sorted, sort, toggle };
}
export {
useSort
};
//# sourceMappingURL=use-sort.js.map