From 2e92417222ed9e657425120abcdfa1d1793e31ff Mon Sep 17 00:00:00 2001
From: m-tartari <37861893+m-tartari@users.noreply.github.com>
Date: Sun, 18 Feb 2024 15:15:01 +0100
Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(utils):=20add=20viewport=20uti?=
=?UTF-8?q?ls?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../utils/viewport/ViewportProvider.tsx | 21 +++++++++++++++++++
src/components/utils/viewport/index.ts | 3 +++
src/components/utils/viewport/useViewport.ts | 10 +++++++++
.../utils/viewport/viewportContext.tsx | 6 ++++++
4 files changed, 40 insertions(+)
create mode 100644 src/components/utils/viewport/ViewportProvider.tsx
create mode 100644 src/components/utils/viewport/index.ts
create mode 100644 src/components/utils/viewport/useViewport.ts
create mode 100644 src/components/utils/viewport/viewportContext.tsx
diff --git a/src/components/utils/viewport/ViewportProvider.tsx b/src/components/utils/viewport/ViewportProvider.tsx
new file mode 100644
index 0000000..a456e3c
--- /dev/null
+++ b/src/components/utils/viewport/ViewportProvider.tsx
@@ -0,0 +1,21 @@
+import React from 'react'
+
+import viewportContext from './viewportContext'
+
+const ViewportProvider = (props: { children: React.ReactNode }) => {
+ const [width, setWidth] = React.useState(window.innerWidth)
+ const [height, setHeight] = React.useState(window.innerHeight)
+ const handleWindowResize = () => {
+ setWidth(window.innerWidth)
+ setHeight(window.innerHeight)
+ }
+
+ React.useEffect(() => {
+ window.addEventListener('resize', handleWindowResize)
+ return () => window.removeEventListener('resize', handleWindowResize)
+ }, [])
+
+ return {props.children}
+}
+
+export default ViewportProvider
diff --git a/src/components/utils/viewport/index.ts b/src/components/utils/viewport/index.ts
new file mode 100644
index 0000000..e18c80f
--- /dev/null
+++ b/src/components/utils/viewport/index.ts
@@ -0,0 +1,3 @@
+export { default as viewportContext } from './viewportContext'
+export { default as ViewportProvider } from './ViewportProvider'
+export { default as useViewport } from './useViewport'
diff --git a/src/components/utils/viewport/useViewport.ts b/src/components/utils/viewport/useViewport.ts
new file mode 100644
index 0000000..5d9a0f1
--- /dev/null
+++ b/src/components/utils/viewport/useViewport.ts
@@ -0,0 +1,10 @@
+import React from 'react'
+
+import viewportContext from './viewportContext'
+
+const useViewport = () => {
+ const { width, height } = React.useContext(viewportContext)
+ return { width, height }
+}
+
+export default useViewport
diff --git a/src/components/utils/viewport/viewportContext.tsx b/src/components/utils/viewport/viewportContext.tsx
new file mode 100644
index 0000000..b77bd6f
--- /dev/null
+++ b/src/components/utils/viewport/viewportContext.tsx
@@ -0,0 +1,6 @@
+import React from 'react'
+
+type Viewport = { width: number; height: number }
+const viewportContext = React.createContext({ width: window.innerWidth, height: window.innerHeight })
+
+export default viewportContext