@gfed-medusa/sf-lib-common 1.1.0 → 2.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 (254) hide show
  1. package/dist/components/breadcrumbs/index.d.ts +4 -6
  2. package/dist/components/breadcrumbs/index.d.ts.map +1 -1
  3. package/dist/components/breadcrumbs/index.js.map +1 -1
  4. package/dist/components/cart-button/index.d.ts +2 -2
  5. package/dist/components/cart-button/index.d.ts.map +1 -1
  6. package/dist/components/cart-button/index.js +11 -17
  7. package/dist/components/cart-button/index.js.map +1 -0
  8. package/dist/components/cart-dropdown/index.d.ts +3 -3
  9. package/dist/components/cart-dropdown/index.d.ts.map +1 -1
  10. package/dist/components/cart-dropdown/index.js +193 -16
  11. package/dist/components/cart-dropdown/index.js.map +1 -0
  12. package/dist/components/cart-mismatch-banner/index.d.ts +3 -3
  13. package/dist/components/cart-mismatch-banner/index.d.ts.map +1 -1
  14. package/dist/components/cart-mismatch-banner/index.js +1 -8
  15. package/dist/components/cart-mismatch-banner/index.js.map +1 -1
  16. package/dist/components/country-select/index.d.ts +1 -1
  17. package/dist/components/delete-button/index.d.ts +2 -2
  18. package/dist/components/delete-button/index.js +27 -11
  19. package/dist/components/delete-button/index.js.map +1 -0
  20. package/dist/components/error-message/index.d.ts +2 -2
  21. package/dist/components/error-message/index.d.ts.map +1 -1
  22. package/dist/components/footer/index.d.ts +2 -2
  23. package/dist/components/footer/index.d.ts.map +1 -1
  24. package/dist/components/footer/index.js +5 -10
  25. package/dist/components/footer/index.js.map +1 -1
  26. package/dist/components/free-shipping-price-nudge/index.d.ts +3 -3
  27. package/dist/components/free-shipping-price-nudge/index.d.ts.map +1 -1
  28. package/dist/components/free-shipping-price-nudge/index.js +2 -2
  29. package/dist/components/interactive-link/index.d.ts +2 -2
  30. package/dist/components/interactive-link/index.js +1 -1
  31. package/dist/components/layout-country-select/index.d.ts +4 -4
  32. package/dist/components/layout-country-select/index.js +89 -11
  33. package/dist/components/layout-country-select/index.js.map +1 -0
  34. package/dist/components/line-item-options/index.d.ts +3 -3
  35. package/dist/components/line-item-options/index.js +15 -2
  36. package/dist/components/line-item-options/index.js.map +1 -0
  37. package/dist/components/line-item-price/index.d.ts +3 -3
  38. package/dist/components/line-item-price/index.d.ts.map +1 -1
  39. package/dist/components/line-item-price/index.js +46 -2
  40. package/dist/components/line-item-price/index.js.map +1 -0
  41. package/dist/components/localized-client-link/index.d.ts +5 -12
  42. package/dist/components/localized-client-link/index.d.ts.map +1 -1
  43. package/dist/components/localized-client-link/index.js +19 -2
  44. package/dist/components/localized-client-link/index.js.map +1 -0
  45. package/dist/components/modal/index.d.ts +2 -2
  46. package/dist/components/modal/index.js +101 -3
  47. package/dist/components/modal/index.js.map +1 -0
  48. package/dist/components/nav/index.d.ts +2 -2
  49. package/dist/components/nav/index.js +6 -25
  50. package/dist/components/nav/index.js.map +1 -1
  51. package/dist/components/portable-text/index.d.ts +3 -3
  52. package/dist/components/portable-text/index.js +329 -2
  53. package/dist/components/portable-text/index.js.map +1 -0
  54. package/dist/components/preview-price/index.d.ts +1 -1
  55. package/dist/components/preview-price/index.js +19 -2
  56. package/dist/components/preview-price/index.js.map +1 -0
  57. package/dist/components/product-card/index.d.ts +2 -2
  58. package/dist/components/product-card/index.d.ts.map +1 -1
  59. package/dist/components/product-card/index.js +3 -4
  60. package/dist/components/product-card/index.js.map +1 -1
  61. package/dist/components/product-preview/index.d.ts +3 -3
  62. package/dist/components/product-preview/index.d.ts.map +1 -1
  63. package/dist/components/product-preview/index.js +4 -4
  64. package/dist/components/search-modal/index.d.ts +2 -2
  65. package/dist/components/search-modal/index.d.ts.map +1 -1
  66. package/dist/components/search-modal/index.js +135 -9
  67. package/dist/components/search-modal/index.js.map +1 -0
  68. package/dist/components/side-menu/index.d.ts +3 -3
  69. package/dist/components/side-menu/index.js +96 -13
  70. package/dist/components/side-menu/index.js.map +1 -0
  71. package/dist/components/thumbnail/index.js +43 -2
  72. package/dist/components/thumbnail/index.js.map +1 -0
  73. package/dist/lib/config/medusa.js +11 -2
  74. package/dist/lib/config/medusa.js.map +1 -0
  75. package/dist/lib/context/apollo-context.js +1 -2
  76. package/dist/lib/context/apollo-context.js.map +1 -1
  77. package/dist/lib/context/modal-context.d.ts +2 -2
  78. package/dist/lib/context/modal-context.js +19 -2
  79. package/dist/lib/context/modal-context.js.map +1 -0
  80. package/dist/lib/data/cart.d.ts +1 -1
  81. package/dist/lib/data/cart.d.ts.map +1 -1
  82. package/dist/lib/data/cart.js +102 -10
  83. package/dist/lib/data/cart.js.map +1 -0
  84. package/dist/lib/data/categories.d.ts +1 -1
  85. package/dist/lib/data/categories.js +15 -5
  86. package/dist/lib/data/categories.js.map +1 -0
  87. package/dist/lib/data/collections.d.ts +1 -1
  88. package/dist/lib/data/collections.js +21 -5
  89. package/dist/lib/data/collections.js.map +1 -0
  90. package/dist/lib/data/cookies.d.ts +2 -1
  91. package/dist/lib/data/cookies.d.ts.map +1 -1
  92. package/dist/lib/data/cookies.js +45 -2
  93. package/dist/lib/data/cookies.js.map +1 -0
  94. package/dist/lib/data/customer.d.ts +1 -1
  95. package/dist/lib/data/customer.d.ts.map +1 -1
  96. package/dist/lib/data/customer.js +39 -9
  97. package/dist/lib/data/customer.js.map +1 -0
  98. package/dist/lib/data/footer.js +15 -4
  99. package/dist/lib/data/footer.js.map +1 -0
  100. package/dist/lib/data/orders.d.ts +1 -1
  101. package/dist/lib/data/orders.js +4 -4
  102. package/dist/lib/data/regions.d.ts +1 -1
  103. package/dist/lib/data/regions.js +33 -4
  104. package/dist/lib/data/regions.js.map +1 -0
  105. package/dist/lib/data/search.d.ts +1 -1
  106. package/dist/lib/data/search.js +20 -5
  107. package/dist/lib/data/search.js.map +1 -0
  108. package/dist/lib/gql/apollo-client.js +66 -2
  109. package/dist/lib/gql/apollo-client.js.map +1 -0
  110. package/dist/lib/gql/fragments/cart.d.ts +9 -9
  111. package/dist/lib/gql/fragments/cart.d.ts.map +1 -1
  112. package/dist/lib/gql/fragments/cart.js +141 -3
  113. package/dist/{cart-BNoIGQmw.js.map → lib/gql/fragments/cart.js.map} +1 -1
  114. package/dist/lib/gql/fragments/customer.d.ts +3 -3
  115. package/dist/lib/gql/fragments/customer.js +41 -2
  116. package/dist/{customer-CgN4zI00.js.map → lib/gql/fragments/customer.js.map} +1 -1
  117. package/dist/lib/gql/fragments/product.d.ts +8 -8
  118. package/dist/lib/gql/fragments/product.js +89 -2
  119. package/dist/{product-COu5D1mS.js.map → lib/gql/fragments/product.js.map} +1 -1
  120. package/dist/lib/gql/mutations/cart.d.ts +4 -4
  121. package/dist/lib/gql/mutations/cart.d.ts.map +1 -1
  122. package/dist/lib/gql/mutations/cart.js +41 -4
  123. package/dist/{cart-IHaLnQC4.js.map → lib/gql/mutations/cart.js.map} +1 -1
  124. package/dist/lib/gql/mutations/customer.js +0 -1
  125. package/dist/lib/gql/queries/cart.d.ts +2 -2
  126. package/dist/lib/gql/queries/cart.d.ts.map +1 -1
  127. package/dist/lib/gql/queries/cart.js +15 -4
  128. package/dist/{cart-DH8urwwT.js.map → lib/gql/queries/cart.js.map} +1 -1
  129. package/dist/lib/gql/queries/collections.d.ts +2 -2
  130. package/dist/lib/gql/queries/collections.d.ts.map +1 -1
  131. package/dist/lib/gql/queries/collections.js +19 -3
  132. package/dist/{collections-DMv3UYgC.js.map → lib/gql/queries/collections.js.map} +1 -1
  133. package/dist/lib/gql/queries/customer.d.ts +2 -2
  134. package/dist/lib/gql/queries/customer.d.ts.map +1 -1
  135. package/dist/lib/gql/queries/customer.js +15 -3
  136. package/dist/{customer-DIJz6m7L.js.map → lib/gql/queries/customer.js.map} +1 -1
  137. package/dist/lib/gql/queries/footer.d.ts +2 -2
  138. package/dist/lib/gql/queries/footer.d.ts.map +1 -1
  139. package/dist/lib/gql/queries/footer.js +21 -2
  140. package/dist/lib/gql/queries/footer.js.map +1 -0
  141. package/dist/lib/gql/queries/product.d.ts +3 -3
  142. package/dist/lib/gql/queries/product.d.ts.map +1 -1
  143. package/dist/lib/gql/queries/product.js +46 -3
  144. package/dist/{product-C3HQUIgX.js.map → lib/gql/queries/product.js.map} +1 -1
  145. package/dist/lib/hooks/use-apollo.d.ts +2 -2
  146. package/dist/lib/hooks/use-apollo.js +10 -3
  147. package/dist/lib/hooks/use-apollo.js.map +1 -0
  148. package/dist/lib/hooks/use-search.d.ts +1 -1
  149. package/dist/lib/hooks/use-search.js +66 -6
  150. package/dist/lib/hooks/use-search.js.map +1 -0
  151. package/dist/lib/hooks/use-toggle-state.d.ts +23 -2
  152. package/dist/lib/hooks/use-toggle-state.d.ts.map +1 -0
  153. package/dist/lib/utils/data-types.js +9 -2
  154. package/dist/lib/utils/data-types.js.map +1 -0
  155. package/dist/lib/utils/env.js +1 -1
  156. package/dist/lib/utils/env.js.map +1 -1
  157. package/dist/lib/utils/get-percentage-diff.js +7 -2
  158. package/dist/lib/utils/get-percentage-diff.js.map +1 -0
  159. package/dist/lib/utils/get-product-price.d.ts +1 -1
  160. package/dist/lib/utils/get-product-price.js +46 -2
  161. package/dist/lib/utils/get-product-price.js.map +1 -0
  162. package/dist/lib/utils/medusa-error.js +16 -2
  163. package/dist/lib/utils/medusa-error.js.map +1 -0
  164. package/dist/lib/utils/money.js +14 -2
  165. package/dist/lib/utils/money.js.map +1 -0
  166. package/dist/lib/utils/normalize-functions.d.ts +1 -1
  167. package/dist/lib/utils/normalize-functions.js +69 -2
  168. package/dist/lib/utils/normalize-functions.js.map +1 -0
  169. package/dist/types/graphql.d.ts +1368 -2
  170. package/dist/types/graphql.d.ts.map +1 -0
  171. package/dist/types/prices.d.ts +20 -2
  172. package/dist/types/prices.d.ts.map +1 -0
  173. package/dist/types/prices.js +0 -1
  174. package/package.json +12 -12
  175. package/dist/apollo-client-Bw50r80c.js +0 -66
  176. package/dist/apollo-client-Bw50r80c.js.map +0 -1
  177. package/dist/cart-BNoIGQmw.js +0 -142
  178. package/dist/cart-DH8urwwT.js +0 -16
  179. package/dist/cart-IHaLnQC4.js +0 -42
  180. package/dist/cart-button-Dj_zRxop.js +0 -12
  181. package/dist/cart-button-Dj_zRxop.js.map +0 -1
  182. package/dist/cart-dropdown-D_PUJarp.js +0 -195
  183. package/dist/cart-dropdown-D_PUJarp.js.map +0 -1
  184. package/dist/cart-xkcyWLfU.js +0 -103
  185. package/dist/cart-xkcyWLfU.js.map +0 -1
  186. package/dist/categories-B-RYCIZ3.js +0 -16
  187. package/dist/categories-B-RYCIZ3.js.map +0 -1
  188. package/dist/collections-BgyvhW2p.js +0 -22
  189. package/dist/collections-BgyvhW2p.js.map +0 -1
  190. package/dist/collections-DMv3UYgC.js +0 -20
  191. package/dist/cookies-lksVIe4_.js +0 -38
  192. package/dist/cookies-lksVIe4_.js.map +0 -1
  193. package/dist/customer-CgN4zI00.js +0 -42
  194. package/dist/customer-ClewjBBr.js +0 -38
  195. package/dist/customer-ClewjBBr.js.map +0 -1
  196. package/dist/customer-DIJz6m7L.js +0 -16
  197. package/dist/data-types-CTPJXmJH.js +0 -10
  198. package/dist/data-types-CTPJXmJH.js.map +0 -1
  199. package/dist/delete-button-Bnm5bof2.js +0 -28
  200. package/dist/delete-button-Bnm5bof2.js.map +0 -1
  201. package/dist/footer-BvNV-R9D.js +0 -16
  202. package/dist/footer-BvNV-R9D.js.map +0 -1
  203. package/dist/footer-DCtgtjKS.js +0 -76
  204. package/dist/footer-DCtgtjKS.js.map +0 -1
  205. package/dist/get-percentage-diff-B_UVOFgE.js +0 -8
  206. package/dist/get-percentage-diff-B_UVOFgE.js.map +0 -1
  207. package/dist/get-product-price-DKWc76ev.js +0 -47
  208. package/dist/get-product-price-DKWc76ev.js.map +0 -1
  209. package/dist/graphql-CdTGi4Pp.d.ts +0 -1368
  210. package/dist/graphql-CdTGi4Pp.d.ts.map +0 -1
  211. package/dist/layout-country-select-C7Ra-opl.js +0 -90
  212. package/dist/layout-country-select-C7Ra-opl.js.map +0 -1
  213. package/dist/line-item-options-l_eRZIIq.js +0 -16
  214. package/dist/line-item-options-l_eRZIIq.js.map +0 -1
  215. package/dist/line-item-price-BlTwskFC.js +0 -47
  216. package/dist/line-item-price-BlTwskFC.js.map +0 -1
  217. package/dist/localized-client-link-CthmRcvb.js +0 -22
  218. package/dist/localized-client-link-CthmRcvb.js.map +0 -1
  219. package/dist/medusa-TumrpCF2.js +0 -12
  220. package/dist/medusa-TumrpCF2.js.map +0 -1
  221. package/dist/medusa-error-DDhA6RGC.js +0 -17
  222. package/dist/medusa-error-DDhA6RGC.js.map +0 -1
  223. package/dist/modal-BASYY-YM.js +0 -102
  224. package/dist/modal-BASYY-YM.js.map +0 -1
  225. package/dist/modal-context-02cA-7jy.js +0 -20
  226. package/dist/modal-context-02cA-7jy.js.map +0 -1
  227. package/dist/money-DVQGzXns.js +0 -15
  228. package/dist/money-DVQGzXns.js.map +0 -1
  229. package/dist/normalize-functions-Bqr-JkYn.js +0 -70
  230. package/dist/normalize-functions-Bqr-JkYn.js.map +0 -1
  231. package/dist/portable-text-CuI022GH.js +0 -330
  232. package/dist/portable-text-CuI022GH.js.map +0 -1
  233. package/dist/preview-price-_4sxkXQs.js +0 -20
  234. package/dist/preview-price-_4sxkXQs.js.map +0 -1
  235. package/dist/prices-eO1YBciD.d.ts +0 -20
  236. package/dist/prices-eO1YBciD.d.ts.map +0 -1
  237. package/dist/product-C3HQUIgX.js +0 -47
  238. package/dist/product-COu5D1mS.js +0 -90
  239. package/dist/regions-r1AvxfT8.js +0 -34
  240. package/dist/regions-r1AvxfT8.js.map +0 -1
  241. package/dist/search-D7Gw7jAk.js +0 -21
  242. package/dist/search-D7Gw7jAk.js.map +0 -1
  243. package/dist/search-modal-DaXadYWM.js +0 -137
  244. package/dist/search-modal-DaXadYWM.js.map +0 -1
  245. package/dist/side-menu-B6IjTd5M.js +0 -97
  246. package/dist/side-menu-B6IjTd5M.js.map +0 -1
  247. package/dist/thumbnail-C0TU3rh-.js +0 -44
  248. package/dist/thumbnail-C0TU3rh-.js.map +0 -1
  249. package/dist/use-apollo-BxAFd1Y5.js +0 -11
  250. package/dist/use-apollo-BxAFd1Y5.js.map +0 -1
  251. package/dist/use-search-VX-u8o1D.js +0 -67
  252. package/dist/use-search-VX-u8o1D.js.map +0 -1
  253. package/dist/use-toggle-state-DI4Gwlfj.d.ts +0 -23
  254. package/dist/use-toggle-state-DI4Gwlfj.d.ts.map +0 -1
@@ -1,12 +1,138 @@
1
1
  'use client';
2
2
 
3
- import "../../apollo-client-Bw50r80c.js";
4
- import "../../product-COu5D1mS.js";
5
- import "../../product-C3HQUIgX.js";
6
- import "../../modal-context-02cA-7jy.js";
7
- import "../../modal-BASYY-YM.js";
8
- import "../../search-D7Gw7jAk.js";
9
- import "../../use-search-VX-u8o1D.js";
10
- import { t as SearchModal } from "../../search-modal-DaXadYWM.js";
3
+ import { Modal } from "../modal/index.js";
4
+ import { useSearch } from "../../lib/hooks/use-search.js";
5
+ import { useEffect, useRef, useState } from "react";
6
+ import { usePathname } from "next/navigation";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
+ import { Button } from "@medusajs/ui";
9
+ import Image from "next/image";
10
+ import { PlaceholderImage } from "@gfed-medusa/sf-lib-ui/icons/placeholder-image";
11
+ import DOMPurify from "isomorphic-dompurify";
12
+ import { cn } from "@gfed-medusa/sf-lib-ui/lib/utils";
11
13
 
12
- export { SearchModal };
14
+ //#region src/components/search-modal/index.tsx
15
+ function SearchModal({ buttonClassName }) {
16
+ const [isOpen, setIsOpen] = useState(false);
17
+ const pathname = usePathname();
18
+ const { query, setQuery, results, loading, error, isTyping } = useSearch();
19
+ useEffect(() => {
20
+ setIsOpen(false);
21
+ }, [pathname]);
22
+ useEffect(() => {
23
+ if (!isOpen) setQuery("");
24
+ }, [isOpen, setQuery]);
25
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
26
+ className: cn("small:flex hidden h-full items-center gap-x-6", buttonClassName),
27
+ children: /* @__PURE__ */ jsx(Button, {
28
+ onClick: () => setIsOpen(true),
29
+ variant: "transparent",
30
+ className: "text-small-regular hover:text-ui-fg-base px-0 hover:bg-transparent focus:!bg-transparent",
31
+ "data-testid": "search-button",
32
+ children: "Search"
33
+ })
34
+ }), /* @__PURE__ */ jsx(Modal, {
35
+ isOpen,
36
+ close: () => setIsOpen(false),
37
+ "aria-label": "Search modal",
38
+ children: /* @__PURE__ */ jsxs("div", {
39
+ className: "flex h-full max-h-[75vh] min-h-0 flex-col",
40
+ children: [/* @__PURE__ */ jsx("div", {
41
+ className: "shrink-0",
42
+ children: /* @__PURE__ */ jsx(SearchBox, {
43
+ query,
44
+ setQuery,
45
+ loading
46
+ })
47
+ }), /* @__PURE__ */ jsx("div", {
48
+ className: "mt-4 min-h-0 flex-1 overflow-y-auto",
49
+ children: /* @__PURE__ */ jsx(SearchResults, {
50
+ results,
51
+ loading,
52
+ error,
53
+ query,
54
+ isTyping
55
+ })
56
+ })]
57
+ })
58
+ })] });
59
+ }
60
+ const SearchBox = ({ query, setQuery, loading }) => {
61
+ const inputRef = useRef(null);
62
+ useEffect(() => {
63
+ if (inputRef.current && document.activeElement !== inputRef.current) inputRef.current.focus();
64
+ }, [loading]);
65
+ return /* @__PURE__ */ jsx("div", {
66
+ className: "relative w-full",
67
+ children: /* @__PURE__ */ jsx("input", {
68
+ ref: inputRef,
69
+ type: "text",
70
+ value: query,
71
+ onChange: (e) => setQuery(e.target.value),
72
+ placeholder: "Search products...",
73
+ className: "w-full rounded-md border border-gray-300 px-4 py-2 focus:outline-none focus-visible:outline-2 focus-visible:outline-blue-500",
74
+ disabled: loading,
75
+ autoFocus: true,
76
+ "data-testid": "search-input"
77
+ })
78
+ });
79
+ };
80
+ const SearchResults = ({ results, loading, error, query, isTyping }) => {
81
+ if (loading) return /* @__PURE__ */ jsx("div", {
82
+ className: "flex min-h-full items-center justify-center",
83
+ children: /* @__PURE__ */ jsxs("div", {
84
+ className: "text-center",
85
+ children: [/* @__PURE__ */ jsx("div", { className: "mx-auto h-8 w-8 animate-spin rounded-full border-b-2 border-blue-500" }), /* @__PURE__ */ jsx("p", {
86
+ className: "mt-2 text-sm text-gray-500",
87
+ children: "Searching..."
88
+ })]
89
+ })
90
+ });
91
+ if (error) return /* @__PURE__ */ jsx("div", {
92
+ className: "flex min-h-full items-center justify-center text-rose-600",
93
+ children: /* @__PURE__ */ jsxs("p", { children: ["Error: ", error] })
94
+ });
95
+ if (query.trim() && !isTyping && !loading && (!results || !results.items || results.items.length === 0)) return /* @__PURE__ */ jsx("div", {
96
+ className: "flex min-h-full items-center justify-center text-gray-500",
97
+ children: /* @__PURE__ */ jsx("p", { children: "No products found" })
98
+ });
99
+ if (!query.trim()) return null;
100
+ return /* @__PURE__ */ jsx("div", { children: results?.items?.map((hit) => /* @__PURE__ */ jsx(Hit, { hit }, hit.id)) });
101
+ };
102
+ const Hit = ({ hit }) => {
103
+ return /* @__PURE__ */ jsxs("div", {
104
+ className: "relative mt-4 flex flex-row gap-x-2",
105
+ "data-testid": "search-hit",
106
+ children: [
107
+ /* @__PURE__ */ jsx("div", {
108
+ className: "relative h-[100px] w-[100px] shrink-0 overflow-hidden border border-gray-200",
109
+ children: hit.thumbnail ? /* @__PURE__ */ jsx(Image, {
110
+ src: hit.thumbnail,
111
+ alt: hit.title ?? "Product Image",
112
+ width: 100,
113
+ height: 100,
114
+ className: "aspect-square object-cover"
115
+ }) : /* @__PURE__ */ jsx("div", {
116
+ className: "border-grey-400 flex h-[125px] w-[100px] items-center justify-center self-start border",
117
+ children: /* @__PURE__ */ jsx(PlaceholderImage, { size: 40 })
118
+ })
119
+ }),
120
+ /* @__PURE__ */ jsxs("div", {
121
+ className: "flex flex-col gap-y-1",
122
+ children: [/* @__PURE__ */ jsx("h3", { children: hit.title }), /* @__PURE__ */ jsx("p", {
123
+ className: "text-sm text-gray-500",
124
+ dangerouslySetInnerHTML: { __html: DOMPurify.sanitize(hit.description ?? "") }
125
+ })]
126
+ }),
127
+ /* @__PURE__ */ jsx("a", {
128
+ href: `/products/${hit.handle}`,
129
+ className: "absolute top-0 right-0 h-full w-full",
130
+ "aria-label": `View Product: ${hit.title}`
131
+ })
132
+ ]
133
+ });
134
+ };
135
+
136
+ //#endregion
137
+ export { SearchModal };
138
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/search-modal/index.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport Image from 'next/image';\nimport { usePathname } from 'next/navigation';\n\nimport DOMPurify from 'isomorphic-dompurify';\n\nimport { PlaceholderImage } from '@gfed-medusa/sf-lib-ui/icons/placeholder-image';\nimport { cn } from '@gfed-medusa/sf-lib-ui/lib/utils';\nimport { Button } from '@medusajs/ui';\n\nimport { useSearch } from '@/lib/hooks/use-search';\nimport { ProductHit } from '@/types/graphql';\n\nimport { Modal } from '../modal';\n\ntype SearchModalProps = {\n buttonClassName?: string;\n};\n\nfunction SearchModal({ buttonClassName }: SearchModalProps) {\n const [isOpen, setIsOpen] = useState(false);\n const pathname = usePathname();\n\n const { query, setQuery, results, loading, error, isTyping } = useSearch();\n\n useEffect(() => {\n setIsOpen(false);\n }, [pathname]);\n\n useEffect(() => {\n if (!isOpen) {\n setQuery('');\n }\n }, [isOpen, setQuery]);\n\n return (\n <>\n <div\n className={cn(\n 'small:flex hidden h-full items-center gap-x-6',\n buttonClassName\n )}\n >\n <Button\n onClick={() => setIsOpen(true)}\n variant=\"transparent\"\n className=\"text-small-regular hover:text-ui-fg-base px-0 hover:bg-transparent focus:!bg-transparent\"\n data-testid=\"search-button\"\n >\n Search\n </Button>\n </div>\n <Modal\n isOpen={isOpen}\n close={() => setIsOpen(false)}\n aria-label=\"Search modal\"\n >\n <div className=\"flex h-full max-h-[75vh] min-h-0 flex-col\">\n <div className=\"shrink-0\">\n <SearchBox query={query} setQuery={setQuery} loading={loading} />\n </div>\n <div className=\"mt-4 min-h-0 flex-1 overflow-y-auto\">\n <SearchResults\n results={results}\n loading={loading}\n error={error}\n query={query}\n isTyping={isTyping}\n />\n </div>\n </div>\n </Modal>\n </>\n );\n}\n\nconst SearchBox = ({\n query,\n setQuery,\n loading,\n}: {\n query: string;\n setQuery: (query: string) => void;\n loading: boolean;\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current && document.activeElement !== inputRef.current) {\n inputRef.current.focus();\n }\n }, [loading]);\n\n return (\n <div className=\"relative w-full\">\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search products...\"\n className=\"w-full rounded-md border border-gray-300 px-4 py-2 focus:outline-none focus-visible:outline-2 focus-visible:outline-blue-500\"\n disabled={loading}\n autoFocus\n data-testid=\"search-input\"\n />\n </div>\n );\n};\n\nconst SearchResults = ({\n results,\n loading,\n error,\n query,\n isTyping,\n}: {\n results: { items: ProductHit[] } | null;\n loading: boolean;\n error: string | null;\n query: string;\n isTyping: boolean;\n}) => {\n if (loading) {\n return (\n <div className=\"flex min-h-full items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"mx-auto h-8 w-8 animate-spin rounded-full border-b-2 border-blue-500\"></div>\n <p className=\"mt-2 text-sm text-gray-500\">Searching...</p>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex min-h-full items-center justify-center text-rose-600\">\n <p>Error: {error}</p>\n </div>\n );\n }\n\n if (\n query.trim() &&\n !isTyping &&\n !loading &&\n (!results || !results.items || results.items.length === 0)\n ) {\n return (\n <div className=\"flex min-h-full items-center justify-center text-gray-500\">\n <p>No products found</p>\n </div>\n );\n }\n\n if (!query.trim()) {\n return null;\n }\n\n return (\n <div>\n {results?.items?.map((hit: ProductHit) => (\n <Hit key={hit.id} hit={hit} />\n ))}\n </div>\n );\n};\n\nconst Hit = ({ hit }: { hit: ProductHit }) => {\n return (\n <div\n className=\"relative mt-4 flex flex-row gap-x-2\"\n data-testid=\"search-hit\"\n >\n <div className=\"relative h-[100px] w-[100px] shrink-0 overflow-hidden border border-gray-200\">\n {hit.thumbnail ? (\n <Image\n src={hit.thumbnail}\n alt={hit.title ?? 'Product Image'}\n width={100}\n height={100}\n className=\"aspect-square object-cover\"\n />\n ) : (\n <div className=\"border-grey-400 flex h-[125px] w-[100px] items-center justify-center self-start border\">\n <PlaceholderImage size={40} />\n </div>\n )}\n </div>\n <div className=\"flex flex-col gap-y-1\">\n <h3>{hit.title}</h3>\n <p\n className=\"text-sm text-gray-500\"\n dangerouslySetInnerHTML={{\n __html: DOMPurify.sanitize(hit.description ?? ''),\n }}\n />\n </div>\n <a\n href={`/products/${hit.handle}`}\n className=\"absolute top-0 right-0 h-full w-full\"\n aria-label={`View Product: ${hit.title}`}\n />\n </div>\n );\n};\n\nexport { SearchModal };\n"],"mappings":";;;;;;;;;;;;;;AAsBA,SAAS,YAAY,EAAE,mBAAqC;CAC1D,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,WAAW,aAAa;CAE9B,MAAM,EAAE,OAAO,UAAU,SAAS,SAAS,OAAO,aAAa,WAAW;AAE1E,iBAAgB;AACd,YAAU,MAAM;IACf,CAAC,SAAS,CAAC;AAEd,iBAAgB;AACd,MAAI,CAAC,OACH,UAAS,GAAG;IAEb,CAAC,QAAQ,SAAS,CAAC;AAEtB,QACE,8CACE,oBAAC;EACC,WAAW,GACT,iDACA,gBACD;YAED,oBAAC;GACC,eAAe,UAAU,KAAK;GAC9B,SAAQ;GACR,WAAU;GACV,eAAY;aACb;IAEQ;GACL,EACN,oBAAC;EACS;EACR,aAAa,UAAU,MAAM;EAC7B,cAAW;YAEX,qBAAC;GAAI,WAAU;cACb,oBAAC;IAAI,WAAU;cACb,oBAAC;KAAiB;KAAiB;KAAmB;MAAW;KAC7D,EACN,oBAAC;IAAI,WAAU;cACb,oBAAC;KACU;KACA;KACF;KACA;KACG;MACV;KACE;IACF;GACA,IACP;;AAIP,MAAM,aAAa,EACjB,OACA,UACA,cAKI;CACJ,MAAM,WAAW,OAAyB,KAAK;AAE/C,iBAAgB;AACd,MAAI,SAAS,WAAW,SAAS,kBAAkB,SAAS,QAC1D,UAAS,QAAQ,OAAO;IAEzB,CAAC,QAAQ,CAAC;AAEb,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GACC,KAAK;GACL,MAAK;GACL,OAAO;GACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;GACzC,aAAY;GACZ,WAAU;GACV,UAAU;GACV;GACA,eAAY;IACZ;GACE;;AAIV,MAAM,iBAAiB,EACrB,SACA,SACA,OACA,OACA,eAOI;AACJ,KAAI,QACF,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC;GAAI,WAAU;cACb,oBAAC,SAAI,WAAU,yEAA6E,EAC5F,oBAAC;IAAE,WAAU;cAA6B;KAAgB;IACtD;GACF;AAIV,KAAI,MACF,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC,kBAAE,WAAQ,SAAU;GACjB;AAIV,KACE,MAAM,MAAM,IACZ,CAAC,YACD,CAAC,YACA,CAAC,WAAW,CAAC,QAAQ,SAAS,QAAQ,MAAM,WAAW,GAExD,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC,iBAAE,sBAAqB;GACpB;AAIV,KAAI,CAAC,MAAM,MAAM,CACf,QAAO;AAGT,QACE,oBAAC,mBACE,SAAS,OAAO,KAAK,QACpB,oBAAC,OAAsB,OAAb,IAAI,GAAgB,CAC9B,GACE;;AAIV,MAAM,OAAO,EAAE,UAA+B;AAC5C,QACE,qBAAC;EACC,WAAU;EACV,eAAY;;GAEZ,oBAAC;IAAI,WAAU;cACZ,IAAI,YACH,oBAAC;KACC,KAAK,IAAI;KACT,KAAK,IAAI,SAAS;KAClB,OAAO;KACP,QAAQ;KACR,WAAU;MACV,GAEF,oBAAC;KAAI,WAAU;eACb,oBAAC,oBAAiB,MAAM,KAAM;MAC1B;KAEJ;GACN,qBAAC;IAAI,WAAU;eACb,oBAAC,kBAAI,IAAI,QAAW,EACpB,oBAAC;KACC,WAAU;KACV,yBAAyB,EACvB,QAAQ,UAAU,SAAS,IAAI,eAAe,GAAG,EAClD;MACD;KACE;GACN,oBAAC;IACC,MAAM,aAAa,IAAI;IACvB,WAAU;IACV,cAAY,iBAAiB,IAAI;KACjC;;GACE"}
@@ -1,12 +1,12 @@
1
- import { tr as Region } from "../../graphql-CdTGi4Pp.js";
2
- import * as react_jsx_runtime11 from "react/jsx-runtime";
1
+ import { Region } from "../../types/graphql.js";
2
+ import * as react_jsx_runtime12 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/side-menu/index.d.ts
5
5
  declare const SideMenu: ({
6
6
  regions
7
7
  }: {
8
8
  regions: Region[] | null;
9
- }) => react_jsx_runtime11.JSX.Element;
9
+ }) => react_jsx_runtime12.JSX.Element;
10
10
  //#endregion
