Proyectos de Subversion LeadersLinked - SPA

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3719 stevensc 1
import React, { useEffect, useState, useMemo, useCallback } from 'react';
2
 
3
import {
4
  useModal,
5
  useAlert,
6
  useAlertModal,
7
  useApi,
8
  usePagination,
9
  useInterceptionObserver,
10
  useDebouncedSearchParam
11
} from '@shared/hooks';
12
import { useKnowledgeMetadata } from './useKnowledgeMetadata';
13
import { deleteKnowledge, saveKnowledge, updateKnowledge } from '@knowledges/services';
14
 
15
import { KnowledgeForm } from '@knowledges/components';
16
 
17
export function useKnowledges() {
18
  const [addedKnowledges, setAddedKnowledges] = useState([]);
19
  const [editedKnowledges, setEditedKnowledges] = useState(new Map());
20
  const [deletedKnowledgeUrls, setDeletedKnowledgeUrls] = useState(new Set());
21
 
22
  const {
23
    categories,
24
    categoriesWithEdition,
25
    addUrl,
26
    imageSize,
27
    loading: loadingMetadata
28
  } = useKnowledgeMetadata();
29
 
30
  const {
31
    inputValue: searchTerm,
32
    setInputValue: setSearchTerm,
33
    debouncedValue: debouncedSearchTerm
34
  } = useDebouncedSearchParam('search');
35
  const {
36
    inputValue: searchCategory,
37
    setInputValue: setSearchCategory,
38
    debouncedValue: debouncedSearchCategory
39
  } = useDebouncedSearchParam('category_id');
40
 
41
  const { data, loading, hasMore, loadMore, applyFilters } = usePagination('/knowledge-area/list');
42
 
43
  const { elementRef } = useInterceptionObserver({
44
    onIntersect: hasMore ? loadMore : undefined
45
  });
46
 
47
  const { showModal, closeModal } = useModal();
48
  const { showAlert, closeAlert } = useAlertModal();
49
  const { showSuccess, showError } = useAlert();
50
 
51
  const knowledges = useMemo(() => {
52
    const paginatedItems = data.filter((item) => !deletedKnowledgeUrls.has(item.link_delete));
53
 
54
    const mergedItems = paginatedItems.map((item) =>
55
      editedKnowledges.has(item.link_edit) ? editedKnowledges.get(item.link_edit) : item
56
    );
57
 
58
    const addedItemsSet = new Set(mergedItems.map((item) => item.link_edit));
59
    const uniqueAddedKnowledges = addedKnowledges.filter(
60
      (item) => !addedItemsSet.has(item.link_edit)
61
    );
62
 
63
    return [...uniqueAddedKnowledges, ...mergedItems];
64
  }, [data, addedKnowledges, editedKnowledges, deletedKnowledgeUrls]);
65
 
66
  const { execute: saveKnowledgeApi } = useApi(saveKnowledge, {
67
    onSuccess: ({ message, knowledge }) => {
68
      setAddedKnowledges((prev) => [knowledge, ...prev]);
69
      showSuccess(message);
70
      closeModal();
71
    },
72
    onError: (error) => {
73
      showError(error.message);
74
    }
75
  });
76
 
77
  const { execute: updateKnowledgeApi } = useApi(updateKnowledge, {
78
    onSuccess: ({ message, knowledge }) => {
79
      setEditedKnowledges((prev) => new Map(prev).set(knowledge.link_edit, knowledge));
80
      showSuccess(message);
81
      closeModal();
82
    },
83
    onError: (error) => {
84
      showError(error.message);
85
    }
86
  });
87
 
88
  const { execute: deleteKnowledgeApi } = useApi(deleteKnowledge, {
89
    onSuccess: (message) => {
90
      showSuccess(message);
91
      closeAlert();
92
    },
93
    onError: (error) => {
94
      showError(error.message);
95
    }
96
  });
97
 
98
  const handleAddKnowledge = useCallback(
99
    (url) => {
100
      showModal(
101
        'Agregar Conocimiento',
102
        <KnowledgeForm
103
          categories={categories}
104
          imageSize={imageSize}
105
          onSubmit={(knowledge) => saveKnowledgeApi(url, knowledge)}
106
        />
107
      );
108
    },
109
    [categories]
110
  );
111
 
112
  const handleEditKnowledge = useCallback(
113
    (knowledge) => {
114
      if (!knowledge) return;
115
      showModal(
116
        'Editar Conocimiento',
117
        <KnowledgeForm
118
          categories={categories}
119
          imageSize={imageSize}
120
          onSubmit={(updatedKnowledge) => updateKnowledgeApi(knowledge.link_edit, updatedKnowledge)}
121
          defaultValues={knowledge}
122
        />
123
      );
124
    },
125
    [categories, updateKnowledgeApi, showModal, imageSize]
126
  );
127
 
128
  const handleDeleteKnowledge = useCallback(
129
    (url) => {
130
      showAlert({
131
        title: 'Eliminar Conocimiento',
132
        message: '¿Está seguro que desea eliminar este conocimiento?',
133
        onConfirm: () => {
134
          deleteKnowledgeApi(url).then(() => {
135
            setDeletedKnowledgeUrls((prev) => new Set(prev).add(url));
136
          });
137
        }
138
      });
139
    },
140
    [deleteKnowledgeApi, showAlert]
141
  );
142
 
143
  const clearFilters = useCallback(() => {
144
    setSearchTerm('');
145
    setSearchCategory('');
146
  }, []);
147
 
148
  useEffect(() => {
149
    applyFilters({ search: debouncedSearchTerm, category_id: debouncedSearchCategory });
150
    setAddedKnowledges([]);
151
    setEditedKnowledges(new Map());
152
    setDeletedKnowledgeUrls(new Set());
153
  }, [debouncedSearchTerm, debouncedSearchCategory]);
154
 
155
  return {
156
    knowledges,
157
    loading: loadingMetadata || loading,
158
    addUrl,
159
    searchTerm,
160
    searchCategory,
161
    categoriesWithEdition,
162
    elementRef,
163
    clearFilters,
164
    changeCategory: setSearchCategory,
165
    searchKnowledge: setSearchTerm,
166
    deleteKnowledge: handleDeleteKnowledge,
167
    addKnowledge: handleAddKnowledge,
168
    editKnowledge: handleEditKnowledge
169
  };
170
}