@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.
@@ -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,EAAE,GAAG,EAAE,IAAW,EAAE,KAAU,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,kDAmC7E;kBAnCQ,IAAI;;;AAuCb,OAAO,EAAE,IAAI,EAAE,CAAA"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=use-infinite-scroll-sort-key.test.d.ts.map
@@ -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;CACf;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,yEASrB,sBAAsB,KAAG,uBA6H3B,CAAA;AAED,OAAO,EAAE,kBAAkB,EAAE,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 = !recommendation.trim().length ||
43
- recommendation.length >= MIN_QUERY_LENGTH ||
44
- (usingSearchClient && Boolean(customSearchConfig));
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: false,
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,EAEL,cAAc,EACf,MAAM,sBAAsB,CAAA;AAC7B,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"}
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";
@@ -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.17.1",
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.5.2",
84
- "embla-carousel-fade": "8.5.2",
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",