@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,183 +1,183 @@
|
|
|
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";
|
|
4
|
-
import {
|
|
5
|
+
import { useMessageFormatter } from "../../sdk/i18n/use-message-formatter.js";
|
|
6
|
+
import { isValidEmail } from "../../particles/email-field/email-field.js";
|
|
5
7
|
import { useActionsOverride } from "../../sdk/actions/actions-override-context.js";
|
|
6
|
-
import { useDataOverride } from "../../sdk/data/data-override-context.js";
|
|
7
8
|
import { useSession } from "../session/session.js";
|
|
8
9
|
import { Button } from "../../particles/button/button.js";
|
|
10
|
+
import { useSignIn } from "../sign-in/sign-in.js";
|
|
11
|
+
import { useSignInDisclosureOpen } from "../sign-in-disclosure/sign-in-disclosure.js";
|
|
9
12
|
import { PasswordField } from "../../particles/password-field/password-field.js";
|
|
10
|
-
import { useEffect, useState } from "react";
|
|
13
|
+
import { useEffect, useRef, useState } from "react";
|
|
11
14
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
15
|
//#region src/matter/sign-in-form/sign-in-form.tsx
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
const SignInFormContent = defineContentType({
|
|
17
|
+
id: "sign-in-form",
|
|
18
|
+
title: "Sign In Form",
|
|
19
|
+
description: "Labels and error messages of the password sign-in step.",
|
|
20
|
+
schema: {
|
|
21
|
+
type: "object",
|
|
22
|
+
additionalProperties: false,
|
|
23
|
+
properties: {
|
|
24
|
+
passwordLabel: {
|
|
25
|
+
type: "string",
|
|
26
|
+
title: "Password label",
|
|
27
|
+
format: "icu-message",
|
|
28
|
+
messageSource: "Password"
|
|
29
|
+
},
|
|
30
|
+
showPasswordLabel: {
|
|
31
|
+
type: "string",
|
|
32
|
+
title: "Show password label",
|
|
33
|
+
format: "icu-message",
|
|
34
|
+
messageSource: "Show password"
|
|
35
|
+
},
|
|
36
|
+
hidePasswordLabel: {
|
|
37
|
+
type: "string",
|
|
38
|
+
title: "Hide password label",
|
|
39
|
+
format: "icu-message",
|
|
40
|
+
messageSource: "Hide password"
|
|
41
|
+
},
|
|
42
|
+
submitLabel: {
|
|
43
|
+
type: "string",
|
|
44
|
+
title: "Submit label",
|
|
45
|
+
format: "icu-message",
|
|
46
|
+
messageSource: "Sign In"
|
|
47
|
+
},
|
|
48
|
+
passwordRequiredMessage: {
|
|
49
|
+
type: "string",
|
|
50
|
+
title: "Password required message",
|
|
51
|
+
format: "icu-message",
|
|
52
|
+
messageSource: "Enter your password."
|
|
53
|
+
},
|
|
54
|
+
invalidCredentialsMessage: {
|
|
55
|
+
type: "string",
|
|
56
|
+
title: "Invalid credentials message",
|
|
57
|
+
format: "icu-message",
|
|
58
|
+
messageSource: "Incorrect email or password. Please try again."
|
|
59
|
+
},
|
|
60
|
+
blockedMessage: {
|
|
61
|
+
type: "string",
|
|
62
|
+
title: "Blocked account message",
|
|
63
|
+
format: "icu-message",
|
|
64
|
+
messageSource: "Access to this account is temporarily blocked. Please try again later."
|
|
65
|
+
},
|
|
66
|
+
networkErrorMessage: {
|
|
67
|
+
type: "string",
|
|
68
|
+
title: "Network error message",
|
|
69
|
+
format: "icu-message",
|
|
70
|
+
messageSource: "Unable to complete the request. Please try again."
|
|
71
|
+
},
|
|
72
|
+
genericErrorMessage: {
|
|
73
|
+
type: "string",
|
|
74
|
+
title: "Generic error message",
|
|
75
|
+
format: "icu-message",
|
|
76
|
+
messageSource: "Unable to sign in. Please try again."
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
22
81
|
/**
|
|
23
|
-
* Maps the first resolved SessionUserError to
|
|
24
|
-
* ACCESS_CODE_SEND_LIMIT, and MISSING_AUTH_CONTEXT are contractually unreachable
|
|
25
|
-
* loginWithPassword but share the untyped `code: string` field, so they fall through to the
|
|
82
|
+
* Maps the first resolved SessionUserError to the `sign-in-form` message that words it.
|
|
83
|
+
* INVALID_ACCESS_CODE, ACCESS_CODE_SEND_LIMIT, and MISSING_AUTH_CONTEXT are contractually unreachable
|
|
84
|
+
* from loginWithPassword but share the untyped `code: string` field, so they fall through to the
|
|
26
85
|
* generic message defensively, alongside any future/unknown code.
|
|
27
86
|
*/
|
|
28
|
-
function
|
|
87
|
+
function mapSessionErrorField(error) {
|
|
29
88
|
if (!error) return null;
|
|
30
89
|
switch (error.code) {
|
|
31
|
-
case "INVALID_CREDENTIALS": return
|
|
32
|
-
case "BLOCKED": return
|
|
33
|
-
case "NETWORK_ERROR": return
|
|
34
|
-
default: return
|
|
90
|
+
case "INVALID_CREDENTIALS": return "invalidCredentialsMessage";
|
|
91
|
+
case "BLOCKED": return "blockedMessage";
|
|
92
|
+
case "NETWORK_ERROR": return "networkErrorMessage";
|
|
93
|
+
default: return "genericErrorMessage";
|
|
35
94
|
}
|
|
36
95
|
}
|
|
37
96
|
const SignInFormDefinition = defineComponent({
|
|
38
97
|
name: "SignInForm",
|
|
39
98
|
importPath: "@vtex/faststore/components",
|
|
40
99
|
component: SignInForm,
|
|
41
|
-
|
|
42
|
-
fetchStrategy: "reactive",
|
|
100
|
+
content: SignInFormContent,
|
|
43
101
|
actions: { session: ["loginWithPassword"] },
|
|
44
|
-
requiresContext: "
|
|
102
|
+
requiresContext: "sign-in",
|
|
45
103
|
editor: {
|
|
46
104
|
label: "Sign In Form",
|
|
47
105
|
category: "identity"
|
|
48
106
|
},
|
|
49
|
-
schema: {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
emailPlaceholder: {
|
|
56
|
-
type: "string",
|
|
57
|
-
default: "you@example.com",
|
|
58
|
-
label: "Email placeholder"
|
|
59
|
-
},
|
|
60
|
-
passwordLabel: {
|
|
61
|
-
type: "string",
|
|
62
|
-
default: "Password",
|
|
63
|
-
label: "Password label"
|
|
64
|
-
},
|
|
65
|
-
passwordPlaceholder: {
|
|
66
|
-
type: "string",
|
|
67
|
-
default: "",
|
|
68
|
-
label: "Password placeholder"
|
|
69
|
-
},
|
|
70
|
-
showPasswordLabel: {
|
|
71
|
-
type: "string",
|
|
72
|
-
default: "Show password",
|
|
73
|
-
label: "Show password label"
|
|
74
|
-
},
|
|
75
|
-
hidePasswordLabel: {
|
|
76
|
-
type: "string",
|
|
77
|
-
default: "Hide password",
|
|
78
|
-
label: "Hide password label"
|
|
79
|
-
},
|
|
80
|
-
submitLabel: {
|
|
81
|
-
type: "string",
|
|
82
|
-
default: "Sign In",
|
|
83
|
-
label: "Submit label"
|
|
84
|
-
},
|
|
85
|
-
invalidEmailMessage: {
|
|
86
|
-
type: "string",
|
|
87
|
-
default: "Enter a valid email address.",
|
|
88
|
-
label: "Invalid email message"
|
|
89
|
-
},
|
|
90
|
-
passwordRequiredMessage: {
|
|
91
|
-
type: "string",
|
|
92
|
-
default: "Enter your password.",
|
|
93
|
-
label: "Password required message"
|
|
94
|
-
},
|
|
95
|
-
invalidCredentialsMessage: {
|
|
96
|
-
type: "string",
|
|
97
|
-
default: "Incorrect email or password. Please try again.",
|
|
98
|
-
label: "Invalid credentials message"
|
|
99
|
-
},
|
|
100
|
-
blockedMessage: {
|
|
101
|
-
type: "string",
|
|
102
|
-
default: "This account has been blocked. Please contact support.",
|
|
103
|
-
label: "Blocked account message"
|
|
104
|
-
},
|
|
105
|
-
networkErrorMessage: {
|
|
106
|
-
type: "string",
|
|
107
|
-
default: "Unable to complete the request. Please try again.",
|
|
108
|
-
label: "Network error message"
|
|
109
|
-
},
|
|
110
|
-
genericErrorMessage: {
|
|
111
|
-
type: "string",
|
|
112
|
-
default: "Unable to sign in. Please try again.",
|
|
113
|
-
label: "Generic error message"
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
guideline: "Combined email+password sign-in form dispatching $actions.session.loginWithPassword; pre-fills the email from clientProfile.email, self-hides once the session is loggedIn, and exposes data-fs-sign-in-form-pending while the submit is in flight. Must be inside SessionRoot. See sign-in-form.md."
|
|
107
|
+
schema: { passwordPlaceholder: {
|
|
108
|
+
type: "string",
|
|
109
|
+
default: "",
|
|
110
|
+
label: "Password placeholder"
|
|
111
|
+
} },
|
|
112
|
+
guideline: "Password step of the sign-in surface: a password field and a submit dispatching $actions.session.loginWithPassword with the shared SignInRoot email draft. Renders only while the account has resolved, enables passwords, the password method is showing and the shopper is not loggedIn; otherwise nothing. Rejected credentials render beside the password field, every other failure in data-fs-sign-in-form-error. Labels and error messages are $content fields of sign-in-form. Reads no data of its own and renders no email field: compose SignInEmailControl beside it. Must be inside SignInRoot. See sign-in-form.md."
|
|
117
113
|
});
|
|
118
114
|
/**
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
* (
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
115
|
+
* Password method of the sign-in surface. It declares no fragment and reads no data of its own: the
|
|
116
|
+
* gate is the `sign-in` context (`resolved`, `passwordEnabled` and `method === 'password'`) plus the
|
|
117
|
+
* session read (`state !== 'loggedIn'`), so a store enabling both methods shows the password step only
|
|
118
|
+
* while it is the method showing, and a store that disables passwords never shows it. It returns `null`
|
|
119
|
+
* rather than unmounting, so a half-typed password survives a method switch.
|
|
120
|
+
*
|
|
121
|
+
* The email is the shared draft `SignInRoot` owns, read at submit time and trimmed; this form renders no
|
|
122
|
+
* email field, and the submit stays disabled until that draft is a valid address. The password-presence
|
|
123
|
+
* check runs on submit. The awaited dispatch's first `userError` maps to a `sign-in-form` message:
|
|
124
|
+
* `INVALID_CREDENTIALS` is a claim about the password the shopper typed, so it renders on the
|
|
125
|
+
* `PasswordField`; every other code is a claim about the account or the request and renders in
|
|
126
|
+
* `data-fs-sign-in-form-error`. A dispatched attempt clears the password, accepted or rejected, and leaves the shared email alone.
|
|
127
|
+
* While the write is in flight the password and submit are disabled and `data-fs-sign-in-form-pending` is
|
|
128
|
+
* present so a checkout-CTA guard can block. The password clears when the session reaches `loggedIn`, and
|
|
129
|
+
* when a `SignInModalPanel` hosting it closes: this form never unmounts, so it would otherwise outlive the
|
|
130
|
+
* session it was typed for, and sit in the hidden panel after the shopper changed their mind.
|
|
127
131
|
*/
|
|
128
|
-
function SignInForm({
|
|
129
|
-
const $data = useDataOverride($dataProp);
|
|
132
|
+
function SignInForm({ passwordPlaceholder, $content, $actions: $actionsProp, className }) {
|
|
130
133
|
const $actions = useActionsOverride($actionsProp);
|
|
131
134
|
const { state } = useSession();
|
|
132
|
-
const
|
|
133
|
-
const
|
|
135
|
+
const { email, method, passwordEnabled, resolved } = useSignIn();
|
|
136
|
+
const { format } = useMessageFormatter(SignInFormContent, $content);
|
|
134
137
|
const [password, setPassword] = useState("");
|
|
135
138
|
const [pending, setPending] = useState(false);
|
|
136
|
-
const [emailError, setEmailError] = useState(null);
|
|
137
139
|
const [passwordError, setPasswordError] = useState(null);
|
|
138
140
|
const [formError, setFormError] = useState(null);
|
|
141
|
+
const dispatching = useRef(false);
|
|
142
|
+
const panelOpen = useSignInDisclosureOpen();
|
|
139
143
|
useEffect(() => {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
144
|
+
if (state === "loggedIn" || panelOpen === false) {
|
|
145
|
+
setPassword("");
|
|
146
|
+
setPasswordError(null);
|
|
147
|
+
setFormError(null);
|
|
148
|
+
}
|
|
149
|
+
}, [state, panelOpen]);
|
|
150
|
+
if (!(state !== "loggedIn" && resolved && passwordEnabled && method === "password")) return null;
|
|
151
|
+
const canSubmit = !pending && isValidEmail(email);
|
|
147
152
|
function handlePasswordChange(next) {
|
|
148
153
|
setPassword(next);
|
|
149
154
|
if (passwordError) setPasswordError(null);
|
|
150
155
|
}
|
|
151
156
|
async function handleSubmit(event) {
|
|
152
157
|
event.preventDefault();
|
|
153
|
-
|
|
154
|
-
if (!isValidEmail(trimmedEmail)) {
|
|
155
|
-
setEmailError(invalidEmailMessage);
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
+
if (!canSubmit || dispatching.current) return;
|
|
158
159
|
if (password.length === 0) {
|
|
159
|
-
setPasswordError(passwordRequiredMessage);
|
|
160
|
+
setPasswordError("passwordRequiredMessage");
|
|
160
161
|
return;
|
|
161
162
|
}
|
|
162
|
-
|
|
163
|
+
const requestedEmail = email.trim();
|
|
163
164
|
setPasswordError(null);
|
|
164
165
|
setFormError(null);
|
|
166
|
+
dispatching.current = true;
|
|
165
167
|
setPending(true);
|
|
166
168
|
try {
|
|
167
169
|
const errors = await $actions?.session?.loginWithPassword?.({
|
|
168
|
-
email:
|
|
170
|
+
email: requestedEmail,
|
|
169
171
|
password
|
|
170
172
|
}) ?? [];
|
|
171
173
|
if (errors.length > 0) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
networkErrorMessage,
|
|
176
|
-
genericErrorMessage
|
|
177
|
-
}));
|
|
178
|
-
setPassword("");
|
|
174
|
+
const field = mapSessionErrorField(errors[0]);
|
|
175
|
+
if (errors[0]?.code === "INVALID_CREDENTIALS") setPasswordError(field);
|
|
176
|
+
else setFormError(field);
|
|
179
177
|
}
|
|
178
|
+
setPassword("");
|
|
180
179
|
} finally {
|
|
180
|
+
dispatching.current = false;
|
|
181
181
|
setPending(false);
|
|
182
182
|
}
|
|
183
183
|
}
|
|
@@ -187,42 +187,32 @@ function SignInForm({ emailLabel, emailPlaceholder, passwordLabel, passwordPlace
|
|
|
187
187
|
...pending ? { "data-fs-sign-in-form-pending": "" } : {},
|
|
188
188
|
onSubmit: handleSubmit,
|
|
189
189
|
children: [
|
|
190
|
-
/* @__PURE__ */ jsx(EmailField, {
|
|
191
|
-
label: emailLabel,
|
|
192
|
-
placeholder: emailPlaceholder,
|
|
193
|
-
value: email,
|
|
194
|
-
disabled: pending,
|
|
195
|
-
invalid: emailError != null,
|
|
196
|
-
errorMessage: emailError ?? void 0,
|
|
197
|
-
onValueChange: handleEmailChange,
|
|
198
|
-
required: true
|
|
199
|
-
}),
|
|
200
190
|
/* @__PURE__ */ jsx(PasswordField, {
|
|
201
|
-
label: passwordLabel,
|
|
191
|
+
label: format("passwordLabel"),
|
|
202
192
|
placeholder: passwordPlaceholder,
|
|
203
193
|
value: password,
|
|
204
194
|
disabled: pending,
|
|
205
195
|
invalid: passwordError != null,
|
|
206
|
-
errorMessage: passwordError
|
|
207
|
-
showPasswordLabel,
|
|
208
|
-
hidePasswordLabel,
|
|
196
|
+
errorMessage: passwordError ? format(passwordError) : void 0,
|
|
197
|
+
showPasswordLabel: format("showPasswordLabel"),
|
|
198
|
+
hidePasswordLabel: format("hidePasswordLabel"),
|
|
209
199
|
onValueChange: handlePasswordChange
|
|
210
200
|
}),
|
|
211
201
|
formError ? /* @__PURE__ */ jsx("div", {
|
|
212
202
|
"data-fs-sign-in-form-error": "",
|
|
213
203
|
role: "alert",
|
|
214
|
-
children: formError
|
|
204
|
+
children: format(formError)
|
|
215
205
|
}) : null,
|
|
216
206
|
/* @__PURE__ */ jsx(Button, {
|
|
217
207
|
type: "submit",
|
|
218
|
-
disabled:
|
|
208
|
+
disabled: !canSubmit,
|
|
219
209
|
"data-fs-sign-in-form-submit": "",
|
|
220
|
-
children: submitLabel
|
|
210
|
+
children: format("submitLabel")
|
|
221
211
|
})
|
|
222
212
|
]
|
|
223
213
|
});
|
|
224
214
|
}
|
|
225
215
|
//#endregion
|
|
226
|
-
export { SignInForm, SignInFormDefinition,
|
|
216
|
+
export { SignInForm, SignInFormContent, SignInFormDefinition, mapSessionErrorField };
|
|
227
217
|
|
|
228
218
|
//# sourceMappingURL=sign-in-form.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-in-form.js","names":[],"sources":["../../../src/matter/sign-in-form/sign-in-form.tsx"],"sourcesContent":["'use client';\n\nimport { defineComponent } from '@vtex/fs-core';\nimport type { FormEvent } from 'react';\nimport { useEffect, useState } from 'react';\nimport { Button } from '../../particles/button/button.js';\nimport { EmailField, isValidEmail } from '../../particles/email-field/email-field.js';\nimport { PasswordField } from '../../particles/password-field/password-field.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { useDataOverride } from '../../sdk/data/data-override-context.js';\nimport type { SessionUserError } from '../../sdk/session/auth-operations.js';\nimport { useSession } from '../session/session.js';\n\n// ---------------------------------------------------------------------------\n// GraphQL Fragment (colocated, ADR-0011) — reads only clientProfile.email, the minimal slice this\n// matter owns for the pre-fill. Authored as a raw string (not the codegen graphql() factory),\n// mirroring EmailIdentificationControl; the compiler derives the entity fragment on `clientProfile`\n// and subscribes reactively.\n// ---------------------------------------------------------------------------\n\nconst fragment = /* GraphQL */ `\n fragment SignInFormData on Query {\n clientProfile {\n __typename\n id\n email\n }\n }\n`;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** ClientProfile slice forwarded by the reactive runtime — only `email` is consumed for pre-fill. */\nexport type SignInFormSlice = Readonly<{ email?: string | null }>;\n\nexport type SignInFormMessages = Readonly<{\n invalidCredentialsMessage: string;\n blockedMessage: string;\n networkErrorMessage: string;\n genericErrorMessage: string;\n}>;\n\nexport type SignInFormProps = Readonly<{\n emailLabel?: string;\n emailPlaceholder?: string;\n passwordLabel?: string;\n passwordPlaceholder?: string;\n showPasswordLabel?: string;\n hidePasswordLabel?: string;\n submitLabel?: string;\n /** Inline error for an invalid email format (mirrors EmailIdentificationControl). */\n invalidEmailMessage?: string;\n /** Inline error when the password field is submitted empty (this form owns the presence check). */\n passwordRequiredMessage?: string;\n invalidCredentialsMessage?: string;\n blockedMessage?: string;\n networkErrorMessage?: string;\n genericErrorMessage?: string;\n /** ClientProfile slice forwarded by the reactive runtime; `null` until the entity resolves. */\n $data?: SignInFormSlice | null;\n /** Compiler-injected action surface; carries `session.loginWithPassword`. */\n $actions?: ComponentActions;\n className?: string;\n}>;\n\n// ---------------------------------------------------------------------------\n// Error mapping — pure, unit-tested.\n// ---------------------------------------------------------------------------\n\n/**\n * Maps the first resolved SessionUserError to caller-configurable copy. INVALID_ACCESS_CODE,\n * ACCESS_CODE_SEND_LIMIT, and MISSING_AUTH_CONTEXT are contractually unreachable from\n * loginWithPassword but share the untyped `code: string` field, so they fall through to the\n * generic message defensively, alongside any future/unknown code.\n */\nexport function mapSessionErrorMessage(\n error: SessionUserError | undefined,\n messages: SignInFormMessages,\n): string | null {\n if (!error) return null;\n switch (error.code) {\n case 'INVALID_CREDENTIALS':\n return messages.invalidCredentialsMessage;\n case 'BLOCKED':\n return messages.blockedMessage;\n case 'NETWORK_ERROR':\n return messages.networkErrorMessage;\n default:\n return messages.genericErrorMessage;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const SignInFormDefinition = defineComponent<SignInFormProps>({\n name: 'SignInForm',\n importPath: '@vtex/faststore/components',\n component: SignInForm,\n fragment,\n fetchStrategy: 'reactive',\n actions: { session: ['loginWithPassword'] },\n requiresContext: 'session',\n editor: { label: 'Sign In Form', category: 'identity' },\n schema: {\n emailLabel: { type: 'string', default: 'Email', label: 'Email label' },\n emailPlaceholder: { type: 'string', default: 'you@example.com', label: 'Email placeholder' },\n passwordLabel: { type: 'string', default: 'Password', label: 'Password label' },\n passwordPlaceholder: { type: 'string', default: '', label: 'Password placeholder' },\n showPasswordLabel: { type: 'string', default: 'Show password', label: 'Show password label' },\n hidePasswordLabel: { type: 'string', default: 'Hide password', label: 'Hide password label' },\n submitLabel: { type: 'string', default: 'Sign In', label: 'Submit label' },\n invalidEmailMessage: { type: 'string', default: 'Enter a valid email address.', label: 'Invalid email message' },\n passwordRequiredMessage: {\n type: 'string',\n default: 'Enter your password.',\n label: 'Password required message',\n },\n invalidCredentialsMessage: {\n type: 'string',\n default: 'Incorrect email or password. Please try again.',\n label: 'Invalid credentials message',\n },\n blockedMessage: {\n type: 'string',\n default: 'This account has been blocked. Please contact support.',\n label: 'Blocked account message',\n },\n networkErrorMessage: {\n type: 'string',\n default: 'Unable to complete the request. Please try again.',\n label: 'Network error message',\n },\n genericErrorMessage: {\n type: 'string',\n default: 'Unable to sign in. Please try again.',\n label: 'Generic error message',\n },\n },\n guideline:\n 'Combined email+password sign-in form dispatching $actions.session.loginWithPassword; pre-fills the email from clientProfile.email, self-hides once the session is loggedIn, and exposes data-fs-sign-in-form-pending while the submit is in flight. Must be inside SessionRoot. See sign-in-form.md.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Matter that composes `EmailField` + `PasswordField` under one submit and dispatches\n * `$actions.session.loginWithPassword`. Reads the email pre-fill from `clientProfile.email`\n * (colocated reactive fragment) and the identity tri-state from `useSession()` (which also\n * enforces the `SessionRoot` ancestor), self-gating to `null` once the shopper is `loggedIn`.\n * Client-side validation (email format, password presence) blocks the dispatch before any network\n * round trip; the awaited dispatch's `userErrors` map to one form-level inline message, distinct\n * from any ancestor `UNAUTHORIZED` gate. While the write is in flight the form is disabled and\n * `data-fs-sign-in-form-pending` is present so a checkout-CTA guard can block.\n */\nexport function SignInForm({\n emailLabel,\n emailPlaceholder,\n passwordLabel,\n passwordPlaceholder,\n showPasswordLabel,\n hidePasswordLabel,\n submitLabel = 'Sign In',\n invalidEmailMessage = 'Enter a valid email address.',\n passwordRequiredMessage = 'Enter your password.',\n invalidCredentialsMessage = 'Incorrect email or password. Please try again.',\n blockedMessage = 'This account has been blocked. Please contact support.',\n networkErrorMessage = 'Unable to complete the request. Please try again.',\n genericErrorMessage = 'Unable to sign in. Please try again.',\n $data: $dataProp,\n $actions: $actionsProp,\n className,\n}: SignInFormProps) {\n const $data = useDataOverride($dataProp);\n const $actions = useActionsOverride($actionsProp);\n // Reads the tri-state for self-gating and, as a side effect, throws when rendered outside\n // <SessionRoot> — called unconditionally, before any early return.\n const { state } = useSession();\n\n const savedEmail = $data?.email ?? '';\n const [email, setEmail] = useState(savedEmail);\n const [password, setPassword] = useState('');\n const [pending, setPending] = useState(false);\n const [emailError, setEmailError] = useState<string | null>(null);\n const [passwordError, setPasswordError] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n\n // Sync the pre-fill when the saved profile email resolves or changes, mirroring\n // EmailIdentificationControl's pre-fill sync.\n useEffect(() => {\n setEmail(savedEmail);\n }, [savedEmail]);\n\n // An already-authenticated shopper is never offered a sign-in form.\n if (state === 'loggedIn') return null;\n\n function handleEmailChange(next: string) {\n setEmail(next);\n if (emailError) setEmailError(null);\n }\n\n function handlePasswordChange(next: string) {\n setPassword(next);\n if (passwordError) setPasswordError(null);\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n const trimmedEmail = email.trim();\n if (!isValidEmail(trimmedEmail)) {\n setEmailError(invalidEmailMessage);\n return;\n }\n\n if (password.length === 0) {\n setPasswordError(passwordRequiredMessage);\n return;\n }\n\n // Client-side checks passed — clear any prior field-level/form-level errors before dispatching.\n setEmailError(null);\n setPasswordError(null);\n setFormError(null);\n setPending(true);\n\n try {\n // Awaited (async/pessimistic): the cache flip is read on the next render via useSession(),\n // never assumed here.\n const errors = (await $actions?.session?.loginWithPassword?.({ email: trimmedEmail, password })) ?? [];\n\n if (errors.length > 0) {\n setFormError(\n mapSessionErrorMessage(errors[0], {\n invalidCredentialsMessage,\n blockedMessage,\n networkErrorMessage,\n genericErrorMessage,\n }),\n );\n // Credential hygiene: drop the rejected password, keep the email.\n setPassword('');\n }\n } finally {\n setPending(false);\n }\n }\n\n return (\n <form\n className={className}\n data-fs-sign-in-form=\"\"\n {...(pending ? { 'data-fs-sign-in-form-pending': '' } : {})}\n onSubmit={handleSubmit}\n >\n <EmailField\n label={emailLabel}\n placeholder={emailPlaceholder}\n value={email}\n disabled={pending}\n invalid={emailError != null}\n errorMessage={emailError ?? undefined}\n onValueChange={handleEmailChange}\n required\n />\n <PasswordField\n label={passwordLabel}\n placeholder={passwordPlaceholder}\n value={password}\n disabled={pending}\n invalid={passwordError != null}\n errorMessage={passwordError ?? undefined}\n showPasswordLabel={showPasswordLabel}\n hidePasswordLabel={hidePasswordLabel}\n onValueChange={handlePasswordChange}\n />\n {formError ? (\n <div data-fs-sign-in-form-error=\"\" role=\"alert\">\n {formError}\n </div>\n ) : null}\n <Button type=\"submit\" disabled={pending} data-fs-sign-in-form-submit=\"\">\n {submitLabel}\n </Button>\n </form>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sign-in-form.js","names":[],"sources":["../../../src/matter/sign-in-form/sign-in-form.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 { FormEvent } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { Button } from '../../particles/button/button.js';\nimport { isValidEmail } from '../../particles/email-field/email-field.js';\nimport { PasswordField } from '../../particles/password-field/password-field.js';\nimport { useActionsOverride } from '../../sdk/actions/actions-override-context.js';\nimport type { ComponentActions } from '../../sdk/actions/types.js';\nimport { useMessageFormatter } from '../../sdk/i18n/use-message-formatter.js';\nimport type { SessionUserError } from '../../sdk/session/auth-operations.js';\nimport { useSession } from '../session/session.js';\nimport { useSignIn } from '../sign-in/sign-in.js';\nimport { useSignInDisclosureOpen } from '../sign-in-disclosure/sign-in-disclosure.js';\n\n// ---------------------------------------------------------------------------\n// Content\n// ---------------------------------------------------------------------------\n\nexport const SignInFormContent = defineContentType({\n id: 'sign-in-form',\n title: 'Sign In Form',\n description: 'Labels and error messages of the password sign-in step.',\n schema: {\n type: 'object',\n additionalProperties: false,\n properties: {\n passwordLabel: { type: 'string', title: 'Password label', format: 'icu-message', messageSource: 'Password' },\n showPasswordLabel: {\n type: 'string',\n title: 'Show password label',\n format: 'icu-message',\n messageSource: 'Show password',\n },\n hidePasswordLabel: {\n type: 'string',\n title: 'Hide password label',\n format: 'icu-message',\n messageSource: 'Hide password',\n },\n submitLabel: { type: 'string', title: 'Submit label', format: 'icu-message', messageSource: 'Sign In' },\n passwordRequiredMessage: {\n type: 'string',\n title: 'Password required message',\n format: 'icu-message',\n messageSource: 'Enter your password.',\n },\n invalidCredentialsMessage: {\n type: 'string',\n title: 'Invalid credentials message',\n format: 'icu-message',\n messageSource: 'Incorrect email or password. Please try again.',\n },\n // Temporarily, and with no time: VTEX ID reports BlockedUser with no duration, so any deadline\n // here would be invented. Saying \"contact support\" sent a shopper somewhere that cannot help\n // with a block that lifts on its own. See the RFC's Open question 2.\n blockedMessage: {\n type: 'string',\n title: 'Blocked account message',\n format: 'icu-message',\n messageSource: 'Access to this account is temporarily blocked. Please try again later.',\n },\n networkErrorMessage: {\n type: 'string',\n title: 'Network error message',\n format: 'icu-message',\n messageSource: 'Unable to complete the request. Please try again.',\n },\n genericErrorMessage: {\n type: 'string',\n title: 'Generic error message',\n format: 'icu-message',\n messageSource: 'Unable to sign in. Please try again.',\n },\n },\n },\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** The `sign-in-form` message a rejected sign-in renders. */\nexport type SignInFormErrorField = Extract<\n MessageFieldName<typeof SignInFormContent>,\n | 'passwordRequiredMessage'\n | 'invalidCredentialsMessage'\n | 'blockedMessage'\n | 'networkErrorMessage'\n | 'genericErrorMessage'\n>;\n\nexport type SignInFormProps = MessageLocaleProp &\n Readonly<{\n passwordPlaceholder?: string;\n /** Labels and error messages; see `SignInFormContent`. */\n $content?: ContentValue<typeof SignInFormContent>;\n /** Compiler-injected action surface; carries `session.loginWithPassword`. */\n $actions?: ComponentActions;\n className?: string;\n }>;\n\n// ---------------------------------------------------------------------------\n// Error mapping — pure, unit-tested.\n// ---------------------------------------------------------------------------\n\n/**\n * Maps the first resolved SessionUserError to the `sign-in-form` message that words it.\n * INVALID_ACCESS_CODE, ACCESS_CODE_SEND_LIMIT, and MISSING_AUTH_CONTEXT are contractually unreachable\n * from loginWithPassword but share the untyped `code: string` field, so they fall through to the\n * generic message defensively, alongside any future/unknown code.\n */\nexport function mapSessionErrorField(error: SessionUserError | undefined): SignInFormErrorField | null {\n if (!error) return null;\n switch (error.code) {\n case 'INVALID_CREDENTIALS':\n return 'invalidCredentialsMessage';\n case 'BLOCKED':\n return 'blockedMessage';\n case 'NETWORK_ERROR':\n return 'networkErrorMessage';\n default:\n return 'genericErrorMessage';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Definition\n// ---------------------------------------------------------------------------\n\nexport const SignInFormDefinition = defineComponent<SignInFormProps>({\n name: 'SignInForm',\n importPath: '@vtex/faststore/components',\n component: SignInForm,\n content: SignInFormContent,\n actions: { session: ['loginWithPassword'] },\n requiresContext: 'sign-in',\n editor: { label: 'Sign In Form', category: 'identity' },\n schema: {\n passwordPlaceholder: { type: 'string', default: '', label: 'Password placeholder' },\n },\n guideline:\n 'Password step of the sign-in surface: a password field and a submit dispatching $actions.session.loginWithPassword with the shared SignInRoot email draft. Renders only while the account has resolved, enables passwords, the password method is showing and the shopper is not loggedIn; otherwise nothing. Rejected credentials render beside the password field, every other failure in data-fs-sign-in-form-error. Labels and error messages are $content fields of sign-in-form. Reads no data of its own and renders no email field: compose SignInEmailControl beside it. Must be inside SignInRoot. See sign-in-form.md.',\n});\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Password method of the sign-in surface. It declares no fragment and reads no data of its own: the\n * gate is the `sign-in` context (`resolved`, `passwordEnabled` and `method === 'password'`) plus the\n * session read (`state !== 'loggedIn'`), so a store enabling both methods shows the password step only\n * while it is the method showing, and a store that disables passwords never shows it. It returns `null`\n * rather than unmounting, so a half-typed password survives a method switch.\n *\n * The email is the shared draft `SignInRoot` owns, read at submit time and trimmed; this form renders no\n * email field, and the submit stays disabled until that draft is a valid address. The password-presence\n * check runs on submit. The awaited dispatch's first `userError` maps to a `sign-in-form` message:\n * `INVALID_CREDENTIALS` is a claim about the password the shopper typed, so it renders on the\n * `PasswordField`; every other code is a claim about the account or the request and renders in\n * `data-fs-sign-in-form-error`. A dispatched attempt clears the password, accepted or rejected, and leaves the shared email alone.\n * While the write is in flight the password and submit are disabled and `data-fs-sign-in-form-pending` is\n * present so a checkout-CTA guard can block. The password clears when the session reaches `loggedIn`, and\n * when a `SignInModalPanel` hosting it closes: this form never unmounts, so it would otherwise outlive the\n * session it was typed for, and sit in the hidden panel after the shopper changed their mind.\n */\nexport function SignInForm({ passwordPlaceholder, $content, $actions: $actionsProp, className }: SignInFormProps) {\n const $actions = useActionsOverride($actionsProp);\n const { state } = useSession();\n const { email, method, passwordEnabled, resolved } = useSignIn();\n const { format } = useMessageFormatter(SignInFormContent, $content);\n\n const [password, setPassword] = useState('');\n const [pending, setPending] = useState(false);\n // The field that words each error, formatted at render.\n const [passwordError, setPasswordError] = useState<SignInFormErrorField | null>(null);\n const [formError, setFormError] = useState<SignInFormErrorField | null>(null);\n // `pending` is state, so two submits delivered in one batch both read it as false. The ref closes that window.\n const dispatching = useRef(false);\n\n // `false` while the panel of the enclosing `SignInDisclosureRoot` is closed, `undefined` outside one: no close to follow.\n const panelOpen = useSignInDisclosureOpen();\n\n // This form never unmounts, so a typed password and the errors about it would otherwise outlive the\n // session they belong to, or the panel the shopper closed, and greet whoever uses the page next.\n useEffect(() => {\n if (state === 'loggedIn' || panelOpen === false) {\n setPassword('');\n setPasswordError(null);\n setFormError(null);\n }\n }, [state, panelOpen]);\n\n // `resolved` first: an unresolved read leaves every flag `false`, which looks like an account that\n // enables nothing.\n const gated = state !== 'loggedIn' && resolved && passwordEnabled && method === 'password';\n if (!gated) return null;\n\n const canSubmit = !pending && isValidEmail(email);\n\n function handlePasswordChange(next: string) {\n setPassword(next);\n if (passwordError) setPasswordError(null);\n }\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!canSubmit || dispatching.current) return;\n\n if (password.length === 0) {\n setPasswordError('passwordRequiredMessage');\n return;\n }\n\n // The address this render's draft holds, trimmed: the dispatch cannot move if the draft is edited while it\n // is in flight.\n const requestedEmail = email.trim();\n\n // Presence check passed — clear any prior errors before dispatching.\n setPasswordError(null);\n setFormError(null);\n dispatching.current = true;\n setPending(true);\n\n try {\n // Awaited (async/pessimistic): the cache flip is read on the next render via useSession(),\n // never assumed here.\n const errors = (await $actions?.session?.loginWithPassword?.({ email: requestedEmail, password })) ?? [];\n\n if (errors.length > 0) {\n const field = mapSessionErrorField(errors[0]);\n if (errors[0]?.code === 'INVALID_CREDENTIALS') setPasswordError(field);\n else setFormError(field);\n }\n // Credential hygiene: the password has been sent, whatever the answer, so drop it and keep the shared email.\n // The `loggedIn` effect covers the session flip; this covers a flip that does not arrive.\n setPassword('');\n } finally {\n dispatching.current = false;\n setPending(false);\n }\n }\n\n return (\n <form\n className={className}\n data-fs-sign-in-form=\"\"\n {...(pending ? { 'data-fs-sign-in-form-pending': '' } : {})}\n onSubmit={handleSubmit}\n >\n <PasswordField\n label={format('passwordLabel')}\n placeholder={passwordPlaceholder}\n value={password}\n disabled={pending}\n invalid={passwordError != null}\n errorMessage={passwordError ? format(passwordError) : undefined}\n showPasswordLabel={format('showPasswordLabel')}\n hidePasswordLabel={format('hidePasswordLabel')}\n onValueChange={handlePasswordChange}\n />\n {formError ? (\n <div data-fs-sign-in-form-error=\"\" role=\"alert\">\n {format(formError)}\n </div>\n ) : null}\n <Button type=\"submit\" disabled={!canSubmit} data-fs-sign-in-form-submit=\"\">\n {format('submitLabel')}\n </Button>\n </form>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { ContentValue, MessageLocaleProp } from "../../core/dist/define-content-type.js";
|
|
2
|
+
import { ComponentDefinition } from "../../core/dist/define-component.js";
|
|
3
|
+
import "../../core/dist/index.js";
|
|
4
|
+
import { ComponentActions } from "../../sdk/actions/types.js";
|
|
5
|
+
import { ComponentPropsWithRef } from "react";
|
|
6
|
+
//#region src/particles/binding-switcher/binding-switcher.d.ts
|
|
7
|
+
export declare const BindingSwitcherContent: {
|
|
8
|
+
readonly id: "binding-switcher";
|
|
9
|
+
readonly title: "Binding Switcher";
|
|
10
|
+
readonly description: "Label of the binding select and the notice shown when a page has no equivalent in the chosen binding.";
|
|
11
|
+
readonly schema: {
|
|
12
|
+
readonly type: "object";
|
|
13
|
+
readonly additionalProperties: false;
|
|
14
|
+
readonly properties: {
|
|
15
|
+
readonly label: {
|
|
16
|
+
readonly type: "string";
|
|
17
|
+
readonly title: "Label";
|
|
18
|
+
readonly format: "icu-message";
|
|
19
|
+
readonly messageSource: "Language";
|
|
20
|
+
};
|
|
21
|
+
readonly notice: {
|
|
22
|
+
readonly type: "string";
|
|
23
|
+
readonly title: "No-equivalent notice";
|
|
24
|
+
readonly description: "Shown when the page loaded with fs_notice=no-equivalent.";
|
|
25
|
+
readonly format: "icu-message";
|
|
26
|
+
readonly messageSource: "This page isn't available in the selected language.";
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export type BindingSwitcherBinding = {
|
|
32
|
+
locale?: unknown;
|
|
33
|
+
currency?: unknown;
|
|
34
|
+
salesChannel?: unknown;
|
|
35
|
+
url?: unknown;
|
|
36
|
+
country?: unknown;
|
|
37
|
+
timezone?: unknown;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* `foundation.json` `localization.bindings`, keyed by binding id. An entry counts only when it is an
|
|
41
|
+
* own key, the value is a non-null object, and `locale` is a string. Fewer than two counted
|
|
42
|
+
* entries yields an empty list.
|
|
43
|
+
*/
|
|
44
|
+
export declare function bindingSwitcherOptions(bindings: Record<string, BindingSwitcherBinding> | null | undefined, activeLocale: string): {
|
|
45
|
+
id: string;
|
|
46
|
+
label: string;
|
|
47
|
+
}[];
|
|
48
|
+
export type BindingSwitcherProps = Omit<ComponentPropsWithRef<'div'>, 'children'> & MessageLocaleProp & {
|
|
49
|
+
/** `foundation.json` `localization.bindings`, keyed by binding id. No library default. */
|
|
50
|
+
bindings?: Record<string, BindingSwitcherBinding> | null;
|
|
51
|
+
/** Injected from `actions: { locale: ['set'] }`. */
|
|
52
|
+
$actions?: ComponentActions;
|
|
53
|
+
/** `label` is the accessible name, rendered as `Select.Label`; `notice` shows on `fs_notice=no-equivalent`. */
|
|
54
|
+
$content?: ContentValue<typeof BindingSwitcherContent>;
|
|
55
|
+
};
|
|
56
|
+
export declare const BindingSwitcherDefinition: ComponentDefinition<BindingSwitcherProps>;
|
|
57
|
+
export declare function BindingSwitcher({ bindings, $actions: $actionsProp, $locale, $content, className, ...props }: BindingSwitcherProps): import("react/jsx-runtime").JSX.Element | null;
|
|
58
|
+
//#endregion
|
|
59
|
+
//# sourceMappingURL=binding-switcher.d.ts.map
|