@shopify/shop-minis-react 0.7.0 → 0.8.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.
- package/dist/components/atoms/static-area.js +23 -0
- package/dist/components/atoms/static-area.js.map +1 -0
- package/dist/hooks/product/useARPreview.js +12 -0
- package/dist/hooks/product/useARPreview.js.map +1 -0
- package/dist/index.js +238 -234
- package/dist/index.js.map +1 -1
- package/dist/mocks.js +1 -1
- package/dist/mocks.js.map +1 -1
- package/package.json +2 -2
- package/src/components/atoms/static-area.tsx +28 -0
- package/src/components/index.ts +1 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/product/useARPreview.ts +21 -0
- package/src/mocks.ts +1 -1
- package/src/styles/animations.css +12 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
function n({
|
|
3
|
+
position: i,
|
|
4
|
+
children: t
|
|
5
|
+
}) {
|
|
6
|
+
return /* @__PURE__ */ e(
|
|
7
|
+
"div",
|
|
8
|
+
{
|
|
9
|
+
style: {
|
|
10
|
+
position: "fixed",
|
|
11
|
+
left: 0,
|
|
12
|
+
right: 0,
|
|
13
|
+
[i]: 0,
|
|
14
|
+
viewTransitionName: `minis-fixed-${i}`
|
|
15
|
+
},
|
|
16
|
+
children: t
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
n as StaticArea
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=static-area.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-area.js","sources":["../../../src/components/atoms/static-area.tsx"],"sourcesContent":["export interface StaticAreaDocProps {\n /** Position of the fixed area on screen - either pinned to top or bottom */\n position: 'top' | 'bottom'\n /** Static area content */\n children?: React.ReactNode\n}\n\nexport function StaticArea({\n position,\n children,\n}: {\n position: 'top' | 'bottom'\n children: React.ReactNode\n}) {\n return (\n <div\n style={{\n position: 'fixed',\n left: 0,\n right: 0,\n [position]: 0,\n viewTransitionName: `minis-fixed-${position}`,\n }}\n >\n {children}\n </div>\n )\n}\n"],"names":["StaticArea","position","children","jsx"],"mappings":";AAOO,SAASA,EAAW;AAAA,EACzB,UAAAC;AAAA,EACA,UAAAC;AACF,GAGG;AAEC,SAAA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA,QACP,CAACF,CAAQ,GAAG;AAAA,QACZ,oBAAoB,eAAeA,CAAQ;AAAA,MAC7C;AAAA,MAEC,UAAAC;AAAA,IAAA;AAAA,EACH;AAEJ;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useHandleAction as o } from "../../internal/useHandleAction.js";
|
|
2
|
+
import { useShopActions as r } from "../../internal/useShopActions.js";
|
|
3
|
+
const i = () => {
|
|
4
|
+
const { previewProductInAR: e } = r();
|
|
5
|
+
return {
|
|
6
|
+
previewProductInAR: o(e)
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
i as useARPreview
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=useARPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useARPreview.js","sources":["../../../src/hooks/product/useARPreview.ts"],"sourcesContent":["import {PreviewProductInARParams} from '@shopify/shop-minis-platform/actions'\n\nimport {useHandleAction} from '../../internal/useHandleAction'\nimport {useShopActions} from '../../internal/useShopActions'\n\ninterface UseARPreviewReturns {\n /**\n * Previews a product in AR. Fetches the product's 3D model and launches the native AR viewer.\n * @param params - The parameters for the AR preview, including the product ID.\n * @throws Error if the product has no 3D model or if the model sources are missing.\n */\n previewProductInAR: (params: PreviewProductInARParams) => Promise<void>\n}\n\nexport const useARPreview = (): UseARPreviewReturns => {\n const {previewProductInAR} = useShopActions()\n\n return {\n previewProductInAR: useHandleAction(previewProductInAR),\n }\n}\n"],"names":["useARPreview","previewProductInAR","useShopActions","useHandleAction"],"mappings":";;AAcO,MAAMA,IAAe,MAA2B;AAC/C,QAAA,EAAC,oBAAAC,EAAkB,IAAIC,EAAe;AAErC,SAAA;AAAA,IACL,oBAAoBC,EAAgBF,CAAkB;AAAA,EACxD;AACF;"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { DATA_NAVIGATION_TYPE_ATTRIBUTE as o, NAVIGATION_TYPES as t } from "./types/index.js";
|
|
2
2
|
import { MinisContainer as i } from "./components/MinisContainer.js";
|
|
3
|
-
import { AddToCartButton as
|
|
3
|
+
import { AddToCartButton as m } 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
|
|
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";
|
|
6
6
|
import { ProductLink as T } from "./components/commerce/product-link.js";
|
|
7
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";
|
|
@@ -19,157 +19,159 @@ import { Image as rr } from "./components/atoms/image.js";
|
|
|
19
19
|
import { Touchable as or } from "./components/atoms/touchable.js";
|
|
20
20
|
import { LongPressDetector as ar } from "./components/atoms/long-press-detector.js";
|
|
21
21
|
import { AlertDialogAtom as pr } from "./components/atoms/alert-dialog.js";
|
|
22
|
-
import { List as
|
|
22
|
+
import { List as nr } from "./components/atoms/list.js";
|
|
23
23
|
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 {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import {
|
|
50
|
-
import {
|
|
51
|
-
import {
|
|
52
|
-
import {
|
|
53
|
-
import {
|
|
54
|
-
import {
|
|
55
|
-
import {
|
|
56
|
-
import {
|
|
57
|
-
import {
|
|
58
|
-
import {
|
|
59
|
-
import {
|
|
60
|
-
import {
|
|
61
|
-
import {
|
|
62
|
-
import {
|
|
63
|
-
import {
|
|
64
|
-
import {
|
|
65
|
-
import {
|
|
66
|
-
import {
|
|
67
|
-
import {
|
|
68
|
-
import {
|
|
69
|
-
import {
|
|
70
|
-
import {
|
|
71
|
-
import {
|
|
72
|
-
import {
|
|
73
|
-
import {
|
|
74
|
-
import {
|
|
75
|
-
import {
|
|
76
|
-
import {
|
|
77
|
-
import {
|
|
78
|
-
import {
|
|
79
|
-
import {
|
|
80
|
-
import {
|
|
81
|
-
import {
|
|
82
|
-
import {
|
|
83
|
-
import {
|
|
84
|
-
import {
|
|
85
|
-
import {
|
|
86
|
-
import {
|
|
87
|
-
import {
|
|
88
|
-
import {
|
|
89
|
-
import {
|
|
90
|
-
import {
|
|
91
|
-
import {
|
|
92
|
-
import {
|
|
93
|
-
import {
|
|
94
|
-
import {
|
|
95
|
-
import {
|
|
96
|
-
import {
|
|
97
|
-
import {
|
|
98
|
-
import {
|
|
99
|
-
import {
|
|
100
|
-
import {
|
|
27
|
+
import { StaticArea as Sr } from "./components/atoms/static-area.js";
|
|
28
|
+
import { Accordion as Dr, AccordionContent as Pr, AccordionItem as Tr, AccordionTrigger as hr } from "./components/ui/accordion.js";
|
|
29
|
+
import { Alert as Rr, AlertDescription as vr, AlertTitle as wr } from "./components/ui/alert.js";
|
|
30
|
+
import { AlertDialog as Er, AlertDialogAction as Mr, AlertDialogCancel as Fr, AlertDialogContent as Ur, AlertDialogDescription as br, AlertDialogFooter as Lr, AlertDialogHeader as kr, AlertDialogOverlay as Nr, AlertDialogPortal as Or, AlertDialogTitle as _r, AlertDialogTrigger as yr } from "./components/ui/alert-dialog.js";
|
|
31
|
+
import { Avatar as Hr, AvatarFallback as Vr, AvatarImage as zr } from "./components/ui/avatar.js";
|
|
32
|
+
import { Badge as Yr, badgeVariants as qr } from "./components/ui/badge.js";
|
|
33
|
+
import { Card as Qr, CardAction as Zr, CardContent as jr, CardDescription as Jr, CardFooter as Xr, CardHeader as $r, CardTitle as re } from "./components/ui/card.js";
|
|
34
|
+
import { Carousel as oe, CarouselContent as te, CarouselItem as ae, CarouselNext as ie, CarouselPrevious as pe } from "./components/ui/carousel.js";
|
|
35
|
+
import { Checkbox as ne } from "./components/ui/checkbox.js";
|
|
36
|
+
import { Dialog as le, DialogClose as ue, DialogContent as fe, DialogDescription as xe, DialogFooter as ce, DialogHeader as de, DialogOverlay as Ce, DialogPortal as ge, DialogTitle as Se, DialogTrigger as Ae } from "./components/ui/dialog.js";
|
|
37
|
+
import { Drawer as Pe, DrawerClose as Te, DrawerContent as he, DrawerDescription as Ie, DrawerFooter as Re, DrawerHeader as ve, DrawerOverlay as we, DrawerPortal as Be, DrawerTitle as Ee, DrawerTrigger as Me } from "./components/ui/drawer.js";
|
|
38
|
+
import { Input as Ue } from "./components/ui/input.js";
|
|
39
|
+
import { Label as Le } from "./components/ui/label.js";
|
|
40
|
+
import { Progress as Ne } from "./components/ui/progress.js";
|
|
41
|
+
import { RadioGroup as _e, RadioGroupItem as ye } from "./components/ui/radio-group.js";
|
|
42
|
+
import { ResizableHandle as He, ResizablePanel as Ve, ResizablePanelGroup as ze } from "./components/ui/resizable.js";
|
|
43
|
+
import { ScrollArea as Ye, ScrollBar as qe } from "./components/ui/scroll-area.js";
|
|
44
|
+
import { Select as Qe, SelectContent as Ze, SelectGroup as je, SelectItem as Je, SelectLabel as Xe, SelectScrollDownButton as $e, SelectScrollUpButton as ro, SelectSeparator as eo, SelectTrigger as oo, SelectValue as to } from "./components/ui/select.js";
|
|
45
|
+
import { Separator as io } from "./components/ui/separator.js";
|
|
46
|
+
import { Sheet as mo, SheetClose as no, SheetContent as so, SheetDescription as lo, SheetFooter as uo, SheetHeader as fo, SheetTitle as xo, SheetTrigger as co } from "./components/ui/sheet.js";
|
|
47
|
+
import { Toaster as go } from "./components/ui/sonner.js";
|
|
48
|
+
import { toast as Ao } 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";
|
|
49
|
+
import { Skeleton as Po } from "./components/ui/skeleton.js";
|
|
50
|
+
import { useRecentProducts as ho } from "./hooks/user/useRecentProducts.js";
|
|
51
|
+
import { useRecentShops as Ro } from "./hooks/user/useRecentShops.js";
|
|
52
|
+
import { useSavedProducts as wo } from "./hooks/user/useSavedProducts.js";
|
|
53
|
+
import { useSavedProductsActions as Eo } from "./hooks/user/useSavedProductsActions.js";
|
|
54
|
+
import { useFollowedShops as Fo } from "./hooks/user/useFollowedShops.js";
|
|
55
|
+
import { useFollowedShopsActions as bo } from "./hooks/user/useFollowedShopsActions.js";
|
|
56
|
+
import { useCurrentUser as ko } from "./hooks/user/useCurrentUser.js";
|
|
57
|
+
import { useOrders as Oo } from "./hooks/user/useOrders.js";
|
|
58
|
+
import { useBuyerAttributes as yo } from "./hooks/user/useBuyerAttributes.js";
|
|
59
|
+
import { useGenerateUserToken as Ho } from "./hooks/user/useGenerateUserToken.js";
|
|
60
|
+
import { useProductListActions as zo } from "./hooks/product/useProductListActions.js";
|
|
61
|
+
import { useProductLists as Yo } from "./hooks/product/useProductLists.js";
|
|
62
|
+
import { useProductList as Ko } from "./hooks/product/useProductList.js";
|
|
63
|
+
import { useProduct as Zo } from "./hooks/product/useProduct.js";
|
|
64
|
+
import { useProducts as Jo } from "./hooks/product/useProducts.js";
|
|
65
|
+
import { useProductVariants as $o } from "./hooks/product/useProductVariants.js";
|
|
66
|
+
import { useProductMedia as et } from "./hooks/product/useProductMedia.js";
|
|
67
|
+
import { useProductReviews as tt } from "./hooks/product/useProductReviews.js";
|
|
68
|
+
import { useProductSearch as it } from "./hooks/product/useProductSearch.js";
|
|
69
|
+
import { useRecommendedProducts as mt } from "./hooks/product/useRecommendedProducts.js";
|
|
70
|
+
import { usePopularProducts as st } from "./hooks/product/usePopularProducts.js";
|
|
71
|
+
import { useARPreview as ut } from "./hooks/product/useARPreview.js";
|
|
72
|
+
import { useAsyncStorage as xt } from "./hooks/storage/useAsyncStorage.js";
|
|
73
|
+
import { useSecureStorage as dt } from "./hooks/storage/useSecureStorage.js";
|
|
74
|
+
import { useImageUpload as gt } from "./hooks/storage/useImageUpload.js";
|
|
75
|
+
import { useShopNavigation as At } from "./hooks/navigation/useShopNavigation.js";
|
|
76
|
+
import { useCloseMini as Pt } from "./hooks/navigation/useCloseMini.js";
|
|
77
|
+
import { useDeeplink as ht } from "./hooks/navigation/useDeeplink.js";
|
|
78
|
+
import { useNavigateWithTransition as Rt } from "./hooks/navigation/useNavigateWithTransition.js";
|
|
79
|
+
import { useShop as wt } from "./hooks/shop/useShop.js";
|
|
80
|
+
import { useRecommendedShops as Et } from "./hooks/shop/useRecommendedShops.js";
|
|
81
|
+
import { useCreateImageContent as Ft } from "./hooks/content/useCreateImageContent.js";
|
|
82
|
+
import { useErrorToast as bt } from "./hooks/util/useErrorToast.js";
|
|
83
|
+
import { useErrorScreen as kt } from "./hooks/util/useErrorScreen.js";
|
|
84
|
+
import { useShare as Ot } from "./hooks/util/useShare.js";
|
|
85
|
+
import { useImagePicker as yt } from "./hooks/util/useImagePicker.js";
|
|
86
|
+
import { useKeyboardAvoidingView as Ht } from "./hooks/util/useKeyboardAvoidingView.js";
|
|
87
|
+
import { useRequestPermissions as zt } from "./hooks/util/useRequestPermissions.js";
|
|
88
|
+
import { useOnMiniFocus as Yt } from "./hooks/events/useOnMiniFocus.js";
|
|
89
|
+
import { useOnMiniBlur as Kt } from "./hooks/events/useOnMiniBlur.js";
|
|
90
|
+
import { useOnMiniClose as Zt } from "./hooks/events/useOnMiniClose.js";
|
|
91
|
+
import { useOnAppStateChange as Jt } from "./hooks/events/useOnAppStateChange.js";
|
|
92
|
+
import { useOnNavigateBack as $t } from "./hooks/events/useOnNavigateBack.js";
|
|
93
|
+
import { buildDeeplinkUrl as ea } from "./utils/buildDeeplinkUrl.js";
|
|
94
|
+
import { MiniEntityNotFoundError as ta, MiniError as aa, MiniNetworkError as ia, formatError as pa } from "./utils/errors.js";
|
|
95
|
+
import { extractBrandTheme as na, formatReviewCount as sa, getFeaturedImages as la, normalizeRating as ua } from "./utils/merchant-card.js";
|
|
96
|
+
import { parseUrl as xa } from "./utils/parseUrl.js";
|
|
97
|
+
import { dataURLToBlob as da, fileToDataUri as Ca, getResizedImageUrl as ga, getThumbhashBlobURL as Sa, getThumbhashDataURL as Aa } from "./utils/image.js";
|
|
98
|
+
import { formatMoney as Pa } from "./utils/formatMoney.js";
|
|
99
|
+
import { UserState as ha, UserTokenGenerateUserErrorCode as Ia } from "./shop-minis-platform/src/types/user.js";
|
|
100
|
+
import { ContentCreateUserErrorCode as va, MinisContentStatus as wa } from "./shop-minis-platform/src/types/content.js";
|
|
101
|
+
import { Social as Ea } from "./shop-minis-platform/src/types/share.js";
|
|
102
|
+
import { DATA_FETCHING_DEFAULT_FETCH_POLICY as Fa, DATA_FETCHING_DEFAULT_PAGE_SIZE as Ua } from "./shop-minis-platform/src/constants.js";
|
|
101
103
|
export {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
104
|
+
Dr as Accordion,
|
|
105
|
+
Pr as AccordionContent,
|
|
106
|
+
Tr as AccordionItem,
|
|
107
|
+
hr as AccordionTrigger,
|
|
108
|
+
m as AddToCartButton,
|
|
109
|
+
Rr as Alert,
|
|
110
|
+
vr as AlertDescription,
|
|
111
|
+
Er as AlertDialog,
|
|
112
|
+
Mr as AlertDialogAction,
|
|
111
113
|
pr as AlertDialogAtom,
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
114
|
+
Fr as AlertDialogCancel,
|
|
115
|
+
Ur as AlertDialogContent,
|
|
116
|
+
br as AlertDialogDescription,
|
|
117
|
+
Lr as AlertDialogFooter,
|
|
118
|
+
kr as AlertDialogHeader,
|
|
119
|
+
Nr as AlertDialogOverlay,
|
|
120
|
+
Or as AlertDialogPortal,
|
|
121
|
+
_r as AlertDialogTitle,
|
|
122
|
+
yr as AlertDialogTrigger,
|
|
123
|
+
wr as AlertTitle,
|
|
124
|
+
Hr as Avatar,
|
|
125
|
+
Vr as AvatarFallback,
|
|
126
|
+
zr as AvatarImage,
|
|
127
|
+
Yr as Badge,
|
|
126
128
|
j as Button,
|
|
127
129
|
s as BuyNowButton,
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
130
|
+
Qr as Card,
|
|
131
|
+
Zr as CardAction,
|
|
132
|
+
jr as CardContent,
|
|
133
|
+
Jr as CardDescription,
|
|
134
|
+
Xr as CardFooter,
|
|
135
|
+
$r as CardHeader,
|
|
136
|
+
re as CardTitle,
|
|
137
|
+
oe as Carousel,
|
|
138
|
+
te as CarouselContent,
|
|
139
|
+
ae as CarouselItem,
|
|
140
|
+
ie as CarouselNext,
|
|
141
|
+
pe as CarouselPrevious,
|
|
142
|
+
ne as Checkbox,
|
|
143
|
+
va as ContentCreateUserErrorCode,
|
|
142
144
|
cr as ContentWrapper,
|
|
143
|
-
|
|
144
|
-
|
|
145
|
+
Fa as DATA_FETCHING_DEFAULT_FETCH_POLICY,
|
|
146
|
+
Ua as DATA_FETCHING_DEFAULT_PAGE_SIZE,
|
|
145
147
|
o as DATA_NAVIGATION_TYPE_ATTRIBUTE,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
148
|
+
le as Dialog,
|
|
149
|
+
ue as DialogClose,
|
|
150
|
+
fe as DialogContent,
|
|
151
|
+
xe as DialogDescription,
|
|
152
|
+
ce as DialogFooter,
|
|
153
|
+
de as DialogHeader,
|
|
154
|
+
Ce as DialogOverlay,
|
|
155
|
+
ge as DialogPortal,
|
|
156
|
+
Se as DialogTitle,
|
|
157
|
+
Ae as DialogTrigger,
|
|
158
|
+
Pe as Drawer,
|
|
159
|
+
Te as DrawerClose,
|
|
160
|
+
he as DrawerContent,
|
|
161
|
+
Ie as DrawerDescription,
|
|
162
|
+
Re as DrawerFooter,
|
|
163
|
+
ve as DrawerHeader,
|
|
164
|
+
we as DrawerOverlay,
|
|
165
|
+
Be as DrawerPortal,
|
|
166
|
+
Ee as DrawerTitle,
|
|
167
|
+
Me as DrawerTrigger,
|
|
166
168
|
V as FavoriteButton,
|
|
167
169
|
X as IconButton,
|
|
168
170
|
rr as Image,
|
|
169
171
|
W as ImageContentWrapper,
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
172
|
+
Ue as Input,
|
|
173
|
+
Le as Label,
|
|
174
|
+
nr as List,
|
|
173
175
|
ar as LongPressDetector,
|
|
174
176
|
I as MerchantCard,
|
|
175
177
|
R as MerchantCardContainer,
|
|
@@ -178,11 +180,11 @@ export {
|
|
|
178
180
|
B as MerchantCardName,
|
|
179
181
|
E as MerchantCardRating,
|
|
180
182
|
b as MerchantCardSkeleton,
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
183
|
+
ta as MiniEntityNotFoundError,
|
|
184
|
+
aa as MiniError,
|
|
185
|
+
ia as MiniNetworkError,
|
|
184
186
|
i as MinisContainer,
|
|
185
|
-
|
|
187
|
+
wa as MinisContentStatus,
|
|
186
188
|
q as MinisRouter,
|
|
187
189
|
t as NAVIGATION_TYPES,
|
|
188
190
|
u as ProductCard,
|
|
@@ -193,108 +195,110 @@ export {
|
|
|
193
195
|
C as ProductCardImageContainer,
|
|
194
196
|
g as ProductCardInfo,
|
|
195
197
|
S as ProductCardPrice,
|
|
196
|
-
|
|
198
|
+
A as ProductCardReviewStars,
|
|
197
199
|
F as ProductCardSkeleton,
|
|
198
|
-
|
|
200
|
+
D as ProductCardTitle,
|
|
199
201
|
T as ProductLink,
|
|
200
202
|
Cr as ProductVariantPrice,
|
|
201
|
-
|
|
203
|
+
Ne as Progress,
|
|
202
204
|
k as QuantitySelector,
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
205
|
+
_e as RadioGroup,
|
|
206
|
+
ye as RadioGroupItem,
|
|
207
|
+
He as ResizableHandle,
|
|
208
|
+
Ve as ResizablePanel,
|
|
209
|
+
ze as ResizablePanelGroup,
|
|
210
|
+
Ye as ScrollArea,
|
|
211
|
+
qe as ScrollBar,
|
|
210
212
|
O as Search,
|
|
211
213
|
_ as SearchInput,
|
|
212
214
|
y as SearchProvider,
|
|
213
215
|
G as SearchResultsList,
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
216
|
+
Qe as Select,
|
|
217
|
+
Ze as SelectContent,
|
|
218
|
+
je as SelectGroup,
|
|
219
|
+
Je as SelectItem,
|
|
220
|
+
Xe as SelectLabel,
|
|
221
|
+
$e as SelectScrollDownButton,
|
|
222
|
+
ro as SelectScrollUpButton,
|
|
223
|
+
eo as SelectSeparator,
|
|
224
|
+
oo as SelectTrigger,
|
|
225
|
+
to as SelectValue,
|
|
226
|
+
io as Separator,
|
|
227
|
+
mo as Sheet,
|
|
228
|
+
no as SheetClose,
|
|
229
|
+
so as SheetContent,
|
|
230
|
+
lo as SheetDescription,
|
|
231
|
+
uo as SheetFooter,
|
|
232
|
+
fo as SheetHeader,
|
|
233
|
+
xo as SheetTitle,
|
|
234
|
+
co as SheetTrigger,
|
|
235
|
+
Po as Skeleton,
|
|
236
|
+
Ea as Social,
|
|
237
|
+
Sr as StaticArea,
|
|
235
238
|
fr as TextInput,
|
|
236
|
-
|
|
239
|
+
go as Toaster,
|
|
237
240
|
or as Touchable,
|
|
238
241
|
Q as TransitionLink,
|
|
239
|
-
|
|
240
|
-
|
|
242
|
+
ha as UserState,
|
|
243
|
+
Ia as UserTokenGenerateUserErrorCode,
|
|
241
244
|
lr as VideoPlayer,
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
Fo as
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
zo as
|
|
283
|
-
|
|
284
|
-
et as
|
|
285
|
-
tt as
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
ho as
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
wo as
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
245
|
+
qr as badgeVariants,
|
|
246
|
+
ea as buildDeeplinkUrl,
|
|
247
|
+
da as dataURLToBlob,
|
|
248
|
+
na as extractBrandTheme,
|
|
249
|
+
Ca as fileToDataUri,
|
|
250
|
+
pa as formatError,
|
|
251
|
+
Pa as formatMoney,
|
|
252
|
+
sa as formatReviewCount,
|
|
253
|
+
la as getFeaturedImages,
|
|
254
|
+
ga as getResizedImageUrl,
|
|
255
|
+
Sa as getThumbhashBlobURL,
|
|
256
|
+
Aa as getThumbhashDataURL,
|
|
257
|
+
ua as normalizeRating,
|
|
258
|
+
xa as parseUrl,
|
|
259
|
+
Ao as toast,
|
|
260
|
+
ut as useARPreview,
|
|
261
|
+
xt as useAsyncStorage,
|
|
262
|
+
yo as useBuyerAttributes,
|
|
263
|
+
Pt as useCloseMini,
|
|
264
|
+
Ft as useCreateImageContent,
|
|
265
|
+
ko as useCurrentUser,
|
|
266
|
+
ht as useDeeplink,
|
|
267
|
+
kt as useErrorScreen,
|
|
268
|
+
bt as useErrorToast,
|
|
269
|
+
Fo as useFollowedShops,
|
|
270
|
+
bo as useFollowedShopsActions,
|
|
271
|
+
Ho as useGenerateUserToken,
|
|
272
|
+
yt as useImagePicker,
|
|
273
|
+
gt as useImageUpload,
|
|
274
|
+
Ht as useKeyboardAvoidingView,
|
|
275
|
+
Rt as useNavigateWithTransition,
|
|
276
|
+
Jt as useOnAppStateChange,
|
|
277
|
+
Kt as useOnMiniBlur,
|
|
278
|
+
Zt as useOnMiniClose,
|
|
279
|
+
Yt as useOnMiniFocus,
|
|
280
|
+
$t as useOnNavigateBack,
|
|
281
|
+
Oo as useOrders,
|
|
282
|
+
st as usePopularProducts,
|
|
283
|
+
Zo as useProduct,
|
|
284
|
+
Ko as useProductList,
|
|
285
|
+
zo as useProductListActions,
|
|
286
|
+
Yo as useProductLists,
|
|
287
|
+
et as useProductMedia,
|
|
288
|
+
tt as useProductReviews,
|
|
289
|
+
it as useProductSearch,
|
|
290
|
+
$o as useProductVariants,
|
|
291
|
+
Jo as useProducts,
|
|
292
|
+
ho as useRecentProducts,
|
|
293
|
+
Ro as useRecentShops,
|
|
294
|
+
mt as useRecommendedProducts,
|
|
295
|
+
Et as useRecommendedShops,
|
|
296
|
+
zt as useRequestPermissions,
|
|
297
|
+
wo as useSavedProducts,
|
|
298
|
+
Eo as useSavedProductsActions,
|
|
299
|
+
dt as useSecureStorage,
|
|
300
|
+
Ot as useShare,
|
|
301
|
+
wt as useShop,
|
|
302
|
+
At as useShopNavigation
|
|
299
303
|
};
|
|
300
304
|
//# 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
package/dist/mocks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 privacyStatus: 'PRIVATE' as const,\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 setProductListVisibility: createProductList('list-1', '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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"}
|
|
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 privacyStatus: 'PRIVATE' as const,\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 setProductListVisibility: createProductList('list-1', '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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"}
|
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.
|
|
4
|
+
"version": "0.8.0",
|
|
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.
|
|
49
|
+
"@shopify/shop-minis-platform": "0.11.0",
|
|
50
50
|
"@tailwindcss/vite": "4.1.8",
|
|
51
51
|
"@tanstack/react-query": "5.86.0",
|
|
52
52
|
"@types/color": "3.0.6",
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface StaticAreaDocProps {
|
|
2
|
+
/** Position of the fixed area on screen - either pinned to top or bottom */
|
|
3
|
+
position: 'top' | 'bottom'
|
|
4
|
+
/** Static area content */
|
|
5
|
+
children?: React.ReactNode
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function StaticArea({
|
|
9
|
+
position,
|
|
10
|
+
children,
|
|
11
|
+
}: {
|
|
12
|
+
position: 'top' | 'bottom'
|
|
13
|
+
children: React.ReactNode
|
|
14
|
+
}) {
|
|
15
|
+
return (
|
|
16
|
+
<div
|
|
17
|
+
style={{
|
|
18
|
+
position: 'fixed',
|
|
19
|
+
left: 0,
|
|
20
|
+
right: 0,
|
|
21
|
+
[position]: 0,
|
|
22
|
+
viewTransitionName: `minis-fixed-${position}`,
|
|
23
|
+
}}
|
|
24
|
+
>
|
|
25
|
+
{children}
|
|
26
|
+
</div>
|
|
27
|
+
)
|
|
28
|
+
}
|
package/src/components/index.ts
CHANGED
|
@@ -27,6 +27,7 @@ export * from './atoms/video-player'
|
|
|
27
27
|
export * from './atoms/text-input'
|
|
28
28
|
export * from './atoms/content-wrapper'
|
|
29
29
|
export * from './atoms/product-variant-price'
|
|
30
|
+
export * from './atoms/static-area'
|
|
30
31
|
|
|
31
32
|
export * from './ui/accordion'
|
|
32
33
|
export * from './ui/alert'
|
package/src/hooks/index.ts
CHANGED
|
@@ -22,6 +22,7 @@ export * from './product/useProductReviews'
|
|
|
22
22
|
export * from './product/useProductSearch'
|
|
23
23
|
export * from './product/useRecommendedProducts'
|
|
24
24
|
export * from './product/usePopularProducts'
|
|
25
|
+
export * from './product/useARPreview'
|
|
25
26
|
|
|
26
27
|
// - Storage Hooks
|
|
27
28
|
export * from './storage/useAsyncStorage'
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {PreviewProductInARParams} from '@shopify/shop-minis-platform/actions'
|
|
2
|
+
|
|
3
|
+
import {useHandleAction} from '../../internal/useHandleAction'
|
|
4
|
+
import {useShopActions} from '../../internal/useShopActions'
|
|
5
|
+
|
|
6
|
+
interface UseARPreviewReturns {
|
|
7
|
+
/**
|
|
8
|
+
* Previews a product in AR. Fetches the product's 3D model and launches the native AR viewer.
|
|
9
|
+
* @param params - The parameters for the AR preview, including the product ID.
|
|
10
|
+
* @throws Error if the product has no 3D model or if the model sources are missing.
|
|
11
|
+
*/
|
|
12
|
+
previewProductInAR: (params: PreviewProductInARParams) => Promise<void>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const useARPreview = (): UseARPreviewReturns => {
|
|
16
|
+
const {previewProductInAR} = useShopActions()
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
previewProductInAR: useHandleAction(previewProductInAR),
|
|
20
|
+
}
|
|
21
|
+
}
|
package/src/mocks.ts
CHANGED
|
@@ -141,4 +141,16 @@
|
|
|
141
141
|
animation: 0 !important;
|
|
142
142
|
opacity: 0 !important;
|
|
143
143
|
}
|
|
144
|
+
|
|
145
|
+
/* Fixed elements that persist across view transitions */
|
|
146
|
+
::view-transition-group(minis-fixed-top),
|
|
147
|
+
::view-transition-old(minis-fixed-top),
|
|
148
|
+
::view-transition-new(minis-fixed-top),
|
|
149
|
+
::view-transition-group(minis-fixed-bottom),
|
|
150
|
+
::view-transition-old(minis-fixed-bottom),
|
|
151
|
+
::view-transition-new(minis-fixed-bottom) {
|
|
152
|
+
animation: none !important;
|
|
153
|
+
}
|
|
144
154
|
}
|
|
155
|
+
|
|
156
|
+
|