var React = require('react')
, cx = require('classnames')
, PT = React.PropTypes
, classnames = require('classnames')
, DefaultEditor = require('../../views/body/default-editor')
, DefaultRenderer = require('../../views/body/default-renderer')
, Uploader = require('./uploader')
, getSrc = require('./get-src')
var ImageBase = React.createClass({
propType: {
title: PT.string,
onUpload: PT.func,
onClick: PT.func,
minimized: PT.bool,
},
getInitialState() {
return {dragging: false}
},
_dragOver(e) {
e.preventDefault()
if (!this.state.dragging) {
this.setState({dragging: true})
}
},
_dragEnd(e) {
e.preventDefault()
this.setState({dragging: false})
},
_drop(e) {
e.preventDefault()
this.setState({dragging: false})
let files = e.dataTransfer.files
if (!files.length) return
const file = files[0]
if (!file.type.match(/^image\//)) {
return console.warn('not an image file')
}
getSrc(file, this.props.onUpload)
},
render: function () {
if (!this.props.src) {
return
}
return
{
e.stopPropagation()
this.props.onUpload(null)
}} className='ImageBase_close'>×
},
})
var ImageRenderer = React.createClass({
render: function () {
var img =
if (this.props.title && this.props.title.trim()) {
return
{img}
}
return img
},
})
var ImageEditor = React.createClass({
focus: function () {
return this.refs.text.focus.apply(null, arguments)
},
isFocused: function () {
return this.refs.text.isFocused.apply(null, arguments)
},
_onPaste: function (e) {
var file = e.clipboardData.items[0].getAsFile()
if (!file) return
e.preventDefault()
getSrc(file, this.props.setSrc)
},
render: function () {
var props = this.props.editProps
props.onPaste = this._onPaste
return
{React.createElement(DefaultEditor, props)}
},
})
module.exports = {
title: 'Image Node',
types: {
image: {
title: 'Image',
shortcut: 'i',
newNodesAreNormal: true, // TODO this does nothing
}
},
keys: {
'minimize image': {
type: 'image',
normal: 'space',
},
},
contextMenu: function (node, store) {
if (node.imageSrc) {
return [{
title: 'Remove image',
action: 'removeImage',
}, {
title: 'Minimize image',
action: 'minimizeImage',
}]
}
},
store: {
actions: {
'removeImage': function (id) {
if (!id) id = this.view.active
this.set(id, 'imageSrc', null)
},
minimizeImage(id) {
if (!id) id = this.view.active
if (this.db.nodes[id].type === 'symlink') {
const rid = this.db.nodes[id].content
if (this.db.nodes[rid]) id = rid
}
if (this.db.nodes[id].type !== 'image') return
this.set(id, 'minimized', !this.db.nodes[id].minimized)
},
},
},
node: {
bodies: {
image: {
renderer(props, onFocus) {
var click = () => {
if (props.editState) return
props.actions.edit(props.node.id)
}
var setSrc = props.store.actions.set.bind(props.store.actions, props.node.id, 'imageSrc')
return
},
editor: function (props) {
var setSrc = props.store.actions.set.bind(props.store.actions, props.node.id, 'imageSrc')
return
},
}
}
}
}