11
11
  export { SideMenu };
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1,16 +1,99 @@
1
1
  'use client';
2
2
 
3
- import "../../medusa-TumrpCF2.js";
4
- import "../../apollo-client-Bw50r80c.js";
5
- import "../../product-COu5D1mS.js";
6
- import "../../cart-BNoIGQmw.js";
7
- import "../../cart-IHaLnQC4.js";
8
- import "../../cart-DH8urwwT.js";
9
- import "../../cookies-lksVIe4_.js";
10
- import "../../regions-r1AvxfT8.js";
11
- import "../../cart-xkcyWLfU.js";
12
- import "../../localized-client-link-CthmRcvb.js";
13
- import "../../layout-country-select-C7Ra-opl.js";
14
- import { t as SideMenu } from "../../side-menu-B6IjTd5M.js";
3
+ import { LocalizedClientLink } from "../localized-client-link/index.js";
4
+ import { LayoutCountrySelect } from "../layout-country-select/index.js";
5
+ import { Fragment } from "react";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
+ import { Popover, PopoverPanel, Transition } from "@headlessui/react";
8
+ import { Text, clx, useToggleState } from "@medusajs/ui";
9
+ import { ArrowRightMini, XMark } from "@medusajs/icons";
15
10
 
16
- export { SideMenu };
11
+ //#region src/components/side-menu/index.tsx
12
+ const SideMenuItems = {
13
+ Home: "/",
14
+ Store: "/store",
15
+ Account: "/account",
16
+ Cart: "/cart"
17
+ };
18
+ const SideMenu = ({ regions }) => {
19
+ const toggleState = useToggleState();
20
+ return /* @__PURE__ */ jsx("div", {
21
+ className: "h-full",
22
+ children: /* @__PURE__ */ jsx("div", {
23
+ className: "flex h-full items-center",
24
+ children: /* @__PURE__ */ jsx(Popover, {
25
+ className: "flex h-full",
26
+ children: ({ open, close }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
27
+ className: "relative flex h-full",
28
+ children: /* @__PURE__ */ jsx(Popover.Button, {
29
+ "data-testid": "nav-menu-button",
30
+ className: "hover:text-ui-fg-base relative flex h-full items-center transition-all duration-200 ease-out focus:outline-none",
31
+ children: "Menu"
32
+ })
33
+ }), /* @__PURE__ */ jsx(Transition, {
34
+ show: open,
35
+ as: Fragment,
36
+ enter: "transition ease-out duration-150",
37
+ enterFrom: "opacity-0",
38
+ enterTo: "opacity-100 backdrop-blur-2xl",
39
+ leave: "transition ease-in duration-150",
40
+ leaveFrom: "opacity-100 backdrop-blur-2xl",
41
+ leaveTo: "opacity-0",
42
+ children: /* @__PURE__ */ jsx(PopoverPanel, {
43
+ className: "text-ui-fg-on-color absolute inset-x-0 z-30 m-2 flex h-[calc(100vh-1rem)] w-full flex-col pr-4 text-sm backdrop-blur-2xl sm:w-1/3 sm:min-w-min sm:pr-0 2xl:w-1/4",
44
+ children: /* @__PURE__ */ jsxs("div", {
45
+ "data-testid": "nav-menu-popup",
46
+ className: "rounded-rounded flex h-full flex-col justify-between bg-[rgba(3,7,18,0.5)] p-6",
47
+ children: [
48
+ /* @__PURE__ */ jsx("div", {
49
+ className: "flex justify-end",
50
+ id: "xmark",
51
+ children: /* @__PURE__ */ jsx("button", {
52
+ "data-testid": "close-menu-button",
53
+ onClick: close,
54
+ children: /* @__PURE__ */ jsx(XMark, {})
55
+ })
56
+ }),
57
+ /* @__PURE__ */ jsx("ul", {
58
+ className: "flex flex-col items-start justify-start gap-6",
59
+ children: Object.entries(SideMenuItems).map(([name, href]) => {
60
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(LocalizedClientLink, {
61
+ href,
62
+ className: "hover:text-ui-fg-disabled text-3xl leading-10",
63
+ onClick: close,
64
+ "data-testid": `${name.toLowerCase()}-link`,
65
+ children: name
66
+ }) }, name);
67
+ })
68
+ }),
69
+ /* @__PURE__ */ jsxs("div", {
70
+ className: "flex flex-col gap-y-6",
71
+ children: [/* @__PURE__ */ jsxs("div", {
72
+ className: "flex justify-between",
73
+ onMouseEnter: toggleState.open,
74
+ onMouseLeave: toggleState.close,
75
+ children: [regions && /* @__PURE__ */ jsx(LayoutCountrySelect, {
76
+ toggleState,
77
+ regions
78
+ }), /* @__PURE__ */ jsx(ArrowRightMini, { className: clx("transition-transform duration-150", toggleState.state ? "-rotate-90" : "") })]
79
+ }), /* @__PURE__ */ jsxs(Text, {
80
+ className: "txt-compact-small flex justify-between",
81
+ children: [
82
+ "© ",
83
+ (/* @__PURE__ */ new Date()).getFullYear(),
84
+ " Medusa Store. All rights reserved."
85
+ ]
86
+ })]
87
+ })
88
+ ]
89
+ })
90
+ })
91
+ })] })
92
+ })
93
+ })
94
+ });
95
+ };
96
+
97
+ //#endregion
98
+ export { SideMenu };
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/side-menu/index.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment } from 'react';\n\nimport { Popover, PopoverPanel, Transition } from '@headlessui/react';\nimport { ArrowRightMini, XMark } from '@medusajs/icons';\nimport { Text, clx, useToggleState } from '@medusajs/ui';\n\nimport { Region } from '@/types/graphql';\n\nimport { LayoutCountrySelect } from '../layout-country-select';\nimport { LocalizedClientLink } from '../localized-client-link';\n\nconst SideMenuItems = {\n Home: '/',\n Store: '/store',\n Account: '/account',\n Cart: '/cart',\n};\n\nconst SideMenu = ({ regions }: { regions: Region[] | null }) => {\n const toggleState = useToggleState();\n\n return (\n <div className=\"h-full\">\n <div className=\"flex h-full items-center\">\n <Popover className=\"flex h-full\">\n {({ open, close }) => (\n <>\n <div className=\"relative flex h-full\">\n <Popover.Button\n data-testid=\"nav-menu-button\"\n className=\"hover:text-ui-fg-base relative flex h-full items-center transition-all duration-200 ease-out focus:outline-none\"\n >\n Menu\n </Popover.Button>\n </div>\n\n <Transition\n show={open}\n as={Fragment}\n enter=\"transition ease-out duration-150\"\n enterFrom=\"opacity-0\"\n enterTo=\"opacity-100 backdrop-blur-2xl\"\n leave=\"transition ease-in duration-150\"\n leaveFrom=\"opacity-100 backdrop-blur-2xl\"\n leaveTo=\"opacity-0\"\n >\n <PopoverPanel className=\"text-ui-fg-on-color absolute inset-x-0 z-30 m-2 flex h-[calc(100vh-1rem)] w-full flex-col pr-4 text-sm backdrop-blur-2xl sm:w-1/3 sm:min-w-min sm:pr-0 2xl:w-1/4\">\n <div\n data-testid=\"nav-menu-popup\"\n className=\"rounded-rounded flex h-full flex-col justify-between bg-[rgba(3,7,18,0.5)] p-6\"\n >\n <div className=\"flex justify-end\" id=\"xmark\">\n <button data-testid=\"close-menu-button\" onClick={close}>\n <XMark />\n </button>\n </div>\n <ul className=\"flex flex-col items-start justify-start gap-6\">\n {Object.entries(SideMenuItems).map(([name, href]) => {\n return (\n <li key={name}>\n <LocalizedClientLink\n href={href}\n className=\"hover:text-ui-fg-disabled text-3xl leading-10\"\n onClick={close}\n data-testid={`${name.toLowerCase()}-link`}\n >\n {name}\n </LocalizedClientLink>\n </li>\n );\n })}\n </ul>\n <div className=\"flex flex-col gap-y-6\">\n <div\n className=\"flex justify-between\"\n onMouseEnter={toggleState.open}\n onMouseLeave={toggleState.close}\n >\n {regions && (\n <LayoutCountrySelect\n toggleState={toggleState}\n regions={regions}\n />\n )}\n <ArrowRightMini\n className={clx(\n 'transition-transform duration-150',\n toggleState.state ? '-rotate-90' : ''\n )}\n />\n </div>\n <Text className=\"txt-compact-small flex justify-between\">\n © {new Date().getFullYear()} Medusa Store. All rights\n reserved.\n </Text>\n </div>\n </div>\n </PopoverPanel>\n </Transition>\n </>\n )}\n </Popover>\n </div>\n </div>\n );\n};\n\nexport { SideMenu };\n"],"mappings":";;;;;;;;;;;AAaA,MAAM,gBAAgB;CACpB,MAAM;CACN,OAAO;CACP,SAAS;CACT,MAAM;CACP;AAED,MAAM,YAAY,EAAE,cAA4C;CAC9D,MAAM,cAAc,gBAAgB;AAEpC,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GAAI,WAAU;aACb,oBAAC;IAAQ,WAAU;eACf,EAAE,MAAM,YACR,8CACE,oBAAC;KAAI,WAAU;eACb,oBAAC,QAAQ;MACP,eAAY;MACZ,WAAU;gBACX;OAEgB;MACb,EAEN,oBAAC;KACC,MAAM;KACN,IAAI;KACJ,OAAM;KACN,WAAU;KACV,SAAQ;KACR,OAAM;KACN,WAAU;KACV,SAAQ;eAER,oBAAC;MAAa,WAAU;gBACtB,qBAAC;OACC,eAAY;OACZ,WAAU;;QAEV,oBAAC;SAAI,WAAU;SAAmB,IAAG;mBACnC,oBAAC;UAAO,eAAY;UAAoB,SAAS;oBAC/C,oBAAC,UAAQ;WACF;UACL;QACN,oBAAC;SAAG,WAAU;mBACX,OAAO,QAAQ,cAAc,CAAC,KAAK,CAAC,MAAM,UAAU;AACnD,iBACE,oBAAC,kBACC,oBAAC;WACO;WACN,WAAU;WACV,SAAS;WACT,eAAa,GAAG,KAAK,aAAa,CAAC;qBAElC;YACmB,IARf,KASJ;WAEP;UACC;QACL,qBAAC;SAAI,WAAU;oBACb,qBAAC;UACC,WAAU;UACV,cAAc,YAAY;UAC1B,cAAc,YAAY;qBAEzB,WACC,oBAAC;WACc;WACJ;YACT,EAEJ,oBAAC,kBACC,WAAW,IACT,qCACA,YAAY,QAAQ,eAAe,GACpC,GACD;WACE,EACN,qBAAC;UAAK,WAAU;;WAAyC;4BACpD,IAAI,MAAM,EAAC,aAAa;WAAC;;WAEvB;UACH;;QACF;OACO;MACJ,IACZ;KAEG;IACN;GACF"}
@@ -1,3 +1,44 @@
1
- import { t as Thumbnail } from "../../thumbnail-C0TU3rh-.js";
1
+ import React from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { Container, clx } from "@medusajs/ui";
4
+ import Image from "next/image";
5
+ import { PlaceholderImage } from "@gfed-medusa/sf-lib-ui/icons/placeholder-image";
2
6
 
