Connect modal does not distinguish installed vs not-installed wallets, all options appear identical before clicking #139
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:implement
agent:implement
agent:open_issues
agent:ready
agent:research
agent:security_audit
agent:verify
architecture
backend
blocker:hybrid
blocker:launch
blocker:limit-orders
blocker:v2
block:log_only
block:security
bug
ci
contracts
correctness
deploy
dev
devops
docs
documentation
duplicate
e2e
enhancement
epic
feature
frontend
functional-completion
gas
good first issue
governance
help wanted
high-risk
hooks
hybrid
indexer
infra
infrastructure
integrators
invalid
launch-blocker
limit-orders
localnet
localterra
low priority
missing-implementation
needs-design
ops
performance
priority
high
priority
medium
product
qa
QA
question
ready
ready
research
scripts
security
security-hardening
smartcontracts
tech-debt
testing
ux
UX
v2
verification
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-dex-terraclassic#139
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Issue Summary
The connect wallet modal lists all wallet options (Station, Keplr, WalletConnect, Leap, etc.) identically regardless of whether the extension is installed in the browser. No "installed" badge, label, or visual treatment differentiates available wallets from unavailable ones before the user clicks. Clicking an uninstalled wallet does return an error (e.g. "Failed to connect Leap: Leap extension is not installed"), so the failure is not silent, but the user has no way to know which wallets are ready without clicking each one.
Reproduction Steps
http://127.0.0.1:3000in a browser profile that does not have all wallet extensions installedExpected Behavior
Wallet options that are not installed should be visually distinct before the user clicks — for example, grayed out, with a label like "Not installed", or with an "Install" CTA. This lets users immediately identify which wallets are ready to use without a trial-and-error click cycle.
Actual Behavior
All wallet options look identical regardless of install state. Clicking an uninstalled wallet (e.g. Leap) returns "Failed to connect Leap: Leap extension is not installed" — error handling is present, but the modal gives no pre-click signal about which wallets are available.
Environment Details
localterra(local Docker)VITE_NETWORK=local npm run devWallet / Device Details
Screenshot
list of available wallets on my host system
when i try to click on one of the wallet connect extensions, you can also see that the wallets that are installed are not distinguished from those that aren't installed.
Severity / Impact
P2 Polish. No funds are at risk, but the missing install/not-installed differentiation is a standard UX pattern on every multi-wallet dapp. A CEX-migrant unfamiliar with browser extensions has no way to know which wallets work and no path to install a missing one. Found under W2-C2 (Wallet selection UX Display dimension).
cc: @PlasticDigits
mentioned in issue #116
@totdking @PlasticDigits — source-level audit found additional gaps in the connect modal beyond the installed-vs-not-installed differentiation this ticket covers. flagging for scope-decision: extend here vs file siblings.
Additional gaps found at
frontend-dapp/src/components/wallet/WalletModal.tsxHIGH
{option.name}+{option.connectionLabel}); no per-wallet brand logo or icon. Sister gap to the installed-badge issue this ticket scopes — distinguishing wallets visually with their brand mark also helps a CEX-migrant identify Station vs Keplr vs Leap before clicking.POLISH
Cross-link
Line 65— error rendered raw via<div className="alert-error">{error}</div>. Covered separately in the off-chain error humanization pile (filing a sibling ticket for that).Suggestion
either:
A. expand this ticket to cover all connect modal display gaps (logos + connecting copy + descriptions + retry + subhead) plus the existing installed differentiation
B. keep this ticket scoped to installed-vs-not-installed and file siblings for logos and connecting-state
either works. defer to your call on which is cleaner for tracking.
cc @PlasticDigits
mentioned in issue #145
For wallet icons & branding they can be copied from the gitlab.com/plasticdigits/cl8y-bridge-monorepo
B is approved - file sibling issues for logos and connecting state.
mentioned in commit
fcbd77c81aImplemented #139 (scope B: installed vs not-installed only; logos / “which wallet is connecting” remain sibling tickets per thread).
What changed
frontend-dapp/src/services/terraclassic/walletExtensionInstall.ts, aligned withgetKeplrLikeExtensionfor Leap/Cosmostation and'station' in windowfor Station. WalletConnect options are unchanged (no “not installed” label).useWalletExtensionInstallSnapshotre-reads install state on window focus and document visibilitychange so returning from a store tab can refresh badges without a full reload.docs/frontend.md§ Connect modal: extension install detection (anchor#connect-modal-extension-install); cross-links inskills/AGENTS_BUNDLE_DEV_WALLET.md.walletExtensionInstall.test.ts.Modal.test.tsxnow passes requiredchildrensotsc -b/npm run buildsucceeds (was failing onmainbefore this change).Checklist for QA
npm run buildandnpx vitest runinfrontend-dapppass on latestmain.@brouie could you confirm the above on your side when you have a moment? Leaving the issue open until verified.
(Agent push: latest
mainincludes commitfcbd77c.)Checklist for QA
npm run buildandnpx vitest runinfrontend-dapppass on latestmain.Issues noticed
Build & Test Gate Failures
npm run build— Failed (3 TypeScript errors) The production build was blocked by type errors introduced when the patch and test files were last updated. No code was changed at runtime buttscstrict checking caught three mismatches: an unsafe index access inPriceChart.test.tsx, an incompleteMediaQueryListmock signature inTradePage.test.tsx, and astring | undefinedpassed wherestringis required inTradePage.tsx. These must be resolved before a production build is possible.npx vitest run— 1 test failed out of 594 The only failure iscosmesPatch127.test.ts— a stale test asserting symbol names (EXTENSION_SIGNED_FEE_MIN_PERCENT,gasFromAminoFee,gasFromDirectSignedAuthInfoBytes) that no longer exist in the patched file. The patch itself is correctly applied and functioning — 6 of the 9 assertions pass. The test needs to be updated to reflect the renamed symbols.Status: Both gates are currently red. Neither failure affects runtime behaviour but both block CI and the build checklist.
cc: @PlasticDigits similar to comment https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/138#note_3385130841
mentioned in commit
ec5dac88f2Build & test gates — resolved
Commit:
ec5dac8onmainThe three TypeScript errors blocking
npm run buildare fixed:PriceChart.test.tsx—getCandlesmock now handles optionalintervalbefore indexing the close-price map (stricttsc -bover test files).TradePage.test.tsx—matchMediastub usesas unknown as MediaQueryListwith a typedMediaQueryListEventlistener (aligned withuseMediaQuery.test.tsx).TradePage.tsx—isKnownFactoryTradePairis now a type predicate (addr is string) sosetPairAddr(routePair)narrows correctly after the guard.Docs / agents:
docs/frontend.md§tsc -binvariant and connect-modal Build gate row; cross-links inskills/AGENTS_FRONTEND_PRODUCTION_BUILD.md,AGENTS_FRONTEND_WALLET_CONNECT_MODAL.md,AGENTS_FRONTEND_TRADE_INVALID_PAIR_LINK.md.Verification
QA checklist item 4 is now green. Closing #139 — install-detection UX was already verified in browser (items 1–3).
mentioned in issue #337
mentioned in issue #490
mentioned in issue #554
mentioned in issue PlasticDigits2/ustr-cmm#17
mentioned in issue #566