Multi-pin pickup selection (study §3.4) — previously a standalone unused endpoint + TODO comments: - app/services/pickup-locations.server.ts: pure filterPickupLocationIds + I/O resolvePickupLocations (active + has a PICKUP slot template + ProductRule allowedLocationIds + inventory exclusion). - resolveAvailabilityRequest returns pickupLocations[] on method=PICKUP and defaults the active location to the first eligible pickup point. - apps.scheduling.locations.tsx refactored onto the shared resolver (was a second copy of the logic). - Storefront widget: pickup-location chooser (name + address, optional multi-pin Google map) when >1 eligible point and none block-configured; picking one re-requests availability for that location. New styles + widget.choose_pickup_location locale (en + fr). - Checkout extension Checkout.jsx: same chooser before the date list. - tests/unit/pickup-locations.test.ts (5 cases); suite 161 green. checkout-datetime follow-up fixes from the 808a3b7 review: - typescript devDep ^7.0.2 -> ^5.6.3 (there is no typescript@7 on npm). - Deleted dead shopify.d.ts (Preact-global shim, unused after the React rewrite) and dropped it from tsconfig include. Also stages the CLI-written `uid` lines in the checkout-datetime and payment-customization extension tomls. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
checkout-datetime
Checkout UI Extension. Three targets in one extension:
| Module | Target | Plans |
|---|---|---|
src/Checkout.jsx |
purchase.checkout.block.render |
Plus only — native in-checkout date/time picker |
src/ThankYou.jsx |
purchase.thank-you.block.render |
all plans |
src/OrderStatus.jsx |
customer-account.order-status.block.render |
all plans |
The picker calls this app's own checkout.scheduling.availability /
checkout.scheduling.hold routes (session-token auth) and draws from the
same capacity pool as the storefront widget and POS. It only collects a
selection into checkout attributes — the validation-slot Function is still
what enforces it, so the extension is not a security boundary.
The all-plan confirmation is also covered by the theme block
extensions/datetime-widget/blocks/order-confirmation.liquid; the Thank you
/ Order status modules here are the Plus-native version of the same thing.
Before deploy
npm --prefix extensions/checkout-datetime install(pulls@shopify/ui-extensions+preact).- In the extension's settings (Partners dashboard or
shopify.extension.tomldefaults), set App backend URL to the same value asapplication_urlinshopify.app.toml— the extension runs on a different origin and needs the absolute URL to reach the backend. shopify app deploy.
The previous build output under
dist/is gitignored and regenerated on deploy — thissrc/tree is the source of record.
Type checking
tsconfig.json ships with checkJs: false because this source hasn't yet
been iterated against the live @shopify/ui-extensions checkout component
types (that needs the extension's deps installed and, ideally, a real
checkout to verify runtime shapes — same caveat pos-datetime carries).
Before deploying: npm install in this folder, flip checkJs back to
true, run npm run typecheck, and reconcile the <s-*> component props
against the real typings. The decision logic it depends on
(resolveAvailabilityRequest, resolveHoldRequest) is already fully
tested on the server side.