Rev 767 | Rev 1978 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useCallback } from 'react'import { useDispatch } from 'react-redux'import { axios } from '../utils'import { addNotification } from 'store/notification/notification.actions'import { Recommend } from '@mui/icons-material'import FunIcon from '../components/UI/icons/Fun'import LoveItIcon from '../components/UI/icons/LoveIt'import SupportIcon from '../components/UI/icons/Support'import InterestIcon from '../components/UI/icons/Interest'import RecommendIcon from '../components/UI/icons/Recommned'const reactions = {r: {icon: RecommendIcon,label: 'Me gusta',type: 'r'},s: {icon: SupportIcon,label: 'Dar apoyo',type: 's'},l: {icon: LoveItIcon,label: 'Me encanta',type: 'l'},i: {icon: InterestIcon,label: 'Me interesa',type: 'i'},f: {icon: FunIcon,label: 'Me divierte',type: 'f'}}export default function withReactions(Component) {const HOC = ({saveUrl = '',deleteUrl = '',currentReaction = null,onReaction = () => null}) => {const dispatch = useDispatch()const saveReaction = useCallback((type) => {const formData = new FormData()formData.append('reaction', type)axios.post(saveUrl, formData).then((res) => {const { success, data } = res.dataif (!success) {dispatch(addNotification({ style: 'danger', msg: data }))}onReaction({reactions: data.reactions,currentReaction: type})})},[saveUrl, dispatch, reactions])const deleteReaction = useCallback(() => {axios.post(deleteUrl).then((res) => {const { success, data } = res.dataif (!success) {dispatch(addNotification({ style: 'danger', msg: data }))return}onReaction({reactions: data.reactions,currentReaction: ''})})}, [])return (<Componenticon={currentReaction ? reactions[currentReaction].icon : Recommend}onClick={() =>currentReaction ? deleteReaction() : saveReaction(reactions.r.type)}label={currentReaction ? reactions[currentReaction].label : 'Reaccionar'}><div className='reactions'>{Object.values(reactions).map(({ type, label, icon: Icon }) => (<buttonkey={type}title={label}onClick={(e) => {e.stopPropagation()e.currentTarget.blur()saveReaction(type)}}><Icon /></button>))}</div></Component>)}return HOC}