Skip to content

chore: backmerge production app and landing fixes (TASK-22564) - #3258

Merged
jjramirezn merged 15 commits into
devfrom
codex/TASK-22564-backmerge-20260918
Sep 18, 2026
Merged

jjramirezn merged 15 commits into
devfrom
codex/TASK-22564-backmerge-20260918

Conversation

@jjramirezn

Copy link
Copy Markdown
Contributor

Bring production app and landing changes into dev while retaining dev’s newer native release flow and app-link behavior.

Validation: typecheck passed; full unit suite passed (680 suites, 8,343 tests); focused rerun with the new cases passed (214 tests). Production build succeeded, with local Sentry upload 401 warnings. Formatting and diff checks passed.

Risk is the combination of deep-link handling from both branches. No native manifest changes, dependencies, or new architecture. No additional product or legal changes beyond the production commits.

Screenshots: ⚠️ not captured for the landing-city change. Landing tests pass, but visual and native-device checks were not repeated for this backmerge.

Replaces #3256 and the older #3231. CI and Chip review are not awaited, as requested. Use a merge commit to preserve ancestry.

0xkkonrad and others added 15 commits September 10, 2026 13:23
The March QR-launch triplet (Buenos Aires, São Paulo, Floripa) framed the
homepage as a LatAm street-payments pitch. With the card live the hero
returns to the global sweep the Global Cash fold already uses, and each
city links to its country page through the resolved content hrefs instead
of hardcoded locale paths. Drops the locale prop that only fed those paths.
Nueva York / Ciudad de México on the Spanish pages and Nova York / Madri /
Cidade do México on Portuguese, matching the forms the Global Cash fold
already uses. Addresses the Chip review note on #3093.
Carries the hero city change over the app-entry refactor (#3027): Hero keeps
main's signature and useMigrationFlag, takes contentHrefs in place of locale.
Hero no longer takes locale; the guard added on main in d91ea7c still
passed it, so the two Hero cases threw on contentHrefs.unitedStates.
LandingPageClient no longer takes locale; the Vercel build type-checks
tests and failed on it. Hero reads contentHrefs now, so the guard passes
the real EN map instead of an empty cast.
Static images for the launch email blast, served at peanut.me/email/.
Same four assets as ui#3226 (dev), based on main so the blast can send
today; back-merge covers dev.
…mation-currency

fix(add-money): preserve EUR on native SEPA confirmation
…y-no-native

fix(app): avoid native rebuild for app-entry QR links
Slava's catch: multi-second image loads in the launch emails. 780px + 128-color
palette PNG, visually identical. Same filenames, so already-sent emails also
load faster (clients fetch at open time).
the constant still held the pre-launch placeholder (2026-12-31), so the
web sunset block would not fire for another three months. the pwa-sunset
flag went blanket-on 2026-09-09, and the notice window is 30 days, which
puts the cutover at 2026-10-09.

the comparison in shouldShowSunsetBlock is `now >= cutover`, so the block
starts at exactly 2026-10-09T00:00:00Z — the last full web day is
2026-10-08 UTC.
…r-date

fix: set the real pwa-sunset cutover date (2026-10-09)
feat(landing): hero cities back to New York, Madrid, Mexico City (TASK-22577)
@notion-workspace

Copy link
Copy Markdown

@coderabbitai

coderabbitai Bot commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 318685e1-e68d-4513-8120-5f60c3eab478

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@vercel

vercel Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
peanut-wallet Ready Ready Preview Sep 18, 2026 12:31pm UTC

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

Code-analysis diff

Painscore total: 8458.28 → 8460.03 (+1.75)
Findings: +1 net (+33 new, -32 resolved)

🆕 New findings (33)

  • critical complexity — src/hooks/useNativeAppLinks.ts — CC 76, MI 60.55, SLOC 301
  • high complexity — src/proxy.ts — CC 39, MI 55.66, SLOC 131
  • medium high-mdd — src/hooks/useNativeAppLinks.ts:51 — useNativeAppLinks: MDD 67.5 (uses across many lines from declarations)
  • medium high-dlt — src/hooks/useNativeAppLinks.ts:51 — useNativeAppLinks: DLT 63 (calls 63 distinct functions — high context load)
  • medium high-mdd — src/hooks/useNativeAppLinks.ts:54 — : MDD 62.4 (uses across many lines from declarations)
  • medium high-dlt — src/hooks/useNativeAppLinks.ts:54 — : DLT 61 (calls 61 distinct functions — high context load)
  • medium high-mdd — src/utils/native-routes.ts:114 — mapDeepLinkPath: MDD 58.9 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/LandingPageClient.tsx:48 — LandingPageClient: MDD 44.0 (uses across many lines from declarations)
  • medium high-dlt — src/hooks/useNativeAppLinks.ts:179 — init: DLT 31 (calls 31 distinct functions — high context load)
  • medium high-mdd — src/proxy.ts:12 — proxy: MDD 30.4 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/landingStrings.ts:53 — landingStrings: MDD 28.0 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/LandingPageContent.tsx:29 — LandingPageContent: MDD 26.6 (uses across many lines from declarations)
  • medium high-mdd — src/hooks/useNativeAppLinks.ts:97 — openDeepLink: MDD 22.8 (uses across many lines from declarations)
  • medium high-mdd — src/hooks/useNativeAppLinks.ts:179 — init: MDD 20.6 (uses across many lines from declarations)
  • medium method-complexity — src/proxy.ts:12 — proxy CC 20 SLOC 72
  • medium method-complexity — src/utils/native-routes.ts:441 — rewriteMethodPath CC 20 SLOC 34
  • medium method-complexity — src/hooks/useNativeAppLinks.ts:97 — CC 15 SLOC 65
  • medium complexity — src/components/LandingPage/LandingPageClient.tsx — CC 11, MI 64.39, SLOC 52
  • medium complexity — src/components/LandingPage/LandingPageContent.tsx — CC 7, MI 62.96, SLOC 34
  • medium complexity — src/components/LandingPage/landingStrings.ts — CC 2, MI 51.6, SLOC 55

…and 13 more.

✅ Resolved (32)

  • src/hooks/useNativeAppLinks.ts — CC 73, MI 60.99, SLOC 292
  • src/proxy.ts — CC 37, MI 56.53, SLOC 123
  • src/hooks/useNativeAppLinks.ts:49 — useNativeAppLinks: MDD 67.4 (uses across many lines from declarations)
  • src/hooks/useNativeAppLinks.ts:52 — : MDD 62.3 (uses across many lines from declarations)
  • src/hooks/useNativeAppLinks.ts:49 — useNativeAppLinks: DLT 61 (calls 61 distinct functions — high context load)
  • src/hooks/useNativeAppLinks.ts:52 — : DLT 59 (calls 59 distinct functions — high context load)
  • src/utils/native-routes.ts:114 — mapDeepLinkPath: MDD 58.1 (uses across many lines from declarations)
  • src/components/LandingPage/LandingPageClient.tsx:50 — LandingPageClient: MDD 44.0 (uses across many lines from declarations)
  • src/hooks/useNativeAppLinks.ts:166 — init: DLT 31 (calls 31 distinct functions — high context load)
  • src/components/LandingPage/LandingPageContent.tsx:29 — LandingPageContent: MDD 27.0 (uses across many lines from declarations)
  • src/components/LandingPage/landingStrings.ts:50 — landingStrings: MDD 26.6 (uses across many lines from declarations)
  • src/proxy.ts:11 — proxy: MDD 26.2 (uses across many lines from declarations)
  • src/hooks/useNativeAppLinks.ts:166 — init: MDD 20.6 (uses across many lines from declarations)
  • src/hooks/useNativeAppLinks.ts:95 — openDeepLink: MDD 20.1 (uses across many lines from declarations)
  • src/utils/native-routes.ts:440 — rewriteMethodPath CC 20 SLOC 34
  • src/proxy.ts:11 — proxy CC 18 SLOC 64
  • src/components/LandingPage/LandingPageClient.tsx — CC 11, MI 64.37, SLOC 52
  • src/components/LandingPage/LandingPageContent.tsx — CC 7, MI 62.92, SLOC 34
  • src/components/LandingPage/landingStrings.ts — CC 2, MI 52.29, SLOC 52
  • src/components/Migration/DownloadQR.tsx:17 — small useEffect that only sets state from deps

…and 12 more.

@github-actions

Copy link
Copy Markdown
Contributor

🧪 UI test report — ✅ all green

Suites

  • ✅ unit: 8351 ran, 0 failed, 0 skipped, 2.6m

📊 Coverage (unit)

metric %
statements 80.3%
branches 68.4%
functions 75.0%
lines 81.5%
⏱ 10 slowest test cases
time test
🐢 9.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › Network failure keeps loading while retries remain, then shows the generic error
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › MANTECA_SOURCE_OVER_MONTHLY_CAP fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › User KYC not approved fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › MANTECA_USER_NOT_PROVISIONED fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › routes the KYC rejection on its wire code, and does not retry it
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › MANTECA_MERCHANT_VOLUME_NEAR_CAP fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › MANTECA_MERCHANT_RECENT_REFUND fails fast with copy that names the real cause
4.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › a refused idempotency key tells the user to scan again, not to contact support
3.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › Going offline blames the connection, and reconnecting clears it for the recovered scan
3.0s src/app/(mobile-ui)/qr-pay/__tests__/qr-pay-states.test.tsx › Scan that recovers on the retry lands on the payment screen, not an error
📍 Inline annotations are in the **Unit test report** check above. Coverage artifact: `coverage-unit`. Generated by `.github/workflows/tests.yml`.

@github-actions

Copy link
Copy Markdown
Contributor

🖼 Visual diff — 4 screens moved

6 of 144 shots changed · 138 identical · baseline 6c8dc75 → head 428e392

worst % screen widths
48.91% early-user 320
43.38% avatar-picker 320, 430
0.87% guest-invite 320, 430
0.52% empty-history 320

job summary · before/after/diff images — artifact

Fixture screenshots, no backend. Advisory — this check never blocks a merge. Posted from the default branch by ds-shots-comment.yml; the report it renders is untrusted data.

@jjramirezn
jjramirezn marked this pull request as ready for review September 18, 2026 14:02
@jjramirezn
jjramirezn merged commit d035b65 into dev Sep 18, 2026
32 of 33 checks passed

This branch was successfully deployed

1 active deployment
Preview — 428e392c Deployed Sep 18, 2026 by vercel[bot]
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.

6 participants