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 {
3662 stevensc 31
    inputValue: searchTerm,
32
    setInputValue: setSearchTerm,
33
    debouncedValue: debouncedSearchTerm
34
  } = useDebouncedSearchParam('search');
35
  const {
36
    inputValue: searchCategory,
37
    setInputValue: setSearchCategory,
38
    debouncedValue: debouncedSearchCategory
3661 stevensc 39
  } = useDebouncedSearchParam('category_id');
40
 
3658 stevensc 41
  const { data, loading, hasMore, loadMore, applyFilters } = usePagination('/knowledge-area/list');
3470 stevensc 42
 
3658 stevensc 43
  const { elementRef } = useInterceptionObserver({
44
    onIntersect: hasMore ? loadMore : undefined
45
  });
3510 stevensc 46
 
3658 stevensc 47
  const { showModal, closeModal } = useModal();
48
  const { showAlert, closeAlert } = useAlertModal();
3452 stevensc 49
  const { showSuccess, showError } = useAlert();
50
 
3658 stevensc 51
  const knowledges = useMemo(() => {
52
    const paginatedItems = data.filter((item) => !deletedKnowledgeUrls.has(item.link_delete));
3452 stevensc 53
 
3658 stevensc 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]);
3452 stevensc 69
      showSuccess(message);
3658 stevensc 70
      closeModal();
71
    },
72
    onError: (error) => {
3452 stevensc 73
      showError(error.message);
74
    }
3658 stevensc 75
  });
3452 stevensc 76
 
3658 stevensc 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
  });
3452 stevensc 87
 
3658 stevensc 88
  const { execute: deleteKnowledgeApi } = useApi(deleteKnowledge, {
89
    onSuccess: (message) => {
90
      showSuccess(message);
91
      closeAlert();
92
    },
93
    onError: (error) => {
94
      showError(error.message);
95
    }
96
  });
3452 stevensc 97
 
3658 stevensc 98
  const handleAddKnowledge = useCallback(
99
    (url) => {
100
      showModal(
101
        'Agregar Conocimiento',
102
        <KnowledgeForm
103
          categories={categories}
3661 stevensc 104
          imageSize={imageSize}
3658 stevensc 105
          onSubmit={(knowledge) => saveKnowledgeApi(url, knowledge)}
106
        />
107
      );
108
    },
109
    [categories]
110
  );
3452 stevensc 111
 
3658 stevensc 112
  const handleEditKnowledge = useCallback(
113
    (url) => {
114
      const knowledge = knowledges.find((k) => k.link_edit === url);
115
      showModal(
116
        'Editar Conocimiento',
117
        <KnowledgeForm
118
          categories={categories}
3661 stevensc 119
          imageSize={imageSize}
3658 stevensc 120
          onSubmit={(knowledge) => updateKnowledgeApi(url, knowledge)}
121
          defaultValues={knowledge}
122
        />
123
      );
124
    },
125
    [knowledges, categories]
126
  );
127
 
128
  const handleDeleteKnowledge = useCallback((url) => {
129
    setDeletedKnowledgeUrls((prev) => new Set(prev).add(url));
130
    showAlert({
131
      title: 'Eliminar Conocimiento',
132
      message: '¿Está seguro que desea eliminar este conocimiento?',
133
      onConfirm: () => deleteKnowledgeApi(url)
134
    });
135
  }, []);
136
 
3452 stevensc 137
  useEffect(() => {
3661 stevensc 138
    applyFilters({ q: debouncedSearchTerm });
3658 stevensc 139
    setAddedKnowledges([]);
140
    setEditedKnowledges(new Map());
141
    setDeletedKnowledgeUrls(new Set());
142
  }, [debouncedSearchTerm]);
3452 stevensc 143
 
3661 stevensc 144
  useEffect(() => {
145
    applyFilters({ category_id: debouncedSearchCategory });
146
    setAddedKnowledges([]);
147
    setEditedKnowledges(new Map());
148
    setDeletedKnowledgeUrls(new Set());
149
  }, [debouncedSearchCategory]);
150
 
3452 stevensc 151
  return {
152
    knowledges,
3661 stevensc 153
    loading: loadingMetadata || loading,
154
    addUrl,
3658 stevensc 155
    searchTerm,
3661 stevensc 156
    searchCategory,
157
    categoriesWithEdition,
3658 stevensc 158
    elementRef,
3661 stevensc 159
    changeCategory: setSearchCategory,
160
    searchKnowledge: setSearchTerm,
3452 stevensc 161
    deleteKnowledge: handleDeleteKnowledge,
162
    addKnowledge: handleAddKnowledge,
163
    editKnowledge: handleEditKnowledge
164
  };
165
}