mirror of https://github.com/vector-im/riot-web
				
				
				
			
		
			
				
	
	
		
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
| /*
 | |
|  * 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<IProps, IState> {
 | |
|     private messaging: ClientWidgetApi;
 | |
|     private iframeRef = React.createRef<HTMLIFrameElement>();
 | |
| 
 | |
|     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});
 | |
|         });
 | |
|     }
 | |
| }
 |