@mohasinac/appkit 4.1.0 → 4.1.3

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 (205) hide show
  1. package/dist/_internal/client/features/maintenance/index.d.ts +2 -0
  2. package/dist/_internal/client/features/maintenance/index.js +1 -0
  3. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.d.ts +9 -0
  4. package/dist/_internal/client/features/maintenance/views/CloudLogsListView.js +55 -0
  5. package/dist/_internal/server/features/auctions/index.d.ts +1 -1
  6. package/dist/_internal/server/features/auctions/index.js +1 -1
  7. package/dist/_internal/server/features/auctions/service.js +2 -2
  8. package/dist/_internal/server/features/maintenance/cloud-logs-data.d.ts +50 -0
  9. package/dist/_internal/server/features/maintenance/cloud-logs-data.js +152 -0
  10. package/dist/_internal/server/jobs/core/onOrderCreate.d.ts +4 -12
  11. package/dist/_internal/server/jobs/core/onOrderCreate.js +3 -3
  12. package/dist/_internal/server/jobs/core/onProductWrite.js +14 -2
  13. package/dist/_internal/shared/features/auctions/config.d.ts +1 -1
  14. package/dist/_internal/shared/features/auctions/config.js +1 -1
  15. package/dist/_internal/shared/features/auctions/schema.js +1 -1
  16. package/dist/_internal/shared/features/cart/schema.js +2 -2
  17. package/dist/_internal/shared/features/events/schema.js +1 -1
  18. package/dist/_internal/shared/features/orders/schema.js +1 -1
  19. package/dist/_internal/shared/features/products/schema.js +3 -3
  20. package/dist/_internal/shared/features/promotions/schema.js +3 -3
  21. package/dist/_internal/shared/fees/calculator.d.ts +6 -7
  22. package/dist/client.d.ts +4 -4
  23. package/dist/client.js +4 -2
  24. package/dist/constants/api-endpoints.d.ts +9 -6
  25. package/dist/constants/api-endpoints.js +3 -2
  26. package/dist/contracts/client-payment-gateway.d.ts +1 -2
  27. package/dist/features/about/components/AboutView.d.ts +6 -16
  28. package/dist/features/about/components/AboutView.js +3 -3
  29. package/dist/features/about/index.d.ts +2 -1
  30. package/dist/features/about/schemas/firestore.d.ts +47 -0
  31. package/dist/features/about/schemas/firestore.js +6 -0
  32. package/dist/features/about/schemas/index.d.ts +210 -0
  33. package/dist/features/about/schemas/index.js +45 -0
  34. package/dist/features/account/hooks/useProfile.js +3 -0
  35. package/dist/features/admin/components/AdminCarouselGroupEditorView.d.ts +6 -0
  36. package/dist/features/admin/components/AdminCarouselGroupEditorView.js +50 -0
  37. package/dist/features/admin/components/AdminCartsView.js +16 -3
  38. package/dist/features/admin/components/AdminCouponEditorView.js +2 -2
  39. package/dist/features/admin/components/AdminCouponsView.js +14 -4
  40. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -42
  41. package/dist/features/admin/components/AdminMediaView.js +1 -1
  42. package/dist/features/admin/components/AdminNotificationsView.js +31 -19
  43. package/dist/features/admin/components/AdminOrdersView.js +7 -0
  44. package/dist/features/admin/components/AdminPayoutsView.js +18 -3
  45. package/dist/features/admin/components/AdminProductsView.js +17 -2
  46. package/dist/features/admin/components/AdminReviewsView.js +16 -2
  47. package/dist/features/admin/components/AdminScammersView.js +7 -0
  48. package/dist/features/admin/components/AdminSectionsView.js +4 -0
  49. package/dist/features/admin/components/AdminSiteConfigGuideView.js +1 -1
  50. package/dist/features/admin/components/AdminSiteSettingsView.js +44 -2
  51. package/dist/features/admin/components/AdminStoreEditorView.d.ts +2 -1
  52. package/dist/features/admin/components/AdminStoreEditorView.js +4 -4
  53. package/dist/features/admin/components/AdminStoresView.js +1 -1
  54. package/dist/features/admin/components/AdminSupportTicketDetailView.js +23 -5
  55. package/dist/features/admin/components/AdminSupportTicketsView.js +20 -2
  56. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +4 -1
  57. package/dist/features/admin/components/AdminTesterChecklistView.js +8 -0
  58. package/dist/features/admin/components/index.d.ts +2 -0
  59. package/dist/features/admin/components/index.js +1 -0
  60. package/dist/features/admin/constants/filter-tabs.d.ts +55 -41
  61. package/dist/features/admin/constants/filter-tabs.js +55 -27
  62. package/dist/features/admin/schemas/firestore.d.ts +5 -0
  63. package/dist/features/auctions/actions/bid-actions.js +1 -1
  64. package/dist/features/auctions/components/AuctionDetailPageView.js +2 -2
  65. package/dist/features/auctions/components/AuctionsListView.js +8 -1
  66. package/dist/features/auth/components/LoginForm.js +2 -2
  67. package/dist/features/auth/components/RegisterForm.js +2 -2
  68. package/dist/features/auth/permissions/constants.d.ts +16 -0
  69. package/dist/features/auth/permissions/constants.js +53 -0
  70. package/dist/features/auth/schemas/firestore.js +1 -0
  71. package/dist/features/blog/components/BlogFilters.js +1 -1
  72. package/dist/features/cart/schemas/firestore.d.ts +1 -1
  73. package/dist/features/categories/schemas/firestore.d.ts +1 -1
  74. package/dist/features/consultation/components/ConsultationForm.js +1 -1
  75. package/dist/features/events/components/EventFilters.js +2 -0
  76. package/dist/features/homepage/components/WelcomeSection.js +2 -2
  77. package/dist/features/layout/TitleBarLayout.d.ts +2 -2
  78. package/dist/features/layout/TitleBarLayout.js +4 -4
  79. package/dist/features/media/AvatarUpload.js +7 -3
  80. package/dist/features/media/MediaVideo.js +1 -1
  81. package/dist/features/media/finalize.d.ts +9 -13
  82. package/dist/features/media/finalize.js +23 -74
  83. package/dist/features/media/server.d.ts +1 -1
  84. package/dist/features/media/server.js +1 -1
  85. package/dist/features/orders/hooks/useOrders.js +16 -4
  86. package/dist/features/orders/schemas/firestore.d.ts +5 -5
  87. package/dist/features/payments/schemas/firestore.d.ts +2 -2
  88. package/dist/features/pre-orders/components/PreOrdersListView.js +7 -0
  89. package/dist/features/products/components/ArtStickersListView.js +5 -0
  90. package/dist/features/products/components/ProductDetailPageView.d.ts +7 -1
  91. package/dist/features/products/components/ProductForm.js +14 -1
  92. package/dist/features/products/components/ProductsIndexPageView.js +7 -0
  93. package/dist/features/products/constants/action-defs.d.ts +1 -0
  94. package/dist/features/products/constants/action-defs.js +1 -0
  95. package/dist/features/products/schemas/firestore.d.ts +1 -1
  96. package/dist/features/products/schemas/product-templates.d.ts +1 -1
  97. package/dist/features/products/types/index.d.ts +4 -0
  98. package/dist/features/scams/schemas/index.js +2 -2
  99. package/dist/features/search/components/Search.js +3 -3
  100. package/dist/features/seller/components/SellerAuctionsView.js +27 -2
  101. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  102. package/dist/features/seller/components/SellerPayoutsView.js +24 -10
  103. package/dist/features/seller/components/SellerPreOrdersView.js +12 -4
  104. package/dist/features/seller/components/SellerPrizeDrawsView.js +23 -5
  105. package/dist/features/seller/components/SellerProductShell.d.ts +2 -0
  106. package/dist/features/seller/components/SellerProductShell.js +1 -1
  107. package/dist/features/seller/components/SellerProductsView.js +8 -6
  108. package/dist/features/seller/components/SellerReviewsView.js +27 -6
  109. package/dist/features/seller/components/index.d.ts +0 -2
  110. package/dist/features/seller/components/index.js +0 -1
  111. package/dist/features/stores/components/StoreListingsGuideView.js +2 -1
  112. package/dist/features/stores/components/StoreProductsView.js +1 -1
  113. package/dist/features/stores/schemas/firestore.d.ts +11 -0
  114. package/dist/features/stores/schemas/firestore.js +5 -0
  115. package/dist/features/stores/schemas/index.d.ts +2 -2
  116. package/dist/features/tester/actions/checklist-item-actions.d.ts +6 -0
  117. package/dist/features/tester/actions/checklist-item-actions.js +2 -0
  118. package/dist/features/tester/components/AdminTesterFeedbackIssuesView.js +13 -2
  119. package/dist/features/tester/components/AdminTesterFeedbackListView.js +2 -1
  120. package/dist/features/tester/components/AdminTesterFeedbackReportView.js +9 -5
  121. package/dist/features/tester/components/TesterHubView.js +34 -21
  122. package/dist/features/tester/repository/tester-checklist-item.repository.js +1 -0
  123. package/dist/features/tester/repository/tester-checklist-response.repository.d.ts +18 -4
  124. package/dist/features/tester/repository/tester-checklist-response.repository.js +43 -8
  125. package/dist/features/tester/schemas/firestore.d.ts +8 -3
  126. package/dist/features/tester/schemas/firestore.js +6 -0
  127. package/dist/features/tester/seed-data/bids-tester-seed-data.d.ts +2 -0
  128. package/dist/features/tester/seed-data/bids-tester-seed-data.js +37 -0
  129. package/dist/features/tester/seed-data/coupons-tester-seed-data.d.ts +2 -0
  130. package/dist/features/tester/seed-data/coupons-tester-seed-data.js +76 -0
  131. package/dist/features/tester/seed-data/events-tester-seed-data.js +50 -2
  132. package/dist/features/tester/seed-data/index.d.ts +3 -0
  133. package/dist/features/tester/seed-data/index.js +3 -0
  134. package/dist/features/tester/seed-data/orders-tester-seed-data.d.ts +2 -0
  135. package/dist/features/tester/seed-data/orders-tester-seed-data.js +265 -0
  136. package/dist/features/tester/seed-data/products-tester-seed-data.js +213 -8
  137. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +294 -12
  138. package/dist/features/tester/utils/phases.d.ts +31 -0
  139. package/dist/features/tester/utils/phases.js +46 -0
  140. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +1 -1
  141. package/dist/features/whatsapp-bot/types/index.d.ts +1 -1
  142. package/dist/features/wishlist/types/index.d.ts +3 -0
  143. package/dist/index.d.ts +11 -4
  144. package/dist/index.js +15 -7
  145. package/dist/next/api/routeHandler.js +6 -10
  146. package/dist/next/components/NotFoundView.js +2 -1
  147. package/dist/next/routing/route-map.d.ts +4 -12
  148. package/dist/next/routing/route-map.js +2 -4
  149. package/dist/providers/db-firebase/admin.d.ts +1 -0
  150. package/dist/providers/db-firebase/admin.js +1 -1
  151. package/dist/schemas/registry.d.ts +2 -2
  152. package/dist/seed/addresses-seed-data.js +18 -18
  153. package/dist/seed/bids-seed-data.js +4 -4
  154. package/dist/seed/blog-posts-seed-data.js +82 -82
  155. package/dist/seed/carousel-slides-seed-data.js +14 -10
  156. package/dist/seed/carousels-seed-data.js +3 -3
  157. package/dist/seed/cart-seed-data.js +92 -92
  158. package/dist/seed/claimed-coupons-seed-data.js +10 -10
  159. package/dist/seed/conversations-seed-data.js +75 -75
  160. package/dist/seed/coupon-usage-seed-data.js +12 -12
  161. package/dist/seed/coupons-seed-data.js +41 -41
  162. package/dist/seed/events-seed-data.js +105 -105
  163. package/dist/seed/grouped-listings-seed-data.d.ts +2 -137
  164. package/dist/seed/grouped-listings-seed-data.js +79 -143
  165. package/dist/seed/history-seed-data.js +38 -38
  166. package/dist/seed/homepage-sections-seed-data.js +9 -9
  167. package/dist/seed/index.d.ts +1 -1
  168. package/dist/seed/index.js +1 -1
  169. package/dist/seed/manifest.js +4 -4
  170. package/dist/seed/notifications-seed-data.js +56 -56
  171. package/dist/seed/offers-seed-data.js +91 -91
  172. package/dist/seed/orders-seed-data.js +125 -106
  173. package/dist/seed/payouts-seed-data.js +42 -42
  174. package/dist/seed/products-auctions-seed-data.js +10 -2
  175. package/dist/seed/products-classifieds-seed-data.js +48 -5
  176. package/dist/seed/products-digital-codes-seed-data.js +48 -5
  177. package/dist/seed/products-live-items-seed-data.js +6 -1
  178. package/dist/seed/products-prize-draws-seed-data.js +58 -5
  179. package/dist/seed/products-standard-seed-data.js +40 -8
  180. package/dist/seed/reviews-seed-data.js +42 -23
  181. package/dist/seed/scammers-seed-data.js +22 -22
  182. package/dist/seed/sessions-seed-data.js +7 -7
  183. package/dist/seed/shipments-seed-data.js +10 -10
  184. package/dist/seed/site-settings-seed-data.js +82 -0
  185. package/dist/seed/store-addresses-seed-data.js +2 -2
  186. package/dist/seed/store-extensions-seed-data.js +93 -93
  187. package/dist/seed/stores-seed-data.js +2 -0
  188. package/dist/seed/support-tickets-seed-data.js +47 -47
  189. package/dist/seed/users-seed-data.js +55 -89
  190. package/dist/seed/wishlists-seed-data.js +22 -22
  191. package/dist/server.d.ts +2 -1
  192. package/dist/server.js +5 -5
  193. package/dist/styles.css +1 -1
  194. package/dist/tailwind-utilities.css +1 -1
  195. package/dist/ui/components/PageLoader.js +8 -3
  196. package/dist/ui/components/Select.d.ts +8 -1
  197. package/dist/ui/components/Select.js +2 -2
  198. package/dist/ui/components/SiteMark.d.ts +23 -0
  199. package/dist/ui/components/SiteMark.js +76 -0
  200. package/dist/ui/index.d.ts +2 -0
  201. package/dist/ui/index.js +1 -0
  202. package/dist/validation/schemas.d.ts +0 -2
  203. package/dist/validation/schemas.js +0 -2
  204. package/package.json +1 -1
  205. package/scripts/seed-cli.mjs +27 -19
