@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,137 +0,0 @@
1
- import { t as Modal } from "./modal-BASYY-YM.js";
2
- import { t as useSearch } from "./use-search-VX-u8o1D.js";
3
- import { useEffect, useRef, useState } from "react";
4
- import { usePathname } from "next/navigation";
5
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
- import { Button } from "@medusajs/ui";
7
- import Link from "next/link";
8
- import Image from "next/image";
9
- import { PlaceholderImage } from "@gfed-medusa/sf-lib-ui/icons/placeholder-image";
10
- import DOMPurify from "isomorphic-dompurify";
11
- import { cn } from "@gfed-medusa/sf-lib-ui/lib/utils";
12
-
13
- //#region src/components/search-modal/index.tsx
14
- function SearchModal({ buttonClassName }) {
15
- const [isOpen, setIsOpen] = useState(false);
16
- const pathname = usePathname();
17
- const { query, setQuery, results, loading, error, isTyping } = useSearch();
18
- useEffect(() => {
19
- setIsOpen(false);
20
- }, [pathname]);
21
- useEffect(() => {
22
- if (!isOpen) setQuery("");
23
- }, [isOpen, setQuery]);
24
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
25
- className: cn("small:flex hidden h-full items-center gap-x-6", buttonClassName),
26
- children: /* @__PURE__ */ jsx(Button, {
27
- onClick: () => setIsOpen(true),
28
- variant: "transparent",
29
- className: "text-small-regular hover:text-ui-fg-base px-0 hover:bg-transparent focus:!bg-transparent",
30
- "data-testid": "search-button",
31
- children: "Search"
32
- })
33
- }), /* @__PURE__ */ jsx(Modal, {
34
- isOpen,
35
- close: () => setIsOpen(false),
36
- "aria-label": "Search modal",
37
- children: /* @__PURE__ */ jsxs("div", {
38
- className: "flex h-full max-h-[75vh] min-h-0 flex-col",
39
- children: [/* @__PURE__ */ jsx("div", {
40
- className: "shrink-0",
41
- children: /* @__PURE__ */ jsx(SearchBox, {
42
- query,
43
- setQuery,
44
- loading
45
- })
46
- }), /* @__PURE__ */ jsx("div", {
47
- className: "mt-4 min-h-0 flex-1 overflow-y-auto",
48
- children: /* @__PURE__ */ jsx(SearchResults, {
49
- results,
50
- loading,
51
- error,
52
- query,
53
- isTyping
54
- })
55
- })]
56
- })
57
- })] });
58
- }
59
- const SearchBox = ({ query, setQuery, loading }) => {
60
- const inputRef = useRef(null);
61
- useEffect(() => {
62
- if (inputRef.current && document.activeElement !== inputRef.current) inputRef.current.focus();
63
- }, [loading]);
64
- return /* @__PURE__ */ jsx("div", {
65
- className: "relative w-full",
66
- children: /* @__PURE__ */ jsx("input", {
67
- ref: inputRef,
68
- type: "text",
69
- value: query,
70
- onChange: (e) => setQuery(e.target.value),
71
- placeholder: "Search products...",
72
- 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",
73
- disabled: loading,
74
- autoFocus: true,
75
- "data-testid": "search-input"
76
- })
77
- });
78
- };
79
- const SearchResults = ({ results, loading, error, query, isTyping }) => {
80
- if (loading) return /* @__PURE__ */ jsx("div", {
81
- className: "flex min-h-full items-center justify-center",
82
- children: /* @__PURE__ */ jsxs("div", {
83
- className: "text-center",
84
- children: [/* @__PURE__ */ jsx("div", { className: "mx-auto h-8 w-8 animate-spin rounded-full border-b-2 border-blue-500" }), /* @__PURE__ */ jsx("p", {
85
- className: "mt-2 text-sm text-gray-500",
86
- children: "Searching..."
87
- })]
88
- })
89
- });
90
- if (error) return /* @__PURE__ */ jsx("div", {
91
- className: "flex min-h-full items-center justify-center text-rose-600",
92
- children: /* @__PURE__ */ jsxs("p", { children: ["Error: ", error] })
93
- });
94
- if (query.trim() && !isTyping && !loading && (!results || !results.items || results.items.length === 0)) return /* @__PURE__ */ jsx("div", {
95
- className: "flex min-h-full items-center justify-center text-gray-500",
96
- children: /* @__PURE__ */ jsx("p", { children: "No products found" })
97
- });
98
- if (!query.trim()) return null;
99
- return /* @__PURE__ */ jsx("div", { children: results?.items?.map((hit) => /* @__PURE__ */ jsx(Hit, { hit }, hit.id)) });
100
- };
101
- const Hit = ({ hit }) => {
102
- return /* @__PURE__ */ jsxs("div", {
103
- className: "relative mt-4 flex flex-row gap-x-2",
104
- "data-testid": "search-hit",
105
- children: [
106
- /* @__PURE__ */ jsx("div", {
107
- className: "relative h-[100px] w-[100px] shrink-0 overflow-hidden border border-gray-200",
108
- children: hit.thumbnail ? /* @__PURE__ */ jsx(Image, {
109
- src: hit.thumbnail,
110
- alt: hit.title ?? "Product Image",
111
- width: 100,
112
- height: 100,
113
- className: "aspect-square object-cover"
114
- }) : /* @__PURE__ */ jsx("div", {
115
- className: "border-grey-400 flex h-[125px] w-[100px] items-center justify-center self-start border",
116
- children: /* @__PURE__ */ jsx(PlaceholderImage, { size: 40 })
117
- })
118
- }),
119
- /* @__PURE__ */ jsxs("div", {
120
- className: "flex flex-col gap-y-1",
121
- children: [/* @__PURE__ */ jsx("h3", { children: hit.title }), /* @__PURE__ */ jsx("p", {
122
- className: "text-sm text-gray-500",
123
- dangerouslySetInnerHTML: { __html: DOMPurify.sanitize(hit.description ?? "") }
124
- })]
125
- }),
126
- /* @__PURE__ */ jsx(Link, {
127
- href: `/products/${hit.handle}`,
128
- className: "absolute top-0 right-0 h-full w-full",
129
- "aria-label": `View Product: ${hit.title}`
130
- })
131
- ]
132
- });
133
- };
134
-
135
- //#endregion
136
- export { SearchModal as t };
137
- //# sourceMappingURL=search-modal-DaXadYWM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search-modal-DaXadYWM.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 Link from 'next/link';\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 <Link\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":";;;;;;;;;;;;;AAuBA,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,97 +0,0 @@
1
- import { t as LocalizedClientLink } from "./localized-client-link-CthmRcvb.js";
2
- import { t as LayoutCountrySelect } from "./layout-country-select-C7Ra-opl.js";
3
- import { Fragment } from "react";
4
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
5
- import { Popover, PopoverPanel, Transition } from "@headlessui/react";
6
- import { Text, clx, useToggleState } from "@medusajs/ui";
7
- import { ArrowRightMini, XMark } from "@medusajs/icons";
8
-
9
- //#region src/components/side-menu/index.tsx
10
- const SideMenuItems = {
11
- Home: "/",
12
- Store: "/store",
13
- Account: "/account",
14
- Cart: "/cart"
15
- };
16
- const SideMenu = ({ regions }) => {
17
- const toggleState = useToggleState();
18
- return /* @__PURE__ */ jsx("div", {
19
- className: "h-full",
20
- children: /* @__PURE__ */ jsx("div", {
21
- className: "flex h-full items-center",
22
- children: /* @__PURE__ */ jsx(Popover, {
23
- className: "flex h-full",
24
- children: ({ open, close }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
25
- className: "relative flex h-full",
26
- children: /* @__PURE__ */ jsx(Popover.Button, {
27
- "data-testid": "nav-menu-button",
28
- className: "hover:text-ui-fg-base relative flex h-full items-center transition-all duration-200 ease-out focus:outline-none",
29
- children: "Menu"
30
- })
31
- }), /* @__PURE__ */ jsx(Transition, {
32
- show: open,
33
- as: Fragment,
34
- enter: "transition ease-out duration-150",
35
- enterFrom: "opacity-0",
36
- enterTo: "opacity-100 backdrop-blur-2xl",
37
- leave: "transition ease-in duration-150",
38
- leaveFrom: "opacity-100 backdrop-blur-2xl",
39
- leaveTo: "opacity-0",
40
- children: /* @__PURE__ */ jsx(PopoverPanel, {
41
- 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",
42
- children: /* @__PURE__ */ jsxs("div", {
43
- "data-testid": "nav-menu-popup",
44
- className: "rounded-rounded flex h-full flex-col justify-between bg-[rgba(3,7,18,0.5)] p-6",
45
- children: [
46
- /* @__PURE__ */ jsx("div", {
47
- className: "flex justify-end",
48
- id: "xmark",
49
- children: /* @__PURE__ */ jsx("button", {
50
- "data-testid": "close-menu-button",
51
- onClick: close,
52
- children: /* @__PURE__ */ jsx(XMark, {})
53
- })
54
- }),
55
- /* @__PURE__ */ jsx("ul", {
56
- className: "flex flex-col items-start justify-start gap-6",
57
- children: Object.entries(SideMenuItems).map(([name, href]) => {
58
- return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(LocalizedClientLink, {
59
- href,
60
- className: "hover:text-ui-fg-disabled text-3xl leading-10",
61
- onClick: close,
62
- "data-testid": `${name.toLowerCase()}-link`,
63
- children: name
64
- }) }, name);
65
- })
66
- }),
67
- /* @__PURE__ */ jsxs("div", {
68
- className: "flex flex-col gap-y-6",
69
- children: [/* @__PURE__ */ jsxs("div", {
70
- className: "flex justify-between",
71
- onMouseEnter: toggleState.open,
72
- onMouseLeave: toggleState.close,
73
- children: [regions && /* @__PURE__ */ jsx(LayoutCountrySelect, {
74
- toggleState,
75
- regions
76
- }), /* @__PURE__ */ jsx(ArrowRightMini, { className: clx("transition-transform duration-150", toggleState.state ? "-rotate-90" : "") })]
77
- }), /* @__PURE__ */ jsxs(Text, {
78
- className: "txt-compact-small flex justify-between",
79
- children: [
80
- "© ",
81
- (/* @__PURE__ */ new Date()).getFullYear(),
82
- " Medusa Store. All rights reserved."
83
- ]
84
- })]
85
- })
86
- ]
87
- })
88
- })
89
- })] })
90
- })
91
- })
92
- });
93
- };
94
-
95
- //#endregion
96
- export { SideMenu as t };
97
- //# sourceMappingURL=side-menu-B6IjTd5M.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"side-menu-B6IjTd5M.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,44 +0,0 @@
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";
6
-
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 as t };
44
- //# sourceMappingURL=thumbnail-C0TU3rh-.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"thumbnail-C0TU3rh-.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,11 +0,0 @@
1
- import { a as initializeApollo } from "./apollo-client-Bw50r80c.js";
2
- import { useMemo } from "react";
3
-
4
- //#region src/lib/hooks/use-apollo.tsx
5
- function useApollo() {
6
- return useMemo(initializeApollo, []);
7
- }
8
-
9
- //#endregion
10
- export { useApollo as t };
11
- //# sourceMappingURL=use-apollo-BxAFd1Y5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-apollo-BxAFd1Y5.js","names":[],"sources":["../src/lib/hooks/use-apollo.tsx"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { initializeApollo } from '@/lib/gql/apollo-client';\n\nexport function useApollo() {\n const storedClient = useMemo(initializeApollo, []);\n\n return storedClient;\n}\n"],"mappings":";;;;AAIA,SAAgB,YAAY;AAG1B,QAFqB,QAAQ,kBAAkB,EAAE,CAAC"}
@@ -1,67 +0,0 @@
1
- import { t as searchSuggestions } from "./search-D7Gw7jAk.js";
2
- import { useCallback, useEffect, useState } from "react";
3
-
4
- //#region src/lib/hooks/use-search.tsx
5
- const DEBOUNCE_MS = 500;
6
- const useSearch = () => {
7
- const [query, setQuery] = useState("");
8
- const [results, setResults] = useState(null);
9
- const [loading, setLoading] = useState(false);
10
- const [error, setError] = useState(null);
11
- const [isTyping, setIsTyping] = useState(false);
12
- const [debounceTimer, setDebounceTimer] = useState(null);
13
- const performSearch = useCallback(async (searchQuery) => {
14
- if (!searchQuery.trim()) {
15
- setResults(null);
16
- return;
17
- }
18
- setLoading(true);
19
- setError(null);
20
- try {
21
- setResults(await searchSuggestions({
22
- query: searchQuery,
23
- hitsPerPage: 20
24
- }));
25
- } catch (err) {
26
- setError(err instanceof Error ? err.message : "Search failed");
27
- console.error("Search error:", err);
28
- } finally {
29
- setLoading(false);
30
- }
31
- }, []);
32
- const search = useCallback(async (searchQuery) => {
33
- await performSearch(searchQuery);
34
- }, [performSearch]);
35
- const handleQueryChange = useCallback((newQuery) => {
36
- setQuery(newQuery);
37
- if (debounceTimer) clearTimeout(debounceTimer);
38
- if (newQuery.trim()) setIsTyping(true);
39
- else {
40
- setIsTyping(false);
41
- setResults(null);
42
- return;
43
- }
44
- setDebounceTimer(setTimeout(() => {
45
- setIsTyping(false);
46
- performSearch(newQuery);
47
- }, DEBOUNCE_MS));
48
- }, [debounceTimer, performSearch]);
49
- useEffect(() => {
50
- return () => {
51
- if (debounceTimer) clearTimeout(debounceTimer);
52
- };
53
- }, [debounceTimer]);
54
- return {
55
- query,
56
- setQuery: handleQueryChange,
57
- results,
58
- loading,
59
- error,
60
- search,
61
- isTyping
62
- };
63
- };
64
-
65
- //#endregion
66
- export { useSearch as t };
67
- //# sourceMappingURL=use-search-VX-u8o1D.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-search-VX-u8o1D.js","names":[],"sources":["../src/lib/hooks/use-search.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { searchSuggestions } from '@/lib/data/search';\nimport { ProductHit } from '@/types/graphql';\n\nexport type UseSearchOptions = {\n hitsPerPage?: number;\n debounceMs?: number;\n};\n\nexport type SearchResult = {\n items: ProductHit[];\n};\n\nconst DEBOUNCE_MS = 500;\n\nexport const useSearch = () => {\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<SearchResult | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isTyping, setIsTyping] = useState(false);\n const [debounceTimer, setDebounceTimer] = useState<NodeJS.Timeout | null>(\n null\n );\n\n const performSearch = useCallback(async (searchQuery: string) => {\n if (!searchQuery.trim()) {\n setResults(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const searchParams = {\n query: searchQuery,\n hitsPerPage: 20,\n };\n\n const searchResults = await searchSuggestions(searchParams);\n setResults(searchResults);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Search failed';\n setError(errorMessage);\n console.error('Search error:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const search = useCallback(\n async (searchQuery: string) => {\n await performSearch(searchQuery);\n },\n [performSearch]\n );\n\n const handleQueryChange = useCallback(\n (newQuery: string) => {\n setQuery(newQuery);\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n if (newQuery.trim()) {\n setIsTyping(true);\n } else {\n setIsTyping(false);\n setResults(null);\n return;\n }\n\n const timer = setTimeout(() => {\n setIsTyping(false);\n performSearch(newQuery);\n }, DEBOUNCE_MS);\n\n setDebounceTimer(timer);\n },\n [debounceTimer, performSearch]\n );\n\n useEffect(() => {\n return () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n };\n }, [debounceTimer]);\n\n return {\n query,\n setQuery: handleQueryChange,\n results,\n loading,\n error,\n search,\n isTyping,\n };\n};\n"],"mappings":";;;;AAgBA,MAAM,cAAc;AAEpB,MAAa,kBAAkB;CAC7B,MAAM,CAAC,OAAO,YAAY,SAAS,GAAG;CACtC,MAAM,CAAC,SAAS,cAAc,SAA8B,KAAK;CACjE,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;CACvD,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;CAC/C,MAAM,CAAC,eAAe,oBAAoB,SACxC,KACD;CAED,MAAM,gBAAgB,YAAY,OAAO,gBAAwB;AAC/D,MAAI,CAAC,YAAY,MAAM,EAAE;AACvB,cAAW,KAAK;AAChB;;AAGF,aAAW,KAAK;AAChB,WAAS,KAAK;AAEd,MAAI;AAOF,cADsB,MAAM,kBALP;IACnB,OAAO;IACP,aAAa;IACd,CAE0D,CAClC;WAClB,KAAK;AAEZ,YADqB,eAAe,QAAQ,IAAI,UAAU,gBACpC;AACtB,WAAQ,MAAM,iBAAiB,IAAI;YAC3B;AACR,cAAW,MAAM;;IAElB,EAAE,CAAC;CAEN,MAAM,SAAS,YACb,OAAO,gBAAwB;AAC7B,QAAM,cAAc,YAAY;IAElC,CAAC,cAAc,CAChB;CAED,MAAM,oBAAoB,aACvB,aAAqB;AACpB,WAAS,SAAS;AAElB,MAAI,cACF,cAAa,cAAc;AAG7B,MAAI,SAAS,MAAM,CACjB,aAAY,KAAK;OACZ;AACL,eAAY,MAAM;AAClB,cAAW,KAAK;AAChB;;AAQF,mBALc,iBAAiB;AAC7B,eAAY,MAAM;AAClB,iBAAc,SAAS;KACtB,YAAY,CAEQ;IAEzB,CAAC,eAAe,cAAc,CAC/B;AAED,iBAAgB;AACd,eAAa;AACX,OAAI,cACF,cAAa,cAAc;;IAG9B,CAAC,cAAc,CAAC;AAEnB,QAAO;EACL;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACD"}
@@ -1,23 +0,0 @@
1
- //#region src/lib/hooks/use-toggle-state.d.ts
2
- type StateType = [boolean, () => void, () => void, () => void] & {
3
- state: boolean;
4
- open: () => void;
5
- close: () => void;
6
- toggle: () => void;
7
- };
8
- /**
9
- *
10
- * @param initialState - boolean
11
- * @returns An array like object with `state`, `open`, `close`, and `toggle` properties
12
- * to allow both object and array destructuring
13
- *
14
- * ```
15
- * const [showModal, openModal, closeModal, toggleModal] = useToggleState()
16
- * // or
17
- * const { state, open, close, toggle } = useToggleState()
18
- * ```
19
- */
20
- declare const useToggleState: (initialState?: boolean) => StateType;
21
- //#endregion
22
- export { useToggleState as n, StateType as t };
23
- //# sourceMappingURL=use-toggle-state-DI4Gwlfj.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-toggle-state-DI4Gwlfj.d.ts","names":[],"sources":["../src/lib/hooks/use-toggle-state.tsx"],"sourcesContent":[],"mappings":";KAEY,SAAA;EAAA,KAAA,EAAA,OAAS;EAoBf,IAAA,EAAA,GAAA,GAAA,IAAA;;;;;;;;;;;;;;;;cAAA,4CAAsC"}