@shopify/shop-minis-react 0.5.1 → 0.6.1

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.
@@ -0,0 +1,18 @@
1
+ import { useShopActions as n } from "../../internal/useShopActions.js";
2
+ import { useShopActionInfiniteQuery as u } from "../../internal/reactQuery/useShopActionInfiniteQuery.js";
3
+ const d = (s) => {
4
+ const { getProductReviews: o } = n(), { id: e, skip: r = !1, ...t } = s, { data: i, ...c } = u(
5
+ ["productReviews", e, t],
6
+ o,
7
+ { id: e, ...t },
8
+ { skip: r }
9
+ );
10
+ return {
11
+ ...c,
12
+ reviews: i
13
+ };
14
+ };
15
+ export {
16
+ d as useProductReviews
17
+ };
18
+ //# sourceMappingURL=useProductReviews.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProductReviews.js","sources":["../../../src/hooks/product/useProductReviews.ts"],"sourcesContent":["import {useShopActionInfiniteQuery} from '../../internal/reactQuery'\nimport {useShopActions} from '../../internal/useShopActions'\nimport {\n PaginatedDataHookOptionsBase,\n PaginatedDataHookReturnsBase,\n ProductReview,\n} from '../../types'\n\nexport interface UseProductReviewsParams extends PaginatedDataHookOptionsBase {\n /**\n * The product ID to fetch reviews for.\n */\n id: string\n}\n\ninterface UseProductReviewsReturns extends PaginatedDataHookReturnsBase {\n /**\n * The product reviews returned from the query.\n */\n reviews: ProductReview[] | null\n}\n\nexport const useProductReviews = (\n params: UseProductReviewsParams\n): UseProductReviewsReturns => {\n const {getProductReviews} = useShopActions()\n const {id, skip = false, ...restParams} = params\n\n const {data, ...rest} = useShopActionInfiniteQuery(\n ['productReviews', id, restParams],\n getProductReviews,\n {id, ...restParams},\n {skip}\n )\n\n return {\n ...rest,\n reviews: data,\n }\n}\n"],"names":["useProductReviews","params","getProductReviews","useShopActions","id","skip","restParams","data","rest","useShopActionInfiniteQuery"],"mappings":";;AAsBa,MAAAA,IAAoB,CAC/BC,MAC6B;AACvB,QAAA,EAAC,mBAAAC,EAAiB,IAAIC,EAAe,GACrC,EAAC,IAAAC,GAAI,MAAAC,IAAO,IAAO,GAAGC,EAAc,IAAAL,GAEpC,EAAC,MAAAM,GAAM,GAAGC,EAAA,IAAQC;AAAA,IACtB,CAAC,kBAAkBL,GAAIE,CAAU;AAAA,IACjCJ;AAAA,IACA,EAAC,IAAAE,GAAI,GAAGE,EAAU;AAAA,IAClB,EAAC,MAAAD,EAAI;AAAA,EACP;AAEO,SAAA;AAAA,IACL,GAAGG;AAAA,IACH,SAASD;AAAA,EACX;AACF;"}
package/dist/index.js CHANGED
@@ -2,12 +2,12 @@ import { DATA_NAVIGATION_TYPE_ATTRIBUTE as o, NAVIGATION_TYPES as t } from "./ty
2
2
  import { MinisContainer as i } from "./components/MinisContainer.js";
3
3
  import { AddToCartButton as n } from "./components/commerce/add-to-cart.js";
4
4
  import { BuyNowButton as s } from "./components/commerce/buy-now.js";
5
- import { ProductCard as u, ProductCardBadge as f, ProductCardContainer as x, ProductCardFavoriteButton as c, ProductCardImage as d, ProductCardImageContainer as C, ProductCardInfo as g, ProductCardPrice as S, ProductCardReviewStars as A, ProductCardTitle as D } from "./components/commerce/product-card.js";
5
+ import { ProductCard as u, ProductCardBadge as f, ProductCardContainer as x, ProductCardFavoriteButton as c, ProductCardImage as d, ProductCardImageContainer as C, ProductCardInfo as g, ProductCardPrice as S, ProductCardReviewStars as D, ProductCardTitle as A } from "./components/commerce/product-card.js";
6
6
  import { ProductLink as T } from "./components/commerce/product-link.js";
7
- import { MerchantCard as I, MerchantCardContainer as R, MerchantCardHeader as B, MerchantCardInfo as E, MerchantCardName as M, MerchantCardRating as v } from "./components/commerce/merchant-card.js";
7
+ import { MerchantCard as I, MerchantCardContainer as R, MerchantCardHeader as v, MerchantCardInfo as w, MerchantCardName as B, MerchantCardRating as E } from "./components/commerce/merchant-card.js";
8
8
  import { ProductCardSkeleton as F } from "./components/commerce/product-card-skeleton.js";
9
- import { MerchantCardSkeleton as L } from "./components/commerce/merchant-card-skeleton.js";
10
- import { QuantitySelector as N } from "./components/commerce/quantity-selector.js";
9
+ import { MerchantCardSkeleton as b } from "./components/commerce/merchant-card-skeleton.js";
10
+ import { QuantitySelector as k } from "./components/commerce/quantity-selector.js";
11
11
  import { Search as O, SearchInput as _, SearchProvider as y, SearchResultsList as G } from "./components/commerce/search.js";
12
12
  import { FavoriteButton as V } from "./components/commerce/favorite-button.js";
13
13
  import { ImageContentWrapper as W } from "./components/content/image-content-wrapper.js";
@@ -24,20 +24,20 @@ import { VideoPlayer as lr } from "./components/atoms/video-player.js";
24
24
  import { TextInput as fr } from "./components/atoms/text-input.js";
25
25
  import { ContentWrapper as cr } from "./components/atoms/content-wrapper.js";
26
26
  import { ProductVariantPrice as Cr } from "./components/atoms/product-variant-price.js";
27
- import { Accordion as Sr, AccordionContent as Ar, AccordionItem as Dr, AccordionTrigger as Pr } from "./components/ui/accordion.js";
27
+ import { Accordion as Sr, AccordionContent as Dr, AccordionItem as Ar, AccordionTrigger as Pr } from "./components/ui/accordion.js";
28
28
  import { Alert as hr, AlertDescription as Ir, AlertTitle as Rr } from "./components/ui/alert.js";
29
- import { AlertDialog as Er, AlertDialogAction as Mr, AlertDialogCancel as vr, AlertDialogContent as wr, AlertDialogDescription as Fr, AlertDialogFooter as Ur, AlertDialogHeader as Lr, AlertDialogOverlay as br, AlertDialogPortal as Nr, AlertDialogTitle as kr, AlertDialogTrigger as Or } from "./components/ui/alert-dialog.js";
29
+ import { AlertDialog as wr, AlertDialogAction as Br, AlertDialogCancel as Er, AlertDialogContent as Mr, AlertDialogDescription as Fr, AlertDialogFooter as Ur, AlertDialogHeader as br, AlertDialogOverlay as Lr, AlertDialogPortal as kr, AlertDialogTitle as Nr, AlertDialogTrigger as Or } from "./components/ui/alert-dialog.js";
30
30
  import { Avatar as yr, AvatarFallback as Gr, AvatarImage as Hr } from "./components/ui/avatar.js";
31
31
  import { Badge as zr, badgeVariants as Wr } from "./components/ui/badge.js";
32
32
  import { Card as qr, CardAction as Kr, CardContent as Qr, CardDescription as Zr, CardFooter as jr, CardHeader as Jr, CardTitle as Xr } from "./components/ui/card.js";
33
33
  import { Carousel as re, CarouselContent as ee, CarouselItem as oe, CarouselNext as te, CarouselPrevious as ae } from "./components/ui/carousel.js";
34
34
  import { Checkbox as pe } from "./components/ui/checkbox.js";
35
35
  import { Dialog as me, DialogClose as se, DialogContent as le, DialogDescription as ue, DialogFooter as fe, DialogHeader as xe, DialogOverlay as ce, DialogPortal as de, DialogTitle as Ce, DialogTrigger as ge } from "./components/ui/dialog.js";
36
- import { Drawer as Ae, DrawerClose as De, DrawerContent as Pe, DrawerDescription as Te, DrawerFooter as he, DrawerHeader as Ie, DrawerOverlay as Re, DrawerPortal as Be, DrawerTitle as Ee, DrawerTrigger as Me } from "./components/ui/drawer.js";
37
- import { Input as we } from "./components/ui/input.js";
36
+ import { Drawer as De, DrawerClose as Ae, DrawerContent as Pe, DrawerDescription as Te, DrawerFooter as he, DrawerHeader as Ie, DrawerOverlay as Re, DrawerPortal as ve, DrawerTitle as we, DrawerTrigger as Be } from "./components/ui/drawer.js";
37
+ import { Input as Me } from "./components/ui/input.js";
38
38
  import { Label as Ue } from "./components/ui/label.js";
39
- import { Progress as be } from "./components/ui/progress.js";
40
- import { RadioGroup as ke, RadioGroupItem as Oe } from "./components/ui/radio-group.js";
39
+ import { Progress as Le } from "./components/ui/progress.js";
40
+ import { RadioGroup as Ne, RadioGroupItem as Oe } from "./components/ui/radio-group.js";
41
41
  import { ResizableHandle as ye, ResizablePanel as Ge, ResizablePanelGroup as He } from "./components/ui/resizable.js";
42
42
  import { ScrollArea as ze, ScrollBar as We } from "./components/ui/scroll-area.js";
43
43
  import { Select as qe, SelectContent as Ke, SelectGroup as Qe, SelectItem as Ze, SelectLabel as je, SelectScrollDownButton as Je, SelectScrollUpButton as Xe, SelectSeparator as $e, SelectTrigger as ro, SelectValue as eo } from "./components/ui/select.js";
@@ -45,15 +45,15 @@ import { Separator as to } from "./components/ui/separator.js";
45
45
  import { Sheet as io, SheetClose as po, SheetContent as no, SheetDescription as mo, SheetFooter as so, SheetHeader as lo, SheetTitle as uo, SheetTrigger as fo } from "./components/ui/sheet.js";
46
46
  import { Toaster as co } from "./components/ui/sonner.js";
47
47
  import { toast as go } from "./shop-minis-react/node_modules/.pnpm/sonner@2.0.5_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/sonner/dist/index.js";
48
- import { Skeleton as Ao } from "./components/ui/skeleton.js";
48
+ import { Skeleton as Do } from "./components/ui/skeleton.js";
49
49
  import { useRecentProducts as Po } from "./hooks/user/useRecentProducts.js";
