@mohasinac/appkit 2.7.53 → 2.7.54

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 (123) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +1 -1
  2. package/dist/_internal/server/jobs/core/auctionSettlement.js +6 -3
  3. package/dist/_internal/server/jobs/core/bundleStockSync.js +9 -7
  4. package/dist/_internal/server/jobs/core/onProductStockChange.d.ts +12 -3
  5. package/dist/_internal/server/jobs/core/onProductStockChange.js +12 -13
  6. package/dist/_internal/server/jobs/core/onProductWrite.js +1 -3
  7. package/dist/_internal/server/jobs/handlers/onProductStockChange.js +11 -2
  8. package/dist/client.d.ts +2 -0
  9. package/dist/client.js +1 -0
  10. package/dist/constants/field-names.d.ts +4 -3
  11. package/dist/constants/field-names.js +8 -8
  12. package/dist/errors/error-codes.d.ts +3 -0
  13. package/dist/errors/error-codes.js +3 -0
  14. package/dist/errors/messages.d.ts +3 -0
  15. package/dist/errors/messages.js +3 -0
  16. package/dist/features/admin/types/product.types.d.ts +1 -1
  17. package/dist/features/admin/types/product.types.js +2 -3
  18. package/dist/features/auctions/actions/bid-actions.d.ts +9 -0
  19. package/dist/features/auctions/actions/bid-actions.js +61 -0
  20. package/dist/features/auctions/components/AuctionDetailPageView.d.ts +2 -1
  21. package/dist/features/auctions/components/AuctionDetailPageView.js +5 -4
  22. package/dist/features/auctions/components/PlaceBidFormClient.d.ts +3 -1
  23. package/dist/features/auctions/components/PlaceBidFormClient.js +32 -2
  24. package/dist/features/auctions/types/index.d.ts +1 -1
  25. package/dist/features/layout/AppLayoutShell.js +1 -1
  26. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +2 -11
  27. package/dist/features/products/api/[id]/route.js +4 -8
  28. package/dist/features/products/api/route.js +1 -3
  29. package/dist/features/products/components/AuctionsIndexListing.js +3 -11
  30. package/dist/features/products/components/PrizeDrawsIndexListing.js +2 -10
  31. package/dist/features/products/components/ProductFilters.d.ts +33 -9
  32. package/dist/features/products/components/ProductFilters.js +6 -29
  33. package/dist/features/products/components/ProductForm.js +2 -3
  34. package/dist/features/products/constants/sieve.d.ts +162 -0
  35. package/dist/features/products/constants/sieve.js +95 -0
  36. package/dist/features/products/repository/products.repository.d.ts +5 -0
  37. package/dist/features/products/repository/products.repository.js +23 -3
  38. package/dist/features/products/schemas/firestore.d.ts +4 -4
  39. package/dist/features/products/schemas/firestore.js +2 -3
  40. package/dist/features/products/schemas/index.d.ts +6 -6
  41. package/dist/features/products/schemas/index.js +2 -6
  42. package/dist/features/products/types/index.d.ts +1 -1
  43. package/dist/features/seller/actions/offer-actions.js +2 -2
  44. package/dist/features/wishlist/types/index.d.ts +1 -1
  45. package/dist/index.d.ts +6 -3
  46. package/dist/index.js +6 -4
  47. package/dist/seed/addresses-seed-data.d.ts +2 -18
  48. package/dist/seed/addresses-seed-data.js +137 -203
  49. package/dist/seed/bids-seed-data.d.ts +2 -8
  50. package/dist/seed/bids-seed-data.js +172 -648
  51. package/dist/seed/blog-posts-seed-data.d.ts +0 -5
  52. package/dist/seed/blog-posts-seed-data.js +341 -596
  53. package/dist/seed/carousel-slides-seed-data.d.ts +0 -5
  54. package/dist/seed/carousel-slides-seed-data.js +61 -192
  55. package/dist/seed/carousels-seed-data.js +18 -1
  56. package/dist/seed/cart-seed-data.d.ts +1 -18
  57. package/dist/seed/cart-seed-data.js +116 -293
  58. package/dist/seed/categories-seed-data.d.ts +0 -6
  59. package/dist/seed/categories-seed-data.js +1409 -1537
  60. package/dist/seed/claimed-coupons-seed-data.d.ts +0 -11
  61. package/dist/seed/claimed-coupons-seed-data.js +32 -29
  62. package/dist/seed/conversations-seed-data.d.ts +0 -6
  63. package/dist/seed/conversations-seed-data.js +132 -280
  64. package/dist/seed/coupon-usage-seed-data.d.ts +0 -16
  65. package/dist/seed/coupon-usage-seed-data.js +30 -44
  66. package/dist/seed/coupons-seed-data.d.ts +0 -6
  67. package/dist/seed/coupons-seed-data.js +141 -489
  68. package/dist/seed/events-seed-data.d.ts +0 -6
  69. package/dist/seed/events-seed-data.js +201 -379
  70. package/dist/seed/faq-seed-data.d.ts +0 -14
  71. package/dist/seed/faq-seed-data.js +609 -1184
  72. package/dist/seed/grouped-listings-seed-data.d.ts +119 -8
  73. package/dist/seed/grouped-listings-seed-data.js +148 -233
  74. package/dist/seed/history-seed-data.d.ts +0 -7
  75. package/dist/seed/history-seed-data.js +50 -54
  76. package/dist/seed/homepage-sections-seed-data.d.ts +0 -5
  77. package/dist/seed/homepage-sections-seed-data.js +83 -175
  78. package/dist/seed/index.d.ts +1 -1
  79. package/dist/seed/index.js +1 -1
  80. package/dist/seed/manifest.js +2 -2
  81. package/dist/seed/notifications-seed-data.d.ts +0 -6
  82. package/dist/seed/notifications-seed-data.js +309 -196
  83. package/dist/seed/offers-seed-data.d.ts +0 -8
  84. package/dist/seed/offers-seed-data.js +118 -197
  85. package/dist/seed/orders-seed-data.d.ts +2 -8
  86. package/dist/seed/orders-seed-data.js +248 -1510
  87. package/dist/seed/payouts-seed-data.d.ts +0 -6
  88. package/dist/seed/payouts-seed-data.js +102 -441
  89. package/dist/seed/products-auctions-seed-data.d.ts +1 -14
  90. package/dist/seed/products-auctions-seed-data.js +612 -1084
  91. package/dist/seed/products-preorders-seed-data.d.ts +119 -14
  92. package/dist/seed/products-preorders-seed-data.js +154 -455
  93. package/dist/seed/products-standard-seed-data.d.ts +1 -15
  94. package/dist/seed/products-standard-seed-data.js +1355 -4128
  95. package/dist/seed/reviews-seed-data.d.ts +2 -8
  96. package/dist/seed/reviews-seed-data.js +99 -1182
  97. package/dist/seed/scammers-seed-data.d.ts +0 -15
  98. package/dist/seed/scammers-seed-data.js +36 -37
  99. package/dist/seed/sessions-seed-data.d.ts +0 -13
  100. package/dist/seed/sessions-seed-data.js +58 -335
  101. package/dist/seed/site-settings-seed-data.d.ts +0 -4
  102. package/dist/seed/site-settings-seed-data.js +61 -52
  103. package/dist/seed/store-addresses-seed-data.js +27 -151
  104. package/dist/seed/store-extensions-seed-data.d.ts +0 -7
  105. package/dist/seed/store-extensions-seed-data.js +147 -261
  106. package/dist/seed/stores-seed-data.d.ts +0 -5
  107. package/dist/seed/stores-seed-data.js +222 -184
  108. package/dist/seed/sub-listings-seed-data.d.ts +119 -0
  109. package/dist/seed/sub-listings-seed-data.js +447 -0
  110. package/dist/seed/support-tickets-seed-data.d.ts +0 -7
  111. package/dist/seed/support-tickets-seed-data.js +82 -75
  112. package/dist/seed/users-seed-data.d.ts +0 -5
  113. package/dist/seed/users-seed-data.js +279 -634
  114. package/dist/seed/wishlists-seed-data.d.ts +0 -9
  115. package/dist/seed/wishlists-seed-data.js +36 -52
  116. package/dist/seo/json-ld.js +6 -4
  117. package/dist/styles.css +8052 -3
  118. package/dist/utils/index.d.ts +1 -0
  119. package/dist/utils/index.js +1 -0
  120. package/dist/utils/search-tokens.d.ts +2 -0
  121. package/dist/utils/search-tokens.js +21 -0
  122. package/package.json +2 -2
  123. package/scripts/seed-cli.mjs +2 -2
