Skip to content

feat(footer): Update legal links in Footer - #2755

Merged
abalinda merged 4 commits into
mainfrom
claude/mobile-legal-links-audit-z4ed53
Aug 20, 2026
Merged

feat(footer): Update legal links in Footer#2755
abalinda merged 4 commits into
mainfrom
claude/mobile-legal-links-audit-z4ed53

Conversation

@innolope-dev

@innolope-dev innolope-dev commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

Why

The site directory had no route to any legal document. The only two legal links anywhere in the footer — Terms and Privacy — sat in the top nav, apart from the five card-programme documents, which were reachable only mid-application from CardTermsScreen. App-store review and the card issuer both expect those permanently reachable, so all seven now live in one Legal column.

The manifest's resources entry for "Terms" also pointed at a stale Notion export (peanutprotocol.notion.site/Terms-of-Service-Privacy-Policy-…) rather than the real /terms page.

What changed

Legal column replaces Resources (SEOFooter.tsx), keeping the 4-up grid:

  • Terms of Service, Privacy Policy
  • Card Terms (U.S.), Card Terms (International), E-Sign Consent, Account Opening Privacy Notice, Prohibited Activities Policy

Hrefs are authored /en/… and localized by the existing localizeHref, same as the manifest entries, so a Spanish or Portuguese reader lands on their own locale (marketing pages fall back to English prose where a translation is missing).

Resources folded into Learn More — Help Center, Pricing and Supported Networks now ride on top of the article links. Two entries are filtered out instead:

  • terms — the stale Notion export, superseded by /terms in the Legal column
  • jobs — already a top-level link in the footer nav above

The filter lives in the component because the manifest ships from the peanut-content submodule. If you'd rather those entries stop being generated at the source, that's a one-line change there and RESOURCES_MOVED_ELSEWHERE becomes a no-op safety net.

Footer nav now reads Support · Content · Docs · Security · Jobs — Terms and Privacy removed, one home per document.
footerdesktop

CopyfooterTerms/footerPrivacy now read "Terms of Service"/"Privacy Policy", the labels a legal column wants. footerResources gives up its slot to footerLegalSection plus five card-document keys, translated across en, es-419, es-ar and pt-br.

Testing

  • All seven legal URLs return 200 in /en, /pt-br and /es-419
  • Rendered and visually checked at 1440px and 390px
  • pnpm typecheck — 0 source errors
  • pnpm lint, prettier --check — clean
  • pnpm jest — 245/245 suites, 3169 tests passing
  • pnpm verify-content — passes, including the footer-manifest link pass

Out of scope

This fixes discoverability on the web footer only. The native app shell doesn't render this footer, and the profile/settings menu still has no legal links — worth a follow-up, along with two inconsistencies found while auditing: CardTermsScreen and ApplicationStatusScreen use plain <a target="_blank"> instead of DocsLink/openExternalUrl, and the prohibited-activities link is hardcoded to /en/ while every other card link localizes.


Generated by Claude Code

Summary by CodeRabbit

New Features

  • Added a dedicated Legal section to the site footer.
  • Added links for card terms, electronic-signature consent, account-opening privacy, and prohibited activities policies.
  • Combined resource and article links under Learn More.

Updates

  • Clarified Terms of Service and Privacy Policy labels.
  • Added localized legal-link labels for English, Spanish, and Portuguese.
  • Moved legal links out of the primary footer navigation for a cleaner layout.

The site directory had no route to any legal document, and the two links
that existed (Terms, Privacy in the footer nav) sat apart from the five
card-programme documents, which were reachable only mid-application from
CardTermsScreen. App-store review and the card issuer both expect those
permanently reachable, so all seven now live in one Legal column.

- Legal column: Terms of Service, Privacy Policy, Card Terms (U.S.),
  Card Terms (International), E-Sign Consent, Account Opening Privacy
  Notice, Prohibited Activities Policy — locale-routed like the manifest
  entries, so a Spanish reader lands on Spanish prose.
- Resources column is gone; Help Center, Pricing and Supported Networks
  move to the top of Learn More. The manifest's "Terms" entry is dropped
  (a stale Notion export superseded by the /terms page) along with
  "Jobs", which already sits in the footer nav above.
- Footer nav drops Terms and Privacy — one home per document.
- footerTerms/footerPrivacy now read "Terms of Service"/"Privacy Policy",
  the labels a legal column wants; footerResources gives up its slot to
  the new Legal keys across all four catalogs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018GWaH5h1Prm6zpeXkKWcZR
@innolope-dev
innolope-dev deployed to content-publish August 19, 2026 16:48 — with GitHub Actions Active
@vercel

vercel Bot commented Aug 19, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
peanut-wallet Ready Ready Preview Aug 19, 2026 6:05pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 812c3fff-e885-46ea-a865-a90e22241997

📥 Commits

Reviewing files that changed from the base of the PR and between 4d062ee and 309388b.

📒 Files selected for processing (1)
  • .github/workflows/tests.yml

Included review availability: 3 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 4 reviews per hour.


📝 Walkthrough

Walkthrough

The footer removes Terms and Privacy links from primary navigation. SEOFooter adds localized legal links, filters legal resources from Learn More, and combines remaining resources with articles. Locale catalogs define the new labels. The E2E workflow retries Playwright dependency installation.

Changes

Footer legal navigation

Layer / File(s) Summary
Localized legal translation contract
src/i18n/types.ts, src/i18n/*.json
The translation contract and locale catalogs add legal and card-document labels, update Terms and Privacy wording, and remove footerResources.
Footer resource and legal sections
src/components/LandingPage/SEOFooter.tsx, src/components/LandingPage/Footer.tsx
SEOFooter filters terms and jobs, combines remaining resources with articles under Learn More, and renders localized legal links. The primary footer removes Terms and Privacy links.

Playwright dependency installation

Layer / File(s) Summary
Retryable Playwright dependency installation
.github/workflows/tests.yml
The E2E workflow retries installation up to three times, cleans partial apt state, switches package mirrors after the first failure, and increases the step timeout to nine minutes.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 30938

This localized footer update consolidates legal links and reports passing validation checks; no actionable merge-blocking risk remains beyond normal review.

Possibly related PRs

Suggested labels: enhancement

Suggested reviewers: hugo0, kushagrasarathe

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the primary change: updating legal links in the footer.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/mobile-legal-links-audit-z4ed53

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

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Code-analysis diff

Painscore total: 7170.15 → 7170.54 (+0.39)
Findings: 0 net (+4 new, -4 resolved)

🆕 New findings (4)

  • medium high-mdd — src/components/LandingPage/Footer.tsx:57 — Footer: MDD 46.4 (uses across many lines from declarations)
  • medium complexity — src/components/LandingPage/SEOFooter.tsx — CC 28, MI 67.67, SLOC 99
  • medium high-mdd — src/components/LandingPage/SEOFooter.tsx:90 — SEOFooter: MDD 26.2 (uses across many lines from declarations)
  • low missing-return-type — src/components/LandingPage/SEOFooter.tsx:90 — SEOFooter: exported fn missing return type annotation

✅ Resolved (4)

  • src/components/LandingPage/Footer.tsx:57 — Footer: MDD 49.2 (uses across many lines from declarations)
  • src/components/LandingPage/SEOFooter.tsx:55 — SEOFooter: MDD 24.6 (uses across many lines from declarations)
  • src/components/LandingPage/SEOFooter.tsx — CC 19, MI 68.05, SLOC 52
  • src/components/LandingPage/SEOFooter.tsx:55 — SEOFooter: exported fn missing return type annotation

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

🧪 UI test report — ✅ all green

Suites

  • unit: 3172 ran, 0 failed, 0 skipped, 58.4s

📊 Coverage (unit)

metric %
statements 67.4%
branches 52.3%
functions 57.9%
lines 68.2%
⏱ 10 slowest test cases
time test
3.8s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › never places two stickers in heavy overlap (broad seed sweep)
1.2s src/utils/__tests__/demo-api.test.ts › isDemoMode() is false when not running under Capacitor
0.4s src/app/actions/__tests__/api-headers.test.ts › should include Content-Type in validateInviteCode
0.4s src/utils/__tests__/auth-token.test.ts › authReady does not park — hydrates the plain token without an unlock
0.4s src/utils/__tests__/sentry.utils.test.ts › defaults to the client budget under a browser global
0.3s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › every sticker stays within canvas at any count
0.3s src/utils/__tests__/auth-token.test.ts › returns the token hydrated from Preferences after authReady
0.3s src/app/(mobile-ui)/withdraw/__tests__/withdraw-states.test.tsx › Bank withdrawal keeps the $1 minimum for sub-$1 amounts
0.3s src/hooks/__tests__/useCrispTokenId.test.ts › retries then stays undefined when the endpoint keeps failing (no fallback token)
0.3s src/utils/__tests__/auth-token.test.ts › ignores the guarded marker and falls back to the plain token
📍 Inline annotations are in the **Unit test report** check above. Coverage artifact: `coverage-unit`. Generated by `.github/workflows/tests.yml`.

@innolope-dev innolope-dev changed the title feat(footer): replace Resources column with Legal feat(footer): Update legal links in Footer Aug 19, 2026
`apt-get update`, run inside `npx playwright install-deps chromium`, stalls
intermittently on the runner's Azure mirrors. On 2026-08-19 it killed the
e2e job three consecutive times on one commit — each run ignoring
azure.archive.ubuntu.com, then hanging on archive.ubuntu.com noble-security
until the 6-minute cap — while sibling runs minutes apart cleared the same
step in seconds. Unrelated branches hit it the same afternoon, so it is not
branch-specific.

The stall is transient, so retry rather than mask: three attempts with a
150s per-attempt cap, dropping to the canonical archive after the first
failure. One bad mirror now costs an attempt instead of the whole job.

Deliberately still exits non-zero once the attempts are spent. Since
`Run E2E tests` is continue-on-error, a setup step is the only thing that
can red this job — making the install non-fatal would leave a genuinely
missing system library silently unreported.

The job cap moves 6 → 9 minutes to fit three bounded attempts; it stays well
under the job's own 20-minute ceiling, so the fail-fast property that
`ci-success` depends on is preserved.

Verified by extracting the run block and exercising it under `bash -e` with
fakes for npx/sudo/timeout: succeeds on first pass, recovers on a third
attempt, and exits 1 when all three stall. The guarded pkill/sed cleanups
return non-zero without aborting the script.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018GWaH5h1Prm6zpeXkKWcZR
claude and others added 2 commits August 19, 2026 17:22
Review feedback on the retry loop. `timeout` already runs the attempt in its
own process group and signals that whole group, so the apt children do receive
the SIGTERM — `--kill-after=15s` escalates to SIGKILL for any that ignore it.

That makes `sudo pkill -9 -f '[a]pt-get'` both redundant and unsafe: it matched
by command line across the entire runner, so it could have killed unrelated
package work rather than only this step's descendants. Removed.

The apt partial-list cleanup stays — that clears state a killed attempt leaves
behind, which is what the next attempt trips over.

Re-verified under `bash -e` with fakes: succeeds first pass, recovers on the
third attempt, exits 1 when all three stall.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018GWaH5h1Prm6zpeXkKWcZR
…ps-retry

fix(ci): retry Playwright system-deps install past apt mirror stalls
@abalinda
abalinda merged commit 7afaa1d into main Aug 20, 2026
30 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.

4 participants