feat(payments): [3/10] redesign Contacts behind new-design-contacts - #2168
Open
arseniy-nikitochkin wants to merge 29 commits into
Open
arseniy-nikitochkin wants to merge 29 commits into
arseniy-nikitochkin wants to merge 29 commits into
Conversation
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>
Contributor
|
React Doctor found no new issues. 🎉 Reviewed by React Doctor for commit |
Contributor
|
…-redesign-2-contacts
…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
…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>
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>
…-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
changed the base branch from
feat/design-tokens
to
feat/payments-redesign-1-foundation
October 2, 2026 08:51
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>
…-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>
…-redesign-2-contacts
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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-design-contacts(SDP_FLAG_NEW_DESIGN_CONTACTS, on by default). It counts only whilenew-designis on. When off, Contacts runs main's code, skeletons, header and "Counterparty" label.new-designplus the module flags (getDashboardPageConfig's new last parameter). Callers pass flags, not a precomputed boolean, so main's header tests pass unchanged.counterparty-detail.data.tsandcounterparty-page.data.ts.?tab=playgroundlink on Contacts opens the Payments playground without the contact endpoints.messages/en).Verification: tsc clean; biome, copy audit and module boundaries pass; 192 test files (1,660 tests) pass.


