Skip to content

feat(payments): [3/10] redesign Contacts behind new-design-contacts - #2168

Open
arseniy-nikitochkin wants to merge 29 commits into
feat/payments-redesign-1-foundationfrom
feat/payments-redesign-2-contacts
Open

arseniy-nikitochkin wants to merge 29 commits into
feat/payments-redesign-1-foundationfrom
feat/payments-redesign-2-contacts

Conversation

@arseniy-nikitochkin

@arseniy-nikitochkin arseniy-nikitochkin commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

2 of 7 in the redesign stack. It redesigns Payments' Contacts (the list, a new contact, a contact's page) and adds the first design module.

  • New flag new-design-contacts (SDP_FLAG_NEW_DESIGN_CONTACTS, on by default). It counts only while new-design is on. When off, Contacts runs main's code, skeletons, header and "Counterparty" label.
  • The header now works out each page's design itself from new-design plus the module flags (getDashboardPageConfig's new last parameter). Callers pass flags, not a precomputed boolean, so main's header tests pass unchanged.
  • Additive changes to shared logic stay in place: counterparty-detail.data.ts and counterparty-page.data.ts.
  • Known gaps until later PRs: a contact's Pay button opens the old Pay page without the contact preselected. An old ?tab=playground link on Contacts opens the Payments playground without the contact endpoints.
  • Copy is English only (messages/en).

Verification: tsc clean; biome, copy audit and module boundaries pass; 192 test files (1,660 tests) pass.
image
image
image

arseniy-nikitochkin and others added 3 commits September 29, 2026 22:43
The contact list, a new contact and a contact's page move to the refresh design. The rest of
Payments keeps the previous design either way.

Files main has keep main's code at their paths. A redesigned file gets a .redesign sibling
with the new version; a route's page.tsx or loading.tsx keeps main's code and picks its
.redesign sibling on NEW DESIGN. With the flag off every page runs main's code.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-redesign-2-contacts

# Conflicts:
#	apps/sdp-web/src/components/dashboard-header.tsx
Contacts is the first design module. Its routes, loading skeletons, theme
scope, header and sidebar label follow new-design-contacts
(SDP_FLAG_NEW_DESIGN_CONTACTS, on by default), and only while NEW DESIGN is
on. The header works out each page's design from NEW DESIGN and the module
flags itself, so callers pass the flags, not a precomputed answer.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

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

Project Deployment Actions Updated
sdp-docs Ready Ready Preview Oct 2, 2026 4:38pm UTC
sdp-web Ready Ready Preview Oct 2, 2026 4:38pm UTC

Request Review

@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

React Doctor found no new issues. 🎉

Reviewed by React Doctor for commit 6819844.

@greptile-apps

greptile-apps Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 5/5

[Medium risk] Redesigns the contacts feature behind a feature flag.

The PR appears safe to merge based on the findings in scope for this review.

Findings

  1. P2 Detail sections jump after loading ▶

Summary

The PR adds a flag-gated Contacts redesign, covering the directory, creation flow, detail page, and route loading states, while retaining the legacy experience when the flag is off.

  • Adds paged contact, address, and payout reads with explicit incomplete-read states.
  • Updates shared dashboard navigation, header configuration, and English source copy.

Reviews (19) · Last reviewed commit: "Merge branch 'feat/payments-redesign-1-f..."

Comment thread apps/sdp-web/src/app/dashboard/payments/counterparty/counterparty-page.data.ts Outdated
arseniy-nikitochkin and others added 3 commits October 1, 2026 08:06
…hey loaded

Review found states where the new Contacts pages misreport data. A failed
address or directory read looked like an empty result. A failed delete left
the contact hidden. Payouts were summed as floats and "Not yet" ignored
unloaded history. Customer links carried on account rows were dropped.
Repeated contacts across directory pages are now deduped.

React Doctor flagged two verbatim copies of main's code. The contact page now
imports main's TransferDetailModal (exported, otherwise unchanged), and the
redesign skeletons re-export main's CounterpartyCreateSkeleton.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-redesign-2-contacts

# Conflicts:
#	apps/sdp-web/src/i18n/ui-copy-baseline.json
arseniy-nikitochkin and others added 2 commits October 1, 2026 11:57
…s list

The address filter is withdrawn from the menu when saved addresses fail to
load, but a value picked before that refresh kept narrowing the list. With
no addresses loaded every contact was filtered out, and nothing on screen
could clear it. The list now ignores the filter while it is hidden and
applies it again, still selected, once addresses load.

Moving the row filter and the load notices out of CounterpartyWorkspace also
clears React Doctor's control-flow complexity warning on it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A failed transfers read on the redesigned contact page fell through to the
empty-history copy: "Not yet" for Last paid and Paid so far, and "No
payments yet" under Payments. That understates history the page never saw.
The page now marks both fields "Not loaded" and offers a retry in place of
the empty state.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…n addresses failed

Review still found two Contacts pages understating what they hold. "Paid so
far" and "Last paid" summed the latest 50 transfers, so older payouts never
counted and a busy contact could read "None in the latest 50". The page now
asks the transfers API for the contact's settled outbound payouts and reads
them in pages up to 500, qualifying the total only past that cap.

A failed address read on a contact's page still said "No saved addresses";
it now says the read failed and offers a retry, and a capped read says how
many it shows. The Contact list's address notices now say address search can
miss an unloaded address.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
arseniy-nikitochkin and others added 2 commits October 1, 2026 12:51
The saved-address list was copied into state on first render, so a Retry
that refreshed the page still showed the empty list it started with and
read "No saved addresses". The list now follows the page's read, with
addresses added here since kept on top until the read holds them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-redesign-2-contacts

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
arseniy-nikitochkin and others added 2 commits October 1, 2026 14:26
…-redesign-2-contacts

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-redesign-2-contacts

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ule id from the copy audit

The per-area NEW DESIGN flag's description is Vercel Toolbar metadata for operators, and
"contacts" in the sidebar is the design-module id passed to isDesignModuleOn, not a label.
Neither is ever rendered, so both get a reasoned exemption alongside the baseline entry the
non-strict audit reads, as the other NEW DESIGN flag copy already has.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-redesign-2-contacts

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Contacts detail drew its record rows with a file-local DetailRow. Move it to
components/ui/detail-list.tsx as DetailList/DetailRow with the same classes and
DOM, so Pay's review can use the same rows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@arseniy-nikitochkin arseniy-nikitochkin changed the title feat(payments): [2/7] redesign Contacts behind new-design-contacts feat(payments): [2/9] redesign Contacts behind new-design-contacts Oct 2, 2026
@arseniy-nikitochkin
arseniy-nikitochkin changed the base branch from feat/design-tokens to feat/payments-redesign-1-foundation October 2, 2026 08:51
@arseniy-nikitochkin
arseniy-nikitochkin added this pull request to stack #2185 October 2, 2026 09:02
…-redesign-2-contacts

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@arseniy-nikitochkin arseniy-nikitochkin changed the title feat(payments): [2/9] redesign Contacts behind new-design-contacts feat(payments): [2/10] redesign Contacts behind new-design-contacts Oct 2, 2026
@arseniy-nikitochkin arseniy-nikitochkin changed the title feat(payments): [2/10] redesign Contacts behind new-design-contacts feat(payments): [3/10] redesign Contacts behind new-design-contacts Oct 2, 2026
…-redesign-2-contacts

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-redesign-2-contacts

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e, as the design draws

The Addresses, Provider accounts and Payments headings sat 64px under the block before them;
the record pages' design puts them 54 down. The 24px between blocks stays, the section's own
top space drops from 40 to 30.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ection spacing

The skeleton kept 40px above each section after the page moved to 30, so sections jumped
10px up when loading finished.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

This branch was successfully deployed

2 active deployments
Preview – sdp-web — 68198442 Deployed Oct 2, 2026 by vercel[bot]
Preview – sdp-docs — 68198442 Deployed Oct 2, 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.

1 participant