@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.
Files changed (112) hide show
  1. package/algolia/algolia-loader.js +56 -0
  2. package/algolia/algolia-search.js +222 -0
  3. package/auth/teddy-auth-login.js +29 -0
  4. package/auth/teddy-auth-profile.js +58 -0
  5. package/auth/teddy-auth-register.js +52 -0
  6. package/auth/teddy-auth-reset.js +39 -0
  7. package/auth/teddy-auth.js +92 -0
  8. package/bantoa/bantoa-product.js +64 -0
  9. package/bantoa/bantoa-search.js +46 -0
  10. package/bantoa/bantoa-stylemix.js +43 -0
  11. package/bantoa/bantoa.js +21 -0
  12. package/cart/teddy-cart-controller.js +163 -0
  13. package/cart/teddy-cart-customer.js +86 -0
  14. package/cart/teddy-cart-discounts.js +55 -0
  15. package/cart/teddy-cart-promo-apply.js +24 -0
  16. package/cart/teddy-cart-promo-error.js +38 -0
  17. package/cart/teddy-cart-promo-loading.js +20 -0
  18. package/cart/teddy-cart-promo.js +96 -0
  19. package/components/mc-btn.js +38 -0
  20. package/components/mc-card-render.js +33 -0
  21. package/components/mc-cart-counter.js +14 -0
  22. package/components/mc-cart-error.js +35 -0
  23. package/components/mc-cart-quantity.js +43 -0
  24. package/components/mc-cart-remove.js +32 -0
  25. package/components/mc-copy.js +33 -0
  26. package/components/mc-element.js +84 -0
  27. package/components/mc-form-errors.js +35 -0
  28. package/components/mc-form-success.js +31 -0
  29. package/components/mc-form.js +223 -0
  30. package/components/mc-input-area.js +13 -0
  31. package/components/mc-input-checkbox-group.js +52 -0
  32. package/components/mc-input-checkbox.js +12 -0
  33. package/components/mc-input-password.js +39 -0
  34. package/components/mc-input-places.js +43 -0
  35. package/components/mc-input-quantity.js +43 -0
  36. package/components/mc-input-select.js +14 -0
  37. package/components/mc-input-text.js +12 -0
  38. package/components/mc-input.js +137 -0
  39. package/components/mc-loader.js +21 -0
  40. package/components/mc-modal.js +69 -0
  41. package/components/mc-password-eye.js +24 -0
  42. package/components/mc-password-tips.js +60 -0
  43. package/components/mc-qrcode.js +41 -0
  44. package/components/mc-range.js +108 -0
  45. package/components/mc-read-more.js +56 -0
  46. package/components/mc-recommended.js +50 -0
  47. package/components/mc-referrer.js +20 -0
  48. package/components/mc-splash-controller.js +32 -0
  49. package/components/mc-splash-link.js +65 -0
  50. package/components/mc-stoq.js +30 -0
  51. package/components/mc-swiper.js +333 -0
  52. package/components/mc-video.js +61 -0
  53. package/css/bootstrap-lg.css +2762 -0
  54. package/css/bootstrap-lg.min.css +1 -0
  55. package/css/bootstrap-md.css +2762 -0
  56. package/css/bootstrap-md.min.css +1 -0
  57. package/css/bootstrap-sm.css +2762 -0
  58. package/css/bootstrap-sm.min.css +1 -0
  59. package/css/bootstrap-xl.css +2790 -0
  60. package/css/bootstrap-xl.min.css +1 -0
  61. package/css/bootstrap-xxl.css +2762 -0
  62. package/css/bootstrap-xxl.min.css +1 -0
  63. package/css/bootstrap.css +9824 -0
  64. package/css/bootstrap.min.css +5 -0
  65. package/css/mc-form-errors.css +3 -0
  66. package/css/mc-loader.css +6 -0
  67. package/css/mc-password-eye.css +6 -0
  68. package/css/mc-password-tips.css +6 -0
  69. package/css/mc-read-more.css +14 -0
  70. package/css/mc-video.css +4 -0
  71. package/css/mc-wishlist-hero-btn.css +7 -0
  72. package/loader.js +110 -0
  73. package/loyalty/teddy-loyalty-create.js +40 -0
  74. package/loyalty/teddy-loyalty-redeem.js +38 -0
  75. package/loyalty/teddy-loyalty.js +214 -0
  76. package/package.json +20 -0
  77. package/res/mc-events.js +43 -0
  78. package/res/mc-shopify.js +439 -0
  79. package/res/mc-utils.js +119 -0
  80. package/res/mc-vue.js +9350 -0
  81. package/returns/teddy-return-iban.js +115 -0
  82. package/returns/teddy-return-list.js +165 -0
  83. package/returns/teddy-return-request.js +353 -0
  84. package/scripts/publish-store.js +62 -0
  85. package/test/auth-login-error.json +4 -0
  86. package/test/auth-login-success.json +13 -0
  87. package/test/auth-password-change-error.json +4 -0
  88. package/test/auth-password-change-success.json +3 -0
  89. package/test/auth-register-error.json +4 -0
  90. package/test/auth-register-success.json +12 -0
  91. package/test/auth-reset-error.json +4 -0
  92. package/test/auth-reset-success.json +3 -0
  93. package/test/loyalty-error.json +4 -0
  94. package/test/loyalty-noinfo.json +18 -0
  95. package/test/loyalty-redeem-error.json +4 -0
  96. package/test/loyalty-redeem-success.json +11 -0
  97. package/test/loyalty-success.json +143 -0
  98. package/test/returns-create-success.json +1 -0
  99. package/test/returns-get-success.json +35 -0
  100. package/test/returns-get-tracking.json +30 -0
  101. package/test/returns-list-empty.json +4 -0
  102. package/test/returns-list-success.json +59 -0
  103. package/test/returns-search-manual.json +67 -0
  104. package/test/returns-search-success.json +76 -0
  105. package/test/wishlist-error.json +4 -0
  106. package/test/wishlist-success.json +3 -0
  107. package/wishlist/teddy-wishlist-btn.js +55 -0
  108. package/wishlist/teddy-wishlist-clear.js +18 -0
  109. package/wishlist/teddy-wishlist-counter.js +35 -0
  110. package/wishlist/teddy-wishlist-item.js +46 -0
  111. package/wishlist/teddy-wishlist-page.js +59 -0
  112. package/wishlist/teddy-wishlist.js +131 -0
@@ -0,0 +1,40 @@
1
+ await loadComponent('./components/mc-element.js', false);
2
+ await loadComponent('./auth/teddy-auth.js', false);
3
+
4
+ class TeddyLoyaltyCreate extends McElement {
5
+
6
+ connectedCallback() {
7
+ this.addEventListener('click', this.createCard.bind(this));
8
+ }
9
+
10
+ createCard = () => {
11
+ const script = this.querySelector('script');
12
+ if(!script) {
13
+ console.error('No script tag found inside teddy-loyalty-create component');
14
+ return;
15
+ }
16
+
17
+ const json = JSON.parse(script.innerText);
18
+ json.sessionId = TeddyAuth.getSessionId();
19
+ axios({
20
+ method: 'POST',
21
+ url: theme.apis.loyalty.create,
22
+ data: json,
23
+ headers: {
24
+ "Ocp-Apim-Subscription-Key":"0936a98c9baa4aa1a2787657e151b44a"
25
+ }
26
+ })
27
+ .then(response => {
28
+ location.reload();
29
+ })
30
+ .catch(e => {
31
+ console.error('Error creating loyalty card: ', e);
32
+ alert(theme.t.errors.generic);
33
+ });
34
+ }
35
+
36
+ }
37
+ if (!window.customElements.get('teddy-loyalty-create')) {
38
+ window.customElements.define('teddy-loyalty-create', TeddyLoyaltyCreate);
39
+ }
40
+ window.TeddyLoyaltyCreate = TeddyLoyaltyCreate;
@@ -0,0 +1,38 @@
1
+ await loadComponent('./components/mc-form.js', false);
2
+ await loadComponent('./components/mc-form-success.js', false);
3
+ await loadComponent('./res/mc-events.js', false);
4
+
5
+ class TeddyLoyaltyRedeem extends McForm {
6
+
7
+ error = (e) => {
8
+ McShopify.customEvent(MCEVENTS.FORM_ERROR, e, this);
9
+ let message = theme.t.errors.generic || 'An error occurred';
10
+ if(!theme?.t?.errors?.idm) {
11
+ console.error('TeddyLoyaltyRedeem: Missing theme.t.errors.idm translation');
12
+ this.errors.showError(message);
13
+ return;
14
+ }
15
+ message = theme.t.errors.idm[e.error?.code] || theme.t.errors.idm[e.status] || theme.t.errors.idm.default || message;
16
+ console.error("TeddyLoyaltyRedeem.error", message, e);
17
+ this.errors.showError(message);
18
+ }
19
+
20
+ success = ({ data }) => {
21
+ console.log('Redemption successful', data);
22
+ if (!data.success) {
23
+ this.error(data);
24
+ return;
25
+ }
26
+
27
+ this.errors.clear();
28
+ const success = this.querySelector('mc-form-success');
29
+ if(!success) return;
30
+ success.showMessage(theme.t.success.redeem || 'Redemption successful!');
31
+ }
32
+
33
+ }
34
+
35
+ if (!customElements.get('teddy-loyalty-redeem')) {
36
+ customElements.define('teddy-loyalty-redeem', TeddyLoyaltyRedeem);
37
+ }
38
+ window.TeddyLoyaltyRedeem = TeddyLoyaltyRedeem;
@@ -0,0 +1,214 @@
1
+ import '../res/mc-events.js';
2
+ const {createApp} = await import('../res/mc-vue.js');
3
+ await loadComponent('./components/mc-element.js', false);
4
+ await loadComponent('./auth/teddy-auth.js', false);
5
+
6
+ class TeddyLoyalty extends McElement {
7
+
8
+ connectedCallback() {
9
+ const observer = new IntersectionObserver(
10
+ (entries, obs) => {
11
+ entries.forEach(entry => {
12
+ if (entry.isIntersecting) {
13
+ // L'elemento è nella viewport
14
+ this.init();
15
+ obs.unobserve(this); // Osserva solo la prima volta
16
+ }
17
+ });
18
+ },
19
+ { threshold: 0.1 }
20
+ );
21
+ observer.observe(this);
22
+ }
23
+
24
+ init = async () => {
25
+ const cmp = this;
26
+
27
+ const app = createApp({
28
+ delimiters: ['${', '}'], // setta i delimitatori di vue, altrimenti se usiamo gli standard va in conflitto con liquid
29
+ data: () => {
30
+ return {
31
+ loading: true,
32
+ info: window.loyalty?.loyalty?.info || null,
33
+ promotions: window.loyalty?.loyalty?.promotions || [],
34
+ page: 1,
35
+ limit: cmp.dataset.limit || 10,
36
+ movements: window.loyalty?.loyalty?.movements || [],
37
+ data: window.loyalty || null,
38
+ error: false,
39
+ levels: theme.loyalty?.map((e, i) => {
40
+ return {
41
+ ...e,
42
+ index: i
43
+ };
44
+ }) || [],
45
+ }
46
+ },
47
+ methods: {
48
+ getData() {
49
+ this.loading = true;
50
+ window.loyaltyLoading = true;
51
+ axios({
52
+ url: theme.apis.loyalty.info.replace('{customerId}', cmp.dataset.customer),
53
+ method: 'POST',
54
+ data: this.params(),
55
+ headers: {
56
+ "Ocp-Apim-Subscription-Key": "0936a98c9baa4aa1a2787657e151b44a",
57
+ }
58
+ }).then(r => {
59
+ this.onSuccess(r.data);
60
+ }).catch(e => {
61
+ this.onError();
62
+ }).finally(() => {
63
+ this.loading = false;
64
+ window.loyaltyLoading = false;
65
+ });
66
+ },
67
+
68
+ onSuccess(data) {
69
+ console.log('Loyalty data fetched successfully', data);
70
+ if(!data.success){
71
+ this.onError();
72
+ return;
73
+ }
74
+
75
+ window.loyalty = data.data;
76
+ this.setData();
77
+ },
78
+
79
+ onError() {
80
+ window.loyalty = null;
81
+ this.error = true;
82
+ this.data = null;
83
+ this.info = null;
84
+ this.promotions = [];
85
+ this.movements = [];
86
+ this.setData();
87
+ },
88
+
89
+ params(all = true) {
90
+ return {
91
+ brand: cmp.dataset.brand,
92
+ market: cmp.dataset.market,
93
+ callingSystem: 6,
94
+ sessionId: TeddyAuth.getSessionId(),
95
+ cardNumber: cmp.dataset.card
96
+ };
97
+ },
98
+
99
+ checkData() {
100
+ if (window.loyaltyLoading) {
101
+ setTimeout(() => {
102
+ this.checkData();
103
+ }, 100);
104
+ return; // se è in loading non facciamo nulla
105
+ }
106
+ if (window.loyalty && window.loyalty.loyalty) {
107
+ this.setData(window.loyalty);
108
+ this.loading = false;
109
+ return;
110
+ }
111
+
112
+ this.getData();
113
+ },
114
+
115
+ setData() {
116
+ if (!window.loyalty || !window.loyalty.info) {
117
+ console.warn('No loyalty data found');
118
+ this.onError();
119
+ return;
120
+ }
121
+ this.data = window.loyalty;
122
+ this.info = this.data?.info || null;
123
+ this.promotions = this.data?.promotions || [];
124
+ this.movements = this.data?.movements || {};
125
+
126
+ console.log('loyalty data', this.data);
127
+
128
+ if (!this.info) {
129
+ console.warn('No loyalty info found');
130
+ return;
131
+ }
132
+ this.info.tier = { ...this.info.tier, ...this.levels.find(level => level.code == this.info.tier.current) }
133
+ console.log('loyalty info', this.info);
134
+
135
+ },
136
+
137
+ addPage() {
138
+ this.loading = true;
139
+ window.loyaltyLoading = true;
140
+ axios({
141
+ url: theme.apis.loyalty.info.replace('{customerId}', cmp.dataset.customer),
142
+ method: 'GET',
143
+ params: this.params(false)
144
+ }).then(r => {
145
+ const oldItems = this.movements.items || [];
146
+ const newItems = r.data.loyalty.movements.items || [];
147
+
148
+ const updatedItems = [...oldItems, ...newItems];
149
+
150
+ this.movements = {
151
+ ...r.data.loyalty.movements,
152
+ items: updatedItems
153
+ };
154
+
155
+ console.log('loyalty movements', this.movements);
156
+ }).catch(e => {
157
+ console.error('Error fetching loyalty data', e);
158
+ window.loyalty = null;
159
+ this.setData();
160
+ }).finally(() => {
161
+ this.loading = false;
162
+ window.loyaltyLoading = false;
163
+ });
164
+ },
165
+
166
+ next() {
167
+ if (!this.movements) return;
168
+ if (!this.movements.pagination) return;
169
+ if (this.movements.pagination.hasNext) {
170
+ this.page++;
171
+ this.addPage();
172
+ }
173
+ }
174
+ },
175
+ computed: {
176
+ progress() {
177
+ const myTier = this.levels.find(level => level.code == this.info.tier.current)?.index || 0;
178
+ return myTier / (this.levels.length-1) * 100;
179
+ },
180
+
181
+ progressHalf() {
182
+ const myTier = this.levels.find(level => level.code == this.info.tier.current)?.index || 0;
183
+ return (myTier / (this.levels.length-1) * 100) - (100 / (this.levels.length-1) / 2);
184
+ },
185
+
186
+ movementsByDate() {
187
+ if (!this.movements) return [];
188
+ const grouped = this.movements.reduce((acc, item) => {
189
+ const date = new Date(item.date).toLocaleDateString(`${Shopify.locale}-${Shopify.country}`, { year: 'numeric', month: 'numeric', day: 'numeric' });
190
+ if (!acc[date]) acc[date] = [];
191
+ acc[date].push(item);
192
+ return acc;
193
+ }, {});
194
+ const obj = Object.entries(grouped).map(([date, items]) => ({ date, items }));
195
+ console.log('movements by date', obj);
196
+ return obj;
197
+ }
198
+ },
199
+ mounted() {
200
+ this.checkData();
201
+ console.log('Loyalty component mounted', this.data);
202
+ }
203
+ });
204
+ app.config.compilerOptions.isCustomElement = tag => tag.includes('-'); // per evitare che vue vada in conflitto con i custom element
205
+ app.mount(this);
206
+ }
207
+
208
+
209
+ }
210
+
211
+ if (!customElements.get('teddy-loyalty')) {
212
+ customElements.define('teddy-loyalty', TeddyLoyalty);
213
+ }
214
+ window.TeddyLoyalty = TeddyLoyalty;
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@teddy-dev/frontend",
3
+ "version": "1.0.1",
4
+ "description": "Utility js per temi ict shopify",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "test": "echo \"Error: no test specified\" && exit 1",
8
+ "publish:store": "node scripts/publish-store.js"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/ICT-Sviluppo/npm-teddy.git"
13
+ },
14
+ "author": "martina piangerelli",
15
+ "license": "ISC",
16
+ "bugs": {
17
+ "url": "https://github.com/ICT-Sviluppo/npm-teddy/issues"
18
+ },
19
+ "homepage": "https://github.com/ICT-Sviluppo/npm-teddy#readme"
20
+ }
@@ -0,0 +1,43 @@
1
+ const MCEVENTS = {
2
+ COOKIE_CONSENT: 'mc:cookie:consent', //Evento emesso quando l'utente accetta o non accetta i cookie
3
+ COOKIE_CLOSED: 'mc:cookie:closed', //Evento emesso quando l'utente chiude il banner dei cookie
4
+ CART_ADDED: 'mc:cart:added', //Evento emesso quando un prodotto viene aggiunto al carrello
5
+ CART_UPDATED: 'mc:cart:updated', //Evento emesso quando il carrello viene aggiornato
6
+ CART_REMOVED: 'mc:cart:removed', //Evento emesso quando un prodotto viene rimosso dal carrello
7
+ CART_ERROR: 'mc:cart:error', //Evento emesso quando un prodotto viene rimosso dal carrello
8
+ SEARCH: 'mc:search', //Evento emesso quando viene effettuata una ricerca
9
+ SEARCH_ERROR: 'mc:search:error', //Evento emesso quando viene effettuata una ricerca
10
+ WISHLIST_ADDED: 'mc:wishlist:added', // Evento custom: prodotto aggiunto
11
+ WISHLIST_CHANGED: 'mc:wishlist:changed', // Evento custom: prodotto modificato
12
+ WISHLIST_REMOVED: 'mc:wishlist:removed', // Evento custom: prodotto rimosso
13
+ WISHLIST_ERROR: 'mc:wishlist:error', // Evento custom: errore
14
+ WISHLIST_CLEARED: 'mc:wishlist:cleared', // Evento custom: errore
15
+ WISHLIST_SAVED: 'mc:wishlist:saved', // Evento custom: errore
16
+ INPUT_VALID: 'mc:input:valid', // Evento custom: input valido
17
+ INPUT_ERROR: 'mc:input:error', // Evento custom: input con errore
18
+ FORM_SUBMIT: 'mc:form:submit', // Evento custom: form inviato
19
+ FORM_SUCCESS: 'mc:form:success', // Evento custom: form inviato con successo
20
+ FORM_ERROR: 'mc:form:error', // Evento custom: errore nel form
21
+ FORM_COMPLETED: 'mc:form:completed', // Evento custom: form completato
22
+ FORM_VALIDATE: 'mc:form:validate', // Evento custom: form validato
23
+ EL_ACTIVATED: 'mc:el:activated', // Evento custom: elemento attivato
24
+ EL_DEACTIVATED: 'mc:el:deactivated', // Evento custom: elemento disattivato
25
+ PLACES_LOCATED: 'mc:places:located', // Evento custom: geolocalizzazione riuscita
26
+ PLACES_CHANGE: 'mc:places:change', // Evento custom: cambio posto selezionato
27
+ QUANTITY_CHANGED: 'mc:quantity:changed', // Evento custom: quantità cambiata
28
+ LOGIN: 'mc:login', // Evento custom: login effettuato
29
+ LOGOUT: 'mc:logout', // Evento custom: logout effettuato
30
+ VARIANTS_FOUND: 'mc:variants:found', // Evento custom: varianti trovate
31
+ PROMO_APPLIED: 'mc:promo:applied', // Evento custom: promozione applicata
32
+ CART_ASSOCIATED: 'mc:cart:associated', // Evento custom: carrello associato
33
+ CART_READY: 'mc:cart:ready', // Evento custom: carrello pronto
34
+ ATTRIBUTES_UPDATED: 'mc:attributes:updated', // Evento custom: attributi aggiornati
35
+ FORM_AUTOSUBMIT: 'mc:form:autosubmit',
36
+ PROMO_ERROR: 'mc:promo:error',
37
+ PROMO_APPLIED: 'mc:promo:applied',
38
+ PROMO_COMPLETED: 'mc:promo:completed',
39
+ PROMO_APPLY: 'mc:promo:apply',
40
+ BANTOA_LOADED: 'mc:bantoa:loaded',
41
+ };
42
+ window.MCEVENTS = MCEVENTS; // Esporta l'oggetto MCEVENTS nel contesto globale
43
+ export default MCEVENTS;