walletDisplaySyncStatusProvider top-level property

NotifierProvider<WalletDisplaySyncStatusNotifier, AsyncValue<SyncStatus>> walletDisplaySyncStatusProvider
final

The POSTURE-STABLE view of syncStatusProvider for display surfaces (the badge, the sync sheet, the send screen's queue affordance — all three watch THIS so they can never flicker apart). Controllers and logic listeners (rescan tip-edge, synced-tip latch, refresh edges) stay on the RAW provider: the debounce is a presentation policy, never a truth filter. The ONE named exception is the wallet tab's tip follow (walletTipFollowProvider): it decides whether the sync BAR shows and whether the coin spins as the bar hides, so it must read what the bar renders (S12; reading raw made a flaky link flicker). Do not move it back to raw.

The rule (pure — see nextDisplaySyncStatus): mirror the raw status exactly, EXCEPT the two edges of the Stalled posture, which must survive walletStallPostureDwell before the display follows:

  • non-Stalled → Stalled: hold the previous shown state. A transient hiccup that recovers within the dwell never raises the alarm posture (the sub-second "snap to Sync paused" the review measured).
  • shown-Stalled → Scanning/Connecting/Idle/Unknown: hold Stalled. A retry pass CLAIMS an attempt, it proves nothing — during a dead-link backoff the raw status blips through Scanning for well under a second on every retry, and following it instantly would re-create the exact flap (plus doubled liveRegion announcements) this layer exists to kill. A pass that survives the dwell is really delivering → adopt it.
  • shown-Stalled → UpToDate or Offline: INSTANT. UpToDate is PROOF of health (a completed pass — recovery must never lag the truth); the reserved Offline arm is the calmer sibling posture, not a flap risk.
  • Stalled → Stalled with a DIFFERENT reason: instant. That is new information inside the same posture (e.g. connectivity → storage full, which must promote to RED now), not flicker.

A user-initiated "Try now" (the sync sheet, #399 item 4) calls WalletDisplaySyncStatusNotifier.followRawNow: the user acted, so live truth is the only honest feedback — the pending dwell is dropped, the raw value adopted on the spot, and for walletTryNowLiveWindow every raw change mirrors instantly (the user is WATCHING; a held stale posture there reads as a dead tap — review M2). When the window closes the normal dwell edges resume.

Implementation

final walletDisplaySyncStatusProvider =
    NotifierProvider<WalletDisplaySyncStatusNotifier, AsyncValue<SyncStatus>>(
      WalletDisplaySyncStatusNotifier.new,
    );