-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcheckout.js
403 lines (324 loc) · 12.2 KB
/
checkout.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
import {MAIN_PART, ASIDE_PART, FULL_PART} from "../app.js";
import {SUCCESS_TOAST, GOOD_TOAST, BAD_TOAST, ERROR_TOAST} from "../app.js";
String.prototype.toCardString = function () {
let lastChar = this.split('').pop();
let arr = this.replaceAll(' ', '').split('');
let list = [];
let count = 0;
for (let num of arr) {
list.push(num);
count += 1;
if (count === 4) {
list.push(' ');
count = 0;
}
}
return list.join('').trim();
}
String.prototype.toExpirationString = function () {
let arr = this.replaceAll('/', '').split('');
let list = [];
let count = 0;
for (let num of arr) {
list.push(num);
count += 1;
if (count === 2) {
list.push('/');
count = 0;
}
}
let lastChar = list[list.length - 1];
if (lastChar === '/') {
list.pop();
}
return list.join('').trim();
}
let addressForm = document.getElementById('addressForm');
let cardForm = document.getElementById('cardForm');
let deliveryBtn = document.getElementById('delivery');
let addressBtn = document.getElementById('address');
let cardBtn = document.getElementById('card');
let addressReturnBtn = document.getElementById('addressReturn');
let cardReturnBtn = document.getElementById('cardReturn');
let validateBtn = document.getElementById('validateCheckout');
// Inputs second form
let id_address = addressForm.querySelector('input[name="id_address"]');
let id_card = cardForm.querySelector('input[name="id_card"]');
let title = document.getElementById('titleInput');
let address = document.getElementById('addressValue');
let complement = document.getElementById('addressComplementValue');
let city = document.getElementById('cityValue');
let postalCode = document.getElementById('postalCodeValue');
let country = document.getElementById('countryValue');
console.log(address)
// Inputs third form
let nbCard = document.getElementById('nbCardValue');
let expiration = document.getElementById('expirationValue');
let cvv = document.getElementById('cvvValue');
/** ERRORS GESTION **/
address.addEventListener('blur', (ev) => {
let element = ev.target;
if (element.validity.valueMissing) {
mbApp.showInputError(element, "Veuillez renseigner un titre ! ")
}
})
address.addEventListener('blur', (ev) => {
let element = ev.target;
if (element.validity.valueMissing) {
mbApp.showInputError(element, "Veuillez renseigner une adresse ! ")
}
})
address.addEventListener('input', (ev) => {
let element = ev.target;
if (element.validity.valid) {
mbApp.clearInputError(element);
} else if (element.validity.tooShort) {
mbApp.showInputError(element, "La ville doit contenir au moins 1 caractère !")
} else if (element.validity.patternMismatch) {
mbApp.showInputError(element, "Le nom de la ville ne peut contenir que des lettres !")
}
})
city.addEventListener('blur', (ev) => {
let element = ev.target;
if (element.validity.valueMissing) {
mbApp.showInputError(element, "Veuillez renseigner une ville ! ")
}
})
city.addEventListener('input', (ev) => {
let element = ev.target;
if (element.validity.valid) {
mbApp.clearInputError(element);
} else if (element.validity.tooShort) {
mbApp.showInputError(element, "La ville doit contenir au moins 1 caractère !")
} else if (element.validity.patternMismatch) {
mbApp.showInputError(element, "Le nom de la ville ne peut contenir que des lettres !")
}
})
postalCode.addEventListener('blur', (ev) => {
let element = ev.target;
if (element.validity.valueMissing) {
mbApp.showInputError(element, "Veuillez renseigner un code postal ! ")
}
})
postalCode.addEventListener('input', (ev) => {
let element = ev.target;
if (element.validity.valid) {
mbApp.clearInputError(element);
} else if (element.validity.tooShort) {
mbApp.showInputError(element, "La ville doit contenir 5 chiffres !")
} else if (element.validity.tooLong) {
mbApp.showInputError(element, "Le code postal ne peut pas excéder 5 chiffres !")
} else if (element.validity.patternMismatch) {
mbApp.showInputError(element, "Le code postal ne peut contenir que des chiffres !")
}
})
country.addEventListener('blur', (ev) => {
let element = ev.target;
if (element.validity.valueMissing) {
mbApp.showInputError(element, "Veuillez renseigner un pays ! ")
}
})
country.addEventListener('input', (ev) => {
let element = ev.target;
if (element.validity.valid) {
mbApp.clearInputError(element);
} else if (element.validity.tooShort) {
mbApp.showInputError(element, "Le nom du pays doit contenir 4 lettres !")
} else if (element.validity.patternMismatch) {
mbApp.showInputError(element, "Le nom du pays ne peut contenir que des lettres !")
}
})
nbCard.addEventListener('blur', (ev) => {
let element = ev.target;
if (element.validity.valueMissing) {
mbApp.showInputError(element, "Veuillez renseigner un numéro de carte ! ")
}
})
nbCard.addEventListener('input', (ev) => {
let element = ev.target;
element.value = element.value.toCardString();
if (element.validity.valid) {
mbApp.clearInputError(element);
} else if (element.validity.tooShort) {
mbApp.showInputError(element, "Le numéro de la carte doit contenir 16 chiffres !")
} else if (element.validity.tooLong) {
mbApp.showInputError(element, "Le numéro de la carte doit contenir 16 chiffres !")
} else if (element.validity.patternMismatch) {
mbApp.showInputError(element, "Le numéro de la carte ne peut contenir que des chiffres !")
}
})
expiration.addEventListener('blur', (ev) => {
let element = ev.target;
if (element.validity.valueMissing) {
mbApp.showInputError(element, "Veuillez renseigner une date d'expiration ! ")
}
})
expiration.addEventListener('input', (ev) => {
let element = ev.target;
let expValue = element.value.toExpirationString();
console.log(expValue);
element.value = expValue;
let date = element.value.split('/');
let month = Number(date[0]);
let year = Number(date[1]);
let currentYear = Number((new Date()).getFullYear().toString().substring(2));
let dateInvalid = (month > 12) || (year < currentYear) || (year > currentYear + 5);
console.log('dateInvalid ? ',dateInvalid)
if (dateInvalid) {
mbApp.showInputError(element, "La date est invalide !")
} else if (element.validity.valid) {
mbApp.clearInputError(element);
} else if (element.validity.tooShort) {
mbApp.showInputError(element, "La date d'expiration doit contenir au minimum 4 chiffres!")
} else if (element.validity.tooLong) {
mbApp.showInputError(element, "La date d'expiration doit contenir au maximum 4 chiffres!")
} else if (element.validity.patternMismatch) {
mbApp.showInputError(element, "Le numéro de la carte ne peut contenir que des chiffres !")
}
})
cvv.addEventListener('blur', (ev) => {
let element = ev.target;
if (element.validity.valueMissing) {
mbApp.showInputError(element, "Veuillez renseigner un CVV ! ")
}
})
cvv.addEventListener('input', (ev) => {
let element = ev.target;
if (element.validity.valid) {
mbApp.clearInputError(element);
} else if (element.validity.tooShort) {
mbApp.showInputError(element, "Le CVV doit contenir 3 chiffres!")
} else if (element.validity.tooLong) {
mbApp.showInputError(element, "Le CVV doit contenir 3 chiffres!")
} else if (element.validity.patternMismatch) {
mbApp.showInputError(element, "Le CVV ne peut contenir que des chiffres !")
}
})
/*
Tag delivery form then listening it for stock value of radio input
*/
let deliveryForm = document.getElementById('deliveryForm');
deliveryForm.addEventListener('input', (ev) => {
let deliveryCost = ev.target.value;
});
addressForm.addEventListener('input', (ev) => {
address.value;
complement.value;
city.value;
postalCode.value;
country.value;
})
cardForm.addEventListener('input', (ev) => {
nbCard.value;
expiration.value;
cvv.value;
})
/**
* Listening click on "delivery" next button.
* Hide delivery form and show address form
*/
deliveryBtn.addEventListener('click', () => {
document.querySelector('.deliveryDiv').hidden = true;
document.querySelector('.addressDiv').hidden = false;
})
/**
* Listening click on "address" next button.
* Hide address form and show card form
*/
addressBtn.addEventListener('click', () => {
document.querySelector('.addressDiv').hidden = true;
document.querySelector('.cardDiv').hidden = false;
})
/**
* Listening click on "address" return button.
* Hide address form and show delivery form
*/
addressReturnBtn.addEventListener('click', () => {
document.querySelector('.addressDiv').hidden = true;
document.querySelector('.deliveryDiv').hidden = false;
})
/**
* Listening click on "card" return button.
* Hide card form and show address form
*/
cardReturnBtn.addEventListener('click', () => {
document.querySelector('.cardDiv').hidden = true;
document.querySelector('.addressDiv').hidden = false;
})
/**
* Listening click on "validate" button
* Prevent default submit
*/
validateBtn.addEventListener('click', async (ev) => {
ev.preventDefault();
if (!address.validity.valid ||
!city.validity.valid ||
!country.validity.valid ||
!postalCode.validity.valid ||
!nbCard.validity.valid ||
!expiration.validity.valid ||
!cvv.validity.valid) {
mbApp.showToast({message: "Tous les champs doivent être remplis !", type: ERROR_TOAST});
return;
}
let form1 = new FormData(deliveryForm);
let form2 = new FormData(addressForm);
let form3 = new FormData(cardForm);
let cardNumber = parseInt(form3.get('nbCard').replaceAll(' ', ''));
form3.set('nbCard', cardNumber);
let completeForm = new FormData();
for (let part1 of form1.entries()) {
completeForm.append(part1[0], part1[1]);
}
for (let part2 of form2.entries()) {
completeForm.append(part2[0], part2[1]);
}
for (let part3 of form3.entries()) {
completeForm.append(part3[0], part3[1]);
}
let url = 'checkout';
let request = new Request(url, {method: 'POST', body: completeForm})
let response = await fetch(request);
let responseData = await response.json();
if (responseData.success) {
mbApp.showToast({message: "Vos informations ont été enregitrées!", type: SUCCESS_TOAST}, 3);
}
})
let addressBtnEls = document.querySelectorAll('.address-list button');
addressBtnEls.forEach(btnEl => {
btnEl.addEventListener('click', async (ev) => {
let addressId = ev.currentTarget.dataset.id;
let url = `address/${addressId}`;
let headers = new Headers();
headers.append('Creator', 'axel');
let request = new Request(url, {method: 'GET', headers: headers});
let response = await fetch(request);
let responseData = await response.json();
console.log(responseData);
id_address.value = responseData.id;
title.value = responseData.title;
address.value = responseData.address;
complement.value = responseData.address_complement;
city.value = responseData.city;
postalCode.value = responseData.postal_code;
country.value = responseData.country;
})
});
let cardBtnEls = document.querySelectorAll('.card-list button');
cardBtnEls.forEach(btnEl => {
btnEl.addEventListener('click', async (ev) => {
let cardId = ev.currentTarget.dataset.id;
let url = `cards/${cardId}`;
let headers = new Headers();
headers.append('Creator', 'axel');
let request = new Request(url, {method: 'GET', headers: headers});
let response = await fetch(request);
let responseData = await response.json();
console.log(responseData)
id_card.value = responseData.id;
nbCard.value = responseData.card_no;
expiration.value = `${responseData.expiry_month}/${responseData.expiry_year}`;
cvv.value = responseData.CVV;
nbCard.dispatchEvent(new CustomEvent('input'));
})
});