@faststore/core 3.82.0 → 3.82.3
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +43 -43
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/cache/config.json +3 -3
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/prerender-manifest.js +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/react-loadable-manifest.json +24 -24
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/2430.js +1 -1
- package/.next/server/chunks/2570.js +1 -1
- package/.next/server/chunks/8071.js +1 -1
- package/.next/server/chunks/8474.js +1 -1
- package/.next/server/chunks/8563.js +1 -1
- package/.next/server/chunks/8687.js +1 -1
- package/.next/server/chunks/9117.js +1 -1
- package/.next/server/chunks/948.js +2 -2
- package/.next/server/chunks/9563.js +1 -1
- package/.next/server/chunks/9630.js +3 -3
- package/.next/server/chunks/9853.js +1 -1
- package/.next/server/chunks/ButtonSignIn.js +1 -1
- package/.next/server/chunks/UISKUMatrixSidebar.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/[...slug].js +1 -1
- package/.next/server/pages/[slug]/p.js +1 -1
- package/.next/server/pages/account/orders.js +1 -1
- package/.next/server/pages/api/graphql.js +1 -1
- package/.next/server/pages/en-US/404.html +1 -1
- package/.next/server/pages/en-US/500.html +1 -1
- package/.next/server/pages/en-US/checkout.html +1 -1
- package/.next/server/pages/en-US/login.html +1 -1
- package/.next/server/pages/en-US/s.html +1 -1
- package/.next/server/pages/en-US.html +1 -1
- package/.next/server/pages/s.js +1 -1
- package/.next/server/pages-manifest.json +1 -1
- package/.next/static/chunks/2284.6e01b30c38bb74fd.js +1 -0
- package/.next/static/chunks/3155.8ff6efc44151971f.js +1 -0
- package/.next/static/chunks/{3166-a1d98d71987c90d6.js → 3166-785c61fd0e214905.js} +1 -1
- package/.next/static/chunks/3399.15d4dbadc57c3f42.js +1 -0
- package/.next/static/chunks/3836.63a23109a71dbbdb.js +1 -0
- package/.next/static/chunks/4803.74cf987971db6d93.js +1 -0
- package/.next/static/chunks/6700.ddae2aa02d2dd401.js +1 -0
- package/.next/static/chunks/{6789.634a5fcc1ed30b8d.js → 6789.38bef760c1190c23.js} +1 -1
- package/.next/static/chunks/7191-102277856f196551.js +1 -0
- package/.next/static/chunks/83.730576d7ded8dfe2.js +1 -0
- package/.next/static/chunks/8325.40b7331df742c2f5.js +1 -0
- package/.next/static/chunks/9173-912ae438e42cb222.js +1 -0
- package/.next/static/chunks/ButtonSignIn.e767fc25322cf230.js +1 -0
- package/.next/static/chunks/CartItem.d4c2664933f93606.js +1 -0
- package/.next/static/chunks/CartSidebar.e21ad4975e18e6db.js +1 -0
- package/.next/static/chunks/Gift.5891ca280b4f0164.js +1 -0
- package/.next/static/chunks/OrderSummary.35d859a1e467ad91.js +1 -0
- package/.next/static/chunks/ProductShelf.9f3194be577c7cce.js +1 -0
- package/.next/static/chunks/ProductTiles.e0528e72234381e6.js +1 -0
- package/.next/static/chunks/RegionModal.b5edb6ada60d37ec.js +1 -0
- package/.next/static/chunks/RegionSlider.3d9063b0cb6733d9.js +1 -0
- package/.next/static/chunks/UISKUMatrixSidebar.5793df7899038286.js +1 -0
- package/.next/static/chunks/pages/[slug]/p-0287b5a8ac0b92e5.js +1 -0
- package/.next/static/chunks/pages/_app-f8a8608651b3f06b.js +1 -0
- package/.next/static/chunks/pages/account/orders/[id]-c2d355a49d409bb0.js +1 -0
- package/.next/static/chunks/pages/account/orders-68bef823fcd81bf9.js +1 -0
- package/.next/static/chunks/{webpack-70daccedc5bafd4f.js → webpack-3f872192534f3b6d.js} +1 -1
- package/.next/static/{vwdTFcgKjIi-gK7aiBeq3 → z9OgZX4R48DhG_lGERS6x}/_buildManifest.js +1 -1
- package/.next/trace +136 -136
- package/.turbo/turbo-build.log +20 -20
- package/.turbo/turbo-test.log +5 -5
- package/CHANGELOG.md +8 -0
- package/package.json +2 -2
- package/src/Layout.tsx +0 -2
- package/src/components/region/RegionBar/RegionBar.tsx +17 -23
- package/src/components/region/RegionButton/RegionButton.tsx +4 -35
- package/src/experimental/index.ts +3 -1
- package/src/sdk/geolocation/useGeolocation.ts +18 -28
- package/src/sdk/session/index.ts +11 -29
- package/src/sdk/userLocation/index.ts +142 -0
- package/.next/static/chunks/2284.6dd050e60172189a.js +0 -1
- package/.next/static/chunks/3155.45360f19bde878fa.js +0 -1
- package/.next/static/chunks/3399.60aae5ddb9123ef5.js +0 -1
- package/.next/static/chunks/3836.a2f49cd66f78bcb2.js +0 -1
- package/.next/static/chunks/4803.412bf2a7e15626a6.js +0 -1
- package/.next/static/chunks/6700.f046aa86e2c83b53.js +0 -1
- package/.next/static/chunks/7191-bfddc753cd9c143f.js +0 -1
- package/.next/static/chunks/83.45e987438cef99ba.js +0 -1
- package/.next/static/chunks/8325.b3ddbb43feda1a85.js +0 -1
- package/.next/static/chunks/9173-acced9d62b9088c8.js +0 -1
- package/.next/static/chunks/ButtonSignIn.111c95c4e7e2640f.js +0 -1
- package/.next/static/chunks/CartItem.e010557e686e1009.js +0 -1
- package/.next/static/chunks/CartSidebar.f2f885b6d9a227e2.js +0 -1
- package/.next/static/chunks/Gift.f93e4a95caf390e3.js +0 -1
- package/.next/static/chunks/OrderSummary.8092365254225970.js +0 -1
- package/.next/static/chunks/ProductShelf.dcdeffe85dca1ace.js +0 -1
- package/.next/static/chunks/ProductTiles.12e553830401871d.js +0 -1
- package/.next/static/chunks/RegionModal.0aff964cb36eb49a.js +0 -1
- package/.next/static/chunks/RegionSlider.cbf2ac28eeac8dbe.js +0 -1
- package/.next/static/chunks/UISKUMatrixSidebar.8b6fac58c48f999c.js +0 -1
- package/.next/static/chunks/pages/[slug]/p-2c73921b1ab00c27.js +0 -1
- package/.next/static/chunks/pages/_app-cdb132efa1562b88.js +0 -1
- package/.next/static/chunks/pages/account/orders/[id]-0a4ab1b9f4c54abb.js +0 -1
- package/.next/static/chunks/pages/account/orders-63e3a141c7bd9070.js +0 -1
- package/src/components/region/RegionModal/useRegionModal.ts +0 -44
- /package/.next/static/{vwdTFcgKjIi-gK7aiBeq3 → z9OgZX4R48DhG_lGERS6x}/_ssgManifest.js +0 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
|
|
2
|
-
> @faststore/core@3.
|
|
2
|
+
> @faststore/core@3.82.2 prebuild /home/runner/work/faststore/faststore/packages/core
|
|
3
3
|
> na run partytown && na run generate
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @faststore/core@3.
|
|
6
|
+
> @faststore/core@3.82.2 partytown /home/runner/work/faststore/faststore/packages/core
|
|
7
7
|
> partytown copylib ./public/~partytown
|
|
8
8
|
|
|
9
9
|
Partytown lib copied to: /home/runner/work/faststore/faststore/packages/core/public/~partytown
|
|
10
10
|
|
|
11
|
-
> @faststore/core@3.
|
|
11
|
+
> @faststore/core@3.82.2 generate /home/runner/work/faststore/faststore/packages/core
|
|
12
12
|
> na run generate:schema && na run generate:codegen && na run format:generated
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
> @faststore/core@3.
|
|
15
|
+
> @faststore/core@3.82.2 generate:schema /home/runner/work/faststore/faststore/packages/core
|
|
16
16
|
> tsx src/server/generator/generateGraphQLSchemaFile.ts
|
|
17
17
|
|
|
18
18
|
Schema GraphQL file generated successfully
|
|
19
19
|
|
|
20
|
-
> @faststore/core@3.
|
|
20
|
+
> @faststore/core@3.82.2 generate:codegen /home/runner/work/faststore/faststore/packages/core
|
|
21
21
|
> graphql-codegen
|
|
22
22
|
|
|
23
23
|
[STARTED] Parse Configuration
|
|
@@ -37,11 +37,11 @@ Running lifecycle hook "afterStart" scripts...
|
|
|
37
37
|
[CLI] Loading Documents
|
|
38
38
|
[CLI] Generating output
|
|
39
39
|
|
|
40
|
-
> @faststore/core@3.
|
|
40
|
+
> @faststore/core@3.82.2 format:generated /home/runner/work/faststore/faststore/packages/core
|
|
41
41
|
> prettier --write "@generated/**/*.{ts,js,tsx,jsx,json}" --loglevel error
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
> @faststore/core@3.
|
|
44
|
+
> @faststore/core@3.82.2 build /home/runner/work/faststore/faststore/packages/core
|
|
45
45
|
> next build
|
|
46
46
|
|
|
47
47
|
⚠ No build cache found. Please configure build caching for faster rebuilds. Read more: https://nextjs.org/docs/messages/no-cache
|
|
@@ -73,16 +73,16 @@ Warning: Dynamic Content not found for the page: home. Refer to the Dynamic Cont
|
|
|
73
73
|
Collecting build traces ...
|
|
74
74
|
|
|
75
75
|
Route (pages) Size First Load JS
|
|
76
|
-
┌ ● / 3.66 kB
|
|
76
|
+
┌ ● / 3.66 kB 141 kB
|
|
77
77
|
├ └ css/b1806cbafd0c1f81.css 3.06 kB
|
|
78
|
-
├ /_app 0 B
|
|
79
|
-
├ ● /[...slug] 2.45 kB
|
|
78
|
+
├ /_app 0 B 107 kB
|
|
79
|
+
├ ● /[...slug] 2.45 kB 155 kB
|
|
80
80
|
├ ● /[slug]/p 33.2 kB 170 kB
|
|
81
81
|
├ ├ css/a3ca6a9b63f657be.css 5.75 kB
|
|
82
82
|
├ ├ css/62a5153ac7061286.css 6.11 kB
|
|
83
83
|
├ └ css/6d92375b6ee8276a.css 16.1 kB
|
|
84
|
-
├ ○ /404 1.55 kB
|
|
85
|
-
├ ● /500 1.55 kB
|
|
84
|
+
├ ○ /404 1.55 kB 139 kB
|
|
85
|
+
├ ● /500 1.55 kB 139 kB
|
|
86
86
|
├ λ /account 240 B 107 kB
|
|
87
87
|
├ ● /account/[...unknown] 281 B 107 kB
|
|
88
88
|
├ λ /account/403 2.44 kB 139 kB
|
|
@@ -91,7 +91,7 @@ Route (pages) Size First Load JS
|
|
|
91
91
|
├ └ css/5347dbc8b71de47d.css 4.25 kB
|
|
92
92
|
├ λ /account/orders 10.1 kB 147 kB
|
|
93
93
|
├ └ css/38e3a4a55b13b062.css 12.7 kB
|
|
94
|
-
├ λ /account/orders/[id] 12.
|
|
94
|
+
├ λ /account/orders/[id] 12.2 kB 149 kB
|
|
95
95
|
├ └ css/297be4be3be36ff0.css 12.6 kB
|
|
96
96
|
├ λ /account/profile 1.79 kB 139 kB
|
|
97
97
|
├ └ css/831a1f72fe4b2d80.css 3.97 kB
|
|
@@ -99,18 +99,18 @@ Route (pages) Size First Load JS
|
|
|
99
99
|
├ └ css/ec7fdad03808422d.css 5.22 kB
|
|
100
100
|
├ λ /account/user-details 1.74 kB 139 kB
|
|
101
101
|
├ └ css/e46393a76c5d93a9.css 4.17 kB
|
|
102
|
-
├ λ /api/graphql 0 B
|
|
103
|
-
├ λ /api/health/live 0 B
|
|
104
|
-
├ λ /api/health/ready 0 B
|
|
105
|
-
├ λ /api/preview 0 B
|
|
102
|
+
├ λ /api/graphql 0 B 107 kB
|
|
103
|
+
├ λ /api/health/live 0 B 107 kB
|
|
104
|
+
├ λ /api/health/ready 0 B 107 kB
|
|
105
|
+
├ λ /api/preview 0 B 107 kB
|
|
106
106
|
├ ● /checkout 737 B 138 kB
|
|
107
|
-
├ ● /login 1.68 kB
|
|
107
|
+
├ ● /login 1.68 kB 139 kB
|
|
108
108
|
└ ● /s 3.3 kB 155 kB
|
|
109
109
|
+ First Load JS shared by all 110 kB
|
|
110
110
|
├ chunks/framework-807b0f81cbc129f0.js 45.4 kB
|
|
111
111
|
├ chunks/main-f658704b53a96ab1.js 33.1 kB
|
|
112
|
-
├ chunks/pages/_app-
|
|
113
|
-
├ chunks/webpack-
|
|
112
|
+
├ chunks/pages/_app-f8a8608651b3f06b.js 24.3 kB
|
|
113
|
+
├ chunks/webpack-3f872192534f3b6d.js 3.85 kB
|
|
114
114
|
└ css/4b8252ed2f23ac67.css 3.51 kB
|
|
115
115
|
|
|
116
116
|
λ (Server) server-side renders at runtime (uses getInitialProps or getServerSideProps)
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
|
|
2
|
-
> @faststore/core@3.
|
|
2
|
+
> @faststore/core@3.82.2 test /home/runner/work/faststore/faststore/packages/core
|
|
3
3
|
> jest
|
|
4
4
|
|
|
5
|
-
PASS test/
|
|
6
|
-
PASS test/
|
|
5
|
+
PASS test/server/cms/global.test.ts (25.605 s)
|
|
6
|
+
PASS test/utils/multipleTemplates.test.ts (26.115 s)
|
|
7
7
|
PASS test/server/cms/index.test.ts
|
|
8
|
-
PASS test/server/index.test.ts (30.
|
|
8
|
+
PASS test/server/index.test.ts (30.434 s)
|
|
9
9
|
|
|
10
10
|
Test Suites: 4 passed, 4 total
|
|
11
11
|
Tests: 22 passed, 22 total
|
|
12
12
|
Snapshots: 0 total
|
|
13
|
-
Time: 31.
|
|
13
|
+
Time: 31.578 s
|
|
14
14
|
Ran all test suites.
|
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [3.82.3](https://github.com/vtex/faststore/compare/v3.82.2...v3.82.3) (2025-09-08)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @faststore/core
|
|
9
|
+
|
|
10
|
+
## [3.82.2](https://github.com/vtex/faststore/compare/v3.82.1...v3.82.2) (2025-09-05)
|
|
11
|
+
|
|
12
|
+
**Note:** Version bump only for package @faststore/core
|
|
13
|
+
|
|
6
14
|
# [3.82.0](https://github.com/vtex/faststore/compare/v3.81.0...v3.82.0) (2025-09-05)
|
|
7
15
|
|
|
8
16
|
### Features
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@faststore/core",
|
|
3
|
-
"version": "3.82.
|
|
3
|
+
"version": "3.82.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": "vtex/faststore",
|
|
6
6
|
"browserslist": "supports es6-module and not dead",
|
|
@@ -108,5 +108,5 @@
|
|
|
108
108
|
"ts-jest": "29.1.1",
|
|
109
109
|
"typescript": "5.3.2"
|
|
110
110
|
},
|
|
111
|
-
"gitHead": "
|
|
111
|
+
"gitHead": "631280b8c5312c6aeb36d070d6209f70115685b5"
|
|
112
112
|
}
|
package/src/Layout.tsx
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { useMemo, type PropsWithChildren, type ReactElement } from 'react'
|
|
2
2
|
|
|
3
|
-
import { useRegionModal } from './components/region/RegionModal/useRegionModal'
|
|
4
3
|
import { usePageViewEvent } from './sdk/analytics/hooks/usePageViewEvent'
|
|
5
4
|
|
|
6
5
|
function Layout({ children }: PropsWithChildren) {
|
|
7
6
|
const props = useMemo(() => (children as ReactElement)?.props, [])
|
|
8
7
|
usePageViewEvent(props)
|
|
9
|
-
useRegionModal()
|
|
10
8
|
|
|
11
9
|
return <>{children}</>
|
|
12
10
|
}
|
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
regionSliderTypes,
|
|
3
|
-
type RegionBarProps as UIRegionBarProps,
|
|
4
|
-
} from '@faststore/ui'
|
|
1
|
+
import type { RegionBarProps as UIRegionBarProps } from '@faststore/ui'
|
|
5
2
|
import { useEffect, useRef } from 'react'
|
|
6
3
|
|
|
7
|
-
import { useUI } from '@faststore/ui'
|
|
8
|
-
import { useSession } from 'src/sdk/session'
|
|
4
|
+
import { regionSliderTypes, useUI } from '@faststore/ui'
|
|
5
|
+
import { sessionStore, useSession } from 'src/sdk/session'
|
|
9
6
|
import { useDeliveryPromise } from 'src/sdk/deliveryPromise'
|
|
10
7
|
|
|
11
|
-
import { deliveryPromise, session as initialSession } from 'discovery.config'
|
|
12
8
|
import { useOverrideComponents } from 'src/sdk/overrides/OverrideContext'
|
|
13
9
|
import { textToTitleCase } from 'src/utils/utilities'
|
|
14
10
|
import { getGlobalSettings } from 'src/utils/globalSettings'
|
|
11
|
+
import { useCheckRegionState } from 'src/sdk/userLocation'
|
|
15
12
|
|
|
16
|
-
import {
|
|
17
|
-
|
|
13
|
+
import { deliveryPromise } from 'discovery.config'
|
|
18
14
|
export interface RegionBarProps {
|
|
19
15
|
/**
|
|
20
16
|
* A React component that will be rendered as the location icon.
|
|
@@ -55,40 +51,38 @@ function RegionBar({
|
|
|
55
51
|
FilterButtonIcon,
|
|
56
52
|
} = useOverrideComponents<'RegionBar'>()
|
|
57
53
|
|
|
58
|
-
const { openModal, openPopover, openRegionSlider } = useUI()
|
|
59
54
|
const { city, postalCode } = useSession()
|
|
60
|
-
const
|
|
55
|
+
const regionBarRef = useRef<HTMLDivElement>(null)
|
|
56
|
+
const { openPopover, openRegionSlider } = useUI()
|
|
57
|
+
const { openModal } = useCheckRegionState(regionBarRef)
|
|
61
58
|
const { globalPickupPoint } = useDeliveryPromise()
|
|
62
59
|
const {
|
|
63
60
|
deliveryPromise: { filterByPickupPoint } = {},
|
|
64
61
|
} = getGlobalSettings()
|
|
65
|
-
const
|
|
62
|
+
const initialSession = sessionStore.readInitial()
|
|
66
63
|
|
|
67
|
-
const defaultPostalCode =
|
|
68
|
-
!!initialSession?.postalCode && postalCode === initialSession.postalCode
|
|
69
64
|
const shouldDisplayGlobalFilter =
|
|
70
65
|
deliveryPromise.enabled && !!postalCode && filterByPickupPoint?.enabled
|
|
71
66
|
|
|
72
|
-
// If location is not mandatory, and default zipCode is provided or if the user has not set a zipCode, show the popover.
|
|
73
|
-
const displayRegionPopover =
|
|
74
|
-
defaultPostalCode || (!postalCode && !deliveryPromise.mandatory)
|
|
75
|
-
|
|
76
67
|
useEffect(() => {
|
|
77
68
|
if (!deliveryPromise.enabled) {
|
|
78
69
|
return
|
|
79
70
|
}
|
|
80
71
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
72
|
+
const defaultPostalCode =
|
|
73
|
+
!!initialSession?.postalCode && postalCode === initialSession.postalCode
|
|
74
|
+
|
|
75
|
+
// If location is not mandatory, and default zipCode is provided or if the user has not set a zipCode, show the popover.
|
|
76
|
+
const displayRegionPopover =
|
|
77
|
+
defaultPostalCode || (!postalCode && !deliveryPromise.mandatory)
|
|
84
78
|
|
|
85
|
-
if (
|
|
79
|
+
if (displayRegionPopover && regionBarRef.current) {
|
|
86
80
|
openPopover({
|
|
87
81
|
isOpen: true,
|
|
88
82
|
triggerRef: regionBarRef,
|
|
89
83
|
})
|
|
90
84
|
}
|
|
91
|
-
}, [
|
|
85
|
+
}, [])
|
|
92
86
|
|
|
93
87
|
return (
|
|
94
88
|
<RegionBarWrapper.Component
|
|
@@ -1,45 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useRef } from 'react'
|
|
2
2
|
|
|
3
|
-
import { Button as UIButton, Icon as UIIcon
|
|
4
|
-
import { deliveryPromise, session as initialSession } from 'discovery.config'
|
|
3
|
+
import { Button as UIButton, Icon as UIIcon } from '@faststore/ui'
|
|
5
4
|
import { useSession } from 'src/sdk/session'
|
|
6
5
|
import { textToTitleCase } from 'src/utils/utilities'
|
|
7
|
-
|
|
8
|
-
import { useRegionModal } from '../RegionModal/useRegionModal'
|
|
6
|
+
import { useCheckRegionState } from 'src/sdk/userLocation'
|
|
9
7
|
|
|
10
8
|
function RegionButton({ icon, label }: { icon: string; label: string }) {
|
|
11
|
-
const { openModal, openPopover } = useUI()
|
|
12
9
|
const { city, postalCode } = useSession()
|
|
13
|
-
const { isValidationComplete } = useRegionModal()
|
|
14
10
|
const regionButtonRef = useRef<HTMLButtonElement>(null)
|
|
15
|
-
|
|
16
|
-
const defaultPostalCode =
|
|
17
|
-
!!initialSession?.postalCode && postalCode === initialSession.postalCode
|
|
18
|
-
|
|
19
|
-
// If location is not mandatory, and default zipCode is provided or if the user has not set a zipCode, show the popover.
|
|
20
|
-
const displayRegionPopover =
|
|
21
|
-
defaultPostalCode || (!postalCode && !deliveryPromise.mandatory)
|
|
22
|
-
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
if (!deliveryPromise.enabled) {
|
|
25
|
-
return
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (!isValidationComplete) {
|
|
29
|
-
return
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (
|
|
33
|
-
isValidationComplete &&
|
|
34
|
-
displayRegionPopover &&
|
|
35
|
-
regionButtonRef.current
|
|
36
|
-
) {
|
|
37
|
-
openPopover({
|
|
38
|
-
isOpen: true,
|
|
39
|
-
triggerRef: regionButtonRef,
|
|
40
|
-
})
|
|
41
|
-
}
|
|
42
|
-
}, [isValidationComplete])
|
|
11
|
+
const { openModal } = useCheckRegionState(regionButtonRef)
|
|
43
12
|
|
|
44
13
|
return (
|
|
45
14
|
<UIButton
|
|
@@ -41,13 +41,15 @@ export { useShippingSimulation as useShippingSimulation_unstable } from '../../s
|
|
|
41
41
|
export { default as useScreenResize_unstable } from '../../src/sdk/ui/useScreenResize'
|
|
42
42
|
|
|
43
43
|
// Components
|
|
44
|
+
export { OrganizationSignInButton as OrganizationSignInButton_unstable } from '../../src/components/account/MyAccountDrawer/OrganizationSignInButton'
|
|
44
45
|
export { ProfileChallenge as ProfileChallenge_unstable } from '../../src/components/auth/ProfileChallenge'
|
|
45
46
|
export { ButtonSignIn as ButtonSignIn_unstable } from '../../src/components/ui/Button'
|
|
47
|
+
|
|
46
48
|
export { Image as Image_unstable } from '../../src/components/ui/Image'
|
|
47
49
|
export { default as Selectors_unstable } from '../../src/components/ui/SkuSelector'
|
|
48
50
|
|
|
49
51
|
// Delivery Promise
|
|
50
52
|
export {
|
|
51
|
-
useDeliveryPromise as useDeliveryPromise_unstable,
|
|
52
53
|
deliveryPromiseStore as deliveryPromiseStore_unstable,
|
|
54
|
+
useDeliveryPromise as useDeliveryPromise_unstable,
|
|
53
55
|
} from 'src/sdk/deliveryPromise'
|
|
@@ -3,33 +3,7 @@ import { useEffect } from 'react'
|
|
|
3
3
|
import { deliveryPromise } from 'discovery.config'
|
|
4
4
|
import { TIME_TO_VALIDATE_SESSION } from 'src/constants'
|
|
5
5
|
import { sessionStore, validateSession } from 'src/sdk/session'
|
|
6
|
-
|
|
7
|
-
async function askGeolocationConsent() {
|
|
8
|
-
const { postalCode: stalePostalCode, geoCoordinates: staleGeoCoordinates } =
|
|
9
|
-
sessionStore.read()
|
|
10
|
-
|
|
11
|
-
if (navigator?.geolocation && (!stalePostalCode || !staleGeoCoordinates)) {
|
|
12
|
-
navigator.geolocation.getCurrentPosition(
|
|
13
|
-
async ({ coords: { latitude, longitude } }) => {
|
|
14
|
-
// Revalidate the session because users can set a zip code while granting consent.
|
|
15
|
-
const revalidatedSession = sessionStore.read()
|
|
16
|
-
if (
|
|
17
|
-
revalidatedSession.postalCode ||
|
|
18
|
-
revalidatedSession.geoCoordinates
|
|
19
|
-
) {
|
|
20
|
-
return
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const newSession = {
|
|
24
|
-
...revalidatedSession,
|
|
25
|
-
geoCoordinates: { latitude, longitude },
|
|
26
|
-
}
|
|
27
|
-
const validatedSession = await validateSession(newSession)
|
|
28
|
-
sessionStore.set(validatedSession ?? newSession)
|
|
29
|
-
}
|
|
30
|
-
)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
6
|
+
import { getNavigatorGeolocation } from '../userLocation'
|
|
33
7
|
|
|
34
8
|
export default function useGeolocation() {
|
|
35
9
|
useEffect(() => {
|
|
@@ -37,6 +11,22 @@ export default function useGeolocation() {
|
|
|
37
11
|
return
|
|
38
12
|
}
|
|
39
13
|
|
|
40
|
-
setTimeout(() =>
|
|
14
|
+
setTimeout(() => {
|
|
15
|
+
let session = sessionStore.read()
|
|
16
|
+
|
|
17
|
+
if (!session.postalCode || !session.geoCoordinates) {
|
|
18
|
+
getNavigatorGeolocation(session).then(async (newSession) => {
|
|
19
|
+
if (session === newSession) return
|
|
20
|
+
|
|
21
|
+
// checks if someone already filled the location data
|
|
22
|
+
session = sessionStore.read()
|
|
23
|
+
if (session.postalCode || session.geoCoordinates) {
|
|
24
|
+
return
|
|
25
|
+
}
|
|
26
|
+
const validatedSession = await validateSession(newSession)
|
|
27
|
+
sessionStore.set(validatedSession ?? newSession)
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
}, TIME_TO_VALIDATE_SESSION)
|
|
41
31
|
}, [])
|
|
42
32
|
}
|
package/src/sdk/session/index.ts
CHANGED
|
@@ -13,8 +13,9 @@ import { sanitizeHost } from 'src/utils/utilities'
|
|
|
13
13
|
import storeConfig from '../../../discovery.config'
|
|
14
14
|
import { cartStore } from '../cart'
|
|
15
15
|
import { request } from '../graphql/request'
|
|
16
|
-
import { getSavedAddress } from '../profile'
|
|
17
16
|
import { createValidationStore, useStore } from '../useStore'
|
|
17
|
+
import { getPostalCode } from '../userLocation/index'
|
|
18
|
+
import deepEqual from 'fast-deep-equal'
|
|
18
19
|
|
|
19
20
|
const REFRESH_TOKEN_URL = `${discoveryConfig.storeUrl}/api/vtexid/refreshtoken/webstore`
|
|
20
21
|
|
|
@@ -75,41 +76,20 @@ export const mutation = gql(`
|
|
|
75
76
|
|
|
76
77
|
export const validateSession = async (session: Session) => {
|
|
77
78
|
// If deliveryPromise is enabled and there is no postalCode in the session
|
|
78
|
-
if (
|
|
79
|
+
if (
|
|
80
|
+
storeConfig.deliveryPromise?.enabled &&
|
|
81
|
+
(!session.postalCode ||
|
|
82
|
+
session.postalCode === storeConfig.session.postalCode)
|
|
83
|
+
) {
|
|
79
84
|
// Case B2B: If a B2B shopper is logged in and a saved address is available, the postalCode field is automatically updated with the postal code from that address by the B2B session apps (shopper-session and profile-session).
|
|
80
85
|
if (session.b2b && session.b2b?.savedPostalCode) {
|
|
81
86
|
sessionStore.set({
|
|
82
87
|
...session,
|
|
83
88
|
postalCode: session.b2b.savedPostalCode,
|
|
84
89
|
})
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// Case B2C: If a B2C shopper is logged in, try to get the location (postalCode, geoCoordinates, and country) from their saved address
|
|
88
|
-
else if (session.person?.id) {
|
|
89
|
-
const address = await getSavedAddress(session.person?.id)
|
|
90
|
-
|
|
91
|
-
// Save the location in the session
|
|
92
|
-
if (address) {
|
|
93
|
-
sessionStore.set({
|
|
94
|
-
...session,
|
|
95
|
-
city: address?.city,
|
|
96
|
-
postalCode: address?.postalCode,
|
|
97
|
-
geoCoordinates: {
|
|
98
|
-
// the values come in the reverse expected order
|
|
99
|
-
latitude: address?.geoCoordinate ? address?.geoCoordinate[1] : null,
|
|
100
|
-
longitude: address?.geoCoordinate
|
|
101
|
-
? address?.geoCoordinate[0]
|
|
102
|
-
: null,
|
|
103
|
-
},
|
|
104
|
-
country: address?.country,
|
|
105
|
-
})
|
|
106
|
-
}
|
|
107
90
|
} else {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
!!initialPostalCode &&
|
|
112
|
-
sessionStore.set({ ...session, postalCode: initialPostalCode })
|
|
91
|
+
const sessionWithLocation = await getPostalCode(session)
|
|
92
|
+
!!sessionWithLocation && sessionStore.set(sessionWithLocation)
|
|
113
93
|
}
|
|
114
94
|
}
|
|
115
95
|
|
|
@@ -170,6 +150,8 @@ const defaultStore = createSessionStore(storeConfig.session, onValidate)
|
|
|
170
150
|
export const sessionStore = {
|
|
171
151
|
...defaultStore,
|
|
172
152
|
set: (val: Session) => {
|
|
153
|
+
if (deepEqual(val, defaultStore.read()) === true) return
|
|
154
|
+
|
|
173
155
|
defaultStore.set(val)
|
|
174
156
|
|
|
175
157
|
// Trigger cart revalidation when session changes
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { Session } from '@faststore/sdk'
|
|
2
|
+
import { getSavedAddress } from '../profile'
|
|
3
|
+
import DiscoveryConfig from 'discovery.config'
|
|
4
|
+
import { sessionStore } from '../session'
|
|
5
|
+
import { type RefObject, useEffect, useState } from 'react'
|
|
6
|
+
import { useUI } from '@faststore/ui'
|
|
7
|
+
|
|
8
|
+
const set = (session: Session, data: Partial<Session>) => {
|
|
9
|
+
if (!data || !Object.keys(data).length) return session
|
|
10
|
+
|
|
11
|
+
return { ...session, ...data }
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
let userAddress: Partial<
|
|
15
|
+
Pick<Session, 'city' | 'country' | 'geoCoordinates' | 'postalCode'>
|
|
16
|
+
> = undefined
|
|
17
|
+
const getUserSavedAddress = async (session: Session): Promise<Session> => {
|
|
18
|
+
if (!!userAddress) return set(session, userAddress)
|
|
19
|
+
const user = session?.person
|
|
20
|
+
if (!user?.id) return Promise.resolve(session)
|
|
21
|
+
|
|
22
|
+
const { city, country, geoCoordinate, postalCode } =
|
|
23
|
+
(await getSavedAddress(user.id)) ?? {}
|
|
24
|
+
|
|
25
|
+
userAddress = {
|
|
26
|
+
city,
|
|
27
|
+
country,
|
|
28
|
+
geoCoordinates: {
|
|
29
|
+
latitude: geoCoordinate?.[1] ?? null,
|
|
30
|
+
longitude: geoCoordinate?.[0] ?? null,
|
|
31
|
+
},
|
|
32
|
+
postalCode,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return set(session, userAddress)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let geoCoordinates: Session['geoCoordinates'] = undefined
|
|
39
|
+
export const getNavigatorGeolocation = (session: Session) => {
|
|
40
|
+
return new Promise<Session>((res) => {
|
|
41
|
+
if (!!geoCoordinates) return res(set(session, { geoCoordinates }))
|
|
42
|
+
|
|
43
|
+
const successLocation: PositionCallback = ({
|
|
44
|
+
coords: { latitude, longitude },
|
|
45
|
+
}) => {
|
|
46
|
+
geoCoordinates = { latitude, longitude }
|
|
47
|
+
return res(set(session, { geoCoordinates }))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const onError: PositionErrorCallback = (err) => {
|
|
51
|
+
console.warn('Failed to get navigator location: ', err)
|
|
52
|
+
return res(session)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!!navigator && 'geolocation' in navigator) {
|
|
56
|
+
const SECONDS = 1000,
|
|
57
|
+
MINUTE = 60 * SECONDS
|
|
58
|
+
|
|
59
|
+
return navigator.geolocation.getCurrentPosition(
|
|
60
|
+
successLocation,
|
|
61
|
+
onError,
|
|
62
|
+
{
|
|
63
|
+
timeout: 3 * MINUTE,
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return session
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export const getPostalCode = async (session: Session) => {
|
|
73
|
+
const sessionWithLoggedAddress = await getUserSavedAddress(session)
|
|
74
|
+
|
|
75
|
+
if (sessionWithLoggedAddress !== session) return sessionWithLoggedAddress
|
|
76
|
+
|
|
77
|
+
const defaultPostalCode: string | null =
|
|
78
|
+
DiscoveryConfig.session?.postalCode ?? null
|
|
79
|
+
|
|
80
|
+
return set(session, {
|
|
81
|
+
postalCode: defaultPostalCode,
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const { deliveryPromise, session: defaultSession } = DiscoveryConfig
|
|
86
|
+
|
|
87
|
+
export const useCheckRegionState = (popoverRef?: RefObject<HTMLElement>) => {
|
|
88
|
+
const [regionPopoverState, setRegionPopoverState] = useState<
|
|
89
|
+
'open' | 'closed'
|
|
90
|
+
>('closed')
|
|
91
|
+
const { openModal, openPopover, modal: modalOpen, closePopover } = useUI()
|
|
92
|
+
|
|
93
|
+
function getPopoverState(session: Session) {
|
|
94
|
+
const isDefaultPostalCode =
|
|
95
|
+
!!defaultSession.postalCode &&
|
|
96
|
+
defaultSession.postalCode === session?.postalCode
|
|
97
|
+
|
|
98
|
+
const newPopoverState =
|
|
99
|
+
isDefaultPostalCode ||
|
|
100
|
+
(!session?.postalCode && !deliveryPromise.mandatory)
|
|
101
|
+
? 'open'
|
|
102
|
+
: 'closed'
|
|
103
|
+
|
|
104
|
+
return newPopoverState
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (!deliveryPromise.enabled) return
|
|
109
|
+
|
|
110
|
+
const handle = (session: Session) => {
|
|
111
|
+
if (deliveryPromise.mandatory && !session?.postalCode && !modalOpen)
|
|
112
|
+
return openModal()
|
|
113
|
+
|
|
114
|
+
setRegionPopoverState((state) => {
|
|
115
|
+
const newState = getPopoverState(session)
|
|
116
|
+
return state !== newState ? newState : state
|
|
117
|
+
})
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return sessionStore.subscribe(handle)
|
|
121
|
+
}, [modalOpen])
|
|
122
|
+
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
if (regionPopoverState === 'closed') {
|
|
125
|
+
closePopover()
|
|
126
|
+
return
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (popoverRef) {
|
|
130
|
+
openPopover({
|
|
131
|
+
isOpen: true,
|
|
132
|
+
triggerRef: popoverRef,
|
|
133
|
+
})
|
|
134
|
+
}
|
|
135
|
+
}, [popoverRef, regionPopoverState])
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
openModal,
|
|
139
|
+
openPopover,
|
|
140
|
+
regionPopoverState,
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2284],{2284:function(e,t,r){r.r(t),r.d(t,{default:function(){return search_SearchDropdown_SearchDropdown},sendAutocompleteClickEvent:function(){return sendAutocompleteClickEvent}});var a=r(3067),n=r(4235),i=r(1933),o=r(4583),c=r(2174),s=r(757),l=r(9994),u=r(2701),d=r(9482),m=r(1379),f=r(1549);function ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,a)}return r}function _objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(r),!0).forEach(function(t){(0,a.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var search_SearchHistory_SearchHistory=e=>{var t=Object.assign({},e),{values:{onSearchSelection:r}}=(0,i.R)(),{searchHistory:a,clearSearchHistory:n}=(0,m.Z)();return a.length?(0,f.jsx)(u.Z,_objectSpread(_objectSpread({title:"History",onClear:n},t),{},{children:a.map(e=>(0,f.jsx)(d.Z,{value:e.term,linkProps:{href:e.path,onClick:()=>null==r?void 0:r(e.term,e.path)}},e.term))})):null},p=r(3311),h=r(1287),v=r(704),y=r(5487),g=r(2693),b=r(31),O=y.M,search_useTopSearch=function(){var{channel:e,locale:t}=(0,b.kP)(),{data:r,error:a}=(0,g.aM)(O,{term:"",selectedFacets:[{key:"channel",value:null!=e?e:""},{key:"locale",value:t}]});return{data:r,error:a}},w=["topTerms","sort"];function SearchTop_ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,a)}return r}function SearchTop_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?SearchTop_ownKeys(Object(r),!0).forEach(function(t){(0,a.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):SearchTop_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var search_SearchTop_SearchTop=function(e){var t,{topTerms:r=[],sort:a}=e,o=(0,n.Z)(e,w),{values:{onSearchSelection:c}}=(0,i.R)(),{data:s}=search_useTopSearch(),l=(null!==(t=null==s?void 0:s.search.suggestions.terms)&&void 0!==t?t:r).slice(0,5);return 0===l.length?null:(0,f.jsx)(p.Z,SearchTop_objectSpread(SearchTop_objectSpread({title:"Top Search"},o),{},{children:l.map((e,t)=>(0,f.jsx)(h.Z,{value:e.value,index:t,linkProps:{href:(0,v.u)({term:e.value,sort:a}),onClick:()=>null==c?void 0:c(e.value,(0,v.u)({term:e.value,sort:a}))}},t))}))},E=r(6652),S=r(6035),k=r(9082),j=r(7190),P=r(2614),_=r(7866),Z=r(7859),C=r(4194),x=r(2056),D=r(8687),I=r(9746),q=r(643),R=r(8563),T=r(1090),M=r.n(T),K=["product","index","quickOrderSettings","onChangeCustomSearchDropdownVisible"],V=["href","onClick"];function SearchProductItem_ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,a)}return r}function SearchProductItem_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?SearchProductItem_ownKeys(Object(r),!0).forEach(function(t){(0,a.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):SearchProductItem_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var search_SearchProductItem_SearchProductItem=function(e){var{product:t,index:r,quickOrderSettings:a,onChangeCustomSearchDropdownVisible:o}=e,c=(0,n.Z)(e,K),{values:{term:s,onSearchSelection:l}}=(0,i.R)(),{pushToast:u}=(0,E.l8)(),{__experimentalSKUMatrixSidebar:d}=(0,I.r3)(),m=(0,R.w)({product:t,selectedOffer:0,index:r}),{href:p,onClick:h}=m,v=(0,n.Z)(m,V),{0:y,1:g}=(0,C.useState)(1),{id:b,sku:O,gtin:w,brand:T,isVariantOf:L,isVariantOf:{name:Q},unitMultiplier:B,image:[F],offers:{lowPrice:N,offers:[{listPrice:U,availability:A,price:H,listPriceWithTaxes:G,seller:z,priceWithTaxes:W,quantity:$}]},additionalProperty:J}=t,X=SearchProductItem_objectSpread({href:p,onClick:()=>{var e;h(),null==l||l(Q,p),sendAutocompleteClickEvent({url:p,term:s,position:r,productId:null!==(e=t.isVariantOf.productGroupID)&&void 0!==e?e:t.sku})}},v),Y=(0,C.useMemo)(()=>"https://schema.org/OutOfStock"===A,[A]),ee=(0,C.useMemo)(()=>!!Object.keys(t.isVariantOf.skuVariants.allVariantsByName).length,[t]),et=(0,D.Q)({id:b,price:H,priceWithTaxes:W,listPrice:U,listPriceWithTaxes:G,seller:z,quantity:y,itemOffered:{sku:O,name:Q,gtin:w,image:[F],brand:T,isVariantOf:L,additionalProperty:J,unitMultiplier:B}},!1);return(0,f.jsxs)(S.Z,SearchProductItem_objectSpread(SearchProductItem_objectSpread({linkProps:X},c),{},{children:[(0,f.jsx)(k.Z,{children:(0,f.jsx)(x.Z,{src:F.url,alt:F.alternateName,width:56,height:56})}),(0,f.jsx)(j.Z,{title:Q,price:{value:N,listPrice:U,formatter:q.P},onValidateBlur:(e,t,r)=>u({title:"Invalid quantity!",message:"The quantity you entered is outside the range of ".concat(e," to ").concat(t,". The quantity was set to ").concat(r,"."),status:"INFO",icon:(0,f.jsx)(P.Z,{name:"CircleWavyWarning",width:30,height:30})}),quickOrder:{enabled:null==a?void 0:a.quickOrder,outOfStockLabel:"Out of stock",availability:!Y,hasVariants:ee,buyProps:et,quantity:y,onChangeQuantity:g,max:$,skuMatrixControl:(0,f.jsx)(f.Fragment,{children:(null==a?void 0:a.quickOrder)&&(0,f.jsxs)(_.Z,{children:[(0,f.jsx)(Z.Z,{children:null==a?void 0:a.skuMatrix.triggerButtonLabel}),(0,f.jsx)(d.Component,{overlayProps:{className:M().section},formatter:q.P,columns:null==a?void 0:a.skuMatrix.columns,product:t,status:e=>o("visible"===e)})]})})}})]}))},L=["sort","quickOrderSettings","onChangeCustomSearchDropdownVisible"];function SearchDropdown_ownKeys(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,a)}return r}function SearchDropdown_objectSpread(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?SearchDropdown_ownKeys(Object(r),!0).forEach(function(t){(0,a.Z)(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):SearchDropdown_ownKeys(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function sendAutocompleteClickEvent(e){var{url:t,term:a,position:n,productId:i}=e;r.e(6393).then(r.bind(r,6393)).then(e=>{var{sendAnalyticsEvent:r}=e;r({name:"intelligent_search_autocomplete_click",params:{term:a,url:t,productId:i,position:n}})})}var search_SearchDropdown_SearchDropdown=function(e){var{sort:t,quickOrderSettings:r,onChangeCustomSearchDropdownVisible:a}=e,u=(0,n.Z)(e,L),{values:{onSearchSelection:d,products:m,term:p,terms:h}}=(0,i.R)();return(0,f.jsxs)(o.Z,SearchDropdown_objectSpread(SearchDropdown_objectSpread({},u),{},{children:[(0,f.jsx)(search_SearchHistory_SearchHistory,{sort:t}),(0,f.jsx)(search_SearchTop_SearchTop,{sort:t}),(0,f.jsx)(c.Z,{children:null==h?void 0:h.map(e=>{var{value:r}=e;return(0,f.jsx)(s.Z,{term:p,suggestion:r,linkProps:{href:(0,v.u)({term:r,sort:t}),onClick:()=>{null==d||d(p,(0,v.u)({term:p,sort:t})),sendAutocompleteClickEvent({term:p,url:window.location.href})}}},r)})}),(0,f.jsx)(l.Z,{children:m.map((e,t)=>(0,f.jsx)(search_SearchProductItem_SearchProductItem,{product:e,index:t,quickOrderSettings:r,onChangeCustomSearchDropdownVisible:a},e.id))})]}))}},8687:function(e,t,r){r.d(t,{Q:function(){return useBuyButton}});var a=r(4194),n=r(6652),i=r(31),o=r(1041),useBuyButton=function(e){var t,c=!(arguments.length>1)||void 0===arguments[1]||arguments[1],{openCart:s}=(0,n.l8)(),{currency:{code:l}}=(0,i.kP)(),u=Array.isArray(e);return{onClick:(0,a.useCallback)(t=>{if(t.preventDefault(),e){var a=u?e.reduce((e,t)=>e+=t.price*t.quantity,0):e.price*e.quantity;r.e(6393).then(r.bind(r,6393)).then(t=>{var{sendAnalyticsEvent:r}=t;r({name:"add_to_cart",params:{currency:l,value:a,items:u?e.map(generatedItem):[generatedItem(e)]}})}),u?e.forEach(e=>o.i8.addItem(e)):o.i8.addItem(e),c&&s()}function generatedItem(e){return{item_id:e.itemOffered.isVariantOf.productGroupID,item_name:e.itemOffered.isVariantOf.name,item_brand:e.itemOffered.brand.name,item_variant:e.itemOffered.sku,quantity:e.quantity,price:e.price,discount:e.listPrice-e.price,currency:l,item_variant_name:e.itemOffered.name,product_reference_id:e.itemOffered.gtin}}},[l,e,s,u]),"data-testid":"buy-button","data-sku":u?"sku-matrix-sidebar":null==e?void 0:e.itemOffered.sku,"data-seller":u?null===(t=e[0])||void 0===t?void 0:t.seller.identifier:null==e?void 0:e.seller.identifier}}},643:function(e,t,r){r.d(t,{P:function(){return useFormattedPrice}});var a=r(4194),n=r(31),usePriceFormatter=function(){var{decimals:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{currency:t,locale:r}=(0,n.kP)();return(0,a.useCallback)(a=>Intl.NumberFormat(r,{style:"currency",currency:t.code,minimumFractionDigits:e?2:0}).format(a),[t.code,r,e])},useFormattedPrice=e=>{var t=usePriceFormatter();return(0,a.useMemo)(()=>t(e),[t,e])}},8563:function(e,t,r){r.d(t,{w:function(){return useProductLink}});var a=r(4194),n=r(31),useProductLink=e=>{var{index:t,product:i,selectedOffer:o}=e,{slug:c}=i,{currency:{code:s}}=(0,n.kP)(),l=(0,a.useCallback)(()=>{r.e(6393).then(r.bind(r,6393)).then(e=>{var{sendAnalyticsEvent:r}=e;r({name:"select_item",params:{items:[{item_id:i.isVariantOf.productGroupID,item_name:i.isVariantOf.name,item_brand:i.brand.name,item_variant:i.sku,index:t,price:i.offers.offers[o].price,discount:i.offers.offers[o].listPrice-i.offers.offers[o].price,currency:s,item_variant_name:i.name,product_reference_id:i.gtin}]}}),r({name:"search_select_item",params:{url:window.location.href,items:[{item_id:i.isVariantOf.productGroupID,item_variant:i.sku,index:t}]}})})},[s,i,t,o]);return{href:"/".concat(c,"/p"),onClick:l,"data-testid":"product-link"}}},9767:function(e,t,r){var a=r(4194),n=r(5450);let i=(0,a.forwardRef)(function({value:e,as:t="span",variant:r="selling",testId:i="fs-price",formatter:o=e=>e,SRText:c,...s},l){let u=o(e,r);return a.createElement(t,{ref:l,"data-fs-price":!0,"data-fs-price-variant":r,"data-testid":i,...s},c&&a.createElement(n.Z,{text:c}),u)});t.Z=i},5450:function(e,t,r){var a=r(4194);t.Z=function({text:e,as:t}){let r=t??"span";return a.createElement(r,{"data-fs-sr-only":!0},e)}},2955:function(e,t,r){r.d(t,{_:function(){return useSKUMatrix}});var a=r(4194),n=r(3442);function useSKUMatrix(){let e=(0,a.useContext)(n.m);if(!e)throw Error("Do not use SKUMatrix components outside the SKUMatrix context.");return e}},1933:function(e,t,r){r.d(t,{R:function(){return useSearch}});var a=r(4194),n=r(101);let useSearch=()=>{let e=(0,a.useContext)(n.c);return e?{inContext:!0,values:e}:{inContext:!1}}},9088:function(e,t,r){var a=r(4194),n=r(9767);let i=(0,a.forwardRef)(function({testId:e="fs-product-price",value:t,listPrice:r,formatter:i,...o},c){let s=r??0,l=t??0;return a.createElement("div",{ref:c,"data-fs-product-price":!0,"data-testid":e,...o},l!==s&&0!==s?a.createElement(a.Fragment,null,a.createElement(n.Z,{value:s,formatter:i,testId:"list-price","data-value":s,variant:"listing",SRText:"Original price:"}),a.createElement(n.Z,{value:l,formatter:i,testId:"price","data-value":l,variant:"spot",SRText:"Price:"})):a.createElement(n.Z,{value:l,formatter:i,testId:"price","data-value":l,variant:"spot",SRText:"Price:"}))});t.Z=i},6693:function(e,t,r){var a=r(4194),n=r(7041),i=r(2614),o=r(2256);t.Z=({max:e,min:t=1,unitMultiplier:r=1,useUnitMultiplier:c,initial:s,disabled:l=!1,onChange:u,onValidateBlur:d,testId:m="fs-quantity-selector",...f})=>{let[p,h]=(0,a.useState)(s??t),[v,y]=(0,a.useState)(p*r),roundUpQuantityIfNeeded=e=>c?Math.ceil(e/r)*r:e,g=p===t,b=p===e,changeQuantity=e=>{let t=validateQuantityBounds(p+e);u?.(t),h(t),y(t*r)};function validateQuantityBounds(a){let n=t?Math.max(a,t):a;return e?Math.min(n,c?e*r:e):n}return(0,a.useEffect)(()=>{s&&h(s)},[s]),a.createElement("div",{"data-fs-quantity-selector":l?"disabled":"true","data-testid":m,...f},a.createElement(n.Z,{"data-quantity-selector-button":"left",icon:a.createElement(i.Z,{name:"Minus",width:16,height:16,weight:"bold"}),"aria-label":"Decrement Quantity","aria-controls":"quantity-selector-input",disabled:g||l,onClick:()=>changeQuantity(-1),testId:`${m}-left-button`,size:"small"}),a.createElement(o.Z,{"data-quantity-selector-input":!0,id:"quantity-selector-input","aria-label":"Quantity",value:c?v:p,onChange:e=>{let t=e.target.value.replace(/\D/g,"");h(Number(t))},onBlur:function(){let a=validateQuantityBounds(p),n=roundUpQuantityIfNeeded(a),i=e??(t?Math.max(p,t):p),o=p>i||p<t;o&&d?.(t,i,n),h(()=>(y(n),u?.(n/r),n/r))},onInput:e=>{let t=e.currentTarget;t.value=t.value.replace(/\D/g,"")},disabled:l}),a.createElement(n.Z,{"data-quantity-selector-button":"right","aria-controls":"quantity-selector-input","aria-label":"Increment Quantity",disabled:b||l,icon:a.createElement(i.Z,{name:"Plus",width:16,height:16,weight:"bold"}),onClick:()=>changeQuantity(1),testId:`${m}-right-button`,size:"small"}))}},2174:function(e,t,r){var a=r(4194),n=r(1933),i=r(4564);t.Z=({testId:e="fs-search-auto-complete",children:t,...r})=>{let{inContext:o,values:c}=(0,n.R)();return o&&(c.terms.length<=0||c.term.length<=0)?null:a.createElement("section",{"data-testid":e,"data-fs-search-auto-complete":!0,...r},a.createElement(i.Z,{as:"ol"},t))}},757:function(e,t,r){var a=r(4194),n=r(2614),i=r(727);t.Z=({testId:e="fs-search-auto-complete-term",suggestion:t,term:r,linkProps:o,icon:c=a.createElement(n.Z,{name:"MagnifyingGlass",width:18,height:18})})=>{let s=t.toLowerCase().split(r.toLowerCase());return a.createElement("li",{"data-fs-search-auto-complete-item":!0,"data-testid":e},a.createElement(i.Z,{...o,"data-fs-search-auto-complete-item-link":!0,variant:"display"},a.createElement("span",{"data-fs-search-auto-complete-item-icon":!0},c),a.createElement("p",null,s.map((e,n)=>a.createElement(a.Fragment,{key:[e,n].join()},e.length>0&&a.createElement("strong",{"data-fs-search-auto-complete-item-suggestion":!0},0===n?e.charAt(0).toUpperCase()+e.slice(1):e),n!==s.length-1&&(0===n?r.split("").map((e,r)=>0===r&&0===t.indexOf(e.toUpperCase())?e.toUpperCase():e.toLowerCase()).join(""):r.toLowerCase()))))))}},4583:function(e,t,r){var a=r(4194),n=r(1933);let SearchLoading=()=>{let{inContext:e,values:t}=(0,n.R)();return a.createElement(a.Fragment,null,e&&t.isLoading&&a.createElement("p",{"data-fs-search-dropdown-loading-text":!0},"Loading..."))},i=(0,a.forwardRef)(function({testId:e="fs-search-dropdown",children:t,...r},n){return a.createElement("div",{ref:n,"data-fs-search-dropdown":!0,"data-testid":e,...r},a.createElement("section",null,a.createElement(SearchLoading,null),t))});t.Z=i},2701:function(e,t,r){var a=r(4194),n=r(1933),i=r(9009),o=r(4564);t.Z=({testId:e="fs-search-history",title:t="History",clearLabel:r="Clear History",onClear:c,children:s,...l})=>{let{inContext:u,values:d}=(0,n.R)();return u&&(0!==d.term.length||d.isLoading)?null:a.createElement("section",{"data-testid":e,"data-fs-search-history":!0,...l},a.createElement("header",{"data-fs-search-history-header":!0},a.createElement("p",{"data-fs-search-history-title":!0},t),a.createElement(i.Z,{variant:"tertiary",onClick:c,size:"small"},r)),a.createElement(o.Z,{as:"ol"},s))}},9482:function(e,t,r){var a=r(4194),n=r(2614),i=r(727);t.Z=({testId:e="fs-search-history-term",value:t,linkProps:r,icon:o=a.createElement(n.Z,{name:"ClockClockwise",width:18,height:18})})=>a.createElement("li",{"data-fs-search-history-item":!0,"data-testid":e},a.createElement(i.Z,{...r,"data-fs-search-history-item-link":!0,variant:"display"},a.createElement("span",{"data-fs-search-history-item-icon":!0},o),a.createElement("span",null,t)))},6035:function(e,t,r){var a=r(4194),n=r(727);let i=(0,a.forwardRef)(function({testId:e="fs-search-product-item",linkProps:t,children:r},i){return a.createElement("li",{ref:i,"data-fs-search-product-item":!0,"data-testid":e},a.createElement(n.Z,{...t,"data-fs-search-product-item-link":!0,variant:"display"},r))});t.Z=i},7190:function(e,t,r){r.d(t,{Z:function(){return f}});var a=r(4194),n=r(9088),i=r(1667),o=r(2614),c=r(276),s=r(6693),l=r(2256),u=r(7041);let d=(0,a.forwardRef)(function({availability:e,children:t,hasVariants:r,skuMatrixControl:n,quantity:d,outOfStockLabel:m,min:f=1,max:p,onClick:h,onChangeQuantity:v,onValidateBlur:y,...g},b){let[O,w]=(0,a.useState)("default"),E=e&&r;function stopPropagationClick(e){e.preventDefault(),e.stopPropagation()}let S=(0,a.useCallback)(()=>{switch(O){case"inProgress":return a.createElement(i.Z,null);case"completed":return a.createElement(o.Z,{name:"Checked",width:24,height:24});default:return a.createElement(o.Z,{name:"ShoppingCart",width:24,height:24})}},[O]);return a.createElement("div",{ref:b,"data-fs-search-product-item-control":!0,...g},a.createElement("div",{"data-fs-search-product-item-control-content":!0},!e&&a.createElement(c.Z,{"data-fs-search-product-item-control-badge":!0,variant:"warning"},m),t),e&&!r&&a.createElement("div",{"data-fs-search-product-item-control-actions":!0,role:"group","aria-hidden":!0,tabIndex:-1,onKeyDown:()=>{},onClick:stopPropagationClick},a.createElement("div",{"data-fs-search-product-item-control-actions-desktop":!0},a.createElement(s.Z,{disabled:"default"!==O,max:p,onValidateBlur:y,initial:d,onChange:v})),a.createElement("div",{"data-fs-search-product-item-control-actions-mobile":!0},a.createElement(l.Z,{"data-fs-product-item-control-input":!0,min:1,value:d,onChange:e=>v(e.target.value?Number(e.target.value):0),onBlur:function(){let e=p??(f?Math.max(d,f):d),t=d>e||d<f,r=d>e?e:d<f?f:d;t&&y?.(f,e,r),v(r)},onInput:e=>{let t=e.currentTarget;t.value=t.value.replace(/\D/g,"")}})),a.createElement(u.Z,{variant:"primary","aria-label":"Add product to cart",onClick:function(e){h&&(w("inProgress"),setTimeout(()=>{w("completed"),h(e)},1e3),setTimeout(()=>{w("default"),v(1)},2e3))},disabled:"inProgress"===O,icon:S()})),E&&a.createElement("div",{onClick:stopPropagationClick,"aria-hidden":!0,tabIndex:-1,onKeyDown:()=>{}},n))}),m=(0,a.forwardRef)(function({price:e,title:t,quickOrder:r,onValidateBlur:i,...o},c){let s=(0,a.useCallback)(()=>a.createElement(a.Fragment,null,a.createElement("p",{"data-fs-search-product-item-title":!0},t),0!==e.value&&a.createElement(n.Z,{"data-fs-search-product-item-prices":!0,listPrice:e.listPrice,value:e.value,formatter:e.formatter})),[e.formatter,e.listPrice,e.value,t]);return a.createElement("section",{ref:c,"data-fs-search-product-item-content":!0,...o},!r?.enabled&&s(),r?.enabled&&a.createElement(d,{outOfStockLabel:r.outOfStockLabel,availability:r.availability,hasVariants:r.hasVariants,skuMatrixControl:r.skuMatrixControl,quantity:r.quantity,onChangeQuantity:r.onChangeQuantity,max:r.max,onValidateBlur:i,...r.buyProps},s()))});var f=m},9082:function(e,t,r){var a=r(4194);let n=(0,a.forwardRef)(function({testId:e="fs-search-product-item-image",children:t,...r},n){return a.createElement("div",{ref:n,"data-fs-search-product-item-image":!0,"data-testid":e,...r},t)});t.Z=n},9994:function(e,t,r){var a=r(4194),n=r(1933),i=r(4564);t.Z=({testId:e="fs-search-products",title:t="Suggested Products",children:r,...o})=>{let{inContext:c,values:s}=(0,n.R)();return c&&s.products.length<=0?null:a.createElement("section",{"data-testid":e,"data-fs-search-products":!0,...o},a.createElement("header",{"data-fs-search-products-header":!0},a.createElement("p",{"data-fs-search-products-title":!0},t)),a.createElement(i.Z,{as:"ol"},r))}},3311:function(e,t,r){var a=r(4194),n=r(1933),i=r(4564);let o=(0,a.forwardRef)(function({testId:e="fs-top-search",title:t="Top Search",children:r,...o},c){let{inContext:s,values:l}=(0,n.R)();return s&&(0!==l.term.length||l.isLoading)?null:a.createElement("section",{ref:c,"data-testid":e,"data-fs-search-top":!0,...o},a.createElement("header",{"data-fs-search-top-header":!0},a.createElement("p",{"data-fs-search-top-title":!0},t)),a.createElement(i.Z,{as:"ol"},r))});t.Z=o},1287:function(e,t,r){var a=r(4194),n=r(727),i=r(276);let o=(0,a.forwardRef)(function({testId:e="fs-top-search-term",value:t,linkProps:r,index:o},c){return a.createElement("li",{ref:c,"data-fs-search-top-item":!0,"data-testid":e},a.createElement(n.Z,{...r,"data-fs-search-top-item-link":!0,variant:"display"},a.createElement(i.Z,{"data-fs-search-top-item-badge":!0,variant:"info"},o+1),t))});t.Z=o},7866:function(e,t,r){var a=r(4194),n=r(3442);let i=(0,a.forwardRef)(function({testId:e="fs-sku-matrix",children:t,...r},i){return a.createElement("div",{ref:i,"data-fs-sku-matrix":!0,"data-testid":e,...r},a.createElement(n.Z,null,t))});t.Z=i},7859:function(e,t,r){var a=r(4194),n=r(9009),i=r(2955);let o=(0,a.forwardRef)(function({children:e,variant:t="secondary",onClick:r,...o},c){let{setIsOpen:s}=(0,i._)();return a.createElement(n.Z,{ref:c,variant:t,onClick:e=>{s(!0),r?.(e)},...o},e)});t.Z=o},3442:function(e,t,r){r.d(t,{m:function(){return n}});var a=r(4194);let n=(0,a.createContext)(null);t.Z=function({children:e}){let[t,r]=(0,a.useState)(!1),[i,o]=(0,a.useState)([]),c=(0,a.useCallback)((e,t)=>{let r=[...i],a=r.find(t=>t.id===e);return a&&(a.selectedCount=t),o(r),r},[i]);return a.createElement(n.Provider,{value:{isOpen:t,allVariantProducts:i,setAllVariantProducts:o,onChangeQuantityItem:c,setIsOpen:r}},e)}}}]);
|