Proyectos de Subversion LeadersLinked - SPA

Rev

| Ultima modificación | Ver Log |

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