3
- export { Thumbnail };
7
+ //#region src/components/thumbnail/index.tsx
8
+ const Thumbnail = ({ thumbnail, images, size = "small", isFeatured, className, "data-testid": dataTestid }) => {
9
+ const initialImage = thumbnail || images?.[0]?.url;
10
+ return /* @__PURE__ */ jsx(Container, {
11
+ className: clx("rounded-large bg-ui-bg-subtle shadow-elevation-card-rest group-hover:shadow-elevation-card-hover relative w-full overflow-hidden p-4 transition-shadow duration-150 ease-in-out", className, {
12
+ "aspect-[11/14]": isFeatured,
13
+ "aspect-[9/16]": !isFeatured && size !== "square",
14
+ "aspect-[1/1]": size === "square",
15
+ "w-[180px]": size === "small",
16
+ "w-[290px]": size === "medium",
17
+ "w-[440px]": size === "large",
18
+ "w-full": size === "full"
19
+ }),
20
+ "data-testid": dataTestid,
21
+ children: /* @__PURE__ */ jsx(ImageOrPlaceholder, {
22
+ image: initialImage,
23
+ size
24
+ })
25
+ });
26
+ };
27
+ const ImageOrPlaceholder = ({ image, size }) => {
28
+ return image ? /* @__PURE__ */ jsx(Image, {
29
+ src: image,
30
+ alt: "Thumbnail",
31
+ className: "absolute inset-0 object-cover object-center",
32
+ draggable: false,
33
+ quality: 50,
34
+ sizes: "(max-width: 576px) 280px, (max-width: 768px) 360px, (max-width: 992px) 480px, 800px",
35
+ fill: true
36
+ }) : /* @__PURE__ */ jsx("div", {
37
+ className: "absolute inset-0 flex h-full w-full items-center justify-center",
38
+ children: /* @__PURE__ */ jsx(PlaceholderImage, { size: size === "small" ? 16 : 24 })
39
+ });
40
+ };
41
+
42
+ //#endregion
43
+ export { Thumbnail };
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["Thumbnail: React.FC<ThumbnailProps>"],"sources":["../../../src/components/thumbnail/index.tsx"],"sourcesContent":["import React from 'react';\n\nimport Image from 'next/image';\n\nimport { PlaceholderImage } from '@gfed-medusa/sf-lib-ui/icons/placeholder-image';\nimport { Container, clx } from '@medusajs/ui';\n\ntype ThumbnailProps = {\n thumbnail?: string | null;\n // TODO: Fix image typings\n images?: any[] | null;\n size?: 'small' | 'medium' | 'large' | 'full' | 'square';\n isFeatured?: boolean;\n className?: string;\n 'data-testid'?: string;\n};\n\nconst Thumbnail: React.FC<ThumbnailProps> = ({\n thumbnail,\n images,\n size = 'small',\n isFeatured,\n className,\n 'data-testid': dataTestid,\n}) => {\n const initialImage = thumbnail || images?.[0]?.url;\n\n return (\n <Container\n className={clx(\n 'rounded-large bg-ui-bg-subtle shadow-elevation-card-rest group-hover:shadow-elevation-card-hover relative w-full overflow-hidden p-4 transition-shadow duration-150 ease-in-out',\n className,\n {\n 'aspect-[11/14]': isFeatured,\n 'aspect-[9/16]': !isFeatured && size !== 'square',\n 'aspect-[1/1]': size === 'square',\n 'w-[180px]': size === 'small',\n 'w-[290px]': size === 'medium',\n 'w-[440px]': size === 'large',\n 'w-full': size === 'full',\n }\n )}\n data-testid={dataTestid}\n >\n <ImageOrPlaceholder image={initialImage} size={size} />\n </Container>\n );\n};\n\nconst ImageOrPlaceholder = ({\n image,\n size,\n}: Pick<ThumbnailProps, 'size'> & { image?: string }) => {\n return image ? (\n <Image\n src={image}\n alt=\"Thumbnail\"\n className=\"absolute inset-0 object-cover object-center\"\n draggable={false}\n quality={50}\n sizes=\"(max-width: 576px) 280px, (max-width: 768px) 360px, (max-width: 992px) 480px, 800px\"\n fill\n />\n ) : (\n <div className=\"absolute inset-0 flex h-full w-full items-center justify-center\">\n <PlaceholderImage size={size === 'small' ? 16 : 24} />\n </div>\n );\n};\n\nexport { Thumbnail };\n"],"mappings":";;;;;;;AAiBA,MAAMA,aAAuC,EAC3C,WACA,QACA,OAAO,SACP,YACA,WACA,eAAe,iBACX;CACJ,MAAM,eAAe,aAAa,SAAS,IAAI;AAE/C,QACE,oBAAC;EACC,WAAW,IACT,mLACA,WACA;GACE,kBAAkB;GAClB,iBAAiB,CAAC,cAAc,SAAS;GACzC,gBAAgB,SAAS;GACzB,aAAa,SAAS;GACtB,aAAa,SAAS;GACtB,aAAa,SAAS;GACtB,UAAU,SAAS;GACpB,CACF;EACD,eAAa;YAEb,oBAAC;GAAmB,OAAO;GAAoB;IAAQ;GAC7C;;AAIhB,MAAM,sBAAsB,EAC1B,OACA,WACuD;AACvD,QAAO,QACL,oBAAC;EACC,KAAK;EACL,KAAI;EACJ,WAAU;EACV,WAAW;EACX,SAAS;EACT,OAAM;EACN;GACA,GAEF,oBAAC;EAAI,WAAU;YACb,oBAAC,oBAAiB,MAAM,SAAS,UAAU,KAAK,KAAM;GAClD"}
@@ -1,3 +1,12 @@
1
- import { t as sdk } from "../../medusa-TumrpCF2.js";
1
+ import Medusa from "@medusajs/js-sdk";
2
2
 
