import React, { Component } from 'react'; import Frame from 'react-frame-component'; import SyntaxHighlighter from 'react-syntax-highlighter'; import { vs2015, docco } from 'react-syntax-highlighter/dist/esm/styles/hljs'; import getBlock from './blocks'; import getIcons from './icons'; const iconList = getIcons(); const themeList = ["indigo", "orange", "teal", "red", "purple", "pink", "blue", "green"]; const desktopIcon = ( ); const phoneIcon = ( ); const tabletIcon = ( ); const clipboardIcon = ( ); const viewList = [ { icon: desktopIcon, name: 'desktop' }, { icon: tabletIcon, name: 'tablet' }, { icon: phoneIcon, name: 'phone' } ] class App extends Component { constructor(props) { super(props); this.state = { ready: false, darkMode: false, copied: false, sidebar: true, codeView: false, view: 'desktop', theme: 'indigo', blockType: 'Blog', blockName: 'BlogA', markup: '' } this.changeMode = this.changeMode.bind(this); this.changeTheme = this.changeTheme.bind(this); this.changeBlock = this.changeBlock.bind(this); this.handleContentDidMount = this.handleContentDidMount.bind(this); this.changeView = this.changeView.bind(this); this.toggleSidebar = this.toggleSidebar.bind(this); this.toggleView = this.toggleView.bind(this); this.copyToClipboard = this.copyToClipboard.bind(this); this.markupRef = React.createRef(); this.textareaRef = React.createRef(); } changeMode() { this.setState({ darkMode: !this.state.darkMode }) } handleContentDidMount() { setTimeout(() => { this.setState({ ready: true, markup: this.markupRef.current.innerHTML }) }, 400); } beautifyHTML(codeStr) { const process = (str) => { let div = document.createElement('div'); div.innerHTML = str.trim(); return format(div, 0).innerHTML.trim(); } const format = (node, level) => { let indentBefore = new Array(level++ + 1).join(' '), indentAfter = new Array(level - 1).join(' '), textNode; for (let i = 0; i < node.children.length; i++) { textNode = document.createTextNode('\n' + indentBefore); node.insertBefore(textNode, node.children[i]); format(node.children[i], level); if (node.lastElementChild === node.children[i]) { textNode = document.createTextNode('\n' + indentAfter); node.appendChild(textNode); } } return node; } return process(codeStr); } changeBlock(e) { const { currentTarget } = e; const blockType = currentTarget.getAttribute('block-type'); const blockName = currentTarget.getAttribute('block-name'); this.setState({ blockType, blockName, codeView: false }); } changeTheme(e) { const { currentTarget } = e; const theme = currentTarget.getAttribute('data-theme'); this.setState({ theme }); } changeView(e) { const { currentTarget } = e; const view = currentTarget.getAttribute('data-view'); this.setState({ view, codeView: false }); } toggleView(e) { this.setState({ codeView: !this.state.codeView, view: 'desktop', markup: this.markupRef.current.innerHTML }) } themeListRenderer() { const { theme } = this.state; return themeList.map((t, k) => ) } listRenderer() { const { blockName } = this.state; return Object.entries(iconList).map(([type, icons]) =>
{type}
{Object.entries(icons).map(icon => )}
); } viewModeRenderer() { const { view } = this.state; return viewList.map((v, k) => ); } toggleSidebar() { this.setState({ sidebar: !this.state.sidebar }); } copyToClipboard() { const code = this.beautifyHTML(this.state.markup); var input = document.createElement('textarea'); input.innerHTML = code; document.body.appendChild(input); input.select(); document.execCommand('copy'); document.body.removeChild(input); this.setState({copied: true}); setTimeout(() => { this.setState({ copied: false }) }, 2000); } render() { const { darkMode, theme, blockName, blockType, sidebar, view, copied } = this.state; return (