summaryrefslogtreecommitdiff
path: root/src/pages/test/client-modal.tsx
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-05-15 18:47:59 +0700
committerpolwex <polwex@sortug.com>2025-05-15 18:47:59 +0700
commit3d4b740e5a512db8fbdd934af2fbc9585fa00f0f (patch)
tree0f4fb0549c46f9cc341a72c76a4d834e417f4be4 /src/pages/test/client-modal.tsx
parent05d13b6f166eae5c2de8fe6f6038819b1b6ba1a0 (diff)
thanks gemini, very pretty
Diffstat (limited to 'src/pages/test/client-modal.tsx')
-rw-r--r--src/pages/test/client-modal.tsx59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/pages/test/client-modal.tsx b/src/pages/test/client-modal.tsx
new file mode 100644
index 0000000..293e28c
--- /dev/null
+++ b/src/pages/test/client-modal.tsx
@@ -0,0 +1,59 @@
+"use client";
+
+import { useState, ReactNode, useEffect } from "react";
+
+interface ClientModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+ children: ReactNode; // This will receive the Server Component's output
+ title?: string;
+}
+
+export default function ClientModal({
+ isOpen,
+ onClose,
+ children,
+ title = "Modal",
+}: ClientModalProps) {
+ // Optional: Prevent body scroll when modal is open
+ useEffect(() => {
+ if (isOpen) {
+ document.body.style.overflow = "hidden";
+ } else {
+ document.body.style.overflow = "unset";
+ }
+ return () => {
+ document.body.style.overflow = "unset";
+ };
+ }, [isOpen]);
+
+ if (!isOpen) {
+ return null;
+ }
+
+ return (
+ <div
+ className="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50"
+ onClick={onClose} // Close on overlay click
+ >
+ <div
+ className="p-6 bg-white rounded-lg shadow-xl w-11/12 max-w-lg"
+ onClick={(e) => e.stopPropagation()} // Prevent click from closing modal if clicking inside content
+ >
+ <div className="flex items-center justify-between mb-4">
+ <h2 className="text-xl font-semibold">{title}</h2>
+ <button
+ onClick={onClose}
+ className="text-gray-500 hover:text-gray-700"
+ aria-label="Close modal"
+ >
+ × {/* A simple 'X' close button */}
+ </button>
+ </div>
+ <div>
+ {children} {/* Server Component content will be rendered here */}
+ </div>
+ </div>
+ </div>
+ );
+}