Skip to content

Commit

Permalink
Export useOrderedRows hook
Browse files Browse the repository at this point in the history
  • Loading branch information
acelaya committed Apr 17, 2024
1 parent 21ceb38 commit 385bb76
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 32 deletions.
7 changes: 1 addition & 6 deletions src/components/data/DataTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useCallback, useContext, useEffect, useMemo } from 'preact/hooks';
import { useArrowKeyNavigation } from '../../hooks/use-arrow-key-navigation';
import { useStableCallback } from '../../hooks/use-stable-callback';
import { useSyncedRef } from '../../hooks/use-synced-ref';
import type { CompositeProps } from '../../types';
import type { CompositeProps, Order } from '../../types';
import { downcastRef } from '../../util/typing';
import { ArrowDownIcon, ArrowUpIcon, SpinnerSpokesIcon } from '../icons';
import { Button } from '../input';
Expand All @@ -22,11 +22,6 @@ export type TableColumn<Field> = {
classes?: string;
};

export type Order<Field> = {
field: Field;
direction: 'ascending' | 'descending';
};

type ComponentProps<Row> = {
rows: Row[];
columns: TableColumn<keyof Row>[];
Expand Down
23 changes: 23 additions & 0 deletions src/hooks/use-ordered-rows.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { useMemo } from 'preact/hooks';

import type { Order } from '../types';

export function useOrderedRows<Row>(rows: Row[], order?: Order<keyof Row>) {
return useMemo(() => {
if (!order) {
return rows;
}

return [...rows].sort((a, b) => {
if (a[order.field] === b[order.field]) {
return 0;
}

if (order.direction === 'ascending') {
return a[order.field] > b[order.field] ? 1 : -1;
}

return a[order.field] > b[order.field] ? -1 : 1;
});
}, [order, rows]);
}
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export { useArrowKeyNavigation } from './hooks/use-arrow-key-navigation';
export { useClickAway } from './hooks/use-click-away';
export { useFocusAway } from './hooks/use-focus-away';
export { useKeyPress } from './hooks/use-key-press';
export { useOrderedRows } from './hooks/use-ordered-rows';
export { useStableCallback } from './hooks/use-stable-callback';
export { useSyncedRef } from './hooks/use-synced-ref';
export { useToastMessages } from './hooks/use-toast-messages';
Expand Down Expand Up @@ -74,6 +75,7 @@ export type {
BaseProps,
CompositeProps,
IconComponent,
Order,
PresentationalProps,
TransitionComponent,
} from './types';
Expand Down
30 changes: 4 additions & 26 deletions src/pattern-library/components/patterns/data/DataTablePage.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { useCallback, useMemo, useRef, useState } from 'preact/hooks';
import { useCallback, useRef, useState } from 'preact/hooks';

import { Button, DataTable, type DataTableProps, Scroll } from '../../../../';
import type { Order } from '../../../../components/data/DataTable';
import { Button, DataTable, Scroll } from '../../../../';
import type { DataTableProps, Order } from '../../../../';
import { useOrderedRows } from '../../../../hooks/use-ordered-rows';
import Library from '../../Library';
import { nabokovNovels } from '../samples';
import type { NabokovNovel } from '../samples';
Expand All @@ -15,29 +16,6 @@ const nabokovColumns = [

type SimpleNabokovNovel = Omit<NabokovNovel, 'translatedTitle'>;

function useOrderedRows(
rows: SimpleNabokovNovel[],
order?: Order<keyof SimpleNabokovNovel>,
) {
return useMemo(() => {
if (!order) {
return rows;
}

return [...rows].sort((a, b) => {
if (a[order.field] === b[order.field]) {
return 0;
}

if (order.direction === 'ascending') {
return a[order.field] > b[order.field] ? 1 : -1;
}

return a[order.field] > b[order.field] ? -1 : 1;
});
}, [order, rows]);
}

function ClientOrderableDataTable({
rows,
// By default, all columns are orderable
Expand Down
5 changes: 5 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,8 @@ export type TransitionComponent = FunctionComponent<{
direction?: 'in' | 'out';
onTransitionEnd?: (direction: 'in' | 'out') => void;
}>;

export type Order<Field> = {
field: Field;
direction: 'ascending' | 'descending';
};

0 comments on commit 385bb76

Please sign in to comment.