-
Notifications
You must be signed in to change notification settings - Fork 0
/
hooks.ts
78 lines (59 loc) · 2.02 KB
/
hooks.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
69
70
71
72
73
74
75
76
77
78
import { useCallback, useContext, useEffect, useRef } from 'react'
import { buildMenuSection } from '../../../core/buildMenuSection'
import type { PageId, SectionHighlight } from '../../../types'
import { FilterContext, TocContext } from './contexts'
const FILTER_DELAY_IN_MS = 1000
export const useSectionItems = (parentId: PageId = '', level: number = 0, highlight: SectionHighlight) => {
const { toc, filter, url, breadcrumbs } = useContext(TocContext)
const items = buildMenuSection(toc, {
url,
breadcrumbs,
parentId,
level,
highlight,
filter,
})
return { items, isFiltered: filter !== null }
}
export const useListRenderModes = () => {
const { filter } = useContext(TocContext)
const isFiltered = filter !== null
const isEmpty = isFiltered && filter.size === 0
return { isFiltered, isEmpty }
}
export const useIsFiltered = () => {
const { filter } = useContext(TocContext)
return filter !== null
}
export const useIsLoading = () => {
const { isLoading } = useContext(TocContext)
return isLoading
}
export const useFilterInput = () => {
const { isFiltering, onChange, onFilterStart, onReset } = useContext(FilterContext)
const timeout = useRef<number>(0)
/**
* Filter results should appear when the user enters the whole query.
* So waiting for FILTER_DELAY_IN_MS until the user stops typing
*/
const onChangeHandler = useCallback((value: string) => {
if (timeout.current) {
clearTimeout(timeout.current)
}
const text = value.trim()
if (text === '') {
onReset()
return
}
if (!isFiltering) {
onFilterStart()
}
timeout.current = window.setTimeout(() => {
onChange(text.trim())
}, FILTER_DELAY_IN_MS)
}, [isFiltering, onChange, onFilterStart, onReset])
useEffect(() => () => {
clearTimeout(timeout.current)
}, [])
return { onChange: onChangeHandler, isFiltering }
}