Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11350 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

/* eslint-disable react/prop-types */
import { axios } from '../../utils'
import React, { useEffect, useRef } from 'react'
import { connect } from 'react-redux'
import {
  setHaveNewMessage,
  setUnreadMessages,
  setShouldAlertNewMessage
} from '../../redux/chat/chat.actions'

const notifyAudio = new Audio('/audio/chat.mp3')

const ChatHelper = (props) => {
  // redux states
  const { unreadMessages, shouldAlertNewMessage } = props
  // redux actions
  const { setUnreadMessages, setShouldAlertNewMessage } = props
  // refs
  const unreads = useRef([])

  useEffect(() => {
    clearInterval(checkChatInterval)
    const checkChatInterval = setInterval(() => {
      axios.get('/chat/heart-beat').then((response) => {
        const resData = response.data
        if (resData.success) {
          resData.data.map((entity) => {
            handleNewMessage(entity)
          })
        }
      })
    }, 1000)
    return () => {
      clearInterval(checkChatInterval)
    }
  }, [unreadMessages, setShouldAlertNewMessage])

  const handleNewMessage = async (entity) => {
    const existingUnread = unreads.current.findIndex(
      (unread) => unread === entity.id
    )
    if (entity.not_received_messages) {
      const resData = (await axios.post(entity.url_mark_received)).data
      notifyAudio.play()
    }
    if (entity.not_seen_messages) {
      if (existingUnread === -1) {
        unreads.current = [...unreads.current, entity.id]
      }
    } else {
      if (existingUnread !== -1) {
        unreads.current = unreads.current.filter(
          (unread) => unread !== entity.id
        )
      }
    }
    // redux new message
    if (JSON.stringify(unreadMessages) !== JSON.stringify(unreads.current)) {
      setUnreadMessages(unreads.current)
    }
  }

  return <div></div>
}

const mapStateToProps = (state) => ({
  unreadMessages: state.chat.unreadMessages,
  shouldAlertNewMessage: state.chat.shouldAlertNewMessage
})

const mapDispatchToProps = {
  setHaveNewMessage: (haveNewMessage) => setHaveNewMessage(haveNewMessage),
  setUnreadMessages: (unreadMessages) => setUnreadMessages(unreadMessages),
  setShouldAlertNewMessage: (shouldAlertNewMessage) =>
    setShouldAlertNewMessage(shouldAlertNewMessage)
}

export default connect(mapStateToProps, mapDispatchToProps)(ChatHelper)