@raxonltd/raxon-core 1.0.0

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 (164) hide show
  1. package/dist/core/component/general.image.d.ts +25 -0
  2. package/dist/core/component/general.image.d.ts.map +1 -0
  3. package/dist/core/component/general.image.js +30 -0
  4. package/dist/core/context/cart.context.d.ts +25 -0
  5. package/dist/core/context/cart.context.d.ts.map +1 -0
  6. package/dist/core/context/cart.context.js +339 -0
  7. package/dist/core/context/security.context.d.ts +15 -0
  8. package/dist/core/context/security.context.d.ts.map +1 -0
  9. package/dist/core/context/security.context.js +130 -0
  10. package/dist/core/feature/address/form/address-search-input.d.ts +17 -0
  11. package/dist/core/feature/address/form/address-search-input.d.ts.map +1 -0
  12. package/dist/core/feature/address/form/address-search-input.js +30 -0
  13. package/dist/core/feature/address/hook/use.addres.d.ts +10 -0
  14. package/dist/core/feature/address/hook/use.addres.d.ts.map +1 -0
  15. package/dist/core/feature/address/hook/use.addres.js +57 -0
  16. package/dist/core/feature/address/hook/use.address-autocomplete.d.ts +13 -0
  17. package/dist/core/feature/address/hook/use.address-autocomplete.d.ts.map +1 -0
  18. package/dist/core/feature/address/hook/use.address-autocomplete.js +105 -0
  19. package/dist/core/feature/address/util/address.types.d.ts +37 -0
  20. package/dist/core/feature/address/util/address.types.d.ts.map +1 -0
  21. package/dist/core/feature/address/util/address.types.js +1 -0
  22. package/dist/core/feature/address/util/parse-google-place.d.ts +13 -0
  23. package/dist/core/feature/address/util/parse-google-place.d.ts.map +1 -0
  24. package/dist/core/feature/address/util/parse-google-place.js +49 -0
  25. package/dist/core/feature/analytic-event/analytic.event.context.d.ts +19 -0
  26. package/dist/core/feature/analytic-event/analytic.event.context.d.ts.map +1 -0
  27. package/dist/core/feature/analytic-event/analytic.event.context.js +151 -0
  28. package/dist/core/feature/article/hook/use.article.d.ts +7 -0
  29. package/dist/core/feature/article/hook/use.article.d.ts.map +1 -0
  30. package/dist/core/feature/article/hook/use.article.js +28 -0
  31. package/dist/core/feature/attribute/hook/use.attribute.d.ts +10 -0
  32. package/dist/core/feature/attribute/hook/use.attribute.d.ts.map +1 -0
  33. package/dist/core/feature/attribute/hook/use.attribute.js +21 -0
  34. package/dist/core/feature/auth/hook/use.auth.d.ts +29 -0
  35. package/dist/core/feature/auth/hook/use.auth.d.ts.map +1 -0
  36. package/dist/core/feature/auth/hook/use.auth.js +122 -0
  37. package/dist/core/feature/auth/modal/modal.auth.d.ts +9 -0
  38. package/dist/core/feature/auth/modal/modal.auth.d.ts.map +1 -0
  39. package/dist/core/feature/auth/modal/modal.auth.js +34 -0
  40. package/dist/core/feature/auth/view/view.login.d.ts +8 -0
  41. package/dist/core/feature/auth/view/view.login.d.ts.map +1 -0
  42. package/dist/core/feature/auth/view/view.login.js +45 -0
  43. package/dist/core/feature/auth/view/view.register.d.ts +8 -0
  44. package/dist/core/feature/auth/view/view.register.d.ts.map +1 -0
  45. package/dist/core/feature/auth/view/view.register.js +83 -0
  46. package/dist/core/feature/bank-account/hook/use.bank.account.d.ts +12 -0
  47. package/dist/core/feature/bank-account/hook/use.bank.account.d.ts.map +1 -0
  48. package/dist/core/feature/bank-account/hook/use.bank.account.js +38 -0
  49. package/dist/core/feature/cart/component/cart.order.summary.d.ts +8 -0
  50. package/dist/core/feature/cart/component/cart.order.summary.d.ts.map +1 -0
  51. package/dist/core/feature/cart/component/cart.order.summary.js +8 -0
  52. package/dist/core/feature/cart/component/cart.promo.code.section.d.ts +6 -0
  53. package/dist/core/feature/cart/component/cart.promo.code.section.d.ts.map +1 -0
  54. package/dist/core/feature/cart/component/cart.promo.code.section.js +109 -0
  55. package/dist/core/feature/cart/hook/use.cart.d.ts +67 -0
  56. package/dist/core/feature/cart/hook/use.cart.d.ts.map +1 -0
  57. package/dist/core/feature/cart/hook/use.cart.js +196 -0
  58. package/dist/core/feature/cart/util/basket-pay.response.d.ts +20 -0
  59. package/dist/core/feature/cart/util/basket-pay.response.d.ts.map +1 -0
  60. package/dist/core/feature/cart/util/basket-pay.response.js +40 -0
  61. package/dist/core/feature/cart/util/cart-optimistic.d.ts +36 -0
  62. package/dist/core/feature/cart/util/cart-optimistic.d.ts.map +1 -0
  63. package/dist/core/feature/cart/util/cart-optimistic.js +320 -0
  64. package/dist/core/feature/cart/util/garanti-payment.d.ts +4 -0
  65. package/dist/core/feature/cart/util/garanti-payment.d.ts.map +1 -0
  66. package/dist/core/feature/cart/util/garanti-payment.js +26 -0
  67. package/dist/core/feature/collection/hook/use.collection.d.ts +7 -0
  68. package/dist/core/feature/collection/hook/use.collection.d.ts.map +1 -0
  69. package/dist/core/feature/collection/hook/use.collection.js +27 -0
  70. package/dist/core/feature/delivery-method/hook/use.delivery.method.d.ts +10 -0
  71. package/dist/core/feature/delivery-method/hook/use.delivery.method.d.ts.map +1 -0
  72. package/dist/core/feature/delivery-method/hook/use.delivery.method.js +33 -0
  73. package/dist/core/feature/delivery-method/util/checkout.delivery.method.d.ts +5 -0
  74. package/dist/core/feature/delivery-method/util/checkout.delivery.method.d.ts.map +1 -0
  75. package/dist/core/feature/delivery-method/util/checkout.delivery.method.js +8 -0
  76. package/dist/core/feature/faq/hook/use.faq.d.ts +9 -0
  77. package/dist/core/feature/faq/hook/use.faq.d.ts.map +1 -0
  78. package/dist/core/feature/faq/hook/use.faq.js +20 -0
  79. package/dist/core/feature/favorite/hook/use.favorite.d.ts +17 -0
  80. package/dist/core/feature/favorite/hook/use.favorite.d.ts.map +1 -0
  81. package/dist/core/feature/favorite/hook/use.favorite.js +35 -0
  82. package/dist/core/feature/form-submit/form/form.contact.d.ts +6 -0
  83. package/dist/core/feature/form-submit/form/form.contact.d.ts.map +1 -0
  84. package/dist/core/feature/form-submit/form/form.contact.js +8 -0
  85. package/dist/core/feature/form-submit/hook/use.form.submit.d.ts +4 -0
  86. package/dist/core/feature/form-submit/hook/use.form.submit.d.ts.map +1 -0
  87. package/dist/core/feature/form-submit/hook/use.form.submit.js +13 -0
  88. package/dist/core/feature/invoice/hook/use.invoice.d.ts +9 -0
  89. package/dist/core/feature/invoice/hook/use.invoice.d.ts.map +1 -0
  90. package/dist/core/feature/invoice/hook/use.invoice.js +46 -0
  91. package/dist/core/feature/newsletter/hook/use.newsletter.d.ts +13 -0
  92. package/dist/core/feature/newsletter/hook/use.newsletter.d.ts.map +1 -0
  93. package/dist/core/feature/newsletter/hook/use.newsletter.js +21 -0
  94. package/dist/core/feature/newsletter/modal/modal.newsletter.product.d.ts +27 -0
  95. package/dist/core/feature/newsletter/modal/modal.newsletter.product.d.ts.map +1 -0
  96. package/dist/core/feature/newsletter/modal/modal.newsletter.product.js +77 -0
  97. package/dist/core/feature/order/hook/use.order.d.ts +7 -0
  98. package/dist/core/feature/order/hook/use.order.d.ts.map +1 -0
  99. package/dist/core/feature/order/hook/use.order.js +26 -0
  100. package/dist/core/feature/payment-method/checkout.payment.options.d.ts +18 -0
  101. package/dist/core/feature/payment-method/checkout.payment.options.d.ts.map +1 -0
  102. package/dist/core/feature/payment-method/checkout.payment.options.js +74 -0
  103. package/dist/core/feature/payment-method/hook/use.payment.method.d.ts +8 -0
  104. package/dist/core/feature/payment-method/hook/use.payment.method.d.ts.map +1 -0
  105. package/dist/core/feature/payment-method/hook/use.payment.method.js +36 -0
  106. package/dist/core/feature/product/hook/use.product.d.ts +62 -0
  107. package/dist/core/feature/product/hook/use.product.d.ts.map +1 -0
  108. package/dist/core/feature/product/hook/use.product.js +60 -0
  109. package/dist/core/feature/profile/hook/use.profile.d.ts +26 -0
  110. package/dist/core/feature/profile/hook/use.profile.d.ts.map +1 -0
  111. package/dist/core/feature/profile/hook/use.profile.js +83 -0
  112. package/dist/core/feature/promo-code/hook/use.promo.code.d.ts +8 -0
  113. package/dist/core/feature/promo-code/hook/use.promo.code.d.ts.map +1 -0
  114. package/dist/core/feature/promo-code/hook/use.promo.code.js +24 -0
  115. package/dist/core/interface/basket.interface.d.ts +347 -0
  116. package/dist/core/interface/basket.interface.d.ts.map +1 -0
  117. package/dist/core/interface/basket.interface.js +1 -0
  118. package/dist/core/interface/inventory.interface.d.ts +87 -0
  119. package/dist/core/interface/inventory.interface.d.ts.map +1 -0
  120. package/dist/core/interface/inventory.interface.js +1 -0
  121. package/dist/core/interface/nexine.interface.d.ts +5 -0
  122. package/dist/core/interface/nexine.interface.d.ts.map +1 -0
  123. package/dist/core/interface/nexine.interface.js +1 -0
  124. package/dist/core/interface/prisma.interface.d.ts +8404 -0
  125. package/dist/core/interface/prisma.interface.d.ts.map +1 -0
  126. package/dist/core/interface/prisma.interface.js +1227 -0
  127. package/dist/core/interface/product.interface.d.ts +100 -0
  128. package/dist/core/interface/product.interface.d.ts.map +1 -0
  129. package/dist/core/interface/product.interface.js +1 -0
  130. package/dist/core/raxon.context.d.ts +44 -0
  131. package/dist/core/raxon.context.d.ts.map +1 -0
  132. package/dist/core/raxon.context.js +90 -0
  133. package/dist/core/schema/checkout.schema.d.ts +46 -0
  134. package/dist/core/schema/checkout.schema.d.ts.map +1 -0
  135. package/dist/core/schema/checkout.schema.js +83 -0
  136. package/dist/core/util/basket.item.display.d.ts +3 -0
  137. package/dist/core/util/basket.item.display.d.ts.map +1 -0
  138. package/dist/core/util/basket.item.display.js +18 -0
  139. package/dist/core/util/category.nav.d.ts +9 -0
  140. package/dist/core/util/category.nav.d.ts.map +1 -0
  141. package/dist/core/util/category.nav.js +37 -0
  142. package/dist/core/util/client-ip.d.ts +2 -0
  143. package/dist/core/util/client-ip.d.ts.map +1 -0
  144. package/dist/core/util/client-ip.js +32 -0
  145. package/dist/core/util/collection.util.d.ts +31 -0
  146. package/dist/core/util/collection.util.d.ts.map +1 -0
  147. package/dist/core/util/collection.util.js +167 -0
  148. package/dist/core/util/garanti-payment.d.ts +2 -0
  149. package/dist/core/util/garanti-payment.d.ts.map +1 -0
  150. package/dist/core/util/garanti-payment.js +1 -0
  151. package/dist/core/util/nexine.axios.d.ts +2 -0
  152. package/dist/core/util/nexine.axios.d.ts.map +1 -0
  153. package/dist/core/util/nexine.axios.js +62 -0
  154. package/dist/core/util/no-cache.d.ts +6 -0
  155. package/dist/core/util/no-cache.d.ts.map +1 -0
  156. package/dist/core/util/no-cache.js +6 -0
  157. package/dist/core/util/util.d.ts +18 -0
  158. package/dist/core/util/util.d.ts.map +1 -0
  159. package/dist/core/util/util.js +163 -0
  160. package/dist/index.d.ts +23 -0
  161. package/dist/index.d.ts.map +1 -0
  162. package/dist/index.js +22 -0
  163. package/dist/tsconfig.tsbuildinfo +1 -0
  164. package/package.json +50 -0
@@ -0,0 +1,320 @@
1
+ import { SaleType } from '@/core/interface/prisma.interface';
2
+ export const CART_QUERY_KEY = ['organization', 'cart'];
3
+ export const CART_QUANTITY_DEBOUNCE_MS = 400;
4
+ export function createEmptyOptimisticCart() {
5
+ return {
6
+ id: 'optimistic-cart',
7
+ acceptedAlternativeProduct: false,
8
+ items: [],
9
+ info: {
10
+ count: { VKE: 0, Basis: 0, Gesamt: 0, Artikel: 0 },
11
+ basePrice: { total: 0, tax: 0, pay: 0 },
12
+ deposit: { total: 0, tax: 0, pay: 0 },
13
+ tax: [],
14
+ delivery: { total: 0, tax: 0, pay: 0 },
15
+ discount: { total: 0, tax: 0, pay: 0 },
16
+ promotion: { total: 0, tax: 0, pay: 0 },
17
+ campaign: { info: { status: null, message: null, name: null }, total: 0, tax: 0, pay: 0 },
18
+ payPrice: { total: 0, tax: 0, pay: 0, delivery: 0, discount: 0, deposit: 0, promotion: 0, campaign: 0 },
19
+ },
20
+ };
21
+ }
22
+ export function unionMergeCarts(carts) {
23
+ const valid = carts.filter((c) => Boolean(c));
24
+ if (valid.length === 0)
25
+ return undefined;
26
+ const lineMap = new Map();
27
+ for (const cart of valid) {
28
+ for (const item of cart.items ?? []) {
29
+ const identity = cartLineIdentity(item);
30
+ const existing = lineMap.get(identity);
31
+ if (!existing) {
32
+ lineMap.set(identity, item);
33
+ continue;
34
+ }
35
+ const existingOptimistic = String(existing.id).startsWith('optimistic-');
36
+ const itemOptimistic = String(item.id).startsWith('optimistic-');
37
+ if (existingOptimistic && !itemOptimistic) {
38
+ lineMap.set(identity, item);
39
+ continue;
40
+ }
41
+ if (!existingOptimistic && !itemOptimistic && Number(item.quantity) >= Number(existing.quantity)) {
42
+ lineMap.set(identity, item);
43
+ }
44
+ }
45
+ }
46
+ if (lineMap.size === 0)
47
+ return valid[valid.length - 1];
48
+ const base = valid.find((cart) => (cart.items?.length ?? 0) > 0) ?? valid[0];
49
+ return recalcCartTotals(base, Array.from(lineMap.values()));
50
+ }
51
+ export function readCartCache(queryClient) {
52
+ const direct = queryClient.getQueryData(CART_QUERY_KEY);
53
+ const entries = queryClient.getQueriesData({ queryKey: CART_QUERY_KEY });
54
+ const snapshots = [direct, ...entries.map(([, data]) => data)];
55
+ return unionMergeCarts(snapshots);
56
+ }
57
+ export function patchCartCache(queryClient, updater) {
58
+ queryClient.setQueryData(CART_QUERY_KEY, (old) => updater(old));
59
+ }
60
+ export function cartLineKey(productId, variantId) {
61
+ return `${productId}:${variantId ?? ''}`;
62
+ }
63
+ export function cartLineIdentity(item) {
64
+ const variantId = item.variant?.id ?? item.variantId ?? '';
65
+ return cartLineKey(item.productId, variantId);
66
+ }
67
+ export function findCartLine(cart, productId, variantId) {
68
+ if (!cart?.items)
69
+ return undefined;
70
+ return cart.items.find((item) => {
71
+ const sameProduct = String(item.productId) === String(productId);
72
+ if (!sameProduct)
73
+ return false;
74
+ const itemVariantId = item.variant?.id ?? item.variantId ?? '';
75
+ const targetVariantId = variantId ?? '';
76
+ return String(itemVariantId) === String(targetVariantId);
77
+ });
78
+ }
79
+ export function findConfirmedCartLine(cart, productId, variantId) {
80
+ const line = findCartLine(cart, productId, variantId);
81
+ if (!line || String(line.id).startsWith('optimistic-'))
82
+ return undefined;
83
+ return line;
84
+ }
85
+ export function isFullBasketSnapshot(basket, cached) {
86
+ if (!cached?.items?.length)
87
+ return true;
88
+ const basketItems = basket.items ?? [];
89
+ if (basketItems.length >= cached.items.length)
90
+ return true;
91
+ const basketKeys = new Set(basketItems.map(cartLineIdentity));
92
+ return cached.items.every((item) => basketKeys.has(cartLineIdentity(item)));
93
+ }
94
+ export function mergeCartWithOptimisticExtras(server, cached) {
95
+ if (!cached?.items?.length)
96
+ return server;
97
+ if (!server?.items?.length)
98
+ return cached;
99
+ const serverKeys = new Set(server.items.map(cartLineIdentity));
100
+ const optimisticExtras = cached.items.filter((item) => !serverKeys.has(cartLineIdentity(item)) && String(item.id).startsWith('optimistic-'));
101
+ if (optimisticExtras.length === 0)
102
+ return server;
103
+ return recalcCartTotals(server, [...server.items, ...optimisticExtras]);
104
+ }
105
+ export function applyBasketInsertResponse(basket, cached) {
106
+ if (!cached?.items?.length)
107
+ return basket;
108
+ if (isFullBasketSnapshot(basket, cached)) {
109
+ return mergeCartWithOptimisticExtras(basket, cached);
110
+ }
111
+ return (basket.items?.reduce((acc, item) => mergeInsertItemIntoCart(acc, {
112
+ id: String(item.id),
113
+ productId: String(item.productId),
114
+ variantId: item.variantId != null ? String(item.variantId) : null,
115
+ quantity: Number(item.quantity || 1),
116
+ }), cached) ?? cached);
117
+ }
118
+ export function removeCartLineByKey(cart, lineKey) {
119
+ const items = (cart.items ?? []).filter((item) => {
120
+ if (String(item.id) === `optimistic-${lineKey}`)
121
+ return false;
122
+ return cartLineKey(item.productId, item.variant?.id ?? item.variantId) !== lineKey;
123
+ });
124
+ return recalcCartTotals(cart, items);
125
+ }
126
+ export function createOptimisticCartLine(add) {
127
+ const linePay = Number(add.linePay || 0);
128
+ const quantity = Number(add.quantity || 1);
129
+ return {
130
+ id: `optimistic-${cartLineKey(add.productId, add.variantId)}`,
131
+ productId: String(add.productId),
132
+ variantId: add.variantId ? String(add.variantId) : null,
133
+ variant: add.variantId ? { id: String(add.variantId) } : null,
134
+ taxPercentage: 0,
135
+ images: [],
136
+ product: {
137
+ articleNumber: '',
138
+ type: 'product',
139
+ baseUnit: { id: '', name: '' },
140
+ productUnits: [],
141
+ id: String(add.productId),
142
+ name: '',
143
+ },
144
+ productUnit: { id: '', name: '' },
145
+ productSaleUnit: '',
146
+ unitName: '',
147
+ quantityPerUnitOfMeasure: 1,
148
+ quantity,
149
+ saleType: SaleType.UNIT,
150
+ weight: 0,
151
+ stock: 0,
152
+ basePrice: linePay / quantity,
153
+ discountPrice: 0,
154
+ lineTotal: linePay,
155
+ lineTax: 0,
156
+ linePay,
157
+ taxAmount: { baseTaxAmount: 0, payTaxAmount: 0 },
158
+ };
159
+ }
160
+ export function applyPendingAdds(cart, pendingAdds) {
161
+ const entries = Object.entries(pendingAdds);
162
+ if (entries.length === 0)
163
+ return cart;
164
+ let items = [...(cart.items || [])];
165
+ for (const [, add] of entries) {
166
+ const existingIndex = items.findIndex((item) => {
167
+ const sameProduct = String(item.productId) === String(add.productId);
168
+ const itemVariantId = item.variant?.id ?? item.variantId ?? '';
169
+ const targetVariantId = add.variantId ?? '';
170
+ return sameProduct && String(itemVariantId) === String(targetVariantId);
171
+ });
172
+ if (existingIndex >= 0) {
173
+ const existing = items[existingIndex];
174
+ const unitPrice = Number(existing.linePay || add.linePay || 0) / (Number(existing.quantity || add.quantity) || 1);
175
+ items[existingIndex] = {
176
+ ...existing,
177
+ quantity: add.quantity,
178
+ linePay: unitPrice * add.quantity,
179
+ };
180
+ continue;
181
+ }
182
+ items = [...items, createOptimisticCartLine(add)];
183
+ }
184
+ return recalcCartTotals(cart, items);
185
+ }
186
+ export function extractBasketFromInsertResponse(data) {
187
+ if (!data || typeof data !== 'object')
188
+ return null;
189
+ const payload = data;
190
+ if (Array.isArray(payload.items))
191
+ return payload;
192
+ const nested = payload.data;
193
+ if (nested && typeof nested === 'object' && Array.isArray(nested.items)) {
194
+ return nested;
195
+ }
196
+ return null;
197
+ }
198
+ export function extractInsertCartItem(data) {
199
+ if (!data || typeof data !== 'object')
200
+ return null;
201
+ const payload = data;
202
+ const raw = payload.data && typeof payload.data === 'object' && !Array.isArray(payload.data)
203
+ ? payload.data
204
+ : payload;
205
+ if (!raw.id || !raw.productId)
206
+ return null;
207
+ return {
208
+ id: String(raw.id),
209
+ productId: String(raw.productId),
210
+ variantId: raw.variantId != null ? String(raw.variantId) : null,
211
+ quantity: Number(raw.quantity || 1),
212
+ };
213
+ }
214
+ function recalcCartTotals(cart, items) {
215
+ const newGesamt = items.reduce((sum, item) => sum + Number(item.quantity || 0), 0);
216
+ const newPay = items.reduce((sum, item) => sum + Number(item.linePay || 0), 0);
217
+ return {
218
+ ...cart,
219
+ items,
220
+ info: {
221
+ ...cart.info,
222
+ count: {
223
+ ...cart.info?.count,
224
+ Gesamt: newGesamt,
225
+ Artikel: items.length,
226
+ },
227
+ payPrice: {
228
+ ...cart.info?.payPrice,
229
+ total: newPay,
230
+ pay: newPay,
231
+ },
232
+ },
233
+ };
234
+ }
235
+ export function mergeInsertItemIntoCart(cart, insertItem, pendingAdd) {
236
+ const items = [...(cart.items || [])];
237
+ const targetQuantity = Math.max(Number(pendingAdd?.quantity || 0), Number(insertItem.quantity || 1));
238
+ const index = items.findIndex((item) => {
239
+ if (String(item.id) === `optimistic-${cartLineKey(insertItem.productId, insertItem.variantId)}`) {
240
+ return true;
241
+ }
242
+ const sameProduct = String(item.productId) === String(insertItem.productId);
243
+ const itemVariantId = item.variant?.id ?? item.variantId ?? '';
244
+ const targetVariantId = insertItem.variantId ?? '';
245
+ return sameProduct && String(itemVariantId) === String(targetVariantId);
246
+ });
247
+ const unitPrice = index >= 0
248
+ ? Number(items[index].linePay || 0) / (Number(items[index].quantity || 0) || 1)
249
+ : Number(pendingAdd?.linePay || 0) / (Number(pendingAdd?.quantity || 0) || 1);
250
+ const nextLine = {
251
+ ...(index >= 0
252
+ ? items[index]
253
+ : createOptimisticCartLine({
254
+ productId: insertItem.productId,
255
+ variantId: insertItem.variantId ?? undefined,
256
+ quantity: targetQuantity,
257
+ linePay: unitPrice * targetQuantity,
258
+ })),
259
+ id: insertItem.id,
260
+ productId: insertItem.productId,
261
+ variantId: insertItem.variantId ?? null,
262
+ variant: insertItem.variantId ? { id: insertItem.variantId } : null,
263
+ quantity: targetQuantity,
264
+ linePay: unitPrice * targetQuantity,
265
+ };
266
+ if (index >= 0) {
267
+ items[index] = nextLine;
268
+ }
269
+ else {
270
+ items.push(nextLine);
271
+ }
272
+ return recalcCartTotals(cart, items);
273
+ }
274
+ export function patchCartItemQuantity(cart, itemId, quantity, productId, variantId) {
275
+ if (!cart.items?.length)
276
+ return cart;
277
+ let targetId = itemId;
278
+ const hasTarget = cart.items.some((item) => String(item.id) === itemId);
279
+ if (!hasTarget && productId) {
280
+ const line = findCartLine(cart, productId, variantId);
281
+ if (line)
282
+ targetId = String(line.id);
283
+ }
284
+ if (!cart.items.some((item) => String(item.id) === targetId))
285
+ return cart;
286
+ let priceDiff = 0;
287
+ const updatedItems = cart.items.map((item) => {
288
+ if (String(item.id) !== targetId)
289
+ return item;
290
+ const oldQty = Number(item.quantity || 0);
291
+ const unitPrice = Number(item.linePay || 0) / (oldQty || 1);
292
+ priceDiff = (quantity - oldQty) * unitPrice;
293
+ return {
294
+ ...item,
295
+ quantity,
296
+ linePay: quantity * unitPrice,
297
+ };
298
+ });
299
+ const newGesamt = updatedItems.reduce((sum, item) => sum + Number(item.quantity || 0), 0);
300
+ return {
301
+ ...cart,
302
+ items: updatedItems,
303
+ info: {
304
+ ...cart.info,
305
+ count: {
306
+ ...cart.info?.count,
307
+ Gesamt: newGesamt,
308
+ Artikel: updatedItems.length,
309
+ },
310
+ payPrice: {
311
+ ...cart.info?.payPrice,
312
+ total: Number(cart.info?.payPrice?.total || 0) + priceDiff,
313
+ pay: Number(cart.info?.payPrice?.pay || 0) + priceDiff,
314
+ },
315
+ },
316
+ };
317
+ }
318
+ export function applyPendingQuantities(cart, pendingQuantities) {
319
+ return Object.entries(pendingQuantities).reduce((acc, [itemId, quantity]) => patchCartItemQuantity(acc, itemId, quantity), cart);
320
+ }
@@ -0,0 +1,4 @@
1
+ export declare function storeGarantiPaymentHtml(transactionId: string, html: string): void;
2
+ export declare function consumeGarantiPaymentHtml(transactionId: string): string | null;
3
+ export declare function submitGarantiPaymentHtml(html: string): void;
4
+ //# sourceMappingURL=garanti-payment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"garanti-payment.d.ts","sourceRoot":"","sources":["../../../../../core/feature/cart/util/garanti-payment.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAG1E;AAED,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ9E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,QASpD"}
@@ -0,0 +1,26 @@
1
+ const GARANTI_PAYMENT_HTML_KEY_PREFIX = 'payment:garanti:';
2
+ export function storeGarantiPaymentHtml(transactionId, html) {
3
+ if (typeof window === 'undefined')
4
+ return;
5
+ sessionStorage.setItem(`${GARANTI_PAYMENT_HTML_KEY_PREFIX}${transactionId}`, html);
6
+ }
7
+ export function consumeGarantiPaymentHtml(transactionId) {
8
+ if (typeof window === 'undefined')
9
+ return null;
10
+ const key = `${GARANTI_PAYMENT_HTML_KEY_PREFIX}${transactionId}`;
11
+ const html = sessionStorage.getItem(key);
12
+ if (html) {
13
+ sessionStorage.removeItem(key);
14
+ }
15
+ return html;
16
+ }
17
+ export function submitGarantiPaymentHtml(html) {
18
+ const wrapper = document.createElement('div');
19
+ wrapper.innerHTML = html;
20
+ const form = wrapper.querySelector('form');
21
+ if (!(form instanceof HTMLFormElement)) {
22
+ throw new Error('Garanti ödeme formu bulunamadı.');
23
+ }
24
+ document.body.appendChild(form);
25
+ form.submit();
26
+ }
@@ -0,0 +1,7 @@
1
+ import { IData } from "@/core/interface/nexine.interface";
2
+ import { Collection } from "@/core/interface/prisma.interface";
3
+ export declare const useCollection: () => {
4
+ fetch: (params?: any) => import("@tanstack/react-query").UseQueryResult<NoInfer<IData<Collection>>, Error>;
5
+ detail: (id: string) => import("@tanstack/react-query").UseQueryResult<NoInfer<Collection>, Error>;
6
+ };
7
+ //# sourceMappingURL=use.collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.collection.d.ts","sourceRoot":"","sources":["../../../../../core/feature/collection/hook/use.collection.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC1D,OAAO,EAAqB,UAAU,EAAoB,MAAM,mCAAmC,CAAC;AAGpG,eAAO,MAAM,aAAa;qBAKC,GAAG;iBAWT,MAAM;CAU1B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { nexineAxios } from "@/core/util/nexine.axios";
2
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
3
+ export const useCollection = () => {
4
+ const queryClient = useQueryClient();
5
+ return {
6
+ fetch: (params) => {
7
+ return useQuery({
8
+ queryKey: ['web', 'collection', 'list', params],
9
+ queryFn: async () => {
10
+ var response = await nexineAxios.get(`/customer/collection`, {
11
+ params: params
12
+ });
13
+ return response.data;
14
+ },
15
+ });
16
+ },
17
+ detail: (id) => {
18
+ return useQuery({
19
+ queryKey: ['web', 'collection', 'detail', id],
20
+ queryFn: async () => {
21
+ var response = await nexineAxios.get(`/customer/collection/${id}`);
22
+ return response.data;
23
+ },
24
+ });
25
+ }
26
+ };
27
+ };
@@ -0,0 +1,10 @@
1
+ import { DeliveryMethod } from '@/core/interface/prisma.interface';
2
+ export declare const useDeliveryMethod: () => {
3
+ fetch: (opts?: {
4
+ enabled?: boolean;
5
+ }) => import("@tanstack/react-query").UseQueryResult<NoInfer<{
6
+ data: DeliveryMethod[];
7
+ count: number;
8
+ }>, Error>;
9
+ };
10
+ //# sourceMappingURL=use.delivery.method.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.delivery.method.d.ts","sourceRoot":"","sources":["../../../../../core/feature/delivery-method/hook/use.delivery.method.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AA2BnE,eAAO,MAAM,iBAAiB;mBAEX;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;;;;CAQvC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { nexineAxios } from '@/core/util/nexine.axios';
2
+ import { useQuery } from '@tanstack/react-query';
3
+ import { getCheckoutDeliveryMethods } from '@/core/feature/delivery-method/util/checkout.delivery.method';
4
+ async function fetchDeliveryMethods() {
5
+ const withTags = await nexineAxios.get('/customer/delivery/method', {
6
+ params: {
7
+ isCompanySpecificVisible: true,
8
+ tags: ['WEB'],
9
+ },
10
+ });
11
+ const tagged = withTags.data?.data ?? [];
12
+ if (tagged.length > 0) {
13
+ return { ...withTags.data, data: getCheckoutDeliveryMethods(tagged) };
14
+ }
15
+ const fallback = await nexineAxios.get('/customer/delivery/method', {
16
+ params: {
17
+ isCompanySpecificVisible: true,
18
+ },
19
+ });
20
+ const methods = fallback.data?.data ?? [];
21
+ return { ...fallback.data, data: getCheckoutDeliveryMethods(methods) };
22
+ }
23
+ export const useDeliveryMethod = () => {
24
+ return {
25
+ fetch: (opts) => {
26
+ return useQuery({
27
+ queryKey: ['delivery-method', 'web'],
28
+ queryFn: fetchDeliveryMethods,
29
+ enabled: opts?.enabled !== false,
30
+ });
31
+ },
32
+ };
33
+ };
@@ -0,0 +1,5 @@
1
+ import { DeliveryMethod } from '@/core/interface/prisma.interface';
2
+ export declare function isCashDeskDeliveryMethod(method: Pick<DeliveryMethod, 'name'>): boolean;
3
+ /** Web checkout'ta gösterilecek kargo yöntemleri (kasadan satış hariç). */
4
+ export declare function getCheckoutDeliveryMethods(methods: DeliveryMethod[]): DeliveryMethod[];
5
+ //# sourceMappingURL=checkout.delivery.method.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout.delivery.method.d.ts","sourceRoot":"","sources":["../../../../../core/feature/delivery-method/util/checkout.delivery.method.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,OAAO,CAGtF;AAED,2EAA2E;AAC3E,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAEtF"}
@@ -0,0 +1,8 @@
1
+ export function isCashDeskDeliveryMethod(method) {
2
+ const name = method.name.toLowerCase();
3
+ return name.includes('kasadan') || name.includes('cash desk');
4
+ }
5
+ /** Web checkout'ta gösterilecek kargo yöntemleri (kasadan satış hariç). */
6
+ export function getCheckoutDeliveryMethods(methods) {
7
+ return methods.filter((m) => !isCashDeskDeliveryMethod(m));
8
+ }
@@ -0,0 +1,9 @@
1
+ import { IData } from "@/core/interface/nexine.interface";
2
+ import { Faq } from "@/core/interface/prisma.interface";
3
+ export declare const useFaq: () => {
4
+ fetch: (params: {
5
+ page: number;
6
+ amount: number;
7
+ }) => import("@tanstack/react-query").UseQueryResult<NoInfer<IData<Faq>>, Error>;
8
+ };
9
+ //# sourceMappingURL=use.faq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.faq.d.ts","sourceRoot":"","sources":["../../../../../core/feature/faq/hook/use.faq.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC1D,OAAO,EAAmB,GAAG,EAAE,MAAM,mCAAmC,CAAC;AAGzE,eAAO,MAAM,MAAM;oBAEC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAenD,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { nexineAxios } from "@/core/util/nexine.axios";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ export const useFaq = () => {
4
+ return {
5
+ fetch: (params) => {
6
+ return useQuery({
7
+ queryKey: ["faq"],
8
+ queryFn: async () => {
9
+ var response = await nexineAxios.get("/customer/faq", {
10
+ params: {
11
+ page: params.page,
12
+ amount: params.amount
13
+ }
14
+ });
15
+ return response.data;
16
+ },
17
+ });
18
+ },
19
+ };
20
+ };
@@ -0,0 +1,17 @@
1
+ import { IData } from "@/core/interface/nexine.interface";
2
+ import { Favorite } from "@/core/interface/prisma.interface";
3
+ import { UseQueryOptions } from "@tanstack/react-query";
4
+ export interface FavoriteListResponse extends IData<Favorite> {
5
+ info?: {
6
+ count?: {
7
+ Artikel?: number;
8
+ };
9
+ };
10
+ }
11
+ export declare const useFavorite: () => {
12
+ list: (params?: Record<string, unknown>, options?: Omit<UseQueryOptions<FavoriteListResponse>, "queryKey" | "queryFn">) => import("@tanstack/react-query").UseQueryResult<NoInfer<FavoriteListResponse>, Error>;
13
+ toggle: () => import("@tanstack/react-query").UseMutationResult<any, Error, {
14
+ productId: string;
15
+ }, unknown>;
16
+ };
17
+ //# sourceMappingURL=use.favorite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.favorite.d.ts","sourceRoot":"","sources":["../../../../../core/feature/favorite/hook/use.favorite.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,OAAO,EAAyC,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG/F,MAAM,WAAW,oBAAqB,SAAQ,KAAK,CAAC,QAAQ,CAAC;IACzD,IAAI,CAAC,EAAE;QACH,KAAK,CAAC,EAAE;YACJ,OAAO,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACL,CAAC;CACL;AAED,eAAO,MAAM,WAAW;oBAKA,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;;mBAYxE,MAAM;;CAgB3D,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { nexineAxios } from "@/core/util/nexine.axios";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import toast from "react-hot-toast";
4
+ export const useFavorite = () => {
5
+ const queryClient = useQueryClient();
6
+ return {
7
+ list: (params, options) => {
8
+ return useQuery({
9
+ queryKey: ['favorite', 'list', params],
10
+ queryFn: async () => {
11
+ const response = await nexineAxios.get('/customer/favorite', { params });
12
+ return response.data;
13
+ },
14
+ ...options
15
+ });
16
+ },
17
+ toggle: () => {
18
+ return useMutation({
19
+ mutationFn: async (data) => {
20
+ const response = await nexineAxios.post('/customer/favorite', data);
21
+ return response.data;
22
+ },
23
+ onSuccess: (data, variables) => {
24
+ queryClient.invalidateQueries({ queryKey: ['product'] });
25
+ queryClient.invalidateQueries({ queryKey: ['campaign'] });
26
+ queryClient.invalidateQueries({ queryKey: ['favorite'] });
27
+ toast.success('Favori durumu güncellendi');
28
+ },
29
+ onError: () => {
30
+ toast.error('Favori işlemi başarısız oldu');
31
+ }
32
+ });
33
+ },
34
+ };
35
+ };
@@ -0,0 +1,6 @@
1
+ export declare const FormContact: ({ form, onSubmit, isPending }: {
2
+ form: any;
3
+ onSubmit: any;
4
+ isPending: boolean;
5
+ }) => import("react").JSX.Element;
6
+ //# sourceMappingURL=form.contact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.contact.d.ts","sourceRoot":"","sources":["../../../../../core/feature/form-submit/form/form.contact.tsx"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW,GAAI,+BAA+B;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,gCA6G1G,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Send } from 'lucide-react';
3
+ const labelClass = 'mb-2 block text-[11px] font-bold uppercase tracking-[0.18em] text-gray-500';
4
+ const fieldOk = 'w-full rounded-xl border border-gray-200 bg-white px-4 py-3 text-gray-900 transition-all focus:border-black focus:outline-none focus:ring-2 focus:ring-black/10';
5
+ const fieldErr = 'w-full rounded-xl border border-red-500 bg-white px-4 py-3 text-gray-900 focus:border-red-500 focus:outline-none focus:ring-2 focus:ring-red-500/20';
6
+ export const FormContact = ({ form, onSubmit, isPending }) => {
7
+ return (_jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-6", children: [_jsxs("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "firstName", className: labelClass, children: "Ad *" }), _jsx("input", { type: "text", id: "firstName", ...form.register('firstName'), className: form.formState.errors.firstName ? fieldErr : fieldOk, placeholder: "Ad\u0131n\u0131z" }), form.formState.errors.firstName && _jsx("p", { className: "mt-1 text-sm text-red-600", children: form.formState.errors.firstName.message })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "lastName", className: labelClass, children: "Soyad *" }), _jsx("input", { type: "text", id: "lastName", ...form.register('lastName'), className: form.formState.errors.lastName ? fieldErr : fieldOk, placeholder: "Soyad\u0131n\u0131z" }), form.formState.errors.lastName && _jsx("p", { className: "mt-1 text-sm text-red-600", children: form.formState.errors.lastName.message })] }), _jsxs("div", { className: "md:col-span-2", children: [_jsx("label", { htmlFor: "email", className: labelClass, children: "E-posta *" }), _jsx("input", { type: "email", id: "email", ...form.register('email'), className: form.formState.errors.email ? fieldErr : fieldOk, placeholder: "ornek@email.com" }), form.formState.errors.email && _jsx("p", { className: "mt-1 text-sm text-red-600", children: form.formState.errors.email.message })] })] }), _jsxs("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-2", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "phoneNumber", className: labelClass, children: "Telefon" }), _jsx("input", { type: "tel", id: "phoneNumber", ...form.register('phoneNumber'), className: form.formState.errors.phoneNumber ? fieldErr : fieldOk, placeholder: "Telefon numaran\u0131z" }), form.formState.errors.phoneNumber && _jsx("p", { className: "mt-1 text-sm text-red-600", children: form.formState.errors.phoneNumber.message })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "subject", className: labelClass, children: "Konu *" }), _jsxs("select", { id: "subject", ...form.register('subject'), className: form.formState.errors.subject ? fieldErr : fieldOk, children: [_jsx("option", { value: "", children: "Konu se\u00E7in" }), _jsx("option", { value: "genel", children: "Genel bilgi" }), _jsx("option", { value: "siparis", children: "Sipari\u015F" }), _jsx("option", { value: "iade", children: "\u0130ade / de\u011Fi\u015Fim" }), _jsx("option", { value: "urun", children: "\u00DCr\u00FCn bilgisi" }), _jsx("option", { value: "oneri", children: "\u00D6neri / \u015Fikayet" }), _jsx("option", { value: "diger", children: "Di\u011Fer" })] }), form.formState.errors.subject && _jsx("p", { className: "mt-1 text-sm text-red-600", children: form.formState.errors.subject.message })] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "message", className: labelClass, children: "Mesaj\u0131n\u0131z *" }), _jsx("textarea", { id: "message", rows: 6, ...form.register('message'), className: `resize-none ${form.formState.errors.message ? fieldErr : fieldOk}`, placeholder: "Mesaj\u0131n\u0131z\u0131 buraya yaz\u0131n..." }), form.formState.errors.message && _jsx("p", { className: "mt-1 text-sm text-red-600", children: form.formState.errors.message.message })] }), _jsx("button", { type: "submit", disabled: isPending || form.formState.isSubmitting, className: "flex w-full items-center justify-center gap-2 rounded-xl border-2 border-black bg-black px-8 py-4 text-sm font-black uppercase tracking-widest text-white shadow-sm transition hover:bg-white hover:text-black focus:outline-none focus:ring-2 focus:ring-black/20 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", children: isPending || form.formState.isSubmitting ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-5 w-5 animate-spin rounded-full border-2 border-white border-t-transparent" }), _jsx("span", { children: "G\u00F6nderiliyor\u2026" })] })) : (_jsxs(_Fragment, { children: [_jsx(Send, { className: "h-5 w-5", strokeWidth: 1.5 }), _jsx("span", { children: "Mesaj g\u00F6nder" })] })) })] }));
8
+ };
@@ -0,0 +1,4 @@
1
+ export declare const useFormSubmit: () => {
2
+ create: () => import("@tanstack/react-query").UseMutationResult<import("axios").AxiosResponse<any, any, {}>, Error, any, unknown>;
3
+ };
4
+ //# sourceMappingURL=use.form.submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.form.submit.d.ts","sourceRoot":"","sources":["../../../../../core/feature/form-submit/hook/use.form.submit.tsx"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa;;CAUzB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { nexineAxios } from "@/core/util/nexine.axios";
2
+ import { useMutation } from "@tanstack/react-query";
3
+ export const useFormSubmit = () => {
4
+ return {
5
+ create: () => {
6
+ return useMutation({
7
+ mutationFn: async (data) => {
8
+ return await nexineAxios.post("/customer/form/submit", data);
9
+ },
10
+ });
11
+ },
12
+ };
13
+ };
@@ -0,0 +1,9 @@
1
+ import { IData } from "@/core/interface/nexine.interface";
2
+ import { Invoice } from "@/core/interface/prisma.interface";
3
+ export declare const useInvoice: () => {
4
+ fetch: () => import("@tanstack/react-query").UseQueryResult<NoInfer<IData<Invoice>>, Error>;
5
+ detail: (id: string) => import("@tanstack/react-query").UseQueryResult<NoInfer<Invoice>, Error>;
6
+ download: () => import("@tanstack/react-query").UseMutationResult<any, Error, string, unknown>;
7
+ downloadByOrder: () => import("@tanstack/react-query").UseMutationResult<any, Error, string, unknown>;
8
+ };
9
+ //# sourceMappingURL=use.invoice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.invoice.d.ts","sourceRoot":"","sources":["../../../../../core/feature/invoice/hook/use.invoice.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAG5D,eAAO,MAAM,UAAU;;iBAcF,MAAM;;;CA+B1B,CAAC"}