@mohasinac/appkit 4.12.3 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/_internal/server/features/brands/actions.js +7 -2
  2. package/dist/_internal/server/jobs/core/jobRunners.js +5 -0
  3. package/dist/_internal/server/jobs/core/onOrderCreate.js +33 -3
  4. package/dist/_internal/server/jobs/core/whatsappCatalogImport.d.ts +27 -0
  5. package/dist/_internal/server/jobs/core/whatsappCatalogImport.js +172 -0
  6. package/dist/core/hooks/useSiteSettings.d.ts +1 -1
  7. package/dist/features/account/hooks/useAccount.d.ts +2 -2
  8. package/dist/features/account/hooks/useAddressSelector.d.ts +1 -1
  9. package/dist/features/account/hooks/useAddresses.d.ts +2 -2
  10. package/dist/features/account/hooks/useNotifications.d.ts +1 -1
  11. package/dist/features/account/hooks/useProfile.d.ts +1 -1
  12. package/dist/features/account/hooks/usePublicProfile.d.ts +2 -2
  13. package/dist/features/admin/hooks/useAdmin.d.ts +1 -1
  14. package/dist/features/admin/hooks/useAdminSectionsListing.d.ts +1 -1
  15. package/dist/features/admin/hooks/useChat.d.ts +1 -1
  16. package/dist/features/auctions/hooks/useAuctions.d.ts +8 -8
  17. package/dist/features/auth/hooks/useAuth.d.ts +2 -2
  18. package/dist/features/cart/hooks/useCart.d.ts +1 -1
  19. package/dist/features/cart/hooks/useCartQuery.d.ts +1 -1
  20. package/dist/features/cart/hooks/useCheckoutReadQueries.d.ts +2 -2
  21. package/dist/features/cart/hooks/useOrder.d.ts +2 -2
  22. package/dist/features/categories/hooks/useCategories.d.ts +3 -3
  23. package/dist/features/categories/hooks/useCategorySelector.d.ts +3 -3
  24. package/dist/features/categories/hooks/useCategoryTree.d.ts +1 -1
  25. package/dist/features/checkout/hooks/useCheckoutApi.d.ts +2 -2
  26. package/dist/features/collections/hooks/useCollections.d.ts +2 -2
  27. package/dist/features/events/hooks/useEvent.d.ts +3 -3
  28. package/dist/features/events/hooks/useEvents.d.ts +1 -1
  29. package/dist/features/faq/hooks/useFAQs.d.ts +1 -1
  30. package/dist/features/faq/hooks/useFaqList.d.ts +9 -15
  31. package/dist/features/homepage/hooks/useBlogArticles.d.ts +1 -1
  32. package/dist/features/homepage/hooks/useFeaturedAuctions.d.ts +1 -1
  33. package/dist/features/homepage/hooks/useFeaturedPreOrders.d.ts +1 -1
  34. package/dist/features/homepage/hooks/useFeaturedProducts.d.ts +1 -1
  35. package/dist/features/homepage/hooks/useFeaturedStores.d.ts +1 -1
  36. package/dist/features/homepage/hooks/useHeroCarousel.d.ts +1 -1
  37. package/dist/features/homepage/hooks/useHomepageEvents.d.ts +1 -1
  38. package/dist/features/homepage/hooks/useHomepageReviews.d.ts +1 -1
  39. package/dist/features/homepage/hooks/useHomepageSections.d.ts +1 -1
  40. package/dist/features/homepage/hooks/useTopBrands.d.ts +1 -1
  41. package/dist/features/homepage/hooks/useTopCategories.d.ts +1 -1
  42. package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +1 -1
  43. package/dist/features/orders/hooks/useOrders.d.ts +2 -2
  44. package/dist/features/payments/hooks/usePayments.d.ts +1 -1
  45. package/dist/features/pre-orders/hooks/usePreOrders.d.ts +2 -2
  46. package/dist/features/products/hooks/useProductDetail.d.ts +1 -1
  47. package/dist/features/products/hooks/useRelatedProducts.d.ts +1 -1
  48. package/dist/features/promotions/hooks/usePromotions.d.ts +2 -2
  49. package/dist/features/reviews/hooks/useReviews.d.ts +2 -2
  50. package/dist/features/search/hooks/useSearch.d.ts +2 -2
  51. package/dist/features/seller/hooks/useSellerPayouts.d.ts +3 -3
  52. package/dist/features/seller/hooks/useSellerStore.d.ts +6 -6
  53. package/dist/features/seller/hooks/useSellerStorefront.d.ts +2 -2
  54. package/dist/features/shipments/hooks/useShipments.d.ts +7 -7
  55. package/dist/features/stores/hooks/useStoreAddressSelector.d.ts +1 -1
  56. package/dist/features/stores/hooks/useStores.d.ts +6 -6
  57. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +128 -0
  58. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +42 -14
  59. package/dist/features/wishlist/hooks/useUserWishlist.d.ts +9 -15
  60. package/dist/features/wishlist/hooks/useWishlist.d.ts +1 -1
  61. package/dist/features/wishlist/hooks/useWishlistWithGuest.d.ts +1 -1
  62. package/dist/seed/site-settings-seed-data.js +19 -1
  63. package/package.json +15 -12
