Proyectos de Subversion LeadersLinked - SPA

Rev

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