b54a3139c7
Includes QWB, Qortal Web, and Q-Shops Q-Apps with shared packages and build scripts. Co-authored-by: Cursor <cursoragent@cursor.com>
24 KiB
24 KiB
Q‑Shops changelog
0.0.44 — 2026-05-01
- Fix
paymentOverlay is not defined: RestoreduseStateforpaymentOverlayandinvoiceInspect(they were dropped during an earlier edit). Payment overlay and invoices work again.
0.0.43 — 2026-05-01
- Blank Hub / “only theme”: When no shops or products are in memory yet (cold directory, slow QDN), the main column could be completely empty. A Marketplace panel now always shows loading or how to proceed, plus the live status line.
- Crash visibility:
QshopsErrorBoundarywraps the app so a mount/render error shows a message instead of a blank screen. - First paint:
data-qshops-theme="dark"on<html>inindex.htmlso CSS variables apply before React runs.
0.0.42 — 2026-05-01
- Fix blank Hub view: Persisted browse tab
orderswithout a loaded wallet left no catalog and no orders panel (only the dark page background). Cold start no longer restoresordersfromlocalStorage;useLayoutEffectresetsorders→productswhen the wallet disconnects; unauthenticated My orders shows a short sign-in hint instead of an empty column.
0.0.41 — 2026-05-01
- Post-pay Q-Mail /
GET_ACCOUNT_DATA:tracedQReqnow usesqReqLong(same bridge as checkout) with 180s race default. Shop owner / buyer public keys load withGET /addresses/{addr}first (guide §5), then HubGET_ACCOUNT_DATAonly if needed — avoids 10s “no response” right after approvingSEND_COINwhen the Hub is still busy. - Payment vs Q‑Mail: If the wallet transfer succeeds but DOCUMENT_PRIVATE + MAIL_PRIVATE publish fails, the overlay explains payment vs seller notification (no longer looks like the payment itself failed). Invoices show Paid — verify in Hub when there is no tx reference instead of a bare “Confirmed”.
- My orders: Full in-app page — toolbar tab My orders (with count) replaces the old modal; list + hint live in the main column. Invoice detail stays a modal.
0.0.40 — 2026-05-01
- Shops gallery: Shop intro / description (
.qs-shop-card__intro) is center-aligned, with a theme-aware panel behind it (opaque dark teal scrim in dark mode, soft white in light mode) so text stays readable over hero imagery and on plain cards.
0.0.39 — 2026-05-01
- Hub bridge (critical): Added
hasQortalBridge()— treatsqortalRequest,qortalRequestWithTimeout, andqortalRequestWithNoTimeoutonwindow/parent/topas a valid bridge.getQortalRequest()alone missed timeout wrappers, sorefreshUser/ save-shipping / pay could think the API was missing whileqReqLongwould have worked — no approval UI, no account. - Checkout pay:
SEND_COIN/ asset transfer runs before closing cart/checkout (no pre‑payment rAF + 80 ms delay). Checkout closes after Hub returns success. SEND_COIN: After the numeric payload, triesamountas an 8‑decimal string (some Hub builds are strict).- CSS: Fixed orphaned rules under
.qs-catalog--list .qs-card__list-body(list layout + text column).
0.0.38 — 2026-05-05
- Qortal bridge (critical):
qReq/qReqLongnow resolve per window (iframe → parent → top): on each context,WithTimeout→WithNoTimeout→qortalRequest. Previously we picked the first context that hadWithTimeout, so if only the iframe exposedqortalRequest(Hub/stub) but parent hadWithTimeout, calls went to the wrong bridge and payments / QDN publish could fail silently (see Q-Apps guide: always wireqortalRequestcorrectly). - Catalog list view: Product image column stretches full row height (left strip cover-fills top–bottom), fixed width 102px (80px narrow).
0.0.37 — 2026-05-05
- Qortal bridge (payments):
qReqLongnow triesqortalRequestWithTimeout/WithNoTimeouton parent/top before requiringqortalRequeston the iframe — matches QWB and fixes cases whereSEND_COIN/GET_NAME_DATAnever ran because only the long-path helper was installed. - Recipient lookup:
resolveNameOwnerAddressusesqReqLong(same as storefront) instead of shortqReq+ 25 s race. - UX: Removed
pointer-events: noneon the main shell during pay and on checkout while saving — those layers froze the UI and could block Hub interaction. User chip shows the name on one line (ellipsis + tooltip); masthead Q-Shops · Changelog · theme stay on one row to the right of the title. - Checkout: Button label Save shipping details; copy explains local cache vs QDN publish (Fill works from browser cache without re-approving).
0.0.36 — 2026-05-05
- Shops gallery: Each shop window shows a full-width logo at the top, then the intro over up to three product photos (split hero + scrim) for a unique look per catalog. Identity row uses the catalog shop name, with @{website} and product count below (publisher avatar). Search includes shop name.
- Catalog list view: Product thumbnails are square (88×88, 76×76 on narrow screens) with
object-fit: contain+ small inset padding (same treatment as grid cards), sized smaller than typical grid cells.
0.0.35 — 2026-05-01
- Masthead: Changelog and theme sit on one row after the Q‑Shops title (with the logo); the title cluster is centered on small screens and left-aligned on wide layouts.
- Identity: User chip shows the full Hub primary name when available (no ellipsis); name can wrap inside a wider chip.
- Hub approval (publish & pay): While saving shipping to QDN, the checkout layer uses
pointer-events: noneso the Hub publish dialog can receive input (same idea as QWB — no modal above the signer). Pay closes cart + checkout, clears the pre‑SEND overlay, and the shell yields pointers duringpayBusysoSEND_COIN/ asset transfer prompts are not trapped under the Q‑App iframe UI.
0.0.34 — 2026-05-05
- Hub payments: Full-screen payment overlay used z-index 200000 and captured all clicks, so the
SEND_COIN/ asset-transfer signer could sit under the dimmer inside the Q-App iframe. While waiting on the Hub, the overlay now usespointer-events: none(.qs-pay-overlay-back--yield-signer) and a lower base z-index (~12k) so approval dialogs receive input — aligned with QWB relying onqortalRequestWithTimeout. Same yield during Q-Mail batch approval. - Save shipping to QDN:
PUBLISH_MULTIPLE_QDN_RESOURCESnow usesqReqLong(like other Hub-approved publishes) so the bridge routes through the long-timeout / Hub helper path instead of a bareqortalRequestthat can skip the signer UX on some builds. - Profile UX:
pickupNotesincluded in the encrypted document; optimisticlocalStoragecache before publish so Fill my details works immediately; fetch-on-checkout unchanged for cross-device JSON. Messages explain Hub approval vs local cache.
0.0.33 — 2026-05-05
- Catalog sync: Live SEARCH merges replace each publisher’s manifests (so listing prices, stock, and SKUs refresh) and drop shops returned with no catalog products — directory + live scans apply in one state update after each cold/widen merge.
- Refresh cadence: Live network scan every ~90s (was 4m) plus a throttled SEARCH merge when you return to the tab (~45s gap).
- List layout: Product thumbnail column is taller and full-bleed cover (
object-fit: cover) so the image fills the box; title and description stay in the middle column without overlap. Prices sit center–right in the rail; shop avatar sits left of the shop name. - Detail modal / options: Prefetch gallery + all variant option image URLs when the modal opens, and warm neighbors around the selected gallery index; main image uses
fetchPriority="high"; first gallery thumbs load eager. - Perf: List/catalog product images use
decoding="async"where shown.
0.0.32 — 2026-05-01
- Checkout (QWB parity): Delivery uses coordinates vs street address (street shows structured fields); digital-only carts keep an optional location block for the buyer’s records.
- Buyer profile: Fill my details (when a cached / QDN profile exists) + Save shipping to QDN (encrypted DOCUMENT, same identifier as QWB checkout profile).
- Payments: Payment overlay opens before closing checkout, then two animation frames (+ short delay) before
SEND_COIN/TRANSFER_ASSETso Hub signer prompts are not lost to modal teardown;payInFlightRefblocks overlapping approvals. - Identity: Memo field shows read-only Qortal primary name from the authenticated account.
- Coupons: Per-vendor discount field appears only when that shop’s manifest lists
coupons. - Header: Theme toggle sits beside Changelog in the title lockup; compact tool row spacing for Changelog + theme.
- Copy: Removed verbose checkout intros and the old multi-vendor “bundled SEND” disclaimer; Pay all shops wording simplified.
0.0.31 — 2026-05-01
- Status line: Scan / catalog status is centered under the toolbar (narrow column, readable in the middle of the page).
- Checkout map: Replaced OpenStreetMap iframe with the same Natural Earth vector + Hub raster DEM tiles / Leaflet stack as published QWB Q‑Shop blocks (
QsDeliveryMap, bundledgeojson+ tile index shards underpublic/). - Payments: Closing checkout waits 450ms, then shows a top-layer payment spinner (“Waiting for Hub…”) during
SEND_COIN/TRANSFER_ASSET— mirrors the storefront UX so modal stacking does not swallow the signer. - Q‑Mail receipts: Successful Hub payments trigger
sendQshopPaymentReceiptQmail(same DOCUMENT_PRIVATE + MAIL_PRIVATE batch as QWB/qsOrderReceipt.ts). - Digital goods:
qortal://FILE/…lines resolve per variant/product (digitalManifest) and download via portedtriggerQShopFileDownloadHub/REST/mobile fallbacks (qshopsFileDownload.ts). - My orders: Header My orders, persisted per wallet (
localStorageqshops-app-v026-myorders): open invoice view (QWB-parity markup/CSS), payment ref, totals, re-download digital files. GET_USER_ACCOUNT.publicKey+writeGateNamesCacheForAddressafter name lookup improves Q-Mail publish name resolution parity.
0.0.30 — 2026-05-01
- Automatic directory curator tracking: Every publisher whose merged index includes a
qwb-qshops-catalog-v1manifest (QWB Q‑Shop block) isprependTrackedDirectoryCurator’d in the background so the nextfetchRemoteDirectorySnapshotspass tries that registered name’s.__qwb__/qshops-directory-snapshot.jsonfirst (alongside SEARCH). Applies to network scan merges, registered-name supplement loads, saved-name merge, and the cold-start localStorage snapshot once the Hub bridge is present. - Fetch order: Successful snapshot DOCUMENT parses now prepend the curator name instead of only appending — frequent / important curators stay near the front of the bounded list.
- UI removed: The “Other hubs show only their own shop?” manual curator panel and “Publish merged directory to QDN…” flow (and the post-merge “new listings” publish modal). Shared directory updated on QDN refresh prompt, fingerprint polling, and BroadcastChannel hints from other tabs are unchanged.
- Dead code: Dropped unused directory helpers (
mergeTrackedDirectoryCuratorNames,persistTrackedDirectoryCuratorsFromRawInput,jsonToData64) fromdirectorySnapshot.ts.
0.0.29 — 2026-05-01
- Publishing hubs vs SEARCH: Hubs that publish QWB WEBSITE blocks often get QDN SEARCH results that emphasize their own DOCUMENT hints for quite a while, so the app never saw another curator’s merged
qshops-directory-snapshot-v1DOCUMENT. Then the federated fingerprint never changed and “Shared directory updated” could not appear on those nodes until SEARCH widened. - Direct curator fetch:
fetchRemoteDirectorySnapshotsnow unions SEARCH hits with a persisted list of curator registered names and FETCHes those DOCUMENTs by name (prioritizing tracked names, cap 96 per pass). Every successful merged snapshot loaded from a curator augments that list (bounded). Publishing a merged directory under your chosen name adds your name to the tracked set automatically. - UI: Collapsible panel under the status line — paste comma-separated curator name(s), Save list & merge catalogs; persists in
localStorage(qshops-app-v003-directory-curator-names). Use the registered Qortal name of whoever published the shared directory DOCUMENT (often the hub that successfully merged everyone).
0.0.28 — 2026-05-01
- Header: Theme toggle stays on the same row as Authenticate / user chip / Cart (
qs-masthead__tools-row, no wrap on account cluster). - Catalog cards: Fixed grid shop strip so avatar + shop name stay horizontal (CSS order after base); list + grid show display name only (no
@publisherline on cards). - Cart / detail: Add another replaces the disabled “Added…” state (detail modal + quick‑add). Cart line thumbnails ~34% larger; summary spacing and label Estimated subtotal (removed parenthetical); new
.qs-cart-summary-*layout rules. - Checkout: Vendor block uses avatar only (logo
<img>removed); slightly larger avatar tile. - Directory UX: After you publish a merged snapshot, the app reseeds the remote fingerprint so you are not immediately nagged to refresh; refresh action closes the dialog first and runs merge in the background (no long “Refreshing…” freeze). Fingerprint poll ~90s. localStorage snapshot v022 — skips persisting a single-shop index in the first 3 minutes to avoid freezing a partial mesh view; ~2.75 min one-shot widening merge if only one shop still shows. QDN HTTP search span for DOCUMENT scans increased to pull more mirror/directory hits on sparse publishing hubs.
0.0.27 — 2026-05-01
- Readability: Product and shop snippets that ship as HTML (card excerpts, detail/shipping tabs, shop intros) inherit theme foreground so merchant inline colors no longer disappear on dark mode; links stay accent.
- Product modal: Shop logo shows top-right beside Close; header line shows shop display name ·
@publisher. - Catalog chrome: Removed per-card shop logo from grid/list; grid keeps name avatar → shop name. List layout is title + excerpt | avatar + shop + prices on one row; View more / Quick add sit on a footer row aligned bottom-right.
0.0.26 — 2026-05-01
- Directory updates: Prompt to refresh the catalog when remote
qshops-directory-snapshot-v1curator DOCUMENTs change versus the last merged layer (polling QDN fingerprints ~2½ min +BroadcastChannelhint after Publish merged directory so other tabs in the same browser can react).Latersnoozes that fingerprint until something newer appears. - Publishing hubs: Extra merged directory + SEARCH passes at ~44s and ~118s to mitigate SEARCH returning only your shop first; bumped
LS_DIRECTORY_SNAPSHOTtov021so older local aggregates do not dominate the initial index.
0.0.25 — 2026-05-05
- Sub-page storefronts: QWB ships one
index.htmlbut thesn-embed-configJSON always includespages[].blocks. Aggregator ingestion now merges explicit catalog<script>tags with catalogs reconstructed from that embed, so shops that live only on a sub-page still appear if script-tag extraction misses them. - Taxonomy:
QSHOP_MARKETPLACE_TAXONOMY_VERSIONexported alongside category slugs (must stay aligned with QWB manifests).
0.0.24 — 2026-05-05
- Cold start latency: Peer
qshops-directory-snapshot-v1DOCUMENT layer merges as soon as it returns instead of waiting for the full WEBSITE crawl to finish (Promise.allmerged both before any UI merge). - Throughput: DOCUMENT mirror prefetch and curator snapshot fetches use bounded parallel pools (~14 mirrors, ~12 snapshot DOCUMENTs); WEBSITE HTML/
website.zipfetches parallelize at ~8 with per-request Hub timeouts unchanged. - Refresh cadence: The post-open catch-up scan runs at ~9.8s and only
scanNetworkForCatalogs(no duplicated heavy snapshot crawl). - QWB alignment: Merchants publishing from QWB now ship mirror + shared directory DOCUMENT only (duplicate
qshops-catalog-feed.jsonremoved); Q‑Shops still probes the legacy feed path for older publishes.
0.0.23 — 2026-05-01
- Cross-node directory: Publishing the merged catalog uses
qReqLongso Hub approval forPUBLISH_QDN_RESOURCEis less likely to time out. - QWB alignment: Merchants who publish a WEBSITE with Q‑Shop blocks also ship a
qshops-directory-snapshot-v1slice in the same batch (see Qortal Web Builder); Q‑Shops merges those DOCUMENTs with live scans. - UI: Removed the expandable “About the global Q‑Shops directory” note; added an optional Publish merged directory to QDN… action when you are signed in and the index has products.
0.0.22 — 2026-05-01
- Grid: shop avatar left of shop name block (
shopName/title +@publisher), logo pinned on the right. - List/grid images: tighter list thumbnails (~⅓ narrower column); text column shields product title & prices; hover zoom (~1.05×) on product images (
containunchanged). - Product detail: Add to cart leaves modal open → gold Added to cart state + View cart.
- Cart: compact centered lines with tiny thumbs.
- Checkout: removed standalone map launcher row; optional WORLD map OSM embed unchanged; per‑shop discount code wired to
catalog.coupons(republish WEBSITE with updated QWB to embed coupons in manifest). - Pay this shop: closes checkout briefly before
SEND_COINso the Hub signer is not stacked under the modal; SEND_COIN payload aligned with published QWB storefront. - Shipping: per‑vendor options use the union of tiers declared on catalog lines from that merchant (still one selected tier for the payment memo).
0.0.21 — 2026-05-01
- Federation UX: clarified that indexing uses network QDN SEARCH (not “this node only”); expandable About the shared directory note under the status line explains snapshots vs live scan.
- Cold start: first load and the 26s retry now run
fetchRemoteDirectorySnapshotsin parallel withscanNetworkForCatalogsand union-merge into one index update so peer-publishedqshops-directory-snapshot-v1files and raw SEARCH hits apply together. - Discovery throughput: Hub SEARCH paging cap
MAX_BRIDGE_PAGES8 → 12; broader snapshot SEARCH when loading curator DOCUMENT aggregates. - Publish prompt copy: stresses that DIRECTORY snapshots help other people on other nodes hydrate faster.
0.0.20 — 2026-05-01
- Cart modal: thumbnails, line QORT/asset hints, estimate subtotal summary.
- Checkout modal: contact + delivery fields, ship vs pickup (non-digital carts), coordinate textarea with OpenStreetMap preview (
QsCheckoutMap), World Map / catalog map deep-link, per-vendor avatar + logo, shared shipping-method radios where applicable, pay buttons usepayBusyplus Pay all shops (sequential) for multi-vendor. - Product detail: add-to-cart closes the modal without opening checkout (same as quick-add flow).
- Catalog CSS: grid thumbnails square · contain full product image; list cards stay side-by-side on narrow viewports (horizontal scroll instead of stacking); Added to cart green state.
- WEBSITE links keep opening via
qortal://in a new Hub window/tab (openWebsiteInNewTab/openInNewHubWindow).
0.0.19 — 2026-05-01
- Masthead ordering + conditional cart; local + remote directory snapshot hydrate; discovery publish modal; min/“From” pricing; digital category fallback; list layout tweaks; broader WEBSITE SEARCH.
0.0.18 — 2026-05-04
- Catalog cards: merchant logo under product image; single published WEBSITE name on the row.
- List view: compressed layout — uniform small square covers and tighter shop strip.
- Discovery: higher SEARCH paging caps + registered-name ingest when your own WEBSITE is missing from the index.
0.0.17 — 2026-05-04
- Add to cart plays a vortex-style fly of the product thumbnail into the masthead cart chip; Cart stays visible next to Authenticate / user name (including when the cart is empty).
- Listing image opens product details (View more) on click; Quick add to cart appears only when the product has one or no catalog option — multi-variant listings only show View more.
0.0.16 — 2026-05-01
- Discovery is driven by network scan + saved names list only — wallet / primary name no longer triggers an extra ingest pass (avoids “only my alt names” skew).
- QWB manifest carries optional
shopIntroHtml(Q-Shop storefront Intro rich text). Shops cards and focused shop banner show that copy; logos / avatars use the same QDN media resolution as product images. - Product grid: 5 columns (responsive), grid/list toggle (persisted), seller thumbnail on each card, hover zoom on covers (respects reduced motion).
- Detail modal: clicking a gallery thumbnail selects the matching variant when the image matches a variant row.
0.0.2 — 2026-05-03
- Network scan always FETCHes
index.htmlper publisher from QDN search results (plus SEARCH row identifiers); catalog manifests from current QWB are embedded in that static file. - Minor discover/docs alignment with QWB WEBSITE zip publish.
0.0.1 — 2026-05-03
Initial standalone Q-App (separate from Qortal Web Builder) that aggregates published QWB Q-Shop catalogs from QDN.
Features
- Manual authenticate in the masthead (
GET_USER_ACCOUNTon demand). Browse and index without signing in; after login, primary name + QDN THUMBNAIL avatar appear in the header. - Index by publisher: load
index.htmlfor each WEBSITE name listed in the textarea; parse embedded QWB Q-Shops catalog manifests (qwb-qshops-catalog-v1), including optionalshippingFlatQortfor simple QORT shipping totals. - Scan whole QDN: searches WEBSITE resources referencing the manifest marker and fetches HTML candidates (
SEARCH_QDN_RESOURCES→FETCH_QDN_RESOURCE). - Search & filters: quick search on titles and metadata; deep search adds product description excerpts; taxonomy category, availability, featured / bestseller, tag chips, sort, QORT price min/max — aligned with common QWB Q-Shop filter surface.
- Multi-vendor cart persisted locally; checkout grouped by merchant (
publisher+ shopblockId) with Hub payments:- QORT:
SEND_COINtoGET_NAME_DATA(publisher).owner, memo includes buyer labels. - Store Q-Asset (when the catalog declares
storeAltAssetId): optional checkbox per merchant group triesTRANSFER_ASSET/SEND_PAYMENT(shipping in asset mode is omitted until catalog exposes asset shipping in the manifest).
- QORT:
- Listing cards link to
qortal://WEBSITE/<publisher>with WEBSITE title + logo fromsn-embed-configwhere present.
Qortal Web Builder prerequisite
Rebuild and republish WEBSITE zips after pulling the matching QWB change that embeds the catalog <script type="application/json" data-qwb-qshops-catalog="1" id="qwb-qshops-manifest-{blockId}"> so scanners and indexer fetches can find product JSON.