Proyectos de Subversion LeadersLinked - SPA

Rev

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

import React, { useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';

import { useAlert, useAlertModal, useApi, useModal } from '@shared/hooks';
import {
  getConversations,
  deleteConversation as deleteConversationService
} from '@inmail/services';
import { SearchUserModal } from '@shared/components';

export function useConversations() {
  const { uuid } = useParams();
  const [conversations, setConversations] = useState([]);
  const [currentConversation, setCurrentConversation] = useState(null);
  const [deletedUrl, setDeletedUrl] = useState(null);

  const { showSuccess, showError } = useAlert();
  const { showAlert, closeAlert } = useAlertModal();
  const { showModal, closeModal } = useModal();

  const { loading, execute } = useApi(getConversations, {
    onSuccess: (data) => {
      setConversations(data);
    },
    onError: (error) => {
      showError(error.message);
    }
  });

  const { execute: executeDeleteConversation } = useApi(deleteConversationService, {
    onSuccess: (data) => {
      showSuccess(data);
      setConversations((prev) => prev.filter((c) => c.delete_url !== deletedUrl));
      setCurrentConversation(null);
      setDeletedUrl(null);
      closeAlert();
    },
    onError: (error) => {
      showError(error.message);
      setDeletedUrl(null);
    }
  });

  const deleteConversation = (url) => {
    setDeletedUrl(url);
    showAlert({
      title: 'Borrar conversación',
      message: '¿Estás seguro de querer borrar esta conversación?',
      onConfirm: () => executeDeleteConversation(url),
      onCancel: closeAlert
    });
  };

  const startConversation = () => {
    showModal(
      'Iniciar conversación',
      <SearchUserModal
        onSelect={(user) => {
          setCurrentConversation(user);
          setConversations((prev) => [user, ...prev]);
          closeModal();
        }}
      />
    );
  };

  useEffect(() => {
    if (!uuid) return;
    const conversation = conversations.find((c) => c.uuid === uuid);
    setCurrentConversation(conversation);
  }, [uuid]);

  useEffect(() => {
    execute(uuid ? `/inmail/user/${uuid}` : '/inmail');
  }, [uuid]);

  return {
    conversations,
    loading,
    currentConversation,
    setCurrentConversation,
    deleteConversation,
    startConversation
  };
}