3
- export { sdk };
3
+ //#region src/lib/config/medusa.ts
4
+ const sdk = new Medusa({
5
+ baseUrl: process.env.NEXT_PUBLIC_MEDUSA_BACKEND_URL || "http://localhost:9000",
6
+ debug: true,
7
+ publishableKey: process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY
8
+ });
9
+
10
+ //#endregion
11
+ export { sdk };
12
+ //# sourceMappingURL=medusa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"medusa.js","names":[],"sources":["../../../src/lib/config/medusa.ts"],"sourcesContent":["import Medusa from '@medusajs/js-sdk';\n\nconst DEFAULT_MEDUSA_BACKEND_URL = 'http://localhost:9000';\n\nconst sdk = new Medusa({\n baseUrl:\n process.env.NEXT_PUBLIC_MEDUSA_BACKEND_URL || DEFAULT_MEDUSA_BACKEND_URL,\n debug: process.env.NODE_ENV === 'development',\n publishableKey: process.env.NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY,\n});\n\nexport { sdk };\n"],"mappings":";;;AAIA,MAAM,MAAM,IAAI,OAAO;CACrB,SACE,QAAQ,IAAI,kCAJmB;CAKjC,OAAO;CACP,gBAAgB,QAAQ,IAAI;CAC7B,CAAC"}
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
- import "../../apollo-client-Bw50r80c.js";
4
- import { t as useApollo } from "../../use-apollo-BxAFd1Y5.js";
3
+ import { useApollo } from "../hooks/use-apollo.js";
5
4
  import { jsx } from "react/jsx-runtime";
