web-production-saas-starter/next_b2b_starter/lib/hooks/queries/use-members-query.ts
2025-12-16 18:54:41 +04:00

64 lines
1.6 KiB
TypeScript

/**
* Members Query Hook
*
* Fetches and caches organization members list.
* Only fetches when organizationId is provided (lazy loading).
*/
import { useQuery, type UseQueryOptions } from "@tanstack/react-query";
import { memberRepository } from "@/lib/api/api/repositories/member-repository";
import { queryKeys } from "./query-keys";
import type { MemberListResponse } from "@/lib/models/member.model";
interface UseMembersQueryOptions {
organizationId?: string;
page?: number;
pageSize?: number;
enabled?: boolean;
}
export function useMembersQuery(
options: UseMembersQueryOptions = {},
queryOptions?: Omit<
UseQueryOptions<MemberListResponse, Error>,
"queryKey" | "queryFn" | "enabled"
>
) {
const {
organizationId,
page = 1,
pageSize = 50,
enabled = true,
} = options;
return useQuery({
queryKey: queryKeys.members.list({ organizationId, page, pageSize }),
queryFn: () =>
memberRepository.getMembers({ organizationId, page, pageSize }),
// Only fetch if organizationId is provided and enabled is true
enabled: Boolean(organizationId) && enabled,
// Members data is fresh for 5 minutes
staleTime: 5 * 60 * 1000,
// Cache for 10 minutes
gcTime: 10 * 60 * 1000,
// Retry once on failure
retry: 1,
// Don't refetch on window focus
refetchOnWindowFocus: false,
...queryOptions,
});
}
/**
* Hook to get members array with safe defaults
*/
export function useMembers(options: UseMembersQueryOptions = {}) {
const { data } = useMembersQuery(options);
return data?.members ?? [];
}