@@ -4,7 +4,7 @@ import toString from 'lodash-es/toString'
4
4
import i18n from '@vue-storefront/i18n'
5
5
import store from '@vue-storefront/core/store'
6
6
import EventBus from '@vue-storefront/core/compatibility/plugins/event-bus'
7
- import { baseFilterProductsQuery , buildFilterProductsQuery } from '@vue-storefront/core/helpers'
7
+ import { baseFilterProductsQuery , buildFilterProductsQuery , isServer } from '@vue-storefront/core/helpers'
8
8
import { htmlDecode } from '@vue-storefront/core/filters/html-decode'
9
9
import { currentStoreView , localizedRoute } from '@vue-storefront/core/lib/multistore'
10
10
import Composite from '@vue-storefront/core/mixins/composite'
@@ -81,58 +81,51 @@ export default {
81
81
append : false
82
82
} )
83
83
} ,
84
- asyncData ( { store, route, context } ) { // this is for SSR purposes to prefetch data
85
- return new Promise ( ( resolve , reject ) => {
86
- Logger . info ( 'Entering asyncData in Category Page (core)' ) ( )
84
+ async asyncData ( { store, route, context } ) { // this is for SSR purposes to prefetch data
85
+ Logger . info ( 'Entering asyncData in Category Page (core)' ) ( )
86
+ try {
87
87
if ( context ) context . output . cacheTags . add ( `category` )
88
88
const defaultFilters = store . state . config . products . defaultFilters
89
- store . dispatch ( 'category/list' , { level : store . state . config . entities . category . categoriesDynamicPrefetch && store . state . config . entities . category . categoriesDynamicPrefetchLevel ? store . state . config . entities . category . categoriesDynamicPrefetchLevel : null , includeFields : store . state . config . entities . optimize && Vue . prototype . $isServer ? store . state . config . entities . category . includeFields : null } ) . then ( ( categories ) => {
90
- store . dispatch ( 'attribute/list' , { // load filter attributes for this specific category
91
- filterValues : defaultFilters , // TODO: assign specific filters/ attribute codes dynamicaly to specific categories
92
- includeFields : store . state . config . entities . optimize && Vue . prototype . $isServer ? store . state . config . entities . attribute . includeFields : null
93
- } ) . catch ( err => {
94
- Logger . error ( err ) ( )
95
- reject ( err )
96
- } ) . then ( ( attrs ) => {
97
- store . dispatch ( 'category/single' , { key : store . state . config . products . useMagentoUrlKeys ? 'url_key' : 'slug' , value : route . params . slug } ) . then ( ( parentCategory ) => {
98
- let query = store . getters [ 'category/getCurrentCategoryProductQuery' ]
99
- if ( ! query . searchProductQuery ) {
100
- store . dispatch ( 'category/mergeSearchOptions' , {
101
- searchProductQuery : baseFilterProductsQuery ( parentCategory , defaultFilters )
102
- } )
103
- }
104
- store . dispatch ( 'category/products' , query ) . then ( ( subloaders ) => {
105
- if ( subloaders ) {
106
- Promise . all ( subloaders ) . then ( ( results ) => {
107
- EventBus . $emitFilter ( 'category-after-load' , { store : store , route : route } ) . then ( ( results ) => {
108
- return resolve ( )
109
- } ) . catch ( ( err ) => {
110
- Logger . error ( err ) ( )
111
- return resolve ( )
112
- } )
113
- } ) . catch ( err => {
114
- Logger . error ( err ) ( )
115
- reject ( err )
116
- } )
117
- } else {
118
- const err = new Error ( 'Category query returned empty result' )
119
- Logger . error ( err ) ( )
120
- reject ( err )
121
- }
122
- } ) . catch ( err => {
123
- Logger . error ( err ) ( )
124
- reject ( err )
125
- } )
126
- } ) . catch ( err => {
127
- Logger . error ( err ) ( )
128
- reject ( err )
129
- } )
89
+ await store . dispatch ( 'category/list' , { level : store . state . config . entities . category . categoriesDynamicPrefetch && store . state . config . entities . category . categoriesDynamicPrefetchLevel ? store . state . config . entities . category . categoriesDynamicPrefetchLevel : null , includeFields : store . state . config . entities . optimize && Vue . prototype . $isServer ? store . state . config . entities . category . includeFields : null } )
90
+ await store . dispatch ( 'attribute/list' , { // load filter attributes for this specific category
91
+ filterValues : defaultFilters , // TODO: assign specific filters/ attribute codes dynamicaly to specific categories
92
+ includeFields : store . state . config . entities . optimize && Vue . prototype . $isServer ? store . state . config . entities . attribute . includeFields : null
93
+ } )
94
+ const parentCategory = await store . dispatch ( 'category/single' , { key : store . state . config . products . useMagentoUrlKeys ? 'url_key' : 'slug' , value : route . params . slug } )
95
+ let query = store . getters [ 'category/getCurrentCategoryProductQuery' ]
96
+ if ( ! query . searchProductQuery ) {
97
+ store . dispatch ( 'category/mergeSearchOptions' , {
98
+ searchProductQuery : baseFilterProductsQuery ( parentCategory , defaultFilters )
130
99
} )
131
- } ) . catch ( err => {
132
- Logger . error ( err ) ( )
133
- reject ( err )
100
+ }
101
+ const subloaders = await store . dispatch ( 'category/products' , query )
102
+ if ( subloaders ) {
103
+ await Promise . all ( subloaders )
104
+ await EventBus . $emitFilter ( 'category-after-load' , { store : store , route : route } )
105
+ } else {
106
+ throw new Error ( 'Category query returned empty result' )
107
+ }
108
+ } catch ( err ) {
109
+ Logger . error ( err ) ( )
110
+ throw err
111
+ }
112
+ } ,
113
+ async beforeRouteEnter ( to , from , next ) {
114
+ if ( ! isServer && ! from . name ) { // Loading category products to cache on SSR render
115
+ next ( vm => {
116
+ const defaultFilters = store . state . config . products . defaultFilters
117
+ let parentCategory = store . getters [ 'category/getCurrentCategory' ]
118
+ let query = store . getters [ 'category/getCurrentCategoryProductQuery' ]
119
+ if ( ! query . searchProductQuery ) {
120
+ store . dispatch ( 'category/mergeSearchOptions' , {
121
+ searchProductQuery : baseFilterProductsQuery ( parentCategory , defaultFilters )
122
+ } )
123
+ }
124
+ store . dispatch ( 'category/products' , query )
134
125
} )
135
- } )
126
+ } else {
127
+ next ( )
128
+ }
136
129
} ,
137
130
beforeMount ( ) {
138
131
this . $bus . $on ( 'filter-changed-category' , this . onFilterChanged )
@@ -165,6 +158,7 @@ export default {
165
158
return bottomOfPage || pageHeight < visible
166
159
} ,
167
160
pullMoreProducts ( ) {
161
+ if ( typeof navigator !== 'undefined' && ! navigator . onLine ) return
168
162
let current = this . getCurrentCategoryProductQuery . current + this . getCurrentCategoryProductQuery . perPage
169
163
this . mergeSearchOptions ( {
170
164
append : true ,
0 commit comments