Skip to content

feat: in-app invest/fund page with real app.angor.io handoff + explore UX fixes - #42

Open
Zazawowow wants to merge 6 commits into
mainfrom
web-invest
Open

feat: in-app invest/fund page with real app.angor.io handoff + explore UX fixes#42
Zazawowow wants to merge 6 commits into
mainfrom
web-invest

Conversation

@Zazawowow

@Zazawowow Zazawowow commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

Summary

Ports the invest/fund flow UI from angor-prototype (HubInvestPage.vue) into Angor Hub as a native page at project/:id/invest, with submission handing off to the real wallet + signing flow at app.angor.io / test.angor.io. Also includes explore-page loading/rendering fixes found during UAT.

Invest flow

  • Invest page — faithful port of the prototype layout: floating sticky nav (Back + project pill + Total Raised/Progress), 3-column grid (amount card / release schedule / transaction details), fixed desktop footer with total-incl-fees summary, mobile floating bottom bar
  • All three project types: invest (min 0.001 BTC + quick amounts), fund (installments 3/6 + weekly/monthly with generated payment schedule), subscription (3/6-month plans)
  • Real handoff, no mock payments: submit opens https://app.angor.io/investview/{projectId} (test.angor.io on testnet) where the actual wallet, transaction building, and signing live. Amounts >= 0.01 BTC (sats-based comparison) first show the "Use The App" interstitial (Download Now → /app, Continue with web → investview)
  • The originally ported mock payment machinery (hardcoded addresses, simulated QR payment, fake seed import/backup, localStorage pseudo-investments) was removed in ff06228 — it looked real enough that users could have paid an unrecoverable address. qrcode dependency dropped with it
  • Real data throughout: project details/stats from the indexer, stages from details.stages
  • Validation with inline errors + scroll-to-first-error; full dark-mode support via ThemeService

Header

  • Transparent at the top of the page; frosted blur layer fades in after scrolling past the header height (64px), reversing at the top
  • Fixed network dropdown rendering underneath page content (z-index stacking)

Explore page fixes (found during UAT)

  • No more empty-state flash: skeletons render from first paint; previously the "No Projects Match Your Criteria" state flashed while the Nostr deny-list reload delayed the first fetch (4d12a91)
  • Malformed narrow cards fixed: validating skeletons were wrapped in a grid nested inside the project grid, cramming them into one narrow column (905c2f1)
  • Smoother rendering: compositor-only card entrance animation with capped stagger, targeted transitions instead of transition-all, content-visibility: auto for off-screen cards, prefers-reduced-motion respected (905c2f1)
  • Profile images never lazy-loading: the banner fix (77b2658) used an opacity fade, but profile pics used display:none-until-loaded + loading=lazy — a hidden lazy image has no box so the browser never fetches it. Same opacity-fade pattern applied; skeleton→card swap now cross-fades (5582f59)

Notes

  • Real transaction building in-hub (wallet, taproot investment tx, Nostr signature exchange) remains a separate future effort; until then investview is the single real flow
  • blossom.angor.io (image CDN) is currently very slow server-side — clients now show shimmer placeholders while waiting, but CDN latency should be raised separately

Test plan

  • npm start, open a project, click Invest/Fund
  • Verify all three project types render correct amount cards and schedules
  • Submit with a valid amount < 0.01 BTC → opens app.angor.io/investview/{id} in a new tab
  • Amount >= 0.01 BTC → "Use The App" interstitial; Continue with web → investview; Download Now → /app
  • Confirm no payment/QR modal exists in-hub
  • /explore cold load: skeletons (not empty state) → cards fade in; no narrow cards while validating
  • Toggle light/dark theme across the flow; scroll: header blur fades in/out

Verified with headless UAT (Playwright, not committed): 14/14 invest-flow checks, explore loader/grid/animation/image checks all passing.

Dorian added 6 commits July 29, 2026 10:40
Adds project/:id/invest page faithfully replicating the prototype's
HubInvestPage: amount card with quick amounts, fund installments/
frequency, subscription plans, release/payment schedule, transaction
details, app-download interstitial (>= 0.01 BTC), invoice modal with
network tabs and simulated payment, seed backup and success modals.
Uses real project data from the indexer; payment side is mocked
(front-end only). QR codes generated locally via pinned qrcode dep.
Invest buttons now route in-app; app.angor.io kept as an option.
Header is transparent at the top and fades in a frosted blur layer
after scrolling past its own height (64px), reversing at the top.
Also keeps header dropdowns above page-level sticky bars.
The ported invest page simulated payments with hardcoded addresses,
fake QR codes, a fake seed backup, and localStorage-only persistence.
A user could have paid a real-looking QR with no recoverable funds.

Keep the amount/plan selection UX, but hand off submission to the
real wallet + signing flow at app.angor.io/test.angor.io investview:
- small amounts open investview directly
- >= 0.01 BTC shows the Use The App interstitial first
- remove mock invoice/import/backup/success modals and qrcode dep
On a fresh visit ngOnInit awaited the Nostr deny-list reload before any
project fetch started, so indexer.loading() was still false with zero
projects and the 'No Projects Match Your Criteria' empty state flashed
before the search had even begun.

Gate the empty state behind an initialLoadComplete signal so skeletons
render from first paint until the first fetch cycle finishes.
- Validating skeletons were wrapped in a nested grid that occupied a
  single cell of the parent grid, cramming them into one narrow column
  at the bottom of the list (the malformed empty cards)
- Render skeletons directly as grid children instead
- Add compositor-friendly entrance animation (opacity/transform only)
  with capped stagger for the first rows
- Replace transition-all on cards and avatars with targeted
  box-shadow/transform transitions
- content-visibility: auto skips paint for off-screen cards
- Respect prefers-reduced-motion
…o-card swap

The banner fix (77b2658) revealed images via an opacity fade on load,
but profile pictures got [class.hidden] (display:none) until loaded
combined with loading=lazy - a hidden lazy image has no box, so the
browser may never fetch it: hidden until loaded, never loading because
hidden. Apply the same opacity-fade pattern as banners.

Also add the missing opacity transition to the project page logo, and
start the card entrance animation from partial opacity so cards
replacing validation skeletons cross-fade instead of leaving a blank
gap.
@Zazawowow Zazawowow changed the title feat: in-app invest/fund flow (angor-prototype port) feat: in-app invest/fund page with real app.angor.io handoff + explore UX fixes Aug 11, 2026
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