@vtex/faststore 0.0.8 → 0.0.11
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 +101 -0
- package/README.md +0 -1
- package/dist/actions.json +48 -1
- package/dist/catalog.json +1397 -1594
- package/dist/cli/index.d.ts +66 -28
- package/dist/cli/index.js +7371 -512
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/server-runtime.js +41 -60
- package/dist/cli/server-runtime.js.map +1 -1
- package/dist/client.d.ts +3 -3
- package/dist/client.js +2 -2
- package/dist/components.d.ts +67 -56
- package/dist/components.js +64 -53
- package/dist/content-types.json +5886 -555
- package/dist/core/dist/define-component.d.ts +7 -2
- package/dist/core/dist/define-content-type.d.ts +50 -2
- package/dist/core/dist/define-content-type.js +107 -3
- package/dist/core/dist/define-content-type.js.map +1 -1
- package/dist/core/dist/index.d.ts +2 -2
- package/dist/docs/access-code-field.md +1 -1
- package/dist/docs/access-code-sign-in.md +126 -77
- package/dist/docs/account-address-book.md +210 -95
- package/dist/docs/account-entry-point.md +4 -4
- package/dist/docs/account-menu.md +16 -17
- package/dist/docs/account-saved-cards.md +306 -0
- package/dist/docs/alert-dialog.md +3 -1
- package/dist/docs/avatar.md +4 -2
- package/dist/docs/billing-address.md +99 -30
- package/dist/docs/binding-switcher.md +157 -0
- package/dist/docs/buy-button.md +7 -8
- package/dist/docs/card-entry.md +42 -29
- package/dist/docs/card-summary.md +185 -0
- package/dist/docs/cardholder-document.md +5 -3
- package/dist/docs/carousel.md +5 -4
- package/dist/docs/cart-destination.md +251 -0
- package/dist/docs/cart-item.md +48 -15
- package/dist/docs/cart-totalizer.md +8 -6
- package/dist/docs/cart.md +240 -39
- package/dist/docs/challenge-return.md +135 -0
- package/dist/docs/client-preferences-fieldset.md +10 -5
- package/dist/docs/client-preferences.md +31 -8
- package/dist/docs/client-profile-fieldset.md +20 -6
- package/dist/docs/client-profile.md +12 -3
- package/dist/docs/copy-text.md +9 -7
- package/dist/docs/document-field.md +1 -1
- package/dist/docs/email-field.md +2 -1
- package/dist/docs/email-identification.md +12 -2
- package/dist/docs/footer-copyright.md +4 -2
- package/dist/docs/footer-social.md +1 -1
- package/dist/docs/form.md +54 -18
- package/dist/docs/free-shipping-progress.md +18 -13
- package/dist/docs/identity-edit.md +8 -2
- package/dist/docs/identity-summary.md +18 -5
- package/dist/docs/incentives.md +2 -2
- package/dist/docs/installments.md +46 -32
- package/dist/docs/logo.md +1 -1
- package/dist/docs/my-account-profile.md +16 -11
- package/dist/docs/navigation-link.md +5 -3
- package/dist/docs/order-cancel.md +3 -1
- package/dist/docs/order-delivery-address.md +7 -5
- package/dist/docs/order-delivery-group.md +1 -3
- package/dist/docs/order-details-back.md +1 -1
- package/dist/docs/order-details-header.md +1 -4
- package/dist/docs/order-invoice-download.md +60 -0
- package/dist/docs/order-list-row.md +1 -1
- package/dist/docs/order-list-search.md +13 -20
- package/dist/docs/order-list-views.md +11 -17
- package/dist/docs/order-list.md +12 -5
- package/dist/docs/order-payment.md +9 -7
- package/dist/docs/order-placed-date.md +1 -1
- package/dist/docs/order-placed-payment-summary.md +28 -15
- package/dist/docs/order-placed.md +49 -14
- package/dist/docs/order-progress.md +1 -1
- package/dist/docs/order-status-badge.md +20 -9
- package/dist/docs/order-summary.md +2 -2
- package/dist/docs/order-tracking-link.md +58 -0
- package/dist/docs/payment-method-badges.md +32 -6
- package/dist/docs/payment-methods.md +2 -2
- package/dist/docs/payment.md +36 -17
- package/dist/docs/phone-field.md +4 -4
- package/dist/docs/place-order.md +84 -36
- package/dist/docs/postal-code-field.md +3 -1
- package/dist/docs/pricing.md +21 -23
- package/dist/docs/product-gallery.md +19 -20
- package/dist/docs/product-information.md +14 -10
- package/dist/docs/product-list.md +7 -6
- package/dist/docs/product-shelf.md +7 -1
- package/dist/docs/promotion.md +4 -2
- package/dist/docs/region.md +23 -15
- package/dist/docs/save-card.md +7 -6
- package/dist/docs/saved-cards.md +65 -36
- package/dist/docs/select.md +3 -4
- package/dist/docs/shipping-address.md +57 -21
- package/dist/docs/shipping-simulator.md +53 -15
- package/dist/docs/sign-in-disclosure.md +176 -0
- package/dist/docs/sign-in-form.md +78 -47
- package/dist/docs/sign-in-redirect.md +5 -3
- package/dist/docs/sign-in.md +173 -0
- package/dist/docs/toast.md +45 -16
- package/dist/docs/variant-selector.md +15 -11
- package/dist/graphql/types.d.ts +4 -14
- package/dist/index.d.ts +3 -2
- package/dist/internal/client.d.ts +4 -3
- package/dist/internal/client.js +5 -2
- package/dist/internal/server.d.ts +10 -5
- package/dist/internal/server.js +9 -4
- package/dist/matter/access-code-sign-in/access-code-sign-in.d.ts +250 -66
- package/dist/matter/access-code-sign-in/access-code-sign-in.js +459 -188
- package/dist/matter/access-code-sign-in/access-code-sign-in.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book-delete.d.ts +78 -40
- package/dist/matter/account-address-book/account-address-book-delete.js +86 -50
- package/dist/matter/account-address-book/account-address-book-delete.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book-deliverability.d.ts +21 -4
- package/dist/matter/account-address-book/account-address-book-deliverability.js +45 -17
- package/dist/matter/account-address-book/account-address-book-deliverability.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book-form-parts.d.ts +74 -19
- package/dist/matter/account-address-book/account-address-book-form-parts.js +77 -26
- package/dist/matter/account-address-book/account-address-book-form-parts.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book-profile-notice.d.ts +27 -6
- package/dist/matter/account-address-book/account-address-book-profile-notice.js +55 -28
- package/dist/matter/account-address-book/account-address-book-profile-notice.js.map +1 -1
- package/dist/matter/account-address-book/account-address-book.d.ts +67 -14
- package/dist/matter/account-address-book/account-address-book.js +74 -33
- package/dist/matter/account-address-book/account-address-book.js.map +1 -1
- package/dist/matter/account-address-book/account-address-country-switch.js +3 -3
- package/dist/matter/account-address-book/account-address-country-switch.js.map +1 -1
- package/dist/matter/account-address-book/account-address-country.d.ts +66 -20
- package/dist/matter/account-address-book/account-address-country.js +83 -49
- package/dist/matter/account-address-book/account-address-country.js.map +1 -1
- package/dist/matter/account-address-book/account-address-form-context.d.ts +8 -4
- package/dist/matter/account-address-book/account-address-form-context.js.map +1 -1
- package/dist/matter/account-address-book/account-address-form.d.ts +468 -45
- package/dist/matter/account-address-book/account-address-form.js +518 -155
- package/dist/matter/account-address-book/account-address-form.js.map +1 -1
- package/dist/matter/account-address-book/account-address-record.d.ts +27 -6
- package/dist/matter/account-address-book/account-address-record.js +32 -17
- package/dist/matter/account-address-book/account-address-record.js.map +1 -1
- package/dist/matter/account-menu/account-menu.d.ts +34 -17
- package/dist/matter/account-menu/account-menu.js +46 -54
- package/dist/matter/account-menu/account-menu.js.map +1 -1
- package/dist/matter/account-menu-identity/account-menu-identity.js +1 -1
- package/dist/matter/account-saved-cards/account-saved-cards.d.ts +463 -0
- package/dist/matter/account-saved-cards/account-saved-cards.js +1011 -0
- package/dist/matter/account-saved-cards/account-saved-cards.js.map +1 -0
- package/dist/matter/billing-address/billing-address.d.ts +156 -74
- package/dist/matter/billing-address/billing-address.js +227 -156
- package/dist/matter/billing-address/billing-address.js.map +1 -1
- package/dist/matter/breadcrumb/breadcrumb.d.ts +21 -3
- package/dist/matter/breadcrumb/breadcrumb.js +24 -9
- package/dist/matter/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/matter/buy-button/buy-button.d.ts +8 -11
- package/dist/matter/buy-button/buy-button.js +10 -19
- package/dist/matter/buy-button/buy-button.js.map +1 -1
- package/dist/matter/card-entry/card-capture.js +12 -4
- package/dist/matter/card-entry/card-capture.js.map +1 -1
- package/dist/matter/card-entry/card-entry.d.ts +123 -32
- package/dist/matter/card-entry/card-entry.js +348 -221
- package/dist/matter/card-entry/card-entry.js.map +1 -1
- package/dist/matter/cart/cart-namespace.d.ts +11 -1
- package/dist/matter/cart/cart-namespace.js +11 -1
- package/dist/matter/cart/cart-namespace.js.map +1 -1
- package/dist/matter/cart/cart.d.ts +416 -45
- package/dist/matter/cart/cart.js +782 -101
- package/dist/matter/cart/cart.js.map +1 -1
- package/dist/matter/cart-destination/cart-destination.d.ts +233 -0
- package/dist/matter/cart-destination/cart-destination.js +703 -0
- package/dist/matter/cart-destination/cart-destination.js.map +1 -0
- package/dist/matter/cart-item/cart-item.d.ts +145 -16
- package/dist/matter/cart-item/cart-item.js +230 -54
- package/dist/matter/cart-item/cart-item.js.map +1 -1
- package/dist/matter/cart-item-compositions/cart-item-compositions.js +1 -1
- package/dist/matter/cart-item-compositions/cart-item-compositions.js.map +1 -1
- package/dist/matter/cart-item-customizations/cart-item-customizations.js +1 -1
- package/dist/matter/cart-item-customizations/cart-item-customizations.js.map +1 -1
- package/dist/matter/cart-item-discounts/cart-item-discounts.js +1 -1
- package/dist/matter/cart-item-discounts/cart-item-discounts.js.map +1 -1
- package/dist/matter/cart-item-seller-info/cart-item-seller-info.js +1 -1
- package/dist/matter/cart-item-seller-info/cart-item-seller-info.js.map +1 -1
- package/dist/matter/cart-item-variations/cart-item-variations.js +1 -1
- package/dist/matter/cart-item-variations/cart-item-variations.js.map +1 -1
- package/dist/matter/cart-totalizer/cart-totalizer.d.ts +43 -9
- package/dist/matter/cart-totalizer/cart-totalizer.js +49 -19
- package/dist/matter/cart-totalizer/cart-totalizer.js.map +1 -1
- package/dist/matter/challenge-return/challenge-return.d.ts +62 -0
- package/dist/matter/challenge-return/challenge-return.js +241 -0
- package/dist/matter/challenge-return/challenge-return.js.map +1 -0
- package/dist/matter/client-preferences/client-preferences-fieldset.d.ts +86 -17
- package/dist/matter/client-preferences/client-preferences-fieldset.js +126 -54
- package/dist/matter/client-preferences/client-preferences-fieldset.js.map +1 -1
- package/dist/matter/client-preferences/client-preferences.d.ts +50 -7
- package/dist/matter/client-preferences/client-preferences.js +84 -15
- package/dist/matter/client-preferences/client-preferences.js.map +1 -1
- package/dist/matter/client-profile/client-profile.d.ts +44 -9
- package/dist/matter/client-profile/client-profile.js +64 -24
- package/dist/matter/client-profile/client-profile.js.map +1 -1
- package/dist/matter/client-profile-form/client-profile-fieldset.d.ts +119 -22
- package/dist/matter/client-profile-form/client-profile-fieldset.js +161 -73
- package/dist/matter/client-profile-form/client-profile-fieldset.js.map +1 -1
- package/dist/matter/delivery-options/delivery-options-accordion.d.ts +49 -4
- package/dist/matter/delivery-options/delivery-options-accordion.js +67 -14
- package/dist/matter/delivery-options/delivery-options-accordion.js.map +1 -1
- package/dist/matter/delivery-options/delivery-options-controller.d.ts +69 -9
- package/dist/matter/delivery-options/delivery-options-controller.js +80 -14
- package/dist/matter/delivery-options/delivery-options-controller.js.map +1 -1
- package/dist/matter/delivery-options/delivery-options.d.ts +37 -2
- package/dist/matter/delivery-options/delivery-options.js +75 -12
- package/dist/matter/delivery-options/delivery-options.js.map +1 -1
- package/dist/matter/delivery-options/use-delivery-option-selection.d.ts +1 -0
- package/dist/matter/delivery-options/use-delivery-option-selection.js +1 -1
- package/dist/matter/delivery-options/use-delivery-option-selection.js.map +1 -1
- package/dist/matter/email-identification/email-identification.d.ts +25 -3
- package/dist/matter/email-identification/email-identification.js +49 -12
- package/dist/matter/email-identification/email-identification.js.map +1 -1
- package/dist/matter/free-shipping-progress/free-shipping-progress.d.ts +85 -10
- package/dist/matter/free-shipping-progress/free-shipping-progress.js +153 -53
- package/dist/matter/free-shipping-progress/free-shipping-progress.js.map +1 -1
- package/dist/matter/identity-edit/identity-edit.d.ts +52 -10
- package/dist/matter/identity-edit/identity-edit.js +47 -19
- package/dist/matter/identity-edit/identity-edit.js.map +1 -1
- package/dist/matter/identity-summary/identity-summary.d.ts +76 -22
- package/dist/matter/identity-summary/identity-summary.js +95 -45
- package/dist/matter/identity-summary/identity-summary.js.map +1 -1
- package/dist/matter/installments/installments-select.d.ts +98 -16
- package/dist/matter/installments/installments-select.js +156 -48
- package/dist/matter/installments/installments-select.js.map +1 -1
- package/dist/matter/installments/installments.d.ts +96 -16
- package/dist/matter/installments/installments.js +115 -40
- package/dist/matter/installments/installments.js.map +1 -1
- package/dist/matter/installments/use-installments-selection.d.ts +1 -0
- package/dist/matter/installments/use-installments-selection.js +8 -3
- package/dist/matter/installments/use-installments-selection.js.map +1 -1
- package/dist/matter/my-account-profile/my-account-profile.d.ts +358 -103
- package/dist/matter/my-account-profile/my-account-profile.js +370 -174
- package/dist/matter/my-account-profile/my-account-profile.js.map +1 -1
- package/dist/matter/order-cancel/order-cancel.d.ts +65 -19
- package/dist/matter/order-cancel/order-cancel.js +118 -51
- package/dist/matter/order-cancel/order-cancel.js.map +1 -1
- package/dist/matter/order-delivery-address/order-delivery-address.d.ts +8 -18
- package/dist/matter/order-delivery-address/order-delivery-address.js +14 -23
- package/dist/matter/order-delivery-address/order-delivery-address.js.map +1 -1
- package/dist/matter/order-delivery-group/order-delivery-group.d.ts +40 -24
- package/dist/matter/order-delivery-group/order-delivery-group.js +64 -74
- package/dist/matter/order-delivery-group/order-delivery-group.js.map +1 -1
- package/dist/matter/order-details-header/order-details-header.d.ts +32 -15
- package/dist/matter/order-details-header/order-details-header.js +66 -58
- package/dist/matter/order-details-header/order-details-header.js.map +1 -1
- package/dist/matter/order-invoice-download/order-invoice-download.d.ts +78 -0
- package/dist/matter/order-invoice-download/order-invoice-download.js +173 -0
- package/dist/matter/order-invoice-download/order-invoice-download.js.map +1 -0
- package/dist/matter/order-list/order-list.d.ts +164 -19
- package/dist/matter/order-list/order-list.js +229 -87
- package/dist/matter/order-list/order-list.js.map +1 -1
- package/dist/matter/order-list-row/order-list-row.d.ts +6 -1
- package/dist/matter/order-list-row/order-list-row.js +3 -2
- package/dist/matter/order-list-row/order-list-row.js.map +1 -1
- package/dist/matter/order-list-search/order-list-search.d.ts +18 -26
- package/dist/matter/order-list-search/order-list-search.js +30 -69
- package/dist/matter/order-list-search/order-list-search.js.map +1 -1
- package/dist/matter/order-list-views/order-list-views.d.ts +15 -22
- package/dist/matter/order-list-views/order-list-views.js +22 -68
- package/dist/matter/order-list-views/order-list-views.js.map +1 -1
- package/dist/matter/order-payment/order-payment.d.ts +33 -10
- package/dist/matter/order-payment/order-payment.js +44 -39
- package/dist/matter/order-payment/order-payment.js.map +1 -1
- package/dist/matter/order-placed/order-placed-deliveries.d.ts +144 -12
- package/dist/matter/order-placed/order-placed-deliveries.js +115 -40
- package/dist/matter/order-placed/order-placed-deliveries.js.map +1 -1
- package/dist/matter/order-placed/order-placed.d.ts +198 -31
- package/dist/matter/order-placed/order-placed.js +230 -139
- package/dist/matter/order-placed/order-placed.js.map +1 -1
- package/dist/matter/order-placed-date/order-placed-date.d.ts +5 -8
- package/dist/matter/order-placed-date/order-placed-date.js +7 -8
- package/dist/matter/order-placed-date/order-placed-date.js.map +1 -1
- package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.d.ts +90 -17
- package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js +93 -117
- package/dist/matter/order-placed-payment-summary/order-placed-payment-summary.js.map +1 -1
- package/dist/matter/order-progress/order-progress.d.ts +19 -8
- package/dist/matter/order-progress/order-progress.js +37 -45
- package/dist/matter/order-progress/order-progress.js.map +1 -1
- package/dist/matter/order-summary/order-summary.d.ts +19 -9
- package/dist/matter/order-summary/order-summary.js +38 -44
- package/dist/matter/order-summary/order-summary.js.map +1 -1
- package/dist/matter/order-tracking-link/order-tracking-link.d.ts +43 -0
- package/dist/matter/order-tracking-link/order-tracking-link.js +107 -0
- package/dist/matter/order-tracking-link/order-tracking-link.js.map +1 -0
- package/dist/matter/payment/payment-card-capture.js +17 -10
- package/dist/matter/payment/payment-card-capture.js.map +1 -1
- package/dist/matter/payment/payment-controller.d.ts +4 -2
- package/dist/matter/payment/payment-controller.js +30 -9
- package/dist/matter/payment/payment-controller.js.map +1 -1
- package/dist/matter/payment/payment-method-badges.js +1 -1
- package/dist/matter/payment/payment.d.ts +69 -19
- package/dist/matter/payment/payment.js +101 -35
- package/dist/matter/payment/payment.js.map +1 -1
- package/dist/matter/payment/use-payment-method-selection.d.ts +25 -4
- package/dist/matter/payment/use-payment-method-selection.js +94 -32
- package/dist/matter/payment/use-payment-method-selection.js.map +1 -1
- package/dist/matter/payment/use-payment-submit-gate.d.ts +14 -3
- package/dist/matter/payment/use-payment-submit-gate.js +47 -8
- package/dist/matter/payment/use-payment-submit-gate.js.map +1 -1
- package/dist/matter/place-order/place-order.d.ts +171 -57
- package/dist/matter/place-order/place-order.js +376 -185
- package/dist/matter/place-order/place-order.js.map +1 -1
- package/dist/matter/pricing/pricing.d.ts +152 -13
- package/dist/matter/pricing/pricing.js +153 -52
- package/dist/matter/pricing/pricing.js.map +1 -1
- package/dist/matter/product-information/product-information.d.ts +27 -4
- package/dist/matter/product-information/product-information.js +32 -15
- package/dist/matter/product-information/product-information.js.map +1 -1
- package/dist/matter/product-list/product-list.d.ts +24 -6
- package/dist/matter/product-list/product-list.js +32 -26
- package/dist/matter/product-list/product-list.js.map +1 -1
- package/dist/matter/product-shelf/product-shelf.d.ts +8 -3
- package/dist/matter/product-shelf/product-shelf.js +111 -10
- package/dist/matter/product-shelf/product-shelf.js.map +1 -1
- package/dist/matter/region/region.d.ts +33 -16
- package/dist/matter/region/region.js +59 -52
- package/dist/matter/region/region.js.map +1 -1
- package/dist/matter/save-card/save-card.d.ts +43 -8
- package/dist/matter/save-card/save-card.js +61 -23
- package/dist/matter/save-card/save-card.js.map +1 -1
- package/dist/matter/saved-cards/saved-cards.d.ts +113 -21
- package/dist/matter/saved-cards/saved-cards.js +349 -77
- package/dist/matter/saved-cards/saved-cards.js.map +1 -1
- package/dist/matter/shipping-address/address-payload.js +25 -0
- package/dist/matter/shipping-address/address-payload.js.map +1 -0
- package/dist/matter/shipping-address/country-descriptors.js +71 -71
- package/dist/matter/shipping-address/country-descriptors.js.map +1 -1
- package/dist/matter/shipping-address/library-country-descriptors.js +136 -0
- package/dist/matter/shipping-address/library-country-descriptors.js.map +1 -0
- package/dist/matter/shipping-address/shipping-address.d.ts +312 -45
- package/dist/matter/shipping-address/shipping-address.js +443 -188
- package/dist/matter/shipping-address/shipping-address.js.map +1 -1
- package/dist/matter/shipping-simulator/shipping-simulator.d.ts +251 -25
- package/dist/matter/shipping-simulator/shipping-simulator.js +261 -51
- package/dist/matter/shipping-simulator/shipping-simulator.js.map +1 -1
- package/dist/matter/sign-in/sign-in.d.ts +108 -0
- package/dist/matter/sign-in/sign-in.js +285 -0
- package/dist/matter/sign-in/sign-in.js.map +1 -0
- package/dist/matter/sign-in-disclosure/sign-in-disclosure.d.ts +81 -0
- package/dist/matter/sign-in-disclosure/sign-in-disclosure.js +232 -0
- package/dist/matter/sign-in-disclosure/sign-in-disclosure.js.map +1 -0
- package/dist/matter/sign-in-form/sign-in-form.d.ts +93 -62
- package/dist/matter/sign-in-form/sign-in-form.js +134 -144
- package/dist/matter/sign-in-form/sign-in-form.js.map +1 -1
- package/dist/particles/binding-switcher/binding-switcher.d.ts +59 -0
- package/dist/particles/binding-switcher/binding-switcher.js +194 -0
- package/dist/particles/binding-switcher/binding-switcher.js.map +1 -0
- package/dist/particles/card-summary/card-network.d.ts +17 -0
- package/dist/particles/card-summary/card-network.js +25 -0
- package/dist/particles/card-summary/card-network.js.map +1 -0
- package/dist/particles/card-summary/card-summary.d.ts +113 -0
- package/dist/particles/card-summary/card-summary.js +221 -0
- package/dist/particles/card-summary/card-summary.js.map +1 -0
- package/dist/particles/carousel/carousel.d.ts +99 -11
- package/dist/particles/carousel/carousel.js +103 -35
- package/dist/particles/carousel/carousel.js.map +1 -1
- package/dist/particles/copy-text/copy-text.js +5 -15
- package/dist/particles/copy-text/copy-text.js.map +1 -1
- package/dist/particles/dialog/dialog.d.ts +14 -6
- package/dist/particles/dialog/dialog.js +6 -3
- package/dist/particles/dialog/dialog.js.map +1 -1
- package/dist/particles/drawer/drawer.js +1 -1
- package/dist/particles/drawer/drawer.js.map +1 -1
- package/dist/particles/email-field/email-field.d.ts +2 -1
- package/dist/particles/email-field/email-field.js +2 -1
- package/dist/particles/email-field/email-field.js.map +1 -1
- package/dist/particles/footer-link-group/footer-link-group.js +1 -0
- package/dist/particles/footer-link-group/footer-link-group.js.map +1 -1
- package/dist/particles/footer-social/footer-social.d.ts +1 -1
- package/dist/particles/footer-social/footer-social.js +1 -1
- package/dist/particles/footer-social/footer-social.js.map +1 -1
- package/dist/particles/form/form.d.ts +85 -13
- package/dist/particles/form/form.js +91 -42
- package/dist/particles/form/form.js.map +1 -1
- package/dist/particles/gallery/gallery.d.ts +129 -12
- package/dist/particles/gallery/gallery.js +121 -34
- package/dist/particles/gallery/gallery.js.map +1 -1
- package/dist/particles/incentives/incentives.d.ts +1 -1
- package/dist/particles/incentives/incentives.js +1 -1
- package/dist/particles/incentives/incentives.js.map +1 -1
- package/dist/particles/order-details-back/order-details-back.d.ts +5 -3
- package/dist/particles/order-details-back/order-details-back.js +8 -10
- package/dist/particles/order-details-back/order-details-back.js.map +1 -1
- package/dist/particles/order-status-badge/order-status-badge.d.ts +3 -3
- package/dist/particles/order-status-badge/order-status-badge.js +4 -20
- package/dist/particles/order-status-badge/order-status-badge.js.map +1 -1
- package/dist/particles/password-field/password-field.d.ts +1 -1
- package/dist/particles/password-field/password-field.js +2 -4
- package/dist/particles/password-field/password-field.js.map +1 -1
- package/dist/particles/payment-methods/payment-methods.d.ts +1 -1
- package/dist/particles/payment-methods/payment-methods.js +1 -1
- package/dist/particles/payment-methods/payment-methods.js.map +1 -1
- package/dist/particles/phone-field/phone-field.d.ts +4 -4
- package/dist/particles/phone-field/phone-field.js +8 -11
- package/dist/particles/phone-field/phone-field.js.map +1 -1
- package/dist/particles/spinner/spinner.d.ts +24 -4
- package/dist/particles/spinner/spinner.js +25 -9
- package/dist/particles/spinner/spinner.js.map +1 -1
- package/dist/particles/switch/switch.d.ts +4 -1
- package/dist/particles/switch/switch.js +3 -1
- package/dist/particles/switch/switch.js.map +1 -1
- package/dist/particles/toast/toast.d.ts +49 -9
- package/dist/particles/toast/toast.js +81 -15
- package/dist/particles/toast/toast.js.map +1 -1
- package/dist/schema.graphql +461 -89
- package/dist/sdk/actions/index.d.ts +3 -1
- package/dist/sdk/actions/index.js +3 -1
- package/dist/sdk/actions/locale-action-provider.d.ts +16 -0
- package/dist/sdk/actions/locale-action-provider.js +20 -0
- package/dist/sdk/actions/locale-action-provider.js.map +1 -0
- package/dist/sdk/actions/saved-card-action-provider.d.ts +12 -0
- package/dist/sdk/actions/saved-card-action-provider.js +16 -0
- package/dist/sdk/actions/saved-card-action-provider.js.map +1 -0
- package/dist/sdk/actions/types.d.ts +6 -2
- package/dist/sdk/address/address-fields.js +4 -4
- package/dist/sdk/address/address-fields.js.map +1 -1
- package/dist/sdk/address/constants.js +1 -6
- package/dist/sdk/address/constants.js.map +1 -1
- package/dist/sdk/address/messages.js +44 -44
- package/dist/sdk/address/messages.js.map +1 -1
- package/dist/sdk/address/postal-code.js +15 -2
- package/dist/sdk/address/postal-code.js.map +1 -1
- package/dist/sdk/address/types.d.ts +5 -3
- package/dist/sdk/address/validate-address.js +3 -3
- package/dist/sdk/address/validate-address.js.map +1 -1
- package/dist/sdk/analytics/use-analytics-actions.d.ts +1 -1
- package/dist/sdk/analytics/use-analytics-actions.js.map +1 -1
- package/dist/sdk/cache/storefront-cache.js +2 -1
- package/dist/sdk/cache/storefront-cache.js.map +1 -1
- package/dist/sdk/cart/operations.d.ts +2 -1
- package/dist/sdk/cart/operations.js +55 -1
- package/dist/sdk/cart/operations.js.map +1 -1
- package/dist/sdk/cart/optimistic.d.ts +30 -7
- package/dist/sdk/cart/optimistic.js +78 -41
- package/dist/sdk/cart/optimistic.js.map +1 -1
- package/dist/sdk/cart/use-cart-actions.d.ts +7 -0
- package/dist/sdk/cart/use-cart-actions.js +61 -15
- package/dist/sdk/cart/use-cart-actions.js.map +1 -1
- package/dist/sdk/cart/use-cart-sync-sales-channel.js +70 -0
- package/dist/sdk/cart/use-cart-sync-sales-channel.js.map +1 -0
- package/dist/sdk/data/index.js +2 -2
- package/dist/sdk/data/reactive-list-item-data-provider.js +2 -2
- package/dist/sdk/generated/gql.js +16 -12
- package/dist/sdk/generated/gql.js.map +1 -1
- package/dist/sdk/generated/graphql.d.ts +197 -51
- package/dist/sdk/generated/graphql.js +2318 -91
- package/dist/sdk/generated/graphql.js.map +1 -1
- package/dist/sdk/i18n/format-error-code.js +23 -0
- package/dist/sdk/i18n/format-error-code.js.map +1 -0
- package/dist/sdk/i18n/message-formatter.d.ts +22 -0
- package/dist/sdk/i18n/message-formatter.js +140 -0
- package/dist/sdk/i18n/message-formatter.js.map +1 -0
- package/dist/sdk/i18n/use-message-formatter.d.ts +8 -0
- package/dist/sdk/i18n/use-message-formatter.js +18 -0
- package/dist/sdk/i18n/use-message-formatter.js.map +1 -0
- package/dist/sdk/identity/use-identity-actions.js.map +1 -1
- package/dist/sdk/locale/binding-switch-provider.d.ts +13 -0
- package/dist/sdk/locale/binding-switch-provider.js +20 -0
- package/dist/sdk/locale/binding-switch-provider.js.map +1 -0
- package/dist/sdk/locale/use-locale-actions.d.ts +16 -0
- package/dist/sdk/locale/use-locale-actions.js +70 -0
- package/dist/sdk/locale/use-locale-actions.js.map +1 -0
- package/dist/sdk/navigation/binding-switch.d.ts +39 -0
- package/dist/sdk/navigation/binding-switch.js +129 -0
- package/dist/sdk/navigation/binding-switch.js.map +1 -0
- package/dist/sdk/navigation/decode-route-params.d.ts +11 -0
- package/dist/sdk/navigation/decode-route-params.js +32 -0
- package/dist/sdk/navigation/decode-route-params.js.map +1 -0
- package/dist/sdk/navigation/redirect.d.ts +2 -0
- package/dist/sdk/navigation/redirect.js +19 -1
- package/dist/sdk/navigation/redirect.js.map +1 -1
- package/dist/sdk/navigation/types.d.ts +13 -0
- package/dist/sdk/payment/bin-format.js +20 -0
- package/dist/sdk/payment/bin-format.js.map +1 -0
- package/dist/sdk/payment/challenge-return.js +37 -0
- package/dist/sdk/payment/challenge-return.js.map +1 -0
- package/dist/sdk/payment/confirmation-last-four.js +39 -0
- package/dist/sdk/payment/confirmation-last-four.js.map +1 -0
- package/dist/sdk/payment/gateway.d.ts +1 -1
- package/dist/sdk/payment/gateway.js +8 -2
- package/dist/sdk/payment/gateway.js.map +1 -1
- package/dist/sdk/payment/operations.d.ts +1 -0
- package/dist/sdk/payment/operations.js +28 -6
- package/dist/sdk/payment/operations.js.map +1 -1
- package/dist/sdk/payment/resumed-purchase.d.ts +1 -0
- package/dist/sdk/payment/resumed-purchase.js +119 -0
- package/dist/sdk/payment/resumed-purchase.js.map +1 -0
- package/dist/sdk/payment/security-code-mask.js +16 -23
- package/dist/sdk/payment/security-code-mask.js.map +1 -1
- package/dist/sdk/payment/submission-registry.js +6 -2
- package/dist/sdk/payment/submission-registry.js.map +1 -1
- package/dist/sdk/payment/use-payment-actions.d.ts +18 -3
- package/dist/sdk/payment/use-payment-actions.js +23 -3
- package/dist/sdk/payment/use-payment-actions.js.map +1 -1
- package/dist/sdk/payment/use-place-order.d.ts +10 -2
- package/dist/sdk/payment/use-place-order.js +138 -76
- package/dist/sdk/payment/use-place-order.js.map +1 -1
- package/dist/sdk/provider/storefront-provider.d.ts +1 -7
- package/dist/sdk/provider/storefront-provider.js +4 -11
- package/dist/sdk/provider/storefront-provider.js.map +1 -1
- package/dist/sdk/saved-cards/operations.d.ts +16 -0
- package/dist/sdk/saved-cards/operations.js +41 -0
- package/dist/sdk/saved-cards/operations.js.map +1 -0
- package/dist/sdk/saved-cards/use-saved-card-actions.d.ts +26 -0
- package/dist/sdk/saved-cards/use-saved-card-actions.js +86 -0
- package/dist/sdk/saved-cards/use-saved-card-actions.js.map +1 -0
- package/dist/sdk/seo/entity-landing.d.ts +24 -0
- package/dist/sdk/seo/entity-landing.js +30 -0
- package/dist/sdk/seo/entity-landing.js.map +1 -0
- package/dist/sdk/seo/page-alternates.d.ts +8 -5
- package/dist/sdk/seo/page-alternates.js +11 -14
- package/dist/sdk/seo/page-alternates.js.map +1 -1
- package/dist/sdk/seo/search-landing.d.ts +42 -0
- package/dist/sdk/seo/search-landing.js +85 -0
- package/dist/sdk/seo/search-landing.js.map +1 -0
- package/dist/sdk/session/mock-session.d.ts +9 -0
- package/dist/sdk/session/mock-session.js +31 -0
- package/dist/sdk/session/mock-session.js.map +1 -0
- package/dist/sdk/session/read-server-session.d.ts +3 -0
- package/dist/sdk/session/read-server-session.js +5 -0
- package/dist/sdk/session/read-server-session.js.map +1 -1
- package/dist/sdk/session/return-path-segment.d.ts +10 -0
- package/dist/sdk/session/return-path-segment.js +15 -0
- package/dist/sdk/session/return-path-segment.js.map +1 -0
- package/dist/sdk/session/use-session-actions.js.map +1 -1
- package/dist/sdk/shipping/shipping-operations.d.ts +1 -1
- package/dist/sdk/shipping/shipping-operations.js +13 -0
- package/dist/sdk/shipping/shipping-operations.js.map +1 -1
- package/dist/sdk/shipping/use-cart-shipping-simulation.js.map +1 -1
- package/dist/sdk/shipping/use-shipping-actions.js.map +1 -1
- package/dist/sdk/shipping/use-shipping-simulation.js.map +1 -1
- package/dist/sdk/state/cart.d.ts +9 -2
- package/dist/sdk/state/cart.js +9 -2
- package/dist/sdk/state/cart.js.map +1 -1
- package/dist/utils/safe-href.d.ts +2 -0
- package/package.json +4 -3
- package/skills/storefront-asset/SKILL.md +2 -2
- package/skills/storefront-asset/references/api-side.md +27 -14
- package/skills/storefront-asset/references/findings.md +5 -2
- package/src/styles/tailwind.css +9 -2
- package/dist/matter/shipping-address/country-descriptors.d.ts +0 -1
- package/dist/message-locales.json +0 -7
- package/dist/sdk/i18n/client.d.ts +0 -4
- package/dist/sdk/i18n/client.js +0 -4
- package/dist/sdk/i18n/locales.d.ts +0 -8
- package/dist/sdk/i18n/locales.js +0 -57
- package/dist/sdk/i18n/locales.js.map +0 -1
- package/dist/sdk/i18n/messages/en-US.js +0 -164
- package/dist/sdk/i18n/messages/en-US.js.map +0 -1
- package/dist/sdk/i18n/messages/en-US.json +0 -159
- package/dist/sdk/i18n/messages/en-US.json.d.ts +0 -163
- package/dist/sdk/i18n/messages/es-ES.js +0 -164
- package/dist/sdk/i18n/messages/es-ES.js.map +0 -1
- package/dist/sdk/i18n/messages/es-ES.json +0 -159
- package/dist/sdk/i18n/messages/pt-BR.js +0 -164
- package/dist/sdk/i18n/messages/pt-BR.js.map +0 -1
- package/dist/sdk/i18n/messages/pt-BR.json +0 -159
- package/dist/sdk/i18n/provider.d.ts +0 -1
- package/dist/sdk/i18n/provider.js +0 -30
- package/dist/sdk/i18n/provider.js.map +0 -1
- package/dist/sdk/i18n/server.d.ts +0 -28
- package/dist/sdk/i18n/server.js +0 -59
- package/dist/sdk/i18n/server.js.map +0 -1
- package/dist/utils/resolve-authored-copy.js +0 -18
- package/dist/utils/resolve-authored-copy.js.map +0 -1
- package/dist/utils/substitute-template.js +0 -33
- package/dist/utils/substitute-template.js.map +0 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { ContentValue, MessageLocaleProp } from "../../core/dist/define-content-type.js";
|
|
1
2
|
import { ComponentDefinition } from "../../core/dist/define-component.js";
|
|
2
3
|
import "../../core/dist/index.js";
|
|
3
4
|
import { ShippingOption } from "../shipping-simulator/shipping-simulator.js";
|
|
5
|
+
import { ShippingOptionSelectUserError } from "../../sdk/shipping/option-select-operations.js";
|
|
4
6
|
import { ComponentActions } from "../../sdk/actions/types.js";
|
|
5
7
|
import { RawDeliveryOptionsData } from "./use-delivery-option-selection.js";
|
|
6
8
|
import { ComponentPropsWithRef, ReactNode } from "react";
|
|
@@ -10,8 +12,8 @@ export type DeliveryOptionsContextValue = Readonly<{
|
|
|
10
12
|
options: ShippingOption[];
|
|
11
13
|
/** Group value: the persisted `selectedOptionId` for real data, local state under mock. */
|
|
12
14
|
selectedOptionId: string | null;
|
|
13
|
-
/**
|
|
14
|
-
selectionError:
|
|
15
|
+
/** The first `userError` from the latest real selection, or `null`. */
|
|
16
|
+
selectionError: ShippingOptionSelectUserError | null;
|
|
15
17
|
/** Selects an option and closes the surface once the selection resolves without a `userError`. */
|
|
16
18
|
selectOption: (optionId: string) => void;
|
|
17
19
|
}>;
|
|
@@ -30,20 +32,78 @@ export type DeliveryOptionsControllerProps = {
|
|
|
30
32
|
/** The single overlay `Root` to control — a `DialogRoot` (modal) or `DrawerRoot` (slide-in). */
|
|
31
33
|
children?: ReactNode;
|
|
32
34
|
};
|
|
33
|
-
export type DeliveryOptionsSummaryProps = ComponentPropsWithRef<'span'> & {
|
|
35
|
+
export type DeliveryOptionsSummaryProps = ComponentPropsWithRef<'span'> & MessageLocaleProp & {
|
|
34
36
|
/** Optional prefix shown before the summary value (e.g. "Forma de entrega"). */
|
|
35
37
|
label?: string;
|
|
36
|
-
/** Text shown while nothing is selected. */
|
|
37
|
-
placeholder?: string;
|
|
38
38
|
/** Separator between the selected option name and price. */
|
|
39
39
|
separator?: string;
|
|
40
|
+
/** The placeholder shown while nothing is selected, and the text that replaces a zero price. */
|
|
41
|
+
$content?: ContentValue<typeof DeliveryOptionsSummaryContent>;
|
|
42
|
+
};
|
|
43
|
+
export type DeliveryOptionsListProps = ComponentPropsWithRef<'div'> & MessageLocaleProp & {
|
|
44
|
+
/** Words the selection error by its code. */
|
|
45
|
+
$content?: ContentValue<typeof DeliveryOptionsListContent>;
|
|
40
46
|
};
|
|
41
|
-
export type DeliveryOptionsListProps = ComponentPropsWithRef<'div'>;
|
|
42
47
|
export declare const DeliveryOptionsControllerDefinition: ComponentDefinition<DeliveryOptionsControllerProps>;
|
|
48
|
+
export declare const DeliveryOptionsSummaryContent: {
|
|
49
|
+
readonly id: "delivery-options-summary";
|
|
50
|
+
readonly title: "Delivery Options Summary";
|
|
51
|
+
readonly description: "Text shown while nothing is selected, and instead of a zero price for the selected option.";
|
|
52
|
+
readonly schema: {
|
|
53
|
+
readonly type: "object";
|
|
54
|
+
readonly additionalProperties: false;
|
|
55
|
+
readonly properties: {
|
|
56
|
+
readonly placeholder: {
|
|
57
|
+
readonly type: "string";
|
|
58
|
+
readonly title: "Placeholder";
|
|
59
|
+
readonly format: "icu-message";
|
|
60
|
+
readonly messageSource: "Select a delivery option";
|
|
61
|
+
};
|
|
62
|
+
readonly freeLabel: {
|
|
63
|
+
readonly type: "string";
|
|
64
|
+
readonly title: "Free price label";
|
|
65
|
+
readonly format: "icu-message";
|
|
66
|
+
readonly messageSource: "Free";
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
};
|
|
43
71
|
export declare const DeliveryOptionsSummaryDefinition: ComponentDefinition<DeliveryOptionsSummaryProps>;
|
|
44
|
-
export declare const
|
|
72
|
+
export declare const DeliveryOptionsListContent: {
|
|
73
|
+
readonly id: "delivery-options-list";
|
|
74
|
+
readonly title: "Delivery Options List";
|
|
75
|
+
readonly description: "Messages shown when a delivery option selection is refused, one per error code the shopper can act on.";
|
|
76
|
+
readonly schema: {
|
|
77
|
+
readonly type: "object";
|
|
78
|
+
readonly additionalProperties: false;
|
|
79
|
+
readonly properties: {
|
|
80
|
+
readonly optionUnavailableMessage: {
|
|
81
|
+
readonly type: "string";
|
|
82
|
+
readonly title: "Option unavailable message";
|
|
83
|
+
readonly description: "Shown when the picked option is no longer offered for the cart.";
|
|
84
|
+
readonly format: "icu-message";
|
|
85
|
+
readonly messageSource: "This delivery option is no longer available. Choose another one.";
|
|
86
|
+
};
|
|
87
|
+
readonly missingAddressMessage: {
|
|
88
|
+
readonly type: "string";
|
|
89
|
+
readonly title: "Missing address message";
|
|
90
|
+
readonly description: "Shown when no delivery address is saved on the cart yet.";
|
|
91
|
+
readonly format: "icu-message";
|
|
92
|
+
readonly messageSource: "Enter a delivery address before choosing a delivery option.";
|
|
93
|
+
};
|
|
94
|
+
readonly genericErrorMessage: {
|
|
95
|
+
readonly type: "string";
|
|
96
|
+
readonly title: "Generic failure message";
|
|
97
|
+
readonly description: "Shown for a network failure and for every refusal the shopper cannot act on.";
|
|
98
|
+
readonly format: "icu-message";
|
|
99
|
+
readonly messageSource: "Unable to update the delivery option. Please try again.";
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
export declare const DeliveryOptionsListDefinition: ComponentDefinition<DeliveryOptionsListProps>;
|
|
45
105
|
export declare function DeliveryOptionsController({ $data, $actions: $actionsProp, mockOptions, children }: Readonly<DeliveryOptionsControllerProps>): string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
|
|
46
|
-
export declare function DeliveryOptionsSummary({
|
|
47
|
-
export declare function DeliveryOptionsList({ className, children, ...props }: DeliveryOptionsListProps): import("react/jsx-runtime").JSX.Element;
|
|
106
|
+
export declare function DeliveryOptionsSummary({ $content, $locale, label, separator, className, ...props }: DeliveryOptionsSummaryProps): import("react/jsx-runtime").JSX.Element;
|
|
107
|
+
export declare function DeliveryOptionsList({ $content, $locale, className, children, ...props }: DeliveryOptionsListProps): import("react/jsx-runtime").JSX.Element;
|
|
48
108
|
//#endregion
|
|
49
109
|
//# sourceMappingURL=delivery-options-controller.d.ts.map
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { defineComponent } from "../../core/dist/define-component.js";
|
|
3
|
+
import { defineContentType } from "../../core/dist/define-content-type.js";
|
|
3
4
|
import "../../core/dist/index.js";
|
|
5
|
+
import { useMessageFormatter } from "../../sdk/i18n/use-message-formatter.js";
|
|
4
6
|
import { useActionsOverride } from "../../sdk/actions/actions-override-context.js";
|
|
5
|
-
import {
|
|
7
|
+
import { formatErrorCode } from "../../sdk/i18n/format-error-code.js";
|
|
8
|
+
import { OptionItemContext, ShippingSimulatorContext, ShippingSimulatorOptionName, ShippingSimulatorOptionPrice, isFreeAmount } from "../shipping-simulator/shipping-simulator.js";
|
|
6
9
|
import { useDeliveryOptionSelection } from "./use-delivery-option-selection.js";
|
|
7
10
|
import { DeliveryOptionsListBody } from "./delivery-options.js";
|
|
8
11
|
import { cloneElement, createContext, isValidElement, useContext, useMemo, useState } from "react";
|
|
@@ -86,10 +89,34 @@ const DeliveryOptionsControllerDefinition = defineComponent({
|
|
|
86
89
|
} },
|
|
87
90
|
guideline: "State-only controller for a collapsed delivery-option picker: wrap a single DialogRoot (centered modal) or DrawerRoot (slide-in) child and it becomes controlled — the surface opens from its trigger and closes once a real selection succeeds; a userError keeps it open. Renders no markup and bakes no styling: compose the overlay particles (DialogTrigger/DialogPortal/DialogBackdrop/DialogPopup or the Drawer equivalents) directly as page nodes, place a DeliveryOptionsSummary inside the trigger (echoes the selected name + price, or a placeholder) and a DeliveryOptionsList inside the popup (the option radio group; put the reused ShippingSimulatorOption leaves as its children). Selection dispatches $actions.shipping.selectOption; mockOptions is a local/dev-only fallback. Mirrors the CartOpenOnAdd / ShippingAddressSavedAddressDrawerController pattern."
|
|
88
91
|
});
|
|
92
|
+
const DeliveryOptionsSummaryContent = defineContentType({
|
|
93
|
+
id: "delivery-options-summary",
|
|
94
|
+
title: "Delivery Options Summary",
|
|
95
|
+
description: "Text shown while nothing is selected, and instead of a zero price for the selected option.",
|
|
96
|
+
schema: {
|
|
97
|
+
type: "object",
|
|
98
|
+
additionalProperties: false,
|
|
99
|
+
properties: {
|
|
100
|
+
placeholder: {
|
|
101
|
+
type: "string",
|
|
102
|
+
title: "Placeholder",
|
|
103
|
+
format: "icu-message",
|
|
104
|
+
messageSource: "Select a delivery option"
|
|
105
|
+
},
|
|
106
|
+
freeLabel: {
|
|
107
|
+
type: "string",
|
|
108
|
+
title: "Free price label",
|
|
109
|
+
format: "icu-message",
|
|
110
|
+
messageSource: "Free"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
89
115
|
const DeliveryOptionsSummaryDefinition = defineComponent({
|
|
90
116
|
name: "DeliveryOptionsSummary",
|
|
91
117
|
importPath: "@vtex/faststore/components",
|
|
92
118
|
component: DeliveryOptionsSummary,
|
|
119
|
+
content: DeliveryOptionsSummaryContent,
|
|
93
120
|
requiresContext: "delivery-options",
|
|
94
121
|
editor: {
|
|
95
122
|
label: "Delivery Options Summary",
|
|
@@ -100,30 +127,66 @@ const DeliveryOptionsSummaryDefinition = defineComponent({
|
|
|
100
127
|
type: "string",
|
|
101
128
|
label: "Trigger label prefix"
|
|
102
129
|
},
|
|
103
|
-
placeholder: {
|
|
104
|
-
type: "string",
|
|
105
|
-
default: "Selecionar forma de entrega",
|
|
106
|
-
label: "Placeholder"
|
|
107
|
-
},
|
|
108
130
|
separator: {
|
|
109
131
|
type: "string",
|
|
110
132
|
default: " — ",
|
|
111
133
|
label: "Summary separator"
|
|
112
134
|
}
|
|
113
135
|
},
|
|
114
|
-
guideline: "The collapsed picker trigger echo: renders the selected option name + price (reusing the FSPG-832 option leaves), or
|
|
136
|
+
guideline: "The collapsed picker trigger echo: renders the selected option name + price (reusing the FSPG-832 option leaves), or its $content.placeholder while nothing is selected; its $content.freeLabel replaces a zero price. Place it inside the DialogTrigger / DrawerTrigger of a DeliveryOptionsController subtree. Reads the shared selection context, so it reflects the current pick — real or mockOptions. Must be inside DeliveryOptionsController."
|
|
115
137
|
});
|
|
138
|
+
const DeliveryOptionsListContent = defineContentType({
|
|
139
|
+
id: "delivery-options-list",
|
|
140
|
+
title: "Delivery Options List",
|
|
141
|
+
description: "Messages shown when a delivery option selection is refused, one per error code the shopper can act on.",
|
|
142
|
+
schema: {
|
|
143
|
+
type: "object",
|
|
144
|
+
additionalProperties: false,
|
|
145
|
+
properties: {
|
|
146
|
+
optionUnavailableMessage: {
|
|
147
|
+
type: "string",
|
|
148
|
+
title: "Option unavailable message",
|
|
149
|
+
description: "Shown when the picked option is no longer offered for the cart.",
|
|
150
|
+
format: "icu-message",
|
|
151
|
+
messageSource: "This delivery option is no longer available. Choose another one."
|
|
152
|
+
},
|
|
153
|
+
missingAddressMessage: {
|
|
154
|
+
type: "string",
|
|
155
|
+
title: "Missing address message",
|
|
156
|
+
description: "Shown when no delivery address is saved on the cart yet.",
|
|
157
|
+
format: "icu-message",
|
|
158
|
+
messageSource: "Enter a delivery address before choosing a delivery option."
|
|
159
|
+
},
|
|
160
|
+
genericErrorMessage: {
|
|
161
|
+
type: "string",
|
|
162
|
+
title: "Generic failure message",
|
|
163
|
+
description: "Shown for a network failure and for every refusal the shopper cannot act on.",
|
|
164
|
+
format: "icu-message",
|
|
165
|
+
messageSource: "Unable to update the delivery option. Please try again."
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
/** The message for each code a selection can resolve. A code this map does not know shows genericErrorMessage. */
|
|
171
|
+
const DELIVERY_OPTIONS_LIST_ERROR_FIELDS = {
|
|
172
|
+
OPTION_UNAVAILABLE: "optionUnavailableMessage",
|
|
173
|
+
MISSING_SHIPPING_ADDRESS: "missingAddressMessage",
|
|
174
|
+
MISSING_CART_CONTEXT: "genericErrorMessage",
|
|
175
|
+
CART_NOT_FOUND: "genericErrorMessage",
|
|
176
|
+
NETWORK_ERROR: "genericErrorMessage"
|
|
177
|
+
};
|
|
116
178
|
const DeliveryOptionsListDefinition = defineComponent({
|
|
117
179
|
name: "DeliveryOptionsList",
|
|
118
180
|
importPath: "@vtex/faststore/components",
|
|
119
181
|
component: DeliveryOptionsList,
|
|
182
|
+
content: DeliveryOptionsListContent,
|
|
120
183
|
requiresContext: "delivery-options",
|
|
121
184
|
editor: {
|
|
122
185
|
label: "Delivery Options List",
|
|
123
186
|
category: "commerce"
|
|
124
187
|
},
|
|
125
188
|
schema: {},
|
|
126
|
-
guideline: "The collapsed picker body: the whole-cart option list as a radio group bound to the selected option, plus the inline selection error (role=\"alert\"). Place it inside the DialogPopup / DrawerPopup of a DeliveryOptionsController subtree, with the reused option leaves (ShippingSimulatorOption, OptionName, OptionEstimate, OptionPrice, OptionFreeBadge) as its children template. Picking a row dispatches the selection and closes the surface on success. Must be inside DeliveryOptionsController."
|
|
189
|
+
guideline: "The collapsed picker body: the whole-cart option list as a radio group bound to the selected option, plus the inline selection error (role=\"alert\"), worded by its code from its $content (genericErrorMessage for a network failure, every refusal the shopper cannot act on, and an unknown code). Place it inside the DialogPopup / DrawerPopup of a DeliveryOptionsController subtree, with the reused option leaves (ShippingSimulatorOption, OptionName, OptionEstimate, OptionPrice, OptionFreeBadge) as its children template. Picking a row dispatches the selection and closes the surface on success. Must be inside DeliveryOptionsController."
|
|
127
190
|
});
|
|
128
191
|
function DeliveryOptionsController({ $data, $actions: $actionsProp, mockOptions, children }) {
|
|
129
192
|
const $actions = useActionsOverride($actionsProp);
|
|
@@ -158,8 +221,9 @@ function DeliveryOptionsController({ $data, $actions: $actionsProp, mockOptions,
|
|
|
158
221
|
})
|
|
159
222
|
});
|
|
160
223
|
}
|
|
161
|
-
function DeliveryOptionsSummary({
|
|
224
|
+
function DeliveryOptionsSummary({ $content, $locale, label, separator = " — ", className, ...props }) {
|
|
162
225
|
const { options, selectedOptionId } = useDeliveryOptions();
|
|
226
|
+
const { format } = useMessageFormatter(DeliveryOptionsSummaryContent, $content);
|
|
163
227
|
const selectedOption = options.find((option) => option.id === selectedOptionId) ?? null;
|
|
164
228
|
return /* @__PURE__ */ jsxs("span", {
|
|
165
229
|
...props,
|
|
@@ -178,28 +242,30 @@ function DeliveryOptionsSummary({ label, placeholder = "Selecionar forma de entr
|
|
|
178
242
|
"data-fs-delivery-options-summary-separator": "",
|
|
179
243
|
children: separator
|
|
180
244
|
}),
|
|
181
|
-
/* @__PURE__ */ jsx(ShippingSimulatorOptionPrice, {})
|
|
245
|
+
/* @__PURE__ */ jsx(ShippingSimulatorOptionPrice, { children: isFreeAmount(selectedOption.price.amount) ? format("freeLabel") : void 0 })
|
|
182
246
|
]
|
|
183
247
|
})
|
|
184
248
|
}) : /* @__PURE__ */ jsx("span", {
|
|
185
249
|
"data-fs-delivery-options-summary-placeholder": "",
|
|
186
|
-
children: placeholder
|
|
250
|
+
children: format("placeholder")
|
|
187
251
|
})]
|
|
188
252
|
});
|
|
189
253
|
}
|
|
190
|
-
function DeliveryOptionsList({ className, children, ...props }) {
|
|
254
|
+
function DeliveryOptionsList({ $content, $locale, className, children, ...props }) {
|
|
191
255
|
const { options, selectedOptionId, selectionError, selectOption } = useDeliveryOptions();
|
|
256
|
+
const { format } = useMessageFormatter(DeliveryOptionsListContent, $content);
|
|
257
|
+
const errorMessage = selectionError ? formatErrorCode(DeliveryOptionsListContent, DELIVERY_OPTIONS_LIST_ERROR_FIELDS, selectionError, format, "genericErrorMessage") : null;
|
|
192
258
|
return /* @__PURE__ */ jsx(DeliveryOptionsListBody, {
|
|
193
259
|
...props,
|
|
194
260
|
className,
|
|
195
261
|
options,
|
|
196
262
|
selectedOptionId,
|
|
197
|
-
selectionError,
|
|
263
|
+
selectionError: errorMessage,
|
|
198
264
|
onSelectOption: selectOption,
|
|
199
265
|
children
|
|
200
266
|
});
|
|
201
267
|
}
|
|
202
268
|
//#endregion
|
|
203
|
-
export { DeliveryOptionsController, DeliveryOptionsControllerDefinition, DeliveryOptionsList, DeliveryOptionsListDefinition, DeliveryOptionsSummary, DeliveryOptionsSummaryDefinition, useDeliveryOptions };
|
|
269
|
+
export { DELIVERY_OPTIONS_LIST_ERROR_FIELDS, DeliveryOptionsController, DeliveryOptionsControllerDefinition, DeliveryOptionsList, DeliveryOptionsListContent, DeliveryOptionsListDefinition, DeliveryOptionsSummary, DeliveryOptionsSummaryContent, DeliveryOptionsSummaryDefinition, useDeliveryOptions };
|
|
204
270
|
|
|
205
271
|
//# sourceMappingURL=delivery-options-controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-options-controller.js","names":[],"sources":["../../../src/matter/delivery-options/delivery-options-controller.tsx"],"sourcesContent":["'use client';\n\nimport { defineComponent } from '@vtex/fs-core';\nimport {\n type ComponentPropsWithRef,\n cloneElement,\n createContext,\n isValidElement,\n type ReactNode,\n useContext,\n useMemo,\n useState,\n} from 'react';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport {\n OptionItemContext,\n type ShippingOption,\n ShippingSimulatorContext,\n ShippingSimulatorOptionName,\n ShippingSimulatorOptionPrice,\n} from '../shipping-simulator/shipping-simulator.js';\nimport { DeliveryOptionsListBody } from './delivery-options.js';\nimport { type RawDeliveryOptionsData, useDeliveryOptionSelection } from './use-delivery-option-selection.js';\n\n/**\n * The collapsed delivery-option surfaces (centered modal / slide-in panel) as a controller +\n * composed particles, replacing the former monolithic `DeliveryOptionsDialog` / `DeliveryOptionsDrawer`\n * (Decision 8). The page composes a raw `DialogRoot` or `DrawerRoot` and each of its particles\n * (`DialogTrigger` / `DialogBackdrop` / `DialogPopup` …) directly as `page.json` nodes, so every part\n * is a swatch-addressable node with zero Tailwind baked into the package — the portaled backdrop/popup\n * a descendant selector could not reach in the monolith are now first-class nodes (Decision 9).\n *\n * `DeliveryOptionsController` owns state only and renders no markup: it runs the shared\n * `useDeliveryOptionSelection` engine, holds the open state, and provides both the FSPG-832\n * `ShippingSimulatorContext` and a `DeliveryOptions` selection context to its subtree, then injects\n * `open` / `onOpenChange` into its single overlay-`Root` child via `cloneElement` — the same mechanism\n * as `CartOpenOnAdd` and `ShippingAddressSavedAddressDrawerController`. A single engine behind the\n * context keeps the trigger echo (`DeliveryOptionsSummary`) and the option list (`DeliveryOptionsList`)\n * on one selection state, so even a local `mockOptions` pick reflects on the trigger.\n *\n * Selection follows the shared rule (INV-10/11): a real pick dispatches `shipping.selectOption` and\n * the surface closes only once it resolves without a `userError`; a rejected pick keeps it open with\n * the inline `role=\"alert\"`; a `mockOptions` pick updates local state and closes immediately.\n */\n\nconst fragment = /* GraphQL */ `\n fragment DeliveryOptionsControllerData on Query {\n shipping {\n id\n options {\n id\n name\n channel\n shippingEstimate {\n value\n unit\n }\n price {\n amount\n currencyCode\n }\n listPrice {\n amount\n currencyCode\n }\n }\n selectedOptionId\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Selection context — provided by DeliveryOptionsController, read by the leaves\n// ---------------------------------------------------------------------------\n\nexport type DeliveryOptionsContextValue = Readonly<{\n /** Resolved option rows (real when the fetch has any, else the `mockOptions` fallback). */\n options: ShippingOption[];\n /** Group value: the persisted `selectedOptionId` for real data, local state under mock. */\n selectedOptionId: string | null;\n /** First `userError` message from the latest real selection, or `null`. */\n selectionError: string | null;\n /** Selects an option and closes the surface once the selection resolves without a `userError`. */\n selectOption: (optionId: string) => void;\n}>;\n\nconst DELIVERY_OPTIONS_UNSET = Symbol('DeliveryOptionsContextUnset');\n\nconst DeliveryOptionsContextInternal = createContext<DeliveryOptionsContextValue | typeof DELIVERY_OPTIONS_UNSET>(\n DELIVERY_OPTIONS_UNSET,\n);\n\n/**\n * Read the delivery-option selection state from the nearest `DeliveryOptionsController`. Throws when\n * called outside a controller subtree.\n */\nexport function useDeliveryOptions(): DeliveryOptionsContextValue {\n const ctx = useContext(DeliveryOptionsContextInternal);\n if (ctx === DELIVERY_OPTIONS_UNSET) {\n throw new Error('useDeliveryOptions() must be used inside a <DeliveryOptionsController> subtree.');\n }\n return ctx;\n}\n\n// The minimal open-state shape the controller injects into its overlay-Root child; both\n// `DialogRoot` and `DrawerRoot` accept it.\ntype OverlayOpenProps = {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport type DeliveryOptionsControllerProps = {\n /** Shipping slice forwarded by the reactive runtime; `null` until shipping resolves. */\n $data?: RawDeliveryOptionsData | null;\n /** Compiler-injected action surface; carries `shipping.selectOption`. */\n $actions?: ComponentActions;\n /** Local/dev fallback rows, used only when the reactive fetch resolves no options. */\n mockOptions?: ShippingOption[];\n /** The single overlay `Root` to control — a `DialogRoot` (modal) or `DrawerRoot` (slide-in). */\n children?: ReactNode;\n};\n\nexport type DeliveryOptionsSummaryProps = ComponentPropsWithRef<'span'> & {\n /** Optional prefix shown before the summary value (e.g. \"Forma de entrega\"). */\n label?: string;\n /** Text shown while nothing is selected. */\n placeholder?: string;\n /** Separator between the selected option name and price. */\n separator?: string;\n};\n\nexport type DeliveryOptionsListProps = ComponentPropsWithRef<'div'>;\n\n// ---------------------------------------------------------------------------\n// Definitions\n// ---------------------------------------------------------------------------\n\nexport const DeliveryOptionsControllerDefinition = defineComponent<DeliveryOptionsControllerProps>({\n name: 'DeliveryOptionsController',\n importPath: '@vtex/faststore/components',\n component: DeliveryOptionsController,\n fragment,\n fetchStrategy: 'reactive',\n actions: { shipping: ['selectOption'] },\n // Its own `delivery-options` selection context, plus the reused option leaves' runtime contexts\n // (Decision 2): `shipping-simulator-option` for the leaves composed under DeliveryOptionsList, and\n // the outer `shipping-simulator` this controller also provides at runtime.\n providesContext: ['delivery-options', 'shipping-simulator', 'shipping-simulator-option'],\n editor: { label: 'Delivery Options Controller', category: 'commerce' },\n schema: {\n mockOptions: { type: 'array', label: 'Mock options (local/dev fallback, ignored once real data has options)' },\n },\n guideline:\n 'State-only controller for a collapsed delivery-option picker: wrap a single DialogRoot (centered modal) or DrawerRoot (slide-in) child and it becomes controlled — the surface opens from its trigger and closes once a real selection succeeds; a userError keeps it open. Renders no markup and bakes no styling: compose the overlay particles (DialogTrigger/DialogPortal/DialogBackdrop/DialogPopup or the Drawer equivalents) directly as page nodes, place a DeliveryOptionsSummary inside the trigger (echoes the selected name + price, or a placeholder) and a DeliveryOptionsList inside the popup (the option radio group; put the reused ShippingSimulatorOption leaves as its children). Selection dispatches $actions.shipping.selectOption; mockOptions is a local/dev-only fallback. Mirrors the CartOpenOnAdd / ShippingAddressSavedAddressDrawerController pattern.',\n});\n\nexport const DeliveryOptionsSummaryDefinition = defineComponent<DeliveryOptionsSummaryProps>({\n name: 'DeliveryOptionsSummary',\n importPath: '@vtex/faststore/components',\n component: DeliveryOptionsSummary,\n requiresContext: 'delivery-options',\n editor: { label: 'Delivery Options Summary', category: 'commerce' },\n schema: {\n label: { type: 'string', label: 'Trigger label prefix' },\n placeholder: { type: 'string', default: 'Selecionar forma de entrega', label: 'Placeholder' },\n separator: { type: 'string', default: ' — ', label: 'Summary separator' },\n },\n guideline:\n 'The collapsed picker trigger echo: renders the selected option name + price (reusing the FSPG-832 option leaves), or a placeholder while nothing is selected. Place it inside the DialogTrigger / DrawerTrigger of a DeliveryOptionsController subtree. Reads the shared selection context, so it reflects the current pick — real or mockOptions. Must be inside DeliveryOptionsController.',\n});\n\nexport const DeliveryOptionsListDefinition = defineComponent<DeliveryOptionsListProps>({\n name: 'DeliveryOptionsList',\n importPath: '@vtex/faststore/components',\n component: DeliveryOptionsList,\n requiresContext: 'delivery-options',\n editor: { label: 'Delivery Options List', category: 'commerce' },\n schema: {},\n guideline:\n 'The collapsed picker body: the whole-cart option list as a radio group bound to the selected option, plus the inline selection error (role=\"alert\"). Place it inside the DialogPopup / DrawerPopup of a DeliveryOptionsController subtree, with the reused option leaves (ShippingSimulatorOption, OptionName, OptionEstimate, OptionPrice, OptionFreeBadge) as its children template. Picking a row dispatches the selection and closes the surface on success. Must be inside DeliveryOptionsController.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementations\n// ---------------------------------------------------------------------------\n\nexport function DeliveryOptionsController({\n $data,\n $actions: $actionsProp,\n mockOptions,\n children,\n}: Readonly<DeliveryOptionsControllerProps>) {\n const $actions = useActionsOverride($actionsProp);\n const { options, selectedOptionId, selectionError, selectOption, contextValue } = useDeliveryOptionSelection({\n $data,\n $actions,\n mockOptions,\n });\n const [open, setOpen] = useState(false);\n\n const delivery = useMemo<DeliveryOptionsContextValue>(\n () => ({\n options,\n selectedOptionId,\n selectionError,\n selectOption: (optionId: string) =>\n selectOption(optionId, {\n onSettled: (ok) => {\n if (ok) setOpen(false);\n },\n }),\n }),\n [options, selectedOptionId, selectionError, selectOption],\n );\n\n if (!isValidElement<OverlayOpenProps>(children)) {\n return children;\n }\n\n return (\n <ShippingSimulatorContext value={contextValue}>\n <DeliveryOptionsContextInternal value={delivery}>\n {cloneElement(children, { open, onOpenChange: (next: boolean) => setOpen(next) })}\n </DeliveryOptionsContextInternal>\n </ShippingSimulatorContext>\n );\n}\n\nexport function DeliveryOptionsSummary({\n label,\n placeholder = 'Selecionar forma de entrega',\n separator = ' — ',\n className,\n ...props\n}: DeliveryOptionsSummaryProps) {\n const { options, selectedOptionId } = useDeliveryOptions();\n const selectedOption = options.find((option) => option.id === selectedOptionId) ?? null;\n\n return (\n <span {...props} className={className} data-fs-delivery-options-summary=\"\">\n {label ? <span data-fs-delivery-options-summary-label=\"\">{label}</span> : null}\n {selectedOption ? (\n <OptionItemContext value={selectedOption}>\n <span data-fs-delivery-options-summary-value=\"\">\n <ShippingSimulatorOptionName />\n <span data-fs-delivery-options-summary-separator=\"\">{separator}</span>\n <ShippingSimulatorOptionPrice />\n </span>\n </OptionItemContext>\n ) : (\n <span data-fs-delivery-options-summary-placeholder=\"\">{placeholder}</span>\n )}\n </span>\n );\n}\n\nexport function DeliveryOptionsList({ className, children, ...props }: DeliveryOptionsListProps) {\n const { options, selectedOptionId, selectionError, selectOption } = useDeliveryOptions();\n\n return (\n <DeliveryOptionsListBody\n {...props}\n className={className}\n options={options}\n selectedOptionId={selectedOptionId}\n selectionError={selectionError}\n onSelectOption={selectOption}\n >\n {children}\n </DeliveryOptionsListBody>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"delivery-options-controller.js","names":[],"sources":["../../../src/matter/delivery-options/delivery-options-controller.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ContentValue,\n defineComponent,\n defineContentType,\n type MessageFieldName,\n type MessageLocaleProp,\n} from '@vtex/fs-core';\nimport {\n type ComponentPropsWithRef,\n cloneElement,\n createContext,\n isValidElement,\n type ReactNode,\n useContext,\n useMemo,\n useState,\n} from 'react';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { formatErrorCode } from '../../sdk/i18n/format-error-code.js';\nimport { useMessageFormatter } from '../../sdk/i18n/use-message-formatter.js';\nimport type { ShippingOptionSelectUserError } from '../../sdk/shipping/option-select-operations.js';\nimport {\n isFreeAmount,\n OptionItemContext,\n type ShippingOption,\n ShippingSimulatorContext,\n ShippingSimulatorOptionName,\n ShippingSimulatorOptionPrice,\n} from '../shipping-simulator/shipping-simulator.js';\nimport { DeliveryOptionsListBody } from './delivery-options.js';\nimport {\n type DeliveryOptionSelectErrorCode,\n type RawDeliveryOptionsData,\n useDeliveryOptionSelection,\n} from './use-delivery-option-selection.js';\n\n/**\n * The collapsed delivery-option surfaces (centered modal / slide-in panel) as a controller +\n * composed particles, replacing the former monolithic `DeliveryOptionsDialog` / `DeliveryOptionsDrawer`\n * (Decision 8). The page composes a raw `DialogRoot` or `DrawerRoot` and each of its particles\n * (`DialogTrigger` / `DialogBackdrop` / `DialogPopup` …) directly as `page.json` nodes, so every part\n * is a swatch-addressable node with zero Tailwind baked into the package — the portaled backdrop/popup\n * a descendant selector could not reach in the monolith are now first-class nodes (Decision 9).\n *\n * `DeliveryOptionsController` owns state only and renders no markup: it runs the shared\n * `useDeliveryOptionSelection` engine, holds the open state, and provides both the FSPG-832\n * `ShippingSimulatorContext` and a `DeliveryOptions` selection context to its subtree, then injects\n * `open` / `onOpenChange` into its single overlay-`Root` child via `cloneElement` — the same mechanism\n * as `CartOpenOnAdd` and `ShippingAddressSavedAddressDrawerController`. A single engine behind the\n * context keeps the trigger echo (`DeliveryOptionsSummary`) and the option list (`DeliveryOptionsList`)\n * on one selection state, so even a local `mockOptions` pick reflects on the trigger.\n *\n * Selection follows the shared rule (INV-10/11): a real pick dispatches `shipping.selectOption` and\n * the surface closes only once it resolves without a `userError`; a rejected pick keeps it open with\n * the inline `role=\"alert\"`; a `mockOptions` pick updates local state and closes immediately.\n */\n\nconst fragment = /* GraphQL */ `\n fragment DeliveryOptionsControllerData on Query {\n shipping {\n id\n options {\n id\n name\n channel\n shippingEstimate {\n value\n unit\n }\n price {\n amount\n currencyCode\n }\n listPrice {\n amount\n currencyCode\n }\n }\n selectedOptionId\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Selection context — provided by DeliveryOptionsController, read by the leaves\n// ---------------------------------------------------------------------------\n\nexport type DeliveryOptionsContextValue = Readonly<{\n /** Resolved option rows (real when the fetch has any, else the `mockOptions` fallback). */\n options: ShippingOption[];\n /** Group value: the persisted `selectedOptionId` for real data, local state under mock. */\n selectedOptionId: string | null;\n /** The first `userError` from the latest real selection, or `null`. */\n selectionError: ShippingOptionSelectUserError | null;\n /** Selects an option and closes the surface once the selection resolves without a `userError`. */\n selectOption: (optionId: string) => void;\n}>;\n\nconst DELIVERY_OPTIONS_UNSET = Symbol('DeliveryOptionsContextUnset');\n\nconst DeliveryOptionsContextInternal = createContext<DeliveryOptionsContextValue | typeof DELIVERY_OPTIONS_UNSET>(\n DELIVERY_OPTIONS_UNSET,\n);\n\n/**\n * Read the delivery-option selection state from the nearest `DeliveryOptionsController`. Throws when\n * called outside a controller subtree.\n */\nexport function useDeliveryOptions(): DeliveryOptionsContextValue {\n const ctx = useContext(DeliveryOptionsContextInternal);\n if (ctx === DELIVERY_OPTIONS_UNSET) {\n throw new Error('useDeliveryOptions() must be used inside a <DeliveryOptionsController> subtree.');\n }\n return ctx;\n}\n\n// The minimal open-state shape the controller injects into its overlay-Root child; both\n// `DialogRoot` and `DrawerRoot` accept it.\ntype OverlayOpenProps = {\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport type DeliveryOptionsControllerProps = {\n /** Shipping slice forwarded by the reactive runtime; `null` until shipping resolves. */\n $data?: RawDeliveryOptionsData | null;\n /** Compiler-injected action surface; carries `shipping.selectOption`. */\n $actions?: ComponentActions;\n /** Local/dev fallback rows, used only when the reactive fetch resolves no options. */\n mockOptions?: ShippingOption[];\n /** The single overlay `Root` to control — a `DialogRoot` (modal) or `DrawerRoot` (slide-in). */\n children?: ReactNode;\n};\n\nexport type DeliveryOptionsSummaryProps = ComponentPropsWithRef<'span'> &\n MessageLocaleProp & {\n /** Optional prefix shown before the summary value (e.g. \"Forma de entrega\"). */\n label?: string;\n /** Separator between the selected option name and price. */\n separator?: string;\n /** The placeholder shown while nothing is selected, and the text that replaces a zero price. */\n $content?: ContentValue<typeof DeliveryOptionsSummaryContent>;\n };\n\nexport type DeliveryOptionsListProps = ComponentPropsWithRef<'div'> &\n MessageLocaleProp & {\n /** Words the selection error by its code. */\n $content?: ContentValue<typeof DeliveryOptionsListContent>;\n };\n\n// ---------------------------------------------------------------------------\n// Definitions\n// ---------------------------------------------------------------------------\n\nexport const DeliveryOptionsControllerDefinition = defineComponent<DeliveryOptionsControllerProps>({\n name: 'DeliveryOptionsController',\n importPath: '@vtex/faststore/components',\n component: DeliveryOptionsController,\n fragment,\n fetchStrategy: 'reactive',\n actions: { shipping: ['selectOption'] },\n // Its own `delivery-options` selection context, plus the reused option leaves' runtime contexts\n // (Decision 2): `shipping-simulator-option` for the leaves composed under DeliveryOptionsList, and\n // the outer `shipping-simulator` this controller also provides at runtime.\n providesContext: ['delivery-options', 'shipping-simulator', 'shipping-simulator-option'],\n editor: { label: 'Delivery Options Controller', category: 'commerce' },\n schema: {\n mockOptions: { type: 'array', label: 'Mock options (local/dev fallback, ignored once real data has options)' },\n },\n guideline:\n 'State-only controller for a collapsed delivery-option picker: wrap a single DialogRoot (centered modal) or DrawerRoot (slide-in) child and it becomes controlled — the surface opens from its trigger and closes once a real selection succeeds; a userError keeps it open. Renders no markup and bakes no styling: compose the overlay particles (DialogTrigger/DialogPortal/DialogBackdrop/DialogPopup or the Drawer equivalents) directly as page nodes, place a DeliveryOptionsSummary inside the trigger (echoes the selected name + price, or a placeholder) and a DeliveryOptionsList inside the popup (the option radio group; put the reused ShippingSimulatorOption leaves as its children). Selection dispatches $actions.shipping.selectOption; mockOptions is a local/dev-only fallback. Mirrors the CartOpenOnAdd / ShippingAddressSavedAddressDrawerController pattern.',\n});\n\nexport const DeliveryOptionsSummaryContent = defineContentType({\n id: 'delivery-options-summary',\n title: 'Delivery Options Summary',\n description: 'Text shown while nothing is selected, and instead of a zero price for the selected option.',\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n placeholder: {\n type: 'string',\n title: 'Placeholder',\n format: 'icu-message',\n messageSource: 'Select a delivery option',\n },\n freeLabel: { type: 'string', title: 'Free price label', format: 'icu-message', messageSource: 'Free' },\n },\n },\n});\n\nexport const DeliveryOptionsSummaryDefinition = defineComponent<DeliveryOptionsSummaryProps>({\n name: 'DeliveryOptionsSummary',\n importPath: '@vtex/faststore/components',\n component: DeliveryOptionsSummary,\n content: DeliveryOptionsSummaryContent,\n requiresContext: 'delivery-options',\n editor: { label: 'Delivery Options Summary', category: 'commerce' },\n schema: {\n label: { type: 'string', label: 'Trigger label prefix' },\n separator: { type: 'string', default: ' — ', label: 'Summary separator' },\n },\n guideline:\n 'The collapsed picker trigger echo: renders the selected option name + price (reusing the FSPG-832 option leaves), or its $content.placeholder while nothing is selected; its $content.freeLabel replaces a zero price. Place it inside the DialogTrigger / DrawerTrigger of a DeliveryOptionsController subtree. Reads the shared selection context, so it reflects the current pick — real or mockOptions. Must be inside DeliveryOptionsController.',\n});\n\nexport const DeliveryOptionsListContent = defineContentType({\n id: 'delivery-options-list',\n title: 'Delivery Options List',\n description: 'Messages shown when a delivery option selection is refused, one per error code the shopper can act on.',\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n optionUnavailableMessage: {\n type: 'string',\n title: 'Option unavailable message',\n description: 'Shown when the picked option is no longer offered for the cart.',\n format: 'icu-message',\n messageSource: 'This delivery option is no longer available. Choose another one.',\n },\n missingAddressMessage: {\n type: 'string',\n title: 'Missing address message',\n description: 'Shown when no delivery address is saved on the cart yet.',\n format: 'icu-message',\n messageSource: 'Enter a delivery address before choosing a delivery option.',\n },\n genericErrorMessage: {\n type: 'string',\n title: 'Generic failure message',\n description: 'Shown for a network failure and for every refusal the shopper cannot act on.',\n format: 'icu-message',\n messageSource: 'Unable to update the delivery option. Please try again.',\n },\n },\n },\n});\n\n/** The message for each code a selection can resolve. A code this map does not know shows genericErrorMessage. */\nexport const DELIVERY_OPTIONS_LIST_ERROR_FIELDS = {\n OPTION_UNAVAILABLE: 'optionUnavailableMessage',\n MISSING_SHIPPING_ADDRESS: 'missingAddressMessage',\n MISSING_CART_CONTEXT: 'genericErrorMessage',\n CART_NOT_FOUND: 'genericErrorMessage',\n NETWORK_ERROR: 'genericErrorMessage',\n} as const satisfies Record<DeliveryOptionSelectErrorCode, MessageFieldName<typeof DeliveryOptionsListContent>>;\n\nexport const DeliveryOptionsListDefinition = defineComponent<DeliveryOptionsListProps>({\n name: 'DeliveryOptionsList',\n importPath: '@vtex/faststore/components',\n component: DeliveryOptionsList,\n content: DeliveryOptionsListContent,\n requiresContext: 'delivery-options',\n editor: { label: 'Delivery Options List', category: 'commerce' },\n schema: {},\n guideline:\n 'The collapsed picker body: the whole-cart option list as a radio group bound to the selected option, plus the inline selection error (role=\"alert\"), worded by its code from its $content (genericErrorMessage for a network failure, every refusal the shopper cannot act on, and an unknown code). Place it inside the DialogPopup / DrawerPopup of a DeliveryOptionsController subtree, with the reused option leaves (ShippingSimulatorOption, OptionName, OptionEstimate, OptionPrice, OptionFreeBadge) as its children template. Picking a row dispatches the selection and closes the surface on success. Must be inside DeliveryOptionsController.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementations\n// ---------------------------------------------------------------------------\n\nexport function DeliveryOptionsController({\n $data,\n $actions: $actionsProp,\n mockOptions,\n children,\n}: Readonly<DeliveryOptionsControllerProps>) {\n const $actions = useActionsOverride($actionsProp);\n const { options, selectedOptionId, selectionError, selectOption, contextValue } = useDeliveryOptionSelection({\n $data,\n $actions,\n mockOptions,\n });\n const [open, setOpen] = useState(false);\n\n const delivery = useMemo<DeliveryOptionsContextValue>(\n () => ({\n options,\n selectedOptionId,\n selectionError,\n selectOption: (optionId: string) =>\n selectOption(optionId, {\n onSettled: (ok) => {\n if (ok) setOpen(false);\n },\n }),\n }),\n [options, selectedOptionId, selectionError, selectOption],\n );\n\n if (!isValidElement<OverlayOpenProps>(children)) {\n return children;\n }\n\n return (\n <ShippingSimulatorContext value={contextValue}>\n <DeliveryOptionsContextInternal value={delivery}>\n {cloneElement(children, { open, onOpenChange: (next: boolean) => setOpen(next) })}\n </DeliveryOptionsContextInternal>\n </ShippingSimulatorContext>\n );\n}\n\nexport function DeliveryOptionsSummary({\n $content,\n $locale,\n label,\n separator = ' — ',\n className,\n ...props\n}: DeliveryOptionsSummaryProps) {\n const { options, selectedOptionId } = useDeliveryOptions();\n const { format } = useMessageFormatter(DeliveryOptionsSummaryContent, $content);\n const selectedOption = options.find((option) => option.id === selectedOptionId) ?? null;\n\n return (\n <span {...props} className={className} data-fs-delivery-options-summary=\"\">\n {label ? <span data-fs-delivery-options-summary-label=\"\">{label}</span> : null}\n {selectedOption ? (\n <OptionItemContext value={selectedOption}>\n <span data-fs-delivery-options-summary-value=\"\">\n <ShippingSimulatorOptionName />\n <span data-fs-delivery-options-summary-separator=\"\">{separator}</span>\n <ShippingSimulatorOptionPrice>\n {isFreeAmount(selectedOption.price.amount) ? format('freeLabel') : undefined}\n </ShippingSimulatorOptionPrice>\n </span>\n </OptionItemContext>\n ) : (\n <span data-fs-delivery-options-summary-placeholder=\"\">{format('placeholder')}</span>\n )}\n </span>\n );\n}\n\nexport function DeliveryOptionsList({ $content, $locale, className, children, ...props }: DeliveryOptionsListProps) {\n const { options, selectedOptionId, selectionError, selectOption } = useDeliveryOptions();\n const { format } = useMessageFormatter(DeliveryOptionsListContent, $content);\n const errorMessage = selectionError\n ? formatErrorCode(\n DeliveryOptionsListContent,\n DELIVERY_OPTIONS_LIST_ERROR_FIELDS,\n selectionError,\n format,\n 'genericErrorMessage',\n )\n : null;\n\n return (\n <DeliveryOptionsListBody\n {...props}\n className={className}\n options={options}\n selectedOptionId={selectedOptionId}\n selectionError={errorMessage}\n onSelectOption={selectOption}\n >\n {children}\n </DeliveryOptionsListBody>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ContentValue, MessageLocaleProp } from "../../core/dist/define-content-type.js";
|
|
1
2
|
import { ComponentDefinition } from "../../core/dist/define-component.js";
|
|
2
3
|
import "../../core/dist/index.js";
|
|
3
4
|
import { ShippingOption } from "../shipping-simulator/shipping-simulator.js";
|
|
@@ -5,7 +6,9 @@ import { ComponentActions } from "../../sdk/actions/types.js";
|
|
|
5
6
|
import { RawDeliveryOptionsData } from "./use-delivery-option-selection.js";
|
|
6
7
|
import { ComponentPropsWithRef } from "react";
|
|
7
8
|
//#region src/matter/delivery-options/delivery-options.d.ts
|
|
8
|
-
export type DeliveryOptionsRootProps = ComponentPropsWithRef<'div'> & {
|
|
9
|
+
export type DeliveryOptionsRootProps = ComponentPropsWithRef<'div'> & MessageLocaleProp & {
|
|
10
|
+
/** Words the selection error by its code. */
|
|
11
|
+
$content?: ContentValue<typeof DeliveryOptionsRootContent>;
|
|
9
12
|
/**
|
|
10
13
|
* Shipping slice forwarded by the reactive runtime (`ReactiveDataProvider`) — it is the value of
|
|
11
14
|
* the `shipping` top-level field on `DeliveryOptionsData on Query`, not the wrapping
|
|
@@ -25,7 +28,39 @@ export type DeliveryOptionsRootProps = ComponentPropsWithRef<'div'> & {
|
|
|
25
28
|
*/
|
|
26
29
|
mockOptions?: ShippingOption[];
|
|
27
30
|
};
|
|
31
|
+
export declare const DeliveryOptionsRootContent: {
|
|
32
|
+
readonly id: "delivery-options-root";
|
|
33
|
+
readonly title: "Delivery Options";
|
|
34
|
+
readonly description: "Messages shown when a delivery option selection is refused, one per error code the shopper can act on.";
|
|
35
|
+
readonly schema: {
|
|
36
|
+
readonly type: "object";
|
|
37
|
+
readonly additionalProperties: false;
|
|
38
|
+
readonly properties: {
|
|
39
|
+
readonly optionUnavailableMessage: {
|
|
40
|
+
readonly type: "string";
|
|
41
|
+
readonly title: "Option unavailable message";
|
|
42
|
+
readonly description: "Shown when the picked option is no longer offered for the cart.";
|
|
43
|
+
readonly format: "icu-message";
|
|
44
|
+
readonly messageSource: "This delivery option is no longer available. Choose another one.";
|
|
45
|
+
};
|
|
46
|
+
readonly missingAddressMessage: {
|
|
47
|
+
readonly type: "string";
|
|
48
|
+
readonly title: "Missing address message";
|
|
49
|
+
readonly description: "Shown when no delivery address is saved on the cart yet.";
|
|
50
|
+
readonly format: "icu-message";
|
|
51
|
+
readonly messageSource: "Enter a delivery address before choosing a delivery option.";
|
|
52
|
+
};
|
|
53
|
+
readonly genericErrorMessage: {
|
|
54
|
+
readonly type: "string";
|
|
55
|
+
readonly title: "Generic failure message";
|
|
56
|
+
readonly description: "Shown for a network failure and for every refusal the shopper cannot act on.";
|
|
57
|
+
readonly format: "icu-message";
|
|
58
|
+
readonly messageSource: "Unable to update the delivery option. Please try again.";
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
};
|
|
28
63
|
export declare const DeliveryOptionsRootDefinition: ComponentDefinition<DeliveryOptionsRootProps>;
|
|
29
|
-
export declare function DeliveryOptionsRoot({ $data, $actions: $actionsProp, mockOptions, className, children, ...props }: DeliveryOptionsRootProps): import("react/jsx-runtime").JSX.Element;
|
|
64
|
+
export declare function DeliveryOptionsRoot({ $content, $locale, $data, $actions: $actionsProp, mockOptions, className, children, ...props }: DeliveryOptionsRootProps): import("react/jsx-runtime").JSX.Element;
|
|
30
65
|
//#endregion
|
|
31
66
|
//# sourceMappingURL=delivery-options.d.ts.map
|
|
@@ -1,16 +1,31 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { defineComponent } from "../../core/dist/define-component.js";
|
|
3
|
+
import { defineContentType } from "../../core/dist/define-content-type.js";
|
|
3
4
|
import "../../core/dist/index.js";
|
|
5
|
+
import { useMessageFormatter } from "../../sdk/i18n/use-message-formatter.js";
|
|
4
6
|
import { useActionsOverride } from "../../sdk/actions/actions-override-context.js";
|
|
7
|
+
import { formatErrorCode } from "../../sdk/i18n/format-error-code.js";
|
|
5
8
|
import { RadioGroup, RadioRoot } from "../../particles/radio/radio.js";
|
|
6
9
|
import { OptionItemContext, ShippingSimulatorContext } from "../shipping-simulator/shipping-simulator.js";
|
|
7
10
|
import { useDeliveryOptionSelection } from "./use-delivery-option-selection.js";
|
|
8
11
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
//#region src/matter/delivery-options/delivery-options.tsx
|
|
13
|
+
/**
|
|
14
|
+
* The `DeliveryOptions` matter section (docs/storefront-core/reference-cart.md § Delivery, T3 of the Single Address
|
|
15
|
+
* Delivery epic). `DeliveryOptionsRoot` is a reactive Root over the persisted `Shipping` entity
|
|
16
|
+
* (Decision 1) that becomes the THIRD provider of the FSPG-832 option-leaf runtime contexts —
|
|
17
|
+
* `ShippingSimulatorContext` and the per-option `OptionItemContext` — alongside the two existing
|
|
18
|
+
* simulator Roots (Decision 2), so `ShippingSimulatorOption` / `OptionName` / `OptionEstimate` /
|
|
19
|
+
* `OptionPrice` / `OptionFreeBadge` render identically here with zero edits to those leaves.
|
|
20
|
+
* `children` is the per-option template, rendered once per option inside a `RadioRoot` (radio
|
|
21
|
+
* particle) whose group value is bound directly to `selectedOptionId` (Decision 5 — no local
|
|
22
|
+
* selection state); changing it fires the `shipping.selectOption` action. Fields the reused leaves
|
|
23
|
+
* do not read for this section (`postalCode`, `setPostalCode`, `submit`, `status`) are inert
|
|
24
|
+
* defaults, satisfying the shared context type without a simulation flow. Exception: while
|
|
25
|
+
* rendering `mockOptions` (no real data), selection is local-only and never dispatches the action —
|
|
26
|
+
* see `mockOptions` on `DeliveryOptionsRootProps`.
|
|
27
|
+
*/
|
|
28
|
+
const fragment = `
|
|
14
29
|
fragment DeliveryOptionsData on Query {
|
|
15
30
|
shipping {
|
|
16
31
|
id
|
|
@@ -34,7 +49,45 @@ const DeliveryOptionsRootDefinition = defineComponent({
|
|
|
34
49
|
selectedOptionId
|
|
35
50
|
}
|
|
36
51
|
}
|
|
37
|
-
|
|
52
|
+
`;
|
|
53
|
+
const DeliveryOptionsRootContent = defineContentType({
|
|
54
|
+
id: "delivery-options-root",
|
|
55
|
+
title: "Delivery Options",
|
|
56
|
+
description: "Messages shown when a delivery option selection is refused, one per error code the shopper can act on.",
|
|
57
|
+
schema: {
|
|
58
|
+
type: "object",
|
|
59
|
+
additionalProperties: false,
|
|
60
|
+
properties: {
|
|
61
|
+
optionUnavailableMessage: {
|
|
62
|
+
type: "string",
|
|
63
|
+
title: "Option unavailable message",
|
|
64
|
+
description: "Shown when the picked option is no longer offered for the cart.",
|
|
65
|
+
format: "icu-message",
|
|
66
|
+
messageSource: "This delivery option is no longer available. Choose another one."
|
|
67
|
+
},
|
|
68
|
+
missingAddressMessage: {
|
|
69
|
+
type: "string",
|
|
70
|
+
title: "Missing address message",
|
|
71
|
+
description: "Shown when no delivery address is saved on the cart yet.",
|
|
72
|
+
format: "icu-message",
|
|
73
|
+
messageSource: "Enter a delivery address before choosing a delivery option."
|
|
74
|
+
},
|
|
75
|
+
genericErrorMessage: {
|
|
76
|
+
type: "string",
|
|
77
|
+
title: "Generic failure message",
|
|
78
|
+
description: "Shown for a network failure and for every refusal the shopper cannot act on.",
|
|
79
|
+
format: "icu-message",
|
|
80
|
+
messageSource: "Unable to update the delivery option. Please try again."
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
const DeliveryOptionsRootDefinition = defineComponent({
|
|
86
|
+
name: "DeliveryOptionsRoot",
|
|
87
|
+
importPath: "@vtex/faststore/components",
|
|
88
|
+
component: DeliveryOptionsRoot,
|
|
89
|
+
content: DeliveryOptionsRootContent,
|
|
90
|
+
fragment,
|
|
38
91
|
fetchStrategy: "reactive",
|
|
39
92
|
actions: { shipping: ["selectOption"] },
|
|
40
93
|
editor: {
|
|
@@ -46,8 +99,16 @@ const DeliveryOptionsRootDefinition = defineComponent({
|
|
|
46
99
|
label: "Mock options (local/dev fallback, ignored once real data has options)"
|
|
47
100
|
} },
|
|
48
101
|
providesContext: ["shipping-simulator", "shipping-simulator-option"],
|
|
49
|
-
guideline: "Root for the whole-cart delivery-option list at the delivery step: renders Shipping.options as a radio group bound to selectedOptionId, reusing the FSPG-832 option leaves (ShippingSimulatorOption, OptionName, OptionEstimate, OptionPrice, OptionFreeBadge) as the per-option template placed as children. Selecting a row dispatches $actions.shipping.selectOption. No local selection state — the group value is always the server selectedOptionId. mockOptions is a local/dev-only fallback rendered when the real fetch has no options; omit it in production."
|
|
102
|
+
guideline: "Root for the whole-cart delivery-option list at the delivery step: renders Shipping.options as a radio group bound to selectedOptionId, reusing the FSPG-832 option leaves (ShippingSimulatorOption, OptionName, OptionEstimate, OptionPrice, OptionFreeBadge) as the per-option template placed as children. Selecting a row dispatches $actions.shipping.selectOption; a refusal shows inline, worded by its code from its $content (genericErrorMessage for a network failure, every refusal the shopper cannot act on, and an unknown code). No local selection state — the group value is always the server selectedOptionId. mockOptions is a local/dev-only fallback rendered when the real fetch has no options; omit it in production."
|
|
50
103
|
});
|
|
104
|
+
/** The message for each code a selection can resolve. A code this map does not know shows genericErrorMessage. */
|
|
105
|
+
const DELIVERY_OPTIONS_ROOT_ERROR_FIELDS = {
|
|
106
|
+
OPTION_UNAVAILABLE: "optionUnavailableMessage",
|
|
107
|
+
MISSING_SHIPPING_ADDRESS: "missingAddressMessage",
|
|
108
|
+
MISSING_CART_CONTEXT: "genericErrorMessage",
|
|
109
|
+
CART_NOT_FOUND: "genericErrorMessage",
|
|
110
|
+
NETWORK_ERROR: "genericErrorMessage"
|
|
111
|
+
};
|
|
51
112
|
/**
|
|
52
113
|
* The list body shared by `DeliveryOptionsRoot` (always-open) and `DeliveryOptionsList` (the
|
|
53
114
|
* collapsed-surface body under `DeliveryOptionsController`): the inline selection error plus the
|
|
@@ -62,11 +123,11 @@ function DeliveryOptionsListBody({ options, selectedOptionId, selectionError, on
|
|
|
62
123
|
...props,
|
|
63
124
|
className,
|
|
64
125
|
"data-fs-delivery-options": "",
|
|
65
|
-
children: [selectionError ? /* @__PURE__ */ jsx("div", {
|
|
126
|
+
children: [selectionError === null ? null : /* @__PURE__ */ jsx("div", {
|
|
66
127
|
role: "alert",
|
|
67
128
|
"data-fs-delivery-options-error": "",
|
|
68
129
|
children: selectionError
|
|
69
|
-
})
|
|
130
|
+
}), options.length > 0 ? /* @__PURE__ */ jsx(RadioGroup, {
|
|
70
131
|
value: selectedOptionId ?? "",
|
|
71
132
|
onValueChange: onSelectOption,
|
|
72
133
|
children: options.map((option) => /* @__PURE__ */ jsx(OptionItemContext, {
|
|
@@ -79,13 +140,15 @@ function DeliveryOptionsListBody({ options, selectedOptionId, selectionError, on
|
|
|
79
140
|
}) : null]
|
|
80
141
|
});
|
|
81
142
|
}
|
|
82
|
-
function DeliveryOptionsRoot({ $data, $actions: $actionsProp, mockOptions, className, children, ...props }) {
|
|
143
|
+
function DeliveryOptionsRoot({ $content, $locale, $data, $actions: $actionsProp, mockOptions, className, children, ...props }) {
|
|
83
144
|
const $actions = useActionsOverride($actionsProp);
|
|
84
145
|
const { options, selectedOptionId, selectionError, selectOption, contextValue } = useDeliveryOptionSelection({
|
|
85
146
|
$data,
|
|
86
147
|
$actions,
|
|
87
148
|
mockOptions
|
|
88
149
|
});
|
|
150
|
+
const { format } = useMessageFormatter(DeliveryOptionsRootContent, $content);
|
|
151
|
+
const errorMessage = selectionError ? formatErrorCode(DeliveryOptionsRootContent, DELIVERY_OPTIONS_ROOT_ERROR_FIELDS, selectionError, format, "genericErrorMessage") : null;
|
|
89
152
|
return /* @__PURE__ */ jsx(ShippingSimulatorContext, {
|
|
90
153
|
value: contextValue,
|
|
91
154
|
children: /* @__PURE__ */ jsx(DeliveryOptionsListBody, {
|
|
@@ -93,13 +156,13 @@ function DeliveryOptionsRoot({ $data, $actions: $actionsProp, mockOptions, class
|
|
|
93
156
|
className,
|
|
94
157
|
options,
|
|
95
158
|
selectedOptionId,
|
|
96
|
-
selectionError,
|
|
159
|
+
selectionError: errorMessage,
|
|
97
160
|
onSelectOption: (optionId) => selectOption(optionId),
|
|
98
161
|
children
|
|
99
162
|
})
|
|
100
163
|
});
|
|
101
164
|
}
|
|
102
165
|
//#endregion
|
|
103
|
-
export { DeliveryOptionsListBody, DeliveryOptionsRoot, DeliveryOptionsRootDefinition };
|
|
166
|
+
export { DELIVERY_OPTIONS_ROOT_ERROR_FIELDS, DeliveryOptionsListBody, DeliveryOptionsRoot, DeliveryOptionsRootContent, DeliveryOptionsRootDefinition };
|
|
104
167
|
|
|
105
168
|
//# sourceMappingURL=delivery-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-options.js","names":[],"sources":["../../../src/matter/delivery-options/delivery-options.tsx"],"sourcesContent":["'use client';\n\nimport { defineComponent } from '@vtex/fs-core';\nimport type { ComponentPropsWithRef } from 'react';\nimport { RadioGroup, RadioRoot } from '../../particles/radio/radio.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport {\n OptionItemContext,\n type ShippingOption,\n ShippingSimulatorContext,\n} from '../shipping-simulator/shipping-simulator.js';\nimport { type RawDeliveryOptionsData, useDeliveryOptionSelection } from './use-delivery-option-selection.js';\n\n/**\n * The `DeliveryOptions` matter section (docs/storefront-core/reference-cart.md § Delivery, T3 of the Single Address\n * Delivery epic). `DeliveryOptionsRoot` is a reactive Root over the persisted `Shipping` entity\n * (Decision 1) that becomes the THIRD provider of the FSPG-832 option-leaf runtime contexts —\n * `ShippingSimulatorContext` and the per-option `OptionItemContext` — alongside the two existing\n * simulator Roots (Decision 2), so `ShippingSimulatorOption` / `OptionName` / `OptionEstimate` /\n * `OptionPrice` / `OptionFreeBadge` render identically here with zero edits to those leaves.\n * `children` is the per-option template, rendered once per option inside a `RadioRoot` (radio\n * particle) whose group value is bound directly to `selectedOptionId` (Decision 5 — no local\n * selection state); changing it fires the `shipping.selectOption` action. Fields the reused leaves\n * do not read for this section (`postalCode`, `setPostalCode`, `submit`, `status`) are inert\n * defaults, satisfying the shared context type without a simulation flow. Exception: while\n * rendering `mockOptions` (no real data), selection is local-only and never dispatches the action —\n * see `mockOptions` on `DeliveryOptionsRootProps`.\n */\n\n// ---------------------------------------------------------------------------\n// GraphQL Fragment — raw template literal, matching the ShippingSimulator matter's own convention\n// (not yet migrated to the codegen `graphql()` pipeline; see codegen.ts's documents glob comment).\n//\n// Selects `shipping { id ... }` (not shown in the spec's fragment snippet) so Apollo's\n// InMemoryCache normalizes `Shipping` by id — required for `shippingOptionSelect`'s returned\n// `shipping` to update the same cache entity this fragment reads (Decision 1/Decision 5's\n// \"reactive cache, no local state\" only holds if both sides normalize to the same entity).\n// ---------------------------------------------------------------------------\n\nconst fragment = /* GraphQL */ `\n fragment DeliveryOptionsData on Query {\n shipping {\n id\n options {\n id\n name\n channel\n shippingEstimate {\n value\n unit\n }\n price {\n amount\n currencyCode\n }\n listPrice {\n amount\n currencyCode\n }\n }\n selectedOptionId\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport type DeliveryOptionsRootProps = ComponentPropsWithRef<'div'> & {\n /**\n * Shipping slice forwarded by the reactive runtime (`ReactiveDataProvider`) — it is the value of\n * the `shipping` top-level field on `DeliveryOptionsData on Query`, not the wrapping\n * `{ shipping: … }` shape. Receives `null` when shipping has not yet resolved.\n */\n $data?: RawDeliveryOptionsData | null;\n /** Compiler-injected action surface; carries `shipping.selectOption`. */\n $actions?: ComponentActions;\n /**\n * Local/dev fallback rows, used only when the reactive fetch resolves no options — real data\n * always wins the moment it has any. `Shipping.options` is non-nullable, so a genuinely empty\n * cart is indistinguishable from \"no data yet\" at this prop's shape; setting `mockOptions` is an\n * explicit per-page opt-in that accepts showing these rows in both cases. Omit on production\n * pages. Selecting a mock row is handled entirely with local state and never calls\n * `$actions.shipping.selectOption` — there is no real cart/address for the real mutation to act\n * on, so dispatching it would only ever surface a domain error (e.g. `MISSING_SHIPPING_ADDRESS`).\n */\n mockOptions?: ShippingOption[];\n};\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const DeliveryOptionsRootDefinition = defineComponent<DeliveryOptionsRootProps>({\n name: 'DeliveryOptionsRoot',\n importPath: '@vtex/faststore/components',\n component: DeliveryOptionsRoot,\n fragment,\n fetchStrategy: 'reactive',\n actions: { shipping: ['selectOption'] },\n editor: { label: 'Delivery Options', category: 'commerce' },\n schema: {\n mockOptions: { type: 'array', label: 'Mock options (local/dev fallback, ignored once real data has options)' },\n },\n // Re-provides the reused option leaves' runtime contexts (Decision 2): the inner\n // `shipping-simulator-option` token is required — the option leaves compose as direct children\n // here with no `ShippingSimulatorOptions` node between them — and the outer `shipping-simulator`\n // token reflects the `ShippingSimulatorContext` this Root also provides at runtime.\n providesContext: ['shipping-simulator', 'shipping-simulator-option'],\n guideline:\n 'Root for the whole-cart delivery-option list at the delivery step: renders Shipping.options as a radio group bound to selectedOptionId, reusing the FSPG-832 option leaves (ShippingSimulatorOption, OptionName, OptionEstimate, OptionPrice, OptionFreeBadge) as the per-option template placed as children. Selecting a row dispatches $actions.shipping.selectOption. No local selection state — the group value is always the server selectedOptionId. mockOptions is a local/dev-only fallback rendered when the real fetch has no options; omit it in production.',\n});\n\n// ---------------------------------------------------------------------------\n// Shared list body\n// ---------------------------------------------------------------------------\n\nexport type DeliveryOptionsListBodyProps = ComponentPropsWithRef<'div'> & {\n /** Resolved option rows (real or mock), supplied by the caller's selection engine. */\n options: ShippingOption[];\n /** Group value bound to the radio group; `null` renders nothing selected. */\n selectedOptionId: string | null;\n /** First `userError` message from the latest selection, or `null`; rendered as `role=\"alert\"`. */\n selectionError: string | null;\n /** Dispatched on a row change with the picked option id. */\n onSelectOption: (optionId: string) => void;\n};\n\n/**\n * The list body shared by `DeliveryOptionsRoot` (always-open) and `DeliveryOptionsList` (the\n * collapsed-surface body under `DeliveryOptionsController`): the inline selection error plus the\n * radio group of options, reusing the FSPG-832 option leaves as the per-option `children` template.\n * It owns no data or selection engine — the caller resolves `options` / `selectedOptionId` /\n * `selectionError` and supplies the `onSelect` dispatch, so both surfaces render through one\n * component and cannot drift. Not registered: it renders no independently placeable part of its own\n * (the `data-fs-delivery-options` container hook and the reused leaves are the addressable parts).\n */\nexport function DeliveryOptionsListBody({\n options,\n selectedOptionId,\n selectionError,\n onSelectOption,\n className,\n children,\n ...props\n}: DeliveryOptionsListBodyProps) {\n return (\n <div {...props} className={className} data-fs-delivery-options=\"\">\n {selectionError ? (\n <div role=\"alert\" data-fs-delivery-options-error=\"\">\n {selectionError}\n </div>\n ) : null}\n {options.length > 0 ? (\n <RadioGroup value={selectedOptionId ?? ''} onValueChange={onSelectOption}>\n {options.map((option) => (\n <OptionItemContext key={option.id} value={option}>\n <RadioRoot value={option.id}>{children}</RadioRoot>\n </OptionItemContext>\n ))}\n </RadioGroup>\n ) : null}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport function DeliveryOptionsRoot({\n $data,\n $actions: $actionsProp,\n mockOptions,\n className,\n children,\n ...props\n}: DeliveryOptionsRootProps) {\n const $actions = useActionsOverride($actionsProp);\n const { options, selectedOptionId, selectionError, selectOption, contextValue } = useDeliveryOptionSelection({\n $data,\n $actions,\n mockOptions,\n });\n\n return (\n <ShippingSimulatorContext value={contextValue}>\n <DeliveryOptionsListBody\n {...props}\n className={className}\n options={options}\n selectedOptionId={selectedOptionId}\n selectionError={selectionError}\n onSelectOption={(optionId) => selectOption(optionId)}\n >\n {children}\n </DeliveryOptionsListBody>\n </ShippingSimulatorContext>\n );\n}\n"],"mappings":";;;;;;;;AA+FA,MAAa,gCAAgC,gBAA0C;CACrF,MAAM;CACN,YAAY;CACZ,WAAW;CACX;;;;;;;;;;;;;;;;;;;;;;;;;CACA,eAAe;CACf,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE;CACtC,QAAQ;EAAE,OAAO;EAAoB,UAAU;CAAW;CAC1D,QAAQ,EACN,aAAa;EAAE,MAAM;EAAS,OAAO;CAAwE,EAC/G;CAKA,iBAAiB,CAAC,sBAAsB,2BAA2B;CACnE,WACE;AACJ,CAAC;;;;;;;;;;AA0BD,SAAgB,wBAAwB,EACtC,SACA,kBACA,gBACA,gBACA,WACA,UACA,GAAG,SAC4B;CAC/B,OACE,qBAAC,OAAD;EAAK,GAAI;EAAkB;EAAW,4BAAyB;EAA/D,UAAA,CACG,iBACC,oBAAC,OAAD;GAAK,MAAK;GAAQ,kCAA+B;GAC9C,UAAA;EACE,CAAA,IACH,MACH,QAAQ,SAAS,IAChB,oBAAC,YAAD;GAAY,OAAO,oBAAoB;GAAI,eAAe;GACvD,UAAA,QAAQ,KAAK,WACZ,oBAAC,mBAAD;IAAmC,OAAO;IACxC,UAAA,oBAAC,WAAD;KAAW,OAAO,OAAO;KAAK;IAAoB,CAAA;GACjC,GAFK,OAAO,EAEZ,CACpB;EACS,CAAA,IACV,IACD;;AAET;AAMA,SAAgB,oBAAoB,EAClC,OACA,UAAU,cACV,aACA,WACA,UACA,GAAG,SACwB;CAC3B,MAAM,WAAW,mBAAmB,YAAY;CAChD,MAAM,EAAE,SAAS,kBAAkB,gBAAgB,cAAc,iBAAiB,2BAA2B;EAC3G;EACA;EACA;CACF,CAAC;CAED,OACE,oBAAC,0BAAD;EAA0B,OAAO;EAC/B,UAAA,oBAAC,yBAAD;GACE,GAAI;GACO;GACF;GACS;GACF;GAChB,iBAAiB,aAAa,aAAa,QAAQ;GAElD;EACsB,CAAA;CACD,CAAA;AAE9B"}
|
|
1
|
+
{"version":3,"file":"delivery-options.js","names":[],"sources":["../../../src/matter/delivery-options/delivery-options.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ContentValue,\n defineComponent,\n defineContentType,\n type MessageFieldName,\n type MessageLocaleProp,\n} from '@vtex/fs-core';\nimport type { ComponentPropsWithRef } from 'react';\nimport { RadioGroup, RadioRoot } from '../../particles/radio/radio.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { formatErrorCode } from '../../sdk/i18n/format-error-code.js';\nimport { useMessageFormatter } from '../../sdk/i18n/use-message-formatter.js';\nimport {\n OptionItemContext,\n type ShippingOption,\n ShippingSimulatorContext,\n} from '../shipping-simulator/shipping-simulator.js';\nimport {\n type DeliveryOptionSelectErrorCode,\n type RawDeliveryOptionsData,\n useDeliveryOptionSelection,\n} from './use-delivery-option-selection.js';\n\n/**\n * The `DeliveryOptions` matter section (docs/storefront-core/reference-cart.md § Delivery, T3 of the Single Address\n * Delivery epic). `DeliveryOptionsRoot` is a reactive Root over the persisted `Shipping` entity\n * (Decision 1) that becomes the THIRD provider of the FSPG-832 option-leaf runtime contexts —\n * `ShippingSimulatorContext` and the per-option `OptionItemContext` — alongside the two existing\n * simulator Roots (Decision 2), so `ShippingSimulatorOption` / `OptionName` / `OptionEstimate` /\n * `OptionPrice` / `OptionFreeBadge` render identically here with zero edits to those leaves.\n * `children` is the per-option template, rendered once per option inside a `RadioRoot` (radio\n * particle) whose group value is bound directly to `selectedOptionId` (Decision 5 — no local\n * selection state); changing it fires the `shipping.selectOption` action. Fields the reused leaves\n * do not read for this section (`postalCode`, `setPostalCode`, `submit`, `status`) are inert\n * defaults, satisfying the shared context type without a simulation flow. Exception: while\n * rendering `mockOptions` (no real data), selection is local-only and never dispatches the action —\n * see `mockOptions` on `DeliveryOptionsRootProps`.\n */\n\n// ---------------------------------------------------------------------------\n// GraphQL Fragment — raw template literal, matching the ShippingSimulator matter's own convention\n// (not yet migrated to the codegen `graphql()` pipeline; see codegen.ts's documents glob comment).\n//\n// Selects `shipping { id ... }` (not shown in the spec's fragment snippet) so Apollo's\n// InMemoryCache normalizes `Shipping` by id — required for `shippingOptionSelect`'s returned\n// `shipping` to update the same cache entity this fragment reads (Decision 1/Decision 5's\n// \"reactive cache, no local state\" only holds if both sides normalize to the same entity).\n// ---------------------------------------------------------------------------\n\nconst fragment = /* GraphQL */ `\n fragment DeliveryOptionsData on Query {\n shipping {\n id\n options {\n id\n name\n channel\n shippingEstimate {\n value\n unit\n }\n price {\n amount\n currencyCode\n }\n listPrice {\n amount\n currencyCode\n }\n }\n selectedOptionId\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport type DeliveryOptionsRootProps = ComponentPropsWithRef<'div'> &\n MessageLocaleProp & {\n /** Words the selection error by its code. */\n $content?: ContentValue<typeof DeliveryOptionsRootContent>;\n /**\n * Shipping slice forwarded by the reactive runtime (`ReactiveDataProvider`) — it is the value of\n * the `shipping` top-level field on `DeliveryOptionsData on Query`, not the wrapping\n * `{ shipping: … }` shape. Receives `null` when shipping has not yet resolved.\n */\n $data?: RawDeliveryOptionsData | null;\n /** Compiler-injected action surface; carries `shipping.selectOption`. */\n $actions?: ComponentActions;\n /**\n * Local/dev fallback rows, used only when the reactive fetch resolves no options — real data\n * always wins the moment it has any. `Shipping.options` is non-nullable, so a genuinely empty\n * cart is indistinguishable from \"no data yet\" at this prop's shape; setting `mockOptions` is an\n * explicit per-page opt-in that accepts showing these rows in both cases. Omit on production\n * pages. Selecting a mock row is handled entirely with local state and never calls\n * `$actions.shipping.selectOption` — there is no real cart/address for the real mutation to act\n * on, so dispatching it would only ever surface a domain error (e.g. `MISSING_SHIPPING_ADDRESS`).\n */\n mockOptions?: ShippingOption[];\n };\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const DeliveryOptionsRootContent = defineContentType({\n id: 'delivery-options-root',\n title: 'Delivery Options',\n description: 'Messages shown when a delivery option selection is refused, one per error code the shopper can act on.',\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n optionUnavailableMessage: {\n type: 'string',\n title: 'Option unavailable message',\n description: 'Shown when the picked option is no longer offered for the cart.',\n format: 'icu-message',\n messageSource: 'This delivery option is no longer available. Choose another one.',\n },\n missingAddressMessage: {\n type: 'string',\n title: 'Missing address message',\n description: 'Shown when no delivery address is saved on the cart yet.',\n format: 'icu-message',\n messageSource: 'Enter a delivery address before choosing a delivery option.',\n },\n genericErrorMessage: {\n type: 'string',\n title: 'Generic failure message',\n description: 'Shown for a network failure and for every refusal the shopper cannot act on.',\n format: 'icu-message',\n messageSource: 'Unable to update the delivery option. Please try again.',\n },\n },\n },\n});\n\nexport const DeliveryOptionsRootDefinition = defineComponent<DeliveryOptionsRootProps>({\n name: 'DeliveryOptionsRoot',\n importPath: '@vtex/faststore/components',\n component: DeliveryOptionsRoot,\n content: DeliveryOptionsRootContent,\n fragment,\n fetchStrategy: 'reactive',\n actions: { shipping: ['selectOption'] },\n editor: { label: 'Delivery Options', category: 'commerce' },\n schema: {\n mockOptions: { type: 'array', label: 'Mock options (local/dev fallback, ignored once real data has options)' },\n },\n // Re-provides the reused option leaves' runtime contexts (Decision 2): the inner\n // `shipping-simulator-option` token is required — the option leaves compose as direct children\n // here with no `ShippingSimulatorOptions` node between them — and the outer `shipping-simulator`\n // token reflects the `ShippingSimulatorContext` this Root also provides at runtime.\n providesContext: ['shipping-simulator', 'shipping-simulator-option'],\n guideline:\n 'Root for the whole-cart delivery-option list at the delivery step: renders Shipping.options as a radio group bound to selectedOptionId, reusing the FSPG-832 option leaves (ShippingSimulatorOption, OptionName, OptionEstimate, OptionPrice, OptionFreeBadge) as the per-option template placed as children. Selecting a row dispatches $actions.shipping.selectOption; a refusal shows inline, worded by its code from its $content (genericErrorMessage for a network failure, every refusal the shopper cannot act on, and an unknown code). No local selection state — the group value is always the server selectedOptionId. mockOptions is a local/dev-only fallback rendered when the real fetch has no options; omit it in production.',\n});\n\n// ---------------------------------------------------------------------------\n// Shared list body\n// ---------------------------------------------------------------------------\n\n/** The message for each code a selection can resolve. A code this map does not know shows genericErrorMessage. */\nexport const DELIVERY_OPTIONS_ROOT_ERROR_FIELDS = {\n OPTION_UNAVAILABLE: 'optionUnavailableMessage',\n MISSING_SHIPPING_ADDRESS: 'missingAddressMessage',\n MISSING_CART_CONTEXT: 'genericErrorMessage',\n CART_NOT_FOUND: 'genericErrorMessage',\n NETWORK_ERROR: 'genericErrorMessage',\n} as const satisfies Record<DeliveryOptionSelectErrorCode, MessageFieldName<typeof DeliveryOptionsRootContent>>;\n\nexport type DeliveryOptionsListBodyProps = ComponentPropsWithRef<'div'> & {\n /** Resolved option rows (real or mock), supplied by the caller's selection engine. */\n options: ShippingOption[];\n /** Group value bound to the radio group; `null` renders nothing selected. */\n selectedOptionId: string | null;\n /** The caller's wording of the latest selection's first `userError`, or `null`; rendered as `role=\"alert\"`. */\n selectionError: string | null;\n /** Dispatched on a row change with the picked option id. */\n onSelectOption: (optionId: string) => void;\n};\n\n/**\n * The list body shared by `DeliveryOptionsRoot` (always-open) and `DeliveryOptionsList` (the\n * collapsed-surface body under `DeliveryOptionsController`): the inline selection error plus the\n * radio group of options, reusing the FSPG-832 option leaves as the per-option `children` template.\n * It owns no data or selection engine — the caller resolves `options` / `selectedOptionId` /\n * `selectionError` and supplies the `onSelect` dispatch, so both surfaces render through one\n * component and cannot drift. Not registered: it renders no independently placeable part of its own\n * (the `data-fs-delivery-options` container hook and the reused leaves are the addressable parts).\n */\nexport function DeliveryOptionsListBody({\n options,\n selectedOptionId,\n selectionError,\n onSelectOption,\n className,\n children,\n ...props\n}: DeliveryOptionsListBodyProps) {\n return (\n <div {...props} className={className} data-fs-delivery-options=\"\">\n {selectionError === null ? null : (\n <div role=\"alert\" data-fs-delivery-options-error=\"\">\n {selectionError}\n </div>\n )}\n {options.length > 0 ? (\n <RadioGroup value={selectedOptionId ?? ''} onValueChange={onSelectOption}>\n {options.map((option) => (\n <OptionItemContext key={option.id} value={option}>\n <RadioRoot value={option.id}>{children}</RadioRoot>\n </OptionItemContext>\n ))}\n </RadioGroup>\n ) : null}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport function DeliveryOptionsRoot({\n $content,\n $locale,\n $data,\n $actions: $actionsProp,\n mockOptions,\n className,\n children,\n ...props\n}: DeliveryOptionsRootProps) {\n const $actions = useActionsOverride($actionsProp);\n const { options, selectedOptionId, selectionError, selectOption, contextValue } = useDeliveryOptionSelection({\n $data,\n $actions,\n mockOptions,\n });\n const { format } = useMessageFormatter(DeliveryOptionsRootContent, $content);\n const errorMessage = selectionError\n ? formatErrorCode(\n DeliveryOptionsRootContent,\n DELIVERY_OPTIONS_ROOT_ERROR_FIELDS,\n selectionError,\n format,\n 'genericErrorMessage',\n )\n : null;\n\n return (\n <ShippingSimulatorContext value={contextValue}>\n <DeliveryOptionsListBody\n {...props}\n className={className}\n options={options}\n selectedOptionId={selectedOptionId}\n selectionError={errorMessage}\n onSelectOption={(optionId) => selectOption(optionId)}\n >\n {children}\n </DeliveryOptionsListBody>\n </ShippingSimulatorContext>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDA,MAAM,WAAyB;;;;;;;;;;;;;;;;;;;;;;;;;AA0D/B,MAAa,6BAA6B,kBAAkB;CAC1D,IAAI;CACJ,OAAO;CACP,aAAa;CACb,QAAQ;EACN,MAAM;EACN,sBAAsB;EACtB,YAAY;GACV,0BAA0B;IACxB,MAAM;IACN,OAAO;IACP,aAAa;IACb,QAAQ;IACR,eAAe;GACjB;GACA,uBAAuB;IACrB,MAAM;IACN,OAAO;IACP,aAAa;IACb,QAAQ;IACR,eAAe;GACjB;GACA,qBAAqB;IACnB,MAAM;IACN,OAAO;IACP,aAAa;IACb,QAAQ;IACR,eAAe;GACjB;EACF;CACF;AACF,CAAC;AAED,MAAa,gCAAgC,gBAA0C;CACrF,MAAM;CACN,YAAY;CACZ,WAAW;CACX,SAAS;CACT;CACA,eAAe;CACf,SAAS,EAAE,UAAU,CAAC,cAAc,EAAE;CACtC,QAAQ;EAAE,OAAO;EAAoB,UAAU;CAAW;CAC1D,QAAQ,EACN,aAAa;EAAE,MAAM;EAAS,OAAO;CAAwE,EAC/G;CAKA,iBAAiB,CAAC,sBAAsB,2BAA2B;CACnE,WACE;AACJ,CAAC;;AAOD,MAAa,qCAAqC;CAChD,oBAAoB;CACpB,0BAA0B;CAC1B,sBAAsB;CACtB,gBAAgB;CAChB,eAAe;AACjB;;;;;;;;;;AAsBA,SAAgB,wBAAwB,EACtC,SACA,kBACA,gBACA,gBACA,WACA,UACA,GAAG,SAC4B;CAC/B,OACE,qBAAC,OAAD;EAAK,GAAI;EAAkB;EAAW,4BAAyB;EAA/D,UAAA,CACG,mBAAmB,OAAO,OACzB,oBAAC,OAAD;GAAK,MAAK;GAAQ,kCAA+B;GAC9C,UAAA;EACE,CAAA,GAEN,QAAQ,SAAS,IAChB,oBAAC,YAAD;GAAY,OAAO,oBAAoB;GAAI,eAAe;GACvD,UAAA,QAAQ,KAAK,WACZ,oBAAC,mBAAD;IAAmC,OAAO;IACxC,UAAA,oBAAC,WAAD;KAAW,OAAO,OAAO;KAAK;IAAoB,CAAA;GACjC,GAFK,OAAO,EAEZ,CACpB;EACS,CAAA,IACV,IACD;;AAET;AAMA,SAAgB,oBAAoB,EAClC,UACA,SACA,OACA,UAAU,cACV,aACA,WACA,UACA,GAAG,SACwB;CAC3B,MAAM,WAAW,mBAAmB,YAAY;CAChD,MAAM,EAAE,SAAS,kBAAkB,gBAAgB,cAAc,iBAAiB,2BAA2B;EAC3G;EACA;EACA;CACF,CAAC;CACD,MAAM,EAAE,WAAW,oBAAoB,4BAA4B,QAAQ;CAC3E,MAAM,eAAe,iBACjB,gBACE,4BACA,oCACA,gBACA,QACA,qBACF,IACA;CAEJ,OACE,oBAAC,0BAAD;EAA0B,OAAO;EAC/B,UAAA,oBAAC,yBAAD;GACE,GAAI;GACO;GACF;GACS;GAClB,gBAAgB;GAChB,iBAAiB,aAAa,aAAa,QAAQ;GAElD;EACsB,CAAA;CACD,CAAA;AAE9B"}
|