Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7079 | Rev 7132 | 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,
7101 stevensc 25
  saveUrl,
6625 stevensc 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) => {
7101 stevensc 63
    const formData = new FormData()
64
    formData.append('reaction', type)
65
 
66
    axios.post(saveUrl, formData).then((res) => {
7079 stevensc 67
      const { success, data } = res.data
6625 stevensc 68
 
69
      if (!success) {
70
        dispatch(addNotification({ style: 'danger', msg: data }))
7074 stevensc 71
        return
6625 stevensc 72
      }
73
 
7079 stevensc 74
      const newReaction = reactions.find((reaction) => reaction.type === type)
75
      setReaction(newReaction)
76
 
6625 stevensc 77
      onChange(data.reactions)
78
    })
79
  }
80
 
7073 stevensc 81
  const deleteReaction = () => {
82
    axios.post(deleteUrl).then((res) => {
6625 stevensc 83
      const { success, data } = res.data
84
 
85
      if (!success) {
86
        dispatch(addNotification({ style: 'danger', msg: data }))
87
        return
88
      }
89
 
90
      onChange(data.reactions)
7079 stevensc 91
      setReaction(initialReaction)
6625 stevensc 92
    })
93
  }
94
 
7079 stevensc 95
  const onHover = debounce(() => setIsHover(true), 500)
6625 stevensc 96
 
7079 stevensc 97
  const onUnhover = debounce(() => setIsHover(false), 500)
6625 stevensc 98
 
7077 stevensc 99
  useEffect(() => {
7079 stevensc 100
    const currentOption = reactions.find(({ type }) => type === currentReaction)
101
 
102
    if (!currentOption) {
103
      setReaction(initialReaction)
104
      return
105
    }
106
 
107
    setReaction(currentOption)
7077 stevensc 108
  }, [currentReaction])
109
 
6625 stevensc 110
  return (
7079 stevensc 111
    <>
112
      <button
113
        className="btn position-relative"
114
        onMouseOver={onHover}
115
        onMouseOut={onUnhover}
116
        ref={rectionBtn}
117
        onClick={() =>
118
          reaction.type !== 'default'
119
            ? deleteReaction()
120
            : saveReaction(reactions[0].type)
121
        }
122
      >
123
        {reaction.icon}
124
        {withLabel && reaction.label}
125
        <div className={`reactions ${isHover ? 'active' : ''}`}>
126
          {reactions.map(({ icon, type, label }) => (
127
            <button
128
              key={type}
129
              onClick={(e) => {
130
                e.stopPropagation()
131
                saveReaction(type)
132
              }}
133
              title={label}
134
            >
135
              {icon}
136
            </button>
137
          ))}
138
        </div>
139
      </button>
140
    </>
6625 stevensc 141
  )
142
}
143
 
144
export default ReactionsButton