aboutsummaryrefslogtreecommitdiffstats
path: root/src/utils/hooks/use-mutation-observer/use-mutation-observer.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/hooks/use-mutation-observer/use-mutation-observer.ts')
-rw-r--r--src/utils/hooks/use-mutation-observer/use-mutation-observer.ts35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/utils/hooks/use-mutation-observer/use-mutation-observer.ts b/src/utils/hooks/use-mutation-observer/use-mutation-observer.ts
new file mode 100644
index 0000000..6043055
--- /dev/null
+++ b/src/utils/hooks/use-mutation-observer/use-mutation-observer.ts
@@ -0,0 +1,35 @@
+import { type RefObject, useEffect } from 'react';
+import type { Nullable } from '../../../types';
+
+type UseMutationObserverProps<T extends Nullable<HTMLElement>> = {
+ /**
+ * A callback to execute when mutations are observed.
+ */
+ callback: MutationCallback;
+ /**
+ * The options passed to mutation observer.
+ */
+ options: MutationObserverInit;
+ /**
+ * A reference to the DOM node to observe.
+ */
+ ref: RefObject<T>;
+};
+
+export const useMutationObserver = <T extends Nullable<HTMLElement>>({
+ callback,
+ options,
+ ref,
+}: UseMutationObserverProps<T>) => {
+ useEffect(() => {
+ if (!ref.current) return undefined;
+
+ const observer = new MutationObserver(callback);
+
+ observer.observe(ref.current, options);
+
+ return () => {
+ observer.disconnect();
+ };
+ }, [callback, options, ref]);
+};