Proyectos de Subversion LeadersLinked - SPA

Rev

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