guesstimate/client/src/hooks/useSort.tsx

31 lines
806 B
TypeScript

import { useCallback, useEffect, useState } from "react";
export enum Direction {
ASC = 1,
DESC = -1
}
export function useKeySort<T>(items: T[], key: string, direction: Direction = Direction.ASC): T[] {
const predicate = useCallback((a: any, b: any) => {
if (!a.hasOwnProperty(key)) return -direction;
if (!b.hasOwnProperty(key)) return direction;
if (a[key] > b[key]) return direction;
if (a[key] < b[key]) return -direction;
return 0
}, [key, direction])
return useSort(items, predicate)
}
export function useSort<T>(items: T[], predicate: (a:T, b:T) => number): T[] {
const [ sorted, setSorted ] = useState(items);
useEffect(() => {
const sorted = [ ...items ]
sorted.sort(predicate)
setSorted(sorted)
}, [items, predicate])
return sorted
}