Optimize and clean code (#4)

Co-authored-by: Akaam Shamerany <alpha@Akaams-MacBook-Air.local>
This commit is contained in:
Akaam Shamerany 2022-05-20 03:09:01 +01:00 committed by GitHub
parent 5b86470066
commit ba2e5bd9ba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 88 deletions

View file

@ -1,6 +1,8 @@
.bubble.input { .bubble.input {
transition: opacity 0.4s ease-in-out; transition: opacity 0.4s ease-in-out;
opacity: 1; opacity: 1;
border: none;
outline: none;
} }
.bubble.input.submitted { .bubble.input.submitted {
@ -12,8 +14,6 @@
} }
.bubble.input > div { .bubble.input > div {
border: none;
outline: none;
background-color: #eee; background-color: #eee;
font-size: 32px; font-size: 32px;
min-width: 30px; min-width: 30px;

View file

@ -1,31 +1,22 @@
import React, { useCallback, useState, useRef, useEffect } from 'react' import React, { useCallback, useState, useRef, useEffect } from 'react'
import './bubble-input.css' import './bubble-input.css'
import ContentEditable from './content-editable'
const BubbleInput = ({ onChange, onSubmit, value }) => { const BubbleInput = ({ onChange, onSubmit, value }) => {
const refEditable = useRef() const refEditable = useRef()
const [submitted, setSubmitted] = useState(false) const [submitted, setSubmitted] = useState(false)
const handleChange = useCallback( const handleKeyDown = e => {
e => { if (e.key === 'Enter') {
onChange && onChange(e.target.value) onSubmit && onSubmit()
}, e.preventDefault()
[onChange] setSubmitted(true)
) setTimeout(() => {
const handleKeyDown = useCallback( refEditable.current.focus()
e => { refEditable.current.innerText = ''
if (e.keyCode === 13) { setSubmitted(false)
onSubmit && onSubmit() }, 10)
e.preventDefault() }
setSubmitted(true) }
setTimeout(() => {
window.document.querySelector('.bubble.input > div').focus()
setSubmitted(false)
}, 10)
}
},
[onSubmit]
)
const handleBlur = useCallback(() => { const handleBlur = useCallback(() => {
const { current: elDiv } = refEditable const { current: elDiv } = refEditable
if (elDiv) { if (elDiv) {
@ -33,22 +24,20 @@ const BubbleInput = ({ onChange, onSubmit, value }) => {
} }
}, [refEditable]) }, [refEditable])
useEffect(() => handleBlur(), [handleBlur]) useEffect(handleBlur, [handleBlur])
return ( return (
<div <div
ref={refEditable}
className={`bubble input ${value.length === 0 ? 'empty' : ''} ${ className={`bubble input ${value.length === 0 ? 'empty' : ''} ${
submitted ? 'submitted' : '' submitted ? 'submitted' : ''
}`} }`}
> contentEditable
<ContentEditable spellCheck="false"
ref={refEditable} onBlur={handleBlur}
onChange={handleChange} onKeyDown={handleKeyDown}
onKeyDown={handleKeyDown} onInput={e => onChange(e.target.innerText)}
onBlur={handleBlur} />
value={value}
/>
</div>
) )
} }

View file

@ -1,52 +0,0 @@
import * as React from 'react'
class ContentEditable extends React.Component {
render() {
const { innerRef } = this.props
return (
<div
key={Math.random()}
ref={innerRef}
onInput={this.emitChange}
onBlur={this.handleBlur}
onKeyDown={this.emitKeyDown}
contentEditable
spellCheck="false"
dangerouslySetInnerHTML={{ __html: this.props.value }}
></div>
)
}
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 <ContentEditable innerRef={ref} {...props} />
})

View file

@ -5,8 +5,7 @@ const useMessages = (initialValue = []) => {
const addMessage = useCallback( const addMessage = useCallback(
msg => { msg => {
const i = messages.length setMessages(messages => [...messages, msg])
setMessages([...messages, msg])
setTimeout(() => { setTimeout(() => {
setMessages(current => { setMessages(current => {
const n = [...current] const n = [...current]
@ -15,7 +14,7 @@ const useMessages = (initialValue = []) => {
}) })
}, 15000) }, 15000)
}, },
[messages] [setMessages]
) )
return [messages, addMessage] return [messages, addMessage]