-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
134 lines (116 loc) · 3.87 KB
/
app.js
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
const vm = new Vue({
el: "#app",
data: {
produtos: [],
produto: false,
carrinho: [],
mensagemAlerta: "Item adicionado",
carrinhoAtivo: false,
alertaAtivo: false,
},
filters: {
// Transforma um número no formato da moeda [pt-br]
numeroPreco(valor) {
const formatter = new Intl.NumberFormat('pt-BR', {
style: 'currency',
currency: 'BRL'
});
return formatter.format(valor);
}
},
computed: {
// Atualiza o valor total do carrinho
carrinhoTotal() {
let total = 0
if(this.carrinho.length)
this.carrinho.forEach(item => {
total += item.preco
});
return total
}
},
watch: {
// Salva no local storage a cada atualização no carrinho
carrinho() {
window.localStorage.carrinho = JSON.stringify(this.carrinho)
},
// Modifica a URL e o título da página
produto() {
document.title = this.produto.nome || "Techno"
const hash = this.produto.id || ""
history.pushState(null, null, `#${hash}`)
if(this.produto) this.compararEstoque()
}
},
methods: {
// Puxa os produtos
fetchProdutos() {
fetch('./api/produtos.json')
.then( response => response.json())
.then( json => this.produtos = json)
},
// Puxa um produto específico pelo id
fetchProduto(id) {
fetch(`./api/produtos/${id}/dados.json`)
.then( response => response.json())
.then( json => this.produto = json)
},
// Fecha a modal ao se clicar fora dela
fecharModal({ target, currentTarget }) {
if(target === currentTarget) this.produto = false
},
//Fecha o carrinho ao clicar fora dele
fecharCarrinho({ target, currentTarget }) {
if(target === currentTarget) this.carrinhoAtivo = false
},
// Chamado ao abrir a modal
abrirModal(id) {
this.fetchProduto(id)
window.scrollTo({
top: 0,
behavior: "smooth"
})
},
// Adiciona o item ao carrinho
adicionarItem(event) {
this.produto.estoque--
const {id, nome, preco} = this.produto
this.carrinho.push({id, nome, preco})
this.alerta(`${nome} foi adicionado ao carrinho`)
},
// Remove um item do carrinho pelo seu id
removerItem(index) {
this.carrinho.splice(index, 1)
},
// Verifica se há algo do carrinho salvo no local storage
checarLocalStorage() {
if(window.localStorage.carrinho) {
this.carrinho = JSON.parse(window.localStorage.carrinho)
}
},
// Compara os itens do carrinho com os do estoque, para controlar a quantidade de produtos
compararEstoque() {
const itemsCarrinho = this.carrinho.filter( ({id}) => id === this.produto.id )
this.produto.estoque -= itemsCarrinho.length
},
// Constrói o alerta com uma mensagem customizada
alerta(mensagemAlerta) {
this.mensagemAlerta = mensagemAlerta
this.alertaAtivo = true
setTimeout(() => {
this.alertaAtivo = false
},1500)
},
// Verifica se na URL há algum id aberto já, para levar direto ao produto daquele id
router() {
const hash = document.location.hash
if(hash)
this.fetchProduto(hash.replace("#",""))
}
},
created() {
this.fetchProdutos()
this.checarLocalStorage()
this.router()
},
})