All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
pickup-point-selectornow registers itself into theDeliveryPromiseContextuiRegistry(pickupPointentry) on mount and unregisters on unmount, matchingshopper-location-setterandshipping-method-selector. This lets consumers (e.g.vtex.search-result) detect that a delivery-promise block is present.
- Postal code input now supports alphanumeric formats for international markets (Canada, Argentina) with country-specific masks for BR, MX, AR, CL, CO, PE, US, CA, ES, IT, and FR.
- Fixed SSR crash in
getCountryCodewhenatobis unavailable in the render-server environment.
- CSS handles for
UnavailableItemsModal,AddLocation, andProductItemcomponents to enable theme customization.
clearButtonandupdateButtonCSS handles on the pickup point list so merchants can style the Clear and Update buttons independently (previously only the sharedupdateButtonContainerwas available).
- Pickup point selection now requires explicit Clear button instead of clicking the selected point to unselect.
- Clearing a selected pickup point now dispatches
RESET_FULFILLMENT_METHOD(via a newonClearPickuphandler) instead of re-dispatchingUPDATE_PICKUP. This skips the delivery-promises BFF availability check on clear — clearing only broadens availability, so there is nothing to validate — resulting in a faster clear path with the same session cleanup. - Added bottom padding to the pickup point list when the floating action bar is visible so the last item scrolls fully clear of the Clear / Update buttons.
pickup-point-selectormodal now closes automatically after a pickup is selected or cleared. Previously onlyshipping-method-selectorclosed itself when the soft-refresh feature landed; the standalone pickup-point-selector was missing the same wiring, leaving the modal open until the shopper dismissed it manually.
- Replace the full-page reload after zipcode / pickup / shipping-method session writes with a targeted soft refresh that refetches only the segment-dependent storefront queries (resetting search pagination to the first page through render-runtime), updates the fulfillment selection optimistically with rollback on a failed session write, closes the shipping-method modal, and falls back to
location.reload()when Apollo is unavailable.
docs/AvailabilityBadges.md: separate documentation file is deprecated in favor of inline documentation indocs/README.md. The file remains with a deprecation notice but is no longer referenced in navigation.
UPDATE_ZIPCODEdispatch: the postal code is now resolved once at the dispatch entry point (singlegetAddresscall) and the resolved address is threaded through the cart-availability check andsubmitZipcode.getAddressfailures and emptygeoCoordinatesnow fail fast asINVALID_POSTAL_CODEwithout invoking the BFF availability call.submitZipcode: runsgetCatalogCount,updateOrderFormandgetPickupsin parallel usingPromise.all.getCatalogCountkeeps its UX gate (zero results still surfacesproducts-not-found-error);updateOrderFormfailures are best-effort (logged and continued);getPickupsfailures degrade gracefully to no active pickups. The twoPOST /api/sessionswrites that previously happened during a zipcode submission are coalesced into a single write that already carries the resolved pickup (orundefinedwhen there are no active pickups, whengetPickupsrejects, or whensalesChannelis still loading and pickup fetching is deferred).validateCartItems: skips thedelivery-promises-bff/availabilitycall entirely when the cart is empty, avoiding an unnecessary network round trip for the common header-flow scenario.
ShopperLocationSetter/PickupPointSelectorbutton wrappers: left padding was0while top, right, and bottom were at Tachyons scale4. Replacedpt4 pr4 pb4 pl0with the uniform shorthandpa4, matching the existing behaviour ofShippingMethodSelector. CSS handle names are unchanged; theme overrides onshopperLocationSetterButtonWrapperandpickupPointSelectorButtonWrappercontinue to work.
ShopperLocationDetectorButton(viashopper-location-setter/showLocationDetectorButton): after the delivery-promise context finishes its initial load, if there is no postal code yet, the control once requests browser geolocation, reverse-geocodes to a postal code, and dispatchesUPDATE_ZIPCODE. Manual “use my location” still works after errors. Waits forisLoadingto become false so session or facet postal codes are respected before prompting.
CLEAR_ZIPCODE+ location detector: dispatchingCLEAR_ZIPCODEsets a session flag before the reload so the detector does not run automatic geolocation again on the next paint. The flag is cleared when a postal code is successfully applied throughsubmitZipcode(including before any successlocation.reload()), so later clears can set it again.
- Store Framework: removed the monolithic
delivery-promise-location-selectorinterface. Themes must declare the split blocks instead:shopper-location-setter,shipping-method-selector, andpickup-point-selector(each with its own React entry point). There is no bundled legacy block or in-repo migration guide from the old block to the new ones—only the new contract is supported. - Assumption: at most one mounted instance of each block type in the theme. The context keeps a single registration per type (no ref counting); the last mount wins if duplicates exist.
shopper-location-setterblock: postal code UI—non-dismissible modal whenrequiredis true, popover flow whenrequiredis false; propsmode(default|icon) andshowLocationDetectorButton(geolocation control; only on this block).shipping-method-selectorblock: delivery vs pickup after a postal code exists; propsrequired,mode, andshippingSelection(delivery-and-pickup|only-pickup). Whenrequiredis true and there is nodeliveryPromiseMethod, the shipping-method modal is non-dismissible until the shopper chooses a method.pickup-point-selectorblock: pickup point selection; propmodeonly (norequiredin this version).- Delivery promise context — UI registry: blocks register on mount via
REGISTER_SHOPPER_LOCATION_BLOCK/UNREGISTER_SHOPPER_LOCATION_BLOCKandREGISTER_SHIPPING_METHOD_BLOCK/UNREGISTER_SHIPPING_METHOD_BLOCK, each passing{ required: boolean }. Exposed on state asuiRegistry. - Cross-block shipping-method modal:
REQUEST_OPEN_SHIPPING_METHOD_MODALand state fieldshippingMethodModalRequestIdso the method modal can open from context when the postal code control and the method control are sibling blocks (not the same React subtree). UnavailableItemsModal: rendered once inDeliveryPromiseProviderCore, bound to shared context state; individual blocks do not mount their own copy.- README (
docs/README.md): blocks list, theme example, reload policy, registry, modal-request flow, CEP → method rules when bothrequiredare true vs optional CEP + required method, and global overlays. - Tests:
uiRegistryregister/unregister;effectiveReload/shippingMethodModalRequestIdcombinations (required shipping with optional vs required location);nonDismissibleModalonshipping-method-selector. PickupModalPresentational: root React export wrapping the presentational pickup modal UI for apps (for examplesearch-result) that control zip/pickup outside global context.pickupSearchClient/pickupInPointPreference: helpers for pickup list fetch and PLP preference storage patterns.- Dispatch action
CLEAR_ZIPCODEresets navigation context: clears order formshippingData, clears shipping facets viaclearShippingSession, and resets related state (then reloads).
PostalCodeModal, context, anduseDeliveryPromiseadjustments to support controlled flows and shared pickup-fetch behavior with optional integrations.- Reload after postal code (
submitZipcode/UPDATE_ZIPCODE): whenreloadis true,location.reload()is skipped if a required shipping-method block is registered (effectiveReload = reload && !shippingMethodRequired). Session and in-memory state still update; reload continues to apply after method selection (and in other flows that already reload). When both location and shipping blocks arerequired, the hook does not bumpshippingMethodModalRequestIdon postal-code submit—the location setter requests the method modal only after CEP is valid and its flow has finished, avoiding stacked modals. When shipping isrequiredbut location is not, the hook bumpsshippingMethodModalRequestIdon successful postal-code submit soshipping-method-selectorcan open immediately. - Dispatch action for the delivery shipping method is
SELECT_DELIVERY_SHIPPING_OPTION(replacesSELECT_HOME_DELIVERY; same name asvtex.shipping-option-components). - Pickup points are loaded via Intelligent Search
pickup-point-availabilityusing the session sales channel as trade policy (fallback1), withvtex.session-client. - Cart availability checks call delivery-promises-bff at
/api/delivery-promises-bff/availability/*with{ items: [{ itemId, productId }] }and readunavailableItemIdsfrom the response.
- React context API renamed from
ShippingOption*toDeliveryPromise*(for exampleDeliveryPromiseProvider,useDeliveryPromiseState,useDeliveryPromiseDispatch). State fieldshippingOptionis nowdeliveryPromiseMethod.RESET_SHIPPING_OPTIONis nowRESET_FULFILLMENT_METHOD. Default export component for the location selector block renamed fromShippingOptionZipcodetoDeliveryPromiseLocationSelector.
Themes and customizations must be updated together; there is no drop-in replacement under the old app id.
- Dependency: replace
vtex.shipping-option-componentswithvtex.delivery-promise-components(use 0.x until a stable major is published). - Store block: rename
shipping-option-location-selectortodelivery-promise-location-selectorinblocks.json/ theme JSON (children arrays and block definitions). - Translations: all message ids changed from
store/shipping-option-components.*tostore/delivery-promise-components.*— update anymessagesoverrides or CMS entries that referenced the old ids.
- App and package name:
shipping-option-components→delivery-promise-components - Catalog / docs references updated to the new GitHub slug
vtex-apps/delivery-promise-components(rename the repository to match when publishing)
- Pixel event ids (
shipping-option-deliver-to,shipping-option-store,item-added-to-cart-shipping-modal) and theshipping_infocookie name are unchanged for analytics and session continuity
- Updated the Shipping Option Components README
- Shipping method selection is now optional and no longer required after entering postal code
- Added toggle functionality to deselect shipping methods and return to default state
- Shipping method modal no longer opens automatically and can be dismissed without selection
- Removed auto select pickup
- Not forwarding cookies to
getCatalogCountanymore - Refresh page after
zipcode updateatsegment cookie
- Unselect the pickup point in the global filter.
ShopperLocationDetectorButtoncomponent to automatically detect
- Always add the shippingOption to the session.
- Added a callout about Delivery Promises in README.md.
- Send zipCode as a string in update orderForm request
vtex.react-portalandvtex.store-drawerdependencies
- React to @16
- ReactModal compatibility with React 16
- Docs file for availabilityBadges
- Tests file for availability Badges
- Updated the app version mentioned in README.md.
- Cart products validation.
AvailabilityBadgescomponent to use inProductSummary.
- Validation to verify that the postal code has products available.
- Context to share states with other apps
- Export
PickupModalandLocationModal
- Popover adjusted to positioning on the page.
- Props documentation
- Icon mode
- Dismissible behavior on shipping vs pickup modal
- Spanish description on shipping vs pickup modal
- Situation where user get stuck after providing a invalid zipcode.
- Major layout adjustments
- Shipping modal
- Bad formatting of shipping info cookie
- country inside the body facets
- Remove DP variant validation.
- Missing translations update
- The selected pickup point does not change due to a problem updating cookie data
- The hideStoreSelection property removes the Pickup Drawer and it cannot be opened
- sometimes zip code is not updated due to a problem in
__RUNTIME__.segmentToken
- Popover to open the location drawer;
- Popover with input to add postal code.
- Selected pickup doesn't work on first load
- Drawer opens behind the sidebar
- Selected pickup did not change.
- Catalan, Czech, Danish, Greek, Finnish, Hungarian, Indonesian, Norwegian, Polish, Russian, Slovak, Slovenian, Swedish and Ukrainian translations.
- orderForm integration from PLP to cart
- English, Portuguese and Spanish translations.
- Crowdin integration file.
- Bulgharian, German, French, Italian, Japanese, Korean, Dutch, Romanian and Thai translations
- Initial release.