@@ -1,463 +1,285 @@
1
- /**
2
- * Events Seed Data LetItRip Collectibles Platform
3
- * 6 events: 2 upcoming (draft), 2 active, 2 ended.
4
- * Types: sale | offer | poll | survey | feedback — using exact schema shapes.
5
- * id === slug, event- prefix throughout.
1
+ /*
2
+ * WHY: Seeds 8 YGO-themed events covering all event types (poll, survey, sale, raffle, spin_wheel, feedback, offer).
3
+ * WHAT: 2 upcoming + 4 active + 2 ended. Includes raffle (open + drawn), spin wheel, poll, survey, feedback, sale, offer.
4
+ *
5
+ * EXPORTS:
6
+ * eventsSeedData — Array of EventDocument for seed runner
7
+ * eventEntriesSeedData — Array of EventEntryDocument for seed runner
8
+ *
9
+ * @tag domain:events
10
+ * @tag layer:seed
11
+ * @tag pattern:none
12
+ * @tag access:server-only
13
+ * @tag consumers:seed/index.ts,seed/runner.ts,SeedPanel
14
+ * @tag sideEffects:none
6
15
  */
7
16
  import { EVENT_FIELDS, EVENT_ENTRY_FIELDS } from "../features/events/schemas";
8
17
  const NOW = new Date();
9
18
  const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
10
19
  const daysAhead = (n) => new Date(NOW.getTime() + n * 86400000);