50
50
  import { useRecentShops as ho } from "./hooks/user/useRecentShops.js";
51
51
  import { useSavedProducts as Ro } from "./hooks/user/useSavedProducts.js";
52
- import { useSavedProductsActions as Eo } from "./hooks/user/useSavedProductsActions.js";
53
- import { useFollowedShops as vo } from "./hooks/user/useFollowedShops.js";
52
+ import { useSavedProductsActions as wo } from "./hooks/user/useSavedProductsActions.js";
53
+ import { useFollowedShops as Eo } from "./hooks/user/useFollowedShops.js";
54
54
  import { useFollowedShopsActions as Fo } from "./hooks/user/useFollowedShopsActions.js";
55
- import { useCurrentUser as Lo } from "./hooks/user/useCurrentUser.js";
56
- import { useOrders as No } from "./hooks/user/useOrders.js";
55
+ import { useCurrentUser as bo } from "./hooks/user/useCurrentUser.js";
56
+ import { useOrders as ko } from "./hooks/user/useOrders.js";
57
57
  import { useBuyerAttributes as Oo } from "./hooks/user/useBuyerAttributes.js";
58
58
  import { useGenerateUserToken as yo } from "./hooks/user/useGenerateUserToken.js";
59
59
  import { useProductListActions as Ho } from "./hooks/product/useProductListActions.js";
@@ -63,58 +63,60 @@ import { useProduct as Ko } from "./hooks/product/useProduct.js";
63
63
  import { useProducts as Zo } from "./hooks/product/useProducts.js";
64
64
  import { useProductVariants as Jo } from "./hooks/product/useProductVariants.js";
65
65
  import { useProductMedia as $o } from "./hooks/product/useProductMedia.js";
66
- import { useProductSearch as et } from "./hooks/product/useProductSearch.js";
67
- import { useRecommendedProducts as tt } from "./hooks/product/useRecommendedProducts.js";
68
- import { usePopularProducts as it } from "./hooks/product/usePopularProducts.js";
69
- import { useAsyncStorage as nt } from "./hooks/storage/useAsyncStorage.js";
70
- import { useSecureStorage as st } from "./hooks/storage/useSecureStorage.js";
71
- import { useImageUpload as ut } from "./hooks/storage/useImageUpload.js";
72
- import { useShopNavigation as xt } from "./hooks/navigation/useShopNavigation.js";
73
- import { useCloseMini as dt } from "./hooks/navigation/useCloseMini.js";
74
- import { useDeeplink as gt } from "./hooks/navigation/useDeeplink.js";
75
- import { useNavigateWithTransition as At } from "./hooks/navigation/useNavigateWithTransition.js";
76
- import { useShop as Pt } from "./hooks/shop/useShop.js";
77
- import { useRecommendedShops as ht } from "./hooks/shop/useRecommendedShops.js";
78
- import { useCreateImageContent as Rt } from "./hooks/content/useCreateImageContent.js";
66
+ import { useProductReviews as et } from "./hooks/product/useProductReviews.js";
67
+ import { useProductSearch as tt } from "./hooks/product/useProductSearch.js";
68
+ import { useRecommendedProducts as it } from "./hooks/product/useRecommendedProducts.js";
69
+ import { usePopularProducts as nt } from "./hooks/product/usePopularProducts.js";
70
+ import { useAsyncStorage as st } from "./hooks/storage/useAsyncStorage.js";
71
+ import { useSecureStorage as ut } from "./hooks/storage/useSecureStorage.js";
72
+ import { useImageUpload as xt } from "./hooks/storage/useImageUpload.js";
73
+ import { useShopNavigation as dt } from "./hooks/navigation/useShopNavigation.js";
74
+ import { useCloseMini as gt } from "./hooks/navigation/useCloseMini.js";
75
+ import { useDeeplink as Dt } from "./hooks/navigation/useDeeplink.js";
76
+ import { useNavigateWithTransition as Pt } from "./hooks/navigation/useNavigateWithTransition.js";
77
+ import { useShop as ht } from "./hooks/shop/useShop.js";
78
+ import { useRecommendedShops as Rt } from "./hooks/shop/useRecommendedShops.js";
79
+ import { useCreateImageContent as wt } from "./hooks/content/useCreateImageContent.js";
79
80
  import { useErrorToast as Et } from "./hooks/util/useErrorToast.js";
