@vtex/faststore 0.0.1
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/CHANGELOG.md +18 -0
- package/LICENSE +21 -0
- package/README.md +95 -0
- package/dist/actions.json +334 -0
- package/dist/catalog.json +6615 -0
- package/dist/client.d.ts +17 -0
- package/dist/client.js +8 -0
- package/dist/components.d.ts +87 -0
- package/dist/components.js +87 -0
- package/dist/content-types.json +684 -0
- package/dist/core/dist/actions/mock-action.d.ts +24 -0
- package/dist/core/dist/actions/mock-action.js +28 -0
- package/dist/core/dist/actions/mock-action.js.map +1 -0
- package/dist/core/dist/actions/registry.d.ts +24 -0
- package/dist/core/dist/actions/registry.js +28 -0
- package/dist/core/dist/actions/registry.js.map +1 -0
- package/dist/core/dist/define-component.d.ts +100 -0
- package/dist/core/dist/define-component.js +8 -0
- package/dist/core/dist/define-component.js.map +1 -0
- package/dist/core/dist/define-content-type.d.ts +95 -0
- package/dist/core/dist/define-content-type.js +283 -0
- package/dist/core/dist/define-content-type.js.map +1 -0
- package/dist/core/dist/index.d.ts +7 -0
- package/dist/core/dist/index.js +5 -0
- package/dist/core/dist/schema/generated/schema.d.ts +28 -0
- package/dist/core/dist/types.d.ts +1 -0
- package/dist/docs/access-code-field.md +100 -0
- package/dist/docs/access-code-sign-in.md +174 -0
- package/dist/docs/account-entry-point.md +155 -0
- package/dist/docs/address-summary.md +50 -0
- package/dist/docs/buy-button.md +162 -0
- package/dist/docs/carousel.md +105 -0
- package/dist/docs/cart-item.md +162 -0
- package/dist/docs/cart-totalizer.md +197 -0
- package/dist/docs/cart.md +495 -0
- package/dist/docs/client-preferences.md +184 -0
- package/dist/docs/client-profile-form.md +192 -0
- package/dist/docs/client-profile.md +117 -0
- package/dist/docs/container.md +97 -0
- package/dist/docs/document-field.md +97 -0
- package/dist/docs/email-field.md +93 -0
- package/dist/docs/email-identification.md +102 -0
- package/dist/docs/footer-copyright.md +112 -0
- package/dist/docs/footer-link-group.md +162 -0
- package/dist/docs/footer-root.md +145 -0
- package/dist/docs/footer-social.md +151 -0
- package/dist/docs/free-shipping-progress.md +87 -0
- package/dist/docs/gallery.md +84 -0
- package/dist/docs/header-root.md +150 -0
- package/dist/docs/identity-edit.md +88 -0
- package/dist/docs/identity-summary.md +106 -0
- package/dist/docs/incentives.md +151 -0
- package/dist/docs/logo.md +135 -0
- package/dist/docs/meter.md +67 -0
- package/dist/docs/navigation-link-list.md +171 -0
- package/dist/docs/navigation-link.md +163 -0
- package/dist/docs/navigation-menu.md +264 -0
- package/dist/docs/payment-methods.md +139 -0
- package/dist/docs/phone-field.md +106 -0
- package/dist/docs/postal-code-field.md +126 -0
- package/dist/docs/pricing.md +499 -0
- package/dist/docs/product-gallery.md +409 -0
- package/dist/docs/product-information.md +295 -0
- package/dist/docs/product-list.md +170 -0
- package/dist/docs/product-quantity.md +88 -0
- package/dist/docs/product-shelf.md +141 -0
- package/dist/docs/promotion.md +109 -0
- package/dist/docs/region.md +225 -0
- package/dist/docs/session.md +123 -0
- package/dist/docs/shipping-address.md +390 -0
- package/dist/docs/shipping-simulator.md +147 -0
- package/dist/docs/sign-in-form.md +117 -0
- package/dist/docs/tabs.md +176 -0
- package/dist/docs/toast.md +124 -0
- package/dist/docs/variant-selector.md +450 -0
- package/dist/graphql/define-subgraph.d.ts +12 -0
- package/dist/graphql/define-subgraph.js +15 -0
- package/dist/graphql/define-subgraph.js.map +1 -0
- package/dist/graphql/gql.d.ts +10 -0
- package/dist/graphql/gql.js +16 -0
- package/dist/graphql/gql.js.map +1 -0
- package/dist/graphql/types.d.ts +88 -0
- package/dist/graphql.d.ts +4 -0
- package/dist/graphql.js +3 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +5 -0
- package/dist/internal/client.d.ts +24 -0
- package/dist/internal/client.js +23 -0
- package/dist/internal/content.d.ts +2 -0
- package/dist/internal/content.js +2 -0
- package/dist/internal/server.d.ts +7 -0
- package/dist/internal/server.js +6 -0
- package/dist/matter/access-code-sign-in/access-code-sign-in.d.ts +111 -0
- package/dist/matter/access-code-sign-in/access-code-sign-in.js +387 -0
- package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -0
- package/dist/matter/account-entry-point/account-entry-point.d.ts +64 -0
- package/dist/matter/account-entry-point/account-entry-point.js +151 -0
- package/dist/matter/account-entry-point/account-entry-point.js.map +1 -0
- package/dist/matter/breadcrumb/breadcrumb.d.ts +40 -0
- package/dist/matter/breadcrumb/breadcrumb.js +155 -0
- package/dist/matter/breadcrumb/breadcrumb.js.map +1 -0
- package/dist/matter/buy-button/buy-button.d.ts +95 -0
- package/dist/matter/buy-button/buy-button.js +259 -0
- package/dist/matter/buy-button/buy-button.js.map +1 -0
- package/dist/matter/cart/cart-namespace.d.ts +48 -0
- package/dist/matter/cart/cart-namespace.js +50 -0
- package/dist/matter/cart/cart-namespace.js.map +1 -0
- package/dist/matter/cart/cart.d.ts +312 -0
- package/dist/matter/cart/cart.js +1034 -0
- package/dist/matter/cart/cart.js.map +1 -0
- package/dist/matter/cart-item/cart-item.d.ts +103 -0
- package/dist/matter/cart-item/cart-item.js +672 -0
- package/dist/matter/cart-item/cart-item.js.map +1 -0
- package/dist/matter/cart-item-compositions/cart-item-compositions.d.ts +49 -0
- package/dist/matter/cart-item-compositions/cart-item-compositions.js +165 -0
- package/dist/matter/cart-item-compositions/cart-item-compositions.js.map +1 -0
- package/dist/matter/cart-item-customizations/cart-item-customizations.d.ts +28 -0
- package/dist/matter/cart-item-customizations/cart-item-customizations.js +73 -0
- package/dist/matter/cart-item-customizations/cart-item-customizations.js.map +1 -0
- package/dist/matter/cart-item-discounts/cart-item-discounts.d.ts +33 -0
- package/dist/matter/cart-item-discounts/cart-item-discounts.js +70 -0
- package/dist/matter/cart-item-discounts/cart-item-discounts.js.map +1 -0
- package/dist/matter/cart-item-seller-info/cart-item-seller-info.d.ts +24 -0
- package/dist/matter/cart-item-seller-info/cart-item-seller-info.js +54 -0
- package/dist/matter/cart-item-seller-info/cart-item-seller-info.js.map +1 -0
- package/dist/matter/cart-item-variations/cart-item-variations.d.ts +27 -0
- package/dist/matter/cart-item-variations/cart-item-variations.js +69 -0
- package/dist/matter/cart-item-variations/cart-item-variations.js.map +1 -0
- package/dist/matter/cart-totalizer/cart-totalizer.d.ts +78 -0
- package/dist/matter/cart-totalizer/cart-totalizer.js +220 -0
- package/dist/matter/cart-totalizer/cart-totalizer.js.map +1 -0
- package/dist/matter/client-preferences/client-preferences.d.ts +50 -0
- package/dist/matter/client-preferences/client-preferences.js +206 -0
- package/dist/matter/client-preferences/client-preferences.js.map +1 -0
- package/dist/matter/client-profile/client-profile.d.ts +59 -0
- package/dist/matter/client-profile/client-profile.js +185 -0
- package/dist/matter/client-profile/client-profile.js.map +1 -0
- package/dist/matter/client-profile-form/client-profile-form.d.ts +126 -0
- package/dist/matter/client-profile-form/client-profile-form.js +660 -0
- package/dist/matter/client-profile-form/client-profile-form.js.map +1 -0
- package/dist/matter/delivery-options/delivery-options-accordion.d.ts +30 -0
- package/dist/matter/delivery-options/delivery-options-accordion.js +189 -0
- package/dist/matter/delivery-options/delivery-options-accordion.js.map +1 -0
- package/dist/matter/delivery-options/delivery-options-controller.d.ts +49 -0
- package/dist/matter/delivery-options/delivery-options-controller.js +203 -0
- package/dist/matter/delivery-options/delivery-options-controller.js.map +1 -0
- package/dist/matter/delivery-options/delivery-options.d.ts +31 -0
- package/dist/matter/delivery-options/delivery-options.js +103 -0
- package/dist/matter/delivery-options/delivery-options.js.map +1 -0
- package/dist/matter/delivery-options/use-delivery-option-selection.d.ts +9 -0
- package/dist/matter/delivery-options/use-delivery-option-selection.js +76 -0
- package/dist/matter/delivery-options/use-delivery-option-selection.js.map +1 -0
- package/dist/matter/email-identification/email-identification.d.ts +37 -0
- package/dist/matter/email-identification/email-identification.js +111 -0
- package/dist/matter/email-identification/email-identification.js.map +1 -0
- package/dist/matter/free-shipping-progress/free-shipping-progress.d.ts +44 -0
- package/dist/matter/free-shipping-progress/free-shipping-progress.js +170 -0
- package/dist/matter/free-shipping-progress/free-shipping-progress.js.map +1 -0
- package/dist/matter/identity-edit/identity-edit.d.ts +52 -0
- package/dist/matter/identity-edit/identity-edit.js +148 -0
- package/dist/matter/identity-edit/identity-edit.js.map +1 -0
- package/dist/matter/identity-summary/identity-summary.d.ts +128 -0
- package/dist/matter/identity-summary/identity-summary.js +344 -0
- package/dist/matter/identity-summary/identity-summary.js.map +1 -0
- package/dist/matter/pricing/pricing.d.ts +162 -0
- package/dist/matter/pricing/pricing.js +793 -0
- package/dist/matter/pricing/pricing.js.map +1 -0
- package/dist/matter/product-gallery/product-gallery.d.ts +23 -0
- package/dist/matter/product-gallery/product-gallery.js +188 -0
- package/dist/matter/product-gallery/product-gallery.js.map +1 -0
- package/dist/matter/product-information/product-information.d.ts +61 -0
- package/dist/matter/product-information/product-information.js +355 -0
- package/dist/matter/product-information/product-information.js.map +1 -0
- package/dist/matter/product-list/product-list.d.ts +86 -0
- package/dist/matter/product-list/product-list.js +342 -0
- package/dist/matter/product-list/product-list.js.map +1 -0
- package/dist/matter/product-quantity/product-quantity.d.ts +50 -0
- package/dist/matter/product-quantity/product-quantity.js +111 -0
- package/dist/matter/product-quantity/product-quantity.js.map +1 -0
- package/dist/matter/product-shelf/product-shelf.d.ts +125 -0
- package/dist/matter/product-shelf/product-shelf.js +376 -0
- package/dist/matter/product-shelf/product-shelf.js.map +1 -0
- package/dist/matter/region/region.d.ts +211 -0
- package/dist/matter/region/region.js +579 -0
- package/dist/matter/region/region.js.map +1 -0
- package/dist/matter/session/session.d.ts +58 -0
- package/dist/matter/session/session.js +112 -0
- package/dist/matter/session/session.js.map +1 -0
- package/dist/matter/shipping-address/country-descriptors.js +101 -0
- package/dist/matter/shipping-address/country-descriptors.js.map +1 -0
- package/dist/matter/shipping-address/shipping-address.d.ts +284 -0
- package/dist/matter/shipping-address/shipping-address.js +1036 -0
- package/dist/matter/shipping-address/shipping-address.js.map +1 -0
- package/dist/matter/shipping-simulator/shipping-simulator.d.ts +143 -0
- package/dist/matter/shipping-simulator/shipping-simulator.js +644 -0
- package/dist/matter/shipping-simulator/shipping-simulator.js.map +1 -0
- package/dist/matter/sign-in-form/sign-in-form.d.ts +79 -0
- package/dist/matter/sign-in-form/sign-in-form.js +226 -0
- package/dist/matter/sign-in-form/sign-in-form.js.map +1 -0
- package/dist/matter/variant-selector/variant-selector.d.ts +183 -0
- package/dist/matter/variant-selector/variant-selector.js +840 -0
- package/dist/matter/variant-selector/variant-selector.js.map +1 -0
- package/dist/message-locales.json +7 -0
- package/dist/particles/access-code-field/access-code-field.d.ts +33 -0
- package/dist/particles/access-code-field/access-code-field.js +95 -0
- package/dist/particles/access-code-field/access-code-field.js.map +1 -0
- package/dist/particles/accordion/accordion.d.ts +45 -0
- package/dist/particles/accordion/accordion.js +156 -0
- package/dist/particles/accordion/accordion.js.map +1 -0
- package/dist/particles/address-summary/address-summary.d.ts +50 -0
- package/dist/particles/address-summary/address-summary.js +129 -0
- package/dist/particles/address-summary/address-summary.js.map +1 -0
- package/dist/particles/badge/badge.d.ts +10 -0
- package/dist/particles/badge/badge.js +27 -0
- package/dist/particles/badge/badge.js.map +1 -0
- package/dist/particles/button/button.d.ts +18 -0
- package/dist/particles/button/button.js +37 -0
- package/dist/particles/button/button.js.map +1 -0
- package/dist/particles/carousel/carousel.d.ts +60 -0
- package/dist/particles/carousel/carousel.js +335 -0
- package/dist/particles/carousel/carousel.js.map +1 -0
- package/dist/particles/checkbox/checkbox.d.ts +40 -0
- package/dist/particles/checkbox/checkbox.js +82 -0
- package/dist/particles/checkbox/checkbox.js.map +1 -0
- package/dist/particles/container/container.d.ts +20 -0
- package/dist/particles/container/container.js +36 -0
- package/dist/particles/container/container.js.map +1 -0
- package/dist/particles/dialog/dialog.d.ts +54 -0
- package/dist/particles/dialog/dialog.js +192 -0
- package/dist/particles/dialog/dialog.js.map +1 -0
- package/dist/particles/document-field/document-field.d.ts +61 -0
- package/dist/particles/document-field/document-field.js +146 -0
- package/dist/particles/document-field/document-field.js.map +1 -0
- package/dist/particles/drawer/drawer.d.ts +52 -0
- package/dist/particles/drawer/drawer.js +183 -0
- package/dist/particles/drawer/drawer.js.map +1 -0
- package/dist/particles/email-field/email-field.d.ts +37 -0
- package/dist/particles/email-field/email-field.js +106 -0
- package/dist/particles/email-field/email-field.js.map +1 -0
- package/dist/particles/field/field.d.ts +50 -0
- package/dist/particles/field/field.js +133 -0
- package/dist/particles/field/field.js.map +1 -0
- package/dist/particles/fieldset/fieldset.d.ts +16 -0
- package/dist/particles/fieldset/fieldset.js +52 -0
- package/dist/particles/fieldset/fieldset.js.map +1 -0
- package/dist/particles/footer-copyright/footer-copyright.d.ts +32 -0
- package/dist/particles/footer-copyright/footer-copyright.js +50 -0
- package/dist/particles/footer-copyright/footer-copyright.js.map +1 -0
- package/dist/particles/footer-link-group/footer-link-group.d.ts +66 -0
- package/dist/particles/footer-link-group/footer-link-group.js +154 -0
- package/dist/particles/footer-link-group/footer-link-group.js.map +1 -0
- package/dist/particles/footer-root/footer-root.d.ts +21 -0
- package/dist/particles/footer-root/footer-root.js +38 -0
- package/dist/particles/footer-root/footer-root.js.map +1 -0
- package/dist/particles/footer-social/footer-social.d.ts +79 -0
- package/dist/particles/footer-social/footer-social.js +176 -0
- package/dist/particles/footer-social/footer-social.js.map +1 -0
- package/dist/particles/gallery/gallery.d.ts +181 -0
- package/dist/particles/gallery/gallery.js +920 -0
- package/dist/particles/gallery/gallery.js.map +1 -0
- package/dist/particles/header-root/header-root.d.ts +21 -0
- package/dist/particles/header-root/header-root.js +38 -0
- package/dist/particles/header-root/header-root.js.map +1 -0
- package/dist/particles/icon/icon.d.ts +22 -0
- package/dist/particles/icon/icon.js +48 -0
- package/dist/particles/icon/icon.js.map +1 -0
- package/dist/particles/image/image.d.ts +13 -0
- package/dist/particles/image/image.js +59 -0
- package/dist/particles/image/image.js.map +1 -0
- package/dist/particles/incentives/incentives.d.ts +85 -0
- package/dist/particles/incentives/incentives.js +200 -0
- package/dist/particles/incentives/incentives.js.map +1 -0
- package/dist/particles/input/input.d.ts +9 -0
- package/dist/particles/input/input.js +28 -0
- package/dist/particles/input/input.js.map +1 -0
- package/dist/particles/logo/logo.d.ts +55 -0
- package/dist/particles/logo/logo.js +96 -0
- package/dist/particles/logo/logo.js.map +1 -0
- package/dist/particles/menu/menu.d.ts +103 -0
- package/dist/particles/menu/menu.js +409 -0
- package/dist/particles/menu/menu.js.map +1 -0
- package/dist/particles/menubar/menubar.d.ts +18 -0
- package/dist/particles/menubar/menubar.js +42 -0
- package/dist/particles/menubar/menubar.js.map +1 -0
- package/dist/particles/meter/meter.d.ts +36 -0
- package/dist/particles/meter/meter.js +132 -0
- package/dist/particles/meter/meter.js.map +1 -0
- package/dist/particles/navigation-link/navigation-link.d.ts +43 -0
- package/dist/particles/navigation-link/navigation-link.js +82 -0
- package/dist/particles/navigation-link/navigation-link.js.map +1 -0
- package/dist/particles/navigation-link-list/navigation-link-list.d.ts +59 -0
- package/dist/particles/navigation-link-list/navigation-link-list.js +103 -0
- package/dist/particles/navigation-link-list/navigation-link-list.js.map +1 -0
- package/dist/particles/navigation-menu/navigation-menu.d.ts +78 -0
- package/dist/particles/navigation-menu/navigation-menu.js +295 -0
- package/dist/particles/navigation-menu/navigation-menu.js.map +1 -0
- package/dist/particles/number-field/number-field.d.ts +46 -0
- package/dist/particles/number-field/number-field.js +169 -0
- package/dist/particles/number-field/number-field.js.map +1 -0
- package/dist/particles/password-field/password-field.d.ts +31 -0
- package/dist/particles/password-field/password-field.js +109 -0
- package/dist/particles/password-field/password-field.js.map +1 -0
- package/dist/particles/payment-methods/payment-methods.d.ts +72 -0
- package/dist/particles/payment-methods/payment-methods.js +151 -0
- package/dist/particles/payment-methods/payment-methods.js.map +1 -0
- package/dist/particles/phone-field/phone-field.d.ts +67 -0
- package/dist/particles/phone-field/phone-field.js +250 -0
- package/dist/particles/phone-field/phone-field.js.map +1 -0
- package/dist/particles/popover/popover.d.ts +68 -0
- package/dist/particles/popover/popover.js +284 -0
- package/dist/particles/popover/popover.js.map +1 -0
- package/dist/particles/postal-code-field/postal-code-field.d.ts +75 -0
- package/dist/particles/postal-code-field/postal-code-field.js +169 -0
- package/dist/particles/postal-code-field/postal-code-field.js.map +1 -0
- package/dist/particles/promotion/promotion.d.ts +46 -0
- package/dist/particles/promotion/promotion.js +78 -0
- package/dist/particles/promotion/promotion.js.map +1 -0
- package/dist/particles/quantity-selector/quantity-selector.d.ts +30 -0
- package/dist/particles/quantity-selector/quantity-selector.js +116 -0
- package/dist/particles/quantity-selector/quantity-selector.js.map +1 -0
- package/dist/particles/radio/radio.d.ts +36 -0
- package/dist/particles/radio/radio.js +76 -0
- package/dist/particles/radio/radio.js.map +1 -0
- package/dist/particles/scroll-area/scroll-area.d.ts +36 -0
- package/dist/particles/scroll-area/scroll-area.js +145 -0
- package/dist/particles/scroll-area/scroll-area.js.map +1 -0
- package/dist/particles/select/select.d.ts +125 -0
- package/dist/particles/select/select.js +478 -0
- package/dist/particles/select/select.js.map +1 -0
- package/dist/particles/separator/separator.d.ts +12 -0
- package/dist/particles/separator/separator.js +33 -0
- package/dist/particles/separator/separator.js.map +1 -0
- package/dist/particles/shared/input-mask.d.ts +5 -0
- package/dist/particles/shared/input-mask.js +58 -0
- package/dist/particles/shared/input-mask.js.map +1 -0
- package/dist/particles/spinner/spinner.d.ts +13 -0
- package/dist/particles/spinner/spinner.js +31 -0
- package/dist/particles/spinner/spinner.js.map +1 -0
- package/dist/particles/switch/switch.d.ts +27 -0
- package/dist/particles/switch/switch.js +59 -0
- package/dist/particles/switch/switch.js.map +1 -0
- package/dist/particles/tabs/tabs.d.ts +45 -0
- package/dist/particles/tabs/tabs.js +164 -0
- package/dist/particles/tabs/tabs.js.map +1 -0
- package/dist/particles/text/text.d.ts +24 -0
- package/dist/particles/text/text.js +40 -0
- package/dist/particles/text/text.js.map +1 -0
- package/dist/particles/toast/toast.d.ts +83 -0
- package/dist/particles/toast/toast.js +194 -0
- package/dist/particles/toast/toast.js.map +1 -0
- package/dist/particles/toggle/toggle.d.ts +26 -0
- package/dist/particles/toggle/toggle.js +61 -0
- package/dist/particles/toggle/toggle.js.map +1 -0
- package/dist/particles/tooltip/tooltip.d.ts +61 -0
- package/dist/particles/tooltip/tooltip.js +240 -0
- package/dist/particles/tooltip/tooltip.js.map +1 -0
- package/dist/schema.graphql +2953 -0
- package/dist/sdk/actions/cart-action-provider.d.ts +19 -0
- package/dist/sdk/actions/cart-action-provider.js +23 -0
- package/dist/sdk/actions/cart-action-provider.js.map +1 -0
- package/dist/sdk/actions/identity-action-provider.d.ts +15 -0
- package/dist/sdk/actions/identity-action-provider.js +19 -0
- package/dist/sdk/actions/identity-action-provider.js.map +1 -0
- package/dist/sdk/actions/index.d.ts +7 -0
- package/dist/sdk/actions/index.js +6 -0
- package/dist/sdk/actions/inject-actions.d.ts +14 -0
- package/dist/sdk/actions/inject-actions.js +36 -0
- package/dist/sdk/actions/inject-actions.js.map +1 -0
- package/dist/sdk/actions/region-action-provider.d.ts +15 -0
- package/dist/sdk/actions/region-action-provider.js +19 -0
- package/dist/sdk/actions/region-action-provider.js.map +1 -0
- package/dist/sdk/actions/session-action-provider.d.ts +15 -0
- package/dist/sdk/actions/session-action-provider.js +19 -0
- package/dist/sdk/actions/session-action-provider.js.map +1 -0
- package/dist/sdk/actions/shipping-action-provider.d.ts +15 -0
- package/dist/sdk/actions/shipping-action-provider.js +19 -0
- package/dist/sdk/actions/shipping-action-provider.js.map +1 -0
- package/dist/sdk/actions/types.d.ts +21 -0
- package/dist/sdk/cache/storefront-cache.js +35 -0
- package/dist/sdk/cache/storefront-cache.js.map +1 -0
- package/dist/sdk/cart/operations.d.ts +31 -0
- package/dist/sdk/cart/operations.js +215 -0
- package/dist/sdk/cart/operations.js.map +1 -0
- package/dist/sdk/cart/optimistic.d.ts +24 -0
- package/dist/sdk/cart/optimistic.js +164 -0
- package/dist/sdk/cart/optimistic.js.map +1 -0
- package/dist/sdk/cart/use-cart-actions.d.ts +56 -0
- package/dist/sdk/cart/use-cart-actions.js +348 -0
- package/dist/sdk/cart/use-cart-actions.js.map +1 -0
- package/dist/sdk/cart/use-cart-validate-on-open.js +50 -0
- package/dist/sdk/cart/use-cart-validate-on-open.js.map +1 -0
- package/dist/sdk/cart/write-gate.js +54 -0
- package/dist/sdk/cart/write-gate.js.map +1 -0
- package/dist/sdk/client/assert-api-url.js +20 -0
- package/dist/sdk/client/assert-api-url.js.map +1 -0
- package/dist/sdk/client/create-client.d.ts +23 -0
- package/dist/sdk/client/create-client.js +46 -0
- package/dist/sdk/client/create-client.js.map +1 -0
- package/dist/sdk/client/fetch-page-data.d.ts +39 -0
- package/dist/sdk/client/fetch-page-data.js +33 -0
- package/dist/sdk/client/fetch-page-data.js.map +1 -0
- package/dist/sdk/client/register-preload-query.d.ts +24 -0
- package/dist/sdk/client/register-preload-query.js +33 -0
- package/dist/sdk/client/register-preload-query.js.map +1 -0
- package/dist/sdk/content/create-content-runtime.d.ts +68 -0
- package/dist/sdk/content/create-content-runtime.js +503 -0
- package/dist/sdk/content/create-content-runtime.js.map +1 -0
- package/dist/sdk/context/headers.d.ts +15 -0
- package/dist/sdk/context/headers.js +21 -0
- package/dist/sdk/context/headers.js.map +1 -0
- package/dist/sdk/context/storefront-context.d.ts +11 -0
- package/dist/sdk/context/storefront-context.js +29 -0
- package/dist/sdk/context/storefront-context.js.map +1 -0
- package/dist/sdk/data/data-override-context.d.ts +12 -0
- package/dist/sdk/data/data-override-context.js +19 -0
- package/dist/sdk/data/data-override-context.js.map +1 -0
- package/dist/sdk/data/entity-subscriber.js +28 -0
- package/dist/sdk/data/entity-subscriber.js.map +1 -0
- package/dist/sdk/data/hot-data-provider.d.ts +19 -0
- package/dist/sdk/data/hot-data-provider.js +33 -0
- package/dist/sdk/data/hot-data-provider.js.map +1 -0
- package/dist/sdk/data/index.d.ts +8 -0
- package/dist/sdk/data/index.js +8 -0
- package/dist/sdk/data/list-item-ref-context.d.ts +20 -0
- package/dist/sdk/data/list-item-ref-context.js +11 -0
- package/dist/sdk/data/list-item-ref-context.js.map +1 -0
- package/dist/sdk/data/multiple-reactive-data-provider.d.ts +32 -0
- package/dist/sdk/data/multiple-reactive-data-provider.js +20 -0
- package/dist/sdk/data/multiple-reactive-data-provider.js.map +1 -0
- package/dist/sdk/data/page-reactive-data-root.d.ts +53 -0
- package/dist/sdk/data/page-reactive-data-root.js +153 -0
- package/dist/sdk/data/page-reactive-data-root.js.map +1 -0
- package/dist/sdk/data/reactive-data-provider.d.ts +25 -0
- package/dist/sdk/data/reactive-data-provider.js +24 -0
- package/dist/sdk/data/reactive-data-provider.js.map +1 -0
- package/dist/sdk/data/reactive-list-item-data-provider.d.ts +26 -0
- package/dist/sdk/data/reactive-list-item-data-provider.js +42 -0
- package/dist/sdk/data/reactive-list-item-data-provider.js.map +1 -0
- package/dist/sdk/data/use-reactive-entity.js +40 -0
- package/dist/sdk/data/use-reactive-entity.js.map +1 -0
- package/dist/sdk/format/client.d.ts +12 -0
- package/dist/sdk/format/client.js +20 -0
- package/dist/sdk/format/client.js.map +1 -0
- package/dist/sdk/format/formatters.d.ts +32 -0
- package/dist/sdk/format/formatters.js +45 -0
- package/dist/sdk/format/formatters.js.map +1 -0
- package/dist/sdk/generated/fragment-types.js +23 -0
- package/dist/sdk/generated/fragment-types.js.map +1 -0
- package/dist/sdk/generated/gql.js +51 -0
- package/dist/sdk/generated/gql.js.map +1 -0
- package/dist/sdk/generated/graphql.d.ts +622 -0
- package/dist/sdk/generated/graphql.js +11917 -0
- package/dist/sdk/generated/graphql.js.map +1 -0
- package/dist/sdk/graphql-tag.d.ts +10 -0
- package/dist/sdk/graphql-tag.js +21 -0
- package/dist/sdk/graphql-tag.js.map +1 -0
- package/dist/sdk/i18n/client.d.ts +4 -0
- package/dist/sdk/i18n/client.js +4 -0
- package/dist/sdk/i18n/locales.d.ts +8 -0
- package/dist/sdk/i18n/locales.js +57 -0
- package/dist/sdk/i18n/locales.js.map +1 -0
- package/dist/sdk/i18n/messages/en-US.js +24 -0
- package/dist/sdk/i18n/messages/en-US.js.map +1 -0
- package/dist/sdk/i18n/messages/en-US.json +19 -0
- package/dist/sdk/i18n/messages/en-US.json.d.ts +23 -0
- package/dist/sdk/i18n/messages/es-ES.js +24 -0
- package/dist/sdk/i18n/messages/es-ES.js.map +1 -0
- package/dist/sdk/i18n/messages/es-ES.json +19 -0
- package/dist/sdk/i18n/messages/pt-BR.js +24 -0
- package/dist/sdk/i18n/messages/pt-BR.js.map +1 -0
- package/dist/sdk/i18n/messages/pt-BR.json +19 -0
- package/dist/sdk/i18n/provider.d.ts +1 -0
- package/dist/sdk/i18n/provider.js +30 -0
- package/dist/sdk/i18n/provider.js.map +1 -0
- package/dist/sdk/i18n/server.d.ts +28 -0
- package/dist/sdk/i18n/server.js +59 -0
- package/dist/sdk/i18n/server.js.map +1 -0
- package/dist/sdk/identity/operations.d.ts +34 -0
- package/dist/sdk/identity/operations.js +78 -0
- package/dist/sdk/identity/operations.js.map +1 -0
- package/dist/sdk/identity/use-identity-actions.d.ts +62 -0
- package/dist/sdk/identity/use-identity-actions.js +180 -0
- package/dist/sdk/identity/use-identity-actions.js.map +1 -0
- package/dist/sdk/provider/index.d.ts +2 -0
- package/dist/sdk/provider/index.js +2 -0
- package/dist/sdk/provider/storefront-provider.d.ts +32 -0
- package/dist/sdk/provider/storefront-provider.js +111 -0
- package/dist/sdk/provider/storefront-provider.js.map +1 -0
- package/dist/sdk/region/operations.d.ts +6 -0
- package/dist/sdk/region/region-operations.d.ts +30 -0
- package/dist/sdk/region/region-operations.js +23 -0
- package/dist/sdk/region/region-operations.js.map +1 -0
- package/dist/sdk/region/use-region-actions.d.ts +23 -0
- package/dist/sdk/region/use-region-actions.js +66 -0
- package/dist/sdk/region/use-region-actions.js.map +1 -0
- package/dist/sdk/seller.js +11 -0
- package/dist/sdk/seller.js.map +1 -0
- package/dist/sdk/session/auth-operations.d.ts +47 -0
- package/dist/sdk/session/auth-operations.js +79 -0
- package/dist/sdk/session/auth-operations.js.map +1 -0
- package/dist/sdk/session/operations.d.ts +6 -0
- package/dist/sdk/session/use-session-actions.d.ts +27 -0
- package/dist/sdk/session/use-session-actions.js +126 -0
- package/dist/sdk/session/use-session-actions.js.map +1 -0
- package/dist/sdk/shipping/cart-operations.d.ts +3 -0
- package/dist/sdk/shipping/cart-operations.js +33 -0
- package/dist/sdk/shipping/cart-operations.js.map +1 -0
- package/dist/sdk/shipping/operations.d.ts +3 -0
- package/dist/sdk/shipping/operations.js +33 -0
- package/dist/sdk/shipping/operations.js.map +1 -0
- package/dist/sdk/shipping/option-select-operations.d.ts +24 -0
- package/dist/sdk/shipping/option-select-operations.js +45 -0
- package/dist/sdk/shipping/option-select-operations.js.map +1 -0
- package/dist/sdk/shipping/request-timeout.js +41 -0
- package/dist/sdk/shipping/request-timeout.js.map +1 -0
- package/dist/sdk/shipping/shipping-operations.d.ts +38 -0
- package/dist/sdk/shipping/shipping-operations.js +77 -0
- package/dist/sdk/shipping/shipping-operations.js.map +1 -0
- package/dist/sdk/shipping/use-cart-shipping-simulation.d.ts +7 -0
- package/dist/sdk/shipping/use-cart-shipping-simulation.js +72 -0
- package/dist/sdk/shipping/use-cart-shipping-simulation.js.map +1 -0
- package/dist/sdk/shipping/use-shipping-actions.d.ts +27 -0
- package/dist/sdk/shipping/use-shipping-actions.js +113 -0
- package/dist/sdk/shipping/use-shipping-actions.js.map +1 -0
- package/dist/sdk/shipping/use-shipping-simulation.d.ts +7 -0
- package/dist/sdk/shipping/use-shipping-simulation.js +72 -0
- package/dist/sdk/shipping/use-shipping-simulation.js.map +1 -0
- package/dist/sdk/state/cart.d.ts +42 -0
- package/dist/sdk/state/cart.js +64 -0
- package/dist/sdk/state/cart.js.map +1 -0
- package/dist/sdk/state/index.js +3 -0
- package/dist/sdk/state/variant-selector.d.ts +17 -0
- package/dist/sdk/state/variant-selector.js +14 -0
- package/dist/sdk/state/variant-selector.js.map +1 -0
- package/dist/utils/safe-href.js +63 -0
- package/dist/utils/safe-href.js.map +1 -0
- package/package.json +84 -0
- package/src/styles/tailwind.css +32 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { CartEntity, CartItemEntity, CartItemQuantityDecreasePayload, CartItemQuantityIncreasePayload, CartItemRemovePayload } from "./operations.js";
|
|
2
|
+
//#region src/sdk/cart/optimistic.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Predicts the cart after `cartItemQuantityIncrease(input: { variantId, quantityToAdd })`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildOptimisticIncrease(cart: CartEntity, item: CartItemEntity, by?: number): {
|
|
7
|
+
cartItemQuantityIncrease: CartItemQuantityIncreasePayload;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Predicts the cart after `cartItemQuantityDecrease(input: { variantId, quantityToRemove })`.
|
|
11
|
+
*
|
|
12
|
+
* If the resulting quantity would be `<= 0`, the line is removed entirely.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildOptimisticDecrease(cart: CartEntity, item: CartItemEntity, by?: number): {
|
|
15
|
+
cartItemQuantityDecrease: CartItemQuantityDecreasePayload;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Predicts the cart after `cartItemRemove(input: { variantId })`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildOptimisticRemove(cart: CartEntity, item: CartItemEntity): {
|
|
21
|
+
cartItemRemove: CartItemRemovePayload;
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
//# sourceMappingURL=optimistic.d.ts.map
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
//#region src/sdk/cart/optimistic.ts
|
|
2
|
+
/**
|
|
3
|
+
* Pure optimistic-response builders for the three cache-propagating cart mutations
|
|
4
|
+
* (specs/mutation-contract.md AD-3 / AD-D6).
|
|
5
|
+
*
|
|
6
|
+
* Each builder takes the current `CartEntity` and the affected `CartItemEntity` and returns the
|
|
7
|
+
* predicted post-mutation `Cart` carrying every field the canonical `CartFragment` selects:
|
|
8
|
+
* `id`, `items`, `totalizers`, `total`. The shape MUST match Apollo's normalised cache slot for
|
|
9
|
+
* the entity, so `__typename` and the same `id` are preserved.
|
|
10
|
+
*
|
|
11
|
+
* Lines are matched by their opaque `id` (Base64("CartItem:<orderFormId>:<uniqueId>")).
|
|
12
|
+
*
|
|
13
|
+
* Recomputation rules (kept simple — server reconciles drift on response):
|
|
14
|
+
* - `Items` totalizer (matched by `id === 'Items'`) is adjusted by `item.sellingPrice * delta`.
|
|
15
|
+
* - `total` (the cart's grand total) is adjusted by the same delta.
|
|
16
|
+
* - All other totalizers (Shipping, Discounts, …) stay as-is until the server response lands.
|
|
17
|
+
*/
|
|
18
|
+
function moneyAdd(money, delta) {
|
|
19
|
+
return {
|
|
20
|
+
__typename: "Money",
|
|
21
|
+
amount: Number(money.amount) + delta,
|
|
22
|
+
currencyCode: money.currencyCode
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function adjustItemsTotalizer(totalizers, delta) {
|
|
26
|
+
return totalizers.map((t) => t.id === "Items" ? {
|
|
27
|
+
...t,
|
|
28
|
+
value: moneyAdd(t.value, delta)
|
|
29
|
+
} : t);
|
|
30
|
+
}
|
|
31
|
+
function emptyUserErrors() {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Predicts the cart after `cartItemQuantityIncrease(input: { variantId, quantityToAdd })`.
|
|
36
|
+
*/
|
|
37
|
+
function buildOptimisticIncrease(cart, item, by = 1) {
|
|
38
|
+
if (by <= 0) return { cartItemQuantityIncrease: {
|
|
39
|
+
__typename: "CartItemQuantityIncreasePayload",
|
|
40
|
+
cart,
|
|
41
|
+
userErrors: emptyUserErrors()
|
|
42
|
+
} };
|
|
43
|
+
const currentItem = cart.items.find((i) => i.id === item.id);
|
|
44
|
+
if (!currentItem) return { cartItemQuantityIncrease: {
|
|
45
|
+
__typename: "CartItemQuantityIncreasePayload",
|
|
46
|
+
cart,
|
|
47
|
+
userErrors: emptyUserErrors()
|
|
48
|
+
} };
|
|
49
|
+
const newQuantity = currentItem.quantity + by;
|
|
50
|
+
const delta = currentItem.sellingPrice.amount * by;
|
|
51
|
+
const updatedItems = cart.items.map((i) => i.id === item.id ? {
|
|
52
|
+
...i,
|
|
53
|
+
quantity: newQuantity
|
|
54
|
+
} : i);
|
|
55
|
+
return { cartItemQuantityIncrease: {
|
|
56
|
+
__typename: "CartItemQuantityIncreasePayload",
|
|
57
|
+
cart: {
|
|
58
|
+
__typename: "Cart",
|
|
59
|
+
id: cart.id,
|
|
60
|
+
items: updatedItems,
|
|
61
|
+
totalizers: adjustItemsTotalizer(cart.totalizers, delta),
|
|
62
|
+
total: moneyAdd(cart.total, delta),
|
|
63
|
+
messages: cart.messages,
|
|
64
|
+
appliedCoupons: cart.appliedCoupons
|
|
65
|
+
},
|
|
66
|
+
userErrors: emptyUserErrors()
|
|
67
|
+
} };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Predicts the cart after `cartItemQuantityDecrease(input: { variantId, quantityToRemove })`.
|
|
71
|
+
*
|
|
72
|
+
* If the resulting quantity would be `<= 0`, the line is removed entirely.
|
|
73
|
+
*/
|
|
74
|
+
function buildOptimisticDecrease(cart, item, by = 1) {
|
|
75
|
+
if (by <= 0) return { cartItemQuantityDecrease: {
|
|
76
|
+
__typename: "CartItemQuantityDecreasePayload",
|
|
77
|
+
cart,
|
|
78
|
+
userErrors: emptyUserErrors()
|
|
79
|
+
} };
|
|
80
|
+
const currentItem = cart.items.find((i) => i.id === item.id);
|
|
81
|
+
if (!currentItem) return { cartItemQuantityDecrease: {
|
|
82
|
+
__typename: "CartItemQuantityDecreasePayload",
|
|
83
|
+
cart,
|
|
84
|
+
userErrors: emptyUserErrors()
|
|
85
|
+
} };
|
|
86
|
+
const requestedQuantity = currentItem.quantity - by;
|
|
87
|
+
const removed = requestedQuantity <= 0;
|
|
88
|
+
const actualDelta = removed ? currentItem.quantity : by;
|
|
89
|
+
const priceDelta = -currentItem.sellingPrice.amount * actualDelta;
|
|
90
|
+
const updatedItems = removed ? cart.items.filter((i) => i.id !== item.id) : cart.items.map((i) => i.id === item.id ? {
|
|
91
|
+
...i,
|
|
92
|
+
quantity: requestedQuantity
|
|
93
|
+
} : i);
|
|
94
|
+
return { cartItemQuantityDecrease: {
|
|
95
|
+
__typename: "CartItemQuantityDecreasePayload",
|
|
96
|
+
cart: {
|
|
97
|
+
__typename: "Cart",
|
|
98
|
+
id: cart.id,
|
|
99
|
+
items: updatedItems,
|
|
100
|
+
totalizers: adjustItemsTotalizer(cart.totalizers, priceDelta),
|
|
101
|
+
total: moneyAdd(cart.total, priceDelta),
|
|
102
|
+
messages: cart.messages,
|
|
103
|
+
appliedCoupons: cart.appliedCoupons
|
|
104
|
+
},
|
|
105
|
+
userErrors: emptyUserErrors()
|
|
106
|
+
} };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Predicts the cart after `cartItemRemove(input: { variantId })`.
|
|
110
|
+
*/
|
|
111
|
+
function buildOptimisticRemove(cart, item) {
|
|
112
|
+
const currentItem = cart.items.find((i) => i.id === item.id);
|
|
113
|
+
if (!currentItem) return { cartItemRemove: {
|
|
114
|
+
__typename: "CartItemRemovePayload",
|
|
115
|
+
cart,
|
|
116
|
+
userErrors: emptyUserErrors()
|
|
117
|
+
} };
|
|
118
|
+
const priceDelta = -currentItem.sellingPrice.amount * currentItem.quantity;
|
|
119
|
+
return { cartItemRemove: {
|
|
120
|
+
__typename: "CartItemRemovePayload",
|
|
121
|
+
cart: {
|
|
122
|
+
__typename: "Cart",
|
|
123
|
+
id: cart.id,
|
|
124
|
+
items: cart.items.filter((i) => i.id !== item.id),
|
|
125
|
+
totalizers: adjustItemsTotalizer(cart.totalizers, priceDelta),
|
|
126
|
+
total: moneyAdd(cart.total, priceDelta),
|
|
127
|
+
messages: cart.messages,
|
|
128
|
+
appliedCoupons: cart.appliedCoupons
|
|
129
|
+
},
|
|
130
|
+
userErrors: emptyUserErrors()
|
|
131
|
+
} };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Predicts the cart after `cartItemsRemove(input: { variantIds })` — the N-line generalisation of
|
|
135
|
+
* `buildOptimisticRemove`. Lines absent from the cart are ignored; the summed price delta of the
|
|
136
|
+
* matched lines adjusts the `Items` totalizer and the grand total.
|
|
137
|
+
*/
|
|
138
|
+
function buildOptimisticRemoveItems(cart, items) {
|
|
139
|
+
const removedIds = new Set(items.map((item) => item.id));
|
|
140
|
+
const removedLines = cart.items.filter((i) => removedIds.has(i.id));
|
|
141
|
+
if (removedLines.length === 0) return { cartItemsRemove: {
|
|
142
|
+
__typename: "CartItemsRemovePayload",
|
|
143
|
+
cart,
|
|
144
|
+
userErrors: emptyUserErrors()
|
|
145
|
+
} };
|
|
146
|
+
const priceDelta = removedLines.reduce((sum, line) => sum - line.sellingPrice.amount * line.quantity, 0);
|
|
147
|
+
return { cartItemsRemove: {
|
|
148
|
+
__typename: "CartItemsRemovePayload",
|
|
149
|
+
cart: {
|
|
150
|
+
__typename: "Cart",
|
|
151
|
+
id: cart.id,
|
|
152
|
+
items: cart.items.filter((i) => !removedIds.has(i.id)),
|
|
153
|
+
totalizers: adjustItemsTotalizer(cart.totalizers, priceDelta),
|
|
154
|
+
total: moneyAdd(cart.total, priceDelta),
|
|
155
|
+
messages: cart.messages,
|
|
156
|
+
appliedCoupons: cart.appliedCoupons
|
|
157
|
+
},
|
|
158
|
+
userErrors: emptyUserErrors()
|
|
159
|
+
} };
|
|
160
|
+
}
|
|
161
|
+
//#endregion
|
|
162
|
+
export { buildOptimisticDecrease, buildOptimisticIncrease, buildOptimisticRemove, buildOptimisticRemoveItems };
|
|
163
|
+
|
|
164
|
+
//# sourceMappingURL=optimistic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimistic.js","names":[],"sources":["../../../src/sdk/cart/optimistic.ts"],"sourcesContent":["import type {\n CartEntity,\n CartItemEntity,\n CartItemQuantityDecreasePayload,\n CartItemQuantityIncreasePayload,\n CartItemRemovePayload,\n CartItemsRemovePayload,\n CartTotalizer,\n Money,\n} from './operations.js';\n\n/**\n * Pure optimistic-response builders for the three cache-propagating cart mutations\n * (specs/mutation-contract.md AD-3 / AD-D6).\n *\n * Each builder takes the current `CartEntity` and the affected `CartItemEntity` and returns the\n * predicted post-mutation `Cart` carrying every field the canonical `CartFragment` selects:\n * `id`, `items`, `totalizers`, `total`. The shape MUST match Apollo's normalised cache slot for\n * the entity, so `__typename` and the same `id` are preserved.\n *\n * Lines are matched by their opaque `id` (Base64(\"CartItem:<orderFormId>:<uniqueId>\")).\n *\n * Recomputation rules (kept simple — server reconciles drift on response):\n * - `Items` totalizer (matched by `id === 'Items'`) is adjusted by `item.sellingPrice * delta`.\n * - `total` (the cart's grand total) is adjusted by the same delta.\n * - All other totalizers (Shipping, Discounts, …) stay as-is until the server response lands.\n */\n\nfunction moneyAdd(money: Money, delta: number): Money {\n // `Money.amount` is typed as `number` by codegen but arrives over the wire as a decimal *string*\n // (the server's `Decimal` scalar = `(cents / 100).toFixed(2)`). Without coercing, `string + number`\n // concatenates (e.g. \"49.99\" + 49.99 → \"49.9949.99\"), which formats to NaN during the optimistic\n // window until the server response replaces it. Number() restores numeric addition.\n return { __typename: 'Money', amount: Number(money.amount) + delta, currencyCode: money.currencyCode };\n}\n\nfunction adjustItemsTotalizer(totalizers: readonly CartTotalizer[], delta: number): CartTotalizer[] {\n return totalizers.map((t) => (t.id === 'Items' ? { ...t, value: moneyAdd(t.value, delta) } : t));\n}\n\nfunction emptyUserErrors<T>(): T[] {\n return [];\n}\n\n/**\n * Predicts the cart after `cartItemQuantityIncrease(input: { variantId, quantityToAdd })`.\n */\nexport function buildOptimisticIncrease(\n cart: CartEntity,\n item: CartItemEntity,\n by = 1,\n): { cartItemQuantityIncrease: CartItemQuantityIncreasePayload } {\n if (by <= 0) {\n return {\n cartItemQuantityIncrease: {\n __typename: 'CartItemQuantityIncreasePayload',\n cart,\n userErrors: emptyUserErrors(),\n },\n };\n }\n\n const currentItem = cart.items.find((i) => i.id === item.id);\n if (!currentItem) {\n return {\n cartItemQuantityIncrease: {\n __typename: 'CartItemQuantityIncreasePayload',\n cart,\n userErrors: emptyUserErrors(),\n },\n };\n }\n\n const newQuantity = currentItem.quantity + by;\n const delta = currentItem.sellingPrice.amount * by;\n\n const updatedItems = cart.items.map((i) => (i.id === item.id ? { ...i, quantity: newQuantity } : i));\n\n return {\n cartItemQuantityIncrease: {\n __typename: 'CartItemQuantityIncreasePayload',\n cart: {\n __typename: 'Cart',\n id: cart.id,\n items: updatedItems,\n totalizers: adjustItemsTotalizer(cart.totalizers, delta),\n total: moneyAdd(cart.total, delta),\n messages: cart.messages,\n appliedCoupons: cart.appliedCoupons,\n },\n userErrors: emptyUserErrors(),\n },\n };\n}\n\n/**\n * Predicts the cart after `cartItemQuantityDecrease(input: { variantId, quantityToRemove })`.\n *\n * If the resulting quantity would be `<= 0`, the line is removed entirely.\n */\nexport function buildOptimisticDecrease(\n cart: CartEntity,\n item: CartItemEntity,\n by = 1,\n): { cartItemQuantityDecrease: CartItemQuantityDecreasePayload } {\n if (by <= 0) {\n return {\n cartItemQuantityDecrease: {\n __typename: 'CartItemQuantityDecreasePayload',\n cart,\n userErrors: emptyUserErrors(),\n },\n };\n }\n\n const currentItem = cart.items.find((i) => i.id === item.id);\n if (!currentItem) {\n return {\n cartItemQuantityDecrease: {\n __typename: 'CartItemQuantityDecreasePayload',\n cart,\n userErrors: emptyUserErrors(),\n },\n };\n }\n\n const requestedQuantity = currentItem.quantity - by;\n const removed = requestedQuantity <= 0;\n const actualDelta = removed ? currentItem.quantity : by;\n const priceDelta = -currentItem.sellingPrice.amount * actualDelta;\n\n const updatedItems = removed\n ? cart.items.filter((i) => i.id !== item.id)\n : cart.items.map((i) => (i.id === item.id ? { ...i, quantity: requestedQuantity } : i));\n\n return {\n cartItemQuantityDecrease: {\n __typename: 'CartItemQuantityDecreasePayload',\n cart: {\n __typename: 'Cart',\n id: cart.id,\n items: updatedItems,\n totalizers: adjustItemsTotalizer(cart.totalizers, priceDelta),\n total: moneyAdd(cart.total, priceDelta),\n messages: cart.messages,\n appliedCoupons: cart.appliedCoupons,\n },\n userErrors: emptyUserErrors(),\n },\n };\n}\n\n/**\n * Predicts the cart after `cartItemRemove(input: { variantId })`.\n */\nexport function buildOptimisticRemove(\n cart: CartEntity,\n item: CartItemEntity,\n): { cartItemRemove: CartItemRemovePayload } {\n const currentItem = cart.items.find((i) => i.id === item.id);\n if (!currentItem) {\n return {\n cartItemRemove: {\n __typename: 'CartItemRemovePayload',\n cart,\n userErrors: emptyUserErrors(),\n },\n };\n }\n\n const priceDelta = -currentItem.sellingPrice.amount * currentItem.quantity;\n\n return {\n cartItemRemove: {\n __typename: 'CartItemRemovePayload',\n cart: {\n __typename: 'Cart',\n id: cart.id,\n items: cart.items.filter((i) => i.id !== item.id),\n totalizers: adjustItemsTotalizer(cart.totalizers, priceDelta),\n total: moneyAdd(cart.total, priceDelta),\n messages: cart.messages,\n appliedCoupons: cart.appliedCoupons,\n },\n userErrors: emptyUserErrors(),\n },\n };\n}\n\n/**\n * Predicts the cart after `cartItemsRemove(input: { variantIds })` — the N-line generalisation of\n * `buildOptimisticRemove`. Lines absent from the cart are ignored; the summed price delta of the\n * matched lines adjusts the `Items` totalizer and the grand total.\n */\nexport function buildOptimisticRemoveItems(\n cart: CartEntity,\n items: readonly CartItemEntity[],\n): { cartItemsRemove: CartItemsRemovePayload } {\n const removedIds = new Set(items.map((item) => item.id));\n const removedLines = cart.items.filter((i) => removedIds.has(i.id));\n if (removedLines.length === 0) {\n return {\n cartItemsRemove: {\n __typename: 'CartItemsRemovePayload',\n cart,\n userErrors: emptyUserErrors(),\n },\n };\n }\n\n const priceDelta = removedLines.reduce((sum, line) => sum - line.sellingPrice.amount * line.quantity, 0);\n\n return {\n cartItemsRemove: {\n __typename: 'CartItemsRemovePayload',\n cart: {\n __typename: 'Cart',\n id: cart.id,\n items: cart.items.filter((i) => !removedIds.has(i.id)),\n totalizers: adjustItemsTotalizer(cart.totalizers, priceDelta),\n total: moneyAdd(cart.total, priceDelta),\n messages: cart.messages,\n appliedCoupons: cart.appliedCoupons,\n },\n userErrors: emptyUserErrors(),\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA4BA,SAAS,SAAS,OAAc,OAAsB;CAKpD,OAAO;EAAE,YAAY;EAAS,QAAQ,OAAO,MAAM,MAAM,IAAI;EAAO,cAAc,MAAM;CAAa;AACvG;AAEA,SAAS,qBAAqB,YAAsC,OAAgC;CAClG,OAAO,WAAW,KAAK,MAAO,EAAE,OAAO,UAAU;EAAE,GAAG;EAAG,OAAO,SAAS,EAAE,OAAO,KAAK;CAAE,IAAI,CAAE;AACjG;AAEA,SAAS,kBAA0B;CACjC,OAAO,CAAC;AACV;;;;AAKA,SAAgB,wBACd,MACA,MACA,KAAK,GAC0D;CAC/D,IAAI,MAAM,GACR,OAAO,EACL,0BAA0B;EACxB,YAAY;EACZ;EACA,YAAY,gBAAgB;CAC9B,EACF;CAGF,MAAM,cAAc,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,KAAK,EAAE;CAC3D,IAAI,CAAC,aACH,OAAO,EACL,0BAA0B;EACxB,YAAY;EACZ;EACA,YAAY,gBAAgB;CAC9B,EACF;CAGF,MAAM,cAAc,YAAY,WAAW;CAC3C,MAAM,QAAQ,YAAY,aAAa,SAAS;CAEhD,MAAM,eAAe,KAAK,MAAM,KAAK,MAAO,EAAE,OAAO,KAAK,KAAK;EAAE,GAAG;EAAG,UAAU;CAAY,IAAI,CAAE;CAEnG,OAAO,EACL,0BAA0B;EACxB,YAAY;EACZ,MAAM;GACJ,YAAY;GACZ,IAAI,KAAK;GACT,OAAO;GACP,YAAY,qBAAqB,KAAK,YAAY,KAAK;GACvD,OAAO,SAAS,KAAK,OAAO,KAAK;GACjC,UAAU,KAAK;GACf,gBAAgB,KAAK;EACvB;EACA,YAAY,gBAAgB;CAC9B,EACF;AACF;;;;;;AAOA,SAAgB,wBACd,MACA,MACA,KAAK,GAC0D;CAC/D,IAAI,MAAM,GACR,OAAO,EACL,0BAA0B;EACxB,YAAY;EACZ;EACA,YAAY,gBAAgB;CAC9B,EACF;CAGF,MAAM,cAAc,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,KAAK,EAAE;CAC3D,IAAI,CAAC,aACH,OAAO,EACL,0BAA0B;EACxB,YAAY;EACZ;EACA,YAAY,gBAAgB;CAC9B,EACF;CAGF,MAAM,oBAAoB,YAAY,WAAW;CACjD,MAAM,UAAU,qBAAqB;CACrC,MAAM,cAAc,UAAU,YAAY,WAAW;CACrD,MAAM,aAAa,CAAC,YAAY,aAAa,SAAS;CAEtD,MAAM,eAAe,UACjB,KAAK,MAAM,QAAQ,MAAM,EAAE,OAAO,KAAK,EAAE,IACzC,KAAK,MAAM,KAAK,MAAO,EAAE,OAAO,KAAK,KAAK;EAAE,GAAG;EAAG,UAAU;CAAkB,IAAI,CAAE;CAExF,OAAO,EACL,0BAA0B;EACxB,YAAY;EACZ,MAAM;GACJ,YAAY;GACZ,IAAI,KAAK;GACT,OAAO;GACP,YAAY,qBAAqB,KAAK,YAAY,UAAU;GAC5D,OAAO,SAAS,KAAK,OAAO,UAAU;GACtC,UAAU,KAAK;GACf,gBAAgB,KAAK;EACvB;EACA,YAAY,gBAAgB;CAC9B,EACF;AACF;;;;AAKA,SAAgB,sBACd,MACA,MAC2C;CAC3C,MAAM,cAAc,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,KAAK,EAAE;CAC3D,IAAI,CAAC,aACH,OAAO,EACL,gBAAgB;EACd,YAAY;EACZ;EACA,YAAY,gBAAgB;CAC9B,EACF;CAGF,MAAM,aAAa,CAAC,YAAY,aAAa,SAAS,YAAY;CAElE,OAAO,EACL,gBAAgB;EACd,YAAY;EACZ,MAAM;GACJ,YAAY;GACZ,IAAI,KAAK;GACT,OAAO,KAAK,MAAM,QAAQ,MAAM,EAAE,OAAO,KAAK,EAAE;GAChD,YAAY,qBAAqB,KAAK,YAAY,UAAU;GAC5D,OAAO,SAAS,KAAK,OAAO,UAAU;GACtC,UAAU,KAAK;GACf,gBAAgB,KAAK;EACvB;EACA,YAAY,gBAAgB;CAC9B,EACF;AACF;;;;;;AAOA,SAAgB,2BACd,MACA,OAC6C;CAC7C,MAAM,aAAa,IAAI,IAAI,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC;CACvD,MAAM,eAAe,KAAK,MAAM,QAAQ,MAAM,WAAW,IAAI,EAAE,EAAE,CAAC;CAClE,IAAI,aAAa,WAAW,GAC1B,OAAO,EACL,iBAAiB;EACf,YAAY;EACZ;EACA,YAAY,gBAAgB;CAC9B,EACF;CAGF,MAAM,aAAa,aAAa,QAAQ,KAAK,SAAS,MAAM,KAAK,aAAa,SAAS,KAAK,UAAU,CAAC;CAEvG,OAAO,EACL,iBAAiB;EACf,YAAY;EACZ,MAAM;GACJ,YAAY;GACZ,IAAI,KAAK;GACT,OAAO,KAAK,MAAM,QAAQ,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;GACrD,YAAY,qBAAqB,KAAK,YAAY,UAAU;GAC5D,OAAO,SAAS,KAAK,OAAO,UAAU;GACtC,UAAU,KAAK;GACf,gBAAgB,KAAK;EACvB;EACA,YAAY,gBAAgB;CAC9B,EACF;AACF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import "../../core/dist/index.js";
|
|
2
|
+
import { CartUserError } from "./operations.js";
|
|
3
|
+
import { ApolloClient } from "@apollo/client";
|
|
4
|
+
//#region src/sdk/cart/use-cart-actions.d.ts
|
|
5
|
+
export type AddItemPayload = Readonly<{
|
|
6
|
+
variantId: string;
|
|
7
|
+
quantity?: number;
|
|
8
|
+
/** Seller global Node ID, e.g. base64("Seller:1"). The server rejects raw ids with INVALID_SELLER_ID. */
|
|
9
|
+
seller: string;
|
|
10
|
+
}>;
|
|
11
|
+
/** Existing-line payloads address the line by its opaque cart-item `id`; the handler reads the rest from cache. */
|
|
12
|
+
export type CartLinePayload = Readonly<{
|
|
13
|
+
id: string;
|
|
14
|
+
}>;
|
|
15
|
+
/** Batch payloads address several lines by their opaque cart-item `id`s. */
|
|
16
|
+
export type CartLinesPayload = Readonly<{
|
|
17
|
+
ids: readonly string[];
|
|
18
|
+
}>;
|
|
19
|
+
export type CartQuantityPayload = Readonly<{
|
|
20
|
+
id: string;
|
|
21
|
+
by?: number;
|
|
22
|
+
}>;
|
|
23
|
+
/** Coupon writes address the coupon by its `code`; the server resolves the cart from the cookie. */
|
|
24
|
+
export type CartCouponPayload = Readonly<{
|
|
25
|
+
code: string;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* The `cart` namespace surface. Item writes return the resulting `userErrors` (empty on success)
|
|
29
|
+
* and publish them to `cartUserErrorsVar`; coupon writes publish to the dedicated
|
|
30
|
+
* `cartCouponErrorsVar` (specs/fspg-830-coupon-entry.md AD-2).
|
|
31
|
+
*/
|
|
32
|
+
export type CartActions = Readonly<{
|
|
33
|
+
/** Add an item to the cart. Async (no optimistic response). Creates the cart on first add. */
|
|
34
|
+
addItem: (payload: AddItemPayload) => Promise<readonly CartUserError[]>;
|
|
35
|
+
/** Remove a line entirely. Optimistic. */
|
|
36
|
+
removeItem: (payload: CartLinePayload) => Promise<readonly CartUserError[]>;
|
|
37
|
+
/** Remove several lines in one mutation. Optimistic. Ids missing from the cache are skipped. */
|
|
38
|
+
removeItems: (payload: CartLinesPayload) => Promise<readonly CartUserError[]>;
|
|
39
|
+
/** Increase a line's quantity by N (default 1). Optimistic. */
|
|
40
|
+
increaseQuantity: (payload: CartQuantityPayload) => Promise<readonly CartUserError[]>;
|
|
41
|
+
/** Decrease a line's quantity by N (default 1). Optimistic. Removes the line when result <= 0. */
|
|
42
|
+
decreaseQuantity: (payload: CartQuantityPayload) => Promise<readonly CartUserError[]>;
|
|
43
|
+
/** Apply a coupon code. Async (no optimistic). Publishes userErrors to cartCouponErrorsVar. */
|
|
44
|
+
applyCoupon: (payload: CartCouponPayload) => Promise<readonly CartUserError[]>;
|
|
45
|
+
/** Remove a coupon code by code. Async (no optimistic). Publishes userErrors to cartCouponErrorsVar. */
|
|
46
|
+
removeCoupon: (payload: CartCouponPayload) => Promise<readonly CartUserError[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Re-check the active cart against the platform and adopt corrected availability. Async (no
|
|
49
|
+
* optimistic), read-only upstream. Returns userErrors (empty on success) to its caller and stamps
|
|
50
|
+
* the freshness window on success. Unlike the item writes it does NOT publish to
|
|
51
|
+
* `cartUserErrorsVar` — a speculative open-time failure must raise no error banner (Decision 6).
|
|
52
|
+
*/
|
|
53
|
+
validate: () => Promise<readonly CartUserError[]>;
|
|
54
|
+
}>;
|
|
55
|
+
//#endregion
|
|
56
|
+
//# sourceMappingURL=use-cart-actions.d.ts.map
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { defineActions } from "../../core/dist/actions/registry.js";
|
|
3
|
+
import "../../core/dist/index.js";
|
|
4
|
+
import { cartCouponErrorsVar, cartLastAddVar, cartUserErrorsVar, orderFormIdVar } from "../state/cart.js";
|
|
5
|
+
import { CART_COUPON_APPLY, CART_COUPON_REMOVE, CART_ITEMS_REMOVE, CART_ITEM_ADD, CART_ITEM_QUANTITY_DECREASE, CART_ITEM_QUANTITY_INCREASE, CART_ITEM_REMOVE, CART_VALIDATE, CartFragment } from "./operations.js";
|
|
6
|
+
import { buildOptimisticDecrease, buildOptimisticIncrease, buildOptimisticRemove, buildOptimisticRemoveItems } from "./optimistic.js";
|
|
7
|
+
import { markAvailabilityFresh, trackCartWrite } from "./write-gate.js";
|
|
8
|
+
import { useApolloClient, useMutation } from "@apollo/client/react";
|
|
9
|
+
import { useCallback, useMemo } from "react";
|
|
10
|
+
//#region src/sdk/cart/use-cart-actions.ts
|
|
11
|
+
/**
|
|
12
|
+
* The `cart` action namespace — the consolidated, context-free owner of every cart write
|
|
13
|
+
* (specs/actions.md, docs/storefront-core/adr-0010-actions-own-the-write-side.md).
|
|
14
|
+
*
|
|
15
|
+
* It replaces `useCartMutations` + the mutation handlers `CartRoot` used to publish through
|
|
16
|
+
* `CartDataContext`. A handler reads the current cart from the normalized Apollo cache (keyed by
|
|
17
|
+
* `orderFormIdVar`), not from component props or React context, so any component anywhere in the
|
|
18
|
+
* tree can dispatch a write through the compiler-injected `$actions.cart.*` prop — the cache is the
|
|
19
|
+
* only meeting point between the read side and the write side (ADR-0010).
|
|
20
|
+
*
|
|
21
|
+
* `userErrors` from every call are published to `cartUserErrorsVar` (cleared at the start of the
|
|
22
|
+
* next call) so `CartError` can surface them without a data context, and also returned to the caller.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Thrown by the existing-line handlers (remove / quantity) when invoked before the cart resolves.
|
|
26
|
+
* The first `addItem` mints the cart and hydrates `orderFormIdVar`; until then there is no cached
|
|
27
|
+
* cart entity to read for the optimistic response.
|
|
28
|
+
*/
|
|
29
|
+
var CartNotReadyError = class extends Error {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(message ?? "CartNotReadyError: no cart in cache yet; add an item (or load the cart) before mutating a line.");
|
|
32
|
+
this.name = "CartNotReadyError";
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const NETWORK_USER_ERROR = {
|
|
36
|
+
code: "NETWORK_ERROR",
|
|
37
|
+
message: "Unable to update cart. Please try again."
|
|
38
|
+
};
|
|
39
|
+
function publish(errors) {
|
|
40
|
+
cartUserErrorsVar(errors);
|
|
41
|
+
return errors;
|
|
42
|
+
}
|
|
43
|
+
/** Coupon-scoped publish — keeps coupon feedback off the shared item-error channel (AD-2). */
|
|
44
|
+
function publishCoupon(errors) {
|
|
45
|
+
cartCouponErrorsVar(errors);
|
|
46
|
+
return errors;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Publish a write's outcome and, when it came back clean, stamp the availability freshness window —
|
|
50
|
+
* a clean write's payload carries the platform's recomputed cart, which is what lets the
|
|
51
|
+
* validate-on-open call skip (specs/mini-cart-validation-wiring.md, Decision 2). Used only on paths
|
|
52
|
+
* where a mutation actually reached the server: a `userErrors` response carries `cart: null` and a
|
|
53
|
+
* no-op (unknown line) issues no request, so neither refreshes availability.
|
|
54
|
+
*/
|
|
55
|
+
function publishWrite(errors) {
|
|
56
|
+
if (errors.length === 0) markAvailabilityFresh();
|
|
57
|
+
return publish(errors);
|
|
58
|
+
}
|
|
59
|
+
/** Coupon-channel counterpart of `publishWrite`. */
|
|
60
|
+
function publishCouponWrite(errors) {
|
|
61
|
+
if (errors.length === 0) markAvailabilityFresh();
|
|
62
|
+
return publishCoupon(errors);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Backfill `orderFormIdVar` from a mutation's returned `cart.id` when local state is still cold.
|
|
66
|
+
* A coupon op can be the first cart write (SSR cold / drawer closed on first load); without this the
|
|
67
|
+
* later `requireLine` paths short-circuit on `orderFormIdVar() === null` and throw `CartNotReadyError`.
|
|
68
|
+
* Mirrors the `addItem` first-add handoff.
|
|
69
|
+
*/
|
|
70
|
+
function hydrateCartId(cartId) {
|
|
71
|
+
if (cartId && orderFormIdVar() === null) orderFormIdVar(cartId);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Read the live cart entity from the normalized cache (ADR-0010), keyed by `orderFormIdVar`. Returns
|
|
75
|
+
* null before the cart is minted/loaded. Module-level so it can be shared with the read-only callers
|
|
76
|
+
* that live outside this hook — the pre-checkout gate re-reads the corrected cart this way after
|
|
77
|
+
* `validate` resolves, because Apollo commits the mutation's cache write before the promise settles
|
|
78
|
+
* (specs/mini-cart-validation-wiring.md, Decision 3). The codegen `CartFragment` document embeds its
|
|
79
|
+
* nested fragments, so it is a self-contained read.
|
|
80
|
+
*/
|
|
81
|
+
function readCartFromCache(client) {
|
|
82
|
+
const cartId = orderFormIdVar();
|
|
83
|
+
if (!cartId) return null;
|
|
84
|
+
const cacheId = client.cache.identify({
|
|
85
|
+
__typename: "Cart",
|
|
86
|
+
id: cartId
|
|
87
|
+
});
|
|
88
|
+
if (!cacheId) return null;
|
|
89
|
+
return client.cache.readFragment({
|
|
90
|
+
id: cacheId,
|
|
91
|
+
fragment: CartFragment,
|
|
92
|
+
fragmentName: "CartFragment"
|
|
93
|
+
}) ?? null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The `cart` namespace hook. Registered with the first-party action registry via `cartActions`
|
|
97
|
+
* below; the compiler-emitted `CartActionProvider` calls it and threads the narrowed methods into
|
|
98
|
+
* each consumer's `$actions.cart`.
|
|
99
|
+
*/
|
|
100
|
+
function useCartActions() {
|
|
101
|
+
const client = useApolloClient();
|
|
102
|
+
const [addMutation] = useMutation(CART_ITEM_ADD);
|
|
103
|
+
const [removeMutation] = useMutation(CART_ITEM_REMOVE);
|
|
104
|
+
const [removeItemsMutation] = useMutation(CART_ITEMS_REMOVE);
|
|
105
|
+
const [increaseMutation] = useMutation(CART_ITEM_QUANTITY_INCREASE);
|
|
106
|
+
const [decreaseMutation] = useMutation(CART_ITEM_QUANTITY_DECREASE);
|
|
107
|
+
const [applyCouponMutation] = useMutation(CART_COUPON_APPLY);
|
|
108
|
+
const [removeCouponMutation] = useMutation(CART_COUPON_REMOVE);
|
|
109
|
+
const [validateMutation] = useMutation(CART_VALIDATE);
|
|
110
|
+
const readCart = useCallback(() => readCartFromCache(client), [client]);
|
|
111
|
+
const requireLine = useCallback((id) => {
|
|
112
|
+
const cart = readCart();
|
|
113
|
+
if (!cart) throw new CartNotReadyError();
|
|
114
|
+
const line = cart.items.find((item) => item.id === id);
|
|
115
|
+
if (!line) return null;
|
|
116
|
+
return {
|
|
117
|
+
cart,
|
|
118
|
+
line
|
|
119
|
+
};
|
|
120
|
+
}, [readCart]);
|
|
121
|
+
const addItem = useCallback(async (payload) => {
|
|
122
|
+
cartUserErrorsVar([]);
|
|
123
|
+
try {
|
|
124
|
+
const result = await trackCartWrite(addMutation({ variables: { input: {
|
|
125
|
+
variantId: payload.variantId,
|
|
126
|
+
quantity: payload.quantity ?? 1,
|
|
127
|
+
seller: payload.seller
|
|
128
|
+
} } }));
|
|
129
|
+
if (orderFormIdVar() === null) {
|
|
130
|
+
const newId = result.data?.cartItemAdd?.cart?.id ?? null;
|
|
131
|
+
if (newId) orderFormIdVar(newId);
|
|
132
|
+
}
|
|
133
|
+
const errors = result.data?.cartItemAdd?.userErrors ?? [];
|
|
134
|
+
if (errors.length === 0) cartLastAddVar(cartLastAddVar() + 1);
|
|
135
|
+
return publishWrite(errors);
|
|
136
|
+
} catch (error) {
|
|
137
|
+
console.error("[cart.addItem] cartItemAdd failed", error);
|
|
138
|
+
return publish([NETWORK_USER_ERROR]);
|
|
139
|
+
}
|
|
140
|
+
}, [addMutation]);
|
|
141
|
+
const removeItem = useCallback(async (payload) => {
|
|
142
|
+
const found = requireLine(payload.id);
|
|
143
|
+
if (!found) return publish([]);
|
|
144
|
+
cartUserErrorsVar([]);
|
|
145
|
+
try {
|
|
146
|
+
return publishWrite((await trackCartWrite(removeMutation({
|
|
147
|
+
variables: { input: { variantId: found.line.variant.variantId } },
|
|
148
|
+
optimisticResponse: buildOptimisticRemove(found.cart, found.line)
|
|
149
|
+
}))).data?.cartItemRemove?.userErrors ?? []);
|
|
150
|
+
} catch (error) {
|
|
151
|
+
console.error("[cart.removeItem] cartItemRemove failed", error);
|
|
152
|
+
return publish([NETWORK_USER_ERROR]);
|
|
153
|
+
}
|
|
154
|
+
}, [requireLine, removeMutation]);
|
|
155
|
+
const removeItems = useCallback(async (payload) => {
|
|
156
|
+
const cart = readCart();
|
|
157
|
+
if (!cart) throw new CartNotReadyError();
|
|
158
|
+
const lines = cart.items.filter((item) => payload.ids.includes(item.id));
|
|
159
|
+
if (lines.length === 0) return publish([]);
|
|
160
|
+
const variantIds = [...new Set(lines.map((line) => line.variant.variantId))];
|
|
161
|
+
cartUserErrorsVar([]);
|
|
162
|
+
try {
|
|
163
|
+
return publishWrite((await trackCartWrite(removeItemsMutation({
|
|
164
|
+
variables: { input: { variantIds } },
|
|
165
|
+
optimisticResponse: buildOptimisticRemoveItems(cart, lines)
|
|
166
|
+
}))).data?.cartItemsRemove?.userErrors ?? []);
|
|
167
|
+
} catch (error) {
|
|
168
|
+
console.error("[cart.removeItems] cartItemsRemove failed", error);
|
|
169
|
+
return publish([NETWORK_USER_ERROR]);
|
|
170
|
+
}
|
|
171
|
+
}, [readCart, removeItemsMutation]);
|
|
172
|
+
const increaseQuantity = useCallback(async (payload) => {
|
|
173
|
+
const by = payload.by ?? 1;
|
|
174
|
+
const found = requireLine(payload.id);
|
|
175
|
+
if (!found) return publish([]);
|
|
176
|
+
cartUserErrorsVar([]);
|
|
177
|
+
try {
|
|
178
|
+
return publishWrite((await trackCartWrite(increaseMutation({
|
|
179
|
+
variables: { input: {
|
|
180
|
+
variantId: found.line.variant.variantId,
|
|
181
|
+
quantityToAdd: by
|
|
182
|
+
} },
|
|
183
|
+
optimisticResponse: buildOptimisticIncrease(found.cart, found.line, by)
|
|
184
|
+
}))).data?.cartItemQuantityIncrease?.userErrors ?? []);
|
|
185
|
+
} catch (error) {
|
|
186
|
+
console.error("[cart.increaseQuantity] cartItemQuantityIncrease failed", error);
|
|
187
|
+
return publish([NETWORK_USER_ERROR]);
|
|
188
|
+
}
|
|
189
|
+
}, [requireLine, increaseMutation]);
|
|
190
|
+
const decreaseQuantity = useCallback(async (payload) => {
|
|
191
|
+
const by = payload.by ?? 1;
|
|
192
|
+
const found = requireLine(payload.id);
|
|
193
|
+
if (!found) return publish([]);
|
|
194
|
+
cartUserErrorsVar([]);
|
|
195
|
+
try {
|
|
196
|
+
return publishWrite((await trackCartWrite(decreaseMutation({
|
|
197
|
+
variables: { input: {
|
|
198
|
+
variantId: found.line.variant.variantId,
|
|
199
|
+
quantityToRemove: by
|
|
200
|
+
} },
|
|
201
|
+
optimisticResponse: buildOptimisticDecrease(found.cart, found.line, by)
|
|
202
|
+
}))).data?.cartItemQuantityDecrease?.userErrors ?? []);
|
|
203
|
+
} catch (error) {
|
|
204
|
+
console.error("[cart.decreaseQuantity] cartItemQuantityDecrease failed", error);
|
|
205
|
+
return publish([NETWORK_USER_ERROR]);
|
|
206
|
+
}
|
|
207
|
+
}, [requireLine, decreaseMutation]);
|
|
208
|
+
const applyCoupon = useCallback(async (payload) => {
|
|
209
|
+
cartCouponErrorsVar([]);
|
|
210
|
+
try {
|
|
211
|
+
const result = await trackCartWrite(applyCouponMutation({ variables: { input: { code: payload.code } } }));
|
|
212
|
+
hydrateCartId(result.data?.cartCouponApply?.cart?.id ?? null);
|
|
213
|
+
return publishCouponWrite(result.data?.cartCouponApply?.userErrors ?? []);
|
|
214
|
+
} catch (error) {
|
|
215
|
+
console.error("[cart.applyCoupon] cartCouponApply failed", error);
|
|
216
|
+
return publishCoupon([NETWORK_USER_ERROR]);
|
|
217
|
+
}
|
|
218
|
+
}, [applyCouponMutation]);
|
|
219
|
+
const removeCoupon = useCallback(async (payload) => {
|
|
220
|
+
cartCouponErrorsVar([]);
|
|
221
|
+
try {
|
|
222
|
+
const result = await trackCartWrite(removeCouponMutation({ variables: { input: { code: payload.code } } }));
|
|
223
|
+
hydrateCartId(result.data?.cartCouponRemove?.cart?.id ?? null);
|
|
224
|
+
return publishCouponWrite(result.data?.cartCouponRemove?.userErrors ?? []);
|
|
225
|
+
} catch (error) {
|
|
226
|
+
console.error("[cart.removeCoupon] cartCouponRemove failed", error);
|
|
227
|
+
return publishCoupon([NETWORK_USER_ERROR]);
|
|
228
|
+
}
|
|
229
|
+
}, [removeCouponMutation]);
|
|
230
|
+
const validate = useCallback(async () => {
|
|
231
|
+
try {
|
|
232
|
+
const result = await validateMutation();
|
|
233
|
+
hydrateCartId(result.data?.cartValidate?.cart?.id ?? null);
|
|
234
|
+
const errors = result.data?.cartValidate?.userErrors ?? [];
|
|
235
|
+
if (errors.length === 0) markAvailabilityFresh();
|
|
236
|
+
return errors;
|
|
237
|
+
} catch (error) {
|
|
238
|
+
console.error("[cart.validate] cartValidate failed", error);
|
|
239
|
+
return [NETWORK_USER_ERROR];
|
|
240
|
+
}
|
|
241
|
+
}, [validateMutation]);
|
|
242
|
+
return useMemo(() => ({
|
|
243
|
+
addItem,
|
|
244
|
+
removeItem,
|
|
245
|
+
removeItems,
|
|
246
|
+
increaseQuantity,
|
|
247
|
+
decreaseQuantity,
|
|
248
|
+
applyCoupon,
|
|
249
|
+
removeCoupon,
|
|
250
|
+
validate
|
|
251
|
+
}), [
|
|
252
|
+
addItem,
|
|
253
|
+
removeItem,
|
|
254
|
+
removeItems,
|
|
255
|
+
increaseQuantity,
|
|
256
|
+
decreaseQuantity,
|
|
257
|
+
applyCoupon,
|
|
258
|
+
removeCoupon,
|
|
259
|
+
validate
|
|
260
|
+
]);
|
|
261
|
+
}
|
|
262
|
+
defineActions({
|
|
263
|
+
namespace: "cart",
|
|
264
|
+
description: "Mutation-backed writes against the current cart (consolidates useCartMutations / CartRoot).",
|
|
265
|
+
provider: {
|
|
266
|
+
name: "CartActionProvider",
|
|
267
|
+
importPath: "@vtex/faststore/internal/client"
|
|
268
|
+
},
|
|
269
|
+
methods: {
|
|
270
|
+
addItem: {
|
|
271
|
+
description: "Add an item to the cart (async strategy). Creates the cart on first add.",
|
|
272
|
+
payload: [
|
|
273
|
+
{
|
|
274
|
+
name: "variantId",
|
|
275
|
+
type: "string"
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
name: "seller",
|
|
279
|
+
type: "string"
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: "quantity",
|
|
283
|
+
type: "number",
|
|
284
|
+
optional: true
|
|
285
|
+
}
|
|
286
|
+
]
|
|
287
|
+
},
|
|
288
|
+
removeItem: {
|
|
289
|
+
description: "Remove a line from the cart (optimistic strategy).",
|
|
290
|
+
payload: [{
|
|
291
|
+
name: "id",
|
|
292
|
+
type: "string"
|
|
293
|
+
}]
|
|
294
|
+
},
|
|
295
|
+
removeItems: {
|
|
296
|
+
description: "Remove several lines from the cart in one call (optimistic strategy).",
|
|
297
|
+
payload: [{
|
|
298
|
+
name: "ids",
|
|
299
|
+
type: "string[]"
|
|
300
|
+
}]
|
|
301
|
+
},
|
|
302
|
+
increaseQuantity: {
|
|
303
|
+
description: "Increase a line's quantity by N (default 1, optimistic strategy).",
|
|
304
|
+
payload: [{
|
|
305
|
+
name: "id",
|
|
306
|
+
type: "string"
|
|
307
|
+
}, {
|
|
308
|
+
name: "by",
|
|
309
|
+
type: "number",
|
|
310
|
+
optional: true
|
|
311
|
+
}]
|
|
312
|
+
},
|
|
313
|
+
decreaseQuantity: {
|
|
314
|
+
description: "Decrease a line's quantity by N (default 1, optimistic). Removes the line at <= 0.",
|
|
315
|
+
payload: [{
|
|
316
|
+
name: "id",
|
|
317
|
+
type: "string"
|
|
318
|
+
}, {
|
|
319
|
+
name: "by",
|
|
320
|
+
type: "number",
|
|
321
|
+
optional: true
|
|
322
|
+
}]
|
|
323
|
+
},
|
|
324
|
+
applyCoupon: {
|
|
325
|
+
description: "Apply a coupon code to the cart (async strategy). Server recomputes totals.",
|
|
326
|
+
payload: [{
|
|
327
|
+
name: "code",
|
|
328
|
+
type: "string"
|
|
329
|
+
}]
|
|
330
|
+
},
|
|
331
|
+
removeCoupon: {
|
|
332
|
+
description: "Remove a coupon code from the cart (async strategy). Server recomputes totals.",
|
|
333
|
+
payload: [{
|
|
334
|
+
name: "code",
|
|
335
|
+
type: "string"
|
|
336
|
+
}]
|
|
337
|
+
},
|
|
338
|
+
validate: {
|
|
339
|
+
description: "Re-check the active cart against the platform and adopt corrected availability (async, read-only upstream).",
|
|
340
|
+
payload: []
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
use: useCartActions
|
|
344
|
+
});
|
|
345
|
+
//#endregion
|
|
346
|
+
export { CartNotReadyError, readCartFromCache, useCartActions };
|
|
347
|
+
|
|
348
|
+
//# sourceMappingURL=use-cart-actions.js.map
|