@tapcart/mobile-components 0.17.1 → 0.18.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/core/icon.d.ts.map +1 -1
- package/dist/components/hooks/use-create-review.d.ts +41 -0
- package/dist/components/hooks/use-create-review.d.ts.map +1 -0
- package/dist/components/hooks/use-create-review.js +128 -0
- package/dist/components/hooks/use-infinite-scroll-sort-key.test.d.ts +2 -0
- package/dist/components/hooks/use-infinite-scroll-sort-key.test.d.ts.map +1 -0
- package/dist/components/hooks/use-infinite-scroll-sort-key.test.js +68 -0
- package/dist/components/hooks/use-recommendations.d.ts +8 -1
- package/dist/components/hooks/use-recommendations.d.ts.map +1 -1
- package/dist/components/hooks/use-recommendations.js +5 -4
- package/dist/components/hooks/use-recommendations.test.js +21 -0
- package/dist/components/hooks/use-sort-filter.js +1 -1
- package/dist/components/libs/sort-filter/custom-search.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/styles.css +49 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../components/core/icon.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,eAAO,MAAM,UAAU;;;;;CAKb,CAAA;AAEV,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAA;AAE9C,MAAM,WAAW,SACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC5D,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACxB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACjE;AAED;;;;;GAKG;AACH,iBAAS,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../components/core/icon.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,eAAO,MAAM,UAAU;;;;;CAKb,CAAA;AAEV,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,UAAU,CAAA;AAE9C,MAAM,WAAW,SACf,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC5D,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACxB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACjE;AAED;;;;;GAKG;AACH,iBAAS,IAAI,CAAC,EACZ,GAAG,EACH,IAAW,EACX,KAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,SAAS,kDAmCX;kBAzCQ,IAAI;;;AA6Cb,OAAO,EAAE,IAAI,EAAE,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
type CreateReviewInput = {
|
|
2
|
+
provider: string;
|
|
3
|
+
productId: string;
|
|
4
|
+
productHandle?: string;
|
|
5
|
+
productTitle?: string;
|
|
6
|
+
productUrl?: string;
|
|
7
|
+
displayName: string;
|
|
8
|
+
email: string;
|
|
9
|
+
reviewTitle: string;
|
|
10
|
+
reviewContent: string;
|
|
11
|
+
reviewScore: number;
|
|
12
|
+
};
|
|
13
|
+
type UseCreateReviewProps = {
|
|
14
|
+
baseURL: string;
|
|
15
|
+
};
|
|
16
|
+
type CreateReviewOutcome = {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
imageUploadToken?: string;
|
|
19
|
+
};
|
|
20
|
+
type UploadReviewImagesInput = {
|
|
21
|
+
provider: string;
|
|
22
|
+
imageUploadToken: string;
|
|
23
|
+
files: File[];
|
|
24
|
+
};
|
|
25
|
+
type UseCreateReviewReturn = {
|
|
26
|
+
createReview: (input: CreateReviewInput) => Promise<CreateReviewOutcome>;
|
|
27
|
+
uploadReviewImages: (input: UploadReviewImagesInput) => Promise<boolean>;
|
|
28
|
+
isSubmitting: boolean;
|
|
29
|
+
isUploadingImages: boolean;
|
|
30
|
+
isSuccess: boolean;
|
|
31
|
+
error: string | null;
|
|
32
|
+
reset: () => void;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Mutation counterpart to `useReviews`. Submits a new review through the
|
|
36
|
+
* app-scoped API route (`POST {baseURL}/reviews/create`), which proxies to
|
|
37
|
+
* the review provider (currently Yotpo only).
|
|
38
|
+
*/
|
|
39
|
+
export declare function useCreateReview({ baseURL, }: UseCreateReviewProps): UseCreateReviewReturn;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=use-create-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-create-review.d.ts","sourceRoot":"","sources":["../../../components/hooks/use-create-review.ts"],"names":[],"mappings":"AAGA,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IAGjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB,EAAE,EAAE,OAAO,CAAA;IAEX,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,KAAK,uBAAuB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,EAAE,IAAI,EAAE,CAAA;CACd,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAIxE,kBAAkB,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACxE,YAAY,EAAE,OAAO,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,GACR,EAAE,oBAAoB,GAAG,qBAAqB,CAoH9C"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
import { useCallback, useRef, useState } from "react";
|
|
12
|
+
/**
|
|
13
|
+
* Mutation counterpart to `useReviews`. Submits a new review through the
|
|
14
|
+
* app-scoped API route (`POST {baseURL}/reviews/create`), which proxies to
|
|
15
|
+
* the review provider (currently Yotpo only).
|
|
16
|
+
*/
|
|
17
|
+
export function useCreateReview({ baseURL, }) {
|
|
18
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
19
|
+
const [isUploadingImages, setIsUploadingImages] = useState(false);
|
|
20
|
+
const [isSuccess, setIsSuccess] = useState(false);
|
|
21
|
+
const [error, setError] = useState(null);
|
|
22
|
+
// Track in-flight requests so a closing/reset drawer can abort them; a late
|
|
23
|
+
// resolution must not write success/error state onto a form the user left.
|
|
24
|
+
const createAbortRef = useRef(null);
|
|
25
|
+
const uploadAbortRef = useRef(null);
|
|
26
|
+
const createReview = useCallback((input) => __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
setIsSubmitting(true);
|
|
28
|
+
setError(null);
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
createAbortRef.current = controller;
|
|
31
|
+
try {
|
|
32
|
+
const response = yield fetch(`${baseURL}/reviews/create`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: { "Content-Type": "application/json" },
|
|
35
|
+
body: JSON.stringify(input),
|
|
36
|
+
signal: controller.signal,
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
let message = "Something went wrong. Please try again.";
|
|
40
|
+
// Only surface the server's message for client errors (validation
|
|
41
|
+
// strings meant for the user). 5xx bodies can carry internal error
|
|
42
|
+
// detail and get the generic copy instead.
|
|
43
|
+
if (response.status >= 400 && response.status < 500) {
|
|
44
|
+
try {
|
|
45
|
+
const body = yield response.json();
|
|
46
|
+
if (typeof (body === null || body === void 0 ? void 0 : body.error) === "string") {
|
|
47
|
+
message = body.error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (_a) {
|
|
51
|
+
// non-JSON error body; keep the generic message
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
setError(message);
|
|
55
|
+
return { ok: false };
|
|
56
|
+
}
|
|
57
|
+
let imageUploadToken;
|
|
58
|
+
try {
|
|
59
|
+
const body = yield response.json();
|
|
60
|
+
imageUploadToken = (body === null || body === void 0 ? void 0 : body.imageUploadToken) || undefined;
|
|
61
|
+
}
|
|
62
|
+
catch (_b) {
|
|
63
|
+
// No JSON body; creation still succeeded.
|
|
64
|
+
}
|
|
65
|
+
setIsSuccess(true);
|
|
66
|
+
return { ok: true, imageUploadToken };
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// Aborted because the drawer closed — leave state untouched so a
|
|
70
|
+
// reopened drawer isn't painted with this abandoned submission.
|
|
71
|
+
if (controller.signal.aborted)
|
|
72
|
+
return { ok: false };
|
|
73
|
+
console.error("Error creating review:", error);
|
|
74
|
+
setError("Something went wrong. Please try again.");
|
|
75
|
+
return { ok: false };
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
setIsSubmitting(false);
|
|
79
|
+
}
|
|
80
|
+
}), [baseURL]);
|
|
81
|
+
const uploadReviewImages = useCallback((input) => __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
setIsUploadingImages(true);
|
|
83
|
+
const controller = new AbortController();
|
|
84
|
+
uploadAbortRef.current = controller;
|
|
85
|
+
try {
|
|
86
|
+
const formData = new FormData();
|
|
87
|
+
formData.append("provider", input.provider);
|
|
88
|
+
formData.append("imageUploadToken", input.imageUploadToken);
|
|
89
|
+
for (const file of input.files) {
|
|
90
|
+
formData.append("photos", file);
|
|
91
|
+
}
|
|
92
|
+
const response = yield fetch(`${baseURL}/reviews/images`, {
|
|
93
|
+
method: "POST",
|
|
94
|
+
body: formData,
|
|
95
|
+
signal: controller.signal,
|
|
96
|
+
});
|
|
97
|
+
return response.ok;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (controller.signal.aborted)
|
|
101
|
+
return false;
|
|
102
|
+
console.error("Error uploading review images:", error);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
setIsUploadingImages(false);
|
|
107
|
+
}
|
|
108
|
+
}), [baseURL]);
|
|
109
|
+
const reset = useCallback(() => {
|
|
110
|
+
var _a, _b;
|
|
111
|
+
// Cancel any in-flight request so it can't resolve into stale UI state.
|
|
112
|
+
(_a = createAbortRef.current) === null || _a === void 0 ? void 0 : _a.abort();
|
|
113
|
+
(_b = uploadAbortRef.current) === null || _b === void 0 ? void 0 : _b.abort();
|
|
114
|
+
setIsSubmitting(false);
|
|
115
|
+
setIsUploadingImages(false);
|
|
116
|
+
setIsSuccess(false);
|
|
117
|
+
setError(null);
|
|
118
|
+
}, []);
|
|
119
|
+
return {
|
|
120
|
+
createReview,
|
|
121
|
+
uploadReviewImages,
|
|
122
|
+
isSubmitting,
|
|
123
|
+
isUploadingImages,
|
|
124
|
+
isSuccess,
|
|
125
|
+
error,
|
|
126
|
+
reset,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-infinite-scroll-sort-key.test.d.ts","sourceRoot":"","sources":["../../../components/hooks/use-infinite-scroll-sort-key.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { createElement } from "react";
|
|
11
|
+
import { renderHook, waitFor } from "@testing-library/react";
|
|
12
|
+
import { SWRConfig } from "swr";
|
|
13
|
+
import useSWRInfinite from "swr/infinite";
|
|
14
|
+
// Mirrors the client contract: getKey exposes only the shopper-chosen sort,
|
|
15
|
+
// and the provider default arrives while the page-1 response is handled.
|
|
16
|
+
const makeClient = (hydrateInto) => ({
|
|
17
|
+
userSort: "",
|
|
18
|
+
displaySort: "",
|
|
19
|
+
getKey(pageIndex, previousPageData) {
|
|
20
|
+
if (previousPageData && !previousPageData.hasMore)
|
|
21
|
+
return null;
|
|
22
|
+
return {
|
|
23
|
+
page: pageIndex + 1,
|
|
24
|
+
sort: this.userSort,
|
|
25
|
+
collectionId: "12345",
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
onResponse() {
|
|
29
|
+
if (!this.userSort)
|
|
30
|
+
this[hydrateInto] = "creation_date";
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
// SWR's cache is global, so each test needs its own provider or the second
|
|
34
|
+
// render would read the first one's page-1 entry and never fetch.
|
|
35
|
+
const wrapper = ({ children }) => createElement(SWRConfig, { value: { provider: () => new Map() } }, children);
|
|
36
|
+
const renderPages = (client, fetcher) => renderHook(() => useSWRInfinite((i, prev) => client.getKey(i, prev), fetcher, {
|
|
37
|
+
revalidateFirstPage: false,
|
|
38
|
+
revalidateOnFocus: false,
|
|
39
|
+
revalidateOnMount: true,
|
|
40
|
+
dedupingInterval: 0,
|
|
41
|
+
}), { wrapper });
|
|
42
|
+
const makeFetcher = (client) => jest.fn((key) => __awaiter(void 0, void 0, void 0, function* () {
|
|
43
|
+
client.onResponse();
|
|
44
|
+
return { products: [{ id: `p${key.page}` }], hasMore: false };
|
|
45
|
+
}));
|
|
46
|
+
describe("useSWRInfinite key stability across page-1 sort hydration", () => {
|
|
47
|
+
it("refetches page 1 when the response hydrates a key-visible field", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
48
|
+
const client = makeClient("userSort");
|
|
49
|
+
const fetcher = makeFetcher(client);
|
|
50
|
+
const { result } = renderPages(client, fetcher);
|
|
51
|
+
yield waitFor(() => expect(result.current.data).toBeDefined());
|
|
52
|
+
yield waitFor(() => expect(fetcher).toHaveBeenCalledTimes(2));
|
|
53
|
+
// Proves the harness detects the regression: the key moved, so SWR issued
|
|
54
|
+
// a second page-1 request, this time carrying the hydrated sort.
|
|
55
|
+
expect(fetcher.mock.calls[0][0].sort).toBe("");
|
|
56
|
+
expect(fetcher.mock.calls[1][0].sort).toBe("creation_date");
|
|
57
|
+
}));
|
|
58
|
+
it("fetches page 1 once when the response hydrates a display-only field", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
const client = makeClient("displaySort");
|
|
60
|
+
const fetcher = makeFetcher(client);
|
|
61
|
+
const { result } = renderPages(client, fetcher);
|
|
62
|
+
yield waitFor(() => expect(result.current.data).toBeDefined());
|
|
63
|
+
expect(fetcher).toHaveBeenCalledTimes(1);
|
|
64
|
+
expect(fetcher.mock.calls[0][0].sort).toBe("");
|
|
65
|
+
// The default is still available to label the sort drawer.
|
|
66
|
+
expect(client.displaySort).toBe("creation_date");
|
|
67
|
+
}));
|
|
68
|
+
});
|
|
@@ -5,6 +5,13 @@ interface UseRecommendationProps {
|
|
|
5
5
|
customSearchConfig?: Record<string, any>;
|
|
6
6
|
queryVariables: Record<string, any>;
|
|
7
7
|
apiURL: string;
|
|
8
|
+
/**
|
|
9
|
+
* Opt out of fetching entirely. Rules of Hooks force callers to invoke this
|
|
10
|
+
* hook unconditionally, and an empty query otherwise counts as "fetch
|
|
11
|
+
* trending", so a caller that only sometimes wants recommendations has no
|
|
12
|
+
* other way to stay quiet. Defaults to true to preserve existing behavior.
|
|
13
|
+
*/
|
|
14
|
+
enabled?: boolean;
|
|
8
15
|
}
|
|
9
16
|
interface UseRecommendationReturn {
|
|
10
17
|
products: Product[];
|
|
@@ -14,6 +21,6 @@ interface UseRecommendationReturn {
|
|
|
14
21
|
isLoading: boolean;
|
|
15
22
|
error: any;
|
|
16
23
|
}
|
|
17
|
-
declare const useRecommendations: ({ searchClient, query, customSearchConfig, queryVariables, apiURL, }: UseRecommendationProps) => UseRecommendationReturn;
|
|
24
|
+
declare const useRecommendations: ({ searchClient, query, customSearchConfig, queryVariables, apiURL, enabled, }: UseRecommendationProps) => UseRecommendationReturn;
|
|
18
25
|
export { useRecommendations };
|
|
19
26
|
//# sourceMappingURL=use-recommendations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-recommendations.d.ts","sourceRoot":"","sources":["../../../components/hooks/use-recommendations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAOxE,UAAU,sBAAsB;IAE9B,YAAY,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACxC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAGxC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"use-recommendations.d.ts","sourceRoot":"","sources":["../../../components/hooks/use-recommendations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAOxE,UAAU,sBAAsB;IAE9B,YAAY,CAAC,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACxC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAGxC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IAEd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAUD,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,MAAM,EAAE,GAAG,EAAE,CAAA;IACb,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,GAAG,CAAA;CACX;AAmBD,QAAA,MAAM,kBAAkB,kFAWrB,sBAAsB,KAAG,uBA8H3B,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
|
|
@@ -27,7 +27,7 @@ const useRecommendations = ({
|
|
|
27
27
|
// Search client props
|
|
28
28
|
searchClient, query = "", customSearchConfig,
|
|
29
29
|
// API props (backwards compatibility)
|
|
30
|
-
queryVariables, apiURL, }) => {
|
|
30
|
+
queryVariables, apiURL, enabled = true, }) => {
|
|
31
31
|
// When searchClient is provided, use search client approach
|
|
32
32
|
const usingSearchClient = Boolean(searchClient);
|
|
33
33
|
const searchParams = useSearchParams();
|
|
@@ -39,9 +39,10 @@ queryVariables, apiURL, }) => {
|
|
|
39
39
|
// - query is empty → show trending searches
|
|
40
40
|
// - query meets minimum length (≥3 chars)
|
|
41
41
|
// - searchClient has a customSearchConfig (e.g., filter-only queries on PDP)
|
|
42
|
-
const shouldFetch =
|
|
43
|
-
recommendation.length
|
|
44
|
-
|
|
42
|
+
const shouldFetch = enabled &&
|
|
43
|
+
(!recommendation.trim().length ||
|
|
44
|
+
recommendation.length >= MIN_QUERY_LENGTH ||
|
|
45
|
+
(usingSearchClient && Boolean(customSearchConfig)));
|
|
45
46
|
const [cachedRecommendation, setCachedRecommendations] = React.useState(recommendationsLocalStorage.getCacheItem({
|
|
46
47
|
id: `${recommendation}-${queryVariables === null || queryVariables === void 0 ? void 0 : queryVariables.language}`,
|
|
47
48
|
}));
|
|
@@ -82,4 +82,25 @@ describe("useRecommendations", () => {
|
|
|
82
82
|
// Empty query now triggers a trending fetch regardless of searchClient
|
|
83
83
|
expect(result.current.isLoading).toBe(true);
|
|
84
84
|
});
|
|
85
|
+
describe("enabled", () => {
|
|
86
|
+
it("should not fetch when enabled is false", () => {
|
|
87
|
+
const { result } = renderHook(() => useRecommendations(Object.assign({ searchClient: mockSearchClient, query: "", enabled: false }, defaultProps)));
|
|
88
|
+
expect(result.current.products).toEqual([]);
|
|
89
|
+
expect(result.current.isLoading).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
it("should not fetch the legacy API path when enabled is false", () => {
|
|
92
|
+
// Collection-mode carousels land here: no searchClient and an empty
|
|
93
|
+
// query, which would otherwise POST to /{appId}/api/v1/recommendations.
|
|
94
|
+
const { result } = renderHook(() => useRecommendations(Object.assign({ query: "", enabled: false }, defaultProps)));
|
|
95
|
+
expect(result.current.isLoading).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it("should fetch when enabled is omitted, preserving existing behavior", () => {
|
|
98
|
+
const { result } = renderHook(() => useRecommendations(Object.assign({ searchClient: mockSearchClient, query: "" }, defaultProps)));
|
|
99
|
+
expect(result.current.isLoading).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
it("should fetch when enabled is explicitly true", () => {
|
|
102
|
+
const { result } = renderHook(() => useRecommendations(Object.assign({ searchClient: mockSearchClient, query: "abc", enabled: true }, defaultProps)));
|
|
103
|
+
expect(result.current.isLoading).toBe(true);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
85
106
|
});
|
|
@@ -88,7 +88,7 @@ const useSortFilter = ({ initialData, queryVariables, dynamicKey, searchClient,
|
|
|
88
88
|
relatedCategories: [],
|
|
89
89
|
},
|
|
90
90
|
sortOptions: [],
|
|
91
|
-
dynamicFiltersEnabled:
|
|
91
|
+
dynamicFiltersEnabled: searchClient.isDynamicFiltersEnabled(),
|
|
92
92
|
integrations: [],
|
|
93
93
|
},
|
|
94
94
|
data: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-search.d.ts","sourceRoot":"","sources":["../../../../components/libs/sort-filter/custom-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3B,OAAO,
|
|
1
|
+
{"version":3,"file":"custom-search.d.ts","sourceRoot":"","sources":["../../../../components/libs/sort-filter/custom-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAC3B,OAAO,EAAU,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,qBAAa,YAAa,SAAQ,GAAG;IACnC,OAAO,CAAC,WAAW,CAAa;gBAEpB,EAAE,WAAW,EAAE,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE;IAKzD,qCAAqC,YAC1B,cAAc,EAAE,gBACX,uBAAuB,KACpC,MAAM,CA2BR;IAED,wBAAwB,YAEvB;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -85,6 +85,7 @@ export * from "./components/ui/html";
|
|
|
85
85
|
export * from "./components/hooks/use-shop";
|
|
86
86
|
export * from "./components/libs/sort-filter/search-integration";
|
|
87
87
|
export * from "./components/hooks/use-reviews";
|
|
88
|
+
export * from "./components/hooks/use-create-review";
|
|
88
89
|
export * from "./components/hooks/use-style-parent";
|
|
89
90
|
export * from "./components/ui/subcollection-tabs";
|
|
90
91
|
export * from "./components/ui/ProductCard/utils";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -85,6 +85,7 @@ export * from "./components/ui/html";
|
|
|
85
85
|
export * from "./components/hooks/use-shop";
|
|
86
86
|
export * from "./components/libs/sort-filter/search-integration";
|
|
87
87
|
export * from "./components/hooks/use-reviews";
|
|
88
|
+
export * from "./components/hooks/use-create-review";
|
|
88
89
|
export * from "./components/hooks/use-style-parent";
|
|
89
90
|
export * from "./components/ui/subcollection-tabs";
|
|
90
91
|
export * from "./components/ui/ProductCard/utils";
|
package/dist/styles.css
CHANGED
|
@@ -753,12 +753,18 @@ video {
|
|
|
753
753
|
.-left-12 {
|
|
754
754
|
left: -3rem;
|
|
755
755
|
}
|
|
756
|
+
.-right-1\.5 {
|
|
757
|
+
right: -0.375rem;
|
|
758
|
+
}
|
|
756
759
|
.-right-12 {
|
|
757
760
|
right: -3rem;
|
|
758
761
|
}
|
|
759
762
|
.-top-1 {
|
|
760
763
|
top: -0.25rem;
|
|
761
764
|
}
|
|
765
|
+
.-top-1\.5 {
|
|
766
|
+
top: -0.375rem;
|
|
767
|
+
}
|
|
762
768
|
.-top-12 {
|
|
763
769
|
top: -3rem;
|
|
764
770
|
}
|
|
@@ -816,6 +822,9 @@ video {
|
|
|
816
822
|
.right-2 {
|
|
817
823
|
right: 0.5rem;
|
|
818
824
|
}
|
|
825
|
+
.right-3 {
|
|
826
|
+
right: 0.75rem;
|
|
827
|
+
}
|
|
819
828
|
.start-10 {
|
|
820
829
|
inset-inline-start: 2.5rem;
|
|
821
830
|
}
|
|
@@ -898,6 +907,10 @@ video {
|
|
|
898
907
|
margin-left: -1rem;
|
|
899
908
|
margin-right: -1rem;
|
|
900
909
|
}
|
|
910
|
+
.mx-0 {
|
|
911
|
+
margin-left: 0px;
|
|
912
|
+
margin-right: 0px;
|
|
913
|
+
}
|
|
901
914
|
.mx-1 {
|
|
902
915
|
margin-left: 0.25rem;
|
|
903
916
|
margin-right: 0.25rem;
|
|
@@ -1111,6 +1124,9 @@ video {
|
|
|
1111
1124
|
.hidden {
|
|
1112
1125
|
display: none;
|
|
1113
1126
|
}
|
|
1127
|
+
.aspect-\[2\/3\] {
|
|
1128
|
+
aspect-ratio: 2/3;
|
|
1129
|
+
}
|
|
1114
1130
|
.aspect-\[327\/280\] {
|
|
1115
1131
|
aspect-ratio: 327/280;
|
|
1116
1132
|
}
|
|
@@ -1316,6 +1332,9 @@ video {
|
|
|
1316
1332
|
.min-h-\[60px\] {
|
|
1317
1333
|
min-height: 60px;
|
|
1318
1334
|
}
|
|
1335
|
+
.min-h-\[86px\] {
|
|
1336
|
+
min-height: 86px;
|
|
1337
|
+
}
|
|
1319
1338
|
.min-h-screen {
|
|
1320
1339
|
min-height: 100vh;
|
|
1321
1340
|
}
|
|
@@ -1829,6 +1848,9 @@ video {
|
|
|
1829
1848
|
.items-baseline {
|
|
1830
1849
|
align-items: baseline;
|
|
1831
1850
|
}
|
|
1851
|
+
.items-stretch {
|
|
1852
|
+
align-items: stretch;
|
|
1853
|
+
}
|
|
1832
1854
|
.justify-start {
|
|
1833
1855
|
justify-content: flex-start;
|
|
1834
1856
|
}
|
|
@@ -2178,6 +2200,10 @@ video {
|
|
|
2178
2200
|
.border-input {
|
|
2179
2201
|
border-color: hsl(var(--input));
|
|
2180
2202
|
}
|
|
2203
|
+
.border-red-600 {
|
|
2204
|
+
--tw-border-opacity: 1;
|
|
2205
|
+
border-color: rgb(220 38 38 / var(--tw-border-opacity, 1));
|
|
2206
|
+
}
|
|
2181
2207
|
.border-stateColors-error {
|
|
2182
2208
|
border-color: var(--stateColors-error);
|
|
2183
2209
|
}
|
|
@@ -2218,6 +2244,9 @@ video {
|
|
|
2218
2244
|
--tw-bg-opacity: 1;
|
|
2219
2245
|
background-color: rgb(253 255 218 / var(--tw-bg-opacity, 1));
|
|
2220
2246
|
}
|
|
2247
|
+
.bg-\[var\(--element-divider-color\2c var\(--coreColors-dividingLines\)\)\] {
|
|
2248
|
+
background-color: var(--element-divider-color,var(--coreColors-dividingLines));
|
|
2249
|
+
}
|
|
2221
2250
|
.bg-\[var\(--stateColors-skeleton\)\] {
|
|
2222
2251
|
background-color: var(--stateColors-skeleton);
|
|
2223
2252
|
}
|
|
@@ -2305,6 +2334,9 @@ video {
|
|
|
2305
2334
|
.bg-stateColors-warning {
|
|
2306
2335
|
background-color: var(--stateColors-warning);
|
|
2307
2336
|
}
|
|
2337
|
+
.bg-textColors-primaryColor {
|
|
2338
|
+
background-color: var(--textColors-primaryColor, #121212ff);
|
|
2339
|
+
}
|
|
2308
2340
|
.bg-transparent {
|
|
2309
2341
|
background-color: transparent;
|
|
2310
2342
|
}
|
|
@@ -2690,6 +2722,9 @@ video {
|
|
|
2690
2722
|
.leading-\[1\.2\] {
|
|
2691
2723
|
line-height: 1.2;
|
|
2692
2724
|
}
|
|
2725
|
+
.leading-\[1\.3\] {
|
|
2726
|
+
line-height: 1.3;
|
|
2727
|
+
}
|
|
2693
2728
|
.leading-\[120\%\] {
|
|
2694
2729
|
line-height: 120%;
|
|
2695
2730
|
}
|
|
@@ -2872,6 +2907,10 @@ video {
|
|
|
2872
2907
|
--tw-text-opacity: 1;
|
|
2873
2908
|
color: rgb(220 38 38 / var(--tw-text-opacity, 1));
|
|
2874
2909
|
}
|
|
2910
|
+
.text-red-700 {
|
|
2911
|
+
--tw-text-opacity: 1;
|
|
2912
|
+
color: rgb(185 28 28 / var(--tw-text-opacity, 1));
|
|
2913
|
+
}
|
|
2875
2914
|
.text-stateColors-disabled {
|
|
2876
2915
|
color: var(--stateColors-disabled);
|
|
2877
2916
|
}
|
|
@@ -3077,6 +3116,9 @@ video {
|
|
|
3077
3116
|
--tw-grayscale: grayscale(100%);
|
|
3078
3117
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
|
3079
3118
|
}
|
|
3119
|
+
.\!filter {
|
|
3120
|
+
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important;
|
|
3121
|
+
}
|
|
3080
3122
|
.filter {
|
|
3081
3123
|
filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
|
|
3082
3124
|
}
|
|
@@ -3455,9 +3497,16 @@ body::-webkit-scrollbar {
|
|
|
3455
3497
|
.focus\:border-coreColors-brandColorPrimary:focus {
|
|
3456
3498
|
border-color: var(--coreColors-brandColorPrimary);
|
|
3457
3499
|
}
|
|
3500
|
+
.focus\:border-red-600:focus {
|
|
3501
|
+
--tw-border-opacity: 1;
|
|
3502
|
+
border-color: rgb(220 38 38 / var(--tw-border-opacity, 1));
|
|
3503
|
+
}
|
|
3458
3504
|
.focus\:border-stateColors-error:focus {
|
|
3459
3505
|
border-color: var(--stateColors-error);
|
|
3460
3506
|
}
|
|
3507
|
+
.focus\:border-textColors-primaryColor:focus {
|
|
3508
|
+
border-color: var(--textColors-primaryColor, #121212ff);
|
|
3509
|
+
}
|
|
3461
3510
|
.focus\:bg-stateColors-skeleton:focus {
|
|
3462
3511
|
background-color: var(--stateColors-skeleton);
|
|
3463
3512
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tapcart/mobile-components",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"style": "dist/styles.css",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"clsx": "^1.2.1",
|
|
81
81
|
"dayjs": "^1.11.13",
|
|
82
82
|
"dompurify": "^3.2.2",
|
|
83
|
-
"embla-carousel-autoplay": "8.
|
|
84
|
-
"embla-carousel-fade": "8.
|
|
83
|
+
"embla-carousel-autoplay": "8.6.0",
|
|
84
|
+
"embla-carousel-fade": "8.6.0",
|
|
85
85
|
"embla-carousel-react": "^8.3.0",
|
|
86
86
|
"input-otp": "^1.4.2",
|
|
87
87
|
"lucide-react": "^0.488.0",
|