Inbox

A polling conversation list: newest activity first, last-message previews, relative timestamps, STOP badges for opted-out contacts, and infinite scroll.

Installation

npx shadcn@latest add @handset/inbox

Usage

import { Inbox } from "@/components/handset/inbox";

<Inbox
  selectedId={selectedId}
  onSelect={(conversation) => setSelectedId(conversation.id)}
/>

Pair it with Thread for a full surface, or use it alone as a "recent texts" panel. The list refreshes every 5 seconds and pauses while the tab is hidden.

Props

Props
PropTypeDefaultDescription
selectedIdstring | nullHighlights the active conversation.
onSelect(c: Conversation) => voidCalled when a row is clicked.
formatNumber(e164: string) => stringUS formatterDisplay formatting for the customer number.
tenantIdstringScope to one tenant (usually handled server-side).
pollMsnumber5000Refresh interval. 0 disables polling.
limitnumber50Page size for pagination.
classNamestringMerged onto the scroll container.