diff --git a/src/bubble-input.css b/src/bubble-input.css index 4722606..eaf0e84 100644 --- a/src/bubble-input.css +++ b/src/bubble-input.css @@ -1,6 +1,8 @@ .bubble.input { transition: opacity 0.4s ease-in-out; opacity: 1; + border: none; + outline: none; } .bubble.input.submitted { @@ -12,8 +14,6 @@ } .bubble.input > div { - border: none; - outline: none; background-color: #eee; font-size: 32px; min-width: 30px; diff --git a/src/bubble-input.jsx b/src/bubble-input.jsx index 892ab4b..9346d2f 100644 --- a/src/bubble-input.jsx +++ b/src/bubble-input.jsx @@ -1,31 +1,22 @@ import React, { useCallback, useState, useRef, useEffect } from 'react' import './bubble-input.css' -import ContentEditable from './content-editable' const BubbleInput = ({ onChange, onSubmit, value }) => { const refEditable = useRef() const [submitted, setSubmitted] = useState(false) - const handleChange = useCallback( - e => { - onChange && onChange(e.target.value) - }, - [onChange] - ) - const handleKeyDown = useCallback( - e => { - if (e.keyCode === 13) { - onSubmit && onSubmit() - e.preventDefault() - setSubmitted(true) - setTimeout(() => { - window.document.querySelector('.bubble.input > div').focus() - setSubmitted(false) - }, 10) - } - }, - [onSubmit] - ) + const handleKeyDown = e => { + if (e.key === 'Enter') { + onSubmit && onSubmit() + e.preventDefault() + setSubmitted(true) + setTimeout(() => { + refEditable.current.focus() + refEditable.current.innerText = '' + setSubmitted(false) + }, 10) + } + } const handleBlur = useCallback(() => { const { current: elDiv } = refEditable if (elDiv) { @@ -33,22 +24,20 @@ const BubbleInput = ({ onChange, onSubmit, value }) => { } }, [refEditable]) - useEffect(() => handleBlur(), [handleBlur]) + useEffect(handleBlur, [handleBlur]) return (
- -
+ contentEditable + spellCheck="false" + onBlur={handleBlur} + onKeyDown={handleKeyDown} + onInput={e => onChange(e.target.innerText)} + /> ) } diff --git a/src/content-editable.jsx b/src/content-editable.jsx deleted file mode 100644 index ba3562a..0000000 --- a/src/content-editable.jsx +++ /dev/null @@ -1,52 +0,0 @@ -import * as React from 'react' - -class ContentEditable extends React.Component { - render() { - const { innerRef } = this.props - return ( -
- ) - } - - shouldComponentUpdate(nextProps) { - const { current: div } = this.props.innerRef - return nextProps.value !== div.innerText - } - - emitChange = () => { - const { current: div } = this.props.innerRef - var value = div.innerText - if (this.props.onChange && value !== this.lastValue) { - this.props.onChange({ - target: { - value - } - }) - } - this.lastValue = value - } - - emitKeyDown = e => { - const { onKeyDown } = this.props - onKeyDown && onKeyDown(e) - } - - handleBlur = e => { - this.emitKeyDown(e) - const { onBlur } = this.props - onBlur && onBlur(e) - } -} - -export default React.forwardRef((props, ref) => { - return -}) diff --git a/src/use-messages.js b/src/use-messages.js index fe243ca..0fc89ae 100644 --- a/src/use-messages.js +++ b/src/use-messages.js @@ -5,8 +5,7 @@ const useMessages = (initialValue = []) => { const addMessage = useCallback( msg => { - const i = messages.length - setMessages([...messages, msg]) + setMessages(messages => [...messages, msg]) setTimeout(() => { setMessages(current => { const n = [...current] @@ -15,7 +14,7 @@ const useMessages = (initialValue = []) => { }) }, 15000) }, - [messages] + [setMessages] ) return [messages, addMessage]