// 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_ARRAY,
THEMES,
LANGUAGES,
DEFAULT_LANGUAGE,
COLORS,
DEFAULT_CODE
} from '../lib/constants'
import { getState, saveState } from '../lib/util'
class Editor extends React.Component {
/* pathname, asPath, err, req, res */
static async getInitialProps({ asPath }) {
try {
// TODO fix this hack
if (asPath.length > 30) {
const content = await api.getGist(asPath)
return { content }
}
} catch (e) {
console.log(e)
}
return {}
}
constructor(props) {
super(props)
this.state = {
background: 'rgba(171, 184, 195, 1)',
theme: THEMES.seti.id,
language: DEFAULT_LANGUAGE,
dropShadow: true,
windowControls: true,
widthAdjustment: true,
paddingVertical: '48px',
paddingHorizontal: '32px',
uploading: false,
code: props.content
}
this.save = this.save.bind(this)
this.upload = this.upload.bind(this)
this.updateCode = this.updateCode.bind(this)
}
componentDidMount() {
const state = getState(localStorage)
if (state) {
this.setState(state)
}
}
componentDidUpdate() {
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.state.code || DEFAULT_CODE}
)}
)
}
}
export default DragDropContext(HTML5Backend)(Editor)