Proyectos de Subversion LeadersLinked - SPA

Rev

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

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