Skip to content

Commit c46db2c

Browse files
[Storefront Preview] - 3P CDN, add search parameters to be returned on context refresh (#1478)
* added new prop to storefront preview component to accept qs search params to append on context change refresh * added text for new storefront preview prop * code review updates * updating test * added getAdditionalSearchParams to the dependency array * renaming getAdditionalSearchParams to additionalSearchParams since it will be a static array * adding reloadServerSide prop to force a server-side refresh * renaming props to experimental unsafe as this API will be removed in the future and should be used for experimental use only * updated refresh to use replace, updated test cases * tweaks to get test coverage up 0.1% * lint --------- Co-authored-by: Adam Raya Navarro <arayanavarro@salesforce.com>
1 parent b68be55 commit c46db2c

File tree

4 files changed

+128
-11
lines changed

4 files changed

+128
-11
lines changed

packages/pwa-kit-react-sdk/src/ssr/universal/components/refresh/index.jsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,19 @@ const Refresh = () => {
3939
console.warn('Could not find `referrer` search param - redirecting to home page.')
4040
referrer = '/'
4141
}
42+
43+
// if experimentalUnsafeReloadServerSide is true, reload the page on server side
44+
const experimentalUnsafeReloadServerSide = new URLSearchParams(location.search).get(
45+
'experimentalUnsafeReloadServerSide'
46+
)
47+
if (experimentalUnsafeReloadServerSide === 'true') {
48+
console.warn(
49+
'"experimentalUnsafeReloadServerSide" was set to true - reloading page on server side'
50+
)
51+
window.location.replace(referrer)
52+
return
53+
}
54+
4255
history.replace(referrer)
4356
}
4457
refetchData()

packages/pwa-kit-react-sdk/src/ssr/universal/components/refresh/index.test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,39 @@ test('navigate to homepage if `referrer` search param cannot be found in the pag
6464
expect(console.warn).toHaveBeenCalled()
6565
expect(useHistory().replace).toHaveBeenCalledWith('/')
6666
})
67+
68+
test('hard refresh to the referrer should occur', async () => {
69+
// Delete the real properties from window, so we can mock them
70+
delete window.location
71+
window.location = {replace: jest.fn()}
72+
73+
jest.spyOn(console, 'warn')
74+
75+
useLocation.mockImplementationOnce(() => ({
76+
search: `?referrer=${referrerURL}&experimentalUnsafeReloadServerSide=true`
77+
}))
78+
mount(<Refresh />)
79+
jest.runAllTimers()
80+
await runAllPromises()
81+
82+
expect(console.warn).toHaveBeenCalled()
83+
expect(window.location.replace).toHaveBeenCalled()
84+
})
85+
86+
test('hard refresh to the referrer should not occur', async () => {
87+
// Delete the real properties from window, so we can mock them
88+
delete window.location
89+
window.location = {replace: jest.fn()}
90+
91+
jest.spyOn(console, 'warn')
92+
93+
useLocation.mockImplementationOnce(() => ({
94+
search: `?referrer=${referrerURL}`
95+
}))
96+
mount(<Refresh />)
97+
jest.runAllTimers()
98+
await runAllPromises()
99+
100+
expect(console.warn).not.toHaveBeenCalled()
101+
expect(window.location.replace).not.toHaveBeenCalled()
102+
})

packages/pwa-kit-react-sdk/src/ssr/universal/components/storefront-preview/index.jsx

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,16 @@ import {useHistory} from 'react-router-dom'
1515
*
1616
* @param {boolean} enabled - flag to turn on/off Storefront Preview feature
1717
* @param {function(): string | Promise<string>} getToken - A method that returns the access token for the current user
18+
* @param {Array} experimentalUnsafeAdditionalSearchParams - An array of key/value search params to add when context changes
19+
* @param {boolean} experimentalUnsafeReloadServerSide - if true, will reload the page on server side when context changes
1820
*/
19-
export const StorefrontPreview = ({children, enabled = true, getToken}) => {
21+
export const StorefrontPreview = ({
22+
children,
23+
enabled = true,
24+
getToken,
25+
experimentalUnsafeAdditionalSearchParams = [],
26+
experimentalUnsafeReloadServerSide
27+
}) => {
2028
const history = useHistory()
2129
const isHostTrusted = detectStorefrontPreview()
2230

@@ -25,13 +33,19 @@ export const StorefrontPreview = ({children, enabled = true, getToken}) => {
2533
window.STOREFRONT_PREVIEW = {
2634
...window.STOREFRONT_PREVIEW,
2735
getToken,
28-
navigate: (path, action = 'push', ...args) => {
36+
experimentalUnsafeNavigate: (path, action = 'push', ...args) => {
2937
history[action](path, ...args)
30-
}
38+
},
39+
experimentalUnsafeAdditionalSearchParams,
40+
experimentalUnsafeReloadServerSide
3141
}
3242
}
33-
}, [enabled, getToken])
34-
43+
}, [
44+
enabled,
45+
getToken,
46+
experimentalUnsafeAdditionalSearchParams,
47+
experimentalUnsafeReloadServerSide
48+
])
3549
return (
3650
<>
3751
{enabled && isHostTrusted && (
@@ -50,7 +64,8 @@ export const StorefrontPreview = ({children, enabled = true, getToken}) => {
5064
}
5165

5266
StorefrontPreview.defaultProps = {
53-
enabled: true
67+
enabled: true,
68+
experimentalUnsafeReloadServerSide: false
5469
}
5570

5671
StorefrontPreview.propTypes = {
@@ -66,7 +81,9 @@ StorefrontPreview.propTypes = {
6681
`${propName} is a required function for ${componentName} when enabled is true`
6782
)
6883
}
69-
}
84+
},
85+
experimentalUnsafeAdditionalSearchParams: PropTypes.array,
86+
experimentalUnsafeReloadServerSide: PropTypes.bool
7087
}
7188

