Created
July 16, 2020 18:24
-
-
Save jeffellis/6b0b3bcddc4ddfd189b0a24b12ada1df to your computer and use it in GitHub Desktop.
React hook for using a single ResizeObserver for multiple subscriptions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import React from 'react'; | |
import ResizeObserver from 'resize-observer-polyfill'; | |
let resizeObserver; | |
const subscriptions = {}; | |
const onResizeCallback = elements => { | |
elements.forEach(element => { | |
const id = element.target.id; | |
const callback = subscriptions[id] && subscriptions[id].callback; | |
callback && callback(element); | |
}); | |
}; | |
const getResizeObserver = () => { | |
if (!resizeObserver) { | |
resizeObserver = new ResizeObserver(onResizeCallback); | |
} | |
return resizeObserver; | |
}; | |
const observe = (element, callback) => { | |
if (!element.id) { | |
console.error( | |
'useResizeObserver: supplied element must have a unique id ', | |
element, | |
); | |
return; | |
} | |
getResizeObserver().observe(element); | |
subscriptions[element.id] = { | |
callback, | |
element, | |
}; | |
}; | |
const unobserve = element => { | |
getResizeObserver().unobserve(element); | |
delete subscriptions[element.id]; | |
}; | |
const useResizeObserver = () => { | |
return [observe, unobserve]; | |
}; | |
export default useResizeObserver; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment