Proyectos de Subversion LeadersLinked - SPA

Rev

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

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