@@ -14,7 +14,7 @@ export declare function useFaqList(options?: UseFaqListOptions): {
14
14
  faqs: import("..").FAQ[];
15
15
  total: number;
16
16
  categories: readonly string[];
17
- data: NoInfer<FAQListResponse>;
17
+ data: FAQListResponse;
18
18
  error: Error;
19
19
  isError: true;
20
20
  isPending: false;
@@ -37,14 +37,13 @@ export declare function useFaqList(options?: UseFaqListOptions): {
37
37
  isRefetching: boolean;
38
38
  isStale: boolean;
39
39
  isEnabled: boolean;
40
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<FAQListResponse>, Error>>;
40
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<FAQListResponse, Error>>;
41
41
  fetchStatus: import("@tanstack/query-core").FetchStatus;
42
- promise: Promise<NoInfer<FAQListResponse>>;
43
42
  } | {
44
43
  faqs: import("..").FAQ[];
45
44
  total: number;
46
45
  categories: readonly string[];
47
- data: NoInfer<FAQListResponse>;
46
+ data: FAQListResponse;
48
47
  error: null;
49
48
  isError: false;
50
49
  isPending: false;
@@ -67,9 +66,8 @@ export declare function useFaqList(options?: UseFaqListOptions): {
67
66
  isRefetching: boolean;
68
67
  isStale: boolean;
69
68
  isEnabled: boolean;
70
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<FAQListResponse>, Error>>;
69
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<FAQListResponse, Error>>;
71
70
  fetchStatus: import("@tanstack/query-core").FetchStatus;
72
- promise: Promise<NoInfer<FAQListResponse>>;
73
71
  } | {
74
72
  faqs: import("..").FAQ[];
75
73
  total: number;
@@ -97,9 +95,8 @@ export declare function useFaqList(options?: UseFaqListOptions): {
97
95
  isRefetching: boolean;
98
96
  isStale: boolean;
99
97
  isEnabled: boolean;
100
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<FAQListResponse>, Error>>;
98
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<FAQListResponse, Error>>;
101
99
  fetchStatus: import("@tanstack/query-core").FetchStatus;
102
- promise: Promise<NoInfer<FAQListResponse>>;
103
100
  } | {
104
101
  faqs: import("..").FAQ[];
105
102
  total: number;
@@ -127,9 +124,8 @@ export declare function useFaqList(options?: UseFaqListOptions): {
127
124
  isRefetching: boolean;
128
125
  isStale: boolean;
129
126
  isEnabled: boolean;
130
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<FAQListResponse>, Error>>;
127
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<FAQListResponse, Error>>;
131
128
  fetchStatus: import("@tanstack/query-core").FetchStatus;
132
- promise: Promise<NoInfer<FAQListResponse>>;
133
129
  } | {
134
130
  faqs: import("..").FAQ[];
135
131
  total: number;
@@ -157,14 +153,13 @@ export declare function useFaqList(options?: UseFaqListOptions): {
157
153
  isRefetching: boolean;
158
154
  isStale: boolean;
159
155
  isEnabled: boolean;
160
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<FAQListResponse>, Error>>;
156
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<FAQListResponse, Error>>;
161
157
  fetchStatus: import("@tanstack/query-core").FetchStatus;
162
- promise: Promise<NoInfer<FAQListResponse>>;
163
158
  } | {
164
159
  faqs: import("..").FAQ[];
165
160
  total: number;
166
161
  categories: readonly string[];
167
- data: NoInfer<FAQListResponse>;
162
+ data: FAQListResponse;
168
163
  isError: false;
169
164
  error: null;
170
165
  isPending: false;
@@ -187,8 +182,7 @@ export declare function useFaqList(options?: UseFaqListOptions): {
187
182
  isRefetching: boolean;
188
183
  isStale: boolean;
189
184
  isEnabled: boolean;
190
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<FAQListResponse>, Error>>;
185
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<FAQListResponse, Error>>;
191
186
  fetchStatus: import("@tanstack/query-core").FetchStatus;
192
- promise: Promise<NoInfer<FAQListResponse>>;
193
187
  };
194
188
  export {};
@@ -10,4 +10,4 @@ export interface BlogListResult {
10
10
  export declare function useBlogArticles(options?: {
11
11
  endpoint?: string;
12
12
  initialPosts?: BlogListResult["posts"];
13
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<BlogListResult>, Error>;
13
+ }): import("@tanstack/react-query").UseQueryResult<BlogListResult, Error>;
@@ -2,4 +2,4 @@ import type { ProductItem } from "../../products/types";
2
2
  export declare function useFeaturedAuctions(options?: {
3
3
  filterByBrand?: string;
4
4
  initialData?: ProductItem[];
5
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<ProductItem[]>, Error>;
5
+ }): import("@tanstack/react-query").UseQueryResult<ProductItem[], Error>;
@@ -2,4 +2,4 @@ import type { ProductItem } from "../../products/types";
2
2
  export declare function useFeaturedPreOrders(options?: {
3
3
  filterByBrand?: string;
4
4
  initialData?: ProductItem[];
5
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<ProductItem[]>, Error>;
5
+ }): import("@tanstack/react-query").UseQueryResult<ProductItem[], Error>;
@@ -2,4 +2,4 @@ import type { ProductListResponse } from "../../products/types";
2
2
  export declare function useFeaturedProducts(options?: {
3
3
  initialData?: ProductListResponse;
4
4
  filterByBrand?: string;
5
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<ProductListResponse>, Error>;
5
+ }): import("@tanstack/react-query").UseQueryResult<ProductListResponse, Error>;
@@ -1,4 +1,4 @@
1
1
  import type { StoreListItem } from "../../stores/types";
2
2
  export declare function useFeaturedStores(limit?: number, options?: {
3
3
  initialData?: StoreListItem[];
4
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<StoreListItem[]>, Error>;
4
+ }): import("@tanstack/react-query").UseQueryResult<StoreListItem[], Error>;
@@ -6,4 +6,4 @@ import type { CarouselSlide } from "../types/index";
6
6
  */
7
7
  export declare function useHeroCarousel(options?: {
8
8
  initialData?: CarouselSlide[];
9
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<CarouselSlide[]>, Error>;
9
+ }): import("@tanstack/react-query").UseQueryResult<CarouselSlide[], Error>;
@@ -5,4 +5,4 @@ export interface HomepageEventsListResponse {
5
5
  }
6
6
  export declare function useHomepageEvents(limit?: number, options?: {
7
7
  initialData?: EventItem[];
8
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<EventItem[]>, Error>;
8
+ }): import("@tanstack/react-query").UseQueryResult<EventItem[], Error>;
@@ -4,4 +4,4 @@ export interface UseHomepageReviewsOptions {
4
4
  initialData?: Review[];
5
5
  staleTime?: number;
6
6
  }
7
- export declare function useHomepageReviews(options?: UseHomepageReviewsOptions): import("@tanstack/react-query").UseQueryResult<NoInfer<Review[]>, Error>;
7
+ export declare function useHomepageReviews(options?: UseHomepageReviewsOptions): import("@tanstack/react-query").UseQueryResult<Review[], Error>;
@@ -1,2 +1,2 @@
1
1
  import type { HomepageSectionDocument } from "../schemas";
2
- export declare function useHomepageSections(params?: string): import("@tanstack/react-query").UseQueryResult<NoInfer<HomepageSectionDocument[]>, Error>;
2
+ export declare function useHomepageSections(params?: string): import("@tanstack/react-query").UseQueryResult<HomepageSectionDocument[], Error>;
@@ -1,4 +1,4 @@
1
1
  import type { CategoryItem } from "../../categories/types";
2
2
  export declare function useTopBrands(limit?: number, options?: {
3
3
  initialData?: CategoryItem[];
4
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<CategoryItem[]>, Error>;
4
+ }): import("@tanstack/react-query").UseQueryResult<CategoryItem[], Error>;
@@ -1,4 +1,4 @@
1
1
  import type { CategoryItem } from "../../categories/types";
2
2
  export declare function useTopCategories(limit?: number, options?: {
3
3
  initialData?: CategoryItem[];
4
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<CategoryItem[]>, Error>;
4
+ }): import("@tanstack/react-query").UseQueryResult<CategoryItem[], Error>;
@@ -1,4 +1,4 @@
1
1
  import type { LoyaltyBalance } from "../types";
2
2
  export declare function useLoyaltyBalance(uid: string | undefined, opts?: {
3
3
  endpoint?: string;
4
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<LoyaltyBalance | null>, Error>;
4
+ }): import("@tanstack/react-query").UseQueryResult<LoyaltyBalance | null, Error>;
@@ -17,7 +17,7 @@ export declare function useOrder(id: string, opts?: {
17
17
  enabled?: boolean;
18
18
  endpoint?: string;
19
19
  }): {
20
- order: NoInfer<Order> | undefined;
20
+ order: Order | undefined;
21
21
  isLoading: boolean;
22
22
  error: Error | null;
23
23
  };
@@ -25,7 +25,7 @@ export declare function useTrackOrder(trackingId: string | null | undefined, opt
25
25
  enabled?: boolean;
26
26
  endpoint?: string;
27
27
  }): {
28
- trackingInfo: NonNullable<NoInfer<TrackingInfo | null>> | null;
28
+ trackingInfo: TrackingInfo | null;
29
29
  isLoading: boolean;
30
30
  error: Error | null;
31
31
  };
@@ -4,7 +4,7 @@ export declare function usePaymentSettings(opts?: {
4
4
  enabled?: boolean;
5
5
  endpoint?: string;
6
6
  }): {
7
- settings: NoInfer<PaymentSettings> | undefined;
7
+ settings: PaymentSettings | undefined;
8
8
  isLoading: boolean;
9
9
  error: Error | null;
10
10
  };
@@ -1,7 +1,7 @@
1
1
  import type { PreorderItem } from "../types";
2
2
  export declare function usePreorders(opts?: {
3
3
  endpoint?: string;
4
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<PreorderItem[]>, Error>;
4
+ }): import("@tanstack/react-query").UseQueryResult<PreorderItem[], Error>;
5
5
  export declare function usePreorder(slug: string | undefined, opts?: {
6
6
  endpoint?: string;
7
- }): import("@tanstack/react-query").UseQueryResult<NoInfer<PreorderItem | null>, Error>;
7
+ }): import("@tanstack/react-query").UseQueryResult<PreorderItem | null, Error>;
@@ -10,6 +10,6 @@ export declare function useProductDetail<TProduct = ProductItem>(slug: string, o
10
10
  product: TProduct | null;
11
11
  isLoading: boolean;
12
12
  error: Error | null;
13
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<ProductItem | null>, Error>>;
13
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<ProductItem | null, Error>>;
14
14
  };
15
15
  export {};
@@ -4,4 +4,4 @@ import type { ProductListResponse } from "../types";
4
4
  * boolean translates to the canonical `listingType` clause; new callers can
5
5
  * pass the union directly via the same parameter slot in a follow-up.
6
6
  */
7
- export declare function useRelatedProducts(category: string, excludeId: string, limit?: number, isAuction?: boolean): import("@tanstack/react-query").UseQueryResult<NoInfer<ProductListResponse>, Error>;
7
+ export declare function useRelatedProducts(category: string, excludeId: string, limit?: number, isAuction?: boolean): import("@tanstack/react-query").UseQueryResult<ProductListResponse, Error>;
@@ -9,13 +9,13 @@ export declare function usePromotions(params?: PromotionsListParams, opts?: {
9
9
  hasMore: boolean;
10
10
  isLoading: boolean;
11
11
  error: string | null;
12
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<PromotionsListResponse>, Error>>;
12
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<PromotionsListResponse, Error>>;
13
13
  };
14
14
  export declare function useCoupon(code: string, opts?: {
15
15
  enabled?: boolean;
16
16
  endpoint?: string;
17
17
  }): {
18
- coupon: NonNullable<NoInfer<CouponItem | null>> | null;
18
+ coupon: CouponItem | null;
19
19
  isLoading: boolean;
20
20
  error: string | null;
21
21
  };
@@ -15,7 +15,7 @@ export declare function useReviews(params?: ReviewListParams, opts?: UseReviewsO
15
15
  totalApproved: number | undefined;
16
16
  isLoading: boolean;
17
17
  error: Error | null;
18
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<ReviewListResponse>, Error>>;
18
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<ReviewListResponse, Error>>;
19
19
  };
20
20
  interface UseProductReviewsOptions {
21
21
  page?: number;
@@ -38,6 +38,6 @@ export declare function useProductReviews(productId: string, opts?: UseProductRe
38
38
  totalApproved: number | undefined;
39
39
  isLoading: boolean;
40
40
  error: Error | null;
41
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<ReviewListResponse>, Error>>;
41
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<ReviewListResponse, Error>>;
42
42
  };
43
43
  export {};
@@ -11,11 +11,11 @@ interface UseSearchOptions {
11
11
  * `options.initialCategories` — server-prefetched category list for filter facets.
12
12
  */
13
13
  export declare function useSearch(searchParams: string, options?: UseSearchOptions): {
14
- results: NoInfer<SearchResponse> | null;
14
+ results: SearchResponse | null;
15
15
  items: import("..").SearchProductItem[];
16
16
  total: number;
17
17
  totalPages: number;
18
18
  isLoading: boolean;
19
- categories: NoInfer<SearchCategoryOption[]>;
19
+ categories: SearchCategoryOption[];
20
20
  };
21
21
  export {};
@@ -12,14 +12,14 @@ export declare function useSellerPayouts(params?: {
12
12
  totalPages: number;
13
13
  isLoading: boolean;
14
14
  error: string | null;
15
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<PayoutListResponse>, Error>>;
15
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<PayoutListResponse, Error>>;
16
16
  };
17
17
  export declare function useSellerPayoutSettings(opts?: {
18
18
  enabled?: boolean;
19
19
  endpoint?: string;
20
20
  }): {
21
- settings: NonNullable<NoInfer<SellerPayoutSettings | null>> | null;
21
+ settings: SellerPayoutSettings | null;
22
22
  isLoading: boolean;
23
23
  error: string | null;
24
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<SellerPayoutSettings | null>, Error>>;
24
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<SellerPayoutSettings | null, Error>>;
25
25
  };
@@ -3,28 +3,28 @@ export declare function useSellerStore(opts?: {
3
3
  enabled?: boolean;
4
4
  endpoint?: string;
5
5
  }): {
6
- store: NonNullable<NoInfer<SellerStore | null>> | null;
6
+ store: SellerStore | null;
7
7
  isLoading: boolean;
8
8
  error: string | null;
9
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<SellerStore | null>, Error>>;
9
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<SellerStore | null, Error>>;
10
10
  };
11
11
  export declare function useSellerDashboard(opts?: {
12
12
  enabled?: boolean;
13
13
  endpoint?: string;
14
14
  }): {
15
- stats: NoInfer<SellerDashboardStats> | null;
15
+ stats: SellerDashboardStats | null;
16
16
  isLoading: boolean;
17
17
  error: string | null;
18
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<SellerDashboardStats>, Error>>;
18
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<SellerDashboardStats, Error>>;
19
19
  };
20
20
  export declare function useSellerAnalytics(period?: string, opts?: {
21
21
  enabled?: boolean;
22
22
  endpoint?: string;
23
23
  }): {
24
- analytics: NoInfer<SellerAnalytics> | null;
24
+ analytics: SellerAnalytics | null;
25
25
  isLoading: boolean;
26
26
  error: string | null;
27
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<SellerAnalytics>, Error>>;
27
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<SellerAnalytics, Error>>;
28
28
  };
29
29
  /** @deprecated Use useStoreDashboard */
30
30
  export { useSellerDashboard as useStoreDashboard };
@@ -9,8 +9,8 @@ export declare function useSellerStorefront(sellerId: string, options?: {
9
9
  seller: PublicUserProfile | undefined;
10
10
  loading: boolean;
11
11
  profileError: string;
12
- productsData: NoInfer<ProductsApiResponse> | undefined;
12
+ productsData: ProductsApiResponse | undefined;
13
13
  productsLoading: boolean;
14
- reviewsData: NoInfer<SellerReviewsData> | undefined;
14
+ reviewsData: SellerReviewsData | undefined;
15
15
  reviewsLoading: boolean;
16
16
  };
@@ -21,17 +21,17 @@ export declare function useShipments(params?: UseShipmentsParams): {
21
21
  meta: ListMeta | undefined;
22
22
  isLoading: boolean;
23
23
  error: string | null;
24
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<ShipmentsListResponse>, Error>>;
24
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<ShipmentsListResponse, Error>>;
25
25
  };
26
26
  export declare function useShipment(shipmentId?: string): {
27
- shipment: NoInfer<ShipmentDocument> | undefined;
27
+ shipment: ShipmentDocument | undefined;
28
28
  lots: ShipmentLot[];
29
29
  isLoading: boolean;
30
30
  error: string | null;
31
- refetchShipment: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<ShipmentDocument>, Error>>;
32
- refetchLots: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<{
31
+ refetchShipment: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<ShipmentDocument, Error>>;
32
+ refetchLots: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<{
33
33
  lots: ShipmentLot[];
34
- }>, Error>>;
34
+ }, Error>>;
35
35
  };
36
36
  interface ShipmentItemsListResponse {
37
37
  items: ShipmentItem[];
@@ -47,7 +47,7 @@ export declare function useShipmentItems(shipmentId?: string, lotId?: string, pa
47
47
  meta: ListMeta | undefined;
48
48
  isLoading: boolean;
49
49
  error: string | null;
50
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<ShipmentItemsListResponse>, Error>>;
50
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<ShipmentItemsListResponse, Error>>;
51
51
  };
52
52
  interface ShipmentProjectionsResponse {
53
53
  lots: ShipmentLot[];
@@ -64,6 +64,6 @@ export declare function useShipmentProjections(params?: UseShipmentProjectionsPa
64
64
  meta: ListMeta | undefined;
65
65
  isLoading: boolean;
66
66
  error: string | null;
67
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<ShipmentProjectionsResponse>, Error>>;
67
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<ShipmentProjectionsResponse, Error>>;
68
68
  };
69
69
  export {};
@@ -16,7 +16,7 @@ export declare function useStoreAddressSelector(options?: {
16
16
  }): {
17
17
  addresses: SavedAddress[];
18
18
  isLoading: boolean;
19
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<SavedAddress[]>, Error>>;
19
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<SavedAddress[], Error>>;
20
20
  createAddress: import("@tanstack/react-query").UseMutateFunction<CreateAddressApiResponse, Error, AddressFormData, unknown>;
21
21
  isSaving: boolean;
22
22
  };
@@ -12,16 +12,16 @@ export declare function useStores(params?: StoreListParams, opts?: UseStoresOpti
12
12
  hasMore: boolean;
13
13
  isLoading: false;
14
14
  error: string | null;
15
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<StoreListResponse>, Error>>;
15
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<StoreListResponse, Error>>;
16
16
  };
17
17
  export declare function useStoreBySlug(storeSlug: string, opts?: {
18
18
  enabled?: boolean;
19
19
  endpoint?: string;
20
20
  }): {
21
- store: NonNullable<NoInfer<StoreDetail | null>> | null;
21
+ store: StoreDetail | null;
22
22
  isLoading: boolean;
23
23
  error: string | null;
24
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<StoreDetail | null>, Error>>;
24
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<StoreDetail | null, Error>>;
25
25
  };
26
26
  export declare function useStoreProducts(storeSlug: string, params?: string, opts?: {
27
27
  enabled?: boolean;
@@ -32,7 +32,7 @@ export declare function useStoreProducts(storeSlug: string, params?: string, opt
32
32
  totalPages: number;
33
33
  isLoading: boolean;
34
34
  error: string | null;
35
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<StoreProductsResponse>, Error>>;
35
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<StoreProductsResponse, Error>>;
36
36
  };
37
37
  export declare function useStoreAuctions(storeSlug: string, params?: string, opts?: {
38
38
  enabled?: boolean;
@@ -43,7 +43,7 @@ export declare function useStoreAuctions(storeSlug: string, params?: string, opt
43
43
  totalPages: number;
44
44
  isLoading: boolean;
45
45
  error: string | null;
46
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<StoreAuctionsResponse>, Error>>;
46
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<StoreAuctionsResponse, Error>>;
47
47
  };
48
48
  export declare function useStoreReviews(storeSlug: string, params?: {
49
49
  rating?: number;
@@ -66,6 +66,6 @@ export declare function useStoreReviews(storeSlug: string, params?: {
66
66
  ratingDistribution: Record<number, number>;
67
67
  isLoading: boolean;
68
68
  error: string | null;
69
- refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<NoInfer<StoreReviewsData>, Error>>;
69
+ refetch: (options?: import("@tanstack/query-core").RefetchOptions) => Promise<import("@tanstack/query-core").QueryObserverResult<StoreReviewsData, Error>>;
70
70
  };
71
71
  export {};
@@ -1272,6 +1272,29 @@ const rawTesterChecklistItems = [
1272
1272
  description: "Fixed 2026-08-21 — the video schema always required a duration the UI never collected, so ANY product with a directly-uploaded video previously failed server validation invisibly. Duration is now captured client-side for file uploads; YouTube/external sources are exempt since their duration can't be read client-side.",
1273
1273
  href: "/store/products/new",
1274
1274
  },
1275
+ {
1276
+ key: "media-upload-multiple-images",
1277
+ label: "Uploading several gallery images in one go works — each shows its own progress and all of them survive the save",
1278
+ description: "Select 3-4 images at once. They upload one after another. After saving and reopening the product for editing, every image should still be attached.",
1279
+ href: "/store/products/new",
1280
+ },
1281
+ {
1282
+ key: "media-upload-remove-image",
1283
+ label: "Removing one gallery image removes only that image, and the removal sticks after save + reload",
1284
+ href: "/store/products/new",
1285
+ },
1286
+ {
1287
+ key: "media-upload-main-image-crop",
1288
+ label: "The main product image's crop tool opens, the 1:1 aspect lock works, and the cropped result is what actually gets saved",
1289
+ description: "Not the uncropped original — check the saved product's main image on the public detail page.",
1290
+ href: "/store/products/new",
1291
+ },
1292
+ {
1293
+ key: "media-upload-video-both-sources-render",
1294
+ label: "A video attached by file upload AND a video attached via the YouTube tab both play on the public product page",
1295
+ description: "Two separate products, one per source. A raw file renders a native player; a YouTube URL renders an embedded player. Neither should show \"No video with supported format and MIME type found\".",
1296
+ href: "/store/products/new",
1297
+ },
1275
1298
  { key: "seller-quick-add-drawer-flips", label: "With Left-hand mode ON, the seller's quick-add-listing side drawer opens from the left instead of the right" },
1276
1299
  ],
1277
1300
  },
@@ -1415,6 +1438,24 @@ const rawTesterChecklistItems = [
1415
1438
  href: "/store/coupons/new",
1416
1439
  description: "Create a coupon restricted to one category, then as a buyer put a non-matching item from that store in the cart and try the code — it must be refused. Add a matching item and confirm the discount covers only the matching item's value.",
1417
1440
  },
1441
+ {
1442
+ key: "seller-coupon-cannot-be-site-wide",
1443
+ label: "A seller has no way to create a site-wide/platform coupon — the form offers no scope choice and the created coupon only ever discounts their own store",
1444
+ href: "/store/coupons/new",
1445
+ description: "By design: scope is resolved from the logged-in seller, not chosen. Verify as a buyer that a seller coupon leaves a second store's items in the same cart at full price. Only an admin can create a platform-wide coupon.",
1446
+ },
1447
+ {
1448
+ key: "seller-coupon-second-for-same-store-rejected",
1449
+ label: "Applying a second seller coupon for the SAME store replaces or refuses — you can never have two coupons from one store active at once",
1450
+ href: "/cart",
1451
+ description: "The rule is one seller coupon per store, plus at most one admin coupon overall. Try applying two of store-beyblade-arena's codes back to back.",
1452
+ },
1453
+ {
1454
+ key: "seller-coupon-stacks-with-admin-coupon",
1455
+ label: "One seller coupon and one admin (site-wide) coupon apply together, and the order total reflects both",
1456
+ href: "/cart",
1457
+ description: "Try ARENA25 (store-beyblade-arena) together with a platform coupon such as FREESHIP499. Both should stay applied and the breakdown should list both.",
1458
+ },
1418
1459
  { key: "seller-bundles-crud", label: "Seller can create, edit, and list bundles/grouped listings", href: "/store/bundles" },
1419
1460
  { key: "seller-classified-crud", label: "Seller can create, edit, and list classified listings", href: "/store/classified" },
1420
1461
  { key: "seller-digitalcodes-crud", label: "Seller can create, edit, and list digital-code listings", href: "/store/digital-codes" },
@@ -1449,6 +1490,58 @@ const rawTesterChecklistItems = [
1449
1490
  href: "/store/sublisting-categories",
1450
1491
  },
1451
1492
  { key: "seller-listing-templates-crud", label: "Seller can create, edit, and reuse listing templates when creating a new product", href: "/store/listing-templates" },
1493
+ {
1494
+ key: "seller-category-inline-create",
1495
+ label: "On the product form, the Category picker's \"+ Create new category\" opens a drawer, saves, and auto-selects the new category",
1496
+ description: "The inline drawer is reachable from the category picker on the product form. Type a name, save, and confirm the drawer closes and the new category is already selected in the picker — you should not have to search for it.",
1497
+ href: "/store/products/new",
1498
+ },
1499
+ {
1500
+ key: "seller-category-inline-create-persists",
1501
+ label: "A category created inline is still there after reload — reopen the picker on a fresh product form and search for it by name",
1502
+ description: "Proves the category actually persisted to Firestore rather than only existing in the form's local state.",
1503
+ href: "/store/products/new",
1504
+ },
1505
+ {
1506
+ key: "seller-category-inline-create-duplicate-rejected",
1507
+ label: "Creating a category with a name that already exists shows a readable \"already exists\" error, not a generic failure or a silent no-op",
1508
+ description: "Slug is derived from the name, so a duplicate name collides. Expect a clear message in the drawer.",
1509
+ href: "/store/products/new",
1510
+ },
1511
+ ],
1512
+ },
1513
+ {
1514
+ pageKey: "seller-custom-brands",
1515
+ pageLabel: "Seller — Custom Brands",
1516
+ // The ONLY way a seller creates a brand is the inline picker on the
1517
+ // product form — there is no /store/brands page.
1518
+ href: "/store/products/new",
1519
+ cases: [
1520
+ {
1521
+ key: "seller-brand-inline-create",
1522
+ label: "On the product form, the Brand picker's \"+ Create new brand\" saves successfully and auto-selects the new brand",
1523
+ description: "Fixed 2026-08-22 — this previously failed with a permissions error for every seller: the API route allowed sellers but the underlying action still demanded an admin role. Confirm a seller (not an admin) can complete this end to end.",
1524
+ },
1525
+ {
1526
+ key: "seller-brand-inline-create-persists",
1527
+ label: "A brand created inline is still there after reload — reopen the Brand picker on a fresh product form and search for it by name",
1528
+ description: "Proves the brand persisted rather than only existing in form state.",
1529
+ },
1530
+ {
1531
+ key: "seller-brand-appears-on-public-brands-page",
1532
+ label: "A newly created brand appears on the public /brands page",
1533
+ description: "Brands are stored as category rows discriminated by categoryType:\"brand\", and the public page filters on exactly that. If the brand saves but never shows here, the discriminator wasn't written.",
1534
+ href: "/brands",
1535
+ },
1536
+ {
1537
+ key: "seller-brand-inline-create-duplicate-rejected",
1538
+ label: "Creating a brand whose name matches an existing brand shows a readable \"already exists\" error rather than creating a second copy",
1539
+ },
1540
+ {
1541
+ key: "seller-brand-product-saves-with-new-brand",
1542
+ label: "A product saved with an inline-created brand keeps that brand after save — reopen the product for editing and the Brand field still shows it",
1543
+ description: "Catches the case where the brand is created but its id never makes it onto the product document.",
1544
+ },
1452
1545
  ],
1453
1546
  },
1454
1547
  {
@@ -1483,6 +1576,24 @@ const rawTesterChecklistItems = [
1483
1576
  description: "Added 2026-08-21. The store's WhatsApp access token is encrypted before storage by the same mechanism as the admin Integrations keys, and that mechanism was failing in production — so this save path was broken too, in a place nobody would think to check. Enter a throwaway token value, save, reload the page, and confirm you got a success toast and the field shows a masked value rather than an error or a blank field.",
1484
1577
  href: "/store/whatsapp",
1485
1578
  },
1579
+ {
1580
+ key: "seller-whatsapp-import-runs-in-background",
1581
+ label: "\"Import from WhatsApp\" returns immediately and reports its result when the background job finishes — the page never hangs waiting on it",
1582
+ description: "Changed 2026-08-22 — the import used to run inline and could time out on a large catalog, silently importing only the first 250 items. It now runs as a background job, so expect an immediate \"import started\" response and a result toast a few moments later.",
1583
+ href: "/store/whatsapp",
1584
+ },
1585
+ {
1586
+ key: "seller-whatsapp-import-skips-already-synced",
1587
+ label: "Re-running \"Import from WhatsApp\" a second time imports nothing new — everything is reported as already synced",
1588
+ description: "Items pushed from here carry their LetItRip slug, so a repeat import must not create duplicate draft products. Run it twice and compare the counts.",
1589
+ href: "/store/whatsapp",
1590
+ },
1591
+ {
1592
+ key: "seller-whatsapp-push-product-link-opens",
1593
+ label: "A product pushed to the WhatsApp catalog links back to a working, full product URL — not a broken relative link",
1594
+ description: "Fixed 2026-08-22 — the pushed link was a relative path Meta rejects. Open the item in your WhatsApp catalog and tap through to confirm it lands on the live product page.",
1595
+ href: "/store/whatsapp",
1596
+ },
1486
1597
  { key: "seller-reviews-response", label: "Seller can view and respond to product reviews", href: "/store/reviews" },
1487
1598
  ],
1488
1599
  },
@@ -2602,6 +2713,23 @@ const rawTesterChecklistItems = [
2602
2713
  href: "/admin/site",
2603
2714
  cases: [
2604
2715
  { key: "site-settings-admin", label: "Admin site settings page saves correctly", href: "/admin/site" },
2716
+ {
2717
+ key: "whatsapp-credentials-persist",
2718
+ label: "Site Settings → WhatsApp saves the Phone Number ID, Cloud API token, admin notify numbers, template language and all 6 template names — and they survive a reload",
2719
+ description: "The token field is masked on reload (shows dots, not the raw value) — that is correct. Confirm by changing an unrelated field, saving again, and verifying the token still works rather than being overwritten with the mask.",
2720
+ href: "/admin/site",
2721
+ },
2722
+ {
2723
+ key: "whatsapp-channel-toggle-persists",
2724
+ label: "Site Settings → Notifications: the WhatsApp channel enable toggle, minimum priority, and the checkout OTP switch all persist after save + reload",
2725
+ href: "/admin/site",
2726
+ },
2727
+ {
2728
+ key: "whatsapp-order-announcement-fires",
2729
+ label: "Placing an order sends the WhatsApp announcement to the configured admin numbers using credentials saved in Site Settings — no env var required",
2730
+ description: "Fixed 2026-08-22 — the order-placed announcement previously read environment variables ONLY, so credentials entered in Site Settings were ignored and it silently did nothing. Needs real Meta credentials configured to verify.",
2731
+ href: "/admin/site",
2732
+ },
2605
2733
  {
2606
2734
  key: "auction-bid-tiers-admin",
2607
2735
  label: "Admin can add, edit, and remove bid-increment tiers in Site Settings → Auction Config, and the changes persist after saving and reloading the page",