@mohasinac/appkit 4.1.3 → 4.3.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 (276) hide show
  1. package/dist/_internal/server/features/auth/actions.d.ts +0 -1
  2. package/dist/_internal/server/features/auth/actions.js +0 -1
  3. package/dist/_internal/server/features/bundles/data.d.ts +22 -4
  4. package/dist/_internal/server/features/bundles/data.js +41 -4
  5. package/dist/_internal/server/features/bundles/index.d.ts +1 -1
  6. package/dist/_internal/server/features/bundles/index.js +1 -1
  7. package/dist/_internal/server/features/checkout/actions.d.ts +15 -0
  8. package/dist/_internal/server/features/checkout/actions.js +249 -257
  9. package/dist/_internal/server/features/checkout/prize-bundle-gates.d.ts +5 -16
  10. package/dist/_internal/server/features/checkout/prize-bundle-gates.js +5 -30
  11. package/dist/_internal/server/features/orders/adapters.js +1 -14
  12. package/dist/_internal/server/features/products/actions.js +8 -3
  13. package/dist/_internal/server/features/products/service.d.ts +15 -0
  14. package/dist/_internal/server/features/products/service.js +41 -0
  15. package/dist/_internal/server/functions/firestore.d.ts +3 -1
  16. package/dist/_internal/server/functions/firestore.js +17 -1
  17. package/dist/_internal/server/functions/scheduled.d.ts +3 -5
  18. package/dist/_internal/server/functions/scheduled.js +14 -30
  19. package/dist/_internal/server/jobs/core/bundleStockSync.js +25 -7
  20. package/dist/_internal/server/jobs/core/countersReconcile.js +7 -1
  21. package/dist/_internal/server/jobs/core/index.d.ts +4 -4
  22. package/dist/_internal/server/jobs/core/index.js +4 -4
  23. package/dist/_internal/server/jobs/core/jobRunners.js +10 -0
  24. package/dist/_internal/server/jobs/core/newsletterExport.d.ts +15 -0
  25. package/dist/_internal/server/jobs/core/newsletterExport.js +43 -0
  26. package/dist/_internal/server/jobs/core/onOrderStatusChange.d.ts +2 -0
  27. package/dist/_internal/server/jobs/core/onOrderStatusChange.js +1 -0
  28. package/dist/_internal/server/jobs/core/onPrizeDrawPaymentConfirmed.d.ts +19 -0
  29. package/dist/_internal/server/jobs/core/onPrizeDrawPaymentConfirmed.js +30 -0
  30. package/dist/_internal/server/jobs/core/paymentWindowTimeout.d.ts +2 -2
  31. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +3 -2
  32. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +1 -0
  33. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.d.ts +20 -0
  34. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +113 -0
  35. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.d.ts +14 -0
  36. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +74 -0
  37. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.d.ts +22 -0
  38. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +68 -0
  39. package/dist/_internal/server/jobs/core/revenueRollup.d.ts +13 -0
  40. package/dist/_internal/server/jobs/core/revenueRollup.js +22 -0
  41. package/dist/_internal/server/jobs/core/whatsappNotify.d.ts +35 -0
  42. package/dist/_internal/server/jobs/core/whatsappNotify.js +82 -0
  43. package/dist/_internal/server/jobs/handlers/index.d.ts +4 -4
  44. package/dist/_internal/server/jobs/handlers/index.js +9 -6
  45. package/dist/_internal/server/jobs/handlers/onPrizeDrawPaymentConfirmed.d.ts +3 -0
  46. package/dist/_internal/server/jobs/handlers/onPrizeDrawPaymentConfirmed.js +11 -0
  47. package/dist/_internal/server/jobs/handlers/prizeDrawExpiryReveal.d.ts +2 -0
  48. package/dist/_internal/server/jobs/handlers/prizeDrawExpiryReveal.js +2 -0
  49. package/dist/_internal/server/jobs/handlers/prizeDrawSoldOutReveal.d.ts +3 -0
  50. package/dist/_internal/server/jobs/handlers/prizeDrawSoldOutReveal.js +4 -0
  51. package/dist/_internal/server/jobs/handlers/revenueRollup.d.ts +2 -0
  52. package/dist/_internal/server/jobs/handlers/revenueRollup.js +2 -0
  53. package/dist/_internal/shared/actions/action-registry.js +40 -10
  54. package/dist/_internal/shared/checkout/rules/_defaults.js +1 -2
  55. package/dist/_internal/shared/checkout/rules/_limits.d.ts +3 -0
  56. package/dist/_internal/shared/checkout/rules/_limits.js +3 -0
  57. package/dist/_internal/shared/checkout/rules/_registry.d.ts +2 -1
  58. package/dist/_internal/shared/checkout/rules/_registry.js +2 -2
  59. package/dist/_internal/shared/checkout/rules/classified.rule.js +0 -1
  60. package/dist/_internal/shared/checkout/rules/index.d.ts +1 -1
  61. package/dist/_internal/shared/checkout/rules/index.js +1 -1
  62. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +20 -1
  63. package/dist/_internal/shared/checkout/rules/types.d.ts +17 -7
  64. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +2 -0
  65. package/dist/_internal/shared/features/categories/bundle-copy.js +2 -0
  66. package/dist/_internal/shared/features/categories/bundle-pricing.d.ts +23 -0
  67. package/dist/_internal/shared/features/categories/bundle-pricing.js +25 -0
  68. package/dist/_internal/shared/features/checkout/config.d.ts +7 -0
  69. package/dist/_internal/shared/features/checkout/config.js +7 -0
  70. package/dist/_internal/shared/fees/calculator.d.ts +26 -0
  71. package/dist/_internal/shared/fees/calculator.js +25 -0
  72. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -1
  73. package/dist/constants/api-endpoints.d.ts +6 -9
  74. package/dist/constants/api-endpoints.js +5 -5
  75. package/dist/constants/field-names.d.ts +17 -1
  76. package/dist/constants/field-names.js +17 -1
  77. package/dist/features/about/components/FeesView.js +18 -0
  78. package/dist/features/account/hooks/useNotifications.js +5 -0
  79. package/dist/features/admin/actions/admin-actions.js +6 -0
  80. package/dist/features/admin/actions/notification-actions.d.ts +4 -1
  81. package/dist/features/admin/actions/notification-actions.js +57 -12
  82. package/dist/features/admin/components/AdminAdsView.js +1 -1
  83. package/dist/features/admin/components/AdminBlogEditorView.js +1 -1
  84. package/dist/features/admin/components/AdminNewsletterView.js +42 -11
  85. package/dist/features/admin/components/AdminPrizeDrawsView.js +3 -3
  86. package/dist/features/admin/components/AdminSiteSettingsView.js +115 -11
  87. package/dist/features/admin/components/AdminTesterChecklistView.js +74 -22
  88. package/dist/features/admin/hooks/useAdminListing.d.ts +4 -0
  89. package/dist/features/admin/hooks/useAdminListing.js +4 -2
  90. package/dist/features/admin/repository/analytics-rollup.repository.d.ts +25 -0
  91. package/dist/features/admin/repository/analytics-rollup.repository.js +31 -0
  92. package/dist/features/admin/repository/site-settings.repository.js +8 -1
  93. package/dist/features/admin/schemas/firestore.d.ts +54 -5
  94. package/dist/features/admin/schemas/firestore.js +63 -26
  95. package/dist/features/auctions/actions/bid-actions.js +3 -1
  96. package/dist/features/auctions/components/AuctionBidsTable.d.ts +6 -1
  97. package/dist/features/auctions/components/AuctionBidsTable.js +8 -4
  98. package/dist/features/auctions/components/AuctionDetailPageView.js +10 -13
  99. package/dist/features/auctions/components/CollapsibleBidHistory.d.ts +23 -2
  100. package/dist/features/auctions/components/CollapsibleBidHistory.js +21 -3
  101. package/dist/features/auctions/components/LiveBidPrice.d.ts +19 -0
  102. package/dist/features/auctions/components/LiveBidPrice.js +17 -0
  103. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +1 -1
  104. package/dist/features/auctions/components/PlaceBidFormClient.js +16 -1
  105. package/dist/features/auctions/hooks/useBids.d.ts +33 -0
  106. package/dist/features/auctions/hooks/useBids.js +32 -0
  107. package/dist/features/auctions/hooks/useLiveAuctionBid.d.ts +20 -0
  108. package/dist/features/auctions/hooks/useLiveAuctionBid.js +23 -0
  109. package/dist/features/auth/checkout-value-otp.d.ts +7 -10
  110. package/dist/features/auth/checkout-value-otp.js +14 -10
  111. package/dist/features/auth/server.d.ts +0 -1
  112. package/dist/features/auth/server.js +0 -1
  113. package/dist/features/blog/api/[slug]/route.d.ts +5 -0
  114. package/dist/features/blog/api/[slug]/route.js +12 -3
  115. package/dist/features/blog/components/BlogPostView.d.ts +2 -0
  116. package/dist/features/blog/components/BlogPostView.js +5 -4
  117. package/dist/features/blog/hooks/useBlog.d.ts +2 -0
  118. package/dist/features/blog/hooks/useBlog.js +2 -0
  119. package/dist/features/blog/repository/blog.repository.d.ts +7 -0
  120. package/dist/features/blog/repository/blog.repository.js +44 -0
  121. package/dist/features/blog/schemas/firestore.d.ts +3 -0
  122. package/dist/features/blog/schemas/firestore.js +1 -0
  123. package/dist/features/blog/types/index.d.ts +2 -0
  124. package/dist/features/cart/components/index.d.ts +0 -2
  125. package/dist/features/cart/components/index.js +0 -1
  126. package/dist/features/cart/hooks/useCartCount.js +22 -5
  127. package/dist/features/cart/hooks/useGuestCart.js +11 -1
  128. package/dist/features/cart/utils/guest-cart.d.ts +4 -0
  129. package/dist/features/cart/utils/guest-cart.js +10 -0
  130. package/dist/features/cart/utils/pending-ops.d.ts +17 -0
  131. package/dist/features/cart/utils/pending-ops.js +46 -5
  132. package/dist/features/categories/components/BrandDetailPageView.js +6 -2
  133. package/dist/features/categories/components/BundleDetailView.js +4 -2
  134. package/dist/features/categories/components/CategoryDetailPageView.js +10 -2
  135. package/dist/features/categories/schemas/firestore.d.ts +7 -0
  136. package/dist/features/checkout/actions/index.d.ts +0 -1
  137. package/dist/features/checkout/actions/index.js +0 -1
  138. package/dist/features/checkout/schemas/firestore.d.ts +2 -2
  139. package/dist/features/events/actions/event-actions.d.ts +2 -0
  140. package/dist/features/events/actions/event-actions.js +5 -0
  141. package/dist/features/events/components/EventCard.js +1 -2
  142. package/dist/features/events/components/RelatedEventsCarousel.d.ts +15 -0
  143. package/dist/features/events/components/RelatedEventsCarousel.js +13 -0
  144. package/dist/features/events/components/index.d.ts +2 -0
  145. package/dist/features/events/components/index.js +1 -0
  146. package/dist/features/events/repository/events.repository.d.ts +6 -0
  147. package/dist/features/events/repository/events.repository.js +21 -0
  148. package/dist/features/history/repository/user-history.repository.d.ts +1 -1
  149. package/dist/features/history/utils/guest-history.d.ts +1 -1
  150. package/dist/features/homepage/components/FeaturedBundlesSection.js +4 -2
  151. package/dist/features/homepage/components/FeaturedProductsSection.js +2 -2
  152. package/dist/features/homepage/components/SectionCarousel.js +1 -1
  153. package/dist/features/homepage/components/WelcomeSection.js +1 -1
  154. package/dist/features/layout/AppLayoutShell.js +1 -1
  155. package/dist/features/layout/BackToTop.d.ts +9 -5
  156. package/dist/features/layout/BackToTop.js +17 -21
  157. package/dist/features/layout/NavbarLayout.js +1 -1
  158. package/dist/features/layout/TitleBarLayout.js +2 -2
  159. package/dist/features/media/MediaVideo.d.ts +7 -0
  160. package/dist/features/media/MediaVideo.js +36 -5
  161. package/dist/features/orders/actions/refund-actions.js +1 -0
  162. package/dist/features/orders/components/OrdersList.js +1 -5
  163. package/dist/features/orders/schemas/firestore.d.ts +16 -8
  164. package/dist/features/orders/schemas/index.d.ts +3 -32
  165. package/dist/features/orders/schemas/index.js +1 -4
  166. package/dist/features/orders/types/index.d.ts +6 -9
  167. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +1 -1
  168. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +2 -1
  169. package/dist/features/products/actions/product-actions.js +13 -10
  170. package/dist/features/products/components/MarketplaceBundleCard.d.ts +1 -1
  171. package/dist/features/products/components/MarketplaceBundleCard.js +7 -4
  172. package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
  173. package/dist/features/products/components/PrizeDrawItemsEditor.js +2 -2
  174. package/dist/features/products/components/PrizeDrawWinnerMappingView.d.ts +14 -0
  175. package/dist/features/products/components/PrizeDrawWinnerMappingView.js +37 -0
  176. package/dist/features/products/components/PrizeRevealModal.d.ts +10 -23
  177. package/dist/features/products/components/PrizeRevealModal.js +18 -147
  178. package/dist/features/products/components/ProductDetailPageView.js +72 -30
  179. package/dist/features/products/components/ProductForm.js +7 -14
  180. package/dist/features/products/components/ProductGalleryClient.d.ts +10 -1
  181. package/dist/features/products/components/ProductGalleryClient.js +29 -10
  182. package/dist/features/products/components/ProductsIndexListing.js +2 -1
  183. package/dist/features/products/components/RelatedProductsCarousel.js +2 -2
  184. package/dist/features/products/components/ShowGroupSection.js +2 -2
  185. package/dist/features/products/components/SublistingCarouselSection.js +1 -1
  186. package/dist/features/products/components/index.d.ts +4 -2
  187. package/dist/features/products/components/index.js +1 -0
  188. package/dist/features/products/constants/action-defs.d.ts +28 -4
  189. package/dist/features/products/constants/action-defs.js +76 -3
  190. package/dist/features/products/repository/products.repository.d.ts +6 -0
  191. package/dist/features/products/repository/products.repository.js +20 -1
  192. package/dist/features/products/schemas/firestore.d.ts +26 -2
  193. package/dist/features/products/schemas/index.d.ts +11 -3
  194. package/dist/features/products/schemas/index.js +10 -2
  195. package/dist/features/products/types/index.d.ts +2 -1
  196. package/dist/features/reviews/actions/review-actions.js +1 -0
  197. package/dist/features/reviews/components/ReviewDetailPageView.js +8 -1
  198. package/dist/features/reviews/components/ReviewDetailShell.js +2 -1
  199. package/dist/features/reviews/components/ReviewsList.js +2 -1
  200. package/dist/features/reviews/schemas/firestore.d.ts +3 -0
  201. package/dist/features/reviews/schemas/index.d.ts +6 -0
  202. package/dist/features/reviews/schemas/index.js +2 -0
  203. package/dist/features/reviews/types/index.d.ts +3 -0
  204. package/dist/features/scams/actions/scam-actions.d.ts +3 -0
  205. package/dist/features/scams/actions/scam-actions.js +3 -2
  206. package/dist/features/scams/components/ScamProfileView.d.ts +2 -1
  207. package/dist/features/scams/components/ScamProfileView.js +2 -2
  208. package/dist/features/scams/repository/scammer.repository.d.ts +6 -0
  209. package/dist/features/scams/repository/scammer.repository.js +24 -0
  210. package/dist/features/seller/actions/seller-actions.js +8 -0
  211. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  212. package/dist/features/seller/components/SellerPrizeDrawsView.js +4 -0
  213. package/dist/features/stores/components/StoreDetailLayoutView.js +6 -6
  214. package/dist/features/stores/components/StoreNavTabs.d.ts +10 -1
  215. package/dist/features/stores/components/StoreNavTabs.js +21 -9
  216. package/dist/features/tester/actions/index.d.ts +1 -0
  217. package/dist/features/tester/actions/index.js +1 -0
  218. package/dist/features/tester/actions/leaderboard-actions.d.ts +3 -0
  219. package/dist/features/tester/actions/leaderboard-actions.js +5 -0
  220. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +26 -4
  221. package/dist/features/tester/components/AdminTesterFeedbackListView.js +13 -0
  222. package/dist/features/tester/components/BugHunterLeaderboardView.d.ts +23 -0
  223. package/dist/features/tester/components/BugHunterLeaderboardView.js +18 -0
  224. package/dist/features/tester/components/index.d.ts +2 -0
  225. package/dist/features/tester/components/index.js +1 -0
  226. package/dist/features/tester/repository/tester-checklist-item.repository.d.ts +12 -1
  227. package/dist/features/tester/repository/tester-checklist-item.repository.js +80 -0
  228. package/dist/features/tester/repository/tester-checklist-response.repository.d.ts +4 -0
  229. package/dist/features/tester/repository/tester-checklist-response.repository.js +4 -0
  230. package/dist/features/tester/schemas/firestore.d.ts +22 -1
  231. package/dist/features/tester/schemas/firestore.js +8 -0
  232. package/dist/features/tester/seed-data/categories-tester-seed-data.js +42 -7
  233. package/dist/features/tester/seed-data/events-tester-seed-data.js +23 -0
  234. package/dist/features/tester/seed-data/orders-tester-seed-data.js +69 -31
  235. package/dist/features/tester/seed-data/products-tester-seed-data.js +152 -8
  236. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +249 -14
  237. package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +10 -1
  238. package/dist/features/whatsapp-bot/helpers/whatsapp.js +47 -0
  239. package/dist/features/whatsapp-bot/types/index.d.ts +19 -0
  240. package/dist/features/wishlist/hooks/useGuestWishlist.js +11 -1
  241. package/dist/features/wishlist/hooks/useWishlistCount.js +16 -2
  242. package/dist/features/wishlist/utils/guest-wishlist.d.ts +5 -0
  243. package/dist/features/wishlist/utils/guest-wishlist.js +11 -0
  244. package/dist/index.d.ts +23 -24
  245. package/dist/index.js +29 -60
  246. package/dist/jobs.d.ts +1 -1
  247. package/dist/jobs.js +2 -2
  248. package/dist/next/routing/route-map.d.ts +4 -0
  249. package/dist/next/routing/route-map.js +2 -0
  250. package/dist/repositories/index.d.ts +2 -0
  251. package/dist/repositories/index.js +1 -0
  252. package/dist/schemas/registry.d.ts +6 -26
  253. package/dist/seed/bids-seed-data.js +14 -2
  254. package/dist/seed/blog-posts-seed-data.js +2 -1
  255. package/dist/seed/categories-seed-data.js +11 -2
  256. package/dist/seed/events-seed-data.js +11 -11
  257. package/dist/seed/faq-seed-data.js +5 -1
  258. package/dist/seed/products-auctions-seed-data.js +2 -2
  259. package/dist/seed/products-preorders-seed-data.d.ts +2 -1
  260. package/dist/seed/products-prize-draws-seed-data.js +56 -10
  261. package/dist/seed/products-standard-seed-data.js +82 -3
  262. package/dist/seed/scammers-seed-data.js +75 -2
  263. package/dist/seed/site-settings-seed-data.js +12 -2
  264. package/dist/server-entry.d.ts +0 -1
  265. package/dist/server-entry.js +0 -1
  266. package/dist/server.d.ts +6 -22
  267. package/dist/server.js +12 -59
  268. package/dist/styles.css +1 -1
  269. package/dist/tailwind-utilities.css +1 -1
  270. package/dist/ui/components/BaseListingCard.js +1 -1
  271. package/dist/ui/components/ImageLightbox.d.ts +9 -0
  272. package/dist/ui/components/ImageLightbox.js +6 -3
  273. package/dist/ui/components/ListingToolbar.d.ts +18 -1
  274. package/dist/ui/components/ListingToolbar.js +5 -2
  275. package/dist/ui/components/StickyToolbar.js +13 -8
  276. package/package.json +1 -1
@@ -8,6 +8,9 @@
8
8
  * personas (Mock User 11, Mock User 14, Mock User 9), never the store's own seller
9
9
  * (user-tyson-blader owns store-beyblade-arena). Status: newest bid per auction is
10
10
  * "active", the rest "outbid". Bid IDs: bid-{productSlug}-{userName}-{YYYYMMDD}-{rand6}.
11
+ * L-Drago's ladder is deliberately 13 bids deep (cycling the 3 personas) so the
12
+ * auction detail page's paginated Bid History section (pageSize 5) and the /user/bids
13
+ * dashboard both have real multi-page data to exercise — see CollapsibleBidHistory.tsx.
11
14
  *
12
15
  * EXPORTS:
13
16
  * bidsSeedData — Array of bid documents, one set per seeded auction, counts matching
@@ -72,18 +75,27 @@ const _rawBidsSeedData = [
72
75
  currentBid: 3499,
73
76
  bidderIds: ["user-rohit-collector", "user-ananya-collector", "user-meera-bey"],
74
77
  }),
75
- // auction-beyblade-metal-lightning-l-drago — bidCount: 5, currentBid: 2299
78
+ // auction-beyblade-metal-lightning-l-drago — bidCount: 13, currentBid: 3199
79
+ // Deliberately deep ladder (see file header) to exercise Bid History pagination.
76
80
  ...buildLadder({
77
81
  productId: "auction-beyblade-metal-lightning-l-drago",
78
82
  productTitle: "Metal Fight Beyblade BB-99 Lightning L-Drago",
79
83
  startingBid: 1999,
80
- currentBid: 2299,
84
+ currentBid: 3199,
81
85
  bidderIds: [
82
86
  "user-meera-bey",
83
87
  "user-rohit-collector",
84
88
  "user-ananya-collector",
85
89
  "user-rohit-collector",
86
90
  "user-meera-bey",
91
+ "user-ananya-collector",
92
+ "user-rohit-collector",
93
+ "user-meera-bey",
94
+ "user-ananya-collector",
95
+ "user-rohit-collector",
96
+ "user-meera-bey",
97
+ "user-ananya-collector",
98
+ "user-rohit-collector",
87
99
  ],
88
100
  }),
