From cb1b56f5a0eddbf77446f415f2beda57c8305f85 Mon Sep 17 00:00:00 2001
From: polwex <polwex@sortug.com>
Date: Sun, 23 Nov 2025 01:12:53 +0700
Subject: wut

---
 packages/prosody-ui/src/hooks/useModal.tsx | 53 ++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)
 create mode 100644 packages/prosody-ui/src/hooks/useModal.tsx

(limited to 'packages/prosody-ui/src/hooks/useModal.tsx')

diff --git a/packages/prosody-ui/src/hooks/useModal.tsx b/packages/prosody-ui/src/hooks/useModal.tsx
new file mode 100644
index 0000000..7164bcb
--- /dev/null
+++ b/packages/prosody-ui/src/hooks/useModal.tsx
@@ -0,0 +1,53 @@
+import { franc } from "franc-all";
+import React, {
+  ReactElement,
+  ReactNode,
+  useCallback,
+  useEffect,
+  useRef,
+  useState,
+} from "react";
+
+function useModal() {
+  const [achild, setChild] = useState<ReactNode>(null);
+  return <Modal close={() => setChild(null)}>{achild}</Modal>;
+}
+export default useModal;
+
+function Modal({
+  children,
+  height = "fit-content",
+  width = "80%",
+  close,
+}: {
+  children: ReactNode;
+  close: () => void;
+  width?: any;
+  height?: any;
+}) {
+  function onKey(event: any) {
+    if (event.key === "Escape") close();
+
+    useEffect(() => {
+      document.addEventListener("keyup", onKey);
+      return () => {
+        document.removeEventListener("keyup", onKey);
+      };
+    }, [children]);
+  }
+
+  function clickAway(e: React.MouseEvent) {
+    e.stopPropagation();
+    if (!modalRef.current || !modalRef.current.contains(e.target as any))
+      close();
+  }
+  const modalRef = useRef<HTMLDivElement>(null);
+  const style = { width, height };
+  return (
+    <div id="modal-bg" onClick={clickAway}>
+      <div id="modal-fg" style={style} ref={modalRef}>
+        {children}
+      </div>
+    </div>
+  );
+}
-- 
cgit v1.2.3

