"use client"; // The CRM messenger, now rendered by the shared @insignia/iios-messaging-ui SDK instead of a // bespoke in-CRM implementation. The CRM only supplies an adapter (transport) + theming; all the // UI + messaging logic lives in the SDK. Live path = the be-crm data door (CrmMessagingAdapter); // demo path = the SDK's own MockAdapter. import { useMemo } from "react"; import { useAppShell, useAuth } from "@abe-kap/appshell-sdk/react"; import { MessagingProvider, Messenger as SdkMessenger, type MessagingAdapter } from "@insignia/iios-messaging-ui"; import { MockAdapter } from "@insignia/iios-messaging-ui/adapters/mock"; import "@insignia/iios-messaging-ui/styles.css"; import { isShellConfigured } from "@/lib/appshell"; import { useRealtime } from "@/lib/realtime"; import { CrmMessagingAdapter, type DataDoor } from "@/lib/crm-messaging-adapter"; const SHELL = isShellConfigured(); export function MessengerSdk({ focusThreadId }: { focusThreadId?: string | null } = {}) { return (
{!SHELL && (
Demo mode — running on the SDK's mock adapter.
)}
{SHELL ? : }
); } // SHELL is a build-time constant, so exactly one of these mounts for the life of the app // (Rules-of-Hooks safe — the other branch never renders). function DemoHost({ focusThreadId }: { focusThreadId?: string | null }) { const adapter = useMemo(() => new MockAdapter(), []); return ( ); } function LiveHost({ focusThreadId }: { focusThreadId?: string | null }) { const { sdk } = useAppShell(); const { user } = useAuth(); const socket = useRealtime(); // Rebuilds once the socket connects: the first adapter (no socket) polls; the second runs live. const adapter = useMemo( () => (user?.id ? new CrmMessagingAdapter(sdk as unknown as DataDoor, user.id, socket ?? undefined) : null), [sdk, user?.id, socket], ); if (!adapter) return
Loading…
; return ( ); }