@teddy-dev/frontend 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/algolia/algolia-loader.js +56 -0
- package/algolia/algolia-search.js +222 -0
- package/auth/teddy-auth-login.js +29 -0
- package/auth/teddy-auth-profile.js +58 -0
- package/auth/teddy-auth-register.js +52 -0
- package/auth/teddy-auth-reset.js +39 -0
- package/auth/teddy-auth.js +92 -0
- package/bantoa/bantoa-product.js +64 -0
- package/bantoa/bantoa-search.js +46 -0
- package/bantoa/bantoa-stylemix.js +43 -0
- package/bantoa/bantoa.js +21 -0
- package/cart/teddy-cart-controller.js +163 -0
- package/cart/teddy-cart-customer.js +86 -0
- package/cart/teddy-cart-discounts.js +55 -0
- package/cart/teddy-cart-promo-apply.js +24 -0
- package/cart/teddy-cart-promo-error.js +38 -0
- package/cart/teddy-cart-promo-loading.js +20 -0
- package/cart/teddy-cart-promo.js +96 -0
- package/components/mc-btn.js +38 -0
- package/components/mc-card-render.js +33 -0
- package/components/mc-cart-counter.js +14 -0
- package/components/mc-cart-error.js +35 -0
- package/components/mc-cart-quantity.js +43 -0
- package/components/mc-cart-remove.js +32 -0
- package/components/mc-copy.js +33 -0
- package/components/mc-element.js +84 -0
- package/components/mc-form-errors.js +35 -0
- package/components/mc-form-success.js +31 -0
- package/components/mc-form.js +223 -0
- package/components/mc-input-area.js +13 -0
- package/components/mc-input-checkbox-group.js +52 -0
- package/components/mc-input-checkbox.js +12 -0
- package/components/mc-input-password.js +39 -0
- package/components/mc-input-places.js +43 -0
- package/components/mc-input-quantity.js +43 -0
- package/components/mc-input-select.js +14 -0
- package/components/mc-input-text.js +12 -0
- package/components/mc-input.js +137 -0
- package/components/mc-loader.js +21 -0
- package/components/mc-modal.js +69 -0
- package/components/mc-password-eye.js +24 -0
- package/components/mc-password-tips.js +60 -0
- package/components/mc-qrcode.js +41 -0
- package/components/mc-range.js +108 -0
- package/components/mc-read-more.js +56 -0
- package/components/mc-recommended.js +50 -0
- package/components/mc-referrer.js +20 -0
- package/components/mc-splash-controller.js +32 -0
- package/components/mc-splash-link.js +65 -0
- package/components/mc-stoq.js +30 -0
- package/components/mc-swiper.js +333 -0
- package/components/mc-video.js +61 -0
- package/css/bootstrap-lg.css +2762 -0
- package/css/bootstrap-lg.min.css +1 -0
- package/css/bootstrap-md.css +2762 -0
- package/css/bootstrap-md.min.css +1 -0
- package/css/bootstrap-sm.css +2762 -0
- package/css/bootstrap-sm.min.css +1 -0
- package/css/bootstrap-xl.css +2790 -0
- package/css/bootstrap-xl.min.css +1 -0
- package/css/bootstrap-xxl.css +2762 -0
- package/css/bootstrap-xxl.min.css +1 -0
- package/css/bootstrap.css +9824 -0
- package/css/bootstrap.min.css +5 -0
- package/css/mc-form-errors.css +3 -0
- package/css/mc-loader.css +6 -0
- package/css/mc-password-eye.css +6 -0
- package/css/mc-password-tips.css +6 -0
- package/css/mc-read-more.css +14 -0
- package/css/mc-video.css +4 -0
- package/css/mc-wishlist-hero-btn.css +7 -0
- package/loader.js +110 -0
- package/loyalty/teddy-loyalty-create.js +40 -0
- package/loyalty/teddy-loyalty-redeem.js +38 -0
- package/loyalty/teddy-loyalty.js +214 -0
- package/package.json +20 -0
- package/res/mc-events.js +43 -0
- package/res/mc-shopify.js +439 -0
- package/res/mc-utils.js +119 -0
- package/res/mc-vue.js +9350 -0
- package/returns/teddy-return-iban.js +115 -0
- package/returns/teddy-return-list.js +165 -0
- package/returns/teddy-return-request.js +353 -0
- package/scripts/publish-store.js +62 -0
- package/test/auth-login-error.json +4 -0
- package/test/auth-login-success.json +13 -0
- package/test/auth-password-change-error.json +4 -0
- package/test/auth-password-change-success.json +3 -0
- package/test/auth-register-error.json +4 -0
- package/test/auth-register-success.json +12 -0
- package/test/auth-reset-error.json +4 -0
- package/test/auth-reset-success.json +3 -0
- package/test/loyalty-error.json +4 -0
- package/test/loyalty-noinfo.json +18 -0
- package/test/loyalty-redeem-error.json +4 -0
- package/test/loyalty-redeem-success.json +11 -0
- package/test/loyalty-success.json +143 -0
- package/test/returns-create-success.json +1 -0
- package/test/returns-get-success.json +35 -0
- package/test/returns-get-tracking.json +30 -0
- package/test/returns-list-empty.json +4 -0
- package/test/returns-list-success.json +59 -0
- package/test/returns-search-manual.json +67 -0
- package/test/returns-search-success.json +76 -0
- package/test/wishlist-error.json +4 -0
- package/test/wishlist-success.json +3 -0
- package/wishlist/teddy-wishlist-btn.js +55 -0
- package/wishlist/teddy-wishlist-clear.js +18 -0
- package/wishlist/teddy-wishlist-counter.js +35 -0
- package/wishlist/teddy-wishlist-item.js +46 -0
- package/wishlist/teddy-wishlist-page.js +59 -0
- package/wishlist/teddy-wishlist.js +131 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
await loadComponent('./components/mc-element.js', false);
|
|
2
|
+
await loadComponent('./wishlist/teddy-wishlist.js', false);
|
|
3
|
+
|
|
4
|
+
class TeddyWIshlistItem extends McElement {
|
|
5
|
+
|
|
6
|
+
connectedCallback() {
|
|
7
|
+
if (!this.dataset.handle) {
|
|
8
|
+
console.error('TeddyWIshlistItem: missing data-handle');
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
this.observe();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
observe = () => {
|
|
15
|
+
const observer = new IntersectionObserver((entries, observer) => {
|
|
16
|
+
entries.forEach(entry => {
|
|
17
|
+
if (!entry.isIntersecting) return; // Only proceed if the item is in the viewport
|
|
18
|
+
this.render();
|
|
19
|
+
observer.disconnect(); // Stop observing after the item is rendered
|
|
20
|
+
});
|
|
21
|
+
}, {
|
|
22
|
+
root: null, // viewport
|
|
23
|
+
rootMargin: '0px',
|
|
24
|
+
threshold: 0.1
|
|
25
|
+
});
|
|
26
|
+
observer.observe(this);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
render = () => {
|
|
30
|
+
McShopify.section({
|
|
31
|
+
path: `${Shopify.routes.root}products/${this.dataset.handle}`,
|
|
32
|
+
section_id: 'helper-wishlist-card',
|
|
33
|
+
onSuccess: (data) => {
|
|
34
|
+
this.innerHTML = data;
|
|
35
|
+
},
|
|
36
|
+
onError: (error) => {
|
|
37
|
+
console.error('TeddyWIshlistItem: error fetching item', error);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
if (!window.customElements.get('teddy-wishlist-item')) {
|
|
44
|
+
window.customElements.define('teddy-wishlist-item', TeddyWIshlistItem);
|
|
45
|
+
}
|
|
46
|
+
window.TeddyWIshlistItem = TeddyWIshlistItem;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
await loadComponent('./components/mc-element.js', false);
|
|
2
|
+
await loadComponent('./wishlist/teddy-wishlist.js', false);
|
|
3
|
+
|
|
4
|
+
class TeddyWishlistPage extends McElement {
|
|
5
|
+
emptyTemplate; listTemplate; itemTemplate;
|
|
6
|
+
|
|
7
|
+
connectedCallback() {
|
|
8
|
+
this.emptyTemplate = this.querySelector('#empty-template');
|
|
9
|
+
this.listTemplate = this.querySelector('#list-template');
|
|
10
|
+
this.itemTemplate = this.querySelector('#item-template');
|
|
11
|
+
|
|
12
|
+
if (!this.emptyTemplate || !this.listTemplate || !this.itemTemplate) { console.error('TeddyWishlistPage: missing templates'); return; }
|
|
13
|
+
|
|
14
|
+
this.render();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
render = () => {
|
|
18
|
+
if (TeddyWishlist.isEmpty()) {
|
|
19
|
+
this.renderEmpty();
|
|
20
|
+
} else {
|
|
21
|
+
this.renderList();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
renderEmpty = () => {
|
|
26
|
+
this.innerHTML = '';
|
|
27
|
+
this.appendChild(this.emptyTemplate.content.cloneNode(true));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
renderItem = (item) => {
|
|
31
|
+
const itemElement = this.itemTemplate.content.cloneNode(true);
|
|
32
|
+
const itemContainer = itemElement.querySelector('teddy-wishlist-item');
|
|
33
|
+
if (!itemContainer) { console.error('TeddyWishlistPage: missing item container'); return; }
|
|
34
|
+
|
|
35
|
+
itemContainer.dataset.variant = item.variant;
|
|
36
|
+
itemContainer.dataset.handle = item.handle;
|
|
37
|
+
|
|
38
|
+
return itemElement;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
renderList = () => {
|
|
42
|
+
this.innerHTML = '';
|
|
43
|
+
const listElement = this.listTemplate.content.cloneNode(true);
|
|
44
|
+
const itemsContainer = listElement.querySelector('[data-list]');
|
|
45
|
+
if (!itemsContainer) { console.error('TeddyWishlistPage: missing items container'); return; }
|
|
46
|
+
|
|
47
|
+
TeddyWishlist.getItems().forEach(item => {
|
|
48
|
+
itemsContainer.appendChild(this.renderItem(item));
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
this.appendChild(listElement);
|
|
52
|
+
this.innerHTML = this.innerHTML.replace('${count}', TeddyWishlist.getItemCount());
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
if (!window.customElements.get('teddy-wishlist-page')) {
|
|
57
|
+
window.customElements.define('teddy-wishlist-page', TeddyWishlistPage);
|
|
58
|
+
}
|
|
59
|
+
window.TeddyWishlistPage = TeddyWishlistPage;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import '../res/mc-events.js';
|
|
2
|
+
|
|
3
|
+
class TeddyWishlist {
|
|
4
|
+
|
|
5
|
+
static addItem(item) {
|
|
6
|
+
// aggiunge l'item alla wishlist
|
|
7
|
+
// se c'è il customer salva nel metafield
|
|
8
|
+
if(item == undefined || item == null) { console.error('TeddyWishlist: addItem - item is undefined or null'); return; }
|
|
9
|
+
if(TeddyWishlist.isInWishlist(item)) { console.error('TeddyWishlist: addItem - item is already in wishlist'); return; }
|
|
10
|
+
|
|
11
|
+
const wishlist = this.getItems();
|
|
12
|
+
wishlist.push(item);
|
|
13
|
+
localStorage.setItem('wishlist', JSON.stringify(wishlist));
|
|
14
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_ADDED, { detail: item }));
|
|
15
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_CHANGED, { detail: TeddyWishlist.getItems() }));
|
|
16
|
+
TeddyWishlist.save();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static removeItem(item) {
|
|
20
|
+
// rimuove l'item dalla wishlist
|
|
21
|
+
// se c'è il customer salva nel metafield
|
|
22
|
+
if(item == undefined || item == null) { console.error('TeddyWishlist: removeItem - item is undefined or null'); return; }
|
|
23
|
+
if(!TeddyWishlist.isInWishlist(item)) { console.error('TeddyWishlist: removeItem - item is not in wishlist'); return; }
|
|
24
|
+
|
|
25
|
+
const wishlist = TeddyWishlist.getItems();
|
|
26
|
+
const index = wishlist.findIndex(i => i.variant == item.variant && i.handle == item.handle);
|
|
27
|
+
wishlist.splice(index, 1);
|
|
28
|
+
localStorage.setItem('wishlist', JSON.stringify(wishlist));
|
|
29
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_REMOVED, { detail: item }));
|
|
30
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_CHANGED, { detail: TeddyWishlist.getItems() }));
|
|
31
|
+
TeddyWishlist.save();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static getItems() {
|
|
35
|
+
// ritorna gli item della wishlist
|
|
36
|
+
return localStorage.getItem('wishlist') ? JSON.parse(localStorage.getItem('wishlist')) : [];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static clearWishlist() {
|
|
40
|
+
// svuota la wishlist
|
|
41
|
+
// se c'è il customer salva nel metafield
|
|
42
|
+
localStorage.removeItem('wishlist');
|
|
43
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_CLEARED));
|
|
44
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_CHANGED, { detail: TeddyWishlist.getItems() }));
|
|
45
|
+
TeddyWishlist.save();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static getItemCount() {
|
|
49
|
+
// ritorna il numero di item nella wishlist
|
|
50
|
+
return TeddyWishlist.getItems().length;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static isEmpty() {
|
|
54
|
+
// ritorna true se la wishlist è vuota
|
|
55
|
+
return TeddyWishlist.getItems().length == 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static isInWishlist(item) {
|
|
59
|
+
// ritorna true se l'item è nella wishlist
|
|
60
|
+
const found = TeddyWishlist.getItems().find(i => i.variant == item.variant && i.handle == item.handle);
|
|
61
|
+
return found !== undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static merge(list){
|
|
65
|
+
// unisce la wishlist con un'altra wishlist
|
|
66
|
+
if(!Array.isArray(list)) { console.error('TeddyWishlist: merge - list is not an array'); return; }
|
|
67
|
+
|
|
68
|
+
const wishlist = [];
|
|
69
|
+
TeddyWishlist.getItems().forEach(item => {
|
|
70
|
+
if(wishlist.find(i => i.variant == item.variant && i.handle == item.handle) == undefined) {
|
|
71
|
+
wishlist.push(item);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
list.forEach(item => {
|
|
75
|
+
if(wishlist.find(i => i.variant == item.variant && i.handle == item.handle) == undefined) {
|
|
76
|
+
wishlist.push(item);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
localStorage.setItem('wishlist', JSON.stringify(wishlist));
|
|
80
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_CHANGED, { detail: TeddyWishlist.getItems() }));
|
|
81
|
+
TeddyWishlist.save();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static save() {
|
|
85
|
+
// salva la wishlist chiamando simone+
|
|
86
|
+
if(window.theme.wishlist == undefined) { return; }
|
|
87
|
+
|
|
88
|
+
axios({
|
|
89
|
+
method: 'post',
|
|
90
|
+
url: theme.apis.wishlist.save,
|
|
91
|
+
data: TeddyWishlist.getItems().map(item => item.variant.toString()),
|
|
92
|
+
}).then(response => {
|
|
93
|
+
if(response.data.success) {
|
|
94
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_SAVED, { detail: TeddyWishlist.getItems() }));
|
|
95
|
+
} else {
|
|
96
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_ERROR, { detail: TeddyWishlist.getItems() }));
|
|
97
|
+
console.error('TeddyWishlist: save - error saving wishlist', response.data);
|
|
98
|
+
}
|
|
99
|
+
}).catch(error => {
|
|
100
|
+
window.dispatchEvent(new CustomEvent(MCEVENTS.WISHLIST_ERROR, { detail: TeddyWishlist.getItems() }));
|
|
101
|
+
console.error('TeddyWishlist: save - error saving wishlist', error);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
static isSameWishlist = (list) => {
|
|
106
|
+
const items = TeddyWishlist.getItems();
|
|
107
|
+
if (list.length !== items.length) return false;
|
|
108
|
+
|
|
109
|
+
const serialize = obj => `${obj.handle}-${obj.variant}`;
|
|
110
|
+
|
|
111
|
+
const sorted1 = list.map(serialize).sort();
|
|
112
|
+
const sorted2 = items.map(serialize).sort();
|
|
113
|
+
|
|
114
|
+
const isEquals = sorted1.every((val, i) => val == sorted2[i]);
|
|
115
|
+
return isEquals;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
static checkCustomer = () => {
|
|
119
|
+
// controlla se bisogna fare il merge della wishlist con quella del metafield
|
|
120
|
+
if(window.theme.wishlist == undefined) { return; }
|
|
121
|
+
|
|
122
|
+
// controlla se gli elementi in TeddyWishlist.getItems() sono già presenti in window.theme.wishlist
|
|
123
|
+
if(!TeddyWishlist.isSameWishlist(window.theme.wishlist)) {
|
|
124
|
+
TeddyWishlist.merge(window.theme.wishlist);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
window.TeddyWishlist = TeddyWishlist;
|
|
131
|
+
export default TeddyWishlist;
|