@@ -1,10 +1,12 @@
1
1
  /*
2
- * WHY: Classified listings are out of scope for the minimal Beyblade-focused demo catalog.
3
- * WHAT: Exports an empty array — kept as a stub so seed/index.ts and the seed API route's
4
- * SEED_DATA_MAP.products concatenation keep working without a code change elsewhere.
2
+ * WHY: Real (non-tester-sandbox) classified listing so testers and shoppers can exercise
3
+ * the classified contact-seller flow (no checkout, chat/phone only) against permanent
4
+ * catalog content. Previously an empty stub "out of scope for the minimal
5
+ * Beyblade-focused demo catalog" — now populated with one seller-run local listing.
6
+ * WHAT: Exports 1 classified listing on Beyblade Arena — local meetup, negotiable.
5
7
  *
6
8
  * EXPORTS:
7
- * productsClassifiedsSeedData — empty array
9
+ * productsClassifiedsSeedData — Array of 1 Partial<ProductDocument> with listingType:"classified"
8
10
  *
9
11
  * @tag domain:products,classifieds
10
12
  * @tag layer:seed
@@ -13,4 +15,45 @@
13
15
  * @tag consumers:seed/index.ts,seed/runner.ts
14
16
  * @tag sideEffects:none
15
17
  */
16
- export const productsClassifiedsSeedData = [];
18
+ import { PRODUCT_FIELDS } from "../constants/field-names";
19
+ import { buildSearchTokens } from "../utils/search-tokens";
20
+ import { seedExtMedia } from "./_helpers/media";
21
+ export const productsClassifiedsSeedData = [
22
+ {
23
+ id: "classified-beyblade-stadium-set",
24
+ slug: "classified-beyblade-stadium-set",
25
+ title: "Used Beyblade Stadium Set — Local Pickup Only",
26
+ description: "Well-loved Beyblade stadium with 6 tops and 2 launchers, sold as-is. Meet up locally or arrange your own shipping — price is negotiable.",
27
+ categorySlugs: ["category-spinning-tops"],
28
+ categoryNames: ["Spinning Tops"],
29
+ brandSlug: "brand-beyblade",
30
+ brand: "Beyblade",
31
+ price: 1200,
32
+ currency: "INR",
33
+ stockQuantity: 1,
34
+ availableQuantity: 1,
35
+ isSold: false,
36
+ mainImage: seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-stadium-set-1-20260101/900/900"),
37
+ images: [seedExtMedia("https://picsum.photos/seed/classified-image-beyblade-stadium-set-1-20260101/900/900")],
38
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
39
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.USED,
40
+ listingType: "classified",
41
+ storeId: "store-beyblade-arena",
42
+ storeName: "Beyblade Arena",
43
+ classified: {
44
+ meetupArea: { city: "Mumbai", locality: "Andheri West", pincode: "400058" },
45
+ contactMethod: "both",
46
+ acceptsShipping: false,
47
+ negotiable: true,
48
+ },
49
+ customFields: [],
50
+ customSections: [],
51
+ featured: false,
52
+ isPromoted: false,
53
+ isOnSale: false,
54
+ tags: ["classified", "local-pickup"],
55
+ createdAt: new Date("2026-05-05"),
56
+ updatedAt: new Date("2026-05-05"),
57
+ searchTokens: buildSearchTokens("Used Beyblade Stadium Set — Local Pickup Only", "Well-loved Beyblade stadium with 6 tops and 2 launchers.", "Beyblade", "brand-beyblade", ["Spinning Tops"], ["classified", "local-pickup"]),
58
+ },
59
+ ];
@@ -1,10 +1,12 @@
1
1
  /*
2
- * WHY: Digital-code listings are out of scope for the minimal Beyblade-focused demo catalog.
3
- * WHAT: Exports an empty array kept as a stub so seed/index.ts and the seed API route's
4
- * SEED_DATA_MAP.products concatenation keep working without a code change elsewhere.
2
+ * WHY: Real (non-tester-sandbox) digital-code listing so testers and shoppers can exercise
3
+ * the auto-claim digital delivery flow against permanent catalog content. Previously an
4
+ * empty stub "out of scope for the minimal Beyblade-focused demo catalog" — now
5
+ * populated with one companion-app unlock code, on-theme for the spinning-tops catalog.
6
+ * WHAT: Exports 1 digital-code listing on Beyblade Arena — auto-claim delivery.
5
7
  *
6
8
  * EXPORTS:
7
- * productsDigitalCodesSeedData — empty array
9
+ * productsDigitalCodesSeedData — Array of 1 Partial<ProductDocument> with listingType:"digital-code"
8
10
  *
9
11
  * @tag domain:products,digital-codes
10
12
  * @tag layer:seed
@@ -13,4 +15,45 @@
13
15
  * @tag consumers:seed/index.ts,seed/runner.ts
14
16
  * @tag sideEffects:none
15
17
  */
