/* * Copyright 2020 The Matrix.org Foundation C.I.C. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { ClientWidgetApi, Widget, WidgetKind } from "matrix-widget-api"; import * as React from "react"; import { Room } from "matrix-js-sdk/src/models/room"; import { WidgetMessagingStore } from "../../../stores/widgets/WidgetMessagingStore"; interface IProps { widget: Widget; kind: WidgetKind; room?: Room; // TODO: All the showUIElement props } interface IState { loading: boolean; } export default class AppTile2 extends React.PureComponent { private messaging: ClientWidgetApi; private iframeRef = React.createRef(); public constructor(props: IProps) { super(props); if (props.kind === WidgetKind.Room && !props.room) { throw new Error("Expected room when supplied with a room widget"); } this.state = { loading: true, }; } private get isMixedContent(): boolean { const myProtocol = window.location.protocol; const widgetProtocol = new URL(this.props.widget.templateUrl).protocol; return myProtocol === 'https:' && widgetProtocol !== 'https:'; } public componentDidMount() { if (!this.iframeRef.current) { throw new Error("iframe has not yet been associated - fix the render code"); } // TODO: Provide capabilities to widget messaging if (this.props.kind === WidgetKind.Room) { this.messaging = WidgetMessagingStore.instance .generateMessagingForRoomWidget(this.props.room, this.props.widget, this.iframeRef.current); } else if (this.props.kind === WidgetKind.Account) { this.messaging = WidgetMessagingStore.instance .generateMessagingForAccountWidget(this.props.widget, this.iframeRef.current); } else { throw new Error("Unexpected widget kind: " + this.props.kind); } this.messaging.once("ready", () => { this.setState({loading: false}); }); } }