feat(renderer): form-level ENS address preview mode (rich vs simple) for TransactionForm
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 48/100
- Tipo di issue
- Funzionalità
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Tranquilla
- Stack tecnologico
- react, typescript
- Ambito
- frontend
Direzione di ricerca
Inizia da packages/renderer/src/components/TransactionForm.tsx, DynamicFormField.tsx e fieldRegistry.ts, quindi confronta i pattern di rich-preview negli esempi e nei componenti del renderer indicati. Traccia i campi ricorsivi e gli hook di risoluzione dei nomi, esegui i test esistenti di TransactionForm e verifica che i casi rich, simple/default, annidato e privi di capability soddisfino i criteri di accettazione.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Add a form-level setting so TransactionForm / DynamicFormField can render blockchain-address fields with either:
| Mode | UX | Default when omitted |
|---|---|---|
rich |
Pattern A: AddressFieldWithResolvedPreview + ResolvedAddressFieldPreviewWithNameResolution + parent useWatch |
— |
simple |
Bare AddressField with inline “Resolved to 0x…” announcer (current behavior) |
✅ yes (backward compat) |
Today fieldRegistry maps blockchain-address → AddressField only. Rich preview exists elsewhere (Address Book AddAliasDialog, basic-react-app demos) but is not available to TransactionForm consumers (ui-builder form preview, exported apps, direct integrators).
Downstream tracking: OpenZeppelin/ui-builder#403 (Phase 2 — builder toggle, export schema, tests).
Motivation
- Single implementation path in
@openzeppelin/ui-rendererkeeps builder preview, exported apps, and anyTransactionFormconsumer aligned - Integrators can opt into rich ENS UX without custom field wrappers
- Omitted setting preserves behavior for existing serialized form schemas
Design principles
Capability-led, not ecosystem-specific. Gate behavior on EcosystemRuntime.nameResolution (resolveName / resolveAddress per NameResolutionCapability in @openzeppelin/ui-types). Do not branch on networkConfig.ecosystem === 'evm'.
When nameResolution is absent, both modes degrade to plain address input (existing useRuntimeNameResolver → EMPTY_RESOLVER behavior).
Proposed API
@openzeppelin/ui-types
export type EnsAddressPreviewMode = 'rich' | 'simple';
// On CommonFormProperties and/or RenderFormSchema:
ensAddressPreview?: EnsAddressPreviewMode;
Prefer a first-class schema field over metadata for export stability and discoverability.
@openzeppelin/ui-renderer
RenderFormSchema.ensAddressPreview
↓
TransactionForm (read schema, provide context)
↓
DynamicFormField (blockchain-address)
├─ 'rich' → BlockchainAddressDynamicField (Pattern A)
└─ 'simple' → AddressField (current)
Thread mode through recursive DynamicFormField calls so nested object/array/map address fields inherit the form-level setting.
Default: ensAddressPreview omitted → 'simple'.
Implementation tasks
ui-types
- Add
EnsAddressPreviewModetype - Add optional
ensAddressPreviewtoCommonFormProperties/RenderFormSchema - Export from package public API
ui-renderer
- Create
BlockchainAddressDynamicField(or equivalent) implementing Pattern A:useWatch→previewAddressrich:AddressFieldWithResolvedPreview+ResolvedAddressFieldPreviewWithNameResolutionsimple:AddressFieldnetworkIdfrom adapter /useAdapter()(existing patterns)
- Add React context (or prop threading) from
TransactionForm→DynamicFormFieldforensAddressPreview - Update
fieldRegistry/DynamicFormFieldswitch forblockchain-address - Graceful degradation when
nameResolutionmissing (no throws) -
richwithoutresolveAddress: forward resolution still works; preview card may be address-only
Tests
-
TransactionFormrenders rich preview whenensAddressPreview: 'rich' - Default / omitted → simple announcer (snapshot or behavioral)
- Nested
blockchain-addressfields inherit mode - Runtime without
nameResolution→ plain address field in both modes - Existing tests unaffected (default remains simple)
Docs / examples (optional but recommended)
- Note in
TransactionForm/ form schema docs - Extend
AddressFieldDemoor add minimal example showing schema flag
Acceptance criteria
-
ensAddressPreview: 'rich'onRenderFormSchemarenders Pattern A below allblockchain-addressfields inTransactionForm - Omitted or
'simple'matches currentAddressFieldannouncer behavior - No
ecosystem === 'evm'conditionals introduced - Nested fields inherit form-level mode
- Published package versions documented for ui-builder floor bump
References
Canonical Pattern A:
examples/basic-react-app/src/components/AddressFieldDemo.tsxexamples/basic-react-app/src/components/ENSResolutionDemo.tsxpackages/renderer/src/components/AddressBookWidget/AddAliasDialog.tsxpackages/renderer/src/components/ResolvedAddressFieldPreviewWithNameResolution.tsxpackages/components/src/components/AddressFieldWithResolvedPreview.tsx(verify path)
Current simple path:
packages/renderer/src/components/fieldRegistry.ts—'blockchain-address': AddressFieldpackages/renderer/src/components/TransactionForm.tsxpackages/renderer/src/components/DynamicFormField.tsx
Name resolution hooks:
packages/react/src/hooks/nameResolution/useRuntimeNameResolver.ts
Downstream:
- OpenZeppelin/ui-builder#403 — builder UI,
BuilderFormConfig, export@@FORM_SCHEMA_JSON@@ - OpenZeppelin/ui-builder#401 — ENS rollout (runtime creation options, dependency floors)
Open questions
- Should rich require
resolveAddress, or is forward-only + address card acceptable when reverse is missing? - Export
BlockchainAddressDynamicFieldfrom@openzeppelin/ui-rendererpublic API so ui-builder can dedupeBlockchainAddressFieldWithRichPreview? - Context vs explicit prop drilling for nested
DynamicFormField— prefer context to avoid signature churn on every recursive call?
Release notes (draft)
Feature:
RenderFormSchema.ensAddressPreview('rich' | 'simple') controls ENS feedback UX forblockchain-addressfields inTransactionForm. Default omitted →'simple'(no breaking change).
- Lingua principale
- TypeScript
- Stelle
- 7
- Fork
- 4
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di OpenZeppelin/openzeppelin-ui
-
Banner: allow a non-alert role for info and status notesForse già presa @pasevin l’ha presa 1 giorno fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
OpenZeppelin/openzeppelin-ui#258 ·
-
AddressDisplay: configurable copy button labelForse già presa @pasevin l’ha presa 1 giorno fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
OpenZeppelin/openzeppelin-ui#256 ·
-
Form fields write aria-describedby=" " when there's no helper text or errorForse già presa @pasevin l’ha presa 1 giorno fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
OpenZeppelin/openzeppelin-ui#251 ·
-
EmptyState: action slot, optional icon and descriptionForse già presa @pasevin l’ha presa 1 giorno fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
OpenZeppelin/openzeppelin-ui#249 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
OpenZeppelin/openzeppelin-ui#201 ·
Tutte le issue di OpenZeppelin/openzeppelin-ui
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
jeanibarz/knowledge-base-mcp-server#1268 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
Koenkk/zigbee-herdsman-converters#13820 ·
I maintainer di solito rispondono entro 2 giorni
-
[prefer-expect-resolves] autofix leaves a stray ")" when the awaited expression is parenthesizedAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
jest-community/eslint-plugin-jest#2052 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Wallet functions throws TypeError when the wallet has no account IDForse già presa @Medhansh-741 l’ha presa oggi. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
hiero-ledger/hiero-sdk-js#4781 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno