import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import CustomTextEditor from './Hello';
import './style.css';
ReactDOM.render(<CustomTextEditor />, document.getElementById('root'));
{
"name": "@plnkr/starter-react",
"version": "1.0.2",
"description": "React starter template",
"dependencies": {
"react": "^16.13.0",
"react-dom": "^16.13.0"
},
"plnkr": {
"runtime": "system",
"useHotReload": true
}
}
h1,
p {
font-family: sans-serif;
}
mark {
cursor:pointer
}
import React, {useState, useEffect, useRef} from 'react';
export default ({ name }) => (
<>
<p contenteditable="true">
Editable text box with some additional input controls like this consider that highlighting keyword <MarkText>XX.XX</MarkText> and it can contain multiple like this <MarkText>XX.XX</MarkText>
</p>
</>
);
const InputText = (value) => {
const [ textValue, setTextValue] = useState('');
const [ changed, setChanged ] = useState(false);
useEffect(val => {
setTextValue(val);
inputRef.current.focus();
}, value);
const inputRef = useRef(null);
return changed ? textValue :<input ref={inputRef} type="text" value={textValue} onChange={event => setTextValue(event.target.value)} onBlur={event => setChanged(true)} />
}
const MarkText = ({children}) => {
const [ editable, setEditable] = useState(false);
const onMarkClick = (event) => {
setEditable(!editable);
}
return (
editable ? <InputText value={children} /> : <mark onClick={onMarkClick}>{children}</mark>
);
}