Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3630 | Rev 3638 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3629 stevensc 1
import React, { useEffect, useState } from 'react';
2
import { useParams } from 'react-router-dom';
3
 
4
import { useAlert, useAlertModal, useApi, useModal } from '@shared/hooks';
5
import {
6
  getConversations,
7
  deleteConversation as deleteConversationService
8
} from '@inmail/services';
9
import { SearchUserModal } from '@shared/components';
10
 
11
export function useConversations() {
12
  const { uuid } = useParams();
13
  const [conversations, setConversations] = useState([]);
14
  const [currentConversation, setCurrentConversation] = useState(null);
3632 stevensc 15
  const [deletedUrl, setDeletedUrl] = useState(null);
3629 stevensc 16
 
17
  const { showSuccess, showError } = useAlert();
18
  const { showAlert, closeAlert } = useAlertModal();
19
  const { showModal, closeModal } = useModal();
20
 
21
  const { loading, execute } = useApi(getConversations, {
22
    onSuccess: (data) => {
23
      setConversations(data);
24
    },
25
    onError: (error) => {
26
      showError(error.message);
27
    }
28
  });
29
 
30
  const { execute: executeDeleteConversation } = useApi(deleteConversationService, {
3632 stevensc 31
    onSuccess: (data) => {
32
      showSuccess(data);
33
      setConversations((prev) => prev.filter((c) => c.delete_url !== deletedUrl));
34
      closeAlert();
35
    },
3629 stevensc 36
    onError: (error) => {
37
      showError(error.message);
38
    }
39
  });
40
 
41
  const handleDeleteConversation = async (url) => {
3632 stevensc 42
    executeDeleteConversation(url);
3629 stevensc 43
  };
44
 
45
  const deleteConversation = (url) => {
3632 stevensc 46
    setDeletedUrl(url);
3629 stevensc 47
    showAlert({
48
      title: 'Borrar conversación',
49
      message: '¿Estás seguro de querer borrar esta conversación?',
50
      onConfirm: () => handleDeleteConversation(url),
51
      onCancel: closeAlert
52
    });
53
  };
54
 
55
  const startConversation = () => {
56
    showModal(
57
      'Iniciar conversación',
58
      <SearchUserModal
59
        onSelect={(user) => {
3630 stevensc 60
          setCurrentConversation(user);
3629 stevensc 61
          setConversations((prev) => [user, ...prev]);
62
          closeModal();
63
        }}
64
      />
65
    );
66
  };
67
 
68
  useEffect(() => {
69
    if (!uuid) return;
70
    const conversation = conversations.find((c) => c.uuid === uuid);
71
    setCurrentConversation(conversation);
3630 stevensc 72
  }, [uuid]);
3629 stevensc 73
 
74
  useEffect(() => {
75
    execute(uuid ? `/inmail/${uuid}` : '/inmail');
76
  }, [uuid]);
77
 
78
  return {
79
    conversations,
80
    loading,
81
    currentConversation,
82
    setCurrentConversation,
83
    deleteConversation,
84
    startConversation
85
  };
86
}