refactored the IE check into useSize

This commit is contained in:
Maxwell Talbot
2022-07-14 10:36:26 +01:00
parent 49a6b1de11
commit 5be9d2f874
3 changed files with 41 additions and 43 deletions

View File

@@ -1,7 +1,4 @@
import '@testing-library/jest-dom';
import ResizeObserver from 'resize-observer-polyfill';
global.ResizeObserver = ResizeObserver;
window.IntersectionObserver = class IntersectionObserver {
readonly root: Element | null;

View File

@@ -13,7 +13,7 @@ import {
RiveState,
Dimensions,
} from '../types';
import { isIE, useWindowSize } from '../utils';
import { useSize } from '../utils';
type RiveComponentProps = {
setContainerRef: RefCallback<HTMLElement>;
@@ -89,13 +89,7 @@ export default function useRive(
// Listen to changes in the window sizes and update the bounds when changes
// occur.
const windowSize = useWindowSize();
// when the container dimensions change, we need to re evaluate our dimensions.
const [containerDimensions, setContainerDimensions] = useState<Dimensions>({
height: 0,
width: 0,
});
const size = useSize(containerRef);
const isParamsLoaded = Boolean(riveParams);
const options = getOptions(opts);
@@ -166,39 +160,17 @@ export default function useRive(
* ie does not support ResizeObservers, so we fallback to the window listener there
*/
useEffect(() => {
if (isIE() && rive) {
if (rive) {
updateBounds();
}
}, [rive, windowSize]);
const observer = useRef(
new ResizeObserver((entries) => {
setContainerDimensions(entries[entries.length - 1].contentRect);
})
);
useEffect(() => {
if (!isIE() && rive) {
updateBounds();
}
}, [rive, containerDimensions]);
useEffect(() => {
if (!isIE() && containerRef.current) {
observer.current.observe(containerRef.current);
}
return () => {
observer.current.disconnect();
};
}, [containerRef.current, observer]);
}, [rive, size]);
/**
* Ref callback called when the canvas element mounts and unmounts.
*/
const setCanvasRef: RefCallback<HTMLCanvasElement> = useCallback(
(canvas: HTMLCanvasElement | null) => {
if (canvas && riveParams) {
if (canvas && riveParams && isParamsLoaded) {
const { useOffscreenRenderer } = options;
const r = new Rive({
useOffscreenRenderer,

View File

@@ -1,26 +1,55 @@
import { useState, useEffect } from 'react';
import React, { useState, useEffect, useRef } from 'react';
import { Dimensions } from './types';
import ResizeObserver from 'resize-observer-polyfill';
export function useWindowSize() {
const [windowSize, setWindowSize] = useState<Dimensions>({
export function useSize(
containerRef: React.MutableRefObject<HTMLElement | null>
) {
const [size, setSize] = useState<Dimensions>({
width: 0,
height: 0,
});
// internet explorer does not support ResizeObservers.
useEffect(() => {
if (typeof window !== 'undefined') {
const handleResize = () => {
setWindowSize({
setSize({
width: window.innerWidth,
height: window.innerHeight,
});
};
window.addEventListener('resize', handleResize);
handleResize();
if (isIE()) {
// only listen to window when its IE, as ResizeObserver will be polyfilled.
window.addEventListener('resize', handleResize);
handleResize();
}
return () => window.removeEventListener('resize', handleResize);
}
}, []);
return windowSize;
const observer = useRef(
new ResizeObserver((entries) => {
setSize({
width: entries[entries.length - 1].contentRect.width,
height: entries[entries.length - 1].contentRect.height,
});
})
);
useEffect(() => {
const current = observer.current;
if (containerRef.current) {
current.observe(containerRef.current);
}
return () => {
current.disconnect();
};
}, [containerRef, observer]);
return size;
}
// grabbed from: https://stackoverflow.com/questions/19999388/check-if-user-is-using-ie