// Theirs import React from 'react' import Head from 'next/head' import { withRouter } from 'next/router' import url from 'url' import morph from 'morphmorph' // Ours import { StylesheetLink, CodeMirrorLink, MetaTags } from '../components/Meta' import Carbon from '../components/Carbon' import GistContainer from '../components/GistContainer' import { DEFAULT_CODE, DEFAULT_SETTINGS } from '../lib/constants' import { getQueryStringState } from '../lib/routing' const isInIFrame = morph.get('parent.window.parent') const getParent = win => { const iFrame = isInIFrame(win) if (iFrame) { return iFrame } return win.parent } const Page = props => ( Carbon Embeds {props.children} ) class Embed extends React.Component { state = { ...DEFAULT_SETTINGS, code: DEFAULT_CODE, mounted: false, readOnly: true } handleUpdate = updates => { const { asPath = '' } = this.props.router const { query } = url.parse(asPath, true) const queryParams = getQueryStringState(query) const initialState = Object.keys(queryParams).length ? queryParams : {} this.setState( { ...initialState, ...updates, id: query.id, copyable: queryParams.copy !== false, readOnly: queryParams.readonly !== false, mounted: true }, this.postMessage ) } ref = React.createRef() postMessage = () => { getParent(window).postMessage( JSON.stringify({ // Used by embed provider src: window.location.toString(), context: 'iframe.resize', height: this.ref.current.offsetHeight }), '*' ) } updateCode = code => { this.setState({ code }, this.postMessage) getParent(window).postMessage( { id: this.state.id ? `carbon:${this.state.id}` : 'carbon', code }, '*' ) } render() { return ( {this.state.mounted && ( {this.state.code} )} ) } } export default withRouter(Embed)