-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuseTableData.ts
68 lines (59 loc) · 1.56 KB
/
useTableData.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import {
Resource,
urls,
useCollection,
UseCollectionResult,
useResource,
useSubject,
} from '@tomic/react';
import { useMemo, useReducer } from 'react';
import { TableSorting, DEFAULT_SORT_PROP } from './tableSorting';
const PAGE_SIZE = 30;
const DEFAULT_SORT = {
prop: DEFAULT_SORT_PROP,
sortDesc: false,
};
type UseTableDataResult = {
tableClass: Resource;
sorting: TableSorting;
setSortBy: React.Dispatch<string>;
} & UseCollectionResult;
const useTableSorting = () =>
useReducer<(state: TableSorting, property: string) => TableSorting>(
(state, property) => {
if (state.prop === property && state.sortDesc) {
return DEFAULT_SORT;
}
if (state.prop === property) {
return {
...state,
sortDesc: true,
};
}
return {
prop: property,
sortDesc: false,
};
},
DEFAULT_SORT,
);
export function useTableData(resource: Resource): UseTableDataResult {
const [sorting, setSortBy] = useTableSorting();
const [classSubject] = useSubject(resource, urls.properties.classType);
const tableClass = useResource(classSubject);
const queryFilter = useMemo(
() => ({
property: urls.properties.parent,
value: resource.getSubject(),
sort_by: sorting.prop,
sort_desc: sorting.sortDesc,
}),
[resource.getSubject(), sorting.prop, sorting.sortDesc],
);
return {
tableClass,
sorting,
setSortBy,
...useCollection(queryFilter, PAGE_SIZE),
};
}