Proyectos de Subversion LeadersLinked - SPA

Rev

Autoría | Ultima modificación | Ver Log |

import React, { useEffect, useMemo, useState } from 'react';

import { useModal, useAlert } from '@app/modules/shared/hooks';
import { deleteKnowledge } from '../services';
import { useFetch, useSearchQuery } from '@hooks';
import { debounce } from '@utils';

import { KnowledgeForm } from '../components';

export function useKnowledges() {
  const [knowledges, setKnowledges] = useState([]);
  const { getParam, setParam } = useSearchQuery();
  const { data, isLoading: loading } = useFetch('/knowledge-area?search=' + getParam('search'));

  const { showModal } = useModal();
  const { showSuccess, showError } = useAlert();

  const categories = useMemo(() => {
    const categories = [{ label: 'Todas', value: '' }];

    const results = data.categories
      .filter(({ uuid }) => data.categories_with_edition.includes(uuid))
      .map(({ uuid, name }) => ({
        label: name,
        value: uuid
      }));

    categories.push(...results);

    return categories;
  }, [data.categories]);

  const handleSearchKnowledge = debounce((value) => setParam('search', value), 500);

  const setPage = (page) => setParam('page', page);

  const onDeleteKnowledge = async (url) => {
    try {
      const message = await deleteKnowledge(url);
      showSuccess(message);
    } catch (error) {
      showError(error.message);
    }
  };

  const handleAddKnowledge = (url) => {
    showModal(
      'Agregar Conocimiento',
      <KnowledgeForm
        onComplete={(newKnowledge) => {
          setKnowledges((prev) => [...prev, newKnowledge]);
        }}
        categories={categories}
        url={url}
      />
    );
  };

  const handleEditKnowledge = (url) => {
    showModal(
      'Editar Conocimiento',
      <KnowledgeForm
        onComplete={(newKnowledge) => {
          setKnowledges((prev) => {
            const index = prev.findIndex((knowledge) => knowledge.uuid === newKnowledge.uuid);
            prev[index] = newKnowledge;
            return [...prev];
          });
        }}
        categories={categories}
        url={url}
      />
    );
  };

  const handleDeleteKnowledge = (url) => {
    showModal('Eliminar Conocimiento', <p>¿Está seguro que desea eliminar este conocimiento?</p>);
  };

  useEffect(() => {
    if (data) setKnowledges(data.knowledges);
  }, [data]);

  return {
    categories,
    knowledges,
    loading,
    page: data.page,
    pages: data.total_pages,
    setPage,
    searchKnowledge: handleSearchKnowledge,
    deleteKnowledge: handleDeleteKnowledge,
    addKnowledge: handleAddKnowledge,
    editKnowledge: handleEditKnowledge
  };
}