mirror of https://github.com/sgoudham/carbon.git
init
commit
4914df7531
@ -0,0 +1,3 @@
|
|||||||
|
node_modules
|
||||||
|
.env
|
||||||
|
.next
|
@ -0,0 +1,31 @@
|
|||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
uploadImage
|
||||||
|
}
|
||||||
|
|
||||||
|
async function uploadImage (encodedImage) {
|
||||||
|
// upload image
|
||||||
|
const url = 'https://api.imgur.com/3/image'
|
||||||
|
|
||||||
|
const data = new FormData()
|
||||||
|
data.append('image', encodedImage)
|
||||||
|
data.append('type', 'base64')
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
headers: {
|
||||||
|
Authorization: ` Client-ID 87cc98dcdabcbb3`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await axios.post(url, data, config)
|
||||||
|
|
||||||
|
console.log('success! ')
|
||||||
|
console.log(Object.keys(result.data))
|
||||||
|
console.log(result.data)
|
||||||
|
} catch (e) {
|
||||||
|
console.log('bummer man')
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import domtoimage from 'dom-to-image'
|
||||||
|
|
||||||
|
const padding = '50px 50px'
|
||||||
|
|
||||||
|
class CodeImage extends React.Component {
|
||||||
|
constructor () {
|
||||||
|
super()
|
||||||
|
this.save = this.save.bind(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
save () {
|
||||||
|
// save
|
||||||
|
domtoimage.toJpeg(this.container)
|
||||||
|
.then((dataUrl) => {
|
||||||
|
const link = document.createElement('a')
|
||||||
|
link.download = 'my-image-name.jpeg'
|
||||||
|
link.href = dataUrl
|
||||||
|
link.click()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div id='section'>
|
||||||
|
<div id='container' ref={(container) => { this.container = container }}>
|
||||||
|
<pre>
|
||||||
|
<code onClick={this.save}>
|
||||||
|
{this.props.children}
|
||||||
|
</code>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
<style jsx>{`
|
||||||
|
#section {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
#container {
|
||||||
|
background: green;
|
||||||
|
padding: ${padding};
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
background: white;
|
||||||
|
padding: 10px;
|
||||||
|
box-shadow: 10px 10px 12px -5px rgba(0,0,0,0.17);
|
||||||
|
}
|
||||||
|
`}</style>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CodeImage
|
@ -0,0 +1,43 @@
|
|||||||
|
const FormData = require('form-data')
|
||||||
|
const axios = require('axios')
|
||||||
|
|
||||||
|
module.exports = async (req, res) => {
|
||||||
|
// validate input
|
||||||
|
if (!req.body.image || typeof req.body.image !== 'string') {
|
||||||
|
const error = {
|
||||||
|
code: 1,
|
||||||
|
title: 'no image provided',
|
||||||
|
detail: '\'image\' key must be set to a base64 encoded image'
|
||||||
|
}
|
||||||
|
res.status(400).json({ errors: [error] })
|
||||||
|
}
|
||||||
|
|
||||||
|
const image = req.body.image
|
||||||
|
|
||||||
|
// upload image
|
||||||
|
const url = 'https://api.imgur.com/3/image'
|
||||||
|
|
||||||
|
const data = new FormData()
|
||||||
|
data.append('image', image)
|
||||||
|
data.append('type', 'base64')
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
headers: {
|
||||||
|
Authorization: ` Client-ID ${process.env.IMGUR_ID}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await axios.post(url, data, config)
|
||||||
|
|
||||||
|
if (!result.link) {
|
||||||
|
throw new Error('imgur failed to provide a link')
|
||||||
|
}
|
||||||
|
|
||||||
|
res.status(200).json({ data: { link: result.link } })
|
||||||
|
} catch (e) {
|
||||||
|
console.log(Object.keys(e.response))
|
||||||
|
const error = { code: 2, title: 'error uploading to imgur' }
|
||||||
|
res.status(500).json({ errors: [error] })
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "code-image-2",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "index.js",
|
||||||
|
"license": "MIT",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "node server.js",
|
||||||
|
"next": "next"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"axios": "^0.16.2",
|
||||||
|
"body-parser": "^1.17.2",
|
||||||
|
"dom-to-image": "^2.5.2",
|
||||||
|
"express": "^4.15.3",
|
||||||
|
"form-data": "^2.2.0",
|
||||||
|
"morgan": "^1.8.2",
|
||||||
|
"next": "^2.4.3",
|
||||||
|
"react": "^15.5.4",
|
||||||
|
"react-dom": "^15.5.4"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import Axios from 'axios'
|
||||||
|
|
||||||
|
import CodeImage from '../components/codeImage'
|
||||||
|
import api from '../api'
|
||||||
|
|
||||||
|
const code = `
|
||||||
|
const pluckDeep = key => obj => key.split('.').reduce((accum, key) => accum[key], obj)
|
||||||
|
|
||||||
|
const compose = (...fns) => res => fns.reduce((accum, next) => next(accum), res)
|
||||||
|
|
||||||
|
const unfold = (f, seed) => {
|
||||||
|
const go = (f, seed, acc) => {
|
||||||
|
const res = f(seed)
|
||||||
|
return res ? go(f, res[1], acc.concat([res[0]])) : acc
|
||||||
|
}
|
||||||
|
return go(f, seed, [])
|
||||||
|
}`
|
||||||
|
|
||||||
|
export default (props) => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<style jsx>{`
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
</style>
|
||||||
|
<h1> Welcome to Code Image</h1>
|
||||||
|
<CodeImage>
|
||||||
|
{code}
|
||||||
|
</CodeImage>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
const express = require('express')
|
||||||
|
const morgan = require('morgan')
|
||||||
|
const bodyParser = require('body-parser')
|
||||||
|
const next = require('next')
|
||||||
|
|
||||||
|
const dev = process.env.NODE_ENV !== 'production'
|
||||||
|
const app = next({ dev })
|
||||||
|
const handle = app.getRequestHandler()
|
||||||
|
|
||||||
|
function wrap (handler) {
|
||||||
|
return (req, res) => handler(req, res).catch((err) => {
|
||||||
|
console.log('error handler triggereedddd')
|
||||||
|
console.log(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
app.prepare()
|
||||||
|
.then(() => {
|
||||||
|
const server = express()
|
||||||
|
|
||||||
|
server.use(morgan('tiny'))
|
||||||
|
|
||||||
|
// if root, render webpage from next
|
||||||
|
server.get('/', (req, res) => {
|
||||||
|
return app.render(req, res, '/', req.query)
|
||||||
|
})
|
||||||
|
|
||||||
|
// api endpoints
|
||||||
|
server.post('/upload', bodyParser.json(), wrap(require('./handlers/upload')))
|
||||||
|
|
||||||
|
// otherwise, try and get gist
|
||||||
|
server.get('*', (req, res) => {
|
||||||
|
return handle(req, res)
|
||||||
|
})
|
||||||
|
|
||||||
|
server.listen(3000, (err) => {
|
||||||
|
if (err) throw err
|
||||||
|
console.log('> Ready on http://localhost:3000')
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue