Skip to content

feat(settings): add the update dot and version card - #1070

Merged
bmc08gt merged 9 commits into
mainfrom
feat/settings-update-card
Oct 15, 2026
Merged

bmc08gt merged 9 commits into
mainfrom
feat/settings-update-card

Conversation

@bmc08gt

@bmc08gt bmc08gt commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator

Stacked on #1069; review that first. This adds the Settings side of the update signal: an attention dot on the You tab's gear and a version card at the bottom of Settings (Figma section 11435:162, dots 11440:162). The Android side is code-payments/code-android-app#1782.

Gear dot
The gear shows the shared attention dot while a newer store build exists.

Version card

  • Up to date: inline at the end of the list, 8pt under the last row, with the version, build and "Up to date". It keeps the existing beta-access tap.
  • Update available: pinned 50pt above the screen bottom on dark glass (#1C1C1D at 62%, 10% white edge), with the new version in green and an Update capsule. Update uses the same App Store sheet as the toast.
  • Debug builds: inline, with a gray "Debug" tag after the title. No dot and no Update button.

The pinned card sits in a bottom scrollEdgeBar, so the app's soft scroll edge draws under it. The inline state has no bar background to draw from, so it uses profileBarlessFade from the profile screens: rows fade at the bottom while the list can scroll further.

Settings also takes down the update toast, so it never covers the pinned card.

Launch with -SettingsCardAsRelease YES to see the release cards on a debug build, plus -UpdateAvailableOverride <version> for the pinned card.

Cards for internal (TestFlight) and staff builds come in a follow-up.

A message this build can't read showed a dashed "This message can't be
displayed" bubble with "Update Flipcash to see it" hanging under it. The
`.updateApp` hint now draws a plain received bubble with no outline: the
title "This Message Needs a Newer Version of Flipcash" over the body
"Update Flipcash to see messages like this. This one stays hidden."
(component 11420:13397), set in the `appTextMedium`, `appTextCaption`
and `appTextSmall` tokens rather than Figma's 15/13/14 sizes. Title and
body are separate labels; as one attributed string with paragraph
spacing, the cell measured short and clipped the body. The
decrypt-failure hints (`.askToResend`, `.resend`) keep the dashed bubble.

`ChatMessageCell.configure` takes an optional `ChatBubbleAction` that adds
an "Update Flipcash" capsule. Nothing passes one yet, so no button shows
until the update check exists.

A message whose content type this build doesn't know was dropped by
`ConversationMessage.init?`. It now maps to `.widget(.unrecognized)`, which
already reads back from the store as unsupported, so the schema is
unchanged. A message with no content entry is still dropped.
The app knew only the forced minimum build, so an optional update went
unnoticed. `UpdateAvailability` (on `Container`) now asks the App Store
lookup for the newest version when the app becomes active, at most every
6 hours, and caches the result. Debug, TestFlight and Xcode builds skip
the check: anything whose `AppTransaction` environment isn't production.
A failed lookup reads as no update.

Priority comes from `.well-known/release-manifest.json`, read from `main`
on GitHub. It applies only when its production version matches the
lookup's, and it is seeded with the current store version, 2026.10.2, at
priority 0.

"New version available" with an Update action shows once per version
when the update is priority (4+) or has been out 7 days:
- On the Chats or Wallet home, 1s after coming back from a pushed screen
  or after 3s on the home, for 10s (section 11693:162).
- In a chat, 1s after it opens with the keyboard down, for 6s, raised
  over the composer and as wide as it (section 11705:162). The keyboard
  coming up dismisses it.
The version is recorded only once the toast is actually on screen, since
the controller drops a toast while a sheet or bill covers the app.

Update opens `SKStoreProductViewController`, falling back to the App
Store app if the product fails to load. The unsupported-message bubble
gets the same action as "Update Flipcash" whenever a newer version
exists, with no priority or once-only gate.

`toastClearance` takes an optional horizontal inset for the chat bar, so
every toast in a chat now sits above the composer at its width.

Debug builds can force the toast with `-UpdateAvailableOverride <version>`.
The chat toast sat 28pt above the composer, not the 8pt section
11705:162 asks for: the clearance counted the bar's 8pt top margin and
its 8pt drop into the safe area on top of the host's 12pt padding.
`toastClearance` takes an `overlap` that lowers the toast back into the
bar's measured height, and the chat passes `BarMetrics.toastOverlap`
(20pt). The profile screens keep the default of 0.
The You tab's gear shows the attention dot while a newer store build exists.
The Settings footer becomes a card: inline with the build and 'Up to date'
(keeping the beta-access tap), or pinned on glass with an Update capsule when
a newer version exists. Debug builds keep an inline card with a Debug tag, no
dot and no Update button.
Dark glass with a 10% white edge, bold title, 70pt height, 50pt above the
screen bottom. Settings also takes down the update toast so it never covers
the pinned card.
@bmc08gt bmc08gt self-assigned this Oct 15, 2026
@bmc08gt
bmc08gt changed the base branch from feat/update-available-toast to main October 15, 2026 11:32
@bmc08gt
bmc08gt merged commit dc11622 into main Oct 15, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant