2021-06-10 05:29:52 +00:00
|
|
|
import React, { useEffect } from "react";
|
2021-06-09 09:39:17 +00:00
|
|
|
import styled from "styled-components";
|
|
|
|
|
|
|
|
|
|
import { ComponentProps } from "components/designSystems/appsmith/BaseComponent";
|
|
|
|
|
import { hexToRgba } from "components/ads/common";
|
|
|
|
|
|
2021-06-11 13:16:29 +00:00
|
|
|
interface IframeContainerProps {
|
|
|
|
|
borderColor?: string;
|
|
|
|
|
borderOpacity?: number;
|
|
|
|
|
borderWidth?: number;
|
2021-06-09 09:39:17 +00:00
|
|
|
}
|
|
|
|
|
|
2021-06-11 13:16:29 +00:00
|
|
|
export const IframeContainer = styled.div<IframeContainerProps>`
|
|
|
|
|
iframe {
|
|
|
|
|
width: 100%;
|
|
|
|
|
height: 100%;
|
|
|
|
|
border-color: ${(props) =>
|
|
|
|
|
hexToRgba(
|
|
|
|
|
props.borderColor || props.theme.colors.border,
|
|
|
|
|
(props.borderOpacity && !isNaN(props.borderOpacity)
|
|
|
|
|
? props.borderOpacity
|
|
|
|
|
: 100) / 100,
|
|
|
|
|
)};
|
|
|
|
|
border-width: ${(props) =>
|
|
|
|
|
props.borderWidth ? Number(props.borderWidth) : 0}px;
|
|
|
|
|
}
|
2021-06-09 09:39:17 +00:00
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
export interface IframeComponentProps extends ComponentProps {
|
|
|
|
|
source: string;
|
|
|
|
|
title?: string;
|
2021-06-10 05:29:52 +00:00
|
|
|
onURLChanged: (url: string) => void;
|
|
|
|
|
onMessageReceived: (message: MessageEvent) => void;
|
2021-06-09 09:39:17 +00:00
|
|
|
borderColor?: string;
|
|
|
|
|
borderOpacity?: number;
|
|
|
|
|
borderWidth?: number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function IframeComponent(props: IframeComponentProps) {
|
2021-06-11 13:16:29 +00:00
|
|
|
const {
|
|
|
|
|
borderColor,
|
|
|
|
|
borderOpacity,
|
|
|
|
|
borderWidth,
|
|
|
|
|
onMessageReceived,
|
|
|
|
|
onURLChanged,
|
|
|
|
|
source,
|
|
|
|
|
title,
|
|
|
|
|
} = props;
|
2021-06-10 08:17:33 +00:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
// add a listener
|
|
|
|
|
window.addEventListener("message", onMessageReceived, false);
|
|
|
|
|
// clean up
|
|
|
|
|
return () =>
|
|
|
|
|
window.removeEventListener("message", onMessageReceived, false);
|
|
|
|
|
}, []);
|
|
|
|
|
|
2021-06-10 05:29:52 +00:00
|
|
|
useEffect(() => {
|
|
|
|
|
onURLChanged(source);
|
|
|
|
|
}, [source]);
|
2021-06-10 08:17:33 +00:00
|
|
|
|
2021-06-11 13:16:29 +00:00
|
|
|
return (
|
|
|
|
|
<IframeContainer
|
|
|
|
|
borderColor={borderColor}
|
|
|
|
|
borderOpacity={borderOpacity}
|
|
|
|
|
borderWidth={borderWidth}
|
|
|
|
|
>
|
|
|
|
|
<iframe src={source} title={title} />
|
|
|
|
|
</IframeContainer>
|
|
|
|
|
);
|
2021-06-09 09:39:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default IframeComponent;
|