Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2152 | Rev 2775 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
2134 stevensc 1
import React, { useRef, useState, useEffect } from 'react'
2
import { useDispatch } from 'react-redux'
2153 stevensc 3
 
2134 stevensc 4
import { axios, debounce } from '../../../utils'
5
import useOutsideClick from '../../../hooks/useOutsideClick'
5 stevensc 6
 
2134 stevensc 7
import { REACTIONS } from '@app/constants/feed'
8
import { addNotification } from '../../../redux/notification/notification.actions'
5 stevensc 9
 
10
const ReactionsButton = ({
11
  currentReaction,
12
  onChange = () => null,
13
  withLabel,
14
  saveUrl,
15
  deleteUrl,
16
  ...rest
17
}) => {
2152 stevensc 18
  const [reaction, setReaction] = useState(null)
2134 stevensc 19
  const [isHover, setIsHover] = useState(false)
20
  const rectionBtn = useRef(null)
21
  const dispatch = useDispatch()
2152 stevensc 22
 
2134 stevensc 23
  useOutsideClick(rectionBtn, () => setIsHover(false))
5 stevensc 24
 
25
  const saveReaction = (type) => {
2134 stevensc 26
    const formData = new FormData()
27
    formData.append('reaction', type)
5 stevensc 28
 
1979 stevensc 29
    axios.post(saveUrl, formData).then((res) => {
2134 stevensc 30
      const { success, data } = res.data
1979 stevensc 31
 
5 stevensc 32
      if (!success) {
2134 stevensc 33
        dispatch(addNotification({ style: 'danger', msg: data }))
34
        return
5 stevensc 35
      }
36
 
2134 stevensc 37
      onChange(data)
38
    })
39
  }
5 stevensc 40
 
41
  const deleteReaction = () => {
42
    axios.post(deleteUrl).then((res) => {
2134 stevensc 43
      const { success, data } = res.data
5 stevensc 44
 
45
      if (!success) {
2134 stevensc 46
        dispatch(addNotification({ style: 'danger', msg: data }))
47
        return
5 stevensc 48
      }
49
 
2152 stevensc 50
      setReaction(null)
2134 stevensc 51
      onChange(data)
52
    })
53
  }
5 stevensc 54
 
2134 stevensc 55
  const onHover = debounce(() => setIsHover(true), 500)
5 stevensc 56
 
2134 stevensc 57
  const onUnhover = debounce(() => setIsHover(false), 500)
5 stevensc 58
 
59
  useEffect(() => {
2134 stevensc 60
    const currentOption = REACTIONS.find(({ type }) => type === currentReaction)
2152 stevensc 61
    currentOption ? setReaction(currentOption) : setReaction(null)
2134 stevensc 62
  }, [currentReaction])
5 stevensc 63
 
64
  return (
65
    <>
66
      <button
67
        {...rest}
68
        onMouseOver={onHover}
69
        onMouseOut={onUnhover}
70
        ref={rectionBtn}
71
        onClick={() =>
2134 stevensc 72
          reaction.type !== 'default'
5 stevensc 73
            ? deleteReaction()
2134 stevensc 74
            : saveReaction(REACTIONS[0].type)
5 stevensc 75
        }
76
      >
77
        {reaction.icon}
78
        {withLabel && reaction.label}
2134 stevensc 79
        <div className={`reactions ${isHover ? 'active' : ''}`}>
2152 stevensc 80
          {REACTIONS.map(({ icon: Icon, type, label, color }) => (
5 stevensc 81
            <button
82
              key={type}
83
              onClick={(e) => {
2134 stevensc 84
                e.stopPropagation()
85
                saveReaction(type)
5 stevensc 86
              }}
87
              title={label}
88
            >
2152 stevensc 89
              <Icon style={{ color }} />
5 stevensc 90
            </button>
91
          ))}
92
        </div>
93
      </button>
94
    </>
2134 stevensc 95
  )
96
}
5 stevensc 97
 
2134 stevensc 98
export default ReactionsButton