import { ref, watch } from 'vue'; import type { UseRequestPlugin, UseRequestTimeout } from '../types'; import { isDocumentVisible } from '../utils/isDocumentVisible'; import subscribeReVisible from '../utils/subscribeReVisible'; const usePollingPlugin: UseRequestPlugin = ( fetchInstance, { pollingInterval, pollingWhenHidden = true, pollingErrorRetryCount = -1 }, ) => { const timerRef = ref(); const unsubscribeRef = ref<() => void>(); const countRef = ref(0); const stopPolling = () => { if (timerRef.value) { clearTimeout(timerRef.value); } unsubscribeRef.value?.(); }; watch( () => pollingInterval, () => { if (!pollingInterval) { stopPolling(); } }, ); if (!pollingInterval) { return {}; } return { onBefore: () => { stopPolling(); }, onError: () => { countRef.value += 1; }, onSuccess: () => { countRef.value = 0; }, onFinally: () => { if ( pollingErrorRetryCount === -1 || // When an error occurs, the request is not repeated after pollingErrorRetryCount retries (pollingErrorRetryCount !== -1 && countRef.value <= pollingErrorRetryCount) ) { timerRef.value = setTimeout(() => { // if pollingWhenHidden = false && document is hidden, then stop polling and subscribe revisible if (!pollingWhenHidden && !isDocumentVisible()) { unsubscribeRef.value = subscribeReVisible(() => { fetchInstance.refresh(); }); } else { fetchInstance.refresh(); } }, pollingInterval); } else { countRef.value = 0; } }, onCancel: () => { stopPolling(); }, }; }; export default usePollingPlugin;