export type OrderDir = 'ASC' | 'DESC' | undefined; export interface Order { field?: Fields; dir?: OrderDir; } export const determineOrderDir = ( currentField: T, newField?: T, currentOrderDir?: OrderDir, ): OrderDir => { if (currentField !== newField) { return 'ASC'; } const newOrderMap: Record<'ASC' | 'DESC', OrderDir> = { ASC: 'DESC', DESC: undefined, }; return currentOrderDir ? newOrderMap[currentOrderDir] : 'ASC'; }; export const sortList = (list: List[], { field, dir }: Order>) => ( !field || !dir ? list : list.sort((a, b) => { const greaterThan = dir === 'ASC' ? 1 : -1; const smallerThan = dir === 'ASC' ? -1 : 1; return a[field] > b[field] ? greaterThan : smallerThan; }) ); export const orderToString = (order: Order): string | undefined => ( order.dir ? `${order.field}-${order.dir}` : undefined ); export const stringToOrder = (order: string): Order => { const [field, dir] = order.split('-') as [T | undefined, OrderDir | undefined]; return { field, dir }; };