Repository navigation
Align web payments with Hub and preserve wallet and network context - #976
Merged
Merged
Conversation
…handoff tests Remove window.deriveWalletSeed, WalletKeyService and GetOrDeriveExtKeyAsync; derivation is lazy via GetOrDeriveExtKey again. Founder/Create/Spend show an investor-only message when the browser wallet has no founder keys. Extract network/amount handoff rules into InvestHandoff. Add BIP-39 cross-derivation tests and Angor.Client.Tests. Restore index.html icon links.
dangershony
added a commit
that referenced
this pull request
Oct 14, 2026
…Error Drop IndexerFailoverHandler and its registration, restore original HttpClient keys/timeouts, use #976's NostrCommunicationFactory, revert out-of-scope global.json/AGENTS.md/dev-run.sh/.gitignore. Add tests: 5xx/403/408/429 mark indexer offline, 404 does not.
dangershony
marked this pull request as ready for review
October 14, 2026 22:36
dangershony
added a commit
that referenced
this pull request
Oct 14, 2026
* chore(dev): support Linux development after macOS migration
* docs: UX/UI audit report for next version
* feat(ux): toast severity fix, keyboard access, semantic tokens, typography migration, password reveal, seed UX
- Fix: failure toasts (claim/release/wallet create/import/settings/funders/edit-profile)
no longer render as green success toasts — ToastRequested now carries ToastSeverity
end-to-end; all failure call sites pass ToastSeverity.Error
- Keyboard: global :focus-visible ring (V2 theme replaced Fluent templates so none existed);
Escape closes shell modals / steps back (reuses TryHandlePlatformBack) at shell root,
plus Settings network/wipe modals; accessible names on icon-only shell buttons
- Tokens: danger/warning/Bitcoin accent literal hexes migrated to semantic brushes
(DangerBrush, DangerBrightBrush, DangerSoftBrush, WarningBrush, WarningBrightBrush,
WarningSoftBrush, BitcoinAccentBrush)
- Typography: 938 TextBlock FontSize attributes migrated to Typography classes
(Size-XXS..XXL + interim exact-pixel Size-10..80 gap steps); XMl validated pre-write
- Tooltips: truncated bound TextBlocks now show the full value on hover (31 sites)
- Passwords: eye reveal toggles on PrivateKeysPasswordModal + claim/release password
fields; plaintext-download warning + live seed word-count hint in CreateWalletModal
- Dead code: remove InvestPageViewModel.SubmitOpacity (real CanSubmit/IsEnabled is used)
* fix(theme): use FocusAdornerTemplate for :focus-visible ring (ControlTemplate is invalid)
* docs: handoff notes for further-ux-polish branch
* feat(find-projects): virtualize project grid + hex-literal regression guard
- Project grid now row-chunks (ProjectRowViewModel) and renders via
VirtualizingStackPanel + UniformRowPanel: only visible rows materialize and
recycle instead of inflating every ProjectCard in a non-virtualizing
ResponsiveGrid. View reports width-driven column count to the VM which
re-chunks rows synchronously (keeps headless tests deterministic).
- ProjectListVirtualizationTests: chunk order/count invariants + rendered
proof that long lists only realize viewport rows (+overscan).
- HexLiteralGuardTests: first source-scan test — fails if the seven migrated
danger/warning/Bitcoin hexes reappear as literals in UI/{Sections,Shell,Shared}.
- ResponsiveGrid unchanged for the bounded grids (MyProjects, Portfolio).
* chore: keep UX polish notes local
* Recover from server outages and improve project loading UX
* fix(theme): use semantic danger brush for claim scan errors
* fix(invest): reject insufficient wallet funds before relay lookups
* Remove indexer failover; restore indexer clients; test CheckAndHandleError
Drop IndexerFailoverHandler and its registration, restore original HttpClient keys/timeouts, use #976's NostrCommunicationFactory, revert out-of-scope global.json/AGENTS.md/dev-run.sh/.gitignore. Add tests: 5xx/403/408/429 mark indexer offline, 404 does not.
* Propagate indexer failures and harden SDK callers
MempoolIndexerAngorApi keeps EnsureSuccessStatusCode and lets HTTP/JSON/timeout errors propagate. SpendStageFunds, CancelInvestmentRequest, CreateProjectKeys and GetPenalties return Result.Failure instead of throwing. Tests: 5xx and HTML 200 never yield an empty success.
* Skip failing projects in Nostr discovery; test insufficient-funds check
BEHAVIOUR CHANGE: LatestFromNostrAsync no longer fails all-or-nothing; one project whose validation fails is skipped and the rest are returned. ProjectDiscoveryRecoveryTests reworked accordingly. Retry with ConcurrentDictionary kept. Add InvestWithWallet funds-check tests.
* RequestInvestmentSignatures: fail closed when the indexer is unreachable
Check the existing-investment lookup before any seed-word access or Nostr send; an indexer failure now returns a Result.Failure. Add tests (throws, existing, null). Document why CheckExistingInvestment intentionally fails open.
---------
Co-authored-by: dangershony <dan.gershony@gmail.com>
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.
Web payments now retain the Hub's network, active indexer and theme, and provide one consistent Invest, Fund and Subscribe flow. Completed payments use a compact, vertically centered card with transaction and recovery actions instead of a full-width green banner.
Changes:
This branch is based on current main and contains only the web-payment work and its shared dependencies. Companion Hub change: block-core/angor-hub#43
Validation:
Remaining validation limits:
Browser scenarios, wallet state, recovery phrases and traces are kept outside the repository and are not uploaded.
Founder pages are investor-only
Browser wallets created on the invest page have no founder keys. Create, Founder and Spend show an investor-only notice ("This browser wallet is investor-only. Import your recovery phrase into the Angor app to create or manage projects.") instead of throwing.
Manual recovery test script (to be run by a human; results not filled in yet)
/invest/{projectId}?network=Angornetin a clean browser profile.____src/design), import the phrase on Angornet.Result:
____(not yet performed)