Proyectos de Subversion LeadersLinked - SPA

Rev

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

import { useState } from 'react';

import { useApi, useAlert } from '@shared/hooks';
import { getAnswers, addAnswer, editAnswer, deleteAnswer } from '@my-coach/services';

export function useAnswers(question, { onAddAnswer, onEditAnswer, onDeleteAnswer }) {
  const [answers, setAnswers] = useState([]);

  const { showError, showSuccess } = useAlert();

  const { loading } = useApi(getAnswers, {
    autoFetch: !!question,
    autoFetchArgs: [question?.link_answers],
    onSuccess: (data) => {
      setAnswers(data.items);
    },
    onError: (error) => {
      showError(error.message);
    }
  });
  const { execute: executeAddAnswer } = useApi(addAnswer, {
    onSuccess: ({ answer, message, total_answers }) => {
      setAnswers((prev) => [...prev, answer]);
      showSuccess(message);
      onAddAnswer(total_answers);
    },
    onError: ({ message }) => {
      showError(message);
    }
  });
  const { execute: executeEditAnswer } = useApi(editAnswer);
  const { execute: executeDeleteAnswer } = useApi(deleteAnswer);

  const removeAnswer = async (url) => {
    await executeDeleteAnswer(url)
      .then(({ message, ...data }) => {
        setAnswers((prev) => prev.filter((a) => a.link_delete !== url));
        showSuccess(message);
        onDeleteAnswer(data);
      })
      .catch((error) => {
        showError(error.message);
      });
  };

  const updateAnswer = async (url, data) => {
    await executeEditAnswer(url, data)
      .then(({ message, ...data }) => {
        setAnswers((prev) =>
          prev.map((a) => (a.link_edit === url ? { ...a, text: data.description } : a))
        );
        showSuccess(message);
        onEditAnswer();
      })
      .catch((error) => {
        showError(error.message);
      });
  };

  const updateComments = (uuid, total_comments) => {
    setAnswers((prev) => prev.map((a) => (a.uuid === uuid ? { ...a, total_comments } : a)));
  };

  return {
    answers,
    loading,
    addAnswer: executeAddAnswer,
    editAnswer: updateAnswer,
    deleteAnswer: removeAnswer,
    updateComments
  };
}