index.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import ResizeObserver from 'resize-observer-polyfill'
  2. const isServer = typeof window === 'undefined'
  3. /* istanbul ignore next */
  4. function resizeHandler(entries: any[]) {
  5. for (const entry of entries) {
  6. const listeners = entry.target.__resizeListeners__ || []
  7. if (listeners.length) {
  8. listeners.forEach((fn: () => any) => {
  9. fn()
  10. })
  11. }
  12. }
  13. }
  14. /* istanbul ignore next */
  15. export function addResizeListener(element: any, fn: () => any) {
  16. if (isServer)
  17. return
  18. if (!element.__resizeListeners__) {
  19. element.__resizeListeners__ = []
  20. element.__ro__ = new ResizeObserver(resizeHandler)
  21. element.__ro__.observe(element)
  22. }
  23. element.__resizeListeners__.push(fn)
  24. }
  25. /* istanbul ignore next */
  26. export function removeResizeListener(element: any, fn: () => any) {
  27. if (!element || !element.__resizeListeners__)
  28. return
  29. element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1)
  30. if (!element.__resizeListeners__.length)
  31. element.__ro__.disconnect()
  32. }
  33. export function triggerWindowResize() {
  34. // const event = document.createEvent('HTMLEvents')
  35. // event.initEvent('resize', true, true)
  36. // ;(event as any).eventType = 'message'
  37. // window.dispatchEvent(event)
  38. const ev = new Event('message', { bubbles: true, cancelable: true })
  39. window.dispatchEvent(ev)
  40. }