Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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