import { Editor, Mark, Raw } from '../..'
import React from 'react'
import ReactDOM from 'react-dom'
import initialState from './state.json'
import isImage from 'is-image'
import isUrl from 'is-url'
import { Map } from 'immutable'
/**
* Define a set of node renderers.
*
* @type {Object}
*/
const NODES = {
image: (props) => {
const { node, state } = props
const { data } = node
const isActive = state.isFocused && state.blocks.includes(node)
const src = data.get('src')
return
}
}
/**
* The images example.
*
* @type {Component}
*/
class Images extends React.Component {
/**
* Deserialize the raw initial state.
*
* @type {Object}
*/
state = {
state: Raw.deserialize(initialState)
};
/**
* Render the app.
*
* @return {Element} element
*/
render = () => {
return (
{this.renderToolbar()}
{this.renderEditor()}
)
}
/**
* Render the toolbar.
*
* @return {Element} element
*/
renderToolbar = () => {
return (
image
)
}
/**
* Render the editor.
*
* @return {Element} element
*/
renderEditor = () => {
return (
)
}
/**
* Render a `node`.
*
* @param {Node} node
* @return {Element}
*/
renderNode = (node) => {
return NODES[node.type]
}
/**
* On change.
*
* @param {State} state
*/
onChange = (state) => {
this.setState({ state })
}
/**
* On clicking the image button, prompt for an image and insert it.
*
* @param {Event} e
*/
onClickImage = (e) => {
e.preventDefault()
const src = window.prompt('Enter the URL of the image:')
if (!src) return
let { state } = this.state
state = this.insertImage(state, src)
this.onChange(state)
}
/**
* On paste, if the pasted content is an image URL, insert it.
*
* @param {Event} e
* @param {Object} paste
* @param {State} state
* @return {State}
*/
onPaste = (e, paste, state) => {
if (paste.type != 'text') return
if (!isUrl(paste.text)) return
if (!isImage(paste.text)) return
return this.insertImage(state, paste.text)
}
/**
* Insert an image with `src` at the current selection.
*
* @param {State} state
* @param {String} src
* @return {State}
*/
insertImage = (state, src) => {
if (state.isExpanded) {
state = state
.transform()
.delete()
.apply()
}
const { anchorBlock, selection } = state
let transform = state.transform()
if (anchorBlock.type == 'image') {
transform = transform.splitBlock()
}
else if (anchorBlock.text != '') {
if (selection.isAtEndOf(anchorBlock)) {
transform = transform.splitBlock()
}
else if (selection.isAtStartOf(anchorBlock)) {
transform = transform
.splitBlock()
.collapseToStartOfPreviousBlock()
}
else {
transform = transform
.splitBlock()
.splitBlock()
.collapseToStartOfPreviousBlock()
}
}
return transform
.setBlock({
type: 'image',
isVoid: true,
data: { src }
})
.apply()
}
}
/**
* Export.
*/
export default Images