Skip to content

Settings: account-status banner and gated-feature messaging #50

Description

@Adron

Gap

GET /api/user returns accountStatus (and cleared), which the app does not model or surface. Per /help/account the web shows a banner at the top of the home page explaining the current status.

The five statuses

Status Behaviour
new (on probation) read/browse/follow/block/mute/report work. Plain posting limited to a few per hour. Locked: direct messages, image and video uploads, cross-posting, scheduled posts, creating lists/documents/organizations. Verifying email is the fastest way off it.
active normal; limited only by subscription tier
restricted temporarily read-only while reviewed; can sign in, read, browse; cannot post, reply, react, follow, send messages or create. Appealable.
suspended as restricted, applied by the team. Appealable.
banned closed; cannot sign in

Why it matters

Without this, a probationary or restricted account gets bare 403s from half the app with no explanation — the single worst first-run experience available.

Acceptance criteria

  • AccountStatus and Cleared on CurrentUser.
  • A shell-level banner (MainWindow) for any status other than active, naming what is locked and linking to verify-email or support as appropriate.
  • Locked actions are disabled up front with the reason, instead of failing on click.
  • banned/suspended are handled gracefully at sign-in.

Activity

  1. Adron commented on Sep 16, 2026

    @Adron
    MemberAuthor

    Implemented in #170 — work continues in the PR from here.

    The banner ships with per-status copy, an explicit locked-feature list, and a real call to action (verify-email for probation, appeal for restricted/suspended/banned), amber for probation and the view's existing red for the three that need intervention. AccountCapabilities is the truth table behind it, re-exposed as Can*/*BlockedReason pairs so a locked control can bind IsEnabled and ToolTip and explain itself before the click rather than after. banned is refused at sign-in — a stale token for a closed account is discarded instead of opening a shell that 403s on everything — while restricted/suspended still sign in and read, as documented.

    Two honest caveats. MainWindow is the right host and is off-limits while #149 is in flight, so the banner sits at the top of Settings for now; re-parenting it is mechanical since nothing in the view model is Settings-specific. And the per-action disabling has its binding surface built and tested but no call sites yet — every gated action (compose, dig, follow, DM, media/cross-post/schedule, create list/doc/org) lives in a file #149 owns. The test account is active, so the other four statuses were constructed locally rather than observed; 59 assertions cover them.

  2. added a commit that references this issue on Sep 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1Table stakesarea:settingsArea: settingsparityWeb/API feature-parity work

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions