import React, { FC, useRef, useEffect, useState } from "react";
import { Typography, Box } from "@mui/material";
import makeStyles from "@mui/styles/makeStyles";
const useStyles = makeStyles((theme) => ({
root: {
height: "100%",
width: "100%",
flex: 1,
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
},
iframeWrapper: {
display: "flex",
flexDirection: "column",
gap: theme.spacing(4),
},
iframe: {
border: "none",
borderRadius: theme.spacing(1),
boxShadow: theme.shadows[2],
},
}));
interface ConnectionEmbedProps {
redirectUrl: string;
onConnectionCreated?: (connection: any) => void;
onConnectionUpdated?: (connection: any) => void;
onError?: (error: any) => void;
}
const ConnectionEmbed: FC<ConnectionEmbedProps> = ({
redirectUrl,
onConnectionCreated,
onConnectionUpdated,
onError,
}) => {
const classes = useStyles();
const iframeRef = useRef<HTMLIFrameElement>(null);
const [iframeHeight, setIframeHeight] = useState(600);
useEffect(() => {
const handleMessage = (event: MessageEvent) => {
// Only process messages from datagrid-api
if (!event.data.type || !event.data.type.includes("datagrid-api")) {
return;
}
console.log("Received iframe message:", event.data);
switch (event.data.type) {
case "datagrid-api/connection-created":
console.log("Connection created:", event.data.payload);
onConnectionCreated?.(event.data.payload);
break;
case "datagrid-api/connection-updated":
console.log("Connection updated:", event.data.payload);
onConnectionUpdated?.(event.data.payload);
break;
case "datagrid-api/error":
console.error("Iframe error:", event.data.payload);
onError?.(event.data.payload);
break;
case "datagrid-api/resize":
const { height, width } = event.data.payload;
setIframeHeight(height);
console.log(`Iframe resized to: ${width}x${height}`);
break;
case "datagrid-api/content-loaded":
console.log("Iframe content loaded");
break;
default:
console.log("Unknown iframe event:", event.data.type);
}
};
window.addEventListener("message", handleMessage);
return () => {
window.removeEventListener("message", handleMessage);
};
}, [onConnectionCreated, onConnectionUpdated, onError]);
return (
<div className={classes.root}>
<div className={classes.iframeWrapper}>
<Typography variant="h6">Connect Your Service</Typography>
<iframe
className={classes.iframe}
ref={iframeRef}
src={redirectUrl}
width="400px"
height={`${iframeHeight}px`}
title="Connection Creation"
/>
</div>
</div>
);
};
export default ConnectionEmbed;