16
- export const productsDigitalCodesSeedData = [];
18
+ import { PRODUCT_FIELDS } from "../constants/field-names";
19
+ import { buildSearchTokens } from "../utils/search-tokens";
20
+ import { seedExtMedia } from "./_helpers/media";
21
+ export const productsDigitalCodesSeedData = [
22
+ {
23
+ id: "digitalcode-beyblade-x-app-unlock",
24
+ slug: "digitalcode-beyblade-x-app-unlock",
25
+ title: "Beyblade X Companion App — Premium Unlock Code",
26
+ description: "Digital unlock code for the Beyblade X companion app's premium tournament tracker and battle-log features. Delivered instantly after payment.",
27
+ categorySlugs: ["category-spinning-tops"],
28
+ categoryNames: ["Spinning Tops"],
29
+ brandSlug: "brand-takara-tomy",
30
+ brand: "Takara-Tomy",
31
+ price: 199,
32
+ currency: "INR",
33
+ stockQuantity: 25,
34
+ availableQuantity: 25,
35
+ isSold: false,
36
+ mainImage: seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-app-unlock-1-20260101/900/900"),
37
+ images: [seedExtMedia("https://picsum.photos/seed/digitalcode-image-beyblade-x-app-unlock-1-20260101/900/900")],
38
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
39
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
40
+ listingType: "digital-code",
41
+ storeId: "store-beyblade-arena",
42
+ storeName: "Beyblade Arena",
43
+ digitalCode: {
44
+ codeDeliveryMethod: "auto-claim",
45
+ codePoolSize: 25,
46
+ codesAvailable: 25,
47
+ redemptionInstructions: "Open the Beyblade X companion app, go to Settings → Redeem Code, and enter your code to unlock premium features.",
48
+ },
49
+ customFields: [],
50
+ customSections: [],
51
+ featured: false,
52
+ isPromoted: false,
53
+ isOnSale: false,
54
+ tags: ["digital-code", "app-unlock"],
55
+ createdAt: new Date("2026-05-05"),
56
+ updatedAt: new Date("2026-05-05"),
57
+ searchTokens: buildSearchTokens("Beyblade X Companion App — Premium Unlock Code", "Digital unlock code for the Beyblade X companion app.", "Takara-Tomy", "brand-takara-tomy", ["Spinning Tops"], ["digital-code", "app-unlock"]),
58
+ },
59
+ ];
@@ -1,5 +1,10 @@
1
1
  /*
2
- * WHY: Live-item listings are out of scope for the minimal Beyblade-focused demo catalog.
2
+ * WHY: `listingType: "live"` is schema-specific to animals/plants (ProductLiveItemMeta:
3
+ * species, ageMonths, sex, jurisdictionAllowed, vendor verification, CITES permit) —
4
+ * genuinely inapplicable to this catalog's spinning-tops/collectibles theme, so left
5
+ * deliberately empty in the real seed rather than forcing a nonsensical example.
6
+ * Testers can still exercise the live-item buyer flow against the disposable
7
+ * tester-sandbox fixture in appkit/src/features/tester/seed-data/products-tester-seed-data.ts.
3
8
  * WHAT: Exports an empty array — kept as a stub so seed/index.ts and the seed API route's
4
9
  * SEED_DATA_MAP.products concatenation keep working without a code change elsewhere.
5
10
  *
@@ -1,10 +1,14 @@
1
1
  /*
2
- * WHY: Prize-draw listings are out of scope for the minimal Beyblade-focused demo catalog.
3
- * WHAT: Exports an empty array kept as a stub so seed/index.ts and the seed API route's
4
- * SEED_DATA_MAP.products concatenation keep working without a code change elsewhere.
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.
5
9
  *
6
10
  * EXPORTS:
7
- * productsPrizeDrawsSeedData — empty array
11
+ * productsPrizeDrawsSeedData — Array of 1 Partial<ProductDocument> with listingType:"prize-draw"
8
12
  *
9
13
  * @tag domain:products,prize-draws
10
14
  * @tag layer:seed
@@ -13,4 +17,53 @@
13
17
  * @tag consumers:seed/index.ts,seed/runner.ts
14
18
  * @tag sideEffects:none
15
19
  */