80
- import { useErrorScreen as vt } from "./hooks/util/useErrorScreen.js";
81
- import { useShare as Ft } from "./hooks/util/useShare.js";
82
- import { useImagePicker as Lt } from "./hooks/util/useImagePicker.js";
83
- import { useKeyboardAvoidingView as Nt } from "./hooks/util/useKeyboardAvoidingView.js";
84
- import { useRequestPermissions as Ot } from "./hooks/util/useRequestPermissions.js";
85
- import { useOnMiniFocus as yt } from "./hooks/events/useOnMiniFocus.js";
86
- import { useOnMiniBlur as Ht } from "./hooks/events/useOnMiniBlur.js";
87
- import { useOnMiniClose as zt } from "./hooks/events/useOnMiniClose.js";
88
- import { useOnAppStateChange as Yt } from "./hooks/events/useOnAppStateChange.js";
89
- import { useOnNavigateBack as Kt } from "./hooks/events/useOnNavigateBack.js";
90
- import { MiniEntityNotFoundError as Zt, MiniError as jt, MiniNetworkError as Jt, formatError as Xt } from "./utils/errors.js";
91
- import { extractBrandTheme as ra, formatReviewCount as ea, getFeaturedImages as oa, normalizeRating as ta } from "./utils/merchant-card.js";
92
- import { parseUrl as ia } from "./utils/parseUrl.js";
93
- import { dataURLToBlob as na, fileToDataUri as ma, getResizedImageUrl as sa, getThumbhashBlobURL as la, getThumbhashDataURL as ua } from "./utils/image.js";
94
- import { formatMoney as xa } from "./utils/formatMoney.js";
95
- import { UserState as da, UserTokenGenerateUserErrorCode as Ca } from "./shop-minis-platform/src/types/user.js";
96
- import { ContentCreateUserErrorCode as Sa, MinisContentStatus as Aa } from "./shop-minis-platform/src/types/content.js";
97
- import { Social as Pa } from "./shop-minis-platform/src/types/share.js";
98
- import { DATA_FETCHING_DEFAULT_FETCH_POLICY as ha, DATA_FETCHING_DEFAULT_PAGE_SIZE as Ia } from "./shop-minis-platform/src/constants.js";
81
+ import { useErrorScreen as Ft } from "./hooks/util/useErrorScreen.js";
82
+ import { useShare as bt } from "./hooks/util/useShare.js";
83
+ import { useImagePicker as kt } from "./hooks/util/useImagePicker.js";
84
+ import { useKeyboardAvoidingView as Ot } from "./hooks/util/useKeyboardAvoidingView.js";
85
+ import { useRequestPermissions as yt } from "./hooks/util/useRequestPermissions.js";
86
+ import { useOnMiniFocus as Ht } from "./hooks/events/useOnMiniFocus.js";
87
+ import { useOnMiniBlur as zt } from "./hooks/events/useOnMiniBlur.js";
88
+ import { useOnMiniClose as Yt } from "./hooks/events/useOnMiniClose.js";
89
+ import { useOnAppStateChange as Kt } from "./hooks/events/useOnAppStateChange.js";
90
+ import { useOnNavigateBack as Zt } from "./hooks/events/useOnNavigateBack.js";
91
+ import { buildDeeplinkUrl as Jt } from "./utils/buildDeeplinkUrl.js";
92
+ import { MiniEntityNotFoundError as $t, MiniError as ra, MiniNetworkError as ea, formatError as oa } from "./utils/errors.js";
93
+ import { extractBrandTheme as aa, formatReviewCount as ia, getFeaturedImages as pa, normalizeRating as na } from "./utils/merchant-card.js";
94
+ import { parseUrl as sa } from "./utils/parseUrl.js";
95
+ import { dataURLToBlob as ua, fileToDataUri as fa, getResizedImageUrl as xa, getThumbhashBlobURL as ca, getThumbhashDataURL as da } from "./utils/image.js";
96
+ import { formatMoney as ga } from "./utils/formatMoney.js";
97
+ import { UserState as Da, UserTokenGenerateUserErrorCode as Aa } from "./shop-minis-platform/src/types/user.js";
98
+ import { ContentCreateUserErrorCode as Ta, MinisContentStatus as ha } from "./shop-minis-platform/src/types/content.js";
99
+ import { Social as Ra } from "./shop-minis-platform/src/types/share.js";
100
+ import { DATA_FETCHING_DEFAULT_FETCH_POLICY as wa, DATA_FETCHING_DEFAULT_PAGE_SIZE as Ba } from "./shop-minis-platform/src/constants.js";
99
101
  export {
100
102
  Sr as Accordion,
101
- Ar as AccordionContent,
102
- Dr as AccordionItem,
103
+ Dr as AccordionContent,
104
+ Ar as AccordionItem,
103
105
  Pr as AccordionTrigger,
104
106
  n as AddToCartButton,
105
107
  hr as Alert,
106
108
  Ir as AlertDescription,
107
- Er as AlertDialog,
108
- Mr as AlertDialogAction,
109
+ wr as AlertDialog,
110
+ Br as AlertDialogAction,
109
111
  pr as AlertDialogAtom,
110
- vr as AlertDialogCancel,
111
- wr as AlertDialogContent,
112
+ Er as AlertDialogCancel,
113
+ Mr as AlertDialogContent,
112
114
  Fr as AlertDialogDescription,
113
115
  Ur as AlertDialogFooter,
114
- Lr as AlertDialogHeader,
115
- br as AlertDialogOverlay,
116
- Nr as AlertDialogPortal,
117
- kr as AlertDialogTitle,
116
+ br as AlertDialogHeader,
117
+ Lr as AlertDialogOverlay,
118
+ kr as AlertDialogPortal,
119
+ Nr as AlertDialogTitle,
118
120
  Or as AlertDialogTrigger,
119
121
  Rr as AlertTitle,
120
122
  yr as Avatar,
@@ -136,10 +138,10 @@ export {
136
138
  te as CarouselNext,
137
139
  ae as CarouselPrevious,
138
140
  pe as Checkbox,
139
- Sa as ContentCreateUserErrorCode,
141
+ Ta as ContentCreateUserErrorCode,
140
142
  cr as ContentWrapper,
141
- ha as DATA_FETCHING_DEFAULT_FETCH_POLICY,
142
- Ia as DATA_FETCHING_DEFAULT_PAGE_SIZE,
143
+ wa as DATA_FETCHING_DEFAULT_FETCH_POLICY,
144
+ Ba as DATA_FETCHING_DEFAULT_PAGE_SIZE,
143
145
  o as DATA_NAVIGATION_TYPE_ATTRIBUTE,
144
146
  me as Dialog,
145
147
  se as DialogClose,
@@ -151,36 +153,36 @@ export {
151
153
  de as DialogPortal,
152
154
  Ce as DialogTitle,
153
155
  ge as DialogTrigger,
154
- Ae as Drawer,
155
- De as DrawerClose,
156
+ De as Drawer,
157
+ Ae as DrawerClose,
156
158
  Pe as DrawerContent,
157
159
  Te as DrawerDescription,
158
160
  he as DrawerFooter,
159
161
  Ie as DrawerHeader,
160
162
  Re as DrawerOverlay,
161
- Be as DrawerPortal,
162
- Ee as DrawerTitle,
163
- Me as DrawerTrigger,
163
+ ve as DrawerPortal,
164
+ we as DrawerTitle,
165
+ Be as DrawerTrigger,
164
166
  V as FavoriteButton,
165
167
  X as IconButton,
166
168
  rr as Image,
167
169
  W as ImageContentWrapper,
168
- we as Input,
170
+ Me as Input,
169
171
  Ue as Label,
170
172
  mr as List,
171
173
  ar as LongPressDetector,
172
174
  I as MerchantCard,
173
175
  R as MerchantCardContainer,
174
- B as MerchantCardHeader,
175
- E as MerchantCardInfo,
176
- M as MerchantCardName,
177
- v as MerchantCardRating,
178
- L as MerchantCardSkeleton,
179
- Zt as MiniEntityNotFoundError,
180
- jt as MiniError,
181
- Jt as MiniNetworkError,
176
+ v as MerchantCardHeader,
177
+ w as MerchantCardInfo,
178
+ B as MerchantCardName,
179
+ E as MerchantCardRating,
180
+ b as MerchantCardSkeleton,
181
+ $t as MiniEntityNotFoundError,
182
+ ra as MiniError,
183
+ ea as MiniNetworkError,
182
184
  i as MinisContainer,
183
- Aa as MinisContentStatus,
185
+ ha as MinisContentStatus,
184
186
  q as MinisRouter,
185
187
  t as NAVIGATION_TYPES,
186
188
  u as ProductCard,
@@ -191,14 +193,14 @@ export {
191
193
  C as ProductCardImageContainer,
192
194
  g as ProductCardInfo,
193
195
  S as ProductCardPrice,
194
- A as ProductCardReviewStars,
196
+ D as ProductCardReviewStars,
195
197
  F as ProductCardSkeleton,
196
- D as ProductCardTitle,
198
+ A as ProductCardTitle,
197
199
  T as ProductLink,
198
200
  Cr as ProductVariantPrice,
199
- be as Progress,
200
- N as QuantitySelector,
201
- ke as RadioGroup,
201
+ Le as Progress,
202
+ k as QuantitySelector,
203
+ Ne as RadioGroup,
202
204
  Oe as RadioGroupItem,
203
205
  ye as ResizableHandle,
204
206
  Ge as ResizablePanel,
@@ -228,69 +230,71 @@ export {
228
230
  lo as SheetHeader,
229
231
  uo as SheetTitle,
230
232
  fo as SheetTrigger,
231
- Ao as Skeleton,
232
- Pa as Social,
233
+ Do as Skeleton,
234
+ Ra as Social,
233
235
  fr as TextInput,
234
236
  co as Toaster,
235
237
  or as Touchable,
236
238
  Q as TransitionLink,
237
- da as UserState,
238
- Ca as UserTokenGenerateUserErrorCode,
239
+ Da as UserState,
240
+ Aa as UserTokenGenerateUserErrorCode,
239
241
  lr as VideoPlayer,
240
242
  Wr as badgeVariants,
241
- na as dataURLToBlob,
242
- ra as extractBrandTheme,
243
- ma as fileToDataUri,
244
- Xt as formatError,
245
- xa as formatMoney,
246
- ea as formatReviewCount,
247
- oa as getFeaturedImages,
248
- sa as getResizedImageUrl,
249
- la as getThumbhashBlobURL,
250
- ua as getThumbhashDataURL,
251
- ta as normalizeRating,
252
- ia as parseUrl,
243
+ Jt as buildDeeplinkUrl,
244
+ ua as dataURLToBlob,
245
+ aa as extractBrandTheme,
246
+ fa as fileToDataUri,
247
+ oa as formatError,
248
+ ga as formatMoney,
249
+ ia as formatReviewCount,
250
+ pa as getFeaturedImages,
251
+ xa as getResizedImageUrl,
252
+ ca as getThumbhashBlobURL,
253
+ da as getThumbhashDataURL,
254
+ na as normalizeRating,
255
+ sa as parseUrl,
253
256
  go as toast,
254
- nt as useAsyncStorage,
257
+ st as useAsyncStorage,
255
258
  Oo as useBuyerAttributes,
256
- dt as useCloseMini,
257
- Rt as useCreateImageContent,
258
- Lo as useCurrentUser,
259
- gt as useDeeplink,
260
- vt as useErrorScreen,
259
+ gt as useCloseMini,
260
+ wt as useCreateImageContent,
261
+ bo as useCurrentUser,
262
+ Dt as useDeeplink,
263
+ Ft as useErrorScreen,
261
264
  Et as useErrorToast,
262
- vo as useFollowedShops,
265
+ Eo as useFollowedShops,
263
266
  Fo as useFollowedShopsActions,
264
267
  yo as useGenerateUserToken,
265
- Lt as useImagePicker,
266
- ut as useImageUpload,
267
- Nt as useKeyboardAvoidingView,
268
- At as useNavigateWithTransition,
269
- Yt as useOnAppStateChange,
270
- Ht as useOnMiniBlur,
271
- zt as useOnMiniClose,
272
- yt as useOnMiniFocus,
273
- Kt as useOnNavigateBack,
274
- No as useOrders,
275
- it as usePopularProducts,
268
+ kt as useImagePicker,
269
+ xt as useImageUpload,
270
+ Ot as useKeyboardAvoidingView,
271
+ Pt as useNavigateWithTransition,
272
+ Kt as useOnAppStateChange,
273
+ zt as useOnMiniBlur,
274
+ Yt as useOnMiniClose,
275
+ Ht as useOnMiniFocus,
276
+ Zt as useOnNavigateBack,
277
+ ko as useOrders,
278
+ nt as usePopularProducts,
276
279
  Ko as useProduct,
277
280
  Yo as useProductList,
278
281
  Ho as useProductListActions,
279
282
  zo as useProductLists,
280
283
  $o as useProductMedia,
281
- et as useProductSearch,
284
+ et as useProductReviews,
285
+ tt as useProductSearch,
282
286
  Jo as useProductVariants,
283
287
  Zo as useProducts,
284
288
  Po as useRecentProducts,
285
289
  ho as useRecentShops,
286
- tt as useRecommendedProducts,
287
- ht as useRecommendedShops,
288
- Ot as useRequestPermissions,
290
+ it as useRecommendedProducts,
291
+ Rt as useRecommendedShops,
292
+ yt as useRequestPermissions,
289
293
  Ro as useSavedProducts,
290
- Eo as useSavedProductsActions,
291
- st as useSecureStorage,
292
- Ft as useShare,
293
- Pt as useShop,
294
- xt as useShopNavigation
294
+ wo as useSavedProductsActions,
295
+ ut as useSecureStorage,
296
+ bt as useShare,
297
+ ht as useShop,
298
+ dt as useShopNavigation
295
299
  };
296
300
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/mocks.js CHANGED
@@ -1,26 +1,26 @@
1
- import { UserState as h } from "./shop-minis-platform/src/types/user.js";
2
- import { MinisContentStatus as v } from "./shop-minis-platform/src/types/content.js";
3
- const m = [
1
+ import { UserState as v } from "./shop-minis-platform/src/types/user.js";
2
+ import { MinisContentStatus as S } from "./shop-minis-platform/src/types/content.js";
3
+ const u = [
4
4
  "garnished.jpeg",
5
5
  "bath.jpeg",
6
6
  "teapot.jpg",
7
7
  "shoes.jpeg"
8
- ], S = (o) => {
8
+ ], P = (o) => {
9
9
  let r = 0;
10
10
  for (let t = 0; t < o.length; t++)
11
11
  r = (r << 5) - r + o.charCodeAt(t), r |= 0;
12
12
  return Math.abs(r);
13
- }, e = (o, r, t = "99.99", n) => {
14
- const s = S(o) % m.length, c = m[s];
13
+ }, e = (o, r, t = "99.99", d) => {
14
+ const s = P(o) % u.length, c = u[s];
15
15
  return {
16
16
  id: o,
17
17
  title: r,
18
18
  price: { amount: t, currencyCode: "USD" },
19
- ...n && {
20
- compareAtPrice: { amount: n, currencyCode: "USD" }
19
+ ...d && {
20
+ compareAtPrice: { amount: d, currencyCode: "USD" }
21
21
  },
22
22
  reviewAnalytics: { averageRating: 4.5, reviewCount: 10 },
23
- shop: d("shop1", "Mock Shop"),
23
+ shop: n("shop1", "Mock Shop"),
24
24
  defaultVariantId: `variant-${o}`,
25
25
  isFavorited: !1,
26
26
  featuredImage: {
@@ -28,13 +28,22 @@ const m = [
28
28
  altText: r
29
29
  }
30
30
  };
31
- }, d = (o, r, t) => {
32
- const n = t?.themeType || "none", s = t?.withBrandSettings || n !== "none", c = t?.featuredImagesLimit || 3, u = Array.from({ length: c }, (C, l) => ({
33
- url: `https://picsum.photos/400/400?random=${o}-${l}`,
31
+ }, l = (o, r = {}) => ({
32
+ id: o,
33
+ rating: 5,
34
+ title: "Great product",
35
+ body: "Loved it. Would buy again.",
36
+ submittedAt: (/* @__PURE__ */ new Date()).toISOString(),
37
+ merchantReply: null,
38
+ merchantRepliedAt: null,
39
+ ...r
40
+ }), n = (o, r, t) => {
41
+ const d = t?.themeType || "none", s = t?.withBrandSettings || d !== "none", c = t?.featuredImagesLimit || 3, p = Array.from({ length: c }, (C, m) => ({
42
+ url: `https://picsum.photos/400/400?random=${o}-${m}`,
34
43
  sensitive: !1,
35
- altText: `${r} featured image ${l + 1}`
36
- })), p = () => {
37
- switch (n) {
44
+ altText: `${r} featured image ${m + 1}`
45
+ })), g = () => {
46
+ switch (d) {
38
47
  case "coverImage":
39
48
  return {
40
49
  primary: t?.primaryColor,
@@ -64,8 +73,8 @@ const m = [
64
73
  coverDominant: t?.coverDominantColor
65
74
  };
66
75
  }
67
- }, g = () => {
68
- if (n === "coverImage" || t?.coverImageUrl)
76
+ }, h = () => {
77
+ if (d === "coverImage" || t?.coverImageUrl)
69
78
  return {
70
79
  id: `header-theme-${o}`,
71
80
  coverImage: {
@@ -74,7 +83,7 @@ const m = [
74
83
  sensitive: !1,
75
84
  thumbhash: "k9oGHQRnh493V4dIeHeXh4h3iIeI"
76
85
  },
77
- wordmark: t?.wordmarkUrl || n === "coverImage" ? {
86
+ wordmark: t?.wordmarkUrl || d === "coverImage" ? {
78
87
  url: t?.wordmarkUrl || "https://merrypeople.com/cdn/shop/files/Transparent_Background_1.png?v=1696465429&width=1024",
79
88
  altText: `${r} wordmark`,
80
89
  sensitive: !1
@@ -99,7 +108,7 @@ const m = [
99
108
  reviewAnalytics: { averageRating: 4.3, reviewCount: 50 },
100
109
  visualTheme: {
101
110
  id: `visual-theme-${o}`,
102
- featuredImages: u,
111
+ featuredImages: p,
103
112
  logoImage: {
104
113
  url: `https://picsum.photos/100/100?random=${o}`,
105
114
  sensitive: !1
@@ -108,9 +117,9 @@ const m = [
108
117
  id: `brand-settings-${o}`,
109
118
  colors: {
110
119
  id: `colors-${o}`,
111
- ...p()
120
+ ...g()
112
121
  },
113
- headerTheme: g()
122
+ headerTheme: h()
114
123
  } : void 0
115
124
  }
116
125
  };
@@ -123,17 +132,17 @@ const m = [
123
132
  name: r,
124
133
  products: t
125
134
  });
126
- function P(o, r) {
135
+ function f(o, r) {
127
136
  window._mockLogs = window._mockLogs || [], window._mockLogs.push({ action: o, params: r });
128
137
  }
129
- function f(o, r) {
130
- return (t) => (P(String(o), t), Promise.resolve({
138
+ function I(o, r) {
139
+ return (t) => (f(String(o), t), Promise.resolve({
131
140
  ok: !0,
132
141
  data: r,
133
142
  mocked: !0
134
143
  }));
135
144
  }
136
- function I() {
145
+ function w() {
137
146
  const o = {
138
147
  translateContentUp: void 0,
139
148
  translateContentDown: void 0,
@@ -244,11 +253,11 @@ function I() {
244
253
  },
245
254
  getRecommendedShops: {
246
255
  data: [
247
- d("shop-1", "Amazing Store"),
248
- d("shop-2", "Best Deals Shop"),
249
- d("shop-3", "Great Products"),
250
- d("shop-4", "Top Brands"),
251
- d("shop-5", "Exclusive Offers")
256
+ n("shop-1", "Amazing Store"),
257
+ n("shop-2", "Best Deals Shop"),
258
+ n("shop-3", "Great Products"),
259
+ n("shop-4", "Top Brands"),
260
+ n("shop-5", "Exclusive Offers")
252
261
  ],
253
262
  pageInfo: a()
254
263
  },
@@ -275,7 +284,7 @@ function I() {
275
284
  product: null
276
285
  }
277
286
  ],
278
- shop: d("shop-1", "Sample Shop")
287
+ shop: n("shop-1", "Sample Shop")
279
288
  }
280
289
  ],
281
290
  pageInfo: a()
@@ -377,22 +386,35 @@ function I() {
377
386
  ],
378
387
  pageInfo: a()
379
388
  },
389
+ getProductReviews: {
390
+ data: [
391
+ l("review-1"),
392
+ l("review-2", { rating: 4, title: "Pretty good" }),
393
+ l("review-3", {
394
+ rating: 3,
395
+ title: "Okay",
396
+ merchantReply: "Thanks for the feedback!",
397
+ merchantRepliedAt: (/* @__PURE__ */ new Date()).toISOString()
398
+ })
399
+ ],
400
+ pageInfo: a()
401
+ },
380
402
  getShop: {
381
- data: d("shop-1", "Sample Shop", { featuredImagesLimit: 4 })
403
+ data: n("shop-1", "Sample Shop", { featuredImagesLimit: 4 })
382
404
  },
383
405
  getRecentShops: {
384
406
  data: [
385
- d("recent-shop-1", "Recent Shop 1"),
386
- d("recent-shop-2", "Recent Shop 2"),
387
- d("recent-shop-3", "Recent Shop 3")
407
+ n("recent-shop-1", "Recent Shop 1"),
408
+ n("recent-shop-2", "Recent Shop 2"),
409
+ n("recent-shop-3", "Recent Shop 3")
388
410
  ],
389
411
  pageInfo: a()
390
412
  },
391
413
  getFollowedShops: {
392
414
  data: [
393
- d("followed-shop-1", "Followed Shop 1"),
394
- d("followed-shop-2", "Followed Shop 2"),
395
- d("followed-shop-3", "Followed Shop 3")
415
+ n("followed-shop-1", "Followed Shop 1"),
416
+ n("followed-shop-2", "Followed Shop 2"),
417
+ n("followed-shop-3", "Followed Shop 3")
396
418
  ],
397
419
  pageInfo: a()
398
420
  },
@@ -426,7 +448,7 @@ function I() {
426
448
  },
427
449
  title: "Mock Content",
428
450
  visibility: ["DISCOVERABLE"],
429
- status: v.READY
451
+ status: S.READY
430
452
  }
431
453
  ]
432
454
  },
@@ -434,7 +456,7 @@ function I() {
434
456
  data: {
435
457
  token: "user-token-123",
436
458
  expiresAt: "2025-01-01",
437
- userState: h.VERIFIED
459
+ userState: v.VERIFIED
438
460
  }
439
461
  },
440
462
  navigateToCart: void 0,
@@ -445,17 +467,17 @@ function I() {
445
467
  reportFetch: void 0
446
468
  }, r = {};
447
469
  for (const t in o)
448
- Object.prototype.hasOwnProperty.call(o, t) && (r[t] = f(
470
+ Object.prototype.hasOwnProperty.call(o, t) && (r[t] = I(
449
471
  t,
450
472
  o[t]
451
473
  ));
452
474
  return r;
453
475
  }
454
- const w = () => {
476
+ const y = () => {
455
477
  const o = navigator.userAgent.toLowerCase(), r = /iphone|ipad|ipod/.test(o), t = /android/.test(o);
456
478
  return r || t;
457
479
  }, A = ({ force: o } = {}) => {
458
- w() && !o || window.minisSDK || (window.minisSDK = I(), window.minisParams = {
480
+ y() && !o || window.minisSDK || (window.minisSDK = w(), window.minisParams = {
459
481
  handle: "mock-handle",
460
482
  initialUrl: "/",
461
483
  platform: "web"
@@ -463,8 +485,9 @@ const w = () => {
463
485
  };
464
486
  export {
465
487
  e as createProduct,
466
- d as createShop,
488
+ l as createProductReview,
489
+ n as createShop,
467
490
  A as injectMocks,
468
- I as makeMockActions
491
+ w as makeMockActions
469
492
  };
470
493
  //# sourceMappingURL=mocks.js.map
package/dist/mocks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mocks.js","sources":["../src/mocks.ts"],"sourcesContent":["import {\n Product,\n Gender,\n UserState,\n MinisContentStatus,\n} from '@shopify/shop-minis-platform'\nimport {ShopActions} from '@shopify/shop-minis-platform/actions'\n\nconst SAMPLE_IMAGE_NAMES = [\n 'garnished.jpeg',\n 'bath.jpeg',\n 'teapot.jpg',\n 'shoes.jpeg',\n]\n\n// Simple hash function to get a deterministic index from a string\nconst hashString = (str: string): number => {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n hash = (hash << 5) - hash + str.charCodeAt(i)\n hash |= 0\n }\n return Math.abs(hash)\n}\n\n// Helper functions for common data structures\nexport const createProduct = (\n id: string,\n title: string,\n price = '99.99',\n compareAtPrice?: string\n): Product => {\n const imageIndex = hashString(id) % SAMPLE_IMAGE_NAMES.length\n const imageName = SAMPLE_IMAGE_NAMES[imageIndex]\n\n return {\n id,\n title,\n price: {amount: price, currencyCode: 'USD'},\n ...(compareAtPrice && {\n compareAtPrice: {amount: compareAtPrice, currencyCode: 'USD'},\n }),\n reviewAnalytics: {averageRating: 4.5, reviewCount: 10},\n shop: createShop('shop1', 'Mock Shop'),\n defaultVariantId: `variant-${id}`,\n isFavorited: false,\n featuredImage: {\n url: `https://cdn.shopify.com/static/sample-images/${imageName}`,\n altText: title,\n },\n }\n}\n\nexport const createShop = (\n id: string,\n name: string,\n options?: {\n themeType?: 'coverImage' | 'brandColor' | 'logoColor' | 'none'\n withBrandSettings?: boolean\n primaryColor?: string\n logoDominantColor?: string\n logoAverageColor?: string\n coverDominantColor?: string\n wordmarkUrl?: string\n coverImageUrl?: string\n featuredImagesLimit?: number\n }\n) => {\n // Determine theme configuration\n const themeType = options?.themeType || 'none'\n const shouldHaveBrandSettings =\n options?.withBrandSettings || themeType !== 'none'\n\n // Generate featured images\n const featuredImagesCount = options?.featuredImagesLimit || 3\n const featuredImages = Array.from({length: featuredImagesCount}, (_, i) => ({\n url: `https://picsum.photos/400/400?random=${id}-${i}`,\n sensitive: false,\n altText: `${name} featured image ${i + 1}`,\n }))\n\n // Configure colors based on theme type\n const getThemeColors = () => {\n switch (themeType) {\n case 'coverImage':\n return {\n primary: options?.primaryColor,\n logoDominant: options?.logoDominantColor,\n logoAverage: options?.logoAverageColor,\n coverDominant: options?.coverDominantColor || '#FF6B35',\n }\n case 'brandColor':\n return {\n primary: options?.primaryColor || '#27AE60',\n logoDominant: options?.logoDominantColor,\n logoAverage: options?.logoAverageColor,\n coverDominant: options?.coverDominantColor,\n }\n case 'logoColor':\n return {\n primary: options?.primaryColor,\n logoDominant: options?.logoDominantColor || '#E74C3C',\n logoAverage: options?.logoAverageColor,\n coverDominant: options?.coverDominantColor,\n }\n default:\n return {\n primary: options?.primaryColor,\n logoDominant: options?.logoDominantColor,\n logoAverage: options?.logoAverageColor,\n coverDominant: options?.coverDominantColor,\n }\n }\n }\n\n // Configure header theme\n const createHeaderTheme = () => {\n if (themeType === 'coverImage' || options?.coverImageUrl) {\n return {\n id: `header-theme-${id}`,\n coverImage: {\n url:\n options?.coverImageUrl ||\n 'https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=800&h=400&fit=crop',\n altText: `${name} cover image`,\n sensitive: false,\n thumbhash: 'k9oGHQRnh493V4dIeHeXh4h3iIeI',\n },\n wordmark:\n options?.wordmarkUrl || themeType === 'coverImage'\n ? {\n url:\n options?.wordmarkUrl ||\n 'https://merrypeople.com/cdn/shop/files/Transparent_Background_1.png?v=1696465429&width=1024',\n altText: `${name} wordmark`,\n sensitive: false,\n }\n : undefined,\n }\n }\n\n if (options?.wordmarkUrl) {\n return {\n id: `header-theme-${id}`,\n wordmark: {\n url: options.wordmarkUrl,\n altText: `${name} wordmark`,\n sensitive: false,\n },\n }\n }\n\n return undefined\n }\n\n return {\n id,\n name,\n primaryDomain: {\n url: `https://${name.toLowerCase().replace(/\\s+/g, '-')}.com`,\n },\n reviewAnalytics: {averageRating: 4.3, reviewCount: 50},\n visualTheme: {\n id: `visual-theme-${id}`,\n featuredImages,\n logoImage: {\n url: `https://picsum.photos/100/100?random=${id}`,\n sensitive: false,\n },\n brandSettings: shouldHaveBrandSettings\n ? {\n id: `brand-settings-${id}`,\n colors: {\n id: `colors-${id}`,\n ...getThemeColors(),\n },\n headerTheme: createHeaderTheme(),\n }\n : undefined,\n },\n }\n}\n\nconst createPagination = (hasNext = false) => ({\n hasNextPage: hasNext,\n endCursor: hasNext ? 'cursor123' : null,\n})\n\nconst createProductList = (id: string, name: string, products: any[] = []) => ({\n id,\n publicId: `public-${id}`,\n name,\n products,\n})\n\n// Helper type to extract the data type from a ShopAction\ntype ShopActionDataType<T> = T extends (\n ...args: any[]\n) => Promise<{ok: true; data: infer R} | {ok: false; error: any}>\n ? R\n : never\n\n// Use window._mockLogs instead of console.log so logs aren't stripped in production builds\n// This allows e2e tests to verify mock actions are being called\nexport interface MockLog {\n action: string\n params?: unknown\n}\n\ndeclare global {\n interface Window {\n _mockLogs?: MockLog[]\n }\n}\n\nfunction logMockAction(action: string, params?: unknown) {\n window._mockLogs = window._mockLogs || []\n window._mockLogs.push({action, params})\n}\n\nfunction makeMockMethod<K extends keyof ShopActions>(\n key: K,\n result: ShopActionDataType<ShopActions[K]>\n): ShopActions[K] {\n return ((params: Parameters<ShopActions[K]>[0]) => {\n logMockAction(String(key), params)\n return Promise.resolve({\n ok: true as const,\n data: result,\n mocked: true,\n })\n }) as ShopActions[K]\n}\n\nexport function makeMockActions(): ShopActions {\n const results: {\n [K in keyof ShopActions]: ShopActionDataType<ShopActions[K]>\n } = {\n translateContentUp: undefined,\n translateContentDown: undefined,\n followShop: true,\n unfollowShop: false,\n favorite: undefined,\n unfavorite: undefined,\n getShopAppInformation: {\n appVersion: '1.0.0',\n buildNumber: '12345',\n buildId: 'dev-build-123',\n },\n productRecommendationImpression: undefined,\n productRecommendationClick: undefined,\n closeMini: undefined,\n getAccountInformation: {\n status: 'available',\n value: 'user@example.com',\n },\n getCurrentUser: {\n data: {\n displayName: 'John Doe',\n avatarImage: {url: 'https://example.com/avatar.jpg'},\n },\n },\n createOrderAttribution: undefined,\n addToCart: undefined,\n buyProduct: undefined,\n buyProducts: undefined,\n showErrorScreen: undefined,\n showErrorToast: undefined,\n getDeeplinkPaths: {\n matchers: ['/products', '/collections', '/cart'],\n },\n navigateToDeeplink: undefined,\n navigateToShop: undefined,\n navigateToProduct: undefined,\n navigateToOrder: undefined,\n navigateToCheckout: undefined,\n createImageUploadLink: {\n // This action is mocked in the actual hook. See `useImageUpload` for more details.\n targets: [\n {\n url: 'https://example.com/upload',\n resourceUrl: 'https://example.com/resource',\n parameters: [{name: 'key', value: 'upload-123'}],\n },\n ],\n },\n completeImageUpload: {\n files: [\n {\n id: 'file-123',\n fileStatus: 'READY',\n image: {\n url: 'https://example.com/image.jpg',\n },\n },\n ],\n },\n getPersistedItem: null,\n setPersistedItem: undefined,\n removePersistedItem: undefined,\n getAllPersistedKeys: ['key1', 'key2', 'key3'],\n clearPersistedItems: undefined,\n getInternalPersistedItem: null,\n setInternalPersistedItem: undefined,\n removeInternalPersistedItem: undefined,\n getAllInternalPersistedKeys: ['internal-key1', 'internal-key2'],\n clearInternalPersistedItems: undefined,\n getSecret: 'secret-value',\n setSecret: undefined,\n removeSecret: undefined,\n reportInteraction: undefined,\n reportImpression: undefined,\n reportContentImpression: undefined,\n getProductLists: {\n data: [\n createProductList('list-1', 'Wishlist'),\n createProductList('list-2', 'Favorites'),\n ],\n pageInfo: createPagination(),\n },\n getProductList: {\n data: createProductList('list-1', 'Wishlist', [\n createProduct('prod-1', 'Sample Product'),\n ]),\n pageInfo: createPagination(),\n },\n addProductList: createProductList('list-3', 'New List'),\n removeProductList: undefined,\n renameProductList: createProductList('list-1', 'Updated Wishlist'),\n addProductListItem: undefined,\n removeProductListItem: undefined,\n getRecommendedProducts: {\n data: [\n createProduct('rec-1', 'Recommended Product 1', '79.99'),\n createProduct('rec-2', 'Recommended Product 2', '129.99'),\n createProduct('rec-3', 'Recommended Product 3', '129.99'),\n createProduct('rec-4', 'Recommended Product 4', '29.99'),\n createProduct('rec-5', 'Recommended Product 5', '39.99'),\n createProduct('rec-6', 'Recommended Product 6', '49.99'),\n createProduct('rec-7', 'Recommended Product 7', '59.99'),\n createProduct('rec-8', 'Recommended Product 8', '69.99'),\n createProduct('rec-9', 'Recommended Product 9', '129.99'),\n ],\n pageInfo: createPagination(),\n },\n getRecommendedShops: {\n data: [\n createShop('shop-1', 'Amazing Store'),\n createShop('shop-2', 'Best Deals Shop'),\n createShop('shop-3', 'Great Products'),\n createShop('shop-4', 'Top Brands'),\n createShop('shop-5', 'Exclusive Offers'),\n ],\n pageInfo: createPagination(),\n },\n searchProductsByShop: {\n data: [\n createProduct('search-1', 'Search Result 1', '59.99'),\n createProduct('search-2', 'Search Result 2', '89.99'),\n createProduct('search-3', 'Search Result 3', '119.99'),\n createProduct('search-4', 'Search Result 4', '149.99'),\n createProduct('search-5', 'Search Result 5', '179.99'),\n ],\n pageInfo: createPagination(),\n },\n getOrders: {\n data: [\n {\n id: 'order-1',\n name: '#1001',\n lineItems: [\n {\n productTitle: 'Sample Product',\n variantTitle: 'Medium',\n quantity: 2,\n product: null,\n },\n ],\n shop: createShop('shop-1', 'Sample Shop'),\n },\n ],\n pageInfo: createPagination(),\n },\n getBuyerAttributes: {\n data: {\n genderAffinity: 'NEUTRAL' as Gender,\n categoryAffinities: [\n {id: 'cat1', name: 'Electronics'},\n {id: 'cat2', name: 'Clothing'},\n ],\n },\n },\n showFeedbackSheet: undefined,\n getPopularProducts: {\n data: [\n createProduct('pop-1', 'The Hero Snowboard', '702.95'),\n createProduct('pop-2', 'Snow Jacket', '605.95', '702.00'),\n createProduct('pop-3', 'Winter Gloves', '89.95'),\n createProduct('pop-4', 'Summer Gloves', '89.95'),\n createProduct('pop-5', 'Spring Gloves', '89.95'),\n createProduct('pop-6', 'Playstation 5', '499.95'),\n createProduct('pop-7', 'Xbox Series X', '499.95'),\n createProduct('pop-8', 'Nintendo Switch', '299.95'),\n createProduct('pop-9', 'Playstation 4', '299.95'),\n createProduct('pop-10', 'Nintendo 3DS', '89.95'),\n ],\n pageInfo: createPagination(),\n },\n share: {\n message: 'Shared!',\n success: true,\n },\n shareSingle: {\n message: 'Shared!',\n success: true,\n },\n getSavedProducts: {\n data: [\n createProduct('saved-1', 'Saved Product 1', '49.99'),\n createProduct('saved-2', 'Saved Product 2', '59.99'),\n createProduct('saved-3', 'Saved Product 3', '69.99'),\n createProduct('saved-4', 'Saved Product 4', '79.99'),\n createProduct('saved-5', 'Saved Product 5', '89.99'),\n ],\n pageInfo: createPagination(),\n },\n getRecentProducts: {\n data: [\n createProduct('recent-1', 'Recent Product 1', '59.99'),\n createProduct('recent-2', 'Recent Product 2', '69.99'),\n createProduct('recent-3', 'Recent Product 3', '79.99'),\n createProduct('recent-4', 'Recent Product 4', '89.99'),\n createProduct('recent-5', 'Recent Product 5', '99.99'),\n ],\n pageInfo: createPagination(),\n },\n getProductSearch: {\n data: [\n createProduct('search-1', 'Search Product 1', '39.99'),\n createProduct('search-2', 'Search Product 2', '19.99'),\n createProduct('search-3', 'Search Product 3', '29.99'),\n createProduct('search-4', 'Search Product 4', '49.99'),\n createProduct('search-5', 'Search Product 5', '9.99'),\n ],\n pageInfo: createPagination(),\n },\n getProducts: {\n data: [\n createProduct('prod-1', 'Product 1', '9.99'),\n createProduct('prod-2', 'Product 2', '19.99'),\n createProduct('prod-3', 'Product 3', '29.99'),\n createProduct('prod-4', 'Product 4', '39.99'),\n createProduct('prod-5', 'Product 5', '49.99'),\n ],\n },\n getProduct: {data: createProduct('prod-1', 'Sample Product')},\n getProductVariants: {\n data: [\n {\n id: 'variant-1',\n title: 'Variant 1',\n isFavorited: false,\n image: {url: 'https://example.com/variant-1.jpg'},\n price: {amount: '19.99', currencyCode: 'USD'},\n compareAtPrice: {amount: '29.99', currencyCode: 'USD'},\n },\n ],\n pageInfo: createPagination(),\n },\n getProductMedia: {\n data: [\n {\n id: 'media-1',\n image: {url: 'https://example.com/media-1.jpg'},\n mediaContentType: 'IMAGE',\n alt: 'Sample product image',\n },\n ],\n pageInfo: createPagination(),\n },\n getShop: {\n data: createShop('shop-1', 'Sample Shop', {featuredImagesLimit: 4}),\n },\n getRecentShops: {\n data: [\n createShop('recent-shop-1', 'Recent Shop 1'),\n createShop('recent-shop-2', 'Recent Shop 2'),\n createShop('recent-shop-3', 'Recent Shop 3'),\n ],\n pageInfo: createPagination(),\n },\n getFollowedShops: {\n data: [\n createShop('followed-shop-1', 'Followed Shop 1'),\n createShop('followed-shop-2', 'Followed Shop 2'),\n createShop('followed-shop-3', 'Followed Shop 3'),\n ],\n pageInfo: createPagination(),\n },\n previewProductInAr: undefined,\n createContent: {\n data: {\n publicId: 'content-123',\n externalId: null,\n image: {\n id: 'img-123',\n url: 'https://cdn.shopify.com/s/files/1/0633/6574/2742/files/Namnlosdesign-47.png?v=1740438079',\n width: 800,\n height: 600,\n },\n title: 'Mock Content',\n description: 'This is a mock content item',\n visibility: ['DISCOVERABLE'],\n shareableUrl: 'https://example.com/content/123',\n products: null,\n },\n },\n getContent: {\n data: [\n {\n publicId: 'content-123',\n image: {\n id: 'img-123',\n url: 'https://cdn.shopify.com/s/files/1/0633/6574/2742/files/Namnlosdesign-47.png?v=1740438079',\n width: 800,\n height: 600,\n },\n title: 'Mock Content',\n visibility: ['DISCOVERABLE'],\n status: MinisContentStatus.READY,\n },\n ],\n },\n generateUserToken: {\n data: {\n token: 'user-token-123',\n expiresAt: '2025-01-01',\n userState: UserState.VERIFIED,\n },\n },\n navigateToCart: undefined,\n requestPermission: {\n granted: true,\n },\n reportError: undefined,\n reportFetch: undefined,\n } as const\n\n const mock: Partial<ShopActions> = {}\n for (const key in results) {\n if (Object.prototype.hasOwnProperty.call(results, key)) {\n // @ts-expect-error: dynamic assignment is safe due to exhaustive mapping\n mock[key] = makeMockMethod(\n key as keyof ShopActions,\n results[key as keyof typeof results]\n )\n }\n }\n return mock as ShopActions\n}\n\n// Detect if running on a mobile device\nconst isMobile = (): boolean => {\n const userAgent = navigator.userAgent.toLowerCase()\n const isIOS = /iphone|ipad|ipod/.test(userAgent)\n const isAndroid = /android/.test(userAgent)\n\n return isIOS || isAndroid\n}\n\nexport const injectMocks = ({force}: {force?: boolean} = {}) => {\n // Only inject mocks if we aren't on a mobile device or we force it\n if (isMobile() && !force) {\n return\n }\n\n if (!window.minisSDK) {\n window.minisSDK = makeMockActions()\n window.minisParams = {\n handle: 'mock-handle',\n initialUrl: '/',\n platform: 'web',\n }\n }\n}\n"],"names":["SAMPLE_IMAGE_NAMES","hashString","str","hash","i","createProduct","id","title","price","compareAtPrice","imageIndex","imageName","createShop","name","options","themeType","shouldHaveBrandSettings","featuredImagesCount","featuredImages","_","getThemeColors","createHeaderTheme","createPagination","hasNext","createProductList","products","logMockAction","action","params","makeMockMethod","key","result","makeMockActions","results","MinisContentStatus","UserState","mock","isMobile","userAgent","isIOS","isAndroid","injectMocks","force"],"mappings":"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"}
1
+ {"version":3,"file":"mocks.js","sources":["../src/mocks.ts"],"sourcesContent":["import {\n Product,\n ProductReview,\n Gender,\n UserState,\n MinisContentStatus,\n} from '@shopify/shop-minis-platform'\nimport {ShopActions} from '@shopify/shop-minis-platform/actions'\n\nconst SAMPLE_IMAGE_NAMES = [\n 'garnished.jpeg',\n 'bath.jpeg',\n 'teapot.jpg',\n 'shoes.jpeg',\n]\n\n// Simple hash function to get a deterministic index from a string\nconst hashString = (str: string): number => {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n hash = (hash << 5) - hash + str.charCodeAt(i)\n hash |= 0\n }\n return Math.abs(hash)\n}\n\n// Helper functions for common data structures\nexport const createProduct = (\n id: string,\n title: string,\n price = '99.99',\n compareAtPrice?: string\n): Product => {\n const imageIndex = hashString(id) % SAMPLE_IMAGE_NAMES.length\n const imageName = SAMPLE_IMAGE_NAMES[imageIndex]\n\n return {\n id,\n title,\n price: {amount: price, currencyCode: 'USD'},\n ...(compareAtPrice && {\n compareAtPrice: {amount: compareAtPrice, currencyCode: 'USD'},\n }),\n reviewAnalytics: {averageRating: 4.5, reviewCount: 10},\n shop: createShop('shop1', 'Mock Shop'),\n defaultVariantId: `variant-${id}`,\n isFavorited: false,\n featuredImage: {\n url: `https://cdn.shopify.com/static/sample-images/${imageName}`,\n altText: title,\n },\n }\n}\n\nexport const createProductReview = (\n id: string,\n overrides: Partial<ProductReview> = {}\n): ProductReview => {\n return {\n id,\n rating: 5,\n title: 'Great product',\n body: 'Loved it. Would buy again.',\n submittedAt: new Date().toISOString(),\n merchantReply: null,\n merchantRepliedAt: null,\n ...overrides,\n }\n}\n\nexport const createShop = (\n id: string,\n name: string,\n options?: {\n themeType?: 'coverImage' | 'brandColor' | 'logoColor' | 'none'\n withBrandSettings?: boolean\n primaryColor?: string\n logoDominantColor?: string\n logoAverageColor?: string\n coverDominantColor?: string\n wordmarkUrl?: string\n coverImageUrl?: string\n featuredImagesLimit?: number\n }\n) => {\n // Determine theme configuration\n const themeType = options?.themeType || 'none'\n const shouldHaveBrandSettings =\n options?.withBrandSettings || themeType !== 'none'\n\n // Generate featured images\n const featuredImagesCount = options?.featuredImagesLimit || 3\n const featuredImages = Array.from({length: featuredImagesCount}, (_, i) => ({\n url: `https://picsum.photos/400/400?random=${id}-${i}`,\n sensitive: false,\n altText: `${name} featured image ${i + 1}`,\n }))\n\n // Configure colors based on theme type\n const getThemeColors = () => {\n switch (themeType) {\n case 'coverImage':\n return {\n primary: options?.primaryColor,\n logoDominant: options?.logoDominantColor,\n logoAverage: options?.logoAverageColor,\n coverDominant: options?.coverDominantColor || '#FF6B35',\n }\n case 'brandColor':\n return {\n primary: options?.primaryColor || '#27AE60',\n logoDominant: options?.logoDominantColor,\n logoAverage: options?.logoAverageColor,\n coverDominant: options?.coverDominantColor,\n }\n case 'logoColor':\n return {\n primary: options?.primaryColor,\n logoDominant: options?.logoDominantColor || '#E74C3C',\n logoAverage: options?.logoAverageColor,\n coverDominant: options?.coverDominantColor,\n }\n default:\n return {\n primary: options?.primaryColor,\n logoDominant: options?.logoDominantColor,\n logoAverage: options?.logoAverageColor,\n coverDominant: options?.coverDominantColor,\n }\n }\n }\n\n // Configure header theme\n const createHeaderTheme = () => {\n if (themeType === 'coverImage' || options?.coverImageUrl) {\n return {\n id: `header-theme-${id}`,\n coverImage: {\n url:\n options?.coverImageUrl ||\n 'https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=800&h=400&fit=crop',\n altText: `${name} cover image`,\n sensitive: false,\n thumbhash: 'k9oGHQRnh493V4dIeHeXh4h3iIeI',\n },\n wordmark:\n options?.wordmarkUrl || themeType === 'coverImage'\n ? {\n url:\n options?.wordmarkUrl ||\n 'https://merrypeople.com/cdn/shop/files/Transparent_Background_1.png?v=1696465429&width=1024',\n altText: `${name} wordmark`,\n sensitive: false,\n }\n : undefined,\n }\n }\n\n if (options?.wordmarkUrl) {\n return {\n id: `header-theme-${id}`,\n wordmark: {\n url: options.wordmarkUrl,\n altText: `${name} wordmark`,\n sensitive: false,\n },\n }\n }\n\n return undefined\n }\n\n return {\n id,\n name,\n primaryDomain: {\n url: `https://${name.toLowerCase().replace(/\\s+/g, '-')}.com`,\n },\n reviewAnalytics: {averageRating: 4.3, reviewCount: 50},\n visualTheme: {\n id: `visual-theme-${id}`,\n featuredImages,\n logoImage: {\n url: `https://picsum.photos/100/100?random=${id}`,\n sensitive: false,\n },\n brandSettings: shouldHaveBrandSettings\n ? {\n id: `brand-settings-${id}`,\n colors: {\n id: `colors-${id}`,\n ...getThemeColors(),\n },\n headerTheme: createHeaderTheme(),\n }\n : undefined,\n },\n }\n}\n\nconst createPagination = (hasNext = false) => ({\n hasNextPage: hasNext,\n endCursor: hasNext ? 'cursor123' : null,\n})\n\nconst createProductList = (id: string, name: string, products: any[] = []) => ({\n id,\n publicId: `public-${id}`,\n name,\n products,\n})\n\n// Helper type to extract the data type from a ShopAction\ntype ShopActionDataType<T> = T extends (\n ...args: any[]\n) => Promise<{ok: true; data: infer R} | {ok: false; error: any}>\n ? R\n : never\n\n// Use window._mockLogs instead of console.log so logs aren't stripped in production builds\n// This allows e2e tests to verify mock actions are being called\nexport interface MockLog {\n action: string\n params?: unknown\n}\n\ndeclare global {\n interface Window {\n _mockLogs?: MockLog[]\n }\n}\n\nfunction logMockAction(action: string, params?: unknown) {\n window._mockLogs = window._mockLogs || []\n window._mockLogs.push({action, params})\n}\n\nfunction makeMockMethod<K extends keyof ShopActions>(\n key: K,\n result: ShopActionDataType<ShopActions[K]>\n): ShopActions[K] {\n return ((params: Parameters<ShopActions[K]>[0]) => {\n logMockAction(String(key), params)\n return Promise.resolve({\n ok: true as const,\n data: result,\n mocked: true,\n })\n }) as ShopActions[K]\n}\n\nexport function makeMockActions(): ShopActions {\n const results: {\n [K in keyof ShopActions]: ShopActionDataType<ShopActions[K]>\n } = {\n translateContentUp: undefined,\n translateContentDown: undefined,\n followShop: true,\n unfollowShop: false,\n favorite: undefined,\n unfavorite: undefined,\n getShopAppInformation: {\n appVersion: '1.0.0',\n buildNumber: '12345',\n buildId: 'dev-build-123',\n },\n productRecommendationImpression: undefined,\n productRecommendationClick: undefined,\n closeMini: undefined,\n getAccountInformation: {\n status: 'available',\n value: 'user@example.com',\n },\n getCurrentUser: {\n data: {\n displayName: 'John Doe',\n avatarImage: {url: 'https://example.com/avatar.jpg'},\n },\n },\n createOrderAttribution: undefined,\n addToCart: undefined,\n buyProduct: undefined,\n buyProducts: undefined,\n showErrorScreen: undefined,\n showErrorToast: undefined,\n getDeeplinkPaths: {\n matchers: ['/products', '/collections', '/cart'],\n },\n navigateToDeeplink: undefined,\n navigateToShop: undefined,\n navigateToProduct: undefined,\n navigateToOrder: undefined,\n navigateToCheckout: undefined,\n createImageUploadLink: {\n // This action is mocked in the actual hook. See `useImageUpload` for more details.\n targets: [\n {\n url: 'https://example.com/upload',\n resourceUrl: 'https://example.com/resource',\n parameters: [{name: 'key', value: 'upload-123'}],\n },\n ],\n },\n completeImageUpload: {\n files: [\n {\n id: 'file-123',\n fileStatus: 'READY',\n image: {\n url: 'https://example.com/image.jpg',\n },\n },\n ],\n },\n getPersistedItem: null,\n setPersistedItem: undefined,\n removePersistedItem: undefined,\n getAllPersistedKeys: ['key1', 'key2', 'key3'],\n clearPersistedItems: undefined,\n getInternalPersistedItem: null,\n setInternalPersistedItem: undefined,\n removeInternalPersistedItem: undefined,\n getAllInternalPersistedKeys: ['internal-key1', 'internal-key2'],\n clearInternalPersistedItems: undefined,\n getSecret: 'secret-value',\n setSecret: undefined,\n removeSecret: undefined,\n reportInteraction: undefined,\n reportImpression: undefined,\n reportContentImpression: undefined,\n getProductLists: {\n data: [\n createProductList('list-1', 'Wishlist'),\n createProductList('list-2', 'Favorites'),\n ],\n pageInfo: createPagination(),\n },\n getProductList: {\n data: createProductList('list-1', 'Wishlist', [\n createProduct('prod-1', 'Sample Product'),\n ]),\n pageInfo: createPagination(),\n },\n addProductList: createProductList('list-3', 'New List'),\n removeProductList: undefined,\n renameProductList: createProductList('list-1', 'Updated Wishlist'),\n addProductListItem: undefined,\n removeProductListItem: undefined,\n getRecommendedProducts: {\n data: [\n createProduct('rec-1', 'Recommended Product 1', '79.99'),\n createProduct('rec-2', 'Recommended Product 2', '129.99'),\n createProduct('rec-3', 'Recommended Product 3', '129.99'),\n createProduct('rec-4', 'Recommended Product 4', '29.99'),\n createProduct('rec-5', 'Recommended Product 5', '39.99'),\n createProduct('rec-6', 'Recommended Product 6', '49.99'),\n createProduct('rec-7', 'Recommended Product 7', '59.99'),\n createProduct('rec-8', 'Recommended Product 8', '69.99'),\n createProduct('rec-9', 'Recommended Product 9', '129.99'),\n ],\n pageInfo: createPagination(),\n },\n getRecommendedShops: {\n data: [\n createShop('shop-1', 'Amazing Store'),\n createShop('shop-2', 'Best Deals Shop'),\n createShop('shop-3', 'Great Products'),\n createShop('shop-4', 'Top Brands'),\n createShop('shop-5', 'Exclusive Offers'),\n ],\n pageInfo: createPagination(),\n },\n searchProductsByShop: {\n data: [\n createProduct('search-1', 'Search Result 1', '59.99'),\n createProduct('search-2', 'Search Result 2', '89.99'),\n createProduct('search-3', 'Search Result 3', '119.99'),\n createProduct('search-4', 'Search Result 4', '149.99'),\n createProduct('search-5', 'Search Result 5', '179.99'),\n ],\n pageInfo: createPagination(),\n },\n getOrders: {\n data: [\n {\n id: 'order-1',\n name: '#1001',\n lineItems: [\n {\n productTitle: 'Sample Product',\n variantTitle: 'Medium',\n quantity: 2,\n product: null,\n },\n ],\n shop: createShop('shop-1', 'Sample Shop'),\n },\n ],\n pageInfo: createPagination(),\n },\n getBuyerAttributes: {\n data: {\n genderAffinity: 'NEUTRAL' as Gender,\n categoryAffinities: [\n {id: 'cat1', name: 'Electronics'},\n {id: 'cat2', name: 'Clothing'},\n ],\n },\n },\n showFeedbackSheet: undefined,\n getPopularProducts: {\n data: [\n createProduct('pop-1', 'The Hero Snowboard', '702.95'),\n createProduct('pop-2', 'Snow Jacket', '605.95', '702.00'),\n createProduct('pop-3', 'Winter Gloves', '89.95'),\n createProduct('pop-4', 'Summer Gloves', '89.95'),\n createProduct('pop-5', 'Spring Gloves', '89.95'),\n createProduct('pop-6', 'Playstation 5', '499.95'),\n createProduct('pop-7', 'Xbox Series X', '499.95'),\n createProduct('pop-8', 'Nintendo Switch', '299.95'),\n createProduct('pop-9', 'Playstation 4', '299.95'),\n createProduct('pop-10', 'Nintendo 3DS', '89.95'),\n ],\n pageInfo: createPagination(),\n },\n share: {\n message: 'Shared!',\n success: true,\n },\n shareSingle: {\n message: 'Shared!',\n success: true,\n },\n getSavedProducts: {\n data: [\n createProduct('saved-1', 'Saved Product 1', '49.99'),\n createProduct('saved-2', 'Saved Product 2', '59.99'),\n createProduct('saved-3', 'Saved Product 3', '69.99'),\n createProduct('saved-4', 'Saved Product 4', '79.99'),\n createProduct('saved-5', 'Saved Product 5', '89.99'),\n ],\n pageInfo: createPagination(),\n },\n getRecentProducts: {\n data: [\n createProduct('recent-1', 'Recent Product 1', '59.99'),\n createProduct('recent-2', 'Recent Product 2', '69.99'),\n createProduct('recent-3', 'Recent Product 3', '79.99'),\n createProduct('recent-4', 'Recent Product 4', '89.99'),\n createProduct('recent-5', 'Recent Product 5', '99.99'),\n ],\n pageInfo: createPagination(),\n },\n getProductSearch: {\n data: [\n createProduct('search-1', 'Search Product 1', '39.99'),\n createProduct('search-2', 'Search Product 2', '19.99'),\n createProduct('search-3', 'Search Product 3', '29.99'),\n createProduct('search-4', 'Search Product 4', '49.99'),\n createProduct('search-5', 'Search Product 5', '9.99'),\n ],\n pageInfo: createPagination(),\n },\n getProducts: {\n data: [\n createProduct('prod-1', 'Product 1', '9.99'),\n createProduct('prod-2', 'Product 2', '19.99'),\n createProduct('prod-3', 'Product 3', '29.99'),\n createProduct('prod-4', 'Product 4', '39.99'),\n createProduct('prod-5', 'Product 5', '49.99'),\n ],\n },\n getProduct: {data: createProduct('prod-1', 'Sample Product')},\n getProductVariants: {\n data: [\n {\n id: 'variant-1',\n title: 'Variant 1',\n isFavorited: false,\n image: {url: 'https://example.com/variant-1.jpg'},\n price: {amount: '19.99', currencyCode: 'USD'},\n compareAtPrice: {amount: '29.99', currencyCode: 'USD'},\n },\n ],\n pageInfo: createPagination(),\n },\n getProductMedia: {\n data: [\n {\n id: 'media-1',\n image: {url: 'https://example.com/media-1.jpg'},\n mediaContentType: 'IMAGE',\n alt: 'Sample product image',\n },\n ],\n pageInfo: createPagination(),\n },\n getProductReviews: {\n data: [\n createProductReview('review-1'),\n createProductReview('review-2', {rating: 4, title: 'Pretty good'}),\n createProductReview('review-3', {\n rating: 3,\n title: 'Okay',\n merchantReply: 'Thanks for the feedback!',\n merchantRepliedAt: new Date().toISOString(),\n }),\n ],\n pageInfo: createPagination(),\n },\n getShop: {\n data: createShop('shop-1', 'Sample Shop', {featuredImagesLimit: 4}),\n },\n getRecentShops: {\n data: [\n createShop('recent-shop-1', 'Recent Shop 1'),\n createShop('recent-shop-2', 'Recent Shop 2'),\n createShop('recent-shop-3', 'Recent Shop 3'),\n ],\n pageInfo: createPagination(),\n },\n getFollowedShops: {\n data: [\n createShop('followed-shop-1', 'Followed Shop 1'),\n createShop('followed-shop-2', 'Followed Shop 2'),\n createShop('followed-shop-3', 'Followed Shop 3'),\n ],\n pageInfo: createPagination(),\n },\n previewProductInAr: undefined,\n createContent: {\n data: {\n publicId: 'content-123',\n externalId: null,\n image: {\n id: 'img-123',\n url: 'https://cdn.shopify.com/s/files/1/0633/6574/2742/files/Namnlosdesign-47.png?v=1740438079',\n width: 800,\n height: 600,\n },\n title: 'Mock Content',\n description: 'This is a mock content item',\n visibility: ['DISCOVERABLE'],\n shareableUrl: 'https://example.com/content/123',\n products: null,\n },\n },\n getContent: {\n data: [\n {\n publicId: 'content-123',\n image: {\n id: 'img-123',\n url: 'https://cdn.shopify.com/s/files/1/0633/6574/2742/files/Namnlosdesign-47.png?v=1740438079',\n width: 800,\n height: 600,\n },\n title: 'Mock Content',\n visibility: ['DISCOVERABLE'],\n status: MinisContentStatus.READY,\n },\n ],\n },\n generateUserToken: {\n data: {\n token: 'user-token-123',\n expiresAt: '2025-01-01',\n userState: UserState.VERIFIED,\n },\n },\n navigateToCart: undefined,\n requestPermission: {\n granted: true,\n },\n reportError: undefined,\n reportFetch: undefined,\n } as const\n\n const mock: Partial<ShopActions> = {}\n for (const key in results) {\n if (Object.prototype.hasOwnProperty.call(results, key)) {\n // @ts-expect-error: dynamic assignment is safe due to exhaustive mapping\n mock[key] = makeMockMethod(\n key as keyof ShopActions,\n results[key as keyof typeof results]\n )\n }\n }\n return mock as ShopActions\n}\n\n// Detect if running on a mobile device\nconst isMobile = (): boolean => {\n const userAgent = navigator.userAgent.toLowerCase()\n const isIOS = /iphone|ipad|ipod/.test(userAgent)\n const isAndroid = /android/.test(userAgent)\n\n return isIOS || isAndroid\n}\n\nexport const injectMocks = ({force}: {force?: boolean} = {}) => {\n // Only inject mocks if we aren't on a mobile device or we force it\n if (isMobile() && !force) {\n return\n }\n\n if (!window.minisSDK) {\n window.minisSDK = makeMockActions()\n window.minisParams = {\n handle: 'mock-handle',\n initialUrl: '/',\n platform: 'web',\n }\n }\n}\n"],"names":["SAMPLE_IMAGE_NAMES","hashString","str","hash","i","createProduct","id","title","price","compareAtPrice","imageIndex","imageName","createShop","createProductReview","overrides","name","options","themeType","shouldHaveBrandSettings","featuredImagesCount","featuredImages","_","getThemeColors","createHeaderTheme","createPagination","hasNext","createProductList","products","logMockAction","action","params","makeMockMethod","key","result","makeMockActions","results","MinisContentStatus","UserState","mock","isMobile","userAgent","isIOS","isAndroid","injectMocks","force"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ function r(i) {
2
+ const { handle: n } = window.minisParams;
3
+ if (!n)
4
+ throw new Error("Mini handle is not set");
5
+ return `https://shop.app/mini/${n}${i}`;
6
+ }
7
+ export {
8
+ r as buildDeeplinkUrl
9
+ };
10
+ //# sourceMappingURL=buildDeeplinkUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildDeeplinkUrl.js","sources":["../../src/utils/buildDeeplinkUrl.ts"],"sourcesContent":["/**\n * Builds a deeplink URL for a Shop Mini.\n *\n * @param path - The path within the mini (should start with '/').\n * @returns The full deeplink URL. Structure: https://shop.app/mini/{handle}{path}\n *\n * @example\n * buildDeeplinkUrl('/products/123')\n * // Returns: 'https://shop.app/mini/my-mini/products/123'\n */\nexport function buildDeeplinkUrl(path: string): string {\n const {handle} = window.minisParams\n\n if (!handle) {\n throw new Error('Mini handle is not set')\n }\n\n return `https://shop.app/mini/${handle}${path}`\n}\n"],"names":["buildDeeplinkUrl","path","handle"],"mappings":"AAUO,SAASA,EAAiBC,GAAsB;AAC/C,QAAA,EAAC,QAAAC,MAAU,OAAO;AAExB,MAAI,CAACA;AACG,UAAA,IAAI,MAAM,wBAAwB;AAGnC,SAAA,yBAAyBA,CAAM,GAAGD,CAAI;AAC/C;"}
@@ -70,6 +70,9 @@
70
70
  "useProductMedia": [
71
71
  "GET_PRODUCT_MEDIA"
72
72
  ],
73
+ "useProductReviews": [
74
+ "GET_PRODUCT_REVIEWS"
75
+ ],
73
76
  "useProductSearch": [
74
77
  "GET_PRODUCT_SEARCH"
75
78
  ],
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shopify/shop-minis-react",
3
3
  "license": "SEE LICENSE IN LICENSE.txt",
4
- "version": "0.5.1",
4
+ "version": "0.6.1",
5
5
  "sideEffects": false,
6
6
  "type": "module",
7
7
  "engines": {
@@ -46,7 +46,7 @@
46
46
  "typescript": ">=5.0.0"
47
47
  },
48
48
  "dependencies": {
49
- "@shopify/shop-minis-platform": "0.8.5",
49
+ "@shopify/shop-minis-platform": "0.9.0",
50
50
  "@tailwindcss/vite": "4.1.8",
51
51
  "@tanstack/react-query": "5.86.0",
52
52
  "@types/color": "3.0.6",
@@ -18,6 +18,7 @@ export * from './product/useProduct'
18
18
  export * from './product/useProducts'
19
19
  export * from './product/useProductVariants'
20
20
  export * from './product/useProductMedia'
21
+ export * from './product/useProductReviews'
21
22
  export * from './product/useProductSearch'
22
23
  export * from './product/useRecommendedProducts'
23
24
  export * from './product/usePopularProducts'
@@ -0,0 +1,40 @@
1
+ import {useShopActionInfiniteQuery} from '../../internal/reactQuery'
2
+ import {useShopActions} from '../../internal/useShopActions'
3
+ import {
4
+ PaginatedDataHookOptionsBase,
5
+ PaginatedDataHookReturnsBase,
6
+ ProductReview,
7
+ } from '../../types'
8
+
9
+ export interface UseProductReviewsParams extends PaginatedDataHookOptionsBase {
10
+ /**
11
+ * The product ID to fetch reviews for.
12
+ */
13
+ id: string
14
+ }
15
+
16
+ interface UseProductReviewsReturns extends PaginatedDataHookReturnsBase {
17
+ /**
18
+ * The product reviews returned from the query.
19
+ */
20
+ reviews: ProductReview[] | null
21
+ }
22
+
23
+ export const useProductReviews = (
24
+ params: UseProductReviewsParams
25
+ ): UseProductReviewsReturns => {
26
+ const {getProductReviews} = useShopActions()
27
+ const {id, skip = false, ...restParams} = params
28
+
29
+ const {data, ...rest} = useShopActionInfiniteQuery(
30
+ ['productReviews', id, restParams],
31
+ getProductReviews,
32
+ {id, ...restParams},
33
+ {skip}
34
+ )
35
+
36
+ return {
37
+ ...rest,
38
+ reviews: data,
39
+ }
40
+ }
package/src/mocks.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  Product,
3
+ ProductReview,
3
4
  Gender,
4
5
  UserState,
5
6
  MinisContentStatus,
@@ -51,6 +52,22 @@ export const createProduct = (
51
52
  }
52
53
  }
53
54
 
55
+ export const createProductReview = (
56
+ id: string,
57
+ overrides: Partial<ProductReview> = {}
58
+ ): ProductReview => {
59
+ return {
60
+ id,
61
+ rating: 5,
62
+ title: 'Great product',
63
+ body: 'Loved it. Would buy again.',
64
+ submittedAt: new Date().toISOString(),
65
+ merchantReply: null,
66
+ merchantRepliedAt: null,
67
+ ...overrides,
68
+ }
69
+ }
70
+
54
71
  export const createShop = (
55
72
  id: string,
56
73
  name: string,
@@ -478,6 +495,19 @@ export function makeMockActions(): ShopActions {
478
495
  ],
479
496
  pageInfo: createPagination(),
480
497
  },
498
+ getProductReviews: {
499
+ data: [
500
+ createProductReview('review-1'),
501
+ createProductReview('review-2', {rating: 4, title: 'Pretty good'}),
502
+ createProductReview('review-3', {
503
+ rating: 3,
504
+ title: 'Okay',
505
+ merchantReply: 'Thanks for the feedback!',
506
+ merchantRepliedAt: new Date().toISOString(),
507
+ }),
508
+ ],
509
+ pageInfo: createPagination(),
510
+ },
481
511
  getShop: {
482
512
  data: createShop('shop-1', 'Sample Shop', {featuredImagesLimit: 4}),
483
513
  },
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Builds a deeplink URL for a Shop Mini.
3
+ *
4
+ * @param path - The path within the mini (should start with '/').
5
+ * @returns The full deeplink URL. Structure: https://shop.app/mini/{handle}{path}
6
+ *
7
+ * @example
8
+ * buildDeeplinkUrl('/products/123')
9
+ * // Returns: 'https://shop.app/mini/my-mini/products/123'
10
+ */
11
+ export function buildDeeplinkUrl(path: string): string {
12
+ const {handle} = window.minisParams
13
+
14
+ if (!handle) {
15
+ throw new Error('Mini handle is not set')
16
+ }
17
+
18
+ return `https://shop.app/mini/${handle}${path}`
19
+ }
@@ -1,3 +1,4 @@
1
+ export * from './buildDeeplinkUrl'
1
2
  export * from './errors'
2
3
  export * from './merchant-card'
3
4
  export * from './parseUrl'