UNPKG

@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
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