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 }, } } } }