use-setup-connect.ts1.8 KBView on GitHub import { useMemo } from 'react';
import { useQuery } from '@tanstack/react-query';
import { useSession } from '@/modules/auth/utils/auth-client';
import { useTRPC } from '@/providers/query-provider';
import type { ConnectStepKind } from '../types';
/**
* Which integration steps this user actually gets, and the data they render from.
*
* Availability is an ORG setting: a team with no CRM installed must not see a CRM
* step at all, or the rail counts a stage the user can never complete. LinkedIn,
* WhatsApp and Drive are always on offer — they are per-user connections with no
* org-side install to gate them.
*/
export function useSetupConnect() {
const trpc = useTRPC();
const { data: session } = useSession();
const { data: integrationsData, isPending } = useQuery(
trpc.integrations.list.queryOptions(
session?.user?.id ? { userId: session.user.id } : undefined,
),
);
const integrations = useMemo(
() => integrationsData?.integrations ?? [],
[integrationsData],
);
const meetingProviders = useMemo(
() => integrations.filter((i) => i.type === 'meeting'),
[integrations],
);
const crmProviders = useMemo(
() => integrations.filter((i) => i.type === 'crm'),
[integrations],
);
const available = useMemo<ConnectStepKind[]>(() => {
const kinds: ConnectStepKind[] = [];
if (meetingProviders.length > 0) kinds.push('meeting');
if (crmProviders.length > 0) kinds.push('crm');
if (integrations.some((i) => i.id === 'slack')) kinds.push('slack');
if (integrations.some((i) => i.id === 'mcp')) kinds.push('mcp');
kinds.push('linkedin', 'whatsapp', 'drive');
return kinds;
}, [integrations, meetingProviders.length, crmProviders.length]);
return {
session,
integrationsData,
integrations,
meetingProviders,
crmProviders,
available,
isPending,
};
}