89
101
  ];
@@ -275,7 +275,8 @@ export const blogPostsSeedData = [
275
275
  title: "10 Tips to Sell Faster on LetItRip",
276
276
  slug: "selling-tips-letitrip",
277
277
  excerpt: "From photography to pricing to descriptions — proven tactics to make your listings sell faster on LetItRip.",
278
- content: `<h2>1. Photograph Everything</h2><p>Front, back, edges, corners, holo pattern. Natural light. White background. Minimum 4 photos per listing.</p><h2>2. Price Competitively</h2><p>Check what similar items sold for on LetItRip in the last 30 days. Price 5–10% below the lowest active listing for a fast sale.</p><h2>3. Write Honest Descriptions</h2><p>State the exact condition. Mention every flaw. Buyers trust sellers who are upfront about imperfections — they'll come back.</p><h2>4. Respond to Offers Within 2 Hours</h2><p>Quick responses convert. Buyers often make offers to multiple sellers — the first response wins.</p><h2>5. Ship the Same Day</h2><p>Buyers who receive fast shipping leave 5-star reviews. 5-star reviews bring more buyers. It's a flywheel.</p><h2>6–10</h2><p>Use accurate category tags. Add a YouTube unboxing link. Offer bundle discounts. Cross-reference to your other listings. Keep your store description updated.</p>`,
278
+ content: `<h2>1. Photograph Everything</h2><p>Front, back, edges, corners, holo pattern. Natural light. White background. Minimum 4 photos per listing.</p><h2>2. Price Competitively</h2><p>Check what similar items sold for on LetItRip in the last 30 days. Price 5–10% below the lowest active listing for a fast sale.</p><h2>3. Write Honest Descriptions</h2><p>State the exact condition. Mention every flaw. Buyers trust sellers who are upfront about imperfections — they'll come back.</p><h2>4. Respond to Offers Within 2 Hours</h2><p>Quick responses convert. Buyers often make offers to multiple sellers — the first response wins.</p><h2>5. Ship the Same Day</h2><p>Buyers who receive fast shipping leave 5-star reviews. 5-star reviews bring more buyers. It's a flywheel.</p><h2>6–10</h2><p>Use accurate category tags. Add a YouTube unboxing link (see the video above). Offer bundle discounts. Cross-reference to your other listings. Keep your store description updated.</p>`,
279
+ youtubeId: "dQw4w9WgXcQ",
279
280
  category: "tips",
280
281
  tags: ["selling", "tips", "photography", "pricing", "seller-guide"],
281
282
  isFeatured: false,
@@ -245,6 +245,7 @@ const bundleRows = [
245
245
  productIds: ["product-beyblade-original-dranzer-s", "product-beyblade-original-driger-v", "product-beyblade-metal-storm-pegasus"],
246
246
  },
247
247
  bundleProductIds: ["product-beyblade-original-dranzer-s", "product-beyblade-original-driger-v", "product-beyblade-metal-storm-pegasus"],
248
+ bundleOriginalTotal: 4597, // 1499 + 1799 + 1299
248
249
  bundleStockStatus: "in_stock",
249
250
  display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-original-collectors-set-20260101/1200/900"), showInFooter: false },
250
251
  isActive: true,
@@ -277,6 +278,7 @@ const bundleRows = [
277
278
  productIds: ["product-beyblade-metal-storm-pegasus", "product-beyblade-metal-flame-sagittario", "product-beyblade-original-dranzer-s"],
278
279
  },
279
280
  bundleProductIds: ["product-beyblade-metal-storm-pegasus", "product-beyblade-metal-flame-sagittario", "product-beyblade-original-dranzer-s"],
281
+ bundleOriginalTotal: 3997, // 1299 + 1199 + 1499
280
282
  bundleStockStatus: "in_stock",
281
283
  display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-metal-fusion-duo-20260101/1200/900"), showInFooter: false },
282
284
  isActive: true,
@@ -303,12 +305,15 @@ const bundleRows = [
303
305
  description: "Valkyrie and Regalia Genesis — top-tier Burst-era attackers in one set.",
304
306
  categoryType: "bundle",
305
307
  bundleKind: "special",
306
- bundlePrice: 3799,
308
+ // Was 3799 — priced ABOVE the 999+1399+1199=3597 member total (no real
309
+ // discount, contradicted the bundle's whole purpose). Corrected 2026-08-19.
310
+ bundlePrice: 2899,
307
311
  bundleQueryRule: {
308
312
  type: "static",
309
313
  productIds: ["product-beyblade-burst-valkyrie", "product-beyblade-burst-regalia-genesis", "product-beyblade-metal-flame-sagittario"],
310
314
  },
311
315
  bundleProductIds: ["product-beyblade-burst-valkyrie", "product-beyblade-burst-regalia-genesis", "product-beyblade-metal-flame-sagittario"],
316
+ bundleOriginalTotal: 3597, // 999 + 1399 + 1199
312
317
  bundleStockStatus: "in_stock",
313
318
  display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-burst-battlers-pack-20260101/1200/900"), showInFooter: false },
314
319
  isActive: true,
@@ -341,6 +346,7 @@ const bundleRows = [
341
346
  productIds: ["product-beyblade-x-wizard-arrow", "product-beyblade-x-knife-shinobi", "product-beyblade-burst-valkyrie"],
342
347
  },
343
348
  bundleProductIds: ["product-beyblade-x-wizard-arrow", "product-beyblade-x-knife-shinobi", "product-beyblade-burst-valkyrie"],
349
+ bundleOriginalTotal: 2847, // 899 + 949 + 999
344
350
  bundleStockStatus: "in_stock",
345
351
  display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-x-series-starter-20260101/1200/900"), showInFooter: false },
346
352
  isActive: true,
@@ -367,7 +373,9 @@ const bundleRows = [
367
373
  description: "One top from every Beyblade generation — Original, Metal Fight, Burst, and X — the ultimate collector's starter pack.",
368
374
  categoryType: "bundle",
369
375
  bundleKind: "special",
370
- bundlePrice: 5999,
376
+ // Was 5999 — priced ABOVE the 1799+1299+999+899=4996 member total (no
377
+ // real discount, contradicted the bundle's whole purpose). Corrected 2026-08-19.
378
+ bundlePrice: 3999,
371
379
  bundleQueryRule: {
372
380
  type: "static",
373
381
  productIds: [
@@ -383,6 +391,7 @@ const bundleRows = [
383
391
  "product-beyblade-burst-valkyrie",
384
392
  "product-beyblade-x-wizard-arrow",
385
393
  ],
394
+ bundleOriginalTotal: 4996, // 1799 + 1299 + 999 + 899
386
395
  bundleStockStatus: "in_stock",
387
396
  display: { coverImage: seedExtMedia("https://picsum.photos/seed/bundle-every-generation-starter-pack-20260101/1200/900"), showInFooter: false },
388
397
  isActive: true,
@@ -110,7 +110,7 @@ export const eventsSeedData = [
110
110
  startsAt: daysAgo(3),
111
111
  endsAt: daysAhead(14),
112
112
  coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/event-cover-regalia-genesis-raffle-20260101/1200/600"), alt: "Beyblade Burst Regalia Genesis" },
113
- tags: ["raffle", "burst", "regalia-genesis", "giveaway"],
113
+ tags: ["raffle", "burst", "regalia-genesis", "giveaway", "prizes"],
114
114
  hasRaffle: true,
115
115
  raffleType: "open_raffle",
116
116
  rafflePrize: "Sealed Beyblade Burst Regalia Genesis (authenticity cert: LIR-BEY-998877)",
@@ -170,22 +170,22 @@ export const eventsSeedData = [
170
170
  createdAt: daysAgo(12),
171
171
  updatedAt: daysAgo(2),
172
172
  },
173
- // ── 7. UPCOMING — Offer: Buy 3 Get 1 Free Beyblades ──────────────────────
173
+ // ── 7. ACTIVE — Offer: Buy 3 Beyblades, Get 10% Off ──────────────────────
174
174
  {
175
175
  id: "event-buy-3-get-1-beyblades",
176
176
  slug: "buy-3-get-1-beyblades",
177
177
  type: EVENT_FIELDS.TYPE_VALUES.OFFER,
178
- title: "Buy 3 Beyblades, Get 1 Free",
179
- description: "Coming soon! Buy any 3 beyblades and get the cheapest one free. Applies to all stores on LetItRip.",
180
- status: EVENT_FIELDS.STATUS_VALUES.DRAFT,
181
- startsAt: daysAhead(5),
178
+ title: "Buy 3 Beyblades, Get 10% Off",
179
+ description: "Buy any 3 beyblades from Beyblade Arena and get 10% off the total. Applies to original, metal, burst, and X series.",
180
+ status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
181
+ startsAt: daysAgo(1),
182
182
  endsAt: daysAhead(20),
183
- coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/event-cover-buy3get1-20260101/1200/600"), alt: "Buy 3 get 1 free Beyblade offer" },
184
- tags: ["offer", "buy-3-get-1", "singles", "upcoming"],
183
+ coverImage: { type: "image", url: seedExtMedia("https://picsum.photos/seed/event-cover-buy3get1-20260101/1200/600"), alt: "Buy 3 beyblades, get 10% off offer" },
184
+ tags: ["offer", "buy-3-get-10-percent", "singles"],
185
185
  offerConfig: {
186
- couponId: "coupon-buy3get1",
187
- displayCode: "BUY3GET1",
188
- bannerText: "Buy any 3 beyblades and get the cheapest one free!",
186
+ couponId: "coupon-buynow10",
187
+ displayCode: "BUYNOW10",
188
+ bannerText: "Buy any 3 beyblades from Beyblade Arena and get 10% off the total!",
189
189
  },
190
190
  stats: { totalEntries: 0, approvedEntries: 0, flaggedEntries: 0 },
191
191
  createdBy: "user-admin-letitrip",
@@ -1224,7 +1224,11 @@ export const faqSeedData = [
1224
1224
  relatedFAQs: [],
1225
1225
  stats: makeStats(210, 10),
1226
1226
  seo: { slug: "faq-what-are-procurement-shipments", metaTitle: "Procurement Shipments for Sellers", metaDescription: "How LetItRip's seller procurement shipment tracking tool works." },
1227
- isActive: true,
1227
+ // Deliberately isActive:false — every other FAQ in this file (and all 63
1228
+ // previously seeded) was isActive:true, so the admin FAQs dashboard's
1229
+ // isActive toggle (backed by the faqs(isActive, priority ASC) composite
1230
+ // index) had nothing to show when toggled to the inactive branch.
1231
+ isActive: false,
1228
1232
  createdBy: "user-admin-letitrip",
1229
1233
  createdAt: daysAgo(10),
1230
1234
  updatedAt: daysAgo(1),
@@ -69,10 +69,10 @@ const _rawProductsAuctionsSeedData = [
69
69
  brand: "Takara-Tomy",
70
70
  startingBid: 1999,
71
71
  buyItNowPrice: 4499,
72
- currentBid: 2299,
72
+ currentBid: 3199,
73
73
  currency: "INR",
74
74
  auctionEndDate: new Date(Date.now() + 6 * 24 * 60 * 60 * 1000),
75
- bidCount: 5,
75
+ bidCount: 13,
76
76
  bidsHaveStarted: true,
77
77
  isSold: false,
78
78
  mainImage: seedExtMedia("https://picsum.photos/seed/auction-image-beyblade-metal-lightning-l-drago-1-20260101/900/900"),
@@ -112,9 +112,10 @@ export declare const productsPreordersSeedData: {
112
112
  prizeRevealWindowStart?: Date | undefined;
113
113
  prizeRevealWindowEnd?: Date | undefined;
114
114
  prizeRevealStatus?: "pending" | "open" | "closed" | undefined;
115
- prizeRevealDeadlineDays?: number | undefined;
115
+ prizeDrawDurationDays?: number | undefined;
116
116
  prizeGithubFileUrl?: string | undefined;
117
117
  prizeDrawMode?: "reveal" | "lottery" | undefined;
118
+ prizeRevealMode?: "instant" | "scheduled" | undefined;
118
119
  lotteryConfig?: import("..").LotteryConfig | undefined;
119
120
  shipping?: {
120
121
  allowedProviderIds?: string[];
@@ -1,14 +1,15 @@
1
1
  /*
2
- * WHY: Real (non-tester-sandbox) prize-draw listing so testers and shoppers can exercise
3
- * the prize-draw buy reveal flow against permanent catalog content, not just the
4
- * disposable 7-day tester sandbox item. Previously an empty stub — "out of scope for
5
- * the minimal Beyblade-focused demo catalog" — now populated with one platform-run
6
- * mystery-box draw, on-theme for the spinning-tops catalog.
7
- * WHAT: Exports 1 prize-draw listing (classic reveal mode, 4 prizes) run by the platform's
8
- * own store, letitrip-official.
2
+ * WHY: Real (non-tester-sandbox) prize-draw listings so testers and shoppers can exercise
3
+ * both automatic-reveal modes ("instant" and "scheduled") against permanent catalog
4
+ * content, not just the disposable 7-day tester sandbox item. Previously an empty
5
+ * stub — "out of scope for the minimal Beyblade-focused demo catalog" — now populated
6
+ * with two platform-run mystery-box draws, on-theme for the spinning-tops catalog.
7
+ * WHAT: Exports 2 prize-draw listings (classic reveal mode) run by the platform's own
8
+ * store, letitrip-official — one "instant" mode (4 prizes), one "scheduled" mode
9
+ * (2 prizes, small pool for easy manual sellout testing).
9
10
  *
10
11
  * EXPORTS:
11
- * productsPrizeDrawsSeedData — Array of 1 Partial<ProductDocument> with listingType:"prize-draw"
12
+ * productsPrizeDrawsSeedData — Array of 2 Partial<ProductDocument> with listingType:"prize-draw"
12
13
  *
13
14
  * @tag domain:products,prize-draws
14
15
  * @tag layer:seed
@@ -43,13 +44,14 @@ export const productsPrizeDrawsSeedData = [
43
44
  storeId: "store-letitrip-official",
44
45
  storeName: "LetItRip Official",
45
46
  prizeDrawMode: "reveal",
47
+ prizeRevealMode: "instant",
46
48
  pricePerEntry: 99,
47
49
  prizeMaxEntries: 4,
48
50
  prizeCurrentEntries: 0,
51
+ prizeDrawDurationDays: 7,
49
52
  prizeRevealWindowStart: new Date("2026-05-01"),
50
- prizeRevealWindowEnd: new Date("2026-12-31"),
53
+ prizeRevealWindowEnd: new Date("2026-05-08"),
51
54
  prizeRevealStatus: "open",
52
- prizeRevealDeadlineDays: 7,
53
55
  prizeDrawItems: [
54
56
  { itemNumber: 1, title: "Limited-Edition Gold Dranzer S", description: "Rare gold-finish collector's edition.", images: [seedExtMedia("https://picsum.photos/seed/prizedraw-item-beyblade-1-20260101/600/600")], condition: "new", estimatedValue: 3499, isWon: false },
55
57
  { itemNumber: 2, title: "Beyblade X Starter Set", description: "Full starter set with stadium.", images: [seedExtMedia("https://picsum.photos/seed/prizedraw-item-beyblade-2-20260101/600/600")], condition: "new", estimatedValue: 1999, isWon: false },
@@ -66,4 +68,48 @@ export const productsPrizeDrawsSeedData = [
66
68
  updatedAt: new Date("2026-05-01"),
67
69
  searchTokens: buildSearchTokens("Beyblade Mystery Box — Prize Draw", "Buy an entry and reveal your prize instantly.", "Beyblade", "brand-beyblade", ["Spinning Tops"], ["prize-draw", "mystery-box"]),
68
70
  },
71
+ {
72
+ id: "prizedraw-beyblade-scheduled-demo",
73
+ slug: "prizedraw-beyblade-scheduled-demo",
74
+ title: "Beyblade Champion's Draw — Prize Draw",
75
+ description: "Two entries, two prizes — the winners are revealed automatically the moment the draw closes (3 days) or sells out, whichever comes first.",
76
+ categorySlugs: ["category-spinning-tops"],
77
+ categoryNames: ["Spinning Tops"],
78
+ brandSlug: "brand-beyblade",
79
+ brand: "Beyblade",
80
+ price: 149,
81
+ currency: "INR",
82
+ stockQuantity: 2,
83
+ availableQuantity: 2,
84
+ isSold: false,
85
+ mainImage: seedExtMedia("https://picsum.photos/seed/prizedraw-image-beyblade-scheduled-1-20260101/900/900"),
86
+ images: [seedExtMedia("https://picsum.photos/seed/prizedraw-image-beyblade-scheduled-1-20260101/900/900")],
87
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
88
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
89
+ listingType: "prize-draw",
90
+ storeId: "store-letitrip-official",
91
+ storeName: "LetItRip Official",
92
+ prizeDrawMode: "reveal",
93
+ prizeRevealMode: "scheduled",
94
+ pricePerEntry: 149,
95
+ prizeMaxEntries: 2,
96
+ prizeCurrentEntries: 0,
97
+ prizeDrawDurationDays: 3,
98
+ prizeRevealWindowStart: new Date("2026-05-01"),
99
+ prizeRevealWindowEnd: new Date("2026-05-04"),
100
+ prizeRevealStatus: "open",
101
+ prizeDrawItems: [
102
+ { itemNumber: 1, title: "Beyblade X Champion Set", description: "Tournament-grade champion set.", images: [seedExtMedia("https://picsum.photos/seed/prizedraw-item-beyblade-scheduled-1-20260101/600/600")], condition: "new", estimatedValue: 2499, isWon: false },
103
+ { itemNumber: 2, title: "Spare Tip Multipack", description: "Assorted performance tips.", images: [seedExtMedia("https://picsum.photos/seed/prizedraw-item-beyblade-scheduled-2-20260101/600/600")], condition: "new", estimatedValue: 299, isWon: false },
104
+ ],
105
+ customFields: [],
106
+ customSections: [],
107
+ featured: false,
108
+ isPromoted: false,
109
+ isOnSale: false,
110
+ tags: ["prize-draw", "mystery-box"],
111
+ createdAt: new Date("2026-05-01"),
112
+ updatedAt: new Date("2026-05-01"),
113
+ searchTokens: buildSearchTokens("Beyblade Champion's Draw — Prize Draw", "Two entries, two prizes, revealed automatically at close or sellout.", "Beyblade", "brand-beyblade", ["Spinning Tops"], ["prize-draw", "mystery-box"]),
114
+ },
69
115
  ];
@@ -1,11 +1,13 @@
1
1
  /*
2
2
  * WHY: Seeds a minimal, Beyblade-focused catalog of standard product listings — 2 products per
3
- * generation (Original, Metal Fight, Burst, X), all from the Beyblade Arena store.
4
- * WHAT: Exports 8 standard products with listingType:"standard", covering all 4 generation
3
+ * generation (Original, Metal Fight, Burst, X), all from the Beyblade Arena store, plus
4
+ * 2 video-demo products (one per generation family) so the product gallery's video slide
5
+ * (theater-mode playback, zoom/rotate) has real, playable fixtures to test against.
6
+ * WHAT: Exports 10 standard products with listingType:"standard", covering all 4 generation
5
7
  * leaf categories (tagged with both leaf + root category slugs).
6
8
  *
7
9
  * EXPORTS:
8
- * productsStandardSeedData — Array of 8 standard products with listingType:"standard"
10
+ * productsStandardSeedData — Array of 10 standard products with listingType:"standard"
9
11
  *
10
12
  * @tag domain:products,catalog
11
13
  * @tag layer:seed
@@ -51,6 +53,7 @@ const _rawProductsStandardSeedData = [
51
53
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
52
54
  condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
53
55
  featured: true,
56
+ tags: ["attack-type"],
54
57
  storeId: "store-beyblade-arena",
55
58
  storeName: "Beyblade Arena",
56
59
  createdAt: new Date("2026-04-10"),
@@ -79,6 +82,7 @@ const _rawProductsStandardSeedData = [
79
82
  ],
80
83
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
81
84
  condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
85
+ tags: ["vintage-collectible"],
82
86
  storeId: "store-beyblade-arena",
83
87
  storeName: "Beyblade Arena",
84
88
  createdAt: new Date("2026-04-12"),
@@ -109,6 +113,7 @@ const _rawProductsStandardSeedData = [
109
113
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
110
114
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
111
115
  featured: true,
116
+ tags: ["attack-type"],
112
117
  storeId: "store-beyblade-arena",
113
118
  storeName: "Beyblade Arena",
114
119
  createdAt: new Date("2026-04-14"),
@@ -137,6 +142,7 @@ const _rawProductsStandardSeedData = [
137
142
  ],
138
143
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
139
144
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
145
+ tags: ["balance-type", "tournament-grade"],
140
146
  storeId: "store-beyblade-arena",
141
147
  storeName: "Beyblade Arena",
142
148
  createdAt: new Date("2026-04-16"),
@@ -167,6 +173,7 @@ const _rawProductsStandardSeedData = [
167
173
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
168
174
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
169
175
  featured: true,
176
+ tags: ["attack-type", "starter-set"],
170
177
  storeId: "store-beyblade-arena",
171
178
  storeName: "Beyblade Arena",
172
179
  createdAt: new Date("2026-04-18"),
@@ -195,6 +202,7 @@ const _rawProductsStandardSeedData = [
195
202
  ],
196
203
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
197
204
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
205
+ tags: ["attack-type"],
198
206
  storeId: "store-beyblade-arena",
199
207
  storeName: "Beyblade Arena",
200
208
  createdAt: new Date("2026-04-20"),
@@ -225,6 +233,7 @@ const _rawProductsStandardSeedData = [
225
233
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
226
234
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
227
235
  featured: true,
236
+ tags: ["attack-type", "starter-set"],
228
237
  storeId: "store-beyblade-arena",
229
238
  storeName: "Beyblade Arena",
230
239
  createdAt: new Date("2026-04-22"),
@@ -253,11 +262,81 @@ const _rawProductsStandardSeedData = [
253
262
  ],
254
263
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
255
264
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
265
+ tags: ["balance-type", "tournament-grade"],
256
266
  storeId: "store-beyblade-arena",
257
267
  storeName: "Beyblade Arena",
258
268
  createdAt: new Date("2026-04-24"),
259
269
  updatedAt: new Date("2026-05-04"),
260
270
  },
271
+ // ===== Video-demo fixtures — real playable video field for gallery testing =====
272
+ {
273
+ id: "product-beyblade-original-dragoon-f-video-demo",
274
+ slug: "product-beyblade-original-dragoon-f-video-demo",
275
+ barcodeId: "LIR-BEY-VID-001",
276
+ title: "Beyblade Original — Dragoon F (Video Demo)",
277
+ description: "Dragoon F attack-type top from the original series. Listed with an unboxing/spin video for gallery testing.",
278
+ categorySlugs: ["category-beyblade-original", "category-spinning-tops"],
279
+ categoryNames: ["Beyblade Original", "Spinning Tops"],
280
+ brandSlug: "brand-beyblade",
281
+ brand: "Beyblade",
282
+ price: 1599,
283
+ currency: "INR",
284
+ stockQuantity: 5,
285
+ availableQuantity: 5,
286
+ isSold: false,
287
+ mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-dragoon-f-video-demo-1-20260819/900/900"),
288
+ images: [
289
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-dragoon-f-video-demo-1-20260819/900/900"),
290
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-dragoon-f-video-demo-2-20260819/900/900"),
291
+ ],
292
+ video: {
293
+ // audit-seed-external-url-ok: raw <video> src, /api/media/ext is image-only (Root Cause #27)
294
+ url: "https://storage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4",
295
+ thumbnailUrl: seedExtMedia("https://picsum.photos/seed/product-video-thumb-beyblade-original-dragoon-f-video-demo-20260819/800/450"),
296
+ duration: 15,
297
+ },
298
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
299
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
300
+ tags: ["vintage-collectible"],
301
+ storeId: "store-beyblade-arena",
302
+ storeName: "Beyblade Arena",
303
+ createdAt: new Date("2026-08-19"),
304
+ updatedAt: new Date("2026-08-19"),
305
+ },
306
+ {
307
+ id: "product-beyblade-x-dran-sword-video-demo",
308
+ slug: "product-beyblade-x-dran-sword-video-demo",
309
+ barcodeId: "LIR-BEY-VID-002",
310
+ title: "Beyblade X BX-02 Dran Sword (Video Demo)",
311
+ description: "Dran Sword 3-60F attack-type top from the Beyblade X Xtreme Gear generation. Listed with a battle-test video for gallery testing.",
312
+ categorySlugs: ["category-beyblade-x", "category-spinning-tops"],
313
+ categoryNames: ["Beyblade X", "Spinning Tops"],
314
+ brandSlug: "brand-takara-tomy",
315
+ brand: "Takara-Tomy",
316
+ price: 949,
317
+ currency: "INR",
318
+ stockQuantity: 8,
319
+ availableQuantity: 8,
320
+ isSold: false,
321
+ mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-dran-sword-video-demo-1-20260819/900/900"),
322
+ images: [
323
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-dran-sword-video-demo-1-20260819/900/900"),
324
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-dran-sword-video-demo-2-20260819/900/900"),
325
+ ],
326
+ video: {
327
+ // audit-seed-external-url-ok: raw <video> src, /api/media/ext is image-only (Root Cause #27)
328
+ url: "https://storage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4",
329
+ thumbnailUrl: seedExtMedia("https://picsum.photos/seed/product-video-thumb-beyblade-x-dran-sword-video-demo-20260819/800/450"),
330
+ duration: 20,
331
+ },
332
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
333
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
334
+ tags: ["attack-type", "tournament-grade"],
335
+ storeId: "store-beyblade-arena",
336
+ storeName: "Beyblade Arena",
337
+ createdAt: new Date("2026-08-19"),
338
+ updatedAt: new Date("2026-08-19"),
339
+ },
261
340
  ];
262
341
  export const productsStandardSeedData = [
263
342
  ..._rawProductsStandardSeedData.map((p) => withTokens({
@@ -1,6 +1,11 @@
1
1
  /*
2
- * WHY: Seeds scammer profiles for the collectibles marketplace — 3 profiles covering the full status workflow.
3
- * WHAT: 1 verified, 1 pending_review, 1 rejected. Fictional Beyblade-related scam scenarios.
2
+ * WHY: Seeds scammer profiles for the collectibles marketplace — 5 profiles covering the full status workflow
3
+ * plus real fixtures for the "related scammer profiles" feature (2026-08-19).
4
+ * WHAT: 3 verified, 1 pending_review, 1 rejected. Fictional Beyblade-related scam scenarios.
5
+ * Profiles #1 and #4 share scamType "advance_payment_ghost" (verified "Similar Scam Reports"
6
+ * discovery). Profiles #4 and #5 cross-link via relatedScammerIds (verified "Related Profiles" —
7
+ * same operator, two aliases) — deliberately NOT linked to #1, since #1 is a different person
8
+ * who happens to use the same scam pattern, not the same identity.
4
9
  *
5
10
  * EXPORTS:
6
11
  * scammersSeedData — Array of Partial<ScammerDocument> for seed runner
@@ -116,4 +121,72 @@ export const scammersSeedData = [
116
121
  createdAt: daysAgo(15),
117
122
  updatedAt: daysAgo(8),
118
123
  },
124
+ // ── 4. Verified — advance payment ghost (same scamType as #1, different person) ──
125
+ {
126
+ id: "scammer-fake-metal-fusion-preorder-agent",
127
+ seoSlug: "scammer-fake-metal-fusion-preorder-agent",
128
+ displayNames: ["MetalFusion_PreorderAgent", "MF Beyblade Imports"],
129
+ phones: ["9123456780"],
130
+ upiIds: ["mfpreorderagent@ybl"],
131
+ emails: ["mf.preorder.agent@gmail.com"],
132
+ socialMedia: [
133
+ { platform: "whatsapp", handle: "9123456780" },
134
+ ],
135
+ scamType: "advance_payment_ghost",
136
+ scamPlatform: "whatsapp",
137
+ description: "Ran a WhatsApp broadcast offering a bulk import batch of Metal Fight Beyblade tops at below-market prices, collecting ₹650 'booking' advances via UPI before shipping. Went silent after payment. Same operator resurfaced days later under a backup Telegram account (see related profile) using an identical script.",
138
+ amountLost: 650,
139
+ itemInvolved: "Metal Fight Beyblade BB-43 Flame Sagittario — bulk import batch",
140
+ evidence: [seedExtMedia("https://picsum.photos/seed/scammer-evidence-mf-preorder-agent-chat-20260420/800/600")],
141
+ reportedBy: "user-seto-kaiba",
142
+ reportedByAnon: false,
143
+ status: SCAMMER_FIELDS.STATUS_VALUES.VERIFIED,
144
+ verifiedBy: "user-admin-letitrip",
145
+ verifiedAt: daysAgo(10),
146
+ verificationNote: "Confirmed via chat logs; UPI/phone pattern matches the linked backup-account profile.",
147
+ relatedScammerIds: ["scammer-fake-metal-fusion-backup-account"],
148
+ mergedFromIds: [],
149
+ tags: ["repeat_offender"],
150
+ views: 58,
151
+ incidentCount: 0,
152
+ commentCount: 0,
153
+ contestCount: 0,
154
+ isContested: false,
155
+ createdAt: daysAgo(18),
156
+ updatedAt: daysAgo(10),
157
+ },
158
+ // ── 5. Verified — same operator as #4 under a backup alias ────────────────────
159
+ {
160
+ id: "scammer-fake-metal-fusion-backup-account",
161
+ seoSlug: "scammer-fake-metal-fusion-backup-account",
162
+ displayNames: ["MF_Backup_Store", "MetalFusion Backup"],
163
+ phones: ["9123456781"],
164
+ upiIds: ["mfbackupstore@oksbi"],
165
+ emails: [],
166
+ socialMedia: [
167
+ { platform: "telegram", handle: "mf_backup_store" },
168
+ ],
169
+ scamType: "advance_payment_ghost",
170
+ scamPlatform: "telegram",
171
+ description: "Same scammer as MetalFusion_PreorderAgent, resurfaced under a backup Telegram account after the WhatsApp profile went cold. Identical advance-payment script, this time for a Storm Pegasus import batch.",
172
+ amountLost: 400,
173
+ itemInvolved: "Metal Fight Beyblade BB-28 Storm Pegasus — bulk import batch",
174
+ evidence: [],
175
+ reportedBy: "user-yugi-muto",
176
+ reportedByAnon: false,
177
+ status: SCAMMER_FIELDS.STATUS_VALUES.VERIFIED,
178
+ verifiedBy: "user-admin-letitrip",
179
+ verifiedAt: daysAgo(9),
180
+ verificationNote: "Same operator as scammer-fake-metal-fusion-preorder-agent — profiles linked, not merged (both kept for evidence trail).",
181
+ relatedScammerIds: ["scammer-fake-metal-fusion-preorder-agent"],
182
+ mergedFromIds: [],
183
+ tags: ["repeat_offender"],
184
+ views: 22,
185
+ incidentCount: 0,
186
+ commentCount: 0,
187
+ contestCount: 0,
188
+ isContested: false,
189
+ createdAt: daysAgo(9),
190
+ updatedAt: daysAgo(9),
191
+ },
119
192
  ];
@@ -57,8 +57,11 @@ export const siteSettingsSeedData = {
57
57
  type: "text",
58
58
  text: "letitrip.in",
59
59
  imageUrl: "",
60
- size: 30,
61
- opacity: 20,
60
+ size: 10,
61
+ opacity: 10,
62
+ position: "center",
63
+ offsetX: 0,
64
+ offsetY: 0,
62
65
  },
63
66
  logo: {
64
67
  url: "",
@@ -451,6 +454,13 @@ export const siteSettingsSeedData = {
451
454
  codDepositPercent: 10,
452
455
  codHandlingFeeMin: 200,
453
456
  codHandlingFeePercent: 10,
457
+ whatsappNotifyFeeEnabled: false,
458
+ whatsappNotifyFee: 10,
459
+ giftWrapFeeEnabled: false,
460
+ giftWrapFee: 49,
461
+ shipmentProtectionFeeEnabled: false,
462
+ shipmentProtectionFeePercent: 2,
463
+ shipmentProtectionFeeMin: 30,
454
464
  sellerShippingFixed: 0,
455
465
  platformShippingPercent: 0,
456
466
  platformShippingFixedMin: 0,
@@ -63,7 +63,6 @@ export { getSearchResults, searchAction, type SearchQuery, } from "./_internal/s
63
63
  export { getCategoryForDetail, listRootCategories, listFeaturedCategories, listMenuCategories, getCategoryTree, listSitemapCategories, CATEGORIES_PAGE_SIZE, CATEGORIES_ROOT_TIER, CATEGORIES_MAX_DEPTH, CATEGORIES_SITEMAP_LIMIT, CATEGORIES_FEATURED_LIMIT, CATEGORIES_MENU_LIMIT, } from "./_internal/server/features/categories/index";
64
64
  export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedListings, listFeaturedGroupedListings, listSitemapGroupedListings, GROUPED_LISTINGS_PAGE_SIZE, GROUPED_LISTINGS_FEATURED_LIMIT, GROUPED_LISTINGS_SITEMAP_LIMIT, type GroupedListingWithItems, type ListGroupedListingsParams, type SitemapGroupedListing, } from "./_internal/server/features/grouped/index";
65
65
  export { createCheckoutOrderAction, attachPaymentAction, verifyAndPlaceRazorpayOrderAction, formatShippingAddress, CHECKOUT_DEFAULT_COMMISSIONS, CHECKOUT_PAYMENT_METHODS, type CreateCheckoutOrderInput, type VerifyAndPlaceRazorpayOrderInput, type CheckoutOrderResult, type CheckoutPaymentMethod, } from "./_internal/server/features/checkout/index";
66
- export { grantAdminCheckoutBypass } from "./features/checkout/server";
67
66
  export { processRefundAction, type ProcessRefundInput, } from "./_internal/server/features/refunds/actions";
68
67
  export { createPaymentIntentAction, verifyPaymentSignatureAction, resolvePaymentFee, PAYMENTS_DEFAULT_PLATFORM_FEE_PERCENT, PAYMENTS_DEFAULT_GST_PERCENT, PAYMENTS_RECEIPT_PREFIX, type CreatePaymentIntentInput, type CreatePaymentIntentResult, type VerifyPaymentSignatureInput, type ResolvedPaymentFee, } from "./_internal/server/features/payments/index";
69
68
  export { getSublistingCategoryForDetail } from "./_internal/server/features/sublisting-categories/index";
@@ -91,7 +91,6 @@ export { getGroupedListingForDetail, getGroupedListingWithItems, listGroupedList
91
91
  // `.listByType("bundle", opts)` / `.findById(id)` directly.
92
92
  // S4: checkout actions
93
93
  export { createCheckoutOrderAction, attachPaymentAction, verifyAndPlaceRazorpayOrderAction, formatShippingAddress, CHECKOUT_DEFAULT_COMMISSIONS, CHECKOUT_PAYMENT_METHODS, } from "./_internal/server/features/checkout/index";
94
- export { grantAdminCheckoutBypass } from "./features/checkout/server";
95
94
  // S-SBUNI-RULES: refund action
96
95
  export { processRefundAction, } from "./_internal/server/features/refunds/actions";
97
96
  // S4: payments actions