feat: revamp browser dimensions store
This commit is contained in:
@@ -1,39 +1,54 @@
|
|||||||
import React, { createContext, useCallback, useContext, useState } from "react";
|
import React, { createContext, useCallback, useContext, useEffect, useState } from "react";
|
||||||
|
import { AppDimensions, getResponsiveDimensions } from "../helpers/dimensionUtils";
|
||||||
|
|
||||||
interface BrowserDimensions {
|
interface BrowserDimensionsContext extends AppDimensions {
|
||||||
width: number;
|
|
||||||
height: number;
|
|
||||||
setWidth: (newWidth: number) => void;
|
setWidth: (newWidth: number) => void;
|
||||||
};
|
updateDimensions: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
class BrowserDimensionsStore implements Partial<BrowserDimensions> {
|
const initialDimensions = getResponsiveDimensions();
|
||||||
width: number = window.innerWidth * 0.7;
|
|
||||||
height: number = window.innerHeight * 0.64;
|
|
||||||
};
|
|
||||||
|
|
||||||
const browserDimensionsStore = new BrowserDimensionsStore();
|
const browserDimensionsContext = createContext<BrowserDimensionsContext>({
|
||||||
const browserDimensionsContext = createContext<BrowserDimensions>(browserDimensionsStore as BrowserDimensions);
|
...initialDimensions,
|
||||||
|
setWidth: () => {},
|
||||||
|
updateDimensions: () => {}
|
||||||
|
});
|
||||||
|
|
||||||
export const useBrowserDimensionsStore = () => useContext(browserDimensionsContext);
|
export const useBrowserDimensionsStore = () => useContext(browserDimensionsContext);
|
||||||
|
|
||||||
export const BrowserDimensionsProvider = ({ children }: { children: JSX.Element }) => {
|
export const BrowserDimensionsProvider = ({ children }: { children: JSX.Element }) => {
|
||||||
const [width, setWidth] = useState<number>(browserDimensionsStore.width);
|
const [dimensions, setDimensions] = useState<AppDimensions>(initialDimensions);
|
||||||
const [height, setHeight] = useState<number>(browserDimensionsStore.height);
|
|
||||||
|
|
||||||
const setNewWidth = useCallback((newWidth: number) => {
|
const updateDimensions = useCallback(() => {
|
||||||
setWidth(newWidth);
|
setDimensions(getResponsiveDimensions());
|
||||||
setHeight(Math.round(newWidth / 1.6));
|
}, []);
|
||||||
}, [setWidth, setHeight]);
|
|
||||||
|
const setWidth = useCallback((newWidth: number) => {
|
||||||
|
setDimensions((prevDimensions: any) => ({
|
||||||
|
...prevDimensions,
|
||||||
|
browserWidth: newWidth,
|
||||||
|
canvasWidth: newWidth,
|
||||||
|
browserHeight: Math.round(newWidth / 1.6),
|
||||||
|
canvasHeight: Math.round(newWidth / 1.6)
|
||||||
|
}));
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
window.addEventListener('resize', updateDimensions);
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener('resize', updateDimensions);
|
||||||
|
};
|
||||||
|
}, [updateDimensions]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<browserDimensionsContext.Provider
|
<browserDimensionsContext.Provider
|
||||||
value={{
|
value={{
|
||||||
width,
|
...dimensions,
|
||||||
height,
|
setWidth,
|
||||||
setWidth: setNewWidth,
|
updateDimensions
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</browserDimensionsContext.Provider>
|
</browserDimensionsContext.Provider>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user