mirror of https://github.com/vector-im/riot-web
				
				
				
			Get the widget loading again
							parent
							
								
									cd93b2c22a
								
							
						
					
					
						commit
						fc1cbc668c
					
				| 
						 | 
					@ -54,7 +54,6 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
        this.state = this._getNewState(props);
 | 
					        this.state = this._getNewState(props);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this._onAction = this._onAction.bind(this);
 | 
					        this._onAction = this._onAction.bind(this);
 | 
				
			||||||
        this._onLoaded = this._onLoaded.bind(this);
 | 
					 | 
				
			||||||
        this._onEditClick = this._onEditClick.bind(this);
 | 
					        this._onEditClick = this._onEditClick.bind(this);
 | 
				
			||||||
        this._onDeleteClick = this._onDeleteClick.bind(this);
 | 
					        this._onDeleteClick = this._onDeleteClick.bind(this);
 | 
				
			||||||
        this._onRevokeClicked = this._onRevokeClicked.bind(this);
 | 
					        this._onRevokeClicked = this._onRevokeClicked.bind(this);
 | 
				
			||||||
| 
						 | 
					@ -67,7 +66,6 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
        this._onReloadWidgetClick = this._onReloadWidgetClick.bind(this);
 | 
					        this._onReloadWidgetClick = this._onReloadWidgetClick.bind(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this._contextMenuButton = createRef();
 | 
					        this._contextMenuButton = createRef();
 | 
				
			||||||
        this._appFrame = createRef();
 | 
					 | 
				
			||||||
        this._menu_bar = createRef();
 | 
					        this._menu_bar = createRef();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,7 +88,6 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
            initialising: true, // True while we are mangling the widget URL
 | 
					            initialising: true, // True while we are mangling the widget URL
 | 
				
			||||||
            // True while the iframe content is loading
 | 
					            // True while the iframe content is loading
 | 
				
			||||||
            loading: this.props.waitForIframeLoad && !PersistedElement.isMounted(this._persistKey),
 | 
					            loading: this.props.waitForIframeLoad && !PersistedElement.isMounted(this._persistKey),
 | 
				
			||||||
            widgetUrl: this._addWurlParams(newProps.app.url),
 | 
					 | 
				
			||||||
            // Assume that widget has permission to load if we are the user who
 | 
					            // Assume that widget has permission to load if we are the user who
 | 
				
			||||||
            // added it to the room, or if explicitly granted by the user
 | 
					            // added it to the room, or if explicitly granted by the user
 | 
				
			||||||
            hasPermissionToLoad: newProps.userId === newProps.creatorUserId || hasPermissionToLoad(),
 | 
					            hasPermissionToLoad: newProps.userId === newProps.creatorUserId || hasPermissionToLoad(),
 | 
				
			||||||
| 
						 | 
					@ -149,11 +146,18 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _startWidget() {
 | 
					    _startWidget() {
 | 
				
			||||||
        this._sgWidget.prepare().then(() => {
 | 
					        this._sgWidget.prepare().then(() => {
 | 
				
			||||||
            if (this._appFrame.current) {
 | 
					            this.setState({initialising: false});
 | 
				
			||||||
                this._sgWidget.start(this._appFrame.current);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    _iframeRefChange = (ref) => {
 | 
				
			||||||
 | 
					        this.setState({iframe: ref});
 | 
				
			||||||
 | 
					        if (ref) {
 | 
				
			||||||
 | 
					            this._sgWidget.start(ref);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            this._resetWidget(this.props);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO: [REACT-WARNING] Replace with appropriate lifecycle event
 | 
					    // TODO: [REACT-WARNING] Replace with appropriate lifecycle event
 | 
				
			||||||
    UNSAFE_componentWillReceiveProps(nextProps) { // eslint-disable-line camelcase
 | 
					    UNSAFE_componentWillReceiveProps(nextProps) { // eslint-disable-line camelcase
 | 
				
			||||||
| 
						 | 
					@ -222,14 +226,14 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
        // HACK: This is a really dirty way to ensure that Jitsi cleans up
 | 
					        // HACK: This is a really dirty way to ensure that Jitsi cleans up
 | 
				
			||||||
        // its hold on the webcam. Without this, the widget holds a media
 | 
					        // its hold on the webcam. Without this, the widget holds a media
 | 
				
			||||||
        // stream open, even after death. See https://github.com/vector-im/element-web/issues/7351
 | 
					        // stream open, even after death. See https://github.com/vector-im/element-web/issues/7351
 | 
				
			||||||
        if (this._appFrame.current) {
 | 
					        if (this.state.iframe) {
 | 
				
			||||||
            // In practice we could just do `+= ''` to trick the browser
 | 
					            // In practice we could just do `+= ''` to trick the browser
 | 
				
			||||||
            // into thinking the URL changed, however I can foresee this
 | 
					            // into thinking the URL changed, however I can foresee this
 | 
				
			||||||
            // being optimized out by a browser. Instead, we'll just point
 | 
					            // being optimized out by a browser. Instead, we'll just point
 | 
				
			||||||
            // the iframe at a page that is reasonably safe to use in the
 | 
					            // the iframe at a page that is reasonably safe to use in the
 | 
				
			||||||
            // event the iframe doesn't wink away.
 | 
					            // event the iframe doesn't wink away.
 | 
				
			||||||
            // This is relative to where the Element instance is located.
 | 
					            // This is relative to where the Element instance is located.
 | 
				
			||||||
            this._appFrame.current.src = 'about:blank';
 | 
					            this.state.iframe.src = 'about:blank';
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Delete the widget from the persisted store for good measure.
 | 
					        // Delete the widget from the persisted store for good measure.
 | 
				
			||||||
| 
						 | 
					@ -420,9 +424,9 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
        // twice from the same computer, which Jitsi can have problems with (audio echo/gain-loop).
 | 
					        // twice from the same computer, which Jitsi can have problems with (audio echo/gain-loop).
 | 
				
			||||||
        if (WidgetType.JITSI.matches(this.props.app.type) && this.props.show) {
 | 
					        if (WidgetType.JITSI.matches(this.props.app.type) && this.props.show) {
 | 
				
			||||||
            this._endWidgetActions().then(() => {
 | 
					            this._endWidgetActions().then(() => {
 | 
				
			||||||
                if (this._appFrame.current) {
 | 
					                if (this.state.iframe) {
 | 
				
			||||||
                    // Reload iframe
 | 
					                    // Reload iframe
 | 
				
			||||||
                    this._appFrame.current.src = this._sgWidget.embedUrl;
 | 
					                    this.state.iframe.src = this._sgWidget.embedUrl;
 | 
				
			||||||
                    this.setState({});
 | 
					                    this.setState({});
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
| 
						 | 
					@ -436,7 +440,7 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
    _onReloadWidgetClick() {
 | 
					    _onReloadWidgetClick() {
 | 
				
			||||||
        // Reload iframe in this way to avoid cross-origin restrictions
 | 
					        // Reload iframe in this way to avoid cross-origin restrictions
 | 
				
			||||||
        // eslint-disable-next-line no-self-assign
 | 
					        // eslint-disable-next-line no-self-assign
 | 
				
			||||||
        this._appFrame.current.src = this._appFrame.current.src;
 | 
					        this.state.iframe.src = this.state.iframe.src;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _onContextMenuClick = () => {
 | 
					    _onContextMenuClick = () => {
 | 
				
			||||||
| 
						 | 
					@ -482,7 +486,7 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
                        <AppPermission
 | 
					                        <AppPermission
 | 
				
			||||||
                            roomId={this.props.room.roomId}
 | 
					                            roomId={this.props.room.roomId}
 | 
				
			||||||
                            creatorUserId={this.props.creatorUserId}
 | 
					                            creatorUserId={this.props.creatorUserId}
 | 
				
			||||||
                            url={this.state.widgetUrl}
 | 
					                            url={this._sgWidget.embedUrl}
 | 
				
			||||||
                            isRoomEncrypted={isEncrypted}
 | 
					                            isRoomEncrypted={isEncrypted}
 | 
				
			||||||
                            onPermissionGranted={this._grantWidgetPermission}
 | 
					                            onPermissionGranted={this._grantWidgetPermission}
 | 
				
			||||||
                        />
 | 
					                        />
 | 
				
			||||||
| 
						 | 
					@ -507,11 +511,11 @@ export default class AppTile extends React.Component {
 | 
				
			||||||
                            { this.state.loading && loadingElement }
 | 
					                            { this.state.loading && loadingElement }
 | 
				
			||||||
                            <iframe
 | 
					                            <iframe
 | 
				
			||||||
                                allow={iframeFeatures}
 | 
					                                allow={iframeFeatures}
 | 
				
			||||||
                                ref={this._appFrame}
 | 
					                                ref={this._iframeRefChange}
 | 
				
			||||||
                                src={this._sgWidget.embedUrl}
 | 
					                                src={this._sgWidget.embedUrl}
 | 
				
			||||||
                                allowFullScreen={true}
 | 
					                                allowFullScreen={true}
 | 
				
			||||||
                                sandbox={sandboxFlags}
 | 
					                                sandbox={sandboxFlags}
 | 
				
			||||||
                                onLoad={this._onLoaded} />
 | 
					                            />
 | 
				
			||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
                    );
 | 
					                    );
 | 
				
			||||||
                    // if the widget would be allowed to remain on screen, we must put it in
 | 
					                    // if the widget would be allowed to remain on screen, we must put it in
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue