@aglyn/plugins-commerce 1.0.0-beta.143
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +10 -0
- package/package.json +57 -0
- package/src/index.d.ts +38 -0
- package/src/index.js +38 -0
- package/src/index.js.map +1 -0
- package/src/lib/components/account.d.ts +31 -0
- package/src/lib/components/account.js +645 -0
- package/src/lib/components/account.js.map +1 -0
- package/src/lib/components/cart.d.ts +38 -0
- package/src/lib/components/cart.js +851 -0
- package/src/lib/components/cart.js.map +1 -0
- package/src/lib/components/commerce-console-page.d.ts +32 -0
- package/src/lib/components/commerce-console-page.js +296 -0
- package/src/lib/components/commerce-console-page.js.map +1 -0
- package/src/lib/components/commerce-console-sections.d.ts +34 -0
- package/src/lib/components/commerce-console-sections.js +62 -0
- package/src/lib/components/commerce-console-sections.js.map +1 -0
- package/src/lib/components/console/catalog-organization-card.component.d.ts +14 -0
- package/src/lib/components/console/catalog-organization-card.component.js +1087 -0
- package/src/lib/components/console/catalog-organization-card.component.js.map +1 -0
- package/src/lib/components/console/commerce-analytics-card.component.d.ts +27 -0
- package/src/lib/components/console/commerce-analytics-card.component.js +310 -0
- package/src/lib/components/console/commerce-analytics-card.component.js.map +1 -0
- package/src/lib/components/console/commerce-glance-card.component.d.ts +20 -0
- package/src/lib/components/console/commerce-glance-card.component.js +340 -0
- package/src/lib/components/console/commerce-glance-card.component.js.map +1 -0
- package/src/lib/components/console/commerce-stat-tile.component.d.ts +37 -0
- package/src/lib/components/console/commerce-stat-tile.component.js +72 -0
- package/src/lib/components/console/commerce-stat-tile.component.js.map +1 -0
- package/src/lib/components/console/discounts-card.component.d.ts +14 -0
- package/src/lib/components/console/discounts-card.component.js +443 -0
- package/src/lib/components/console/discounts-card.component.js.map +1 -0
- package/src/lib/components/console/entitlement-gate.component.d.ts +76 -0
- package/src/lib/components/console/entitlement-gate.component.js +115 -0
- package/src/lib/components/console/entitlement-gate.component.js.map +1 -0
- package/src/lib/components/console/gift-cards-card.component.d.ts +29 -0
- package/src/lib/components/console/gift-cards-card.component.js +379 -0
- package/src/lib/components/console/gift-cards-card.component.js.map +1 -0
- package/src/lib/components/console/host-coupons-card.component.d.ts +14 -0
- package/src/lib/components/console/host-coupons-card.component.js +252 -0
- package/src/lib/components/console/host-coupons-card.component.js.map +1 -0
- package/src/lib/components/console/host-orders-card.component.d.ts +13 -0
- package/src/lib/components/console/host-orders-card.component.js +861 -0
- package/src/lib/components/console/host-orders-card.component.js.map +1 -0
- package/src/lib/components/console/locations-card.component.d.ts +14 -0
- package/src/lib/components/console/locations-card.component.js +256 -0
- package/src/lib/components/console/locations-card.component.js.map +1 -0
- package/src/lib/components/console/member-posts-card.component.d.ts +8 -0
- package/src/lib/components/console/member-posts-card.component.js +283 -0
- package/src/lib/components/console/member-posts-card.component.js.map +1 -0
- package/src/lib/components/console/newest-site-users-card.component.d.ts +36 -0
- package/src/lib/components/console/newest-site-users-card.component.js +126 -0
- package/src/lib/components/console/newest-site-users-card.component.js.map +1 -0
- package/src/lib/components/console/order-detail-dialog.component.d.ts +28 -0
- package/src/lib/components/console/order-detail-dialog.component.js +976 -0
- package/src/lib/components/console/order-detail-dialog.component.js.map +1 -0
- package/src/lib/components/console/paid-media.d.ts +127 -0
- package/src/lib/components/console/paid-media.js +397 -0
- package/src/lib/components/console/paid-media.js.map +1 -0
- package/src/lib/components/console/payments-settings-card.component.d.ts +13 -0
- package/src/lib/components/console/payments-settings-card.component.js +295 -0
- package/src/lib/components/console/payments-settings-card.component.js.map +1 -0
- package/src/lib/components/console/pos-page.component.d.ts +13 -0
- package/src/lib/components/console/pos-page.component.js +916 -0
- package/src/lib/components/console/pos-page.component.js.map +1 -0
- package/src/lib/components/console/product-editor-dialog.component.d.ts +32 -0
- package/src/lib/components/console/product-editor-dialog.component.js +1374 -0
- package/src/lib/components/console/product-editor-dialog.component.js.map +1 -0
- package/src/lib/components/console/products-hub-card.component.d.ts +16 -0
- package/src/lib/components/console/products-hub-card.component.js +1280 -0
- package/src/lib/components/console/products-hub-card.component.js.map +1 -0
- package/src/lib/components/console/products-hub-zone.component.d.ts +50 -0
- package/src/lib/components/console/products-hub-zone.component.js +200 -0
- package/src/lib/components/console/products-hub-zone.component.js.map +1 -0
- package/src/lib/components/console/recovery-queue-card.component.d.ts +39 -0
- package/src/lib/components/console/recovery-queue-card.component.js +262 -0
- package/src/lib/components/console/recovery-queue-card.component.js.map +1 -0
- package/src/lib/components/console/registers-card.component.d.ts +21 -0
- package/src/lib/components/console/registers-card.component.js +296 -0
- package/src/lib/components/console/registers-card.component.js.map +1 -0
- package/src/lib/components/console/reservations-card.component.d.ts +14 -0
- package/src/lib/components/console/reservations-card.component.js +650 -0
- package/src/lib/components/console/reservations-card.component.js.map +1 -0
- package/src/lib/components/console/reviews-moderation-card.component.d.ts +8 -0
- package/src/lib/components/console/reviews-moderation-card.component.js +235 -0
- package/src/lib/components/console/reviews-moderation-card.component.js.map +1 -0
- package/src/lib/components/console/shipping-settings-card.component.d.ts +38 -0
- package/src/lib/components/console/shipping-settings-card.component.js +560 -0
- package/src/lib/components/console/shipping-settings-card.component.js.map +1 -0
- package/src/lib/components/console/stock-movements-card.component.d.ts +31 -0
- package/src/lib/components/console/stock-movements-card.component.js +333 -0
- package/src/lib/components/console/stock-movements-card.component.js.map +1 -0
- package/src/lib/components/console/store-settings-card.component.d.ts +14 -0
- package/src/lib/components/console/store-settings-card.component.js +300 -0
- package/src/lib/components/console/store-settings-card.component.js.map +1 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.d.ts +73 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.js +408 -0
- package/src/lib/components/console/storefront-tax-summary-card.component.js.map +1 -0
- package/src/lib/components/console/suppliers-card.component.d.ts +8 -0
- package/src/lib/components/console/suppliers-card.component.js +328 -0
- package/src/lib/components/console/suppliers-card.component.js.map +1 -0
- package/src/lib/components/console/tax-settings-card.component.d.ts +14 -0
- package/src/lib/components/console/tax-settings-card.component.js +473 -0
- package/src/lib/components/console/tax-settings-card.component.js.map +1 -0
- package/src/lib/components/gate.d.ts +39 -0
- package/src/lib/components/gate.js +202 -0
- package/src/lib/components/gate.js.map +1 -0
- package/src/lib/components/gated-video.d.ts +40 -0
- package/src/lib/components/gated-video.js +366 -0
- package/src/lib/components/gated-video.js.map +1 -0
- package/src/lib/components/member-feed.d.ts +32 -0
- package/src/lib/components/member-feed.js +198 -0
- package/src/lib/components/member-feed.js.map +1 -0
- package/src/lib/components/member-recovery.d.ts +35 -0
- package/src/lib/components/member-recovery.js +313 -0
- package/src/lib/components/member-recovery.js.map +1 -0
- package/src/lib/components/member-signin.d.ts +35 -0
- package/src/lib/components/member-signin.js +257 -0
- package/src/lib/components/member-signin.js.map +1 -0
- package/src/lib/components/member-signup.d.ts +34 -0
- package/src/lib/components/member-signup.js +287 -0
- package/src/lib/components/member-signup.js.map +1 -0
- package/src/lib/components/newsletter-signup.d.ts +39 -0
- package/src/lib/components/newsletter-signup.js +229 -0
- package/src/lib/components/newsletter-signup.js.map +1 -0
- package/src/lib/components/product-detail.d.ts +38 -0
- package/src/lib/components/product-detail.js +1022 -0
- package/src/lib/components/product-detail.js.map +1 -0
- package/src/lib/components/product-grid.d.ts +67 -0
- package/src/lib/components/product-grid.js +909 -0
- package/src/lib/components/product-grid.js.map +1 -0
- package/src/lib/components/product-reviews.d.ts +32 -0
- package/src/lib/components/product-reviews.js +349 -0
- package/src/lib/components/product-reviews.js.map +1 -0
- package/src/lib/components/related-products.d.ts +33 -0
- package/src/lib/components/related-products.js +232 -0
- package/src/lib/components/related-products.js.map +1 -0
- package/src/lib/components/reservation-widget.d.ts +33 -0
- package/src/lib/components/reservation-widget.js +418 -0
- package/src/lib/components/reservation-widget.js.map +1 -0
- package/src/lib/components/storefront-payment-element-fallback.d.ts +18 -0
- package/src/lib/components/storefront-payment-element-fallback.js +51 -0
- package/src/lib/components/storefront-payment-element-fallback.js.map +1 -0
- package/src/lib/components/storefront-payment-element.d.ts +78 -0
- package/src/lib/components/storefront-payment-element.js +156 -0
- package/src/lib/components/storefront-payment-element.js.map +1 -0
- package/src/lib/components/wishlist.d.ts +46 -0
- package/src/lib/components/wishlist.js +304 -0
- package/src/lib/components/wishlist.js.map +1 -0
- package/src/lib/constants/bundle-common.d.ts +18 -0
- package/src/lib/constants/bundle-common.js +18 -0
- package/src/lib/constants/bundle-common.js.map +1 -0
- package/src/lib/constants/product-filters.d.ts +35 -0
- package/src/lib/constants/product-filters.js +109 -0
- package/src/lib/constants/product-filters.js.map +1 -0
- package/src/lib/model/commerce-cart.d.ts +52 -0
- package/src/lib/model/commerce-cart.js +102 -0
- package/src/lib/model/commerce-cart.js.map +1 -0
- package/src/lib/model/commerce-connect-transfer.d.ts +243 -0
- package/src/lib/model/commerce-connect-transfer.js +231 -0
- package/src/lib/model/commerce-connect-transfer.js.map +1 -0
- package/src/lib/model/commerce-discounts.d.ts +164 -0
- package/src/lib/model/commerce-discounts.js +231 -0
- package/src/lib/model/commerce-discounts.js.map +1 -0
- package/src/lib/model/commerce-dispute.d.ts +124 -0
- package/src/lib/model/commerce-dispute.js +225 -0
- package/src/lib/model/commerce-dispute.js.map +1 -0
- package/src/lib/model/commerce-gift-cards.d.ts +107 -0
- package/src/lib/model/commerce-gift-cards.js +121 -0
- package/src/lib/model/commerce-gift-cards.js.map +1 -0
- package/src/lib/model/commerce-io.d.ts +36 -0
- package/src/lib/model/commerce-io.js +245 -0
- package/src/lib/model/commerce-io.js.map +1 -0
- package/src/lib/model/commerce-orders.d.ts +1040 -0
- package/src/lib/model/commerce-orders.js +1022 -0
- package/src/lib/model/commerce-orders.js.map +1 -0
- package/src/lib/model/commerce-promotions.d.ts +188 -0
- package/src/lib/model/commerce-promotions.js +199 -0
- package/src/lib/model/commerce-promotions.js.map +1 -0
- package/src/lib/model/commerce-reservations.d.ts +175 -0
- package/src/lib/model/commerce-reservations.js +157 -0
- package/src/lib/model/commerce-reservations.js.map +1 -0
- package/src/lib/model/commerce-shipping.d.ts +316 -0
- package/src/lib/model/commerce-shipping.js +484 -0
- package/src/lib/model/commerce-shipping.js.map +1 -0
- package/src/lib/model/commerce-stock-holds.d.ts +199 -0
- package/src/lib/model/commerce-stock-holds.js +190 -0
- package/src/lib/model/commerce-stock-holds.js.map +1 -0
- package/src/lib/model/commerce-subscription-status.d.ts +67 -0
- package/src/lib/model/commerce-subscription-status.js +76 -0
- package/src/lib/model/commerce-subscription-status.js.map +1 -0
- package/src/lib/model/commerce-tax-decision.d.ts +222 -0
- package/src/lib/model/commerce-tax-decision.js +165 -0
- package/src/lib/model/commerce-tax-decision.js.map +1 -0
- package/src/lib/model/commerce-tax.d.ts +176 -0
- package/src/lib/model/commerce-tax.js +92 -0
- package/src/lib/model/commerce-tax.js.map +1 -0
- package/src/lib/model/commerce.d.ts +551 -0
- package/src/lib/model/commerce.js +739 -0
- package/src/lib/model/commerce.js.map +1 -0
- package/src/lib/model/index.d.ts +40 -0
- package/src/lib/model/index.js +40 -0
- package/src/lib/model/index.js.map +1 -0
- package/src/lib/model/order-figures.d.ts +48 -0
- package/src/lib/model/order-figures.js +74 -0
- package/src/lib/model/order-figures.js.map +1 -0
- package/src/lib/model/plugin-permissions.d.ts +23 -0
- package/src/lib/model/plugin-permissions.js +34 -0
- package/src/lib/model/plugin-permissions.js.map +1 -0
- package/src/lib/model/purchase-analytics.d.ts +186 -0
- package/src/lib/model/purchase-analytics.js +216 -0
- package/src/lib/model/purchase-analytics.js.map +1 -0
- package/src/lib/plugin-config.d.ts +62 -0
- package/src/lib/plugin-config.js +78 -0
- package/src/lib/plugin-config.js.map +1 -0
- package/src/lib/plugin.d.ts +28 -0
- package/src/lib/plugin.js +147 -0
- package/src/lib/plugin.js.map +1 -0
- package/src/lib/server/billing-webhook.d.ts +26 -0
- package/src/lib/server/billing-webhook.js +4011 -0
- package/src/lib/server/billing-webhook.js.map +1 -0
- package/src/lib/server/cancel-order.d.ts +87 -0
- package/src/lib/server/cancel-order.js +368 -0
- package/src/lib/server/cancel-order.js.map +1 -0
- package/src/lib/server/cart-checkout.d.ts +25 -0
- package/src/lib/server/cart-checkout.js +976 -0
- package/src/lib/server/cart-checkout.js.map +1 -0
- package/src/lib/server/cart-cookie.d.ts +32 -0
- package/src/lib/server/cart-cookie.js +77 -0
- package/src/lib/server/cart-cookie.js.map +1 -0
- package/src/lib/server/cart.d.ts +34 -0
- package/src/lib/server/cart.js +181 -0
- package/src/lib/server/cart.js.map +1 -0
- package/src/lib/server/catalog.d.ts +127 -0
- package/src/lib/server/catalog.js +277 -0
- package/src/lib/server/catalog.js.map +1 -0
- package/src/lib/server/checkout.d.ts +36 -0
- package/src/lib/server/checkout.js +915 -0
- package/src/lib/server/checkout.js.map +1 -0
- package/src/lib/server/connect.d.ts +26 -0
- package/src/lib/server/connect.js +238 -0
- package/src/lib/server/connect.js.map +1 -0
- package/src/lib/server/contact-refund.d.ts +117 -0
- package/src/lib/server/contact-refund.js +196 -0
- package/src/lib/server/contact-refund.js.map +1 -0
- package/src/lib/server/download.d.ts +39 -0
- package/src/lib/server/download.js +206 -0
- package/src/lib/server/download.js.map +1 -0
- package/src/lib/server/draft-order.d.ts +26 -0
- package/src/lib/server/draft-order.js +706 -0
- package/src/lib/server/draft-order.js.map +1 -0
- package/src/lib/server/feed.d.ts +24 -0
- package/src/lib/server/feed.js +59 -0
- package/src/lib/server/feed.js.map +1 -0
- package/src/lib/server/fulfill-order.d.ts +97 -0
- package/src/lib/server/fulfill-order.js +235 -0
- package/src/lib/server/fulfill-order.js.map +1 -0
- package/src/lib/server/gate.d.ts +36 -0
- package/src/lib/server/gate.js +112 -0
- package/src/lib/server/gate.js.map +1 -0
- package/src/lib/server/gift-cards.d.ts +42 -0
- package/src/lib/server/gift-cards.js +219 -0
- package/src/lib/server/gift-cards.js.map +1 -0
- package/src/lib/server/low-stock.d.ts +49 -0
- package/src/lib/server/low-stock.js +60 -0
- package/src/lib/server/low-stock.js.map +1 -0
- package/src/lib/server/manual-tax-rate.d.ts +82 -0
- package/src/lib/server/manual-tax-rate.js +113 -0
- package/src/lib/server/manual-tax-rate.js.map +1 -0
- package/src/lib/server/member-feed.d.ts +24 -0
- package/src/lib/server/member-feed.js +72 -0
- package/src/lib/server/member-feed.js.map +1 -0
- package/src/lib/server/member-name-search.d.ts +37 -0
- package/src/lib/server/member-name-search.js +42 -0
- package/src/lib/server/member-name-search.js.map +1 -0
- package/src/lib/server/member-post.d.ts +23 -0
- package/src/lib/server/member-post.js +166 -0
- package/src/lib/server/member-post.js.map +1 -0
- package/src/lib/server/membership-account.d.ts +37 -0
- package/src/lib/server/membership-account.js +148 -0
- package/src/lib/server/membership-account.js.map +1 -0
- package/src/lib/server/membership-admin-password.d.ts +33 -0
- package/src/lib/server/membership-admin-password.js +202 -0
- package/src/lib/server/membership-admin-password.js.map +1 -0
- package/src/lib/server/membership-content.d.ts +23 -0
- package/src/lib/server/membership-content.js +105 -0
- package/src/lib/server/membership-content.js.map +1 -0
- package/src/lib/server/membership-login.d.ts +19 -0
- package/src/lib/server/membership-login.js +137 -0
- package/src/lib/server/membership-login.js.map +1 -0
- package/src/lib/server/membership-logout.d.ts +19 -0
- package/src/lib/server/membership-logout.js +35 -0
- package/src/lib/server/membership-logout.js.map +1 -0
- package/src/lib/server/membership-recover.d.ts +60 -0
- package/src/lib/server/membership-recover.js +244 -0
- package/src/lib/server/membership-recover.js.map +1 -0
- package/src/lib/server/membership-register.d.ts +22 -0
- package/src/lib/server/membership-register.js +241 -0
- package/src/lib/server/membership-register.js.map +1 -0
- package/src/lib/server/membership-reset.d.ts +26 -0
- package/src/lib/server/membership-reset.js +88 -0
- package/src/lib/server/membership-reset.js.map +1 -0
- package/src/lib/server/membership-wishlist.d.ts +23 -0
- package/src/lib/server/membership-wishlist.js +89 -0
- package/src/lib/server/membership-wishlist.js.map +1 -0
- package/src/lib/server/membership.d.ts +96 -0
- package/src/lib/server/membership.js +222 -0
- package/src/lib/server/membership.js.map +1 -0
- package/src/lib/server/native-checkout.d.ts +170 -0
- package/src/lib/server/native-checkout.js +193 -0
- package/src/lib/server/native-checkout.js.map +1 -0
- package/src/lib/server/newsletter.d.ts +23 -0
- package/src/lib/server/newsletter.js +323 -0
- package/src/lib/server/newsletter.js.map +1 -0
- package/src/lib/server/notify-restock.d.ts +22 -0
- package/src/lib/server/notify-restock.js +84 -0
- package/src/lib/server/notify-restock.js.map +1 -0
- package/src/lib/server/order-analytics.d.ts +134 -0
- package/src/lib/server/order-analytics.js +263 -0
- package/src/lib/server/order-analytics.js.map +1 -0
- package/src/lib/server/order-figures.d.ts +33 -0
- package/src/lib/server/order-figures.js +220 -0
- package/src/lib/server/order-figures.js.map +1 -0
- package/src/lib/server/paid-media-delivery.d.ts +173 -0
- package/src/lib/server/paid-media-delivery.js +212 -0
- package/src/lib/server/paid-media-delivery.js.map +1 -0
- package/src/lib/server/pos-order.d.ts +54 -0
- package/src/lib/server/pos-order.js +1137 -0
- package/src/lib/server/pos-order.js.map +1 -0
- package/src/lib/server/process-abandoned.d.ts +54 -0
- package/src/lib/server/process-abandoned.js +222 -0
- package/src/lib/server/process-abandoned.js.map +1 -0
- package/src/lib/server/process-restock.d.ts +42 -0
- package/src/lib/server/process-restock.js +219 -0
- package/src/lib/server/process-restock.js.map +1 -0
- package/src/lib/server/product-card.d.ts +29 -0
- package/src/lib/server/product-card.js +54 -0
- package/src/lib/server/product-card.js.map +1 -0
- package/src/lib/server/product.d.ts +70 -0
- package/src/lib/server/product.js +105 -0
- package/src/lib/server/product.js.map +1 -0
- package/src/lib/server/promotion-hold.d.ts +144 -0
- package/src/lib/server/promotion-hold.js +174 -0
- package/src/lib/server/promotion-hold.js.map +1 -0
- package/src/lib/server/reconcile-stock.d.ts +106 -0
- package/src/lib/server/reconcile-stock.js +349 -0
- package/src/lib/server/reconcile-stock.js.map +1 -0
- package/src/lib/server/refund.d.ts +45 -0
- package/src/lib/server/refund.js +607 -0
- package/src/lib/server/refund.js.map +1 -0
- package/src/lib/server/related.d.ts +24 -0
- package/src/lib/server/related.js +104 -0
- package/src/lib/server/related.js.map +1 -0
- package/src/lib/server/reservation-availability.d.ts +23 -0
- package/src/lib/server/reservation-availability.js +111 -0
- package/src/lib/server/reservation-availability.js.map +1 -0
- package/src/lib/server/reserve-stock.d.ts +156 -0
- package/src/lib/server/reserve-stock.js +146 -0
- package/src/lib/server/reserve-stock.js.map +1 -0
- package/src/lib/server/reserve.d.ts +25 -0
- package/src/lib/server/reserve.js +426 -0
- package/src/lib/server/reserve.js.map +1 -0
- package/src/lib/server/restock-flag.d.ts +202 -0
- package/src/lib/server/restock-flag.js +449 -0
- package/src/lib/server/restock-flag.js.map +1 -0
- package/src/lib/server/reviews.d.ts +51 -0
- package/src/lib/server/reviews.js +132 -0
- package/src/lib/server/reviews.js.map +1 -0
- package/src/lib/server/site-page-enricher.d.ts +42 -0
- package/src/lib/server/site-page-enricher.js +149 -0
- package/src/lib/server/site-page-enricher.js.map +1 -0
- package/src/lib/server/site-page-resolver.d.ts +26 -0
- package/src/lib/server/site-page-resolver.js +223 -0
- package/src/lib/server/site-page-resolver.js.map +1 -0
- package/src/lib/server/stock-hold.d.ts +127 -0
- package/src/lib/server/stock-hold.js +258 -0
- package/src/lib/server/stock-hold.js.map +1 -0
- package/src/lib/server/storefront-tax-record.d.ts +22 -0
- package/src/lib/server/storefront-tax-record.js +218 -0
- package/src/lib/server/storefront-tax-record.js.map +1 -0
- package/src/lib/server/storefront-tax.d.ts +197 -0
- package/src/lib/server/storefront-tax.js +245 -0
- package/src/lib/server/storefront-tax.js.map +1 -0
- package/src/lib/server/stream.d.ts +25 -0
- package/src/lib/server/stream.js +191 -0
- package/src/lib/server/stream.js.map +1 -0
- package/src/lib/server/subscription-portal.d.ts +24 -0
- package/src/lib/server/subscription-portal.js +91 -0
- package/src/lib/server/subscription-portal.js.map +1 -0
- package/src/lib/server/supplier-outbox.d.ts +190 -0
- package/src/lib/server/supplier-outbox.js +342 -0
- package/src/lib/server/supplier-outbox.js.map +1 -0
- package/src/lib/server/supplier-update.d.ts +23 -0
- package/src/lib/server/supplier-update.js +289 -0
- package/src/lib/server/supplier-update.js.map +1 -0
- package/src/lib/server/tax-profile.d.ts +29 -0
- package/src/lib/server/tax-profile.js +40 -0
- package/src/lib/server/tax-profile.js.map +1 -0
- package/src/lib/server.d.ts +32 -0
- package/src/lib/server.js +311 -0
- package/src/lib/server.js.map +1 -0
- package/src/lib/site.d.ts +27 -0
- package/src/lib/site.js +134 -0
- package/src/lib/site.js.map +1 -0
- package/src/lib/utils/escape-html.d.ts +41 -0
- package/src/lib/utils/escape-html.js +41 -0
- package/src/lib/utils/escape-html.js.map +1 -0
- package/src/lib/utils/generate-preset-id.d.ts +19 -0
- package/src/lib/utils/generate-preset-id.js +25 -0
- package/src/lib/utils/generate-preset-id.js.map +1 -0
- package/src/lib/utils/member-continue.d.ts +45 -0
- package/src/lib/utils/member-continue.js +49 -0
- package/src/lib/utils/member-continue.js.map +1 -0
- package/src/lib/utils/use-storefront-purchase-event.d.ts +60 -0
- package/src/lib/utils/use-storefront-purchase-event.js +142 -0
- package/src/lib/utils/use-storefront-purchase-event.js.map +1 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
|
|
3
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
|
+
/**
|
|
5
|
+
* @license
|
|
6
|
+
* Copyright 2026 Aglyn LLC
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
* you may not use this file except in compliance with the License.
|
|
10
|
+
* You may obtain a copy of the License at
|
|
11
|
+
*
|
|
12
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
*
|
|
14
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
* See the License for the specific language governing permissions and
|
|
18
|
+
* limitations under the License.
|
|
19
|
+
*/ import * as Aglyn from "@aglyn/aglyn";
|
|
20
|
+
import { mdiLockOutline } from "@aglyn/shared-data-mdi";
|
|
21
|
+
import Box from "@mui/material/Box";
|
|
22
|
+
import Button from "@mui/material/Button";
|
|
23
|
+
import Typography from "@mui/material/Typography";
|
|
24
|
+
import { forwardRef, useEffect, useState } from "react";
|
|
25
|
+
import { BUNDLE_ID } from "../constants/bundle-common.js";
|
|
26
|
+
import { generatePresetId } from "../utils/generate-preset-id.js";
|
|
27
|
+
// Component ids are persisted in screen documents; never rename.
|
|
28
|
+
export const ID = 'gate';
|
|
29
|
+
/**
|
|
30
|
+
* Content gate (AGL-309): renders children only for entitled members
|
|
31
|
+
* (purchase or live subscription, checked by the server-enforced gate
|
|
32
|
+
* API). Non-members see the teaser + CTA. Layout gating only — media
|
|
33
|
+
* that must stay secret should use the gated video block (AGL-315) or
|
|
34
|
+
* download links (AGL-302), which enforce on the server end-to-end.
|
|
35
|
+
*/ const Gate = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
36
|
+
const { productId, teaserText, ctaLabel, ctaHref, children } = props, rest = _object_without_properties_loose(props, [
|
|
37
|
+
"productId",
|
|
38
|
+
"teaserText",
|
|
39
|
+
"ctaLabel",
|
|
40
|
+
"ctaHref",
|
|
41
|
+
"children"
|
|
42
|
+
]);
|
|
43
|
+
// Node styles ride the renderer-merged sx; recompose (stack.ts pattern).
|
|
44
|
+
const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [
|
|
45
|
+
props['sx']
|
|
46
|
+
];
|
|
47
|
+
const { hostId } = Aglyn.useSite();
|
|
48
|
+
const [state, setState] = useState('checking');
|
|
49
|
+
useEffect(()=>{
|
|
50
|
+
if (!hostId) return;
|
|
51
|
+
let active = true;
|
|
52
|
+
void fetch(`/api/commerce/gate?hostId=${encodeURIComponent(hostId)}` + `&productId=${encodeURIComponent(productId || 'any')}`).then((response)=>response.json()).then((payload)=>{
|
|
53
|
+
if (!active) return;
|
|
54
|
+
setState((payload == null ? void 0 : payload.entitled) ? 'entitled' : (payload == null ? void 0 : payload.signedIn) ? 'blocked' : 'anonymous');
|
|
55
|
+
}).catch(()=>{
|
|
56
|
+
if (active) setState('blocked');
|
|
57
|
+
});
|
|
58
|
+
return ()=>{
|
|
59
|
+
active = false;
|
|
60
|
+
};
|
|
61
|
+
}, [
|
|
62
|
+
hostId,
|
|
63
|
+
productId
|
|
64
|
+
]);
|
|
65
|
+
// Besigner canvas: children render with a members-only frame so the
|
|
66
|
+
// designer sees what they are building (the preview-as-member state).
|
|
67
|
+
if (!hostId) {
|
|
68
|
+
return /*#__PURE__*/ _jsxs(Box, _extends({
|
|
69
|
+
ref: ref
|
|
70
|
+
}, rest, {
|
|
71
|
+
sx: [
|
|
72
|
+
{
|
|
73
|
+
border: '1px dashed',
|
|
74
|
+
borderColor: 'primary.main',
|
|
75
|
+
borderRadius: 1,
|
|
76
|
+
p: 1
|
|
77
|
+
},
|
|
78
|
+
...nodeSx
|
|
79
|
+
],
|
|
80
|
+
children: [
|
|
81
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
82
|
+
variant: "caption",
|
|
83
|
+
color: "primary",
|
|
84
|
+
children: '🔒 Members only — visitors see the teaser'
|
|
85
|
+
}),
|
|
86
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
87
|
+
children: children
|
|
88
|
+
})
|
|
89
|
+
]
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
if (state === 'checking') return /*#__PURE__*/ _jsx(Box, _extends({
|
|
93
|
+
ref: ref
|
|
94
|
+
}, rest));
|
|
95
|
+
if (state === 'entitled') {
|
|
96
|
+
return /*#__PURE__*/ _jsx(Box, _extends({
|
|
97
|
+
ref: ref
|
|
98
|
+
}, rest, {
|
|
99
|
+
children: children
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
return /*#__PURE__*/ _jsxs(Box, _extends({
|
|
103
|
+
ref: ref
|
|
104
|
+
}, rest, {
|
|
105
|
+
sx: [
|
|
106
|
+
{
|
|
107
|
+
p: 4,
|
|
108
|
+
textAlign: 'center',
|
|
109
|
+
border: 1,
|
|
110
|
+
borderColor: 'divider',
|
|
111
|
+
borderRadius: 1
|
|
112
|
+
},
|
|
113
|
+
...nodeSx
|
|
114
|
+
],
|
|
115
|
+
children: [
|
|
116
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
117
|
+
variant: "h6",
|
|
118
|
+
gutterBottom: true,
|
|
119
|
+
children: '🔒 Members only'
|
|
120
|
+
}),
|
|
121
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
122
|
+
variant: "body2",
|
|
123
|
+
color: "text.secondary",
|
|
124
|
+
sx: {
|
|
125
|
+
mb: 2
|
|
126
|
+
},
|
|
127
|
+
children: teaserText || (state === 'anonymous' ? 'Sign in or subscribe to unlock this content.' : 'Subscribe to unlock this content.')
|
|
128
|
+
}),
|
|
129
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
130
|
+
variant: "contained",
|
|
131
|
+
color: "primary",
|
|
132
|
+
href: ctaHref || (state === 'anonymous' ? '/account' : '/shop'),
|
|
133
|
+
children: ctaLabel || (state === 'anonymous' ? 'Sign in' : 'Get access')
|
|
134
|
+
})
|
|
135
|
+
]
|
|
136
|
+
}));
|
|
137
|
+
});
|
|
138
|
+
Gate.displayName = 'AglynGate';
|
|
139
|
+
export const schema = {
|
|
140
|
+
$id: ID,
|
|
141
|
+
pluginId: BUNDLE_ID,
|
|
142
|
+
displayName: 'Members gate',
|
|
143
|
+
description: 'Shows its children only to entitled members. Everyone else sees the teaser.',
|
|
144
|
+
category: Aglyn.ComponentCategory.COMMERCE,
|
|
145
|
+
attributes: [
|
|
146
|
+
{
|
|
147
|
+
name: 'productId',
|
|
148
|
+
label: 'Required product id',
|
|
149
|
+
description: 'Members who bought or subscribe to this product get in; blank ' + 'accepts any live subscription.',
|
|
150
|
+
component: Aglyn.FieldComponentType.PRODUCT_SELECT
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: 'teaserText',
|
|
154
|
+
label: 'Teaser text',
|
|
155
|
+
description: 'What a signed-out or non-member visitor sees in place of the ' + 'gated content. A line that says what is behind the gate converts ' + 'better than one that only says access is denied.',
|
|
156
|
+
component: Aglyn.FieldComponentType.TEXT_FIELD
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: 'ctaLabel',
|
|
160
|
+
label: 'CTA label',
|
|
161
|
+
description: 'Button text for non-members.',
|
|
162
|
+
component: Aglyn.FieldComponentType.TEXT_FIELD
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: 'ctaHref',
|
|
166
|
+
label: 'CTA link',
|
|
167
|
+
description: 'Where the button sends non-members.',
|
|
168
|
+
component: Aglyn.FieldComponentType.TEXT_FIELD
|
|
169
|
+
}
|
|
170
|
+
],
|
|
171
|
+
icon: {
|
|
172
|
+
path: mdiLockOutline.path,
|
|
173
|
+
sx: {
|
|
174
|
+
color: '#2e7d32'
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
export const presets = [
|
|
179
|
+
{
|
|
180
|
+
$id: generatePresetId(ID),
|
|
181
|
+
type: Aglyn.NodeType.PRESET,
|
|
182
|
+
displayName: 'Members gate',
|
|
183
|
+
pluginId: BUNDLE_ID,
|
|
184
|
+
description: 'Wraps content only entitled members can see',
|
|
185
|
+
category: Aglyn.ComponentCategory.COMMERCE,
|
|
186
|
+
icon: {
|
|
187
|
+
path: mdiLockOutline.path,
|
|
188
|
+
sx: {
|
|
189
|
+
color: '#2e7d32'
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
data: {
|
|
193
|
+
$id: null,
|
|
194
|
+
componentId: ID,
|
|
195
|
+
pluginId: BUNDLE_ID,
|
|
196
|
+
props: {}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
];
|
|
200
|
+
export default Gate;
|
|
201
|
+
|
|
202
|
+
//# sourceMappingURL=gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/commerce/src/lib/components/gate.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { mdiLockOutline } from '@aglyn/shared-data-mdi'\nimport Box from '@mui/material/Box'\nimport Button from '@mui/material/Button'\nimport Typography from '@mui/material/Typography'\nimport { forwardRef, useEffect, useState, type ReactNode } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport { generatePresetId } from '../utils/generate-preset-id'\n\n// Component ids are persisted in screen documents; never rename.\nexport const ID: Aglyn.ComponentId = 'gate'\n\nexport interface GateProps {\n /** Product id granting access; blank = any live subscription. */\n productId?: string\n teaserText?: string\n ctaLabel?: string\n /** Where the CTA sends non-members (product or sign-in page). */\n ctaHref?: string\n children?: ReactNode\n}\n\n/**\n * Content gate (AGL-309): renders children only for entitled members\n * (purchase or live subscription, checked by the server-enforced gate\n * API). Non-members see the teaser + CTA. Layout gating only — media\n * that must stay secret should use the gated video block (AGL-315) or\n * download links (AGL-302), which enforce on the server end-to-end.\n */\nconst Gate = forwardRef<HTMLDivElement, GateProps>((props, ref) => {\n const { productId, teaserText, ctaLabel, ctaHref, children, ...rest } = props\n // Node styles ride the renderer-merged sx; recompose (stack.ts pattern).\n const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [props['sx']]\n const { hostId } = Aglyn.useSite()\n const [state, setState] = useState<\n 'checking' | 'entitled' | 'blocked' | 'anonymous'\n >('checking')\n\n useEffect(() => {\n if (!hostId) return\n let active = true\n void fetch(\n `/api/commerce/gate?hostId=${encodeURIComponent(hostId)}` +\n `&productId=${encodeURIComponent(productId || 'any')}`,\n )\n .then((response) => response.json())\n .then((payload) => {\n if (!active) return\n setState(\n payload?.entitled\n ? 'entitled'\n : payload?.signedIn\n ? 'blocked'\n : 'anonymous',\n )\n })\n .catch(() => {\n if (active) setState('blocked')\n })\n return () => {\n active = false\n }\n }, [hostId, productId])\n\n // Besigner canvas: children render with a members-only frame so the\n // designer sees what they are building (the preview-as-member state).\n if (!hostId) {\n return (\n <Box\n ref={ref}\n {...rest}\n sx={[\n {\n border: '1px dashed',\n borderColor: 'primary.main',\n borderRadius: 1,\n p: 1,\n },\n ...nodeSx,\n ]}\n >\n <Typography variant=\"caption\" color=\"primary\">\n {'🔒 Members only — visitors see the teaser'}\n </Typography>\n <Box>{children}</Box>\n </Box>\n )\n }\n if (state === 'checking') return <Box ref={ref} {...rest} />\n if (state === 'entitled') {\n return (\n <Box ref={ref} {...rest}>\n {children}\n </Box>\n )\n }\n return (\n <Box\n ref={ref}\n {...rest}\n sx={[\n {\n p: 4,\n textAlign: 'center',\n border: 1,\n borderColor: 'divider',\n borderRadius: 1,\n },\n ...nodeSx,\n ]}\n >\n <Typography variant=\"h6\" gutterBottom>\n {'🔒 Members only'}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 2 }}>\n {teaserText ||\n (state === 'anonymous'\n ? 'Sign in or subscribe to unlock this content.'\n : 'Subscribe to unlock this content.')}\n </Typography>\n <Button\n variant=\"contained\"\n color=\"primary\"\n href={ctaHref || (state === 'anonymous' ? '/account' : '/shop')}\n >\n {ctaLabel || (state === 'anonymous' ? 'Sign in' : 'Get access')}\n </Button>\n </Box>\n )\n})\nGate.displayName = 'AglynGate'\n\nexport const schema: Aglyn.ComponentSchema<GateProps> = {\n $id: ID,\n pluginId: BUNDLE_ID,\n displayName: 'Members gate',\n description:\n 'Shows its children only to entitled members. Everyone else sees the teaser.',\n category: Aglyn.ComponentCategory.COMMERCE,\n attributes: [\n {\n name: 'productId',\n label: 'Required product id',\n description:\n 'Members who bought or subscribe to this product get in; blank ' +\n 'accepts any live subscription.',\n component: Aglyn.FieldComponentType.PRODUCT_SELECT,\n },\n {\n name: 'teaserText',\n label: 'Teaser text',\n description:\n 'What a signed-out or non-member visitor sees in place of the ' +\n 'gated content. A line that says what is behind the gate converts ' +\n 'better than one that only says access is denied.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n {\n name: 'ctaLabel',\n label: 'CTA label',\n description: 'Button text for non-members.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n {\n name: 'ctaHref',\n label: 'CTA link',\n description: 'Where the button sends non-members.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n ],\n icon: { path: mdiLockOutline.path, sx: { color: '#2e7d32' } },\n}\n\nexport const presets: Aglyn.PresetSchema[] = [\n {\n $id: generatePresetId(ID),\n type: Aglyn.NodeType.PRESET,\n displayName: 'Members gate',\n pluginId: BUNDLE_ID,\n description: 'Wraps content only entitled members can see',\n category: Aglyn.ComponentCategory.COMMERCE,\n icon: { path: mdiLockOutline.path, sx: { color: '#2e7d32' } },\n data: {\n $id: null,\n componentId: ID,\n pluginId: BUNDLE_ID,\n props: {},\n },\n },\n]\n\nexport default Gate\n"],"names":["Aglyn","mdiLockOutline","Box","Button","Typography","forwardRef","useEffect","useState","BUNDLE_ID","generatePresetId","ID","Gate","props","ref","productId","teaserText","ctaLabel","ctaHref","children","rest","nodeSx","Array","isArray","hostId","useSite","state","setState","active","fetch","encodeURIComponent","then","response","json","payload","entitled","signedIn","catch","sx","border","borderColor","borderRadius","p","variant","color","textAlign","gutterBottom","mb","href","displayName","schema","$id","pluginId","description","category","ComponentCategory","COMMERCE","attributes","name","label","component","FieldComponentType","PRODUCT_SELECT","TEXT_FIELD","icon","path","presets","type","NodeType","PRESET","data","componentId"],"mappings":";;;AAAA;;;;;;;;;;;;;;;CAeC,GAED,YAAYA,WAAW,eAAc;AACrC,SAASC,cAAc,QAAQ,yBAAwB;AACvD,OAAOC,SAAS,oBAAmB;AACnC,OAAOC,YAAY,uBAAsB;AACzC,OAAOC,gBAAgB,2BAA0B;AACjD,SAASC,UAAU,EAAEC,SAAS,EAAEC,QAAQ,QAAwB,QAAO;AACvE,SAASC,SAAS,QAAQ,gCAA4B;AACtD,SAASC,gBAAgB,QAAQ,iCAA6B;AAE9D,iEAAiE;AACjE,OAAO,MAAMC,KAAwB,OAAM;AAY3C;;;;;;CAMC,GACD,MAAMC,qBAAON,WAAsC,CAACO,OAAOC;IACzD,MAAM,EAAEC,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,EAAW,GAAGN,OAATO,wCAASP;;;;;;;IACxE,yEAAyE;IACzE,MAAMQ,SAASC,MAAMC,OAAO,CAACV,KAAK,CAAC,KAAK,IAAIA,KAAK,CAAC,KAAK,GAAG;QAACA,KAAK,CAAC,KAAK;KAAC;IACvE,MAAM,EAAEW,MAAM,EAAE,GAAGvB,MAAMwB,OAAO;IAChC,MAAM,CAACC,OAAOC,SAAS,GAAGnB,SAExB;IAEFD,UAAU;QACR,IAAI,CAACiB,QAAQ;QACb,IAAII,SAAS;QACb,KAAKC,MACH,CAAC,0BAA0B,EAAEC,mBAAmBN,SAAS,GACvD,CAAC,WAAW,EAAEM,mBAAmBf,aAAa,QAAQ,EAEvDgB,IAAI,CAAC,CAACC,WAAaA,SAASC,IAAI,IAChCF,IAAI,CAAC,CAACG;YACL,IAAI,CAACN,QAAQ;YACbD,SACEO,CAAAA,2BAAAA,QAASC,QAAQ,IACb,aACAD,CAAAA,2BAAAA,QAASE,QAAQ,IACf,YACA;QAEV,GACCC,KAAK,CAAC;YACL,IAAIT,QAAQD,SAAS;QACvB;QACF,OAAO;YACLC,SAAS;QACX;IACF,GAAG;QAACJ;QAAQT;KAAU;IAEtB,oEAAoE;IACpE,sEAAsE;IACtE,IAAI,CAACS,QAAQ;QACX,qBACE,MAACrB;YACCW,KAAKA;WACDM;YACJkB,IAAI;gBACF;oBACEC,QAAQ;oBACRC,aAAa;oBACbC,cAAc;oBACdC,GAAG;gBACL;mBACGrB;aACJ;;8BAED,KAAChB;oBAAWsC,SAAQ;oBAAUC,OAAM;8BACjC;;8BAEH,KAACzC;8BAAKgB;;;;IAGZ;IACA,IAAIO,UAAU,YAAY,qBAAO,KAACvB;QAAIW,KAAKA;OAASM;IACpD,IAAIM,UAAU,YAAY;QACxB,qBACE,KAACvB;YAAIW,KAAKA;WAASM;sBAChBD;;IAGP;IACA,qBACE,MAAChB;QACCW,KAAKA;OACDM;QACJkB,IAAI;YACF;gBACEI,GAAG;gBACHG,WAAW;gBACXN,QAAQ;gBACRC,aAAa;gBACbC,cAAc;YAChB;eACGpB;SACJ;;0BAED,KAAChB;gBAAWsC,SAAQ;gBAAKG,YAAY;0BAClC;;0BAEH,KAACzC;gBAAWsC,SAAQ;gBAAQC,OAAM;gBAAiBN,IAAI;oBAAES,IAAI;gBAAE;0BAC5D/B,cACEU,CAAAA,UAAU,cACP,iDACA,mCAAkC;;0BAE1C,KAACtB;gBACCuC,SAAQ;gBACRC,OAAM;gBACNI,MAAM9B,WAAYQ,CAAAA,UAAU,cAAc,aAAa,OAAM;0BAE5DT,YAAaS,CAAAA,UAAU,cAAc,YAAY,YAAW;;;;AAIrE;AACAd,KAAKqC,WAAW,GAAG;AAEnB,OAAO,MAAMC,SAA2C;IACtDC,KAAKxC;IACLyC,UAAU3C;IACVwC,aAAa;IACbI,aACE;IACFC,UAAUrD,MAAMsD,iBAAiB,CAACC,QAAQ;IAC1CC,YAAY;QACV;YACEC,MAAM;YACNC,OAAO;YACPN,aACE,mEACA;YACFO,WAAW3D,MAAM4D,kBAAkB,CAACC,cAAc;QACpD;QACA;YACEJ,MAAM;YACNC,OAAO;YACPN,aACE,kEACA,sEACA;YACFO,WAAW3D,MAAM4D,kBAAkB,CAACE,UAAU;QAChD;QACA;YACEL,MAAM;YACNC,OAAO;YACPN,aAAa;YACbO,WAAW3D,MAAM4D,kBAAkB,CAACE,UAAU;QAChD;QACA;YACEL,MAAM;YACNC,OAAO;YACPN,aAAa;YACbO,WAAW3D,MAAM4D,kBAAkB,CAACE,UAAU;QAChD;KACD;IACDC,MAAM;QAAEC,MAAM/D,eAAe+D,IAAI;QAAE3B,IAAI;YAAEM,OAAO;QAAU;IAAE;AAC9D,EAAC;AAED,OAAO,MAAMsB,UAAgC;IAC3C;QACEf,KAAKzC,iBAAiBC;QACtBwD,MAAMlE,MAAMmE,QAAQ,CAACC,MAAM;QAC3BpB,aAAa;QACbG,UAAU3C;QACV4C,aAAa;QACbC,UAAUrD,MAAMsD,iBAAiB,CAACC,QAAQ;QAC1CQ,MAAM;YAAEC,MAAM/D,eAAe+D,IAAI;YAAE3B,IAAI;gBAAEM,OAAO;YAAU;QAAE;QAC5D0B,MAAM;YACJnB,KAAK;YACLoB,aAAa5D;YACbyC,UAAU3C;YACVI,OAAO,CAAC;QACV;IACF;CACD,CAAA;AAED,eAAeD,KAAI"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import * as Aglyn from '@aglyn/aglyn';
|
|
18
|
+
export declare const ID: Aglyn.ComponentId;
|
|
19
|
+
export interface GatedVideoProps {
|
|
20
|
+
/** Product whose gatedVideos list this plays from. */
|
|
21
|
+
productId?: string;
|
|
22
|
+
/** Index into the product's gatedVideos (default 0). */
|
|
23
|
+
videoIndex?: number;
|
|
24
|
+
lockedText?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Gated video block (AGL-315): entitled members get a short-TTL signed
|
|
28
|
+
* stream URL from the server (the gate is the mint step); playback
|
|
29
|
+
* resumes from the last position. SiteC's training-program player.
|
|
30
|
+
*
|
|
31
|
+
* Every link behind the player expires (AGL-2814), so a long sitting outlives
|
|
32
|
+
* the one it started with. When a request under an expired link fails, the
|
|
33
|
+
* player asks the stream endpoint for a new one, which re-checks the member's
|
|
34
|
+
* entitlement, and resumes at the second it stopped. A member who has lost
|
|
35
|
+
* the entitlement gets the locked state instead.
|
|
36
|
+
*/
|
|
37
|
+
declare const GatedVideo: import("react").ForwardRefExoticComponent<GatedVideoProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
38
|
+
export declare const schema: Aglyn.ComponentSchema<GatedVideoProps>;
|
|
39
|
+
export declare const presets: Aglyn.PresetSchema[];
|
|
40
|
+
export default GatedVideo;
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
|
|
3
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
|
+
/**
|
|
5
|
+
* @license
|
|
6
|
+
* Copyright 2026 Aglyn LLC
|
|
7
|
+
*
|
|
8
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
* you may not use this file except in compliance with the License.
|
|
10
|
+
* You may obtain a copy of the License at
|
|
11
|
+
*
|
|
12
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
*
|
|
14
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
* See the License for the specific language governing permissions and
|
|
18
|
+
* limitations under the License.
|
|
19
|
+
*/ import * as Aglyn from "@aglyn/aglyn";
|
|
20
|
+
import { mdiPlayCircleOutline } from "@aglyn/shared-data-mdi";
|
|
21
|
+
import Box from "@mui/material/Box";
|
|
22
|
+
import Button from "@mui/material/Button";
|
|
23
|
+
import Typography from "@mui/material/Typography";
|
|
24
|
+
import { forwardRef, useCallback, useEffect, useRef, useState } from "react";
|
|
25
|
+
import { BUNDLE_ID } from "../constants/bundle-common.js";
|
|
26
|
+
import { generatePresetId } from "../utils/generate-preset-id.js";
|
|
27
|
+
// Component ids are persisted in screen documents; never rename.
|
|
28
|
+
export const ID = 'gated-video';
|
|
29
|
+
/**
|
|
30
|
+
* How many fresh links the player asks for in a row, with no playback in
|
|
31
|
+
* between, before it stops and asks the viewer to reload (AGL-2814).
|
|
32
|
+
*
|
|
33
|
+
* Two covers the two links that can expire under a playing video: the stream
|
|
34
|
+
* link itself, for a browser that re-requests the element's own `src`, and the
|
|
35
|
+
* signed media session behind it. A third failure with nothing played means
|
|
36
|
+
* the problem is not an expiry, and asking again would only loop.
|
|
37
|
+
*/ const MAX_SILENT_RECOVERIES = 2;
|
|
38
|
+
/**
|
|
39
|
+
* Seconds of playback on a fresh link that prove it works. Past this the
|
|
40
|
+
* budget above resets, so an expiry hours later recovers as quietly as the
|
|
41
|
+
* first one did.
|
|
42
|
+
*/ const RECOVERED_AFTER_SECONDS = 5;
|
|
43
|
+
/**
|
|
44
|
+
* The `MediaError` codes a fresh link can cure: `MEDIA_ERR_NETWORK` (2), which
|
|
45
|
+
* a refused byte-range request raises mid-play, and
|
|
46
|
+
* `MEDIA_ERR_SRC_NOT_SUPPORTED` (4), which a refused first request raises.
|
|
47
|
+
* An abort (1) is the page or the viewer stopping the load, and a decode error (3) is
|
|
48
|
+
* a broken file that no new link can fix.
|
|
49
|
+
*/ const RECOVERABLE_MEDIA_ERRORS = new Set([
|
|
50
|
+
2,
|
|
51
|
+
4
|
|
52
|
+
]);
|
|
53
|
+
/**
|
|
54
|
+
* Gated video block (AGL-315): entitled members get a short-TTL signed
|
|
55
|
+
* stream URL from the server (the gate is the mint step); playback
|
|
56
|
+
* resumes from the last position. SiteC's training-program player.
|
|
57
|
+
*
|
|
58
|
+
* Every link behind the player expires (AGL-2814), so a long sitting outlives
|
|
59
|
+
* the one it started with. When a request under an expired link fails, the
|
|
60
|
+
* player asks the stream endpoint for a new one, which re-checks the member's
|
|
61
|
+
* entitlement, and resumes at the second it stopped. A member who has lost
|
|
62
|
+
* the entitlement gets the locked state instead.
|
|
63
|
+
*/ const GatedVideo = /*#__PURE__*/ forwardRef((props, ref)=>{
|
|
64
|
+
const { productId, videoIndex, lockedText } = props, rest = _object_without_properties_loose(props, [
|
|
65
|
+
"productId",
|
|
66
|
+
"videoIndex",
|
|
67
|
+
"lockedText"
|
|
68
|
+
]);
|
|
69
|
+
// Node styles ride the renderer-merged sx; recompose (stack.ts pattern).
|
|
70
|
+
const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [
|
|
71
|
+
props['sx']
|
|
72
|
+
];
|
|
73
|
+
const { hostId } = Aglyn.useSite();
|
|
74
|
+
const siteFetch = Aglyn.useSiteFetch();
|
|
75
|
+
const [src, setSrc] = useState(null);
|
|
76
|
+
const [state, setState] = useState('loading');
|
|
77
|
+
const videoRef = useRef(null);
|
|
78
|
+
/**
|
|
79
|
+
* Where a recovery stands. A ref, not state: the media events that read
|
|
80
|
+
* and write it fire many times a second, and none of it is rendered.
|
|
81
|
+
*/ const recovery = useRef({
|
|
82
|
+
attempts: 0,
|
|
83
|
+
resumeAt: 0,
|
|
84
|
+
resume: false,
|
|
85
|
+
playing: false,
|
|
86
|
+
playedFrom: 0
|
|
87
|
+
});
|
|
88
|
+
const resumeKey = `aglyn_video_${hostId}_${productId}_${videoIndex != null ? videoIndex : 0}`;
|
|
89
|
+
/** One POST to the stream endpoint: a link, or why there is none. */ const requestLink = useCallback(async ()=>{
|
|
90
|
+
try {
|
|
91
|
+
const response = await siteFetch('/api/commerce/stream', {
|
|
92
|
+
method: 'POST',
|
|
93
|
+
headers: {
|
|
94
|
+
'Content-Type': 'application/json'
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify({
|
|
97
|
+
hostId,
|
|
98
|
+
productId,
|
|
99
|
+
video: videoIndex != null ? videoIndex : 0
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
if (response.status === 401 || response.status === 403) return 'locked';
|
|
103
|
+
if (!response.ok) return 'failed';
|
|
104
|
+
const payload = await response.json();
|
|
105
|
+
return typeof (payload == null ? void 0 : payload.url) === 'string' && payload.url ? payload.url : 'failed';
|
|
106
|
+
} catch (unused) {
|
|
107
|
+
return 'failed';
|
|
108
|
+
}
|
|
109
|
+
}, [
|
|
110
|
+
hostId,
|
|
111
|
+
productId,
|
|
112
|
+
videoIndex,
|
|
113
|
+
siteFetch
|
|
114
|
+
]);
|
|
115
|
+
useEffect(()=>{
|
|
116
|
+
if (!hostId || !productId) return;
|
|
117
|
+
let active = true;
|
|
118
|
+
recovery.current = {
|
|
119
|
+
attempts: 0,
|
|
120
|
+
resumeAt: 0,
|
|
121
|
+
resume: false,
|
|
122
|
+
playing: false,
|
|
123
|
+
playedFrom: 0
|
|
124
|
+
};
|
|
125
|
+
void requestLink().then((link)=>{
|
|
126
|
+
if (!active) return;
|
|
127
|
+
// Before anything has played, every refusal reads as the lock: the
|
|
128
|
+
// viewer's next step is to sign in or to buy.
|
|
129
|
+
if (link === 'locked' || link === 'failed') return setState('locked');
|
|
130
|
+
setSrc(link);
|
|
131
|
+
setState('ready');
|
|
132
|
+
});
|
|
133
|
+
return ()=>{
|
|
134
|
+
active = false;
|
|
135
|
+
};
|
|
136
|
+
}, [
|
|
137
|
+
hostId,
|
|
138
|
+
productId,
|
|
139
|
+
requestLink
|
|
140
|
+
]);
|
|
141
|
+
const handleError = ()=>{
|
|
142
|
+
var _element_error;
|
|
143
|
+
const element = videoRef.current;
|
|
144
|
+
if (!element || !RECOVERABLE_MEDIA_ERRORS.has(Number((_element_error = element.error) == null ? void 0 : _element_error.code))) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const progress = recovery.current;
|
|
148
|
+
if (progress.attempts >= MAX_SILENT_RECOVERIES) {
|
|
149
|
+
setState('stalled');
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
progress.attempts += 1;
|
|
153
|
+
progress.resumeAt = element.currentTime || progress.resumeAt;
|
|
154
|
+
progress.resume = progress.playing || !element.paused;
|
|
155
|
+
void requestLink().then((link)=>{
|
|
156
|
+
if (link === 'locked') return setState('locked');
|
|
157
|
+
if (link === 'failed') return setState('stalled');
|
|
158
|
+
setSrc(link);
|
|
159
|
+
});
|
|
160
|
+
};
|
|
161
|
+
const handleLoadedMetadata = ()=>{
|
|
162
|
+
var _window_localStorage_getItem;
|
|
163
|
+
const element = videoRef.current;
|
|
164
|
+
if (!element) return;
|
|
165
|
+
const progress = recovery.current;
|
|
166
|
+
const saved = Number((_window_localStorage_getItem = window.localStorage.getItem(resumeKey)) != null ? _window_localStorage_getItem : 0);
|
|
167
|
+
const target = progress.resumeAt > 0 ? progress.resumeAt : saved > 5 ? saved : 0;
|
|
168
|
+
if (target > 0) element.currentTime = target;
|
|
169
|
+
progress.playedFrom = target;
|
|
170
|
+
if (progress.resume) {
|
|
171
|
+
progress.resume = false;
|
|
172
|
+
try {
|
|
173
|
+
void Promise.resolve(element.play()).catch(()=>undefined);
|
|
174
|
+
} catch (unused) {
|
|
175
|
+
// A refused autoplay leaves the video paused at the right second,
|
|
176
|
+
// which is the useful half of a resume.
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const handleTimeUpdate = ()=>{
|
|
181
|
+
const element = videoRef.current;
|
|
182
|
+
if (!element) return;
|
|
183
|
+
window.localStorage.setItem(resumeKey, String(Math.floor(element.currentTime)));
|
|
184
|
+
const progress = recovery.current;
|
|
185
|
+
if (progress.attempts && element.currentTime - progress.playedFrom >= RECOVERED_AFTER_SECONDS) {
|
|
186
|
+
progress.attempts = 0;
|
|
187
|
+
progress.resumeAt = 0;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
if (!hostId) {
|
|
191
|
+
return /*#__PURE__*/ _jsx(Box, _extends({
|
|
192
|
+
ref: ref
|
|
193
|
+
}, rest, {
|
|
194
|
+
sx: [
|
|
195
|
+
{
|
|
196
|
+
aspectRatio: '16 / 9',
|
|
197
|
+
bgcolor: 'action.hover',
|
|
198
|
+
borderRadius: 1,
|
|
199
|
+
display: 'flex',
|
|
200
|
+
alignItems: 'center',
|
|
201
|
+
justifyContent: 'center',
|
|
202
|
+
color: 'text.secondary',
|
|
203
|
+
fontSize: 13,
|
|
204
|
+
fontFamily: 'system-ui, sans-serif'
|
|
205
|
+
},
|
|
206
|
+
...nodeSx
|
|
207
|
+
],
|
|
208
|
+
children: 'â–¶ Members-only video'
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
if (state === 'loading') return /*#__PURE__*/ _jsx(Box, _extends({
|
|
212
|
+
ref: ref
|
|
213
|
+
}, rest));
|
|
214
|
+
if (state === 'stalled') {
|
|
215
|
+
return /*#__PURE__*/ _jsxs(Box, _extends({
|
|
216
|
+
ref: ref
|
|
217
|
+
}, rest, {
|
|
218
|
+
sx: [
|
|
219
|
+
{
|
|
220
|
+
aspectRatio: '16 / 9',
|
|
221
|
+
bgcolor: 'action.hover',
|
|
222
|
+
borderRadius: 1,
|
|
223
|
+
display: 'flex',
|
|
224
|
+
flexDirection: 'column',
|
|
225
|
+
gap: 1,
|
|
226
|
+
alignItems: 'center',
|
|
227
|
+
justifyContent: 'center',
|
|
228
|
+
px: 2,
|
|
229
|
+
textAlign: 'center'
|
|
230
|
+
},
|
|
231
|
+
...nodeSx
|
|
232
|
+
],
|
|
233
|
+
children: [
|
|
234
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
235
|
+
variant: "body2",
|
|
236
|
+
color: "text.secondary",
|
|
237
|
+
children: 'Playback stopped. Reload the page to keep watching.'
|
|
238
|
+
}),
|
|
239
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
240
|
+
size: "small",
|
|
241
|
+
variant: "contained",
|
|
242
|
+
onClick: ()=>window.location.reload(),
|
|
243
|
+
children: 'Reload'
|
|
244
|
+
})
|
|
245
|
+
]
|
|
246
|
+
}));
|
|
247
|
+
}
|
|
248
|
+
if (state === 'locked' || !src) {
|
|
249
|
+
return /*#__PURE__*/ _jsxs(Box, _extends({
|
|
250
|
+
ref: ref
|
|
251
|
+
}, rest, {
|
|
252
|
+
sx: [
|
|
253
|
+
{
|
|
254
|
+
aspectRatio: '16 / 9',
|
|
255
|
+
bgcolor: 'action.hover',
|
|
256
|
+
borderRadius: 1,
|
|
257
|
+
display: 'flex',
|
|
258
|
+
flexDirection: 'column',
|
|
259
|
+
gap: 1,
|
|
260
|
+
alignItems: 'center',
|
|
261
|
+
justifyContent: 'center'
|
|
262
|
+
},
|
|
263
|
+
...nodeSx
|
|
264
|
+
],
|
|
265
|
+
children: [
|
|
266
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
267
|
+
variant: "body2",
|
|
268
|
+
color: "text.secondary",
|
|
269
|
+
children: lockedText || '🔒 Sign in with an active subscription to watch'
|
|
270
|
+
}),
|
|
271
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
272
|
+
size: "small",
|
|
273
|
+
variant: "contained",
|
|
274
|
+
href: "/account",
|
|
275
|
+
children: 'Sign in'
|
|
276
|
+
})
|
|
277
|
+
]
|
|
278
|
+
}));
|
|
279
|
+
}
|
|
280
|
+
return /*#__PURE__*/ _jsx(Box, _extends({
|
|
281
|
+
ref: ref
|
|
282
|
+
}, rest, {
|
|
283
|
+
children: /*#__PURE__*/ _jsx("video", {
|
|
284
|
+
ref: videoRef,
|
|
285
|
+
src: src,
|
|
286
|
+
controls: true,
|
|
287
|
+
controlsList: "nodownload",
|
|
288
|
+
style: {
|
|
289
|
+
width: '100%',
|
|
290
|
+
borderRadius: 8
|
|
291
|
+
},
|
|
292
|
+
onLoadedMetadata: handleLoadedMetadata,
|
|
293
|
+
onTimeUpdate: handleTimeUpdate,
|
|
294
|
+
onPlay: ()=>{
|
|
295
|
+
recovery.current.playing = true;
|
|
296
|
+
},
|
|
297
|
+
onPause: ()=>{
|
|
298
|
+
recovery.current.playing = false;
|
|
299
|
+
},
|
|
300
|
+
onError: handleError
|
|
301
|
+
})
|
|
302
|
+
}));
|
|
303
|
+
});
|
|
304
|
+
GatedVideo.displayName = 'AglynGatedVideo';
|
|
305
|
+
export const schema = {
|
|
306
|
+
$id: ID,
|
|
307
|
+
pluginId: BUNDLE_ID,
|
|
308
|
+
displayName: 'Members video',
|
|
309
|
+
description: 'A video only entitled members can play, resuming where they left off.',
|
|
310
|
+
category: Aglyn.ComponentCategory.COMMERCE,
|
|
311
|
+
icon: {
|
|
312
|
+
path: mdiPlayCircleOutline.path,
|
|
313
|
+
sx: {
|
|
314
|
+
color: '#2e7d32'
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
flags: {
|
|
318
|
+
selfClosing: Aglyn.FEATURE_FLAG.ENABLED
|
|
319
|
+
},
|
|
320
|
+
attributes: [
|
|
321
|
+
{
|
|
322
|
+
name: 'productId',
|
|
323
|
+
label: 'Product id',
|
|
324
|
+
description: 'Members entitled to this product can watch its gated videos.',
|
|
325
|
+
component: Aglyn.FieldComponentType.PRODUCT_SELECT
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
name: 'videoIndex',
|
|
329
|
+
label: 'Video number',
|
|
330
|
+
description: 'Which of the product’s videos to play (1st = 0).',
|
|
331
|
+
component: Aglyn.FieldComponentType.TEXT_FIELD,
|
|
332
|
+
type: 'number'
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
name: 'lockedText',
|
|
336
|
+
label: 'Locked text',
|
|
337
|
+
description: 'The message over the poster frame when the viewer cannot play ' + 'this video. The poster image still shows, so this only has to ' + 'explain the lock.',
|
|
338
|
+
component: Aglyn.FieldComponentType.TEXT_FIELD
|
|
339
|
+
}
|
|
340
|
+
]
|
|
341
|
+
};
|
|
342
|
+
export const presets = [
|
|
343
|
+
{
|
|
344
|
+
$id: generatePresetId(ID),
|
|
345
|
+
type: Aglyn.NodeType.PRESET,
|
|
346
|
+
displayName: 'Members video',
|
|
347
|
+
pluginId: BUNDLE_ID,
|
|
348
|
+
description: 'Subscription-gated video with resume',
|
|
349
|
+
category: Aglyn.ComponentCategory.COMMERCE,
|
|
350
|
+
icon: {
|
|
351
|
+
path: mdiPlayCircleOutline.path,
|
|
352
|
+
sx: {
|
|
353
|
+
color: '#2e7d32'
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
data: {
|
|
357
|
+
$id: null,
|
|
358
|
+
componentId: ID,
|
|
359
|
+
pluginId: BUNDLE_ID,
|
|
360
|
+
props: {}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
];
|
|
364
|
+
export default GatedVideo;
|
|
365
|
+
|
|
366
|
+
//# sourceMappingURL=gated-video.js.map
|