/** * useIntegrationKeys Hook * * TanStack Query hook for fetching integration keys list for a tenant. * * Features: * - Automatic caching with 5-minute stale time * - Background refetching * - Request deduplication * - Pagination and filtering support * * @layer Presentation - TanStack Query Hook */ import { useQuery } from '@tanstack/react-query'; import { queryKeys } from '@/lib/query-keys'; import { integrationKeysApi } from '@/infrastructure/http/api/integration-keys/api'; import type { IntegrationKey } from '@/domain/entities/IntegrationKey'; import type { PaginationMeta } from '@/infrastructure/http/api/shared/types'; interface UseIntegrationKeysOptions { tenantId: string; page?: number; limit?: number; sortBy?: 'createdAt' | 'status' | 'lastUsedAt'; sortOrder?: 'asc' | 'desc'; status?: 'ACTIVE' | 'REVOKED' | 'EXPIRED'; enabled?: boolean; } interface UseIntegrationKeysResult { keys: IntegrationKey[]; pagination: PaginationMeta; isLoading: boolean; error: Error | null; } /** * Fetches integration keys list for a tenant * * @param options - Query options (tenantId, pagination, filters) * @returns TanStack Query result with keys array and pagination * * @example * ```typescript * const { keys, pagination, isLoading, error } = useIntegrationKeys({ * tenantId: 'tenant-123', * page: 1, * limit: 20, * status: 'ACTIVE' * }); * * if (isLoading) return ; * if (error) return ; * * return ( *
* {keys.map(key => )} * *
* ); * ``` */ export function useIntegrationKeys(options: UseIntegrationKeysOptions): UseIntegrationKeysResult { const { tenantId, page, limit, sortBy, sortOrder, status, enabled = true } = options; const query = useQuery({ queryKey: queryKeys.integrationKeys.list(tenantId, { page, limit, sortBy, sortOrder, status, }), queryFn: async () => { return await integrationKeysApi.listKeys(tenantId, { page, limit, sortBy, sortOrder, status, }); }, enabled: enabled && !!tenantId, staleTime: 5 * 60 * 1000, // 5 minutes }); return { keys: query.data?.keys || [], pagination: query.data?.pagination || { page: 1, limit: 20, total: 0, totalPages: 0, }, isLoading: query.isLoading, error: query.error, }; }