/
Home.vue
139 lines (130 loc) · 4.44 KB
/
Home.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<template>
<div id="home">
<div class="container mb45-md ">
<search class="animate"/>
<div class="row mt70-md mt40 animate ">
<div v-for="category in categories" :key="category.name" class="col-md-4 mb15 hide show-md">
<router-link :to="'/c/' + category.slug">
<category-tile :label="category.name"/>
</router-link>
</div>
<nossr class="hide-md">
<div class="col-md-12 px0">
<carousel :autoplay="true" :per-page="1" :pagination-enabled="false" :loop="true" :speed="2000">
<slide v-for="category in categories" :key="category.name">
<router-link :to="'/c/' + category.slug">
<category-tile class="mx8" :label="category.name"/>
</router-link>
</slide>
</carousel>
</div>
</nossr>
</div>
<div class="row bg-primary bg-transparent-md mt0-md mt40 ">
<h2 class="center-xs mt80-md mt50 mb50 col-xs-12">New items</h2>
<div v-for="(product, index) in newProducts" :key="index" class="col-md-3 hide show-md " :class="{ pr0 : (index+1) % 4 != 0, pl0 : (index+1) % 4 != 1 }">
<router-link :to="`/p/${product.sku}/${product.slug}/${product.sku}`">
<product-tile :product="product" class="b" :class="{ 'b-right-none' : (index+1) % 4 != 0 }"/>
</router-link>
</div>
<nossr class="hide-md">
<div class="col-md-12 px0">
<carousel :autoplay="true" :per-page="1" :pagination-enabled="false" :loop="true">
<slide v-for="(product, index) in newProducts" :key="index">
<router-link :to="`/p/${product.sku}/${product.slug}/${product.sku}`">
<product-tile class="bg-secondary" :product="product"/>
</router-link>
</slide>
</carousel>
</div>
</nossr>
</div>
<div class="row">
<h2 class="center-xs mt80-md mt50 mb50 animate col-xs-12">Magazine</h2>
<div v-for="(magazine, index) in magazines" :key="magazine.title" class="col-md-6 px0 " :class="{ 'pr0-md pl8-md' : index % 2 == 0, 'pl0-md pr8-md' : index % 2 == 1 }">
<router-link to="/">
<magazine-tile class="b-md" :class="{ 'b-right-none b-top' : index % 2 == 0 }" :title="magazine.title" :category="magazine.category" :bg-url="magazine.bgUrl" />
</router-link>
</div>
</div>
</div>
</div>
</template>
<script>
import Meta from 'core/lib/meta'
import builder from 'bodybuilder'
import Search from 'theme/components/theme/Search'
import CategoryTile from 'theme/components/core/CategoryTile'
import ProductTile from 'theme/components/core/ProductTile'
import MagazineTile from 'theme/components/theme/MagazineTile'
import Nossr from 'vue-no-ssr'
import { Carousel, Slide } from 'vue-carousel'
export default {
meta: {
title: 'Home Page'
},
data () {
return {
newProducts: [],
magazines: [{
title: '10 the most extreme roads for running',
category: 'Guide',
bgUrl: '/assets/homepage/magazines/roads.png'
}, {
title: 'What is the best way to train for a marathon?',
category: ' Guide',
bgUrl: '/assets/homepage/magazines/marathon.png'
}],
flickityOptions: {
initialIndex: 3
}
}
},
computed: {
categories () {
return this.$store.state.category.list.filter(category => category.level === 2)
// TODO: also should contain '&& category.product_count > 0' but it's omitted due to demo purposes
}
},
methods: {
getProducts (query, size) {
const params = {
query: query,
size: size,
sort: 'created_at:desc'
}
return this.$store.dispatch('product/list', params)
}
},
created () {
const productQuery = builder().query('match', 'category.name', 'Tees').build()
this.getProducts(productQuery, 8).then(res => { this.newProducts = res.items })
},
mounted () {
require('scrollreveal')().reveal('.animate', {
distance: 0,
scale: 0.8,
duration: 600
})
},
components: {
Search,
CategoryTile,
ProductTile,
MagazineTile,
Carousel,
Slide,
Nossr
},
mixins: [Meta]
}
</script>
<style lang="scss" scoped>
@import '~theme/css/vars/additional';
#home {
background: url('/assets/homepage_bg.png') no-repeat;
@media (min-width: $md) {
background-size: 100% auto;
}
}
</style>