PromucFlow_constructor/app/client/src/widgets/IframeWidget.tsx

181 lines
5.0 KiB
TypeScript
Raw Normal View History

import React from "react";
import BaseWidget, { WidgetProps, WidgetState } from "./BaseWidget";
import { WidgetType, WidgetTypes } from "constants/WidgetConstants";
import IframeComponent from "components/designSystems/blueprint/IframeComponent";
import { ValidationTypes } from "constants/WidgetValidation";
import * as Sentry from "@sentry/react";
import { EventType } from "constants/AppsmithActionConstants/ActionConstants";
import withMeta, { WithMeta } from "./MetaHOC";
class IframeWidget extends BaseWidget<IframeWidgetProps, WidgetState> {
static getPropertyPaneConfig() {
return [
{
sectionName: "General",
children: [
{
propertyName: "source",
helpText: "The URL of the page to embed",
label: "Source",
controlType: "INPUT_TEXT",
placeholderText: "Enter the URL of the page to embed",
isBindProperty: true,
isTriggerProperty: false,
validation: {
2021-07-28 06:01:09 +00:00
type: ValidationTypes.SAFE_URL,
params: {
2021-07-28 06:01:09 +00:00
default: "https://wikipedia.org",
},
},
},
{
propertyName: "title",
helpText: "Label the content of the page to embed",
label: "Title",
controlType: "INPUT_TEXT",
placeholderText: "Enter the title of the page to embed",
isBindProperty: true,
isTriggerProperty: false,
validation: { type: ValidationTypes.TEXT },
},
],
},
{
sectionName: "Actions",
children: [
{
helpText: "Triggers an action when the source URL is changed",
propertyName: "onURLChanged",
label: "onURLChanged",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
{
helpText: "Triggers an action when a message event is received",
propertyName: "onMessageReceived",
label: "onMessageReceived",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
],
},
{
sectionName: "Styles",
children: [
{
propertyName: "borderColor",
label: "Border Color",
controlType: "COLOR_PICKER",
isBindProperty: false,
isTriggerProperty: false,
},
{
propertyName: "borderOpacity",
label: "Border Opacity (%)",
controlType: "INPUT_TEXT",
isBindProperty: true,
isTriggerProperty: false,
inputType: "NUMBER",
validation: {
type: ValidationTypes.NUMBER,
params: { min: 0, max: 100, default: 100 },
},
},
{
propertyName: "borderWidth",
label: "Border Width (px)",
controlType: "INPUT_TEXT",
isBindProperty: true,
isTriggerProperty: false,
inputType: "NUMBER",
validation: {
type: ValidationTypes.NUMBER,
params: { min: 0, default: 1 },
},
},
],
},
];
}
static getMetaPropertiesMap(): Record<string, any> {
return {
message: undefined,
};
}
urlChangedHandler = (url: string) => {
if (url && this.props.onURLChanged) {
super.executeAction({
triggerPropertyName: "onURLChanged",
dynamicString: this.props.onURLChanged,
event: {
type: EventType.ON_IFRAME_URL_CHANGED,
},
});
}
};
messageReceivedHandler = (event: MessageEvent) => {
// Accept messages only from the current iframe
if (!this.props.source?.includes(event.origin)) {
return;
}
this.props.updateWidgetMetaProperty("message", event.data, {
triggerPropertyName: "onMessageReceived",
dynamicString: this.props.onMessageReceived,
event: {
type: EventType.ON_IFRAME_MESSAGE_RECEIVED,
},
});
};
getPageView() {
const {
borderColor,
borderOpacity,
borderWidth,
source,
title,
widgetId,
} = this.props;
2021-07-28 06:01:09 +00:00
return (
<IframeComponent
borderColor={borderColor}
borderOpacity={borderOpacity}
borderWidth={borderWidth}
onMessageReceived={this.messageReceivedHandler}
onURLChanged={this.urlChangedHandler}
source={source}
title={title}
widgetId={widgetId}
/>
);
}
getWidgetType(): WidgetType {
return WidgetTypes.IFRAME_WIDGET;
}
}
export interface IframeWidgetProps extends WidgetProps, WithMeta {
source: string;
title?: string;
onURLChanged?: string;
onMessageReceived?: string;
borderColor?: string;
borderOpacity?: number;
borderWidth?: number;
message?: any;
}
export default IframeWidget;
export const ProfiledIframeWidget = Sentry.withProfiler(withMeta(IframeWidget));