11
20
  export const eventsSeedData = [
12
- // ── 1. ACTIVE — Pokémon Card Tournament (Poll, voting open now) ──────────
21
+ // ── 1. ACTIVE — Poll: Favourite Duelist Season 1 ──────────────────────────
13
22
  {
14
- id: "event-pokemon-card-tournament-june-2026",
15
- slug: "event-pokemon-card-tournament-june-2026",
23
+ id: "event-favourite-duelist-poll",
24
+ slug: "favourite-duelist-poll",
16
25
  type: EVENT_FIELDS.TYPE_VALUES.POLL,
17
- title: "Pokémon TCG India Open June 2026 (Vote for Format!)",
18
- description: "<p>India's biggest Pokémon TCG open tournament is coming to Mumbai in June 2026. <strong>Vote for your preferred battle format</strong> — Standard, Expanded, or Limited Sealed — and help us shape the event schedule. Top voter-selected format gets the biggest prize pool!</p>",
26
+ title: "Vote: Best Duelist of Duel Monsters Season 1",
27
+ description: "Who is the greatest duelist of the original Duel Monsters season? Cast your vote and see real-time results!",
19
28
  status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
20
- startsAt: daysAhead(7),
21
- endsAt: daysAhead(21),
22
- coverImageUrl: "https://images.unsplash.com/photo-1559336197-ded8aaa244bc?w=1200&h=630&fit=crop",
23
- tags: ["pokemon", "tournament", "tcg", "mumbai", "2026"],
29
+ startsAt: daysAgo(5),
30
+ endsAt: daysAhead(10),
31
+ coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/46986414.jpg", alt: "Dark Magician — Yugi's ace" },
32
+ tags: ["poll", "duel-monsters", "season-1"],
24
33
  pollConfig: {
25
- allowMultiSelect: false,
26
- allowComment: true,
27
34
  options: [
28
- { id: "opt-standard", label: "Standard Format (current meta)" },
29
- { id: "opt-expanded", label: "Expanded Format (wider card pool)" },
30
- { id: "opt-sealed", label: "Limited Sealed (booster draft)" },
35
+ { id: "yugi", label: "Yugi Muto" },
36
+ { id: "kaiba", label: "Seto Kaiba" },
37
+ { id: "joey", label: "Joey Wheeler" },
38
+ { id: "pegasus", label: "Maximillion Pegasus" },
39
+ { id: "bakura", label: "Yami Bakura" },
31
40
  ],
32
- resultsVisibility: "after_end",
33
- requireLogin: true,
41
+ allowMultiSelect: false,
42
+ allowComment: false,
43
+ resultsVisibility: "after_vote",
34
44
  },
35
- stats: { totalEntries: 0, approvedEntries: 0, flaggedEntries: 0 },
45
+ stats: { totalEntries: 362, approvedEntries: 362, flaggedEntries: 0 },
36
46
  createdBy: "user-admin-letitrip",
37
- createdAt: daysAgo(3),
47
+ createdAt: daysAgo(7),
38
48
  updatedAt: daysAgo(1),
39
49
  },
40
- // ── 2. ACTIVE — Collectors Convention Survey (survey open now) ───────────
50
+ // ── 2. ACTIVE — Survey: Card Condition ───────────────────────────────────
41
51
  {
42
- id: "event-collectors-convention-2026-survey",
43
- slug: "event-collectors-convention-2026-survey",
52
+ id: "event-card-condition-survey",
53
+ slug: "card-condition-survey",
44
54
  type: EVENT_FIELDS.TYPE_VALUES.SURVEY,
45
- title: "LetItRip Collectors Convention 2026 Interest Survey",
46
- description: "<p>We're planning the first-ever LetItRip Collectors Convention a one-day event for Pokémon TCG, Hot Wheels, Beyblade X, anime figure, and Gunpla enthusiasts in India. Help us plan by filling out this short survey. Participants get a ₹200 voucher on their next LetItRip order.</p>",
55
+ title: "How Do You Store Your Cards?",
56
+ description: "Help us understand how Indian YGO collectors protect their cards. Your responses help us recommend better storage solutions.",
47
57
  status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
48
- startsAt: daysAhead(14),
49
- endsAt: daysAhead(35),
50
- coverImageUrl: "https://images.unsplash.com/photo-1540575467063-178a50c2df87?w=1200&h=630&fit=crop",
51
- tags: ["convention", "collectors", "survey", "india", "community"],
58
+ startsAt: daysAgo(3),
59
+ endsAt: daysAhead(14),
60
+ coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/89631139.jpg", alt: "Blue-Eyes White Dragon" },
61
+ tags: ["survey", "card-storage", "community"],
52
62
  surveyConfig: {
53
63
  requireLogin: true,
54
64
  maxEntriesPerUser: 1,
55
65
  hasLeaderboard: false,
56
- hasPointSystem: true,
57
- pointsLabel: "Voucher Credits",
66
+ hasPointSystem: false,
58
67
  entryReviewRequired: false,
59
68
  formFields: [
60
- {
61
- id: "field-city",
62
- type: "select",
63
- label: "Which city would you travel to for a 1-day convention?",
64
- required: true,
65
- options: ["Mumbai", "Delhi", "Bengaluru", "Hyderabad", "Pune", "Chennai", "Other"],
66
- order: 1,
67
- },
68
- {
69
- id: "field-vertical",
70
- type: "multiselect",
71
- label: "Which collectibles verticals do you primarily collect?",
72
- required: true,
73
- options: ["Pokémon TCG", "Hot Wheels / Tomica", "Beyblade X", "Anime Figures", "Gunpla", "Yu-Gi-Oh! TCG"],
74
- order: 2,
75
- },
76
- {
77
- id: "field-budget",
78
- type: "select",
79
- label: "What would you spend at a convention (entry + purchases)?",
80
- required: false,
81
- options: ["Under ₹2,000", "₹2,000–5,000", "₹5,000–10,000", "Over ₹10,000"],
82
- order: 3,
83
- },
69
+ { id: "q1", label: "What sleeve type do you use?", type: "radio", options: ["Penny sleeves", "Perfect fit", "Character art", "No sleeves"], required: true },
70
+ { id: "q2", label: "How do you store your collection?", type: "radio", options: ["Binder", "Deck box", "Top loaders", "Shoebox"], required: true },
71
+ { id: "q3", label: "Do you use humidity control?", type: "radio", options: ["Yes — silica gel", "Yes — climate control", "No"], required: true },
84
72
  ],
85
73
  },
86
- stats: { totalEntries: 0, approvedEntries: 0, flaggedEntries: 0 },
74
+ stats: { totalEntries: 89, approvedEntries: 89, flaggedEntries: 0 },
87
75
  createdBy: "user-admin-letitrip",
88
76
  createdAt: daysAgo(5),
89
- updatedAt: daysAgo(2),
77
+ updatedAt: daysAgo(1),
90
78
  },
91
- // ── 3. ACTIVE — Hot Wheels May Swap Meet Sale ─────────────────────────────
79
+ // ── 3. ACTIVE — Sale: Duelist Kingdom Clearance ───────────────────────────
92
80
  {
93
- id: "event-hot-wheels-swap-meet-may-2026",
94
- slug: "event-hot-wheels-swap-meet-may-2026",
81
+ id: "event-duelist-kingdom-clearance",
82
+ slug: "duelist-kingdom-clearance",
95
83
  type: EVENT_FIELDS.TYPE_VALUES.SALE,
96
- title: "Hot Wheels May Swap Meet Up to 30% Off Diecast This Weekend",
97
- description: "<p>Diecast Depot is running a <strong>weekend flash sale</strong> to clear swap meet stock. Up to 30% off Treasure Hunts, Car Culture sets, Team Transport, and Tomica Limited Vintage. Prices drop as stock runs out — grab your cars before they're gone. <strong>LetItRip exclusive sale</strong> — no other platform, no restocks.</p>",
84
+ title: "Duelist Kingdom Clearance Sale20% Off",
85
+ description: "20% off all singles from the Duel Monsters era! Use code TOURNAMENT2026 at checkout. Limited time only.",
98
86
  status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
99
- startsAt: daysAgo(1),
100
- endsAt: daysAhead(2),
101
- coverImageUrl: "https://images.unsplash.com/photo-1581235720704-06d3acfcb36f?w=1200&h=630&fit=crop",
102
- tags: ["hot-wheels", "sale", "diecast", "swap-meet", "tomica"],
87
+ startsAt: daysAgo(2),
88
+ endsAt: daysAhead(7),
89
+ coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/55144522.jpg", alt: "Pot of Greed" },
90
+ tags: ["sale", "clearance", "duel-monsters", "singles"],
103
91
  saleConfig: {
104
- discountPercent: 30,
105
- bannerText: "🚗 Up to 30% off Hot Wheels & Tomica — this weekend only!",
106
- affectedCategories: ["category-diecast-vehicles", "category-hot-wheels-cars", "category-tomica-cars"],
92
+ discountPercent: 20,
93
+ applicableCategories: ["category-monster-cards", "category-spell-cards", "category-trap-cards", "category-extra-deck-cards"],
94
+ couponCode: "TOURNAMENT2026",
107
95
  },
108
- stats: { totalEntries: 47, approvedEntries: 47, flaggedEntries: 0 },
109
- createdBy: "user-vikram-mehta",
110
- createdAt: daysAgo(7),
111
- updatedAt: daysAgo(1),
112
- },
113
- // ── 4. ACTIVE — Anime Figure Showcase Offer Event ─────────────────────────
114
- {
115
- id: "event-anime-figure-showcase-may-2026",
116
- slug: "event-anime-figure-showcase-may-2026",
117
- type: EVENT_FIELDS.TYPE_VALUES.OFFER,
118
- title: "S.H.Figuarts & Nendoroid Showcase — Make an Offer Week",
119
- description: "<p>This week, all S.H.Figuarts and Nendoroid listings on LetItRip accept <strong>negotiated offers</strong>. Submit your best price on any anime figure listing — sellers will respond within 24 hours. Use code <strong>FIGURE10</strong> for an additional 10% off any accepted offer.</p>",
120
- status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
121
- startsAt: daysAgo(3),
122
- endsAt: daysAhead(4),
123
- coverImageUrl: "https://images.unsplash.com/photo-1578632767115-351597cf2477?w=1200&h=630&fit=crop",
124
- tags: ["anime-figures", "shf", "nendoroid", "offers", "bandai", "good-smile"],
125
- offerConfig: {
126
- couponId: "coupon-figure10",
127
- displayCode: "FIGURE10",
128
- bannerText: "🎌 Use FIGURE10 for 10% extra off any accepted offer on anime figures",
129
- },
130
- stats: { totalEntries: 23, approvedEntries: 21, flaggedEntries: 2 },
96
+ stats: { totalEntries: 0, approvedEntries: 0, flaggedEntries: 0 },
131
97
  createdBy: "user-admin-letitrip",
132
- createdAt: daysAgo(10),
133
- updatedAt: daysAgo(3),
134
- },
135
- // ── 5. ENDED — Yu-Gi-Oh! Regional Qualifier Poll ──────────────────────────
136
- {
137
- id: "event-yugioh-regional-qualifier-march-2026",
138
- slug: "event-yugioh-regional-qualifier-march-2026",
139
- type: EVENT_FIELDS.TYPE_VALUES.POLL,
140
- title: "Yu-Gi-Oh! Regional March 2026 — Hyderabad vs Bengaluru Vote",
141
- description: "<p>The vote for March's regional venue is closed. <strong>Hyderabad won</strong> with 68% of the vote! Results and tournament schedule are now posted in the LetItRip blog. Stay tuned for the April regional venue poll.</p>",
142
- status: EVENT_FIELDS.STATUS_VALUES.ENDED,
143
- startsAt: daysAgo(45),
144
- endsAt: daysAgo(30),
145
- coverImageUrl: "https://images.unsplash.com/photo-1612036782180-6f0b6cd846fe?w=1200&h=630&fit=crop",
146
- tags: ["yugioh", "regional", "tournament", "poll", "ended"],
147
- pollConfig: {
148
- allowMultiSelect: false,
149
- allowComment: false,
150
- options: [
151
- { id: "opt-hyd", label: "Hyderabad" },
152
- { id: "opt-blr", label: "Bengaluru" },
153
- ],
154
- resultsVisibility: "after_end",
155
- requireLogin: true,
156
- },
157
- stats: { totalEntries: 209, approvedEntries: 209, flaggedEntries: 0 },
158
- createdBy: "user-nisha-reddy",
159
- createdAt: daysAgo(52),
160
- updatedAt: daysAgo(30),
98
+ createdAt: daysAgo(4),
99
+ updatedAt: daysAgo(2),
161
100
  },
162
- // ── 7. ACTIVE — Collectibles Mega Raffle (open raffle, SB9) ────────────────
101
+ // ── 4. ACTIVE — Raffle: Win PSA 10 Dark Magician Girl ────────────────────
163
102
  {
164
- id: "event-collectibles-mega-raffle-2026",
165
- slug: "event-collectibles-mega-raffle-2026",
103
+ id: "event-win-psa10-dark-magician-girl",
104
+ slug: "win-psa10-dark-magician-girl",
166
105
  type: EVENT_FIELDS.TYPE_VALUES.RAFFLE,
167
- title: "LetItRip Mega Raffle — Win a 10,000 Store Credit",
168
- description: "<p>Enter the LetItRip <strong>Mega Raffle</strong> for a chance to win a 10,000 store credit usable across any LetItRip seller. One entry per registered user. Winner picked by verifiable on-chain randomness on the closing date.</p>",
106
+ title: "Win PSA 10 Dark Magician Girl",
107
+ description: "Enter for a chance to win a PSA 10 Dark Magician Girl (MFC 1st Edition)! One lucky duelist takes home the ultimate card.",
169
108
  status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
170
- startsAt: daysAgo(2),
109
+ startsAt: daysAgo(3),
171
110
  endsAt: daysAhead(14),
172
- coverImageUrl: "https://images.unsplash.com/photo-1513151233558-d860c5398176?w=1200&h=630&fit=crop",
173
- tags: ["raffle", "store-credit", "open-raffle", "verifiable-rng"],
111
+ coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/38033121.jpg", alt: "Dark Magician Girl" },
112
+ tags: ["raffle", "psa-10", "dark-magician-girl", "giveaway"],
174
113
  hasRaffle: true,
175
114
  raffleType: "open_raffle",
176
- raffleTopN: 0,
177
- rafflePrize: "₹10,000 platform store credit + exclusive LetItRip merch pack",
178
- rafflePrizeCouponId: "coupon-vip-2026",
179
- stats: { totalEntries: 184, approvedEntries: 184, flaggedEntries: 0 },
115
+ rafflePrize: "PSA 10 Dark Magician Girl — MFC 1st Edition (Cert: PSA-YGO-998877)",
116
+ raffleEntryCount: 247,
117
+ stats: { totalEntries: 247, approvedEntries: 247, flaggedEntries: 0 },
180
118
  createdBy: "user-admin-letitrip",
181
- createdAt: daysAgo(3),
119
+ createdAt: daysAgo(5),
182
120
  updatedAt: daysAgo(1),
183
121
  },
184
- // ── 8. ACTIVE — Spin the Wheel (SB9 spin-wheel event) ─────────────────────
122
+ // ── 5. ACTIVE — Spin Wheel: Daily Card Pull ──────────────────────────────
185
123
  {
186
- id: "event-spin-the-wheel-2026",
187
- slug: "event-spin-the-wheel-2026",
124
+ id: "event-daily-card-pull-wheel",
125
+ slug: "daily-card-pull-wheel",
188
126
  type: EVENT_FIELDS.TYPE_VALUES.SPIN_WHEEL,
189
- title: "Daily Spin the Wheel Win Coupons Every Day",
190
- description: "<p>Spin the wheel <strong>once per day</strong> for a chance to win coupons and bonus credit. Higher-weight prizes appear more often; the rarer ones land less than 5% of spins. All spins use verifiable on-chain randomness.</p>",
127
+ title: "Daily Card Pull! Spin for a Prize",
128
+ description: "Spin the wheel once per day for a chance to win discount coupons and free card sleeves!",
191
129
  status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
192
130
  startsAt: daysAgo(7),
193
- endsAt: daysAhead(30),
194
- coverImageUrl: "https://images.unsplash.com/photo-1607082348824-0a96f2a4b9da?w=1200&h=630&fit=crop",
195
- tags: ["spin-wheel", "daily", "coupons", "rng"],
196
- hasRaffle: true,
197
- raffleType: "spin_wheel",
131
+ endsAt: daysAhead(23),
132
+ coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/40640057.jpg", alt: "Kuriboh" },
133
+ tags: ["spin-wheel", "daily", "prizes", "coupons"],
198
134
  spinPrizes: [
199
- { id: "prize-50-off", label: "₹50 off coupon", couponId: "coupon-spin-50", weight: 60, isActive: true },
200
- { id: "prize-100-off", label: "₹100 off coupon", couponId: "coupon-spin-100", weight: 25, isActive: true },
201
- { id: "prize-free-shipping", label: "Free shipping", couponId: "coupon-spin-shipping", weight: 10, isActive: true },
202
- { id: "prize-500-off", label: "₹500 off coupon", couponId: "coupon-spin-500", weight: 4, isActive: true },
203
- { id: "prize-mystery", label: "Mystery booster pack", weight: 1, isActive: true },
135
+ { id: "spin-10pct", label: "10% Off Coupon", couponId: "coupon-yugi10", weight: 15, isActive: true },
136
+ { id: "spin-5pct", label: "5% Off Coupon", weight: 25, isActive: true },
137
+ { id: "spin-sleeve", label: "Free Card Sleeve Pack", weight: 10, isActive: true },
138
+ { id: "spin-try-again", label: "Try Again Tomorrow!", weight: 50, isActive: true },
204
139
  ],
205
140
  spinMaxPerUser: 1,
206
141
  spinWindowStart: daysAgo(7),
207
- spinWindowEnd: daysAhead(30),
208
- stats: { totalEntries: 0, approvedEntries: 0, flaggedEntries: 0 },
142
+ spinWindowEnd: daysAhead(23),
143
+ stats: { totalEntries: 534, approvedEntries: 534, flaggedEntries: 0 },
209
144
  createdBy: "user-admin-letitrip",
210
145
  createdAt: daysAgo(8),
211
146
  updatedAt: daysAgo(1),
212
147
  },
213
- // ── 9. ENDEDTop-N Scorer Raffle (drawn) ────────────────────────────────
148
+ // ── 6. ACTIVEFeedback: GX Era ─────────────────────────────────────────
214
149
  {
215
- id: "event-top-scorer-raffle-april-2026",
216
- slug: "event-top-scorer-raffle-april-2026",
217
- type: EVENT_FIELDS.TYPE_VALUES.RAFFLE,
218
- title: "Top 10 Scorers Raffle April Trivia Champions",
219
- description: "<p>The top 10 scorers from the April collectibles trivia survey were entered into a raffle for a Pokémon Booster Box. The winner was drawn using verifiable on-chain randomness on the close date.</p>",
220
- status: EVENT_FIELDS.STATUS_VALUES.ENDED,
221
- startsAt: daysAgo(45),
222
- endsAt: daysAgo(30),
223
- coverImageUrl: "https://images.unsplash.com/photo-1606503153255-59d8b8b82176?w=1200&h=630&fit=crop",
224
- tags: ["raffle", "top-n", "trivia", "pokemon"],
225
- hasRaffle: true,
226
- raffleType: "top_n_scorers",
227
- raffleTopN: 10,
228
- rafflePrize: "Sealed Pokémon Scarlet & Violet Booster Box",
229
- raffleWinnerUserId: "user-priya-patel",
230
- raffleWinnerDisplayName: "Priya Patel",
231
- raffleTriggeredAt: daysAgo(30),
232
- raffleEntryCount: 10,
233
- raffleGithubFunctionUrl: "https://github.com/letitrip-in/proof-of-fairness/blob/main/raffles/event-top-scorer-raffle-april-2026.json",
234
- stats: { totalEntries: 47, approvedEntries: 47, flaggedEntries: 0 },
150
+ id: "event-gx-era-feedback",
151
+ slug: "gx-era-feedback",
152
+ type: EVENT_FIELDS.TYPE_VALUES.FEEDBACK,
153
+ title: "Tell Us About GX Era Cards on LetItRip",
154
+ description: "Rate your experience buying GX era cards on LetItRip. Your feedback helps us improve the marketplace.",
155
+ status: EVENT_FIELDS.STATUS_VALUES.ACTIVE,
156
+ startsAt: daysAgo(10),
157
+ endsAt: daysAhead(20),
158
+ coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/89943723.jpg", alt: "Elemental HERO Neos" },
159
+ tags: ["feedback", "gx-era", "community"],
160
+ feedbackConfig: {
161
+ formFields: [
162
+ { id: "rating", label: "How would you rate the GX era selection?", type: "rating", required: true },
163
+ { id: "comment", label: "Any additional feedback?", type: "textarea", required: false },
164
+ ],
165
+ anonymous: false,
166
+ },
167
+ stats: { totalEntries: 45, approvedEntries: 45, flaggedEntries: 0 },
235
168
  createdBy: "user-admin-letitrip",
236
- createdAt: daysAgo(50),
237
- updatedAt: daysAgo(30),
169
+ createdAt: daysAgo(12),
170
+ updatedAt: daysAgo(2),
238
171
  },
239
- // ── 6. ENDEDBeyblade X India Launch Sale ───────────────────────────────
172
+ // ── 7. UPCOMINGOffer: Buy 3 Get 1 Free Singles ────────────────────────
240
173
  {
241
- id: "event-beyblade-x-india-launch-sale-2026",
242
- slug: "event-beyblade-x-india-launch-sale-2026",
243
- type: EVENT_FIELDS.TYPE_VALUES.SALE,
244
- title: "Beyblade X Official India Launch — 15% Off All BX Tops",
245
- description: "<p>This event has ended. Thank you to everyone who participated in the Beyblade X India launch sale! Over 300 BX tops sold in 72 hours — Dran Sword, Wizard Arrow, and Knight Shield all sold out within the first day. New stock arrives in 3 weeks.</p>",
246
- status: EVENT_FIELDS.STATUS_VALUES.ENDED,
247
- startsAt: daysAgo(60),
248
- endsAt: daysAgo(57),
249
- coverImageUrl: "https://images.unsplash.com/photo-1551698618-1dfe5d97d256?w=1200&h=630&fit=crop",
250
- tags: ["beyblade-x", "launch", "sale", "takara-tomy", "india"],
251
- saleConfig: {
252
- discountPercent: 15,
253
- bannerText: "🌀 15% off all Beyblade X tops — India launch weekend!",
254
- affectedCategories: ["category-beyblade-tops", "category-spinning-tops"],
174
+ id: "event-buy-3-get-1-singles",
175
+ slug: "buy-3-get-1-singles",
176
+ type: EVENT_FIELDS.TYPE_VALUES.OFFER,
177
+ title: "Buy 3 Singles, Get 1 Free",
178
+ description: "Coming soon! Buy any 3 single cards and get the cheapest one free. Applies to all stores on LetItRip.",
179
+ status: EVENT_FIELDS.STATUS_VALUES.DRAFT,
180
+ startsAt: daysAhead(5),
181
+ endsAt: daysAhead(20),
182
+ coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/83764718.jpg", alt: "Monster Reborn" },
183
+ tags: ["offer", "buy-3-get-1", "singles", "upcoming"],
184
+ offerConfig: {
185
+ couponId: "coupon-buy3get1",
186
+ displayCode: "BUY3GET1",
187
+ bannerText: "Buy any 3 single cards and get the cheapest one free!",
255
188
  },
256
- stats: { totalEntries: 312, approvedEntries: 312, flaggedEntries: 0 },
257
- createdBy: "user-rohit-joshi",
258
- createdAt: daysAgo(65),
259
- updatedAt: daysAgo(57),
260
- },
261
- ];
262
- export const eventEntriesSeedData = [
263
- // ── Sale event entries ────────────────────────────────────────────────────
264
- {
265
- id: "entry-swap-meet-rahul",
266
- eventId: "event-hot-wheels-swap-meet-may-2026",
267
- userId: "user-rahul-sharma",
268
- userDisplayName: "Rahul Sharma",
269
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
270
- submittedAt: daysAgo(1),
271
- },
272
- {
273
- id: "entry-swap-meet-priya",
274
- eventId: "event-hot-wheels-swap-meet-may-2026",
275
- userId: "user-priya-patel",
276
- userDisplayName: "Priya Patel",
277
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
278
- submittedAt: daysAgo(1),
279
- },
280
- // ── Active poll entries (Pokémon TCG tournament format vote) ─────────────
281
- {
282
- id: "entry-pokemon-poll-ravi",
283
- eventId: "event-pokemon-card-tournament-june-2026",
284
- userId: "user-ravi-kumar",
285
- userDisplayName: "Ravi Kumar",
286
- pollVotes: ["opt-standard"],
287
- pollComment: "Standard meta is the most balanced and skill-testing format for a regional.",
288
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
289
- submittedAt: daysAgo(2),
290
- },
291
- {
292
- id: "entry-pokemon-poll-priya",
293
- eventId: "event-pokemon-card-tournament-june-2026",
294
- userId: "user-priya-patel",
295
- userDisplayName: "Priya Patel",
296
- pollVotes: ["opt-sealed"],
297
- pollComment: "Sealed is the most fun for players without expensive cards!",
298
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
299
- submittedAt: daysAgo(2),
300
- },
301
- {
302
- id: "entry-pokemon-poll-arjun",
303
- eventId: "event-pokemon-card-tournament-june-2026",
304
- userId: "user-arjun-nair",
305
- userDisplayName: "Arjun Nair",
306
- pollVotes: ["opt-expanded"],
307
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
308
- submittedAt: daysAgo(1),
309
- },
310
- // ── Ended poll entries (Yu-Gi-Oh! regional venue vote) ───────────────────
311
- {
312
- id: "entry-yugioh-poll-nisha",
313
- eventId: "event-yugioh-regional-qualifier-march-2026",
314
- userId: "user-nisha-reddy",
315
- userDisplayName: "Nisha Reddy",
316
- pollVotes: ["opt-hyd"],
317
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
318
- submittedAt: daysAgo(38),
319
- },
320
- {
321
- id: "entry-yugioh-poll-rohit",
322
- eventId: "event-yugioh-regional-qualifier-march-2026",
323
- userId: "user-rohit-joshi",
324
- userDisplayName: "Rohit Joshi",
325
- pollVotes: ["opt-blr"],
326
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
327
- submittedAt: daysAgo(37),
328
- },
329
- {
330
- id: "entry-yugioh-poll-rahul",
331
- eventId: "event-yugioh-regional-qualifier-march-2026",
332
- userId: "user-rahul-sharma",
333
- userDisplayName: "Rahul Sharma",
334
- pollVotes: ["opt-hyd"],
335
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
336
- submittedAt: daysAgo(36),
337
- },
338
- // ── P28 expansion (S16 2026-05-12) — 11 more entries ─────────────────────
339
- // Additional swap-meet attendees
340
- {
341
- id: "entry-swap-meet-meera",
342
- eventId: "event-hot-wheels-swap-meet-may-2026",
343
- userId: "user-meera-nair",
344
- userDisplayName: "Meera Nair",
345
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
346
- submittedAt: daysAgo(2),
347
- },
348
- {
349
- id: "entry-swap-meet-arjun",
350
- eventId: "event-hot-wheels-swap-meet-may-2026",
351
- userId: "user-arjun-singh",
352
- userDisplayName: "Arjun Singh",
353
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
354
- submittedAt: daysAgo(2),
355
- },
356
- {
357
- id: "entry-swap-meet-kavya",
358
- eventId: "event-hot-wheels-swap-meet-may-2026",
359
- userId: "user-kavya-iyer",
360
- userDisplayName: "Kavya Iyer",
361
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.PENDING,
362
- submittedAt: daysAgo(1),
363
- },
364
- // Additional Pokémon poll voters
365
- {
366
- id: "entry-pokemon-poll-meera",
367
- eventId: "event-pokemon-card-tournament-june-2026",
368
- userId: "user-meera-nair",
369
- userDisplayName: "Meera Nair",
370
- pollVotes: ["opt-standard"],
371
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
372
- submittedAt: daysAgo(3),
189
+ stats: { totalEntries: 0, approvedEntries: 0, flaggedEntries: 0 },
190
+ createdBy: "user-admin-letitrip",
191
+ createdAt: daysAgo(2),
192
+ updatedAt: daysAgo(1),
373
193
  },
194
+ // ── 8. ENDED — Raffle: Won Complete LOB 1st Ed Set (drawn) ───────────────
374
195
  {
375
- id: "entry-pokemon-poll-sneha",
376
- eventId: "event-pokemon-card-tournament-june-2026",
377
- userId: "user-sneha-kumar",
378
- userDisplayName: "Sneha Kumar",
379
- pollVotes: ["opt-expanded"],
380
- pollComment: "Expanded gives me a reason to dust off my Tag Team decks.",
381
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
382
- submittedAt: daysAgo(3),
196
+ id: "event-won-complete-lob-raffle",
197
+ slug: "won-complete-lob-raffle",
198
+ type: EVENT_FIELDS.TYPE_VALUES.RAFFLE,
199
+ title: "Win Complete LOB 1st Edition Set",
200
+ description: "The grand raffle has concluded! One lucky duelist won a complete Legend of Blue Eyes 1st Edition set.",
201
+ status: EVENT_FIELDS.STATUS_VALUES.ENDED,
202
+ startsAt: daysAgo(30),
203
+ endsAt: daysAgo(5),
204
+ coverImage: { type: "image", url: "https://images.ygoprodeck.com/images/cards/cropped/89631139.jpg", alt: "Blue-Eyes White Dragon" },
205
+ tags: ["raffle", "lob", "1st-edition", "ended", "winner"],
206
+ hasRaffle: true,
207
+ raffleType: "open_raffle",
208
+ rafflePrize: "Complete LOB 1st Edition Set — 126 cards, all NM or better",
209
+ raffleWinnerUserId: "user-yugi-muto",
210
+ raffleWinnerDisplayName: "Yugi Muto",
211
+ raffleWinnerEntryId: "entry-lob-raffle-yugi-001",
212
+ raffleTriggeredAt: daysAgo(5),
213
+ raffleEntryCount: 1892,
214
+ stats: { totalEntries: 1892, approvedEntries: 1892, flaggedEntries: 0 },
215
+ createdBy: "user-admin-letitrip",
216
+ createdAt: daysAgo(35),
217
+ updatedAt: daysAgo(5),
383
218
  },
219
+ ];
220
+ // ── Event Entries ────────────────────────────────────────────────────────────
221
+ export const eventEntriesSeedData = [
222
+ // Yugi entered the poll
384
223
  {
385
- id: "entry-pokemon-poll-naman",
386
- eventId: "event-pokemon-card-tournament-june-2026",
387
- userId: "user-naman-gupta",
388
- userDisplayName: "Naman Gupta",
389
- pollVotes: ["opt-sealed"],
224
+ id: "entry-poll-yugi-001",
225
+ eventId: "event-favourite-duelist-poll",
226
+ userId: "user-yugi-muto",
227
+ userDisplayName: "Yugi Muto",
228
+ userEmail: "yugi@duelkingdom.in",
229
+ pollVotes: ["yugi"],
390
230
  reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
391
231
  submittedAt: daysAgo(4),
232
+ createdAt: daysAgo(4),
392
233
  },
393
- // Additional Yu-Gi-Oh! poll voters
234
+ // Kaiba entered the poll
394
235
  {
395
- id: "entry-yugioh-poll-priya-singh",
396
- eventId: "event-yugioh-regional-qualifier-march-2026",
397
- userId: "user-priya-singh",
398
- userDisplayName: "Priya Singh",
399
- pollVotes: ["opt-blr"],
400
- pollComment: "Bangalore is the most accessible by air for everyone.",
236
+ id: "entry-poll-kaiba-001",
237
+ eventId: "event-favourite-duelist-poll",
238
+ userId: "user-seto-kaiba",
239
+ userDisplayName: "Seto Kaiba",
240
+ userEmail: "kaiba@kaibalandmark.in",
241
+ pollVotes: ["kaiba"],
401
242
  reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
402
- submittedAt: daysAgo(35),
243
+ submittedAt: daysAgo(3),
244
+ createdAt: daysAgo(3),
403
245
  },
246
+ // Yugi entered the raffle (and won the LOB raffle)
404
247
  {
405
- id: "entry-yugioh-poll-amit",
406
- eventId: "event-yugioh-regional-qualifier-march-2026",
407
- userId: "user-amit-sharma",
408
- userDisplayName: "Amit Sharma",
409
- pollVotes: ["opt-hyd"],
248
+ id: "entry-lob-raffle-yugi-001",
249
+ eventId: "event-won-complete-lob-raffle",
250
+ userId: "user-yugi-muto",
251
+ userDisplayName: "Yugi Muto",
252
+ userEmail: "yugi@duelkingdom.in",
253
+ raffleEligible: true,
410
254
  reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
411
- submittedAt: daysAgo(34),
255
+ submittedAt: daysAgo(25),
256
+ createdAt: daysAgo(25),
412
257
  },
258
+ // Yugi entered the active raffle
413
259
  {
414
- id: "entry-yugioh-poll-kartik",
415
- eventId: "event-yugioh-regional-qualifier-march-2026",
416
- userId: "user-kartik-nair",
417
- userDisplayName: "Kartik Nair",
418
- pollVotes: ["opt-blr"],
260
+ id: "entry-dmg-raffle-yugi-001",
261
+ eventId: "event-win-psa10-dark-magician-girl",
262
+ userId: "user-yugi-muto",
263
+ userDisplayName: "Yugi Muto",
264
+ userEmail: "yugi@duelkingdom.in",
265
+ raffleEligible: true,
419
266
  reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
420
- submittedAt: daysAgo(33),
421
- },
422
- {
423
- id: "entry-yugioh-poll-divya",
424
- eventId: "event-yugioh-regional-qualifier-march-2026",
425
- userId: "user-divya-menon",
426
- userDisplayName: "Divya Menon",
427
- pollVotes: ["opt-blr"],
428
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.FLAGGED,
429
- submittedAt: daysAgo(33),
430
- },
431
- {
432
- id: "entry-pokemon-poll-tanvi",
433
- eventId: "event-pokemon-card-tournament-june-2026",
434
- userId: "user-tanvi-desai",
435
- userDisplayName: "Tanvi Desai",
436
- pollVotes: ["opt-standard"],
437
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.PENDING,
438
- submittedAt: daysAgo(1),
267
+ submittedAt: daysAgo(2),
268
+ createdAt: daysAgo(2),
439
269
  },
440
- // ── Admin raffle entry ───────────────────────────────────────────────────
270
+ // Kaiba spun the wheel
441
271
  {
442
- id: "entry-mega-raffle-admin",
443
- eventId: "event-collectibles-mega-raffle-2026",
444
- userId: "user-admin-letitrip",
445
- userDisplayName: "LetItRip Admin",
272
+ id: "entry-spin-kaiba-001",
273
+ eventId: "event-daily-card-pull-wheel",
274
+ userId: "user-seto-kaiba",
275
+ userDisplayName: "Seto Kaiba",
276
+ userEmail: "kaiba@kaibalandmark.in",
277
+ spinUsed: true,
278
+ spinPrizeId: "spin-10pct",
279
+ spinPrizeCouponCode: "YUGI10",
280
+ spinWonAt: daysAgo(1),
446
281
  reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
447
- raffleEligible: true,
448
282
  submittedAt: daysAgo(1),
449
- },
450
- // ── Admin spin-wheel entry (won ₹100 off coupon) ─────────────────────────
451
- {
452
- id: "entry-spin-wheel-admin",
453
- eventId: "event-spin-the-wheel-2026",
454
- userId: "user-admin-letitrip",
455
- userDisplayName: "LetItRip Admin",
456
- reviewStatus: EVENT_ENTRY_FIELDS.REVIEW_STATUS_VALUES.APPROVED,
457
- spinUsed: true,
458
- spinPrizeId: "prize-100-off",
459
- spinPrizeCouponCode: "SPIN100OFF-ADM",
460
- spinWonAt: daysAgo(2),
461
- submittedAt: daysAgo(2),
283
+ createdAt: daysAgo(1),
462
284
  },
463
285
  ];