From 9b06383a296b0a211edf382304c4db733e699f57 Mon Sep 17 00:00:00 2001
From: Andrew Welker <awelker@pepperdash.com>
Date: Wed, 22 May 2024 15:25:00 -0500
Subject: [PATCH] feat: add useOverflow & useScroll hooks

---
 src/lib/shared/hooks/index.ts       |  2 ++
 src/lib/shared/hooks/useOverflow.ts | 36 +++++++++++++++++++
 src/lib/shared/hooks/useScroll.ts   | 55 +++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+)
 create mode 100644 src/lib/shared/hooks/useOverflow.ts
 create mode 100644 src/lib/shared/hooks/useScroll.ts

diff --git a/src/lib/shared/hooks/index.ts b/src/lib/shared/hooks/index.ts
index 9f9e603..0148807 100644
--- a/src/lib/shared/hooks/index.ts
+++ b/src/lib/shared/hooks/index.ts
@@ -4,3 +4,5 @@ export * from "./useGetDeviceStateFromRoomConfiguration";
 export * from "./usePressHoldRelease";
 export * from "./useRoomIBasicVolumeWithFeedback";
 export * from "./useTimeAndDate";
+export * from "./useOverflow";
+export * from "./useScroll";
\ No newline at end of file
diff --git a/src/lib/shared/hooks/useOverflow.ts b/src/lib/shared/hooks/useOverflow.ts
new file mode 100644
index 0000000..5c0fa53
--- /dev/null
+++ b/src/lib/shared/hooks/useOverflow.ts
@@ -0,0 +1,36 @@
+import { RefObject, useLayoutEffect, useState } from "react";
+
+export function useOverflow<T extends HTMLElement | undefined>(ref:RefObject<T | undefined>, callback?:(hasOverflowVertical: boolean, hasOverflowHorizontal: boolean) => void):UseIsOverflowProps {
+  const [overflowHorizontal, setOverflowHorizontal] = useState(false);
+  const [overflowVertical, setOverflowVertical] = useState(false);
+
+
+  useLayoutEffect(() => {
+    const { current } = ref;
+
+    const trigger = () => {
+      const hasOverflowVertical = current && current.scrollHeight > current.clientHeight;
+      const hasOverflowHorizontal = current && current.scrollWidth > current.clientWidth;
+
+      setOverflowVertical(hasOverflowVertical ?? false);
+      setOverflowHorizontal(hasOverflowHorizontal ?? false);
+
+      if (!callback) return;
+
+      callback(hasOverflowVertical ?? false, hasOverflowHorizontal ?? false);
+    }
+
+    if (!current) return;
+
+    trigger();
+  }, [ref, callback])
+
+  return { overflowHorizontal, overflowVertical };
+}
+
+export interface UseIsOverflowProps {
+  overflowHorizontal: boolean;
+  overflowVertical: boolean;
+}
+
+export default useOverflow;
\ No newline at end of file
diff --git a/src/lib/shared/hooks/useScroll.ts b/src/lib/shared/hooks/useScroll.ts
new file mode 100644
index 0000000..68830a5
--- /dev/null
+++ b/src/lib/shared/hooks/useScroll.ts
@@ -0,0 +1,55 @@
+import { RefObject, useLayoutEffect, useState } from "react";
+
+export function useScroll<T extends HTMLElement | undefined>(ref: RefObject<T | undefined>): UseScrollProps {  
+  
+  const [horizontalScrollPosition, setHorizontalScrollPosition] = useState(ref?.current?.scrollLeft ?? 0);
+  const [verticalScrollPosition, setVerticalScrollPosition] = useState(ref?.current?.scrollTop ?? 0);
+
+  const scrollHorizontal = (increment: number) => {
+    const { current } = ref;
+
+    if (!current) return;
+
+    console.log(current.scrollLeft);
+
+    current.scrollLeft += increment;
+
+    console.log(current.scrollLeft);
+  }
+
+  const scrollVertical = (increment: number) => {
+    const { current } = ref;
+
+    if (!current) return;
+
+    console.log(current.scrollTop);
+
+    current.scrollTop += increment;
+
+    console.log(current.scrollTop);
+  }
+
+  useLayoutEffect(() => {
+    const { current } = ref;
+
+    const trigger = () => {           
+      setHorizontalScrollPosition(current?.scrollLeft ?? 0);
+      setVerticalScrollPosition(current?.scrollTop ?? 0); 
+    }
+
+    if (!current) return;
+
+    trigger();
+  }, [ref])
+
+  return {horizontalScrollPosition, verticalScrollPosition, scrollHorizontal, scrollVertical};
+}
+
+export default useScroll;
+
+export interface UseScrollProps {
+  scrollHorizontal: (increment: number) => void;
+  scrollVertical: (increment: number) => void;
+  horizontalScrollPosition: number;
+  verticalScrollPosition: number;
+}
\ No newline at end of file