Skip to content

Commit 63ce582

Browse files
committed
✨ Add debounce + remove popover on resize
1 parent 8bc0ac3 commit 63ce582

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ import { Accordion } from 'webcoreui/react'
207207
- [Input](https://github.com/Frontendland/webcoreui/tree/main/src/components/Input)
208208
- [Menu](https://github.com/Frontendland/webcoreui/tree/main/src/components/Menu)
209209
- [Modal](https://github.com/Frontendland/webcoreui/tree/main/src/components/Modal)
210+
- [Popover](https://github.com/Frontendland/webcoreui/tree/main/src/components/Popover)
210211
- [Progress](https://github.com/Frontendland/webcoreui/tree/main/src/components/Progress)
211212
- [Radio](https://github.com/Frontendland/webcoreui/tree/main/src/components/Radio)
212213
- [Rating](https://github.com/Frontendland/webcoreui/tree/main/src/components/Rating)

src/utils/debounce.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
export const debounce = (fn: any, waitFor = 100) => {
2+
let timeout: ReturnType<typeof setTimeout> | null
3+
4+
const clear = () => {
5+
if (timeout !== null) {
6+
clearTimeout(timeout)
7+
timeout = null
8+
}
9+
}
10+
11+
const debouncedFn = (...args: any[]) => {
12+
clear()
13+
14+
timeout = setTimeout(() => {
15+
fn(...args)
16+
}, waitFor)
17+
}
18+
19+
debouncedFn.cancel = () => {
20+
clear()
21+
}
22+
23+
return debouncedFn
24+
}

src/utils/popover.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { closeModal } from './modal'
2+
import { debounce } from './debounce'
23

34
type PopoverPosition = 'top'
45
| 'top-start'
@@ -161,15 +162,33 @@ export const popover = ({
161162
}, 300)
162163
}
163164

165+
const removeOnResize = debounce(() => {
166+
popoverDOM.dataset.show = ''
167+
168+
setTimeout(() => {
169+
if (!popoverDOM.dataset.show) {
170+
popoverDOM.removeAttribute('data-show')
171+
}
172+
}, 300)
173+
})
174+
175+
const observer = new ResizeObserver(() => {
176+
if (popoverDOM.dataset.show) {
177+
removeOnResize()
178+
}
179+
})
180+
164181
triggerDOM.addEventListener('click', handleOpen)
182+
observer.observe(document.body)
165183

166184
if (closeOnBlur) {
167185
document.addEventListener('click', handleClose)
168186
}
169187

170188
return {
171189
remove() {
172-
triggerDOM.removeEventListener('click', handleOpen)
190+
triggerDOM.removeEventListener('click', handleOpen);
191+
observer.disconnect()
173192

174193
if (closeOnBlur) {
175194
document.removeEventListener('click', handleClose)

0 commit comments

Comments
 (0)