import { useEffect, useState } from "react";
import { LoadingValue, loadingValue, errorValue, dataValue } from "../types";

export const useAsyncAction = <T>(
  fn: () => Promise<T>,
  cleanup: (() => void) | null,
  deps: any[],
): LoadingValue<T> => {
  const [value, setValue] = useState<LoadingValue<T>>(loadingValue());

  useEffect(() => {
    (async () => {
      try {
        setValue(loadingValue());
        const result = await fn();
        setValue(dataValue(result));
      } catch (e) {
        setValue(errorValue(e?.message ?? "Something went wrong"));
      } finally {
        if (cleanup != null) {
          cleanup();
        }
      }
    })();
  }, deps);

  return value;
};
