@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,57 @@
1
+ import { nexineAxios } from "@/core/util/nexine.axios";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ export const useAddress = () => {
4
+ const queryClient = useQueryClient();
5
+ return {
6
+ fetch: () => {
7
+ return useQuery({
8
+ queryKey: ['web', 'address'],
9
+ queryFn: async () => {
10
+ var response = await nexineAxios.get('/customer/address');
11
+ return response.data;
12
+ },
13
+ });
14
+ },
15
+ create: () => {
16
+ return useMutation({
17
+ mutationFn: async (data) => {
18
+ var respose = await nexineAxios.post('/customer/address', data);
19
+ return respose.data;
20
+ },
21
+ onSuccess: () => {
22
+ queryClient.invalidateQueries({ queryKey: ['web', 'address'] });
23
+ }
24
+ });
25
+ },
26
+ detail: (id) => {
27
+ return useQuery({
28
+ queryKey: ['web', 'address', 'detail', id],
29
+ enabled: !!id && id !== "" && id != "create",
30
+ queryFn: async () => {
31
+ var response = await nexineAxios.get(`/customer/address/${id}`);
32
+ return response.data;
33
+ },
34
+ });
35
+ },
36
+ update: () => {
37
+ return useMutation({
38
+ mutationFn: (data) => {
39
+ return nexineAxios.put('/customer/address', data);
40
+ },
41
+ onSuccess: () => {
42
+ queryClient.invalidateQueries({ queryKey: ['web', 'address'] });
43
+ }
44
+ });
45
+ },
46
+ delete: () => {
47
+ return useMutation({
48
+ mutationFn: (id) => {
49
+ return nexineAxios.delete(`/customer/address/${id}`);
50
+ },
51
+ onSuccess: () => {
52
+ queryClient.invalidateQueries({ queryKey: ['web', 'address'] });
53
+ }
54
+ });
55
+ }
56
+ };
57
+ };
@@ -0,0 +1,13 @@
1
+ import { GooglePlacePrediction } from '@/core/feature/address/util/address.types';
2
+ export declare function useAddressAutocomplete(): {
3
+ query: string;
4
+ setQuery: (value: string) => void;
5
+ onUserQueryChange: (value: string) => void;
6
+ results: GooglePlacePrediction[];
7
+ isSearching: boolean;
8
+ showResults: boolean;
9
+ setShowResults: import("react").Dispatch<import("react").SetStateAction<boolean>>;
10
+ selectPlace: (prediction: GooglePlacePrediction) => Promise<import("@/core/feature/address/util/address.types").ParsedAddressData>;
11
+ resetSearch: () => void;
12
+ };
13
+ //# sourceMappingURL=use.address-autocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.address-autocomplete.d.ts","sourceRoot":"","sources":["../../../../../core/feature/address/hook/use.address-autocomplete.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAMlF,wBAAgB,sBAAsB;;sBAmG1B,MAAM;+BAKN,MAAM;;;;;8BA5BK,qBAAqB;;EA2C3C"}
@@ -0,0 +1,105 @@
1
+ import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { parseGooglePlaceResult } from '@/core/feature/address/util/parse-google-place';
3
+ const DEBOUNCE_MS = 400;
4
+ const MIN_QUERY_LENGTH = 3;
5
+ export function useAddressAutocomplete() {
6
+ const [query, setQuery] = useState('');
7
+ const [results, setResults] = useState([]);
8
+ const [isSearching, setIsSearching] = useState(false);
9
+ const [isSelecting, setIsSelecting] = useState(false);
10
+ const [showResults, setShowResults] = useState(false);
11
+ const abortRef = useRef(null);
12
+ const searchOnChangeRef = useRef(false);
13
+ const searchAddresses = useCallback(async (input) => {
14
+ if (!input || input.length < MIN_QUERY_LENGTH) {
15
+ setResults([]);
16
+ setShowResults(false);
17
+ return;
18
+ }
19
+ abortRef.current?.abort();
20
+ const controller = new AbortController();
21
+ abortRef.current = controller;
22
+ setIsSearching(true);
23
+ try {
24
+ const params = new URLSearchParams({
25
+ input,
26
+ components: 'country:tr',
27
+ language: 'tr',
28
+ });
29
+ const response = await fetch(`/api/places/autocomplete?${params}`, {
30
+ signal: controller.signal,
31
+ });
32
+ if (!response.ok)
33
+ throw new Error('Autocomplete request failed');
34
+ const data = await response.json();
35
+ setResults(data.predictions || []);
36
+ setShowResults(true);
37
+ }
38
+ catch (error) {
39
+ if (error.name !== 'AbortError') {
40
+ setResults([]);
41
+ }
42
+ }
43
+ finally {
44
+ setIsSearching(false);
45
+ }
46
+ }, []);
47
+ const setQueryValue = useCallback((value, options) => {
48
+ const shouldSearch = options?.search ?? false;
49
+ searchOnChangeRef.current = shouldSearch;
50
+ setQuery(prev => {
51
+ if (prev === value) {
52
+ if (!shouldSearch)
53
+ searchOnChangeRef.current = false;
54
+ return prev;
55
+ }
56
+ return value;
57
+ });
58
+ if (!shouldSearch) {
59
+ abortRef.current?.abort();
60
+ setResults([]);
61
+ setShowResults(false);
62
+ }
63
+ }, []);
64
+ useEffect(() => {
65
+ if (!searchOnChangeRef.current)
66
+ return;
67
+ const timer = setTimeout(() => {
68
+ searchAddresses(query);
69
+ searchOnChangeRef.current = false;
70
+ }, DEBOUNCE_MS);
71
+ return () => clearTimeout(timer);
72
+ }, [query, searchAddresses]);
73
+ const selectPlace = useCallback(async (prediction) => {
74
+ setIsSelecting(true);
75
+ setShowResults(false);
76
+ try {
77
+ const response = await fetch(`/api/places/details?place_id=${prediction.place_id}&language=tr`);
78
+ if (!response.ok)
79
+ throw new Error('Place details request failed');
80
+ const data = await response.json();
81
+ const parsed = parseGooglePlaceResult(data.result);
82
+ setQueryValue(parsed.formattedAddress, { search: false });
83
+ return parsed;
84
+ }
85
+ finally {
86
+ setIsSelecting(false);
87
+ }
88
+ }, [setQueryValue]);
89
+ const resetSearch = useCallback(() => {
90
+ setQueryValue('', { search: false });
91
+ }, [setQueryValue]);
92
+ const setQueryProgrammatic = useCallback((value) => setQueryValue(value, { search: false }), [setQueryValue]);
93
+ const onUserQueryChange = useCallback((value) => setQueryValue(value, { search: true }), [setQueryValue]);
94
+ return {
95
+ query,
96
+ setQuery: setQueryProgrammatic,
97
+ onUserQueryChange,
98
+ results,
99
+ isSearching: isSearching || isSelecting,
100
+ showResults,
101
+ setShowResults,
102
+ selectPlace,
103
+ resetSearch,
104
+ };
105
+ }
@@ -0,0 +1,37 @@
1
+ export interface GooglePlacePrediction {
2
+ description: string;
3
+ place_id: string;
4
+ structured_formatting: {
5
+ main_text: string;
6
+ secondary_text: string;
7
+ };
8
+ }
9
+ export interface GooglePlaceDetails {
10
+ geometry: {
11
+ location: {
12
+ lat: number;
13
+ lng: number;
14
+ };
15
+ };
16
+ address_components: Array<{
17
+ long_name: string;
18
+ short_name: string;
19
+ types: string[];
20
+ }>;
21
+ formatted_address: string;
22
+ }
23
+ export interface ParsedAddressData {
24
+ streetNumber: string;
25
+ streetName: string;
26
+ neighborhood: string;
27
+ district: string;
28
+ city: string;
29
+ province: string;
30
+ country: string;
31
+ countryCode: string;
32
+ postalCode: string;
33
+ latitude: number;
34
+ longitude: number;
35
+ formattedAddress: string;
36
+ }
37
+ //# sourceMappingURL=address.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.types.d.ts","sourceRoot":"","sources":["../../../../../core/feature/address/util/address.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,GAAG,EAAE,MAAM,CAAC;YACZ,GAAG,EAAE,MAAM,CAAC;SACb,CAAC;KACH,CAAC;IACF,kBAAkB,EAAE,KAAK,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { Address } from '@/core/interface/prisma.interface';
2
+ import { GooglePlaceDetails, ParsedAddressData } from '@/core/feature/address/util/address.types';
3
+ export declare function parseGooglePlaceResult(placeDetails: GooglePlaceDetails): ParsedAddressData;
4
+ export declare function formatAddressSummary(data: Partial<Address> | ParsedAddressData): string;
5
+ export declare function parsedAddressToFormFields(parsed: ParsedAddressData): {
6
+ street: string;
7
+ buildingNumber: string;
8
+ apartmentNumber: string;
9
+ postalCode: string;
10
+ provinceName: string;
11
+ districtName: string;
12
+ };
13
+ //# sourceMappingURL=parse-google-place.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-google-place.d.ts","sourceRoot":"","sources":["../../../../../core/feature/address/util/parse-google-place.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAWlG,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,kBAAkB,GAAG,iBAAiB,CAyB1F;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,iBAAiB,GAAG,MAAM,CAYvF;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,iBAAiB;;;;;;;EAYlE"}
@@ -0,0 +1,49 @@
1
+ function getAddressComponent(components, types, useShort = false) {
2
+ const component = components.find(comp => types.some(type => comp.types.includes(type)));
3
+ return useShort ? component?.short_name || '' : component?.long_name || '';
4
+ }
5
+ export function parseGooglePlaceResult(placeDetails) {
6
+ const components = placeDetails.address_components;
7
+ const district = getAddressComponent(components, ['administrative_area_level_2']) ||
8
+ getAddressComponent(components, ['sublocality_level_1', 'sublocality']);
9
+ const city = getAddressComponent(components, ['administrative_area_level_1']) ||
10
+ getAddressComponent(components, ['locality', 'postal_town']);
11
+ return {
12
+ streetNumber: getAddressComponent(components, ['street_number']),
13
+ streetName: getAddressComponent(components, ['route']),
14
+ neighborhood: getAddressComponent(components, ['neighborhood', 'sublocality_level_1', 'sublocality']),
15
+ district,
16
+ city,
17
+ province: getAddressComponent(components, ['administrative_area_level_1']),
18
+ country: getAddressComponent(components, ['country']),
19
+ countryCode: getAddressComponent(components, ['country'], true),
20
+ postalCode: getAddressComponent(components, ['postal_code']),
21
+ latitude: placeDetails.geometry.location.lat,
22
+ longitude: placeDetails.geometry.location.lng,
23
+ formattedAddress: placeDetails.formatted_address,
24
+ };
25
+ }
26
+ export function formatAddressSummary(data) {
27
+ const street = [data.streetName, 'streetNumber' in data ? data.streetNumber : undefined].filter(Boolean).join(' ');
28
+ const cityLine = [
29
+ data.postalCode,
30
+ 'city' in data ? data.city || data.province : data.administrativeAreaLevel1,
31
+ 'district' in data ? data.district : data.administrativeAreaLevel2,
32
+ ]
33
+ .filter(Boolean)
34
+ .join(' ');
35
+ const country = data.country;
36
+ return [street, cityLine, country].filter(Boolean).join(', ');
37
+ }
38
+ export function parsedAddressToFormFields(parsed) {
39
+ const streetParts = [parsed.neighborhood, parsed.streetName].filter(Boolean);
40
+ const street = streetParts.join(', ');
41
+ return {
42
+ street: street || parsed.formattedAddress,
43
+ buildingNumber: parsed.streetNumber,
44
+ apartmentNumber: '',
45
+ postalCode: parsed.postalCode,
46
+ provinceName: parsed.province || parsed.city,
47
+ districtName: parsed.district,
48
+ };
49
+ }
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ interface AnalyticEvent {
3
+ productId: string;
4
+ variantId?: string | null;
5
+ }
6
+ interface EmailClickedEvent {
7
+ tcx: string;
8
+ }
9
+ interface AnalyticEventContextType {
10
+ trackProductView: (event: AnalyticEvent) => void;
11
+ trackProductClick: (event: AnalyticEvent) => void;
12
+ trackEmailClicked: (event: EmailClickedEvent) => void;
13
+ }
14
+ export declare const AnalyticEventProvider: ({ children }: {
15
+ children: React.ReactNode;
16
+ }) => React.JSX.Element;
17
+ export declare const useAnalyticEvent: () => AnalyticEventContextType;
18
+ export {};
19
+ //# sourceMappingURL=analytic.event.context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytic.event.context.d.ts","sourceRoot":"","sources":["../../../../core/feature/analytic-event/analytic.event.context.tsx"],"names":[],"mappings":"AACA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAI5E,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,wBAAwB;IAChC,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD,iBAAiB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACvD;AAID,eAAO,MAAM,qBAAqB,GAAI,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,sBAqJhF,CAAC;AAEF,eAAO,MAAM,gBAAgB,gCAM5B,CAAC"}
@@ -0,0 +1,151 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useEffect, useRef } from 'react';
4
+ import { useSearchParams, useRouter } from 'next/navigation';
5
+ import { AnalyticEventType } from '../../interface/prisma.interface';
6
+ const AnalyticEventContext = createContext(undefined);
7
+ export const AnalyticEventProvider = ({ children }) => {
8
+ const bufferRef = useRef([]);
9
+ const timeoutRef = useRef(null);
10
+ const searchParams = useSearchParams();
11
+ const router = useRouter();
12
+ const tcxProcessedRef = useRef(false);
13
+ const flush = async () => {
14
+ const events = [...bufferRef.current];
15
+ if (events.length === 0)
16
+ return;
17
+ // Send copy, clear original buffer immediately to avoid race conditions if possible
18
+ // (though in JS single thread it's mostly fine, but async operations...)
19
+ bufferRef.current = [];
20
+ try {
21
+ await fetch('/api/analytic-event', {
22
+ method: 'POST',
23
+ headers: {
24
+ 'Content-Type': 'application/json',
25
+ },
26
+ body: JSON.stringify(events),
27
+ keepalive: true,
28
+ });
29
+ }
30
+ catch (e) {
31
+ console.error('Failed to send product events', e);
32
+ }
33
+ };
34
+ const sendEmailClickedEvent = async (tcx) => {
35
+ try {
36
+ await fetch('/api/analytic-event', {
37
+ method: 'POST',
38
+ headers: {
39
+ 'Content-Type': 'application/json',
40
+ },
41
+ body: JSON.stringify([
42
+ {
43
+ trackingCode: tcx,
44
+ eventType: AnalyticEventType.EMAIL_CLICKED,
45
+ },
46
+ ]),
47
+ keepalive: true,
48
+ });
49
+ // İşlem tamamlandıktan sonra URL'den tcx parametresini kaldır
50
+ removeTcxFromUrl();
51
+ }
52
+ catch (e) {
53
+ console.error('Failed to send email clicked event', e);
54
+ }
55
+ };
56
+ const removeTcxFromUrl = () => {
57
+ const currentUrl = new URL(window.location.href);
58
+ if (currentUrl.searchParams.has('tcx')) {
59
+ currentUrl.searchParams.delete('tcx');
60
+ router.replace(currentUrl.pathname + currentUrl.search, { scroll: false });
61
+ }
62
+ };
63
+ const trackProductView = (event) => {
64
+ if (!event.productId)
65
+ return;
66
+ // Avoid duplicates in the current pending batch
67
+ const exists = bufferRef.current.some(e => e.productId === event.productId && e.variantId === event.variantId);
68
+ if (!exists) {
69
+ bufferRef.current.push(event);
70
+ }
71
+ if (!timeoutRef.current) {
72
+ timeoutRef.current = setTimeout(() => {
73
+ flush();
74
+ timeoutRef.current = null;
75
+ }, 2000);
76
+ }
77
+ };
78
+ const trackProductClick = (event) => {
79
+ if (!event.productId)
80
+ return;
81
+ fetch('/api/analytic-event', {
82
+ method: 'POST',
83
+ headers: {
84
+ 'Content-Type': 'application/json',
85
+ },
86
+ body: JSON.stringify([
87
+ {
88
+ productId: event.productId,
89
+ variantId: event.variantId,
90
+ eventType: AnalyticEventType.CLICKED,
91
+ },
92
+ ]),
93
+ keepalive: true,
94
+ }).catch((e) => {
95
+ console.error('Failed to send product click event', e);
96
+ });
97
+ };
98
+ const trackEmailClicked = (event) => {
99
+ if (!event.tcx)
100
+ return;
101
+ sendEmailClickedEvent(event.tcx);
102
+ };
103
+ // İlk sayfa yüklendiğinde tcx parametresini kontrol et
104
+ useEffect(() => {
105
+ if (tcxProcessedRef.current)
106
+ return;
107
+ const tcx = searchParams.get('tcx');
108
+ if (tcx) {
109
+ tcxProcessedRef.current = true;
110
+ trackEmailClicked({ tcx });
111
+ }
112
+ }, [searchParams]);
113
+ useEffect(() => {
114
+ const handleUnload = () => {
115
+ if (timeoutRef.current) {
116
+ clearTimeout(timeoutRef.current);
117
+ timeoutRef.current = null;
118
+ }
119
+ flush();
120
+ };
121
+ const handleVisibilityChange = () => {
122
+ if (document.visibilityState === 'hidden') {
123
+ // If user switches tab, maybe flush?
124
+ // User asked for "session end" or "2s".
125
+ // Visibility hidden is good practice to ensure data is saved.
126
+ // But if they come back, we just start a new batch.
127
+ // Let's keep the timeout if it's running, but flush if tab is closing/hiding?
128
+ // Actually, if we flush on hidden, we might send partial batches more often than 2s if user switches tabs a lot.
129
+ // But better safe than sorry for analytics.
130
+ handleUnload();
131
+ }
132
+ };
133
+ window.addEventListener('beforeunload', handleUnload);
134
+ document.addEventListener('visibilitychange', handleVisibilityChange);
135
+ return () => {
136
+ window.removeEventListener('beforeunload', handleUnload);
137
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
138
+ if (timeoutRef.current) {
139
+ clearTimeout(timeoutRef.current);
140
+ }
141
+ };
142
+ }, []);
143
+ return _jsx(AnalyticEventContext.Provider, { value: { trackProductView, trackProductClick, trackEmailClicked }, children: children });
144
+ };
145
+ export const useAnalyticEvent = () => {
146
+ const context = useContext(AnalyticEventContext);
147
+ if (!context) {
148
+ throw new Error('useAnalyticEvent must be used within a AnalyticEventProvider');
149
+ }
150
+ return context;
151
+ };
@@ -0,0 +1,7 @@
1
+ import { IData } from "@/core/interface/nexine.interface";
2
+ import { Article } from "@/core/interface/prisma.interface";
3
+ export declare const useArticle: () => {
4
+ fetch: (params?: any) => import("@tanstack/react-query").UseQueryResult<NoInfer<IData<Article>>, Error>;
5
+ detail: (id: string) => import("@tanstack/react-query").UseQueryResult<NoInfer<Article>, Error>;
6
+ };
7
+ //# sourceMappingURL=use.article.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.article.d.ts","sourceRoot":"","sources":["../../../../../core/feature/article/hook/use.article.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAC;AAG5D,eAAO,MAAM,UAAU;qBAKG,GAAG;iBAWR,MAAM;CAW1B,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { nexineAxios } from "@/core/util/nexine.axios";
2
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
3
+ export const useArticle = () => {
4
+ const queryClient = useQueryClient();
5
+ return {
6
+ fetch: (params) => {
7
+ return useQuery({
8
+ queryKey: ['web', 'article', params],
9
+ queryFn: async () => {
10
+ var response = await nexineAxios.get('/customer/article', {
11
+ params
12
+ });
13
+ return response.data;
14
+ },
15
+ });
16
+ },
17
+ detail: (id) => {
18
+ return useQuery({
19
+ queryKey: ['web', 'article', id],
20
+ queryFn: async () => {
21
+ var response = await nexineAxios.get('/customer/article/' + id);
22
+ return response.data;
23
+ },
24
+ enabled: Boolean(id),
25
+ });
26
+ }
27
+ };
28
+ };
@@ -0,0 +1,10 @@
1
+ import { IData } from '@/core/interface/nexine.interface';
2
+ import { Attribute } from '@/core/interface/prisma.interface';
3
+ export declare const useAttribute: () => {
4
+ fetch: (params: {
5
+ categoryId?: string;
6
+ enabled?: boolean;
7
+ productId?: string;
8
+ }) => import("@tanstack/react-query").UseQueryResult<NoInfer<IData<Attribute>>, Error>;
9
+ };
10
+ //# sourceMappingURL=use.attribute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.attribute.d.ts","sourceRoot":"","sources":["../../../../../core/feature/attribute/hook/use.attribute.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAwB,MAAM,mCAAmC,CAAC;AAGpF,eAAO,MAAM,YAAY;oBAEL;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;CAgBjF,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { nexineAxios } from '@/core/util/nexine.axios';
2
+ import { useQuery } from '@tanstack/react-query';
3
+ export const useAttribute = () => {
4
+ return {
5
+ fetch: (params) => {
6
+ return useQuery({
7
+ queryKey: ['attribute', 'category', params.categoryId, params.productId],
8
+ enabled: (params.enabled ?? true),
9
+ queryFn: async () => {
10
+ var response = await nexineAxios.get('/customer/attribute', {
11
+ params: {
12
+ categoryId: params.categoryId,
13
+ productId: params.productId,
14
+ },
15
+ });
16
+ return response.data;
17
+ },
18
+ });
19
+ },
20
+ };
21
+ };
@@ -0,0 +1,29 @@
1
+ export declare const LOGOUT_EVENT = "intermarkt-logout";
2
+ export declare const LOGIN_SUCCESS_EVENT = "intermarkt-login-success";
3
+ export declare const useAuth: () => {
4
+ profile: ({ isEnabled }: {
5
+ isEnabled?: boolean;
6
+ }) => import("@tanstack/react-query").UseQueryResult<any, Error>;
7
+ token: () => import("@tanstack/react-query").UseMutationResult<any, Error, void, unknown>;
8
+ loginEmail: () => import("@tanstack/react-query").UseMutationResult<any, Error, any, unknown>;
9
+ loginGuest: () => import("@tanstack/react-query").UseMutationResult<any, Error, void, unknown>;
10
+ loginSocial: () => import("@tanstack/react-query").UseMutationResult<any, Error, {
11
+ platform: string;
12
+ returnUrl?: string;
13
+ }, unknown>;
14
+ register: () => import("@tanstack/react-query").UseMutationResult<import("axios").AxiosResponse<any, any, {}>, Error, any, unknown>;
15
+ codeSend: () => import("@tanstack/react-query").UseMutationResult<import("axios").AxiosResponse<any, any, {}>, Error, {
16
+ email: string;
17
+ }, unknown>;
18
+ verifyCode: () => import("@tanstack/react-query").UseMutationResult<import("axios").AxiosResponse<any, any, {}>, Error, {
19
+ email: string;
20
+ code: string;
21
+ }, unknown>;
22
+ resetPassword: () => import("@tanstack/react-query").UseMutationResult<import("axios").AxiosResponse<any, any, {}>, Error, {
23
+ email: string;
24
+ code: string;
25
+ password: string;
26
+ }, unknown>;
27
+ logout: () => void;
28
+ };
29
+ //# sourceMappingURL=use.auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use.auth.d.ts","sourceRoot":"","sources":["../../../../../core/feature/auth/hook/use.auth.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAChD,eAAO,MAAM,mBAAmB,6BAA6B,CAAC;AAE9D,eAAO,MAAM,OAAO;;;;;;;;kBAoEiC,MAAM;oBAAc,MAAM;;;;eAmBnC,MAAM;;;eAWN,MAAM;cAAQ,MAAM;;;eAYpB,MAAM;cAAQ,MAAM;kBAAY,MAAM;;;CAqBjF,CAAC"}