7289
export default StorefrontPreview

packages/pwa-kit-react-sdk/src/ssr/universal/components/storefront-preview/index.test.js

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,68 @@ describe('Storefront Preview Component', function () {
104104

105105
mount(<StorefrontPreview getToken={() => 'my-token'} />)
106106
expect(window.STOREFRONT_PREVIEW.getToken).toBeDefined()
107-
expect(window.STOREFRONT_PREVIEW.navigate).toBeDefined()
107+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeNavigate).toBeDefined()
108+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeAdditionalSearchParams).toBeDefined()
109+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeReloadServerSide).toBeDefined()
108110
})
109111

110-
test('window.STOREFRONT_PREVIEW.navigate', () => {
112+
test('window.STOREFRONT_PREVIEW.experimentalUnsafeNavigate', () => {
111113
detectStorefrontPreview.mockReturnValue(true)
112114
mount(<StorefrontPreview getToken={() => 'my-token'} />)
113115

114-
window.STOREFRONT_PREVIEW.navigate('/', 'replace')
116+
window.STOREFRONT_PREVIEW.experimentalUnsafeNavigate('/', 'replace')
115117
expect(useHistory().replace).toHaveBeenCalledWith('/')
116118

117-
window.STOREFRONT_PREVIEW.navigate('/')
119+
window.STOREFRONT_PREVIEW.experimentalUnsafeNavigate('/')
118120
expect(useHistory().push).toHaveBeenCalledWith('/')
119121
})
122+
123+
test('window.STOREFRONT_PREVIEW.experimentalUnsafeAdditionalSearchParams', async () => {
124+
detectStorefrontPreview.mockReturnValue(true)
125+
126+
const getSearchParamsToAdd = () => {
127+
return [
128+
{
129+
name: 'vse',
130+
value: 'my-custom-vse-{{effectiveDateTimeUnix}}.staging.content.io'
131+
},
132+
{
133+
name: 'vse-timestamp',
134+
value: '{{effectiveDateTimeUnix}}'
135+
}
136+
]
137+
}
138+
139+
mount(
140+
<StorefrontPreview
141+
getToken={() => 'my-token'}
142+
experimentalUnsafeAdditionalSearchParams={getSearchParamsToAdd()}
143+
/>
144+
)
145+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeAdditionalSearchParams).toBeDefined()
146+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeAdditionalSearchParams.length).toBe(
147+
getSearchParamsToAdd().length
148+
)
149+
})
150+
151+
test('window.STOREFRONT_PREVIEW.experimentalUnsafeReloadServerSide to be false', async () => {
152+
detectStorefrontPreview.mockReturnValue(true)
153+
154+
mount(<StorefrontPreview getToken={() => 'my-token'} />)
155+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeReloadServerSide).toBeDefined()
156+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeReloadServerSide).toBe(false)
157+
})
158+
159+
test('window.STOREFRONT_PREVIEW.experimentalUnsafeReloadServerSide to be true', async () => {
160+
detectStorefrontPreview.mockReturnValue(true)
161+
162+
mount(
163+
<StorefrontPreview
164+
getToken={() => 'my-token'}
165+
experimentalUnsafeReloadServerSide={true}
166+
/>
167+
)
168+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeReloadServerSide).toBeDefined()
169+
expect(window.STOREFRONT_PREVIEW.experimentalUnsafeReloadServerSide).toBe(true)
170+
})
120171
})

0 commit comments

Comments
 (0)