import { ref, watch } from 'vue';

import { tryOnUnmounted } from '@vueuse/core';

import { isFunction } from '/@/utils/is';



export function useTimeoutFn(handle: Fn<any>, wait: number, native = false) {

  if (!isFunction(handle)) {

    throw new Error('handle is not Function!');

  }



  const { readyRef, stop, start } = useTimeoutRef(wait);

  if (native) {

    handle();

  } else {

    watch(

      readyRef,

      (maturity) => {

        maturity && handle();

      },

      { immediate: false }

    );

  }

  return { readyRef, stop, start };

}



export function useTimeoutRef(wait: number) {

  const readyRef = ref(false);



  let timer: TimeoutHandle;

  function stop(): void {

    readyRef.value = false;

    timer && window.clearTimeout(timer);

  }

  function start(): void {

    stop();

    timer = setTimeout(() => {

      readyRef.value = true;

    }, wait);

  }



  start();



  tryOnUnmounted(stop);



  return { readyRef, stop, start };

}