6
5
  import { ApolloProvider } from "@apollo/client/react";
7
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"apollo-context.js","names":[],"sources":["../../../src/lib/context/apollo-context.tsx"],"sourcesContent":["'use client';\n\nimport { PropsWithChildren } from 'react';\n\nimport { ApolloProvider } from '@apollo/client/react';\n\nimport { useApollo } from '@/lib/hooks/use-apollo';\n\nfunction ApolloClientProvider({ children }: PropsWithChildren) {\n const storedApolloClient = useApollo();\n\n return (\n <ApolloProvider client={storedApolloClient}>{children}</ApolloProvider>\n );\n}\n\nexport { ApolloClientProvider };\n"],"mappings":";;;;;;;;AAQA,SAAS,qBAAqB,EAAE,YAA+B;AAG7D,QACE,oBAAC;EAAe,QAHS,WAAW;EAGS;GAA0B"}
1
+ {"version":3,"file":"apollo-context.js","names":[],"sources":["../../../src/lib/context/apollo-context.tsx"],"sourcesContent":["'use client';\n\nimport { PropsWithChildren } from 'react';\n\nimport { ApolloProvider } from '@apollo/client/react';\n\nimport { useApollo } from '@/lib/hooks/use-apollo';\n\nfunction ApolloClientProvider({ children }: PropsWithChildren) {\n const storedApolloClient = useApollo();\n\n return (\n <ApolloProvider client={storedApolloClient}>{children}</ApolloProvider>\n );\n}\n\nexport { ApolloClientProvider };\n"],"mappings":";;;;;;;AAQA,SAAS,qBAAqB,EAAE,YAA+B;AAG7D,QACE,oBAAC;EAAe,QAHS,WAAW;EAGS;GAA0B"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import * as react_jsx_runtime15 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime16 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/lib/context/modal-context.d.ts
5
5
  interface ModalContext {
@@ -13,7 +13,7 @@ interface ModalProviderProps {
13
13
  declare const ModalProvider: ({
14
14
  children,
15
15
  close
16
- }: ModalProviderProps) => react_jsx_runtime15.JSX.Element;
16
+ }: ModalProviderProps) => react_jsx_runtime16.JSX.Element;
17
17
  declare const useModal: () => ModalContext;
18
18
  //#endregion
19
19
  export { ModalProvider, useModal };
@@ -1,5 +1,22 @@
1
1
  'use client';
2
2
 
3
- import { n as useModal, t as ModalProvider } from "../../modal-context-02cA-7jy.js";
3
+ import React, { createContext, useContext } from "react";
4
+ import { jsx } from "react/jsx-runtime";
4
5
 
5
- export { ModalProvider, useModal };
6
+ //#region src/lib/context/modal-context.tsx
7
+ const ModalContext = createContext(null);
8
+ const ModalProvider = ({ children, close }) => {
9
+ return /* @__PURE__ */ jsx(ModalContext.Provider, {
10
+ value: { close },
11
+ children
12
+ });
13
+ };
14
+ const useModal = () => {
15
+ const context = useContext(ModalContext);
16
+ if (context === null) throw new Error("useModal must be used within a ModalProvider");
17
+ return context;
18
+ };
19
+
20
+ //#endregion
21
+ export { ModalProvider, useModal };
22
+ //# sourceMappingURL=modal-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-context.js","names":[],"sources":["../../../src/lib/context/modal-context.tsx"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext } from 'react';\n\ninterface ModalContext {\n close: () => void;\n}\n\nconst ModalContext = createContext<ModalContext | null>(null);\n\ninterface ModalProviderProps {\n children?: React.ReactNode;\n close: () => void;\n}\n\nconst ModalProvider = ({ children, close }: ModalProviderProps) => {\n return (\n <ModalContext.Provider\n value={{\n close,\n }}\n >\n {children}\n </ModalContext.Provider>\n );\n};\n\nconst useModal = () => {\n const context = useContext(ModalContext);\n if (context === null) {\n throw new Error('useModal must be used within a ModalProvider');\n }\n return context;\n};\n\nexport { ModalProvider, useModal };\n"],"mappings":";;;;;;AAQA,MAAM,eAAe,cAAmC,KAAK;AAO7D,MAAM,iBAAiB,EAAE,UAAU,YAAgC;AACjE,QACE,oBAAC,aAAa;EACZ,OAAO,EACL,OACD;EAEA;GACqB;;AAI5B,MAAM,iBAAiB;CACrB,MAAM,UAAU,WAAW,aAAa;AACxC,KAAI,YAAY,KACd,OAAM,IAAI,MAAM,+CAA+C;AAEjE,QAAO"}
@@ -1,4 +1,4 @@
1
- import { K as DeleteLineItemMutation, p as Cart } from "../../graphql-CdTGi4Pp.js";
1
+ import { Cart, DeleteLineItemMutation } from "../../types/graphql.js";
2
2
  import { HttpTypes } from "@medusajs/types";
3
3
 
4
4
  //#region src/lib/data/cart.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"cart.d.ts","names":[],"sources":["../../../src/lib/data/cart.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsCA;AA0DA;AA+CA;AAuBsB,cAhIT,YAgIwB,EAUf,CAAA,MAAU,CAAV,EAAU,MAAA,EAAA,GA1IqB,OA0IrB,CA1I6B,IA0I7B,GAVK,IAAA,CAAA;cAtExB,oCAEV,QAAQ;;;;;;iBA6CW,YAAA,4CAAqD;iBAuBrD,eAAA,CAAA,GAAe;oBAUf,SAAA,CAAU"}
1
+ {"version":3,"file":"cart.d.ts","names":[],"sources":["../../../src/lib/data/cart.ts"],"sourcesContent":[],"mappings":";;;;;;;AAsCA;AA0DA;AA+CA;AAuBsB,cAhIT,YA0IS,EAAA,CAAA,MAAU,CAAA,EAAA,MAAA,EAAA,GA1IqB,OA0IrB,CA1I6B,IAgIxB,GAAA,IAAA,CAAA;cAtExB,oCAEV,QAAQ;;;;;;iBA6CW,YAAA,4CAAqD;iBAuBrD,eAAA,CAAA,GAAe;oBAUf,SAAA,CAAU"}
@@ -1,13 +1,105 @@
1
1
  'use server';
2
2
 
3
- import "../../medusa-TumrpCF2.js";
4
- import "../../apollo-client-Bw50r80c.js";
5
- import "../../product-COu5D1mS.js";
6
- import "../../cart-BNoIGQmw.js";
7
- import "../../cart-IHaLnQC4.js";
8
- import "../../cart-DH8urwwT.js";
9
- import "../../cookies-lksVIe4_.js";
10
- import "../../regions-r1AvxfT8.js";
11
- import { i as updateRegion, n as listCartOptions, r as retrieveCart, t as deleteLineItem } from "../../cart-xkcyWLfU.js";
3
+ import { sdk } from "../config/medusa.js";
4
+ import { graphqlFetch, graphqlMutation } from "../gql/apollo-client.js";
5
+ import { DELETE_LINE_ITEM_MUTATION, UPDATE_CART_MUTATION } from "../gql/mutations/cart.js";
6
+ import { GET_CART_QUERY } from "../gql/queries/cart.js";
7
+ import { medusaError } from "../utils/medusa-error.js";
8
+ import { getAuthHeaders, getCacheOptions, getCacheTag, getCartId } from "./cookies.js";
9
+ import { getRegion } from "./regions.js";
10
+ import { redirect } from "next/navigation";
11
+ import { revalidateTag } from "next/cache";
12
12
 
13
- export { deleteLineItem, listCartOptions, retrieveCart, updateRegion };
13
+ //#region src/lib/data/cart.ts
14
+ /**
15
+ * Retrieves a cart by its ID. If no ID is provided, it will use the cart ID from the cookies.
16
+ * @param cartId - optional - The ID of the cart to retrieve.
17
+ * @returns The cart object if found, or null if not found.
18
+ */
19
+ const retrieveCart = async (cartId) => {
20
+ const id = cartId || await getCartId();
21
+ if (!id) return null;
22
+ try {
23
+ return (await graphqlFetch({
24
+ query: GET_CART_QUERY,
25
+ variables: { id }
26
+ }))?.cart ?? null;
27
+ } catch (error) {
28
+ console.error("Failed to fetch cart:", error);
29
+ return null;
30
+ }
31
+ };
32
+ const updateCart = async (data) => {
33
+ const cartId = await getCartId();
34
+ if (!cartId) throw new Error("No existing cart found, please create one before updating");
35
+ try {
36
+ const cart = (await graphqlMutation({
37
+ mutation: UPDATE_CART_MUTATION,
38
+ variables: {
39
+ id: cartId,
40
+ data
41
+ }
42
+ }))?.updateCart ?? null;
43
+ if (cart) {
44
+ revalidateTag(await getCacheTag("carts"));
45
+ revalidateTag(await getCacheTag("fulfillment"));
46
+ }
47
+ return cart;
48
+ } catch (err) {
49
+ medusaError(err);
50
+ }
51
+ };
52
+ const deleteLineItem = async (lineId) => {
53
+ if (!lineId) throw new Error("Missing lineItem ID when deleting line item");
54
+ const cartId = await getCartId();
55
+ if (!cartId) throw new Error("Missing cart ID when deleting line item");
56
+ try {
57
+ const deletedLineItem = (await graphqlMutation({
58
+ mutation: DELETE_LINE_ITEM_MUTATION,
59
+ variables: {
60
+ cartId,
61
+ lineItemId: lineId
62
+ }
63
+ }))?.deleteLineItem ?? null;
64
+ if (deletedLineItem) {
65
+ revalidateTag(await getCacheTag("carts"));
66
+ revalidateTag(await getCacheTag("fulfillment"));
67
+ }
68
+ return deletedLineItem;
69
+ } catch (error) {
70
+ console.error("GraphQL deleteLineItem error:", error.message);
71
+ throw error;
72
+ }
73
+ };
74
+ /**
75
+ * Updates the countrycode param and revalidates the regions cache
76
+ * @param regionId
77
+ * @param countryCode
78
+ */
79
+ async function updateRegion(countryCode, currentPath) {
80
+ const cartId = await getCartId();
81
+ const region = await getRegion(countryCode);
82
+ if (!region) throw new Error(`Region not found for country code: ${countryCode}`);
83
+ if (cartId) {
84
+ await updateCart({ regionId: region.id });
85
+ revalidateTag(await getCacheTag("carts"));
86
+ }
87
+ revalidateTag(await getCacheTag("regions"));
88
+ revalidateTag(await getCacheTag("products"));
89
+ redirect(`/${countryCode}${currentPath}`);
90
+ }
91
+ async function listCartOptions() {
92
+ const cartId = await getCartId();
93
+ const headers = { ...await getAuthHeaders() };
94
+ const next = { ...await getCacheOptions("shippingOptions") };
95
+ return await sdk.client.fetch("/store/shipping-options", {
96
+ query: { cart_id: cartId },
97
+ next,
98
+ headers,
99
+ cache: "force-cache"
100
+ });
101
+ }
102
+
103
+ //#endregion
104
+ export { deleteLineItem, listCartOptions, retrieveCart, updateRegion };
105
+ //# sourceMappingURL=cart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cart.js","names":["error: any"],"sources":["../../../src/lib/data/cart.ts"],"sourcesContent":["'use server';\n\nimport { revalidateTag } from 'next/cache';\nimport { redirect } from 'next/navigation';\n\nimport { HttpTypes } from '@medusajs/types';\n\nimport { sdk } from '@/lib/config/medusa';\nimport { graphqlFetch, graphqlMutation } from '@/lib/gql/apollo-client';\nimport {\n DELETE_LINE_ITEM_MUTATION,\n UPDATE_CART_MUTATION,\n} from '@/lib/gql/mutations/cart';\nimport { GET_CART_QUERY } from '@/lib/gql/queries/cart';\nimport { medusaError } from '@/lib/utils/medusa-error';\nimport {\n Cart,\n DeleteLineItemMutation,\n DeleteLineItemMutationVariables,\n GetCartQuery,\n GetCartQueryVariables,\n UpdateCartMutation,\n UpdateCartMutationVariables,\n} from '@/types/graphql';\n\nimport {\n getAuthHeaders,\n getCacheOptions,\n getCacheTag,\n getCartId,\n} from './cookies';\nimport { getRegion } from './regions';\n\n/**\n * Retrieves a cart by its ID. If no ID is provided, it will use the cart ID from the cookies.\n * @param cartId - optional - The ID of the cart to retrieve.\n * @returns The cart object if found, or null if not found.\n */\nexport const retrieveCart = async (cartId?: string): Promise<Cart | null> => {\n const id = cartId || (await getCartId());\n if (!id) {\n return null;\n }\n\n try {\n const data = await graphqlFetch<GetCartQuery, GetCartQueryVariables>({\n query: GET_CART_QUERY,\n variables: { id },\n });\n\n return data?.cart ?? null;\n } catch (error) {\n console.error('Failed to fetch cart:', error);\n return null;\n }\n};\n\nconst updateCart = async (\n data: UpdateCartMutationVariables['data']\n): Promise<UpdateCartMutation['updateCart'] | null> => {\n const cartId = await getCartId();\n\n if (!cartId) {\n throw new Error(\n 'No existing cart found, please create one before updating'\n );\n }\n\n try {\n const result = await graphqlMutation<\n UpdateCartMutation,\n UpdateCartMutationVariables\n >({\n mutation: UPDATE_CART_MUTATION,\n variables: {\n id: cartId,\n data,\n },\n });\n\n const cart = result?.updateCart ?? null;\n\n if (cart) {\n const cartCacheTag = await getCacheTag('carts');\n revalidateTag(cartCacheTag);\n\n const fulfillmentCacheTag = await getCacheTag('fulfillment');\n revalidateTag(fulfillmentCacheTag);\n }\n\n return cart;\n } catch (err) {\n medusaError(err);\n }\n};\n\nexport const deleteLineItem = async (\n lineId: string\n): Promise<DeleteLineItemMutation['deleteLineItem'] | null> => {\n if (!lineId) {\n throw new Error('Missing lineItem ID when deleting line item');\n }\n\n const cartId = await getCartId();\n\n if (!cartId) {\n throw new Error('Missing cart ID when deleting line item');\n }\n\n try {\n const result = await graphqlMutation<\n DeleteLineItemMutation,\n DeleteLineItemMutationVariables\n >({\n mutation: DELETE_LINE_ITEM_MUTATION,\n variables: {\n cartId,\n lineItemId: lineId,\n },\n });\n\n const deletedLineItem = result?.deleteLineItem ?? null;\n\n if (deletedLineItem) {\n const cartCacheTag = await getCacheTag('carts');\n revalidateTag(cartCacheTag);\n\n const fulfillmentCacheTag = await getCacheTag('fulfillment');\n revalidateTag(fulfillmentCacheTag);\n }\n\n return deletedLineItem;\n } catch (error: any) {\n console.error('GraphQL deleteLineItem error:', error.message);\n throw error;\n }\n};\n\n/**\n * Updates the countrycode param and revalidates the regions cache\n * @param regionId\n * @param countryCode\n */\nexport async function updateRegion(countryCode: string, currentPath: string) {\n const cartId = await getCartId();\n const region = await getRegion(countryCode);\n\n if (!region) {\n throw new Error(`Region not found for country code: ${countryCode}`);\n }\n\n if (cartId) {\n await updateCart({ regionId: region.id });\n const cartCacheTag = await getCacheTag('carts');\n revalidateTag(cartCacheTag);\n }\n\n const regionCacheTag = await getCacheTag('regions');\n revalidateTag(regionCacheTag);\n\n const productsCacheTag = await getCacheTag('products');\n revalidateTag(productsCacheTag);\n\n redirect(`/${countryCode}${currentPath}`);\n}\n\nexport async function listCartOptions() {\n const cartId = await getCartId();\n const headers = {\n ...(await getAuthHeaders()),\n };\n const next = {\n ...(await getCacheOptions('shippingOptions')),\n };\n\n return await sdk.client.fetch<{\n shipping_options: HttpTypes.StoreCartShippingOption[];\n }>('/store/shipping-options', {\n query: { cart_id: cartId },\n next,\n headers,\n cache: 'force-cache',\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAsCA,MAAa,eAAe,OAAO,WAA0C;CAC3E,MAAM,KAAK,UAAW,MAAM,WAAW;AACvC,KAAI,CAAC,GACH,QAAO;AAGT,KAAI;AAMF,UALa,MAAM,aAAkD;GACnE,OAAO;GACP,WAAW,EAAE,IAAI;GAClB,CAAC,GAEW,QAAQ;UACd,OAAO;AACd,UAAQ,MAAM,yBAAyB,MAAM;AAC7C,SAAO;;;AAIX,MAAM,aAAa,OACjB,SACqD;CACrD,MAAM,SAAS,MAAM,WAAW;AAEhC,KAAI,CAAC,OACH,OAAM,IAAI,MACR,4DACD;AAGH,KAAI;EAYF,MAAM,QAXS,MAAM,gBAGnB;GACA,UAAU;GACV,WAAW;IACT,IAAI;IACJ;IACD;GACF,CAAC,GAEmB,cAAc;AAEnC,MAAI,MAAM;AAER,iBADqB,MAAM,YAAY,QAAQ,CACpB;AAG3B,iBAD4B,MAAM,YAAY,cAAc,CAC1B;;AAGpC,SAAO;UACA,KAAK;AACZ,cAAY,IAAI;;;AAIpB,MAAa,iBAAiB,OAC5B,WAC6D;AAC7D,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,8CAA8C;CAGhE,MAAM,SAAS,MAAM,WAAW;AAEhC,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,0CAA0C;AAG5D,KAAI;EAYF,MAAM,mBAXS,MAAM,gBAGnB;GACA,UAAU;GACV,WAAW;IACT;IACA,YAAY;IACb;GACF,CAAC,GAE8B,kBAAkB;AAElD,MAAI,iBAAiB;AAEnB,iBADqB,MAAM,YAAY,QAAQ,CACpB;AAG3B,iBAD4B,MAAM,YAAY,cAAc,CAC1B;;AAGpC,SAAO;UACAA,OAAY;AACnB,UAAQ,MAAM,iCAAiC,MAAM,QAAQ;AAC7D,QAAM;;;;;;;;AASV,eAAsB,aAAa,aAAqB,aAAqB;CAC3E,MAAM,SAAS,MAAM,WAAW;CAChC,MAAM,SAAS,MAAM,UAAU,YAAY;AAE3C,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,sCAAsC,cAAc;AAGtE,KAAI,QAAQ;AACV,QAAM,WAAW,EAAE,UAAU,OAAO,IAAI,CAAC;AAEzC,gBADqB,MAAM,YAAY,QAAQ,CACpB;;AAI7B,eADuB,MAAM,YAAY,UAAU,CACtB;AAG7B,eADyB,MAAM,YAAY,WAAW,CACvB;AAE/B,UAAS,IAAI,cAAc,cAAc;;AAG3C,eAAsB,kBAAkB;CACtC,MAAM,SAAS,MAAM,WAAW;CAChC,MAAM,UAAU,EACd,GAAI,MAAM,gBAAgB,EAC3B;CACD,MAAM,OAAO,EACX,GAAI,MAAM,gBAAgB,kBAAkB,EAC7C;AAED,QAAO,MAAM,IAAI,OAAO,MAErB,2BAA2B;EAC5B,OAAO,EAAE,SAAS,QAAQ;EAC1B;EACA;EACA,OAAO;EACR,CAAC"}
@@ -1,4 +1,4 @@
1
- import { vn as ProductCategoryFragment } from "../../graphql-CdTGi4Pp.js";
1
+ import { ProductCategoryFragment } from "../../types/graphql.js";
2
2
 
3
3
  //#region src/lib/data/categories.d.ts
4
4
  declare const listCategories: () => Promise<({
@@ -1,6 +1,16 @@
1
- import "../../apollo-client-Bw50r80c.js";
2
- import "../../product-COu5D1mS.js";
3
- import "../../product-C3HQUIgX.js";
4
- import { t as listCategories } from "../../categories-B-RYCIZ3.js";
1
+ import { graphqlFetch } from "../gql/apollo-client.js";
2
+ import { GET_PRODUCT_CATEGORIES_QUERY } from "../gql/queries/product.js";
5
3
 
6
- export { listCategories };
4
+ //#region src/lib/data/categories.ts
5
+ const listCategories = async () => {
6
+ try {
7
+ return (await graphqlFetch({ query: GET_PRODUCT_CATEGORIES_QUERY }))?.productCategories || [];
8
+ } catch (error) {
9
+ console.error("Error fetching categories from BFF:", error);
10
+ return [];
11
+ }
12
+ };
13
+
14
+ //#endregion
15
+ export { listCategories };
16
+ //# sourceMappingURL=categories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"categories.js","names":[],"sources":["../../../src/lib/data/categories.ts"],"sourcesContent":["import { graphqlFetch } from '@/lib/gql/apollo-client';\nimport { GET_PRODUCT_CATEGORIES_QUERY } from '@/lib/gql/queries/product';\nimport {\n GetProductCategoriesQuery,\n GetProductCategoriesQueryVariables,\n} from '@/types/graphql';\n\nexport const listCategories = async () => {\n try {\n const data = await graphqlFetch<\n GetProductCategoriesQuery,\n GetProductCategoriesQueryVariables\n >({\n query: GET_PRODUCT_CATEGORIES_QUERY,\n });\n\n return data?.productCategories || [];\n } catch (error) {\n console.error('Error fetching categories from BFF:', error);\n return [];\n }\n};\n"],"mappings":";;;;AAOA,MAAa,iBAAiB,YAAY;AACxC,KAAI;AAQF,UAPa,MAAM,aAGjB,EACA,OAAO,8BACR,CAAC,GAEW,qBAAqB,EAAE;UAC7B,OAAO;AACd,UAAQ,MAAM,uCAAuC,MAAM;AAC3D,SAAO,EAAE"}
@@ -1,4 +1,4 @@
1
- import { bn as ProductCollectionFragment, y as CollectionProductsFragment } from "../../graphql-CdTGi4Pp.js";
1
+ import { CollectionProductsFragment, ProductCollectionFragment } from "../../types/graphql.js";
2
2
 
3
3
  //#region src/lib/data/collections.d.ts
4
4
  declare const listCollections: (queryParams?: Record<string, string>) => Promise<{