16
- export const productsPrizeDrawsSeedData = [];
20
+ import { PRODUCT_FIELDS } from "../constants/field-names";
21
+ import { buildSearchTokens } from "../utils/search-tokens";
22
+ import { seedExtMedia } from "./_helpers/media";
23
+ export const productsPrizeDrawsSeedData = [
24
+ {
25
+ id: "prizedraw-beyblade-mystery-box",
26
+ slug: "prizedraw-beyblade-mystery-box",
27
+ title: "Beyblade Mystery Box — Prize Draw",
28
+ description: "Buy an entry for ₹99 and reveal your prize instantly — win anything from a rare limited-edition Beyblade down to a spare launcher grip. 4 prizes available, revealed on a first-come basis.",
29
+ categorySlugs: ["category-spinning-tops"],
30
+ categoryNames: ["Spinning Tops"],
31
+ brandSlug: "brand-beyblade",
32
+ brand: "Beyblade",
33
+ price: 99,
34
+ currency: "INR",
35
+ stockQuantity: 4,
36
+ availableQuantity: 4,
37
+ isSold: false,
38
+ mainImage: seedExtMedia("https://picsum.photos/seed/prizedraw-image-beyblade-mystery-box-1-20260101/900/900"),
39
+ images: [seedExtMedia("https://picsum.photos/seed/prizedraw-image-beyblade-mystery-box-1-20260101/900/900")],
40
+ status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
41
+ condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
42
+ listingType: "prize-draw",
43
+ storeId: "store-letitrip-official",
44
+ storeName: "LetItRip Official",
45
+ prizeDrawMode: "reveal",
46
+ pricePerEntry: 99,
47
+ prizeMaxEntries: 4,
48
+ prizeCurrentEntries: 0,
49
+ prizeRevealWindowStart: new Date("2026-05-01"),
50
+ prizeRevealWindowEnd: new Date("2026-12-31"),
51
+ prizeRevealStatus: "open",
52
+ prizeRevealDeadlineDays: 7,
53
+ prizeDrawItems: [
54
+ { 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
+ { 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 },
56
+ { itemNumber: 3, title: "Spare Parts Bundle", description: "Assorted spare tips, rings, and drivers.", images: [seedExtMedia("https://picsum.photos/seed/prizedraw-item-beyblade-3-20260101/600/600")], condition: "new", estimatedValue: 399, isWon: false },
57
+ { itemNumber: 4, title: "Spare Launcher Grip", description: "Standard replacement launcher grip.", images: [seedExtMedia("https://picsum.photos/seed/prizedraw-item-beyblade-4-20260101/600/600")], condition: "new", estimatedValue: 149, isWon: false },
58
+ ],
59
+ customFields: [],
60
+ customSections: [],
61
+ featured: false,
62
+ isPromoted: true,
63
+ isOnSale: false,
64
+ tags: ["prize-draw", "mystery-box"],
65
+ createdAt: new Date("2026-05-01"),
66
+ updatedAt: new Date("2026-05-01"),
67
+ 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
+ },
69
+ ];
@@ -43,7 +43,11 @@ const _rawProductsStandardSeedData = [
43
43
  availableQuantity: 4,
44
44
  isSold: false,
45
45
  mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-dranzer-s-1-20260101/900/900"),
46
- images: [seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-dranzer-s-1-20260101/900/900")],
46
+ images: [
47
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-dranzer-s-1-20260101/900/900"),
48
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-dranzer-s-2-20260101/900/900"),
49
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-dranzer-s-3-20260101/900/900"),
50
+ ],
47
51
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
48
52
  condition: PRODUCT_FIELDS.CONDITION_VALUES.LIKE_NEW,
49
53
  featured: true,
@@ -68,7 +72,11 @@ const _rawProductsStandardSeedData = [
68
72
  availableQuantity: 2,
69
73
  isSold: false,
70
74
  mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-driger-v-1-20260101/900/900"),
71
- images: [seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-driger-v-1-20260101/900/900")],
75
+ images: [
76
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-driger-v-1-20260101/900/900"),
77
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-driger-v-2-20260101/900/900"),
78
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-original-driger-v-3-20260101/900/900"),
79
+ ],
72
80
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
73
81
  condition: PRODUCT_FIELDS.CONDITION_VALUES.GOOD,
74
82
  storeId: "store-beyblade-arena",
@@ -93,7 +101,11 @@ const _rawProductsStandardSeedData = [
93
101
  availableQuantity: 6,
94
102
  isSold: false,
95
103
  mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-storm-pegasus-1-20260101/900/900"),
96
- images: [seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-storm-pegasus-1-20260101/900/900")],
104
+ images: [
105
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-storm-pegasus-1-20260101/900/900"),
106
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-storm-pegasus-2-20260101/900/900"),
107
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-storm-pegasus-3-20260101/900/900"),
108
+ ],
97
109
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
98
110
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
99
111
  featured: true,
@@ -118,7 +130,11 @@ const _rawProductsStandardSeedData = [
118
130
  availableQuantity: 3,
119
131
  isSold: false,
120
132
  mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-flame-sagittario-1-20260101/900/900"),
121
- images: [seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-flame-sagittario-1-20260101/900/900")],
133
+ images: [
134
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-flame-sagittario-1-20260101/900/900"),
135
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-flame-sagittario-2-20260101/900/900"),
136
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-metal-flame-sagittario-3-20260101/900/900"),
137
+ ],
122
138
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
123
139
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
124
140
  storeId: "store-beyblade-arena",
@@ -143,7 +159,11 @@ const _rawProductsStandardSeedData = [
143
159
  availableQuantity: 10,
144
160
  isSold: false,
145
161
  mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-valkyrie-1-20260101/900/900"),
146
- images: [seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-valkyrie-1-20260101/900/900")],
162
+ images: [
163
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-valkyrie-1-20260101/900/900"),
164
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-valkyrie-2-20260101/900/900"),
165
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-valkyrie-3-20260101/900/900"),
166
+ ],
147
167
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
148
168
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
149
169
  featured: true,
@@ -168,7 +188,11 @@ const _rawProductsStandardSeedData = [
168
188
  availableQuantity: 5,
169
189
  isSold: false,
170
190
  mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-regalia-genesis-1-20260101/900/900"),
171
- images: [seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-regalia-genesis-1-20260101/900/900")],
191
+ images: [
192
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-regalia-genesis-1-20260101/900/900"),
193
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-regalia-genesis-2-20260101/900/900"),
194
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-burst-regalia-genesis-3-20260101/900/900"),
195
+ ],
172
196
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
173
197
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
174
198
  storeId: "store-beyblade-arena",
@@ -193,7 +217,11 @@ const _rawProductsStandardSeedData = [
193
217
  availableQuantity: 12,
194
218
  isSold: false,
195
219
  mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-wizard-arrow-1-20260101/900/900"),
196
- images: [seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-wizard-arrow-1-20260101/900/900")],
220
+ images: [
221
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-wizard-arrow-1-20260101/900/900"),
222
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-wizard-arrow-2-20260101/900/900"),
223
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-wizard-arrow-3-20260101/900/900"),
224
+ ],
197
225
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
198
226
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
199
227
  featured: true,
@@ -218,7 +246,11 @@ const _rawProductsStandardSeedData = [
218
246
  availableQuantity: 7,
219
247
  isSold: false,
220
248
  mainImage: seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-knife-shinobi-1-20260101/900/900"),
221
- images: [seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-knife-shinobi-1-20260101/900/900")],
249
+ images: [
250
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-knife-shinobi-1-20260101/900/900"),
251
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-knife-shinobi-2-20260101/900/900"),
252
+ seedExtMedia("https://picsum.photos/seed/product-image-beyblade-x-knife-shinobi-3-20260101/900/900"),
253
+ ],
222
254
  status: PRODUCT_FIELDS.STATUS_VALUES.PUBLISHED,
223
255
  condition: PRODUCT_FIELDS.CONDITION_VALUES.NEW,
224
256
  storeId: "store-beyblade-arena",
@@ -1,8 +1,8 @@
1
1
  /*
2
- * WHY: Seeds product reviews from buyers across all collectible categories on the marketplace.
3
- * WHAT: Exports 65 reviews spread across multiple stores and product types (trading cards, figures,
4
- * diecast, beyblades, model kits). Ratings 3–5 stars, mix of verified/unverified. Seller
5
- * responses on ~16 reviews. Images on ~11 reviews.
2
+ * WHY: Seeds product reviews from buyers across the Beyblade catalog on the marketplace.
3
+ * WHAT: Exports 65 reviews spread across the 14 real Beyblade products. Ratings 3–5 stars, mix
4
+ * of verified/unverified. Seller responses on ~16 reviews. Images (1-3, seedExtMedia
5
+ * picsum) on ~11 reviews; a video (raw external mp4 + seedExtMedia thumbnail) on 5 reviews.
6
6
  *
7
7
  * EXPORTS:
8
8
  * reviewsSeedData — Array of 65 review documents
@@ -14,8 +14,13 @@
14
14
  * @tag consumers:seed/index.ts,seed/runner.ts
15
15
  * @tag sideEffects:none
16
16
  */
17
+ import { seedExtMedia } from "./_helpers/media";
17
18
  const NOW = new Date();
18
19
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
20
+ // Public, direct-playable sample MP4 — review.video.url renders through a raw
21
+ // <video src> element (ReviewDetailShell.tsx), NOT the /api/media/ext image
22
+ // proxy, so it must stay an unwrapped external URL (never seedExtMedia()).
23
+ const SAMPLE_VIDEO_URL = "https://storage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"; // audit-seed-external-url-ok: raw <video> src, /api/media/ext is image-only (Root Cause #27)
19
24
  const reviewTemplates = [
20
25
  { title: "Excellent quality and fast shipping!", comment: "Received exactly as described. Item is in perfect condition. Will buy again!", rating: 5 },
21
26
  { title: "Good condition, minor wear", comment: "Arrived safely but has slight edge wear. Still happy with the purchase overall.", rating: 4 },
@@ -49,26 +54,27 @@ const sellerReplies = [
49
54
  "We appreciate the honest feedback. We'll look into the packaging issue.",
50
55
  ];
51
56
  const products = [
52
- { id: "product-dark-magician-lob-1st", title: "Dark Magician LOB 1st Edition", store: "store-letitrip-official" },
53
- { id: "product-blue-eyes-white-dragon-sdk", title: "Blue-Eyes White Dragon SDK", store: "store-letitrip-official" },
54
- { id: "product-lob-booster-pack", title: "Legend of Blue Eyes Booster Pack", store: "store-letitrip-official" },
55
- { id: "product-kaiba-starter-deck", title: "Kaiba Starter Deck", store: "store-letitrip-official" },
56
- { id: "product-duelist-kingdom-playmat", title: "Duelist Kingdom Playmat", store: "store-letitrip-official" },
57
- { id: "product-topper-tin-2004", title: "2004 Collector Tin Topper", store: "store-letitrip-official" },
58
- { id: "product-dark-magician-figure", title: "Dark Magician Figure", store: "store-letitrip-official" },
59
- { id: "product-exodia-art-print", title: "Exodia Art Print", store: "store-letitrip-official" },
60
- { id: "product-millennium-puzzle-model", title: "Millennium Puzzle Model", store: "store-letitrip-official" },
61
- { id: "product-duel-disk-replica", title: "Duel Disk Replica", store: "store-kaiba-corp-cards" },
62
- { id: "product-cyber-dragon-dp1", title: "Cyber Dragon DP1", store: "store-kaiba-corp-cards" },
63
- { id: "product-mirror-force-mrd", title: "Mirror Force MRD", store: "store-kaiba-corp-cards" },
64
- { id: "product-pot-of-greed-lob", title: "Pot of Greed LOB", store: "store-kaiba-corp-cards" },
65
- { id: "product-monster-reborn-lob", title: "Monster Reborn LOB", store: "store-kaiba-corp-cards" },
66
- { id: "product-kaiba-figure-15cm", title: "Kaiba 15cm Figure", store: "store-kaiba-corp-cards" },
57
+ { id: "auction-beyblade-original-dragoon-storm", title: "Beyblade Original Dragoon Storm", store: "store-beyblade-arena" },
58
+ { id: "auction-beyblade-metal-lightning-l-drago", title: "Beyblade Metal Lightning L-Drago", store: "store-beyblade-arena" },
59
+ { id: "classified-beyblade-stadium-set", title: "Beyblade Stadium Set", store: "store-beyblade-arena" },
60
+ { id: "digitalcode-beyblade-x-app-unlock", title: "Beyblade X App Unlock Code", store: "store-beyblade-arena" },
61
+ { id: "preorder-beyblade-x-bx-08-wave", title: "Beyblade X BX-08 Wave", store: "store-beyblade-arena" },
62
+ { id: "prizedraw-beyblade-mystery-box", title: "Beyblade Mystery Box", store: "store-letitrip-official" },
63
+ { id: "product-beyblade-original-dranzer-s", title: "Beyblade Original Dranzer S", store: "store-beyblade-arena" },
64
+ { id: "product-beyblade-original-driger-v", title: "Beyblade Original Driger V", store: "store-beyblade-arena" },
65
+ { id: "product-beyblade-metal-storm-pegasus", title: "Beyblade Metal Storm Pegasus", store: "store-beyblade-arena" },
66
+ { id: "product-beyblade-metal-flame-sagittario", title: "Beyblade Metal Flame Sagittario", store: "store-beyblade-arena" },
67
+ { id: "product-beyblade-burst-valkyrie", title: "Beyblade Burst Valkyrie", store: "store-beyblade-arena" },
68
+ { id: "product-beyblade-burst-regalia-genesis", title: "Beyblade Burst Regalia Genesis", store: "store-beyblade-arena" },
69
+ { id: "product-beyblade-x-wizard-arrow", title: "Beyblade X Wizard Arrow", store: "store-beyblade-arena" },
70
+ { id: "product-beyblade-x-knife-shinobi", title: "Beyblade X Knife Shinobi", store: "store-beyblade-arena" },
67
71
  ];
68
72
  const buyers = [
69
- { id: "user-yugi-muto", name: "Yugi Muto" },
70
- { id: "user-admin-letitrip", name: "LetItRip Admin" },
71
- { id: "user-seto-kaiba", name: "Seto Kaiba" },
73
+ { id: "user-yugi-muto", name: "Mock User 3" },
74
+ { id: "user-admin-letitrip", name: "Mock User 1" },
75
+ { id: "user-seto-kaiba", name: "Mock User 2" },
76
+ { id: "user-meera-bey", name: "Mock User 11" },
77
+ { id: "user-rohit-collector", name: "Mock User 14" },
72
78
  ];
73
79
  const _rawReviewsSeedData = [];
74
80
  for (let i = 0; i < 65; i++) {
@@ -77,7 +83,11 @@ for (let i = 0; i < 65; i++) {
77
83
  const buyer = buyers[i % buyers.length];
78
84
  const daysAgoCreated = 90 - i;
79
85
  const hasSellerReply = i % 4 === 0;
86
+ // ~17% of reviews ("detailed" ones) carry buyer-submitted photos.
80
87
  const hasImage = i % 6 === 0;
88
+ const imageCount = (i % 3) + 1;
89
+ // A smaller handful (5 of 65) also carry an unboxing/battle-test video.
90
+ const hasVideo = i % 13 === 0;
81
91
  _rawReviewsSeedData.push({
82
92
  id: `review-${i + 1}`,
83
93
  productId: product.id,
@@ -88,8 +98,17 @@ for (let i = 0; i < 65; i++) {
88
98
  rating: template.rating,
89
99
  title: template.title,
90
100
  comment: template.comment,
91
- images: hasImage ? [`/media/review-image-${product.id.replace("product-", "")}-1-20260508.jpg`] : [],
101
+ images: hasImage
102
+ ? Array.from({ length: imageCount }, (_, n) => seedExtMedia(`https://picsum.photos/seed/review-image-${product.id}-${i + 1}-${n + 1}/800/800`))
103
+ : [],
92
104
  hasImages: hasImage,
105
+ video: hasVideo
106
+ ? {
107
+ url: SAMPLE_VIDEO_URL,
108
+ thumbnailUrl: seedExtMedia(`https://picsum.photos/seed/review-video-thumb-${product.id}-${i + 1}/800/450`),
109
+ duration: 18 + (i % 5) * 6,
110
+ }
111
+ : undefined,
93
112
  verified: i % 3 !== 2,
94
113
  status: "approved",
95
114
  helpfulCount: Math.floor(Math.random() * 20),
@@ -1,6 +1,6 @@
1
1
  /*
2
- * WHY: Seeds scammer profiles for YGO marketplace — 3 profiles covering the full status workflow.
3
- * WHAT: 1 verified, 1 pending_review, 1 rejected. Fictional YGO-related scam scenarios.
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.
4
4
  *
5
5
  * EXPORTS:
6
6
  * scammersSeedData — Array of Partial<ScammerDocument> for seed runner
@@ -21,20 +21,20 @@ export const scammersSeedData = [
21
21
  {
22
22
  id: "scammer-fake-lob-seller",
23
23
  seoSlug: "scammer-fake-lob-seller",
24
- displayNames: ["YGO_King_India", "LOB Cards Official"],
24
+ displayNames: ["Bey_King_India", "Rare Blades Official"],
25
25
  phones: ["9876543210", "8765432109"],
26
- upiIds: ["9876543210@paytm", "ygokingcards@okicici"],
27
- emails: ["ygokingcards.fake@gmail.com"],
26
+ upiIds: ["9876543210@paytm", "beykingblades@okicici"],
27
+ emails: ["beykingblades.fake@gmail.com"],
28
28
  socialMedia: [
29
- { platform: "instagram", handle: "ygo_king_india_official", url: "https://instagram.com/ygo_king_india_official" },
29
+ { platform: "instagram", handle: "bey_king_india_official", url: "https://instagram.com/bey_king_india_official" },
30
30
  { platform: "whatsapp", handle: "9876543210" },
31
31
  ],
32
32
  scamType: "advance_payment_ghost",
33
33
  scamPlatform: "whatsapp",
34
- description: "Seller listed a Blue-Eyes White Dragon LOB 1st Edition PSA 9 on a Facebook group for ₹25,000 — significantly below market. When I messaged, he asked for ₹5,000 advance to 'hold' the card before shipping. After I paid via UPI (9876543210@paytm), he went silent. The account name on UPI matched 'YGO King'. Later found 2 more people in the same group who had the same experience with the same UPI ID.",
35
- amountLost: 5000,
36
- itemInvolved: "Blue-Eyes White Dragon LOB 1st Edition PSA 9 (Yu-Gi-Oh!)",
37
- evidence: [seedExtMedia("https://picsum.photos/seed/scammer-evidence-ygoking-chat-screenshot-20260402/800/600")],
34
+ description: "Seller listed an original-series Dranzer S sealed launcher set on a Facebook group for ₹2,500 — significantly below market. When I messaged, he asked for ₹500 advance to 'hold' the set before shipping. After I paid via UPI (9876543210@paytm), he went silent. The account name on UPI matched 'Bey King'. Later found 2 more people in the same group who had the same experience with the same UPI ID.",
35
+ amountLost: 500,
36
+ itemInvolved: "Beyblade Original Dranzer S Sealed Launcher Set",
37
+ evidence: [seedExtMedia("https://picsum.photos/seed/scammer-evidence-beyking-chat-screenshot-20260402/800/600")],
38
38
  reportedBy: "user-yugi-muto",
39
39
  reportedByAnon: false,
40
40
  status: SCAMMER_FIELDS.STATUS_VALUES.VERIFIED,
@@ -54,21 +54,21 @@ export const scammersSeedData = [
54
54
  },
55
55
  // ── 2. Pending review — fake pre-order listing ────────────────────────────────
56
56
  {
57
- id: "scammer-fake-konami-preorder",
58
- seoSlug: "scammer-fake-konami-preorder",
59
- displayNames: ["Konami_Agent_India", "KA India Cards"],
57
+ id: "scammer-fake-takara-tomy-preorder",
58
+ seoSlug: "scammer-fake-takara-tomy-preorder",
59
+ displayNames: ["TakaraTomy_Agent_India", "TT India Blades"],
60
60
  phones: ["7654321098"],
61
- upiIds: ["konamiagentindia@ybl"],
62
- emails: ["konami.agent.india@gmail.com"],
61
+ upiIds: ["takaratomyagentindia@ybl"],
62
+ emails: ["takaratomy.agent.india@gmail.com"],
63
63
  socialMedia: [
64
- { platform: "instagram", handle: "konami_agent_india_official" },
65
- { platform: "telegram", handle: "konami_agent_india" },
64
+ { platform: "instagram", handle: "takaratomy_agent_india_official" },
65
+ { platform: "telegram", handle: "takaratomy_agent_india" },
66
66
  ],
67
67
  scamType: "fake_preorder_listing",
68
68
  scamPlatform: "instagram",
69
- description: "Account posed as an authorized pre-order agent for the upcoming Konami 25th Anniversary Ultimate Collection booster box. Collected ₹4,500 from me for a 'guaranteed allocation slot' via UPI. Instagram profile had ~4,000 followers (likely bought) and fake order screenshots. After payment, the account blocked me. Similar reports found on Reddit r/YuGiOhIndia.",
70
- amountLost: 4500,
71
- itemInvolved: "Konami 25th Anniversary Ultimate Collection (fake pre-order)",
69
+ description: "Account posed as an authorized pre-order agent for the upcoming Beyblade X BX-08 wave. Collected ₹800 from me for a 'guaranteed allocation slot' via UPI. Instagram profile had ~4,000 followers (likely bought) and fake order screenshots. After payment, the account blocked me. Similar reports found on Reddit r/BeybladeIndia.",
70
+ amountLost: 800,
71
+ itemInvolved: "Beyblade X BX-08 Wave (fake pre-order)",
72
72
  evidence: [],
73
73
  reportedBy: "user-seto-kaiba",
74
74
  reportedByAnon: true,
@@ -95,9 +95,9 @@ export const scammersSeedData = [
95
95
  socialMedia: [],
96
96
  scamType: "empty_box_ship",
97
97
  scamPlatform: "olx",
98
- description: "Sold a sealed Duelist of the Roses booster box on OLX, buyer claims item never arrived but tracking shows delivered. Buyer opened a scam report. Seller provided courier tracking + photograph of sealed package at drop-off. Report rejected after review.",
98
+ description: "Sold a sealed Beyblade Burst Regalia Genesis on OLX, buyer claims item never arrived but tracking shows delivered. Buyer opened a scam report. Seller provided courier tracking + photograph of sealed package at drop-off. Report rejected after review.",
99
99
  amountLost: 0,
100
- itemInvolved: "Duelist of the Roses Booster Box (Yu-Gi-Oh!)",
100
+ itemInvolved: "Beyblade Burst Regalia Genesis Sealed",
101
101
  evidence: [],
102
102
  reportedBy: "user-yugi-muto",
103
103
  reportedByAnon: false,
@@ -1,5 +1,5 @@
1
1
  /*
2
- * WHY: Seeds user sessions for YGO marketplace — 3 users, mix of active/expired/revoked.
2
+ * WHY: Seeds user sessions for the Beyblade marketplace — 3 users, mix of active/expired/revoked.
3
3
  * WHAT: 5 sessions total (3 active, 1 expired, 1 revoked). Covers desktop + mobile, multi-device.
4
4
  *
5
5
  * EXPORTS:
@@ -38,7 +38,7 @@ export const sessionsSeedData = [
38
38
  expiresAt: daysAhead(25),
39
39
  isActive: true,
40
40
  },
41
- // Yugi — Chrome Android (active)
41
+ // Rehan — Chrome Android (active)
42
42
  {
43
43
  id: "session-yugi-chrome-android-001",
44
44
  userId: "user-yugi-muto",
@@ -49,13 +49,13 @@ export const sessionsSeedData = [
49
49
  device: "Mobile",
50
50
  ip: "203.0.113.10",
51
51
  },
52
- location: { country: _locale.countryName, city: "Domino City" },
52
+ location: { country: _locale.countryName, city: "Indore" },
53
53
  createdAt: daysAgo(3),
54
54
  lastActivity: daysAgo(0),
55
55
  expiresAt: daysAhead(27),
56
56
  isActive: true,
57
57
  },
58
- // Kaiba — Safari macOS (active)
58
+ // Vivaan — Safari macOS (active)
59
59
  {
60
60
  id: "session-kaiba-safari-mac-001",
61
61
  userId: "user-seto-kaiba",
@@ -66,13 +66,13 @@ export const sessionsSeedData = [
66
66
  device: "Desktop",
67
67
  ip: "203.0.113.20",
68
68
  },
69
- location: { country: _locale.countryName, city: "Domino City" },
69
+ location: { country: _locale.countryName, city: "Nagpur" },
70
70
  createdAt: daysAgo(2),
71
71
  lastActivity: daysAgo(0),
72
72
  expiresAt: daysAhead(28),
73
73
  isActive: true,
74
74
  },
75
- // Yugi — expired old session
75
+ // Rehan — expired old session
76
76
  {
77
77
  id: "session-yugi-expired-001",
78
78
  userId: "user-yugi-muto",
@@ -83,7 +83,7 @@ export const sessionsSeedData = [
83
83
  device: "Mobile",
84
84
  ip: "203.0.113.11",
85
85
  },
86
- location: { country: _locale.countryName, city: "Domino City" },
86
+ location: { country: _locale.countryName, city: "Indore" },
87
87
  createdAt: daysAgo(40),
88
88
  lastActivity: daysAgo(36),
89
89
  expiresAt: daysAgo(35),
@@ -87,20 +87,20 @@ const rawLots = [
87
87
  { id: "lot-beyblade-02", shipmentId: rawShipments[3].id, lotName: "Launchers + stadiums", supplierOrderRef: "BA-3302", weightGrams: 2200, purchaseCost: 25000 },
88
88
  ];
89
89
  const rawItems = [
90
- { id: "item-tokyo-01a", lotId: "lot-tokyo-01", shipmentId: rawShipments[0].id, title: "Base Set Booster Box (Japanese)", quantity: 6, isForSelfUse: false, price: 9500000 },
90
+ { id: "item-tokyo-01a", lotId: "lot-tokyo-01", shipmentId: rawShipments[0].id, title: "Base Set Booster Box (Japanese)", quantity: 6, isForSelfUse: false, price: 95000 },
91
91
  { id: "item-tokyo-02a", lotId: "lot-tokyo-02", shipmentId: rawShipments[0].id, title: "Charizard Base Set PSA 9", quantity: 1, isForSelfUse: true },
92
- { id: "item-vault-01a", lotId: "lot-vault-01", shipmentId: rawShipments[1].id, title: "Redline Custom Camaro", quantity: 4, isForSelfUse: false, price: 1800000 },
93
- { id: "item-vault-01b", lotId: "lot-vault-01", shipmentId: rawShipments[1].id, title: "Redline Python", quantity: 3, isForSelfUse: false, price: 2200000 },
94
- { id: "item-vault-02a", lotId: "lot-vault-02", shipmentId: rawShipments[1].id, title: "Matchbox Superfast Truck (sample)", quantity: 2, isForSelfUse: false, price: 650000 },
95
- { id: "item-gundam-01a", lotId: "lot-gundam-01", shipmentId: rawShipments[2].id, title: "MG RX-78-2 Gundam Ver 3.0", quantity: 8, isForSelfUse: false, price: 2100000 },
92
+ { id: "item-vault-01a", lotId: "lot-vault-01", shipmentId: rawShipments[1].id, title: "Redline Custom Camaro", quantity: 4, isForSelfUse: false, price: 18000 },
93
+ { id: "item-vault-01b", lotId: "lot-vault-01", shipmentId: rawShipments[1].id, title: "Redline Python", quantity: 3, isForSelfUse: false, price: 22000 },
94
+ { id: "item-vault-02a", lotId: "lot-vault-02", shipmentId: rawShipments[1].id, title: "Matchbox Superfast Truck (sample)", quantity: 2, isForSelfUse: false, price: 6500 },
95
+ { id: "item-gundam-01a", lotId: "lot-gundam-01", shipmentId: rawShipments[2].id, title: "MG RX-78-2 Gundam Ver 3.0", quantity: 8, isForSelfUse: false, price: 21000 },
96
96
  {
97
- id: "item-gundam-01b", lotId: "lot-gundam-01", shipmentId: rawShipments[2].id, title: "MG Sazabi Ver Ka", quantity: 5, isForSelfUse: false, price: 2800000,
97
+ id: "item-gundam-01b", lotId: "lot-gundam-01", shipmentId: rawShipments[2].id, title: "MG Sazabi Ver Ka", quantity: 5, isForSelfUse: false, price: 28000,
98
98
  linkedProductId: "product-gundam-mg-sazabi-ver-ka", linkedProductSlug: "product-gundam-mg-sazabi-ver-ka", linkedProductListingType: "standard",
99
99
  },
100
- { id: "item-gundam-02a", lotId: "lot-gundam-02", shipmentId: rawShipments[2].id, title: "HG Gunpla assorted mecha", quantity: 20, isForSelfUse: false, price: 350000 },
101
- { id: "item-beyblade-01a", lotId: "lot-beyblade-01", shipmentId: rawShipments[3].id, title: "Beyblade Burst Turbo Achilles", quantity: 15, isForSelfUse: false, price: 550000 },
102
- { id: "item-beyblade-01b", lotId: "lot-beyblade-01", shipmentId: rawShipments[3].id, title: "Beyblade Burst Genesis Valtryek", quantity: 12, isForSelfUse: false, price: 600000 },
103
- { id: "item-beyblade-02a", lotId: "lot-beyblade-02", shipmentId: rawShipments[3].id, title: "Beystadium Extreme", quantity: 6, isForSelfUse: false, price: 480000 },
100
+ { id: "item-gundam-02a", lotId: "lot-gundam-02", shipmentId: rawShipments[2].id, title: "HG Gunpla assorted mecha", quantity: 20, isForSelfUse: false, price: 3500 },
101
+ { id: "item-beyblade-01a", lotId: "lot-beyblade-01", shipmentId: rawShipments[3].id, title: "Beyblade Burst Turbo Achilles", quantity: 15, isForSelfUse: false, price: 5500 },
102
+ { id: "item-beyblade-01b", lotId: "lot-beyblade-01", shipmentId: rawShipments[3].id, title: "Beyblade Burst Genesis Valtryek", quantity: 12, isForSelfUse: false, price: 6000 },
103
+ { id: "item-beyblade-02a", lotId: "lot-beyblade-02", shipmentId: rawShipments[3].id, title: "Beystadium Extreme", quantity: 6, isForSelfUse: false, price: 4800 },
104
104
  ];
105
105
  function mainItemsRevenue(lotId) {
106
106
  return rawItems