Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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)