Rev 5463 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
/* eslint-disable camelcase */
/* eslint-disable react/prop-types */
/* eslint-disable react/jsx-key */
import React, { useEffect, useState } from 'react'
import axios from '../../../../utils/axios'
import { connect } from 'react-redux'
import { HiOutlineTag } from 'react-icons/hi'
import { addNotification } from '../../../../redux/notification/notification.actions'
const ICON_OPTIONS = [
<img src="/images/icons/home.png" className="img-icon lg" />,
<img src="/images/icons/conecctions.png" className="img-icon lg" />,
<img src="/images/icons/company.png" className="img-icon lg" />,
<img src="/images/icons/groups.png" className="img-icon lg" />,
<HiOutlineTag />
]
const ADD_OPTIONS = [<i className="fa fa-calendar img-icon lg" />]
const NavLinks = ({ menuData, sessionLink, addNotification }) => {
const [menuItems, setMenuItems] = useState(menuData || [])
const [aditionalItems, setAditionalItems] = useState([])
const [notifications, setNotifications] = useState([])
const [notificationsCount, setNotificationsCount] = useState(0)
const [totalMessages, setTotalMessages] = useState(0)
const [loading, setLoading] = useState(false)
useEffect(() => {
handleNotifications()
}, [notificationsCount])
useEffect(() => {
if (menuData.length > 5) {
setMenuItems(menuData.splice(0, 5))
setAditionalItems(menuData.splice(menuData.length - 5))
}
}, [])
useEffect(() => {
let timer
if (!loading) {
timer = setTimeout(() => checkSession(), 1000)
}
return () => {
clearTimeout(timer)
}
}, [loading])
const checkSession = async () => {
try {
setLoading(true)
const { data: response } = await axios.get(sessionLink)
const { total_messages, total_notifications } = response.data
if (response.success) {
setNotificationsCount(Number(total_notifications))
setTotalMessages(Number(total_messages))
}
setLoading(false)
} catch (error) {
console.log(error)
}
}
const readNotification = (link_read, link_notification) => {
axios
.post(link_read)
.then(({ data }) =>
data.success
? window.open(link_notification, '_blank').focus()
: addNotification({ style: 'danger', msg: data.data })
)
}
const deleteNotification = (link_delete) => {
axios.post(link_delete).then(({ data }) => {
!data.success && addNotification({ style: 'danger', msg: data.data })
setNotificationsCount((prev) => prev - 1)
setNotifications(
notifications.filter(
(notification) => notification.link_delete !== link_delete
)
)
addNotification({ style: 'success', msg: data.data })
})
}
const handleNotifications = () => {
axios
.get('/notifications/unreads')
.then(({ data }) => {
if (data.success) {
const notifications = new Set(data.data.notifications)
setNotifications([...notifications])
}
})
.catch((err) => {
addNotification({
style: 'error',
msg: 'Disculpe, ha ocurrido un error buscando notificaciones'
})
console.log('>>: err > ', err)
})
}
const handleAjaxRequest = async (url) => {
try {
const { data } = await axios.get(url)
if (data.success) window.open(data.data, '_backend')
} catch (error) {
console.log('>>: error > ', error)
}
}
return (
<ul>
{menuItems.map((item, index) => (
<li key={index}>
<a
href={`/${item.href}`}
onClick={(e) => {
if (item.ajax) {
e.preventDefault()
handleAjaxRequest(item.href)
}
if (item.childs.length) {
e.preventDefault()
}
}}
>
{ICON_OPTIONS[index]}
<p>{item.label}</p>
</a>
{!!item.childs.length && (
<nav className="navLinkDropdown">
<ul>
{item.childs.map((_element, _i) => (
<li key={_i}>
<a
href={`/${_element.href}`}
target="framename"
onClick={(e) => {
if (_element.childs?.length) e.preventDefault()
}}
>
{_element.label}
</a>
{!!_element.childs?.length && (
<>
<i className="fa fa-angle-right" />
<nav className="navigation-level_three">
<ul>
{_element.childs?.map((levelThree, index) => (
<li key={index}>
<a href={`/${levelThree.href}`}>
{levelThree.label}
</a>
</li>
))}
</ul>
</nav>
</>
)}
</li>
))}
</ul>
</nav>
)}
</li>
))}
<li>
<a href="/inmail">
<i className="fa fa-envelope-o" />
<p>Inmail</p>
<span className={`badge ${totalMessages ? 'd-block' : 'd-none'}`}>
{totalMessages}
</span>
</a>
</li>
<li className="d-md-none">
<a href="/chat">
<i className="fa fa-comment-o" />
<p>Chat</p>
<span className="badge" />
</a>
</li>
{!!aditionalItems.length && (
<li>
<a href={'#'} onClick={(e) => e.preventDefault()}>
<i className="fa fa-inbox img-icon lg" />
<p>Comunicación</p>
</a>
<div className="aditional_links">
<ul>
{aditionalItems.map((item, index) => (
<li key={index}>
<a href={`/${item.href}`}>
{ADD_OPTIONS[index] || null}
<p>{item.label}</p>
</a>
</li>
))}
<li>
<a href="/notifications">
<img src="/images/icons/bell.png" className="img-icon lg" />
<p>Notificaciones</p>
<span className={`badge ${notificationsCount ? 'd-block' : 'd-none'}`}>
{notificationsCount}
</span>
</a>
{!!notifications.length && (
<nav className="navigation-level_three">
<ul>
{[...notifications].reverse().map((element) => {
return (
<li key={element.message}>
<div className="d-flex flex-column">
<a
href={element.link}
onClick={(e) => {
e.preventDefault()
readNotification(element.link_mark_read, element.link)
}}
>
{element.message}
</a>
<small style={{ fontSize: '.85rem' }}>
{element.time_elapsed}
</small>
</div>
<i
className="ml-3 fa fa-trash-o cursor-pointer"
onClick={() => deleteNotification(element.link_delete)}
/>
</li>
)
})}
</ul>
</nav>
)}
</li>
</ul>
</div>
</li>
)}
</ul>
)
}
const mapDispatchToProps = {
addNotification: (notification) => addNotification(notification)
}
export default connect(null, mapDispatchToProps)(NavLinks)