Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3741 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import { useEffect, useState } from 'react';

import { useAlert, useApi, useDebouncedSearchParam, usePagination } from '@shared/hooks';
import { addQuestion, editQuestion, deleteQuestion } from '@my-coach/services';

export function useQuestions() {
  const [questions, setQuestions] = useState([]);

  const { data, loading, hasMore, loadMore, applyFilters } = usePagination('/my-coach/questions');

  const { showSuccess, showError } = useAlert();

  const { execute: executeAddQuestion } = useApi(addQuestion, {
    onSuccess: ({ question, message }) => {
      setQuestions((prev) => [...prev, question]);
      showSuccess(message);
    },
    onError: ({ message }) => {
      showError(message);
    }
  });
  const { execute: executeEditQuestion } = useApi(editQuestion, {
    onSuccess: ({ question, message }) => {
      setQuestions((prev) => prev.map((q) => (q.uuid === question.uuid ? question : q)));
      showSuccess(message);
    },
    onError: ({ message }) => {
      showError(message);
    }
  });
  const { execute: executeDeleteQuestion } = useApi(deleteQuestion, {
    onSuccess: ({ question, message }) => {
      setQuestions((prev) => prev.filter((q) => q.uuid !== question.uuid));
      showSuccess(message);
    },
    onError: ({ message }) => {
      showError(message);
    }
  });

  const {
    inputValue: searchTerm,
    setInputValue: setSearchTerm,
    debouncedValue: debouncedSearchTerm
  } = useDebouncedSearchParam('search');

  const {
    inputValue: searchCategory,
    setInputValue: setSearchCategory,
    debouncedValue: debouncedSearchCategory
  } = useDebouncedSearchParam('category_id');

  const clearFilters = () => {
    setSearchTerm('');
    setSearchCategory('');
  };

  useEffect(() => {
    applyFilters({
      search: debouncedSearchTerm,
      category_id: debouncedSearchCategory
    });
  }, [debouncedSearchTerm, debouncedSearchCategory]);

  useEffect(() => {
    if (data) {
      setQuestions(data);
    }
  }, [data]);

  return {
    questions,
    loading,
    hasMore,
    search: searchTerm,
    category: searchCategory,
    loadMore,
    applyFilters,
    searchQuestion: setSearchTerm,
    searchCategory: setSearchCategory,
    clearFilters,
    addQuestion: executeAddQuestion,
    editQuestion: executeEditQuestion,
    deleteQuestion: executeDeleteQuestion
  };
}