Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
1978 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
 
1978 stevensc 6
import { addNotification } from '../../../redux/notification/notification.actions'
5 stevensc 7
 
1978 stevensc 8
import ReactionIcon from '@mui/icons-material/Recommend'
9
import FunIcon from '../icons/Fun'
10
import LoveItIcon from '../icons/LoveIt'
11
import SupportIcon from '../icons/Support'
12
import InterestIcon from '../icons/Interest'
13
import RecommendIcon from '../icons/Recommned'
5 stevensc 14
 
15
const initialReaction = {
1978 stevensc 16
  label: 'Reaccionar',
5 stevensc 17
  icon: <ReactionIcon />,
1978 stevensc 18
  type: 'default'
19
}
5 stevensc 20
 
21
const ReactionsButton = ({
22
  currentReaction,
23
  onChange = () => null,
24
  withLabel,
25
  saveUrl,
26
  deleteUrl,
27
  ...rest
28
}) => {
1978 stevensc 29
  const [reaction, setReaction] = useState(initialReaction)
30
  const [isHover, setIsHover] = useState(false)
31
  const rectionBtn = useRef(null)
32
  const dispatch = useDispatch()
33
  useOutsideClick(rectionBtn, () => setIsHover(false))
5 stevensc 34
 
35
  const reactions = [
36
    {
1978 stevensc 37
      type: 'r',
5 stevensc 38
      icon: <RecommendIcon />,
1978 stevensc 39
      label: 'Me gusta'
5 stevensc 40
    },
41
    {
1978 stevensc 42
      type: 's',
5 stevensc 43
      icon: <SupportIcon />,
1978 stevensc 44
      label: 'Dar apoyo'
5 stevensc 45
    },
46
    {
1978 stevensc 47
      type: 'l',
5 stevensc 48
      icon: <LoveItIcon />,
1978 stevensc 49
      label: 'Me encanta'
5 stevensc 50
    },
51
    {
1978 stevensc 52
      type: 'i',
5 stevensc 53
      icon: <InterestIcon />,
1978 stevensc 54
      label: 'Me interesa'
5 stevensc 55
    },
56
    {
1978 stevensc 57
      type: 'f',
5 stevensc 58
      icon: <FunIcon />,
1978 stevensc 59
      label: 'Me divierte'
60
    }
61
  ]
5 stevensc 62
 
63
  const saveReaction = (type) => {
1978 stevensc 64
    axios.post(saveUrl, { type }).then((res) => {
65
      const { success, data } = res.data
5 stevensc 66
 
67
      if (!success) {
1978 stevensc 68
        dispatch(addNotification({ style: 'danger', msg: data }))
69
        return
5 stevensc 70
      }
71
 
1978 stevensc 72
      const newReaction = reactions.find((reaction) => reaction.type === type)
73
      setReaction(newReaction)
5 stevensc 74
 
1978 stevensc 75
      onChange(data)
76
    })
77
  }
5 stevensc 78
 
79
  const deleteReaction = () => {
80
    axios.post(deleteUrl).then((res) => {
1978 stevensc 81
      const { success, data } = res.data
5 stevensc 82
 
83
      if (!success) {
1978 stevensc 84
        dispatch(addNotification({ style: 'danger', msg: data }))
85
        return
5 stevensc 86
      }
87
 
1978 stevensc 88
      onChange(data)
89
      setReaction(initialReaction)
90
    })
91
  }
5 stevensc 92
 
1978 stevensc 93
  const onHover = debounce(() => setIsHover(true), 500)
5 stevensc 94
 
1978 stevensc 95
  const onUnhover = debounce(() => setIsHover(false), 500)
5 stevensc 96
 
97
  useEffect(() => {
1978 stevensc 98
    const currentOption = reactions.find(({ type }) => type === currentReaction)
5 stevensc 99
 
100
    if (!currentOption) {
1978 stevensc 101
      setReaction(initialReaction)
102
      return
5 stevensc 103
    }
104
 
1978 stevensc 105
    setReaction(currentOption)
106
  }, [currentReaction])
5 stevensc 107
 
108
  return (
109
    <>
110
      <button
111
        {...rest}
112
        onMouseOver={onHover}
113
        onMouseOut={onUnhover}
114
        ref={rectionBtn}
115
        onClick={() =>
1978 stevensc 116
          reaction.type !== 'default'
5 stevensc 117
            ? deleteReaction()
118
            : saveReaction(reactions[0].type)
119
        }
120
      >
121
        {reaction.icon}
122
        {withLabel && reaction.label}
1978 stevensc 123
        <div className={`reactions ${isHover ? 'active' : ''}`}>
5 stevensc 124
          {reactions.map(({ icon, type, label }) => (
125
            <button
126
              key={type}
127
              onClick={(e) => {
1978 stevensc 128
                e.stopPropagation()
129
                saveReaction(type)
5 stevensc 130
              }}
131
              title={label}
132
            >
133
              {icon}
134
            </button>
135
          ))}
136
        </div>
137
      </button>
138
    </>
1978 stevensc 139
  )
140
}
5 stevensc 141
 
1978 stevensc 142
export default ReactionsButton