From 18d46d2c4a58a76b4bfc436f04a94677b5f84f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Kope=C4=8Dek?= Date: Mon, 29 Apr 2024 17:47:23 +0000 Subject: [PATCH] feat: add retryRequest function --- frontend/src/app/services/api.service.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/services/api.service.ts b/frontend/src/app/services/api.service.ts index c53b9811..16efa516 100644 --- a/frontend/src/app/services/api.service.ts +++ b/frontend/src/app/services/api.service.ts @@ -1,7 +1,7 @@ import { Injectable } from "@angular/core"; import axios, { AxiosError, AxiosResponse } from "axios"; -import { BehaviorSubject } from "rxjs"; -import { map } from "rxjs/operators"; +import { BehaviorSubject, defer, fromEvent } from "rxjs"; +import { filter, map, repeat, retry } from "rxjs/operators"; import { appConfig } from "src/config"; import { environment } from "src/environments/environment"; import { Logger } from "src/logger"; @@ -24,6 +24,23 @@ export type ApiError = AxiosError; axios.defaults.withCredentials = true; +interface RetryRequestOptions { + maxRetries?: number; + onFocus?: boolean; +} + +const tabFocusEvent = fromEvent(document, "visibilitychange").pipe( + filter(() => document.visibilityState === "visible"), +); + +export function retryRequest(request: () => Promise>, options: RetryRequestOptions = {}) { + let o = defer(() => request()); + if (options.maxRetries) o = o.pipe(retry(options.maxRetries)); + if (options.onFocus) o = o.pipe(repeat({ delay: () => tabFocusEvent })); + + return o; +} + @Injectable({ providedIn: "root", })