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,
  };
}