Skip to content

Instantly share code, notes, and snippets.

@theKashey
Created August 17, 2020 06:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save theKashey/3bafab7d8fd36f0ec6ff31d8a2c93b14 to your computer and use it in GitHub Desktop.
Save theKashey/3bafab7d8fd36f0ec6ff31d8a2c93b14 to your computer and use it in GitHub Desktop.
import { useState, useEffect } from 'react';
type UseResizeObserverCallback = (ref: Element) => void;
type ResizeObserverCallback = (
entries: IResizeObserverEntry[],
observer: ResizeObserver,
) => void;
interface IResizeObserverEntry {
readonly target: Element;
}
declare class ResizeObserver {
constructor(callback: ResizeObserverCallback);
observe: (target: Element) => void;
unobserve: (target: Element) => void;
}
export const useResizeObserver = !(window as any).ResizeObserver
? (ref: Element | null, cb: UseResizeObserverCallback) => {
useEffect(() => {
if (ref) {
cb(ref);
}
}, [cb, ref]);
}
: (ref: Element | null, cb: UseResizeObserverCallback) => {
const [observer] = useState(
() => new ResizeObserver(entries => cb(entries[0].target)),
);
useEffect(() => {
if (ref) {
observer.observe(ref);
return () => observer.unobserve(ref);
}
return () => null;
}, [observer, ref]);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment