medusa-storefront-data 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 (105) hide show
  1. package/dist/config.d.ts +3 -0
  2. package/dist/config.d.ts.map +1 -0
  3. package/dist/config.js +31 -0
  4. package/dist/cookies.d.ts +23 -0
  5. package/dist/cookies.d.ts.map +1 -0
  6. package/dist/cookies.js +140 -0
  7. package/dist/server/cart.d.ts +92 -0
  8. package/dist/server/cart.d.ts.map +1 -0
  9. package/dist/server/cart.js +827 -0
  10. package/dist/server/categories.d.ts +3 -0
  11. package/dist/server/categories.d.ts.map +1 -0
  12. package/dist/server/categories.js +71 -0
  13. package/dist/server/collections.d.ts +8 -0
  14. package/dist/server/collections.d.ts.map +1 -0
  15. package/dist/server/collections.js +84 -0
  16. package/dist/server/customer-registration.d.ts +142 -0
  17. package/dist/server/customer-registration.d.ts.map +1 -0
  18. package/dist/server/customer-registration.js +295 -0
  19. package/dist/server/customer.d.ts +48 -0
  20. package/dist/server/customer.d.ts.map +1 -0
  21. package/dist/server/customer.js +462 -0
  22. package/dist/server/dynamic-config.d.ts +125 -0
  23. package/dist/server/dynamic-config.d.ts.map +1 -0
  24. package/dist/server/dynamic-config.js +263 -0
  25. package/dist/server/fulfillment.d.ts +4 -0
  26. package/dist/server/fulfillment.d.ts.map +1 -0
  27. package/dist/server/fulfillment.js +72 -0
  28. package/dist/server/guest.d.ts +109 -0
  29. package/dist/server/guest.d.ts.map +1 -0
  30. package/dist/server/guest.js +304 -0
  31. package/dist/server/index.d.ts +21 -0
  32. package/dist/server/index.d.ts.map +1 -0
  33. package/dist/server/index.js +20 -0
  34. package/dist/server/locale-actions.d.ts +14 -0
  35. package/dist/server/locale-actions.d.ts.map +1 -0
  36. package/dist/server/locale-actions.js +63 -0
  37. package/dist/server/locales.d.ts +10 -0
  38. package/dist/server/locales.d.ts.map +1 -0
  39. package/dist/server/locales.js +20 -0
  40. package/dist/server/notifications.d.ts +2 -0
  41. package/dist/server/notifications.d.ts.map +1 -0
  42. package/dist/server/notifications.js +20 -0
  43. package/dist/server/onboarding.d.ts +2 -0
  44. package/dist/server/onboarding.d.ts.map +1 -0
  45. package/dist/server/onboarding.js +8 -0
  46. package/dist/server/orders.d.ts +69 -0
  47. package/dist/server/orders.d.ts.map +1 -0
  48. package/dist/server/orders.js +371 -0
  49. package/dist/server/payment-details.d.ts +5 -0
  50. package/dist/server/payment-details.d.ts.map +1 -0
  51. package/dist/server/payment-details.js +53 -0
  52. package/dist/server/payment.d.ts +2 -0
  53. package/dist/server/payment.d.ts.map +1 -0
  54. package/dist/server/payment.js +25 -0
  55. package/dist/server/products.d.ts +58 -0
  56. package/dist/server/products.d.ts.map +1 -0
  57. package/dist/server/products.js +285 -0
  58. package/dist/server/regions.d.ts +5 -0
  59. package/dist/server/regions.d.ts.map +1 -0
  60. package/dist/server/regions.js +54 -0
  61. package/dist/server/returns.d.ts +29 -0
  62. package/dist/server/returns.d.ts.map +1 -0
  63. package/dist/server/returns.js +236 -0
  64. package/dist/server/swaps.d.ts +14 -0
  65. package/dist/server/swaps.d.ts.map +1 -0
  66. package/dist/server/swaps.js +123 -0
  67. package/dist/server/variants.d.ts +3 -0
  68. package/dist/server/variants.d.ts.map +1 -0
  69. package/dist/server/variants.js +26 -0
  70. package/dist/util/get-locale-header.d.ts +4 -0
  71. package/dist/util/get-locale-header.d.ts.map +1 -0
  72. package/dist/util/get-locale-header.js +7 -0
  73. package/dist/util/medusa-error.d.ts +2 -0
  74. package/dist/util/medusa-error.d.ts.map +1 -0
  75. package/dist/util/medusa-error.js +18 -0
  76. package/package.json +152 -0
  77. package/src/config.ts +39 -0
  78. package/src/cookies.ts +171 -0
  79. package/src/middleware.ts +2 -0
  80. package/src/server/cart.ts +1054 -0
  81. package/src/server/categories.ts +94 -0
  82. package/src/server/collections.ts +113 -0
  83. package/src/server/customer-registration.ts +349 -0
  84. package/src/server/customer.ts +581 -0
  85. package/src/server/dynamic-config.ts +403 -0
  86. package/src/server/fulfillment.ts +97 -0
  87. package/src/server/guest.ts +333 -0
  88. package/src/server/index.ts +21 -0
  89. package/src/server/locale-actions.ts +74 -0
  90. package/src/server/locales.ts +28 -0
  91. package/src/server/notifications.ts +22 -0
  92. package/src/server/onboarding.ts +9 -0
  93. package/src/server/orders.ts +467 -0
  94. package/src/server/payment-details.ts +69 -0
  95. package/src/server/payment.ts +35 -0
  96. package/src/server/products.ts +378 -0
  97. package/src/server/regions.ts +66 -0
  98. package/src/server/returns.ts +294 -0
  99. package/src/server/swaps.ts +150 -0
  100. package/src/server/variants.ts +38 -0
  101. package/src/server/wishlist.ts +64 -0
  102. package/src/services/middleware.ts +54 -0
  103. package/src/util/get-locale-header.ts +8 -0
  104. package/src/util/medusa-error.ts +19 -0
  105. package/src/util/sort-products.ts +47 -0
@@ -0,0 +1,403 @@
1
+ "use server"
2
+
3
+ import { cache } from "react"
4
+ import { getAuthHeaders } from "../cookies"
5
+
6
+ // Define the structure based on the actual API response and client usage
7
+ export interface DynamicConfig {
8
+ "homepage-config"?: {
9
+ logo?: string
10
+ "homepage-banner-array"?: Array<{
11
+ "homepage-banner"?: {
12
+ "homepage-banner-image"?: string
13
+ "homepage-banner-title"?: string
14
+ "homepage-banner-subtitle"?: string
15
+ "homepage-banner-description"?: string
16
+ "homepage-banner-button-name"?: string
17
+ "homepage-banner-button-link"?: string
18
+ }
19
+ }>
20
+ "app-banner-array"?: Array<{
21
+ "app-banner"?: {
22
+ "app-banner-image"?: string
23
+ "app-banner-title"?: string
24
+ "app-banner-subtitle"?: string
25
+ "app-banner-description"?: string
26
+ "app-banner-button-name"?: string
27
+ "app-banner-button-link"?: string
28
+ "app-banner-link"?: string
29
+ }
30
+ }>
31
+ "website-description"?: string
32
+ "website_description"?: string
33
+ "why-choose-us-title"?: string
34
+ "why-choose-us-features"?: Array<{
35
+ feature?: {
36
+ "feature-name"?: string
37
+ "feature-icon"?: string
38
+ }
39
+ // Handle potential direct structure if any
40
+ "feature-name"?: string
41
+ "feature-icon"?: string
42
+ }>
43
+ "contact-us"?: {
44
+ "contact-phone"?: string
45
+ "contact-email"?: string
46
+ "contact-address"?: string
47
+ }
48
+ "social-links"?: Array<{
49
+ "social-link"?: {
50
+ "social-platform-name"?: string
51
+ "social-platform-icon"?: string
52
+ "social-platform-url"?: string
53
+ }
54
+ // Handle potential direct structure if any
55
+ "social-platform-name"?: string
56
+ "social-platform-icon"?: string
57
+ "social-platform-url"?: string
58
+ }>
59
+ "promo-bar"?: {
60
+ "promo-text"?: string
61
+ "promo-code"?: string
62
+ "promo-value"?: string
63
+ "promo-active"?: boolean
64
+ }
65
+ // Allow for other properties
66
+ [key: string]: any
67
+ }
68
+ }
69
+
70
+ export const getDynamicConfig = cache(async (): Promise<DynamicConfig | null> => {
71
+ try {
72
+ const publishableKey = process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY
73
+ const baseUrl = process.env.MEDUSA_BACKEND_URL || "http://localhost:9000"
74
+
75
+
76
+
77
+ if (!publishableKey) {
78
+
79
+ return null
80
+ }
81
+
82
+ const authHeaders = await getAuthHeaders()
83
+
84
+ const headers: Record<string, string> = {
85
+ "Content-Type": "application/json",
86
+ "Accept": "application/json",
87
+ "x-publishable-api-key": publishableKey,
88
+ }
89
+
90
+ if (authHeaders && "authorization" in authHeaders) {
91
+ headers["authorization"] = authHeaders.authorization
92
+ }
93
+
94
+ const fetchStart = Date.now()
95
+ const response = await fetch(`${baseUrl}/store/dynamic-config`, {
96
+ method: "GET",
97
+ headers,
98
+ cache: "no-store",
99
+ })
100
+ const duration = Date.now() - fetchStart
101
+
102
+
103
+
104
+ if (!response.ok) {
105
+
106
+ return null
107
+ }
108
+
109
+ const data = await response.json()
110
+
111
+
112
+ return data
113
+ } catch (error) {
114
+
115
+ return null
116
+ }
117
+ })
118
+
119
+ export const getLogoFromConfig = async (): Promise<string | null> => {
120
+ try {
121
+ const config = await getDynamicConfig()
122
+ const logo = config?.["homepage-config"]?.logo
123
+
124
+ return logo || null
125
+ } catch (error) {
126
+
127
+ return null
128
+ }
129
+ }
130
+
131
+ export const getBannerImageFromConfig = async (): Promise<string | null> => {
132
+ try {
133
+ const config = await getDynamicConfig()
134
+ const bannerArray = config?.["homepage-config"]?.["homepage-banner-array"]
135
+
136
+ if (bannerArray && bannerArray.length > 0) {
137
+ const firstBanner = bannerArray[0]
138
+ const image = firstBanner?.["homepage-banner"]?.["homepage-banner-image"]
139
+
140
+ return image || null
141
+ }
142
+
143
+
144
+ return null
145
+ } catch (error) {
146
+
147
+ return null
148
+ }
149
+ }
150
+
151
+ export const getMobileBannerFromConfig = async (): Promise<{ image: string | null; link: string | null }> => {
152
+ try {
153
+ const config = await getDynamicConfig()
154
+ const bannerArray = config?.["homepage-config"]?.["app-banner-array"]
155
+
156
+ if (bannerArray && bannerArray.length > 0) {
157
+ const firstBanner = bannerArray[0]
158
+ const image = firstBanner?.["app-banner"]?.["app-banner-image"] || null
159
+ const link = firstBanner?.["app-banner"]?.["app-banner-button-link"] || firstBanner?.["app-banner"]?.["app-banner-link"] || null
160
+
161
+ return { image, link }
162
+ }
163
+
164
+
165
+ return { image: null, link: null }
166
+ } catch (error) {
167
+
168
+ return { image: null, link: null }
169
+ }
170
+ }
171
+
172
+ export const getHomeBannersFromConfig = async (): Promise<Array<{
173
+ image?: string;
174
+ title?: string;
175
+ subtitle?: string;
176
+ description?: string;
177
+ buttonName?: string;
178
+ buttonLink?: string;
179
+ }> | null> => {
180
+ try {
181
+ const config = await getDynamicConfig()
182
+ const bannerArray = config?.["homepage-config"]?.["homepage-banner-array"]
183
+
184
+ if (bannerArray && bannerArray.length > 0) {
185
+ return bannerArray.map(item => {
186
+ const banner = item["homepage-banner"]
187
+ return {
188
+ image: banner?.["homepage-banner-image"],
189
+ title: banner?.["homepage-banner-title"],
190
+ subtitle: banner?.["homepage-banner-subtitle"],
191
+ description: banner?.["homepage-banner-description"],
192
+ buttonName: banner?.["homepage-banner-button-name"],
193
+ buttonLink: banner?.["homepage-banner-button-link"],
194
+ }
195
+ })
196
+ }
197
+ return null
198
+ } catch (error) {
199
+
200
+ return null
201
+ }
202
+ }
203
+
204
+ export const getAppBannersFromConfig = async (): Promise<Array<{
205
+ image?: string;
206
+ title?: string;
207
+ subtitle?: string;
208
+ description?: string;
209
+ buttonName?: string;
210
+ buttonLink?: string;
211
+ }> | null> => {
212
+ try {
213
+ const config = await getDynamicConfig()
214
+ const bannerArray = config?.["homepage-config"]?.["app-banner-array"]
215
+
216
+ if (bannerArray && bannerArray.length > 0) {
217
+ return bannerArray.map(item => {
218
+ const banner = item["app-banner"]
219
+ return {
220
+ image: banner?.["app-banner-image"],
221
+ title: banner?.["app-banner-title"],
222
+ subtitle: banner?.["app-banner-subtitle"],
223
+ description: banner?.["app-banner-description"],
224
+ buttonName: banner?.["app-banner-button-name"],
225
+ buttonLink: banner?.["app-banner-button-link"],
226
+ }
227
+ })
228
+ }
229
+ return null
230
+ } catch (error) {
231
+
232
+ return null
233
+ }
234
+ }
235
+
236
+ // Legacy function for backward compatibility
237
+ export const getMobileBannerImageFromConfig = async (): Promise<string | null> => {
238
+ const { image } = await getMobileBannerFromConfig()
239
+ return image
240
+ }
241
+
242
+ export const getWebsiteDescriptionFromConfig = async (): Promise<string | null> => {
243
+ try {
244
+ const config = await getDynamicConfig()
245
+ const homepageConfig = config?.["homepage-config"]
246
+ const desc = homepageConfig?.["website-description"] || homepageConfig?.["website_description"]
247
+
248
+
249
+ return desc || null
250
+ } catch (error) {
251
+
252
+ return null
253
+ }
254
+ }
255
+
256
+ export const getFeaturesFromConfig = async (): Promise<{ title: string; features: Array<{ name: string; icon: string }> } | null> => {
257
+ try {
258
+ const config = await getDynamicConfig()
259
+ const homepageConfig = config?.["homepage-config"]
260
+
261
+ if (!homepageConfig) return null
262
+
263
+ const title = homepageConfig["why-choose-us-title"] || "Why Choose Chocomelon?"
264
+ const featuresRaw = homepageConfig["why-choose-us-features"] || []
265
+
266
+ const features = featuresRaw.map((item: any) => {
267
+ const feature = item?.feature || item
268
+ return {
269
+ name: feature?.["feature-name"] || "",
270
+ icon: feature?.["feature-icon"] || "",
271
+ }
272
+ }).filter((f: any) => f.name && f.icon)
273
+
274
+
275
+ return { title, features }
276
+ } catch (error) {
277
+
278
+ return null
279
+ }
280
+ }
281
+
282
+ export const getContactInfoFromConfig = async (): Promise<{ phone?: string; email?: string; address?: string } | null> => {
283
+ try {
284
+ const config = await getDynamicConfig()
285
+ const contactConfig = config?.["homepage-config"]?.["contact-us"]
286
+
287
+ if (!contactConfig) {
288
+
289
+ return null
290
+ }
291
+
292
+
293
+
294
+ return {
295
+ phone: contactConfig["contact-phone"],
296
+ email: contactConfig["contact-email"],
297
+ address: contactConfig["contact-address"],
298
+ }
299
+ } catch (error) {
300
+
301
+ return null
302
+ }
303
+ }
304
+
305
+ export const getTestimonialsFromConfig = async (): Promise<{ title: string; testimonials: Array<{ id: string; text: string; name: string; rating: number; avatar?: string }> } | null> => {
306
+ try {
307
+ const config = await getDynamicConfig()
308
+ const homepageConfig = config?.["homepage-config"]
309
+
310
+ if (!homepageConfig) return null
311
+
312
+ const title = homepageConfig["rating-title"] || "Happy Parents Say About Us"
313
+ const ratings = homepageConfig["ratings"] || []
314
+
315
+ const testimonials = ratings.map((item: any, index: number) => {
316
+ const review = item?.review || item
317
+ return {
318
+ id: `review-${index}`,
319
+ text: review?.["review-description"] || "",
320
+ name: review?.["review-user-name"] || "",
321
+ rating: parseFloat(review?.["review-rating"] || "5"),
322
+ avatar: review?.["review-profile-image"] || undefined,
323
+ }
324
+ }).filter((t: any) => t.text && t.name)
325
+
326
+
327
+
328
+ return { title, testimonials }
329
+ } catch (error) {
330
+
331
+ return null
332
+ }
333
+ }
334
+
335
+ export const getSocialLinksFromConfig = async (): Promise<Array<{ name: string; url: string; icon?: string }> | null> => {
336
+ try {
337
+ const config = await getDynamicConfig()
338
+ const socialLinksRaw = config?.["homepage-config"]?.["social-links"] || []
339
+
340
+ const socialLinks = socialLinksRaw.map((item: any) => {
341
+ const link = item?.["social-link"] || item
342
+ return {
343
+ name: link?.["social-platform-name"] || "",
344
+ url: link?.["social-platform-url"] || "",
345
+ icon: link?.["social-platform-icon"] || undefined,
346
+ }
347
+ }).filter((l: any) => l.name && l.url)
348
+
349
+
350
+ return socialLinks.length > 0 ? socialLinks : null
351
+ } catch (error) {
352
+
353
+ return null
354
+ }
355
+ }
356
+
357
+ export const getFaqsFromConfig = async (): Promise<Array<{ category: string; items: Array<{ q: string; a: string }> }> | null> => {
358
+ try {
359
+ const config = await getDynamicConfig()
360
+ const faqsRaw = config?.["homepage-config"]?.["faq-array"] || []
361
+
362
+ if (!Array.isArray(faqsRaw) || faqsRaw.length === 0) return null
363
+
364
+ const categoriesMap: Record<string, { displayCategory: string, items: Array<{q: string; a: string}> }> = {}
365
+
366
+ faqsRaw.forEach((item: any) => {
367
+ const faq = item?.["faq"] || item
368
+ const displayCategory = (faq?.["faq-category"] || "General Questions").trim()
369
+ const categoryKey = displayCategory.toLowerCase()
370
+ const q = (faq?.["faq-question"] || "").trim()
371
+ const a = (faq?.["faq-answer"] || "").trim()
372
+
373
+ if (q && a) {
374
+ if (!categoriesMap[categoryKey]) categoriesMap[categoryKey] = { displayCategory, items: [] }
375
+ categoriesMap[categoryKey].items.push({ q, a })
376
+ }
377
+ })
378
+
379
+ const faqs = Object.values(categoriesMap).map(catData => ({
380
+ category: catData.displayCategory,
381
+ items: catData.items
382
+ }))
383
+
384
+ return faqs.length > 0 ? faqs : null
385
+ } catch (error) {
386
+ return null
387
+ }
388
+ }
389
+ export const getPromoBarConfig = async (): Promise<{ text: string | null; code: string | null; value: string | null; active: boolean }> => {
390
+ try {
391
+ const config = await getDynamicConfig()
392
+ const promoConfig = config?.["homepage-config"]?.["promo-bar"]
393
+
394
+ return {
395
+ text: promoConfig?.["promo-text"] || null,
396
+ code: promoConfig?.["promo-code"] || null,
397
+ value: promoConfig?.["promo-value"] || null,
398
+ active: promoConfig?.["promo-active"] ?? false
399
+ }
400
+ } catch (error) {
401
+ return { text: null, code: null, value: null, active: false }
402
+ }
403
+ }
@@ -0,0 +1,97 @@
1
+ "use server"
2
+
3
+ import { sdk } from "../config"
4
+ import { HttpTypes } from "@medusajs/types"
5
+ import { getAuthHeaders, getCacheOptions } from "../cookies"
6
+
7
+ export const listCartShippingMethods = async (cartId: string) => {
8
+ const headers = {
9
+ ...(await getAuthHeaders()),
10
+ }
11
+
12
+ const next = {
13
+ ...(await getCacheOptions("fulfillment")),
14
+ }
15
+
16
+ return sdk.client
17
+ .fetch<HttpTypes.StoreShippingOptionListResponse>(
18
+ `/store/shipping-options`,
19
+ {
20
+ method: "GET",
21
+ query: {
22
+ cart_id: cartId,
23
+ },
24
+ headers,
25
+ next,
26
+ cache: "force-cache",
27
+ }
28
+ )
29
+ .then(({ shipping_options }) => shipping_options)
30
+ .catch(() => {
31
+ return null
32
+ })
33
+ }
34
+
35
+ export const calculatePriceForShippingOption = async (
36
+ optionId: string,
37
+ cartId: string,
38
+ data?: Record<string, unknown>
39
+ ) => {
40
+ const headers = {
41
+ ...(await getAuthHeaders()),
42
+ }
43
+
44
+ const next = {
45
+ ...(await getCacheOptions("fulfillment")),
46
+ }
47
+
48
+ const body = { cart_id: cartId, data }
49
+
50
+ if (data) {
51
+ body.data = data
52
+ }
53
+
54
+ return sdk.client
55
+ .fetch<{ shipping_option: HttpTypes.StoreCartShippingOption }>(
56
+ `/store/shipping-options/${optionId}/calculate`,
57
+ {
58
+ method: "POST",
59
+ body,
60
+ headers,
61
+ next,
62
+ }
63
+ )
64
+ .then(({ shipping_option }) => shipping_option)
65
+ .catch((e) => {
66
+ return null
67
+ })
68
+ }
69
+
70
+ export const getShiprocketServiceability = async (pincode: string, variant_id: string, cod: number = 0) => {
71
+ const headers = {
72
+ ...(await getAuthHeaders()),
73
+ }
74
+
75
+ return sdk.client
76
+ .fetch<any>(
77
+ `/store/shiprocket/serviceability`,
78
+ {
79
+ method: "GET",
80
+ query: {
81
+ pincode,
82
+ variant_id,
83
+ cod: cod.toString(),
84
+ },
85
+ headers,
86
+ cache: "no-store",
87
+ }
88
+ )
89
+ .then((data) => data)
90
+ .catch(async (e) => {
91
+ if (e.response) {
92
+ const errorData = await e.response.json()
93
+ throw new Error(errorData.message || "Failed to check serviceability")
94
+ }
95
+ throw e
96
+ })
97
+ }