Refactor into Page component

main
Jake Dexheimer 8 years ago
parent d62bbf1a90
commit 7687ccd05d

@ -0,0 +1,27 @@
import React from 'react'
import Meta from './Meta'
import Header from './Header'
import Footer from './Footer'
export default ({ children }) => (
<div className="main">
<Meta />
<Header />
<div className="page">
{ children }
</div>
<Footer />
<style jsx>{`
.main {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
min-width: 848px;
min-height: 704px;
}
`}</style>
</div>
)

@ -0,0 +1,47 @@
import Page from '../components/Page'
import Meta from '../components/Meta'
import Header from '../components/Header'
import Footer from '../components/Footer'
export default () => (
<Page>
<div className="about">
<div className="mb4">
<h2>What does this do?</h2>
<p>You know all of those code screenshots you see on Twitter? Although the code's usually impressive, we think there's room for improvement in the aesthetic department. Carbon is the easiest way to create beautiful images of your source code. Now you can impress all of your followers with your newfound design prowess. 🎨</p>
</div>
<div className="mb4">
<h2>How do I use it?</h2>
<h4 className="mb0">Import</h4>
<p className="mt2 mb1">There are a few different ways to import code into Carbon:</p>
<ul className="mt0">
<li>Drag a file into the editor</li>
<li>Append a GitHub Gist id to the url</li>
<li>Paste your code directly</li>
</ul>
<h4>Customization</h4>
<p>Once you've got all of your code into Carbon, you can customize your image by changing the syntax theme, background color, window theme, or padding.</p>
<h4>Export/Sharing</h4>
<p>After you've customized your image, you can copy a link to the image, save it, or share it on Twitter.</p>
</div>
<div className="mb4">
<h2>I want to make this better.</h2>
<p>Please do.</p>
</div>
</div>
<style jsx>{`
p, li {
color: #777;
}
ul {
list-style-position: inside;
}
.about {
max-width: 632px;
}
`}</style>
</Page>
)

@ -0,0 +1,100 @@
import React from 'react'
import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContext } from 'react-dnd'
import Axios from 'axios'
import domtoimage from 'dom-to-image'
import Page from '../components/Page'
import ReadFileDropContainer from '../components/ReadFileDropContainer'
import Toolbar from '../components/Toolbar'
import CodeImage from '../components/CodeImage'
import api from '../lib/api'
import { THEMES, LANGUAGES, PALETTE, DEFAULT_CODE } from '../lib/constants'
class Editor extends React.Component {
/* pathname, asPath, err, req, res */
static async getInitialProps ({ asPath }) {
try {
if (asPath !== '/') {
const content = await api.getGist(asPath)
return { content }
}
} catch (e) {
console.log(e)
}
return {}
}
constructor() {
super()
this.state = {
background: '#111111',
theme: THEMES[0].id,
language: 'javascript', // TODO LANGUAGES[0]
dropShadow: false,
windowControls: true,
paddingVertical: '48px',
paddingHorizontal: '32px'
}
}
save () {
// domtoimage.toPng(document.getElementById('container'))
domtoimage.toPng(document.getElementById('container'))
.then((dataUrl) => {
const link = document.createElement('a')
link.download = 'snippet.png'
link.href = dataUrl
link.click()
})
}
upload () {
domtoimage.toBlob(document.getElementById('container'))
.then(api.uploadImage)
.then(res => res.data.id)
.then(id => `http://i.imgur.com/${id}`)
.then(console.log)
}
render () {
return (
<Page>
{/* TODO this doesn't update the render */}
<ReadFileDropContainer
onDrop={(droppedContent) => {
console.log(droppedContent)
this.setState({ droppedContent })
}}
>
<div id="editor">
<Toolbar
save={this.save}
upload={this.upload}
onBGChange={color => this.setState({ background: color })}
onThemeChange={theme => this.setState({ theme: theme.id })}
onLanguageChange={language => this.setState({ language })}
onSettingsChange={(key, value) => this.setState({ [key]: value })}
bg={this.state.background}
enabled={this.state}
/>
<CodeImage config={this.state}>
{this.state.droppedContent || this.props.content || DEFAULT_CODE}
</CodeImage>
</div>
</ReadFileDropContainer>
<style jsx>{`
#editor {
background: ${PALETTE.EDITOR_BG};
border: 3px solid ${PALETTE.SECONDARY};
border-radius: 8px;
padding: 16px;
}
`}
</style>
</Page>
)
}
}
export default DragDropContext(HTML5Backend)(Editor)

@ -1,116 +1,2 @@
import React from 'react'
import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContext } from 'react-dnd'
import Axios from 'axios'
import domtoimage from 'dom-to-image'
import ReadFileDropContainer from '../components/ReadFileDropContainer'
import Meta from '../components/Meta'
import Toolbar from '../components/Toolbar'
import { WINDOW_THEMES } from '../components/ThemeSelect'
import CodeImage from '../components/CodeImage'
import Header from '../components/Header'
import Footer from '../components/Footer'
import api from '../lib/api'
import { THEMES, LANGUAGES, PALETTE, DEFAULT_CODE } from '../lib/constants'
class Index extends React.Component {
/* pathname, asPath, err, req, res */
static async getInitialProps ({ asPath }) {
try {
if (asPath !== '/') {
const content = await api.getGist(asPath)
return { content }
}
} catch (e) {
console.log(e)
}
return {}
}
constructor() {
super()
this.state = {
background: '#ABB8C3',
theme: THEMES[0].id,
language: 'javascript', // TODO LANGUAGES[0]
windowTheme: WINDOW_THEMES[0],
dropShadow: true,
windowControls: true,
paddingVertical: '48px',
paddingHorizontal: '32px'
}
}
save () {
domtoimage.toPng(document.getElementById('container'))
.then((dataUrl) => {
const link = document.createElement('a')
link.download = 'snippet.png'
link.href = dataUrl
link.click()
})
}
upload () {
domtoimage.toBlob(document.getElementById('container'))
.then(api.uploadImage)
.then(res => res.data.id)
.then(id => `http://i.imgur.com/${id}`)
.then(console.log)
}
render () {
return (
<div className="main">
<Meta />
<Header />
{/* TODO this doesn't update the render */}
<ReadFileDropContainer
onDrop={(droppedContent) => {
console.log(droppedContent)
this.setState({ droppedContent })
}}
>
<div id="editor">
<Toolbar
save={this.save}
upload={this.upload}
onBGChange={color => this.setState({ background: color })}
onThemeChange={theme => this.setState({ theme: theme.id })}
onLanguageChange={language => this.setState({ language })}
onSettingsChange={(key, value) => this.setState({ [key]: value })}
bg={this.state.background}
enabled={this.state}
/>
<CodeImage config={this.state}>
{this.state.droppedContent || this.props.content || DEFAULT_CODE}
</CodeImage>
</div>
</ReadFileDropContainer>
<Footer />
<style jsx>{`
.main {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
height: 100vh;
min-width: 848px;
min-height: 704px;
}
#editor {
background: ${PALETTE.EDITOR_BG};
border: 3px solid ${PALETTE.SECONDARY};
border-radius: 8px;
padding: 16px;
}
`}
</style>
</div>
)
}
}
export default DragDropContext(HTML5Backend)(Index)
import Editor from './editor'
export default Editor

Loading…
Cancel
Save