// @flow import * as React from "react"; import { observable } from "mobx"; import { observer } from "mobx-react"; import styled from "styled-components"; type Props = { src?: string, border?: boolean, forwardedRef: *, width?: string, height?: string, }; @observer class Frame extends React.Component { mounted: boolean; @observable isLoaded: boolean = false; componentDidMount() { this.mounted = true; setImmediate(this.loadIframe); } componentWillUnmount() { this.mounted = false; } loadIframe = () => { if (!this.mounted) return; this.isLoaded = true; }; render() { const { border, width = "100%", height = "400px", forwardedRef, ...rest } = this.props; const Component = border ? StyledIframe : "iframe"; return ( {this.isLoaded && ( )} ); } } const Rounded = styled.div` border-radius: 3px; overflow: hidden; width: ${props => props.width}; height: ${props => props.height}; `; // This wrapper allows us to pass non-standard HTML attributes through to the DOM element // https://www.styled-components.com/docs/basics#passed-props const Iframe = props =>