Skip to content

Commit 59ba55a

Browse files
authored
Merge pull request #4041 from gibkigonzo/task/backport-1.11.1
backport for 1.11.1
2 parents d794175 + c999e0c commit 59ba55a

File tree

41 files changed

+263
-159
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+263
-159
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111
- Add `ProductPrice` component with bundleOptions and customOptions prices - @gibkigonzo (#3978)
12+
- Add lazy create cart token - @gibkigonzo (#3994)
1213

1314
### Changed / Improved
1415
- Set cache tag when loading a category - @haelbichalex (#3940)
@@ -33,6 +34,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3334
- Fixed sku attribute is missing on compare page - @gibkigonzo (#4036)
3435
- Fixed z-index for aside in compare list - @gibkigonzo (#4037)
3536
- Disable checking max quantity when manage stock is set to false - @gibkigonzo (#4038)
37+
- Add products quantity only when token is created - @gibkigonzo (#4017)
38+
- Revert init filters in Vue app - add storeView to global/store and pass it to filters - @gibkigonzo (#3929)
3639
- Fix v-model not working in BaseRadioButton - @lukeromanowicz (#4035)
3740

3841
## [1.11.0] - 2019.12.20

config/default.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@
270270
"width": 150,
271271
"height": 150
272272
},
273-
"bypassCartLoaderForAuthorizedUsers": true,
274273
"serverMergeByDefault": true,
275274
"serverSyncCanRemoveLocalItems": false,
276275
"serverSyncCanModifyLocalItems": false,

core/app.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,16 +77,6 @@ const createApp = async (ssrContext, config, storeCode = null): Promise<{app: Vu
7777
})
7878
})
7979

80-
// @todo remove this part when we'll get rid of global multistore mixin
81-
if (isServer) {
82-
Object.defineProperty(ssrContext, 'helpers', {
83-
value: {
84-
currentStoreView
85-
},
86-
writable: true
87-
})
88-
}
89-
9080
let vueOptions = {
9181
router: routerProxy,
9282
store,

core/filters/date.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ once('__VUE_EXTEND_DAYJS_LOCALIZED_FORMAT__', () => {
1212
* @param {String} date
1313
* @param {String} format
1414
*/
15-
export function date (date, format) {
16-
const displayFormat = format || currentStoreView().i18n.dateFormat
17-
let storeLocale = currentStoreView().i18n.defaultLocale.toLocaleLowerCase()
15+
export function date (date, format, storeView) {
16+
const _storeView = storeView || currentStoreView()
17+
const displayFormat = format || _storeView.i18n.dateFormat
18+
let storeLocale = _storeView.i18n.defaultLocale.toLocaleLowerCase()
1819
const separatorIndex = storeLocale.indexOf('-')
1920
const languageCode = (separatorIndex > -1) ? storeLocale.substr(0, separatorIndex) : storeLocale
2021

core/filters/price.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ const applyCurrencySign = (formattedPrice, { currencySign, priceFormat }) => {
1313
* Converts number to price string
1414
* @param {Number} value
1515
*/
16-
export function price (value) {
16+
export function price (value, storeView) {
1717
if (isNaN(value)) {
1818
return value;
1919
}
20-
const storeView = currentStoreView();
21-
if (!storeView.i18n) {
20+
const _storeView = storeView || currentStoreView();
21+
if (!_storeView.i18n) {
2222
return value;
2323
}
24-
const { defaultLocale, currencySign, priceFormat } = storeView.i18n
24+
const { defaultLocale, currencySign, priceFormat } = _storeView.i18n
2525

2626
const formattedValue = formatValue(value, defaultLocale);
2727
const valueWithSign = applyCurrencySign(formattedValue, { currencySign, priceFormat })

core/lib/multistore.ts

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import { coreHooksExecutors } from '@vue-storefront/core/hooks'
1111
import { StorageManager } from '@vue-storefront/core/lib/storage-manager'
1212
import { LocalizedRoute, StoreView } from './types'
1313
import storeCodeFromRoute from './storeCodeFromRoute'
14+
import cloneDeep from 'lodash-es/cloneDeep'
15+
import get from 'lodash-es/get'
16+
import { isServer } from '@vue-storefront/core/helpers'
1417

1518
function getExtendedStoreviewConfig (storeView: StoreView): StoreView {
1619
if (storeView.extend) {
@@ -30,20 +33,28 @@ function getExtendedStoreviewConfig (storeView: StoreView): StoreView {
3033
return storeView
3134
}
3235

36+
/**
37+
* Returns base storeView object that can be created without storeCode
38+
*/
39+
function buildBaseStoreView (): StoreView {
40+
return cloneDeep({
41+
tax: config.tax,
42+
i18n: config.i18n,
43+
elasticsearch: config.elasticsearch,
44+
storeCode: null,
45+
storeId: config.defaultStoreCode && config.defaultStoreCode !== '' ? config.storeViews[config.defaultStoreCode].storeId : 1,
46+
seo: config.seo
47+
})
48+
}
49+
3350
export function currentStoreView (): StoreView {
34-
// TODO: Change to getter all along our code
35-
return rootStore.state.storeView
51+
const serverStoreView = get(global, 'process.storeView', undefined)
52+
const clientStoreView = get(rootStore, 'state.storeView', undefined)
53+
return (isServer ? serverStoreView : clientStoreView) || buildBaseStoreView()
3654
}
3755

3856
export async function prepareStoreView (storeCode: string): Promise<StoreView> {
39-
let storeView: StoreView = { // current, default store
40-
tax: Object.assign({}, config.tax),
41-
i18n: Object.assign({}, config.i18n),
42-
elasticsearch: Object.assign({}, config.elasticsearch),
43-
storeCode: null,
44-
storeId: config.defaultStoreCode && config.defaultStoreCode !== '' ? config.storeViews[config.defaultStoreCode].storeId : 1,
45-
seo: Object.assign({}, config.seo)
46-
}
57+
let storeView: StoreView = buildBaseStoreView() // current, default store
4758

4859
if (config.storeViews.multistore === true) {
4960
storeView.storeCode = storeCode || config.defaultStoreCode || ''
@@ -61,6 +72,11 @@ export async function prepareStoreView (storeCode: string): Promise<StoreView> {
6172
if (storeViewHasChanged) {
6273
storeView = coreHooksExecutors.beforeStoreViewChanged(storeView)
6374
rootStore.state.storeView = storeView
75+
76+
if (global && isServer) {
77+
(global.process as any).storeView = storeView
78+
}
79+
6480
await loadLanguageAsync(storeView.i18n.defaultLocale)
6581
}
6682
if (storeViewHasChanged || StorageManager.currentStoreCode !== storeCode) {

core/mixins/multistore.js

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,7 @@ export const multistore = {
1010
* @param {Int} height
1111
*/
1212
localizedRoute (routeObj) {
13-
let storeView
14-
15-
if (isServer) {
16-
storeView = this.$ssrContext.helpers.currentStoreView()
17-
} else {
18-
storeView = currentStoreView()
19-
}
13+
const storeView = currentStoreView()
2014

2115
return localizedRouteHelper(routeObj, storeView.storeCode)
2216
},
@@ -27,13 +21,7 @@ export const multistore = {
2721
* @param {Int} height
2822
*/
2923
localizedDispatcherRoute (routeObj) {
30-
let storeView
31-
32-
if (isServer) {
33-
storeView = this.$ssrContext.helpers.currentStoreView()
34-
} else {
35-
storeView = currentStoreView()
36-
}
24+
const storeView = currentStoreView()
3725

3826
return localizedDispatcherRouteHelper(routeObj, storeView.storeCode)
3927
}

core/modules/cart/helpers/createCartItemForUpdate.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import config from 'config'
22
import CartItem from '@vue-storefront/core/modules/cart/types/CartItem';
33

4-
const createCartItemForUpdate = (clientItem: CartItem, serverItem: any, updateIds: boolean = false): CartItem => {
4+
const createCartItemForUpdate = (clientItem: CartItem, serverItem: any, updateIds: boolean = false, mergeQty: boolean = false): CartItem => {
55
const sku = clientItem.parentSku && config.cart.setConfigurableProductOptions ? clientItem.parentSku : clientItem.sku
66
const cartItem = {
77
sku,
8-
qty: clientItem.qty,
8+
qty: mergeQty ? (clientItem.qty + serverItem.qty) : clientItem.qty,
99
product_option: clientItem.product_option
1010
} as any as CartItem
1111

core/modules/cart/store/actions/connectActions.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,20 @@ const connectActions = {
99
toggleMicrocart ({ commit }) {
1010
commit(types.CART_TOGGLE_MICROCART)
1111
},
12-
async clear ({ commit, dispatch, getters }, options = { recreateAndSyncCart: true }) {
12+
async clear ({ commit, dispatch, getters }) {
1313
await commit(types.CART_LOAD_CART, [])
14-
if (options.recreateAndSyncCart && getters.isCartSyncEnabled) {
15-
await commit(types.CART_LOAD_CART_SERVER_TOKEN, null)
16-
await commit(types.CART_SET_ITEMS_HASH, null)
17-
await dispatch('connect', { guestCart: !config.orders.directBackendSync }) // guest cart when not using directBackendSync because when the order hasn't been passed to Magento yet it will repopulate your cart
18-
}
14+
await commit(types.CART_LOAD_CART_SERVER_TOKEN, null)
15+
await commit(types.CART_SET_ITEMS_HASH, null)
1916
},
2017
async disconnect ({ commit }) {
2118
commit(types.CART_LOAD_CART_SERVER_TOKEN, null)
2219
},
2320
async authorize ({ dispatch, getters }) {
24-
const coupon = getters.getCoupon.code
25-
const lastCartBypassTs = await StorageManager.get('user').getItem('last-cart-bypass-ts')
26-
const timeBypassCart = config.orders.directBackendSync || (Date.now() - lastCartBypassTs) >= (1000 * 60 * 24)
27-
28-
if (!config.cart.bypassCartLoaderForAuthorizedUsers || timeBypassCart) {
29-
await dispatch('connect', { guestCart: false })
21+
await dispatch('connect', { guestCart: false })
3022

31-
if (!getters.getCoupon) {
32-
await dispatch('applyCoupon', coupon)
33-
}
23+
const coupon = getters.getCoupon.code
24+
if (!getters.getCoupon) {
25+
await dispatch('applyCoupon', coupon)
3426
}
3527
},
3628
async connect ({ getters, dispatch, commit }, { guestCart = false, forceClientState = false }) {
@@ -41,7 +33,7 @@ const connectActions = {
4133
Logger.info('Server cart token created.', 'cart', result)()
4234
commit(types.CART_LOAD_CART_SERVER_TOKEN, result)
4335

44-
return dispatch('sync', { forceClientState, dryRun: !config.cart.serverMergeByDefault })
36+
return dispatch('sync', { forceClientState, dryRun: !config.cart.serverMergeByDefault, mergeQty: true })
4537
}
4638

4739
if (resultCode === 401 && getters.bypassCounter < config.queues.maxCartBypassAttempts) {
@@ -53,6 +45,17 @@ const connectActions = {
5345

5446
Logger.warn('Cart sync is disabled by the config', 'cart')()
5547
return createDiffLog()
48+
},
49+
/**
50+
* Create cart token when there are products in cart and we don't have token already
51+
*/
52+
async create ({ dispatch, getters }) {
53+
const storedItems = getters['getCartItems'] || []
54+
const cartToken = getters['getCartToken']
55+
if (storedItems.length && !cartToken) {
56+
Logger.info('Creating server cart token', 'cart')()
57+
await dispatch('connect', { guestCart: false })
58+
}
5659
}
5760
}
5861

core/modules/cart/store/actions/itemActions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ const itemActions = {
8080
productIndex++
8181
}
8282
}
83+
await dispatch('create')
8384
if (getters.isCartSyncEnabled && getters.isCartConnected && !forceServerSilence) {
8485
return dispatch('sync', { forceClientState: true })
8586
}

0 commit comments

Comments
 (0)