From ba0ed492c40a486bf7cda9af5f7c52441a18a14e Mon Sep 17 00:00:00 2001 From: yuneng-jiang Date: Mon, 23 Feb 2026 18:05:23 -0800 Subject: [PATCH] fix: improve type safety and defensive guard in useOnboarding hook Co-Authored-By: Claude Sonnet 4.6 --- .../hooks/onboarding/useOnboarding.test.ts | 14 ++++++++++++-- .../(dashboard)/hooks/onboarding/useOnboarding.ts | 12 ++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/onboarding/useOnboarding.test.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/onboarding/useOnboarding.test.ts index f5f63c0586e..50238b2a6f9 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/onboarding/useOnboarding.test.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/onboarding/useOnboarding.test.ts @@ -21,7 +21,12 @@ describe("useOnboardingCredentials", () => { let queryClient: QueryClient; beforeEach(() => { - queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); + queryClient = new QueryClient({ + defaultOptions: { + queries: { retry: false }, + mutations: { retry: false }, + }, + }); vi.clearAllMocks(); mockUseUIConfig.mockReturnValue({ isLoading: false }); }); @@ -77,7 +82,12 @@ describe("useClaimOnboardingToken", () => { let queryClient: QueryClient; beforeEach(() => { - queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }); + queryClient = new QueryClient({ + defaultOptions: { + queries: { retry: false }, + mutations: { retry: false }, + }, + }); vi.clearAllMocks(); mockUseUIConfig.mockReturnValue({ isLoading: false }); }); diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/onboarding/useOnboarding.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/onboarding/useOnboarding.ts index 554444f46c1..0e3a4d236fd 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/onboarding/useOnboarding.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/onboarding/useOnboarding.ts @@ -5,11 +5,19 @@ import { createQueryKeys } from "../common/queryKeysFactory"; const onboardingKeys = createQueryKeys("onboarding"); +export interface OnboardingCredentials { + token: string; + login_url: string; +} + export const useOnboardingCredentials = (inviteId: string | null) => { const { isLoading: isUIConfigLoading } = useUIConfig(); - return useQuery({ + return useQuery({ queryKey: onboardingKeys.detail(inviteId ?? ""), - queryFn: async () => await getOnboardingCredentials(inviteId!), + queryFn: async () => { + if (!inviteId) throw new Error("inviteId is required"); + return getOnboardingCredentials(inviteId); + }, enabled: Boolean(inviteId) && !isUIConfigLoading, }); };