Your trial ended {timeSince(result.trial?.expiresAt)} ago.
Paying in new tab…
; return null; } ``` `view` is one of `'loading' | 'error' | 'layout' | 'auth' | 'support' | 'awaiting_payment' | 'popup_blocked' | 'purchased' | null`. Details — in [PaywallUI → state machine](/docs-v2/sdk-v3/ui#state-machine). Before Provider mount / on SSR it returns `{ open: false, view: null, error: null }`. ## `usePaywallUser()` Returns a discriminated `PaywallUserState` union describing **who the current user is** from the host's point of view. The shape combines three signals — Provider readiness, the managed-auth session, and the `BillingClient` user snapshot — so the consumer can branch on a single `status` field instead of guessing what `null` means. ```ts export type PaywallUserState = | { status: 'loading'; user: null; session: null } | { status: 'guest'; user: null; session: null } | { status: 'signed_in'; user: PaywallUser | null; session: AuthSession | null; }; ``` - **`loading`** — `