Skip to content

Commit 7304631

Browse files
committed
feat: add useStateFilters hook
1 parent ea65f58 commit 7304631

File tree

4 files changed

+67
-0
lines changed

4 files changed

+67
-0
lines changed

src/Common/Hooks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ export { useClickOutside } from './UseClickOutside/UseClickOutside'
33
export { useWindowSize } from './UseWindowSize/UseWindowSize'
44
export * from './useUrlFilters'
55
export * from './UseRegisterShortcut'
6+
export * from './useStateFilters'
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { default as useStateFilters } from './useStateFilters'
2+
export type { UseStateFiltersProps, UseStateFiltersReturnType } from './types'
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { UseUrlFiltersProps, UseUrlFiltersReturnType } from '../useUrlFilters'
2+
3+
export interface UseStateFiltersProps<T> extends Pick<UseUrlFiltersProps<T, never>, 'initialSortKey'> {}
4+
5+
export interface UseStateFiltersReturnType<T>
6+
extends Pick<UseUrlFiltersReturnType<T>, 'sortBy' | 'sortOrder' | 'handleSorting' | 'clearFilters'> {}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { useState } from 'react'
2+
import { SortingOrder } from '../../Constants'
3+
import { UseStateFiltersProps, UseStateFiltersReturnType } from './types'
4+
5+
/**
6+
* Generic hook for implementing state based pagination, search, sorting.
7+
* Sister method of [useUrlFilters](https://github.com/devtron-labs/devtron-fe-common-lib/blob/main/src/Common/Hooks/useUrlFilters/useUrlFilters.ts)
8+
*
9+
* The exposed handlers can be consumed directly without the need for explicit state management
10+
*
11+
* @example Usage with custom type for sort keys and initial sort key:
12+
* ```tsx
13+
* const { sortBy, sortOrder } = useUrlFilters<'email' | 'name'>({ initialSortKey: 'email' })
14+
* ```
15+
*
16+
* To be extended to be used with pagination and search as and when required
17+
*/
18+
const useStateFilters = <T = string,>({
19+
initialSortKey,
20+
}: UseStateFiltersProps<T> = {}): UseStateFiltersReturnType<T> => {
21+
const [sortingConfig, setSortingConfig] = useState({
22+
sortOrder: SortingOrder.ASC,
23+
sortBy: initialSortKey,
24+
})
25+
26+
const { sortBy, sortOrder } = sortingConfig
27+
28+
const handleSorting = (_sortBy: T) => {
29+
let order: SortingOrder
30+
31+
if (_sortBy === sortBy && sortOrder === SortingOrder.ASC) {
32+
order = SortingOrder.DESC
33+
} else {
34+
order = SortingOrder.ASC
35+
}
36+
37+
setSortingConfig(() => ({
38+
...sortingConfig,
39+
sortBy: _sortBy,
40+
sortOrder: order,
41+
}))
42+
}
43+
44+
const clearFilters = () => {
45+
setSortingConfig({
46+
sortOrder: SortingOrder.ASC,
47+
sortBy: initialSortKey,
48+
})
49+
}
50+
51+
return {
52+
...sortingConfig,
53+
handleSorting,
54+
clearFilters,
55+
}
56+
}
57+
58+
export default useStateFilters

0 commit comments

Comments
 (0)