Rev 5945 | AutorÃa | Comparar con el anterior | Ultima modificación | Ver Log |
/* eslint-disable camelcase *//* eslint-disable react/prop-types */import React, { useEffect, useRef, useState } from 'react'import EmptySection from '../../shared/empty-section/EmptySection'import SearchIcon from '@mui/icons-material/Search'import { axios } from '../../utils'import { Modal } from 'react-bootstrap'import { addNotification } from '../../redux/notification/notification.actions'import { useDispatch } from 'react-redux'let path_id = window.location.pathname.split('/inmail/')[1]const Sidebar = ({selectedConversation = null,setConversation = function () {},}) => {const [conversations, setConversations] = useState([])const [searchActive, setSearchActive] = useState(false)const [search, setSearch] = useState('')const [visible, setVisible] = useState(false)const [loading, setLoading] = useState(false)const dispatch = useDispatch()const searchContainer = useRef()const filtredConversations = conversations.filter((conversation) =>conversation.name.toLowerCase().includes(search.toLowerCase()))const load = async () => {try {setLoading(true)const { data } = await axios.get(window.location.href)if (data.success) setConversations(data.data)} catch (error) {const errorMessage = new Error(error)dispatch(addNotification({ style: 'danger', msg: errorMessage.message }))} finally {setLoading(false)}}useEffect(() => {const handleClickOutside = (event) => {if (searchContainer.current &&!searchContainer.current.contains(event.target)) {setSearchActive(false)}}document.addEventListener('mousedown', handleClickOutside)return () => {document.removeEventListener('mousedown', handleClickOutside)}}, [searchContainer])useEffect(() => {if (path_id && conversations.length) {setConversation(conversations.find((conversation) => conversation.uuid === path_id))path_id = null}}, [conversations])useEffect(() => {let timerif (!loading) {timer = setTimeout(() => {load()}, 2000)}return () => {clearTimeout(timer)}}, [loading])return (<><Sidebar.StartConversationModalshow={visible}setConversation={setConversation}/><div className="chat_contacts"><h1 className="chat-title">{LABELS.PEOPLE}</h1><div className="msgs_icons-container"><div className="contact__search show" ref={searchContainer}><SearchIcon onClick={() => setSearchActive(!searchActive)} /><inputtype="text"placeholder={LABELS.SEARCH}onChange={(e) => setSearch(e.target.value)}/></div><divclassName="d-inline-flex align-items-center cursor-pointer"style={{ gap: '.5rem' }}onClick={() => setVisible(true)}><i className="fa fa-plus icon text-gray" />{LABELS.START_CONVERSATION}</div></div>{!filtredConversations.length ? (<EmptySection message="Sin conversaciones" />) : (<ul className="messages-list">{filtredConversations.map((conversation) => {return (<likey={conversation.uuid}onClick={() => setConversation(conversation)}><divclassName={`usr-msg-details ${selectedConversation?.uuid === conversation.uuid &&'is_selected'}`}><div className="usr-ms-img"><img src={conversation.image} alt={conversation.name} /></div><div className="usr-mg-info"><h3>{conversation.name}</h3>{Number(conversation.count_unread) > 0 && (<p className="text-gray">{conversation.count_unread}{' '}{LABELS.NEW_MESSAGES?.toLowerCase()} |{' '}<span> {conversation.last_message} </span></p>)}</div></div></li>)})}</ul>)}</div></>)}const StartConversationModal = ({ show, setConversation }) => {const [search, setSearch] = useState('')const [isShow, setIsShow] = useState(show)const [inmailPersons, setInmailPersons] = useState([])const closeModal = () => setIsShow(false)const handleSearch = ({ target }) => setSearch(target.value)const searchUsers = async (value) => {try {const { data } = await axios.get('/helpers/search-people?search=' + value)if (data.success) setInmailPersons(data.data)} catch (error) {console.log('>>: error > ', error)}}const handleInmailPerson = (uuid) => {closeModal()axios.get(`/inmail/${uuid}`).then(({ data }) => {if (data.success) {const newConversation = data.data.find((conversation) => conversation.uuid === uuid)setConversation(newConversation)}})}useEffect(() => {searchUsers(search)}, [search])useEffect(() => {setIsShow(show)}, [show])return (<Modal show={isShow} onHide={closeModal}><Modal.Header closeButton><Modal.Title>{LABELS.CREATE_INMAIL}</Modal.Title></Modal.Header><Modal.Body><div className="form-group"><label htmlFor="search-people">{LABELS.WRITE_NAME}</label><inputtype="email"className="form-control"aria-describedby="Buscador de personas"placeholder={LABELS.WRITE_PERSON_NAME}onChange={handleSearch}/></div><div className="container">{inmailPersons.map((person) => {return (<div className="row" key={person.value}><div className="col-8"><p>{person.text}</p></div><div className="col-4"><buttonclassName="btn btn-primary"onClick={() => handleInmailPerson(person.value)}><i className="fa fa-check" /></button></div></div>)})}</div></Modal.Body></Modal>)}Sidebar.StartConversationModal = StartConversationModalexport default Sidebar