import { organizationQueryKeys } from "@better-auth-ui/core/plugins" import { type DataTag, type QueryClient, queryOptions, skipToken, useQuery } from "@tanstack/react-query" import type { BetterFetchError } from "better-auth/react" import type { InferData, OrganizationAuthClient } from "../../lib/auth-client" import { useSession } from "../auth/session-query" export type ListOrganizationsData< TAuthClient extends OrganizationAuthClient = OrganizationAuthClient > = InferData export type ListOrganization< TAuthClient extends OrganizationAuthClient = OrganizationAuthClient > = NonNullable>[number] export type ListOrganizationsParams< TAuthClient extends OrganizationAuthClient = OrganizationAuthClient > = Parameters[0] export type ListOrganizationsOptions< TAuthClient extends OrganizationAuthClient = OrganizationAuthClient > = Omit< ReturnType>, "queryKey" | "queryFn" > export function listOrganizationsOptions< TAuthClient extends OrganizationAuthClient >( authClient: TAuthClient, userId: string | undefined, params?: ListOrganizationsParams ) { type TData = ListOrganizationsData const queryKey = organizationQueryKeys.list(userId, params?.query) const options = queryOptions( { queryKey, queryFn: ({ signal }) => authClient.organization.list({ ...params, fetchOptions: { ...params?.fetchOptions, signal, throw: true } }) as Promise } ) return options as typeof options & { queryKey: DataTag } } export const ensureListOrganizations = < TAuthClient extends OrganizationAuthClient >( queryClient: QueryClient, authClient: TAuthClient, userId: string, params?: ListOrganizationsParams ) => queryClient.ensureQueryData( listOrganizationsOptions(authClient, userId, params) ) export const prefetchListOrganizations = < TAuthClient extends OrganizationAuthClient >( queryClient: QueryClient, authClient: TAuthClient, userId: string, params?: ListOrganizationsParams ) => queryClient.prefetchQuery( listOrganizationsOptions(authClient, userId, params) ) export const fetchListOrganizations = < TAuthClient extends OrganizationAuthClient >( queryClient: QueryClient, authClient: TAuthClient, userId: string, params?: ListOrganizationsParams ) => queryClient.fetchQuery(listOrganizationsOptions(authClient, userId, params)) export type UseListOrganizationsOptions< TAuthClient extends OrganizationAuthClient = OrganizationAuthClient > = ListOrganizationsOptions & ListOrganizationsParams export function useListOrganizations< TAuthClient extends OrganizationAuthClient >( authClient: TAuthClient, options: UseListOrganizationsOptions = {}, queryClient?: QueryClient ) { const { data: session } = useSession(authClient, undefined, queryClient) const userId = session?.user.id const { query, fetchOptions, ...queryOptionsRest } = options const baseOptions = listOrganizationsOptions(authClient, userId, { query, fetchOptions }) return useQuery( { ...queryOptionsRest, ...baseOptions, queryFn: userId ? baseOptions.queryFn : skipToken }, queryClient ) }