import React from "react"; import BaseWidget, { WidgetState } from "widgets/BaseWidget"; import { ValidationTypes } from "constants/WidgetValidation"; import { EventType } from "constants/AppsmithActionConstants/ActionConstants"; import IframeComponent from "../component"; import { IframeWidgetProps } from "../constants"; class IframeWidget extends BaseWidget { static getPropertyPaneConfig() { return [ { sectionName: "General", children: [ { propertyName: "source", helpText: "The URL of the page to embed", label: "URL", controlType: "INPUT_TEXT", placeholderText: "https://docs.appsmith.com", isBindProperty: true, isTriggerProperty: false, validation: { type: ValidationTypes.SAFE_URL, params: { default: "https://www.example.com", }, }, }, { propertyName: "title", helpText: "Label the content of the page to embed", label: "Title", controlType: "INPUT_TEXT", placeholderText: "Documentation", 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 { 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, renderMode, source, title, widgetId, } = this.props; return ( ); } static getWidgetType(): string { return "IFRAME_WIDGET"; } } export default IframeWidget;