diff --git a/packages/platform/atoms/cal-provider/CalProvider.tsx b/packages/platform/atoms/cal-provider/CalProvider.tsx index 13c86528f4..7be1e26a3d 100644 --- a/packages/platform/atoms/cal-provider/CalProvider.tsx +++ b/packages/platform/atoms/cal-provider/CalProvider.tsx @@ -1,16 +1,42 @@ "use client"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { useEffect } from "react"; - import { VERSION_2024_06_14 } from "@calcom/platform-constants"; - +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { isAxiosError } from "axios"; +import { useEffect } from "react"; import http from "../lib/http"; import type { CalProviderProps } from "./BaseCalProvider"; import { BaseCalProvider } from "./BaseCalProvider"; import type { translationKeys } from "./languages"; -const queryClient = new QueryClient(); +function isRetryableError(error: unknown): boolean { + if (!isAxiosError(error) || !error.response) { + // network errors or timeouts — retryable + return true; + } + const status = error.response.status; + // retry on 408 (timeout), 429 (rate limit), and 5xx (server errors) + return status === 408 || status === 429 || status >= 500; +} + +const queryClient: QueryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: (failureCount: number, error: unknown): boolean => { + if (!isRetryableError(error)) return false; + return failureCount < 3; + }, + retryDelay: (attempt: number) => Math.min(1000 * 2 ** attempt, 30000), + }, + mutations: { + retry: (failureCount: number, error: unknown): boolean => { + if (!isRetryableError(error)) return false; + return failureCount < 1; + }, + retryDelay: (attempt: number) => Math.min(1000 * 2 ** attempt, 30000), + }, + }, +}); /** * Renders a CalProvider component. @@ -44,7 +70,7 @@ export function CalProvider({ version = VERSION_2024_06_14, organizationId, isEmbed = false, -}: CalProviderProps) { +}: CalProviderProps): JSX.Element { useEffect(() => { http.setVersionHeader(version); }, [version]); @@ -74,7 +100,8 @@ export function CalProvider({ version={version} labels={labels as Record} language={language} - organizationId={organizationId}> + organizationId={organizationId} + > {children}