/* eslint jsx-a11y/no-noninteractive-element-interactions: 0 */ import React from 'react'; import ReactDOM from 'react-dom'; import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; import CopyToClipboard from 'react-copy-to-clipboard'; import classNames from 'classnames'; import LZString from 'lz-string'; import { Icon, Tooltip } from 'antd'; import EditButton from './EditButton'; import ErrorBoundary from './ErrorBoundary'; import BrowserFrame from '../BrowserFrame'; import { ping } from '../utils'; function compress(string) { return LZString.compressToBase64(string) .replace(/\+/g, '-') // Convert '+' to '-' .replace(/\//g, '_') // Convert '/' to '_' .replace(/=+$/, ''); // Remove ending '=' } export default class Demo extends React.Component { static contextTypes = { intl: PropTypes.object, } state = { codeExpand: false, sourceCode: '', copied: false, copyTooltipVisible: false, showRiddleButton: false, }; componentWillReceiveProps(nextProps) { const { highlightedCode } = nextProps; const div = document.createElement('div'); div.innerHTML = highlightedCode[1].highlighted; this.setState({ sourceCode: div.textContent }); } shouldComponentUpdate(nextProps, nextState) { const { codeExpand, copied, copyTooltipVisible } = this.state; const { expand } = this.props; return (codeExpand || expand) !== (nextState.codeExpand || nextProps.expand) || copied !== nextState.copied || copyTooltipVisible !== nextState.copyTooltipVisible; } componentDidMount() { const { meta, location } = this.props; if (meta.id === location.hash.slice(1)) { this.anchor.click(); } this.componentWillReceiveProps(this.props); this.pingTimer = ping((status) => { if (status !== 'timeout' && status !== 'error') { this.setState({ showRiddleButton: true, }); } }); } handleCodeExpand = () => { const { codeExpand } = this.state; this.setState({ codeExpand: !codeExpand }); } saveAnchor = (anchor) => { this.anchor = anchor; } handleCodeCopied = () => { this.setState({ copied: true }); } onCopyTooltipVisibleChange = (visible) => { if (visible) { this.setState({ copyTooltipVisible: visible, copied: false, }); return; } this.setState({ copyTooltipVisible: visible, }); } render() { const { state } = this; const { props } = this; const { meta, src, content, preview, highlightedCode, style, highlightedStyle, expand, } = props; const { showRiddleButton, copied } = state; if (!this.liveDemo) { this.liveDemo = meta.iframe ?