// Theirs import React from 'react' import HTML5Backend from 'react-dnd-html5-backend' import { DragDropContext } from 'react-dnd' import domtoimage from 'dom-to-image' import ReadFileDropContainer from 'dropperx' // Ours import Page from '../components/Page' import Button from '../components/Button' import Dropdown from '../components/Dropdown' import ColorPicker from '../components/ColorPicker' import Settings from '../components/Settings' import Toolbar from '../components/Toolbar' import Overlay from '../components/Overlay' import Carbon from '../components/Carbon' import api from '../lib/api' import { THEMES, THEMES_HASH, LANGUAGES, LANGUAGE_MIME_HASH, LANGUAGE_MODE_HASH, DEFAULT_LANGUAGE, DEFAULT_THEME, COLORS, DEFAULT_CODE } from '../lib/constants' import { getQueryStringState, updateQueryString } from '../lib/routing' import { getState, saveState } from '../lib/util' const removeQueryString = str => { const qI = str.indexOf('?') return qI > 0 ? str.substr(0, qI) : str } class Editor extends React.Component { static async getInitialProps({ asPath, query }) { const path = removeQueryString(asPath.split('/').pop()) const queryParams = getQueryStringState(query) const initialState = Object.keys(queryParams).length ? queryParams : null try { // TODO fix this hack if (path.length >= 19 && path.indexOf('.') === -1) { const content = await api.getGist(path) return { content, initialState } } } catch (e) { console.log(e) } return { initialState } } constructor(props) { super(props) this.state = Object.assign( { background: 'rgba(171, 184, 195, 1)', theme: DEFAULT_THEME.id, language: DEFAULT_LANGUAGE, dropShadow: true, windowControls: true, widthAdjustment: true, lineNumbers: false, paddingVertical: '48px', paddingHorizontal: '32px', uploading: false, code: props.content, _initialState: this.props.initialState }, this.props.initialState ) this.save = this.save.bind(this) this.upload = this.upload.bind(this) this.updateCode = this.updateCode.bind(this) } componentDidMount() { // Load from localStorage instead of query params if (!this.state._initialState) { const state = getState(localStorage) if (state) { this.setState(state) } } } componentDidUpdate() { updateQueryString(this.state) const s = { ...this.state } delete s.code saveState(localStorage, s) } getCarbonImage() { const node = document.getElementById('section') const config = { style: { transform: 'scale(2)', 'transform-origin': 'center' }, filter: n => n.id !== 'container-bg', width: node.offsetWidth * 2, height: node.offsetHeight * 2 } return domtoimage.toPng(node, config) } updateCode(code) { this.setState({ code }) } save() { this.getCarbonImage().then(dataUrl => { const link = document.createElement('a') link.download = 'carbon.png' link.href = dataUrl document.body.appendChild(link) link.click() link.remove() }) } upload() { this.setState({ uploading: true }) this.getCarbonImage() .then(api.tweet) .then(() => this.setState({ uploading: false })) .catch(err => { console.error(err) this.setState({ uploading: false }) }) } render() { return (
this.setState({ theme: theme.id })} /> this.setState({ language: language.mime || language.mode })} /> this.setState({ background: color })} bg={this.state.background} /> this.setState({ [key]: value })} enabled={this.state} />
this.setState({ code: file.content })}> {({ isOver, canDrop }) => ( this.updateCode(code)}> {this.state.code || DEFAULT_CODE} )}
) } } export default DragDropContext(HTML5Backend)(Editor)