@mohasinac/appkit 2.7.48 → 2.7.50

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 (110) hide show
  1. package/dist/_internal/client/features/layout/SidebarCollapseToggle.d.ts +19 -0
  2. package/dist/_internal/client/features/layout/SidebarCollapseToggle.js +15 -0
  3. package/dist/_internal/client/features/layout/index.d.ts +2 -0
  4. package/dist/_internal/client/features/layout/index.js +1 -0
  5. package/dist/_internal/server/features/checkout/actions.js +25 -2
  6. package/dist/_internal/server/features/promotions/actions.js +3 -1
  7. package/dist/_internal/shared/actions/action-registry.js +149 -0
  8. package/dist/client.d.ts +18 -0
  9. package/dist/client.js +13 -0
  10. package/dist/features/account/components/UserSidebar.js +2 -1
  11. package/dist/features/admin/components/AdminBlogEditorView.js +6 -2
  12. package/dist/features/admin/components/AdminSidebar.js +2 -1
  13. package/dist/features/auth/repository/session.repository.js +16 -1
  14. package/dist/features/cart/hooks/useAddToCart.d.ts +2 -0
  15. package/dist/features/cart/hooks/useAddToCart.js +2 -0
  16. package/dist/features/cart/hooks/useGuestCart.d.ts +2 -0
  17. package/dist/features/cart/utils/guest-cart.d.ts +7 -0
  18. package/dist/features/cart/utils/pending-ops.d.ts +6 -0
  19. package/dist/features/categories/components/CategoryBundlesListing.js +9 -1
  20. package/dist/features/categories/components/CategoryProductsListing.js +6 -10
  21. package/dist/features/categories/schemas/firestore.d.ts +9 -0
  22. package/dist/features/events/components/EventRaffleWinnerView.d.ts +9 -1
  23. package/dist/features/events/components/EventRaffleWinnerView.js +3 -3
  24. package/dist/features/events/components/SpinWheelView.js +3 -3
  25. package/dist/features/layout/BottomNavLayout.d.ts +5 -0
  26. package/dist/features/layout/BottomNavLayout.js +21 -0
  27. package/dist/features/layout/TitleBar.js +7 -1
  28. package/dist/features/layout/TitleBarLayout.d.ts +8 -2
  29. package/dist/features/layout/TitleBarLayout.js +11 -7
  30. package/dist/features/orders/schemas/index.d.ts +2 -2
  31. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +9 -5
  32. package/dist/features/products/components/PrizeDrawDetailPageView.js +1 -1
  33. package/dist/features/products/components/PrizeDrawEntryActions.d.ts +3 -1
  34. package/dist/features/products/components/PrizeDrawEntryActions.js +8 -12
  35. package/dist/features/products/components/ProductDetailActions.d.ts +5 -1
  36. package/dist/features/products/components/ProductDetailActions.js +3 -1
  37. package/dist/features/products/components/ProductDetailPageView.d.ts +2 -0
  38. package/dist/features/products/components/ProductDetailPageView.js +4 -0
  39. package/dist/features/products/components/ProductGrid.js +3 -3
  40. package/dist/features/products/components/ProductsIndexListing.js +15 -8
  41. package/dist/features/promotions/components/CouponCard.d.ts +11 -1
  42. package/dist/features/promotions/components/CouponCard.js +36 -2
  43. package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +27 -0
  44. package/dist/features/promotions/repository/claimed-coupons.repository.js +115 -0
  45. package/dist/features/promotions/schemas/firestore.d.ts +34 -0
  46. package/dist/features/promotions/schemas/firestore.js +13 -0
  47. package/dist/features/seller/components/SellerAddressesView.js +3 -2
  48. package/dist/features/seller/components/SellerBidsView.js +33 -3
  49. package/dist/features/seller/components/SellerOrdersView.js +35 -0
  50. package/dist/features/seller/components/SellerProductShell.d.ts +2 -0
  51. package/dist/features/seller/components/SellerProductShell.js +26 -4
  52. package/dist/features/seller/components/SellerProductsCards.d.ts +19 -0
  53. package/dist/features/seller/components/SellerProductsCards.js +19 -0
  54. package/dist/features/seller/components/SellerProductsFilterDrawer.d.ts +14 -0
  55. package/dist/features/seller/components/SellerProductsFilterDrawer.js +20 -0
  56. package/dist/features/seller/components/SellerProductsView.d.ts +3 -1
  57. package/dist/features/seller/components/SellerProductsView.js +68 -19
  58. package/dist/features/seller/components/SellerReviewsView.js +67 -4
  59. package/dist/features/seller/components/SellerSidebar.js +2 -1
  60. package/dist/features/seller/components/seller-products-styles.d.ts +7 -0
  61. package/dist/features/seller/components/seller-products-styles.js +14 -0
  62. package/dist/features/shell/FormShell.d.ts +7 -1
  63. package/dist/features/shell/FormShell.js +5 -2
  64. package/dist/features/store-extensions/index.d.ts +4 -0
  65. package/dist/features/store-extensions/index.js +4 -0
  66. package/dist/features/store-extensions/repository/rbac.repositories.d.ts +23 -0
  67. package/dist/features/store-extensions/repository/rbac.repositories.js +32 -0
  68. package/dist/features/store-extensions/repository/store-extensions.repositories.d.ts +91 -0
  69. package/dist/features/store-extensions/repository/store-extensions.repositories.js +127 -0
  70. package/dist/features/store-extensions/schemas/firestore.d.ts +244 -0
  71. package/dist/features/store-extensions/schemas/firestore.js +158 -0
  72. package/dist/features/store-extensions/schemas/rbac.d.ts +65 -0
  73. package/dist/features/store-extensions/schemas/rbac.js +43 -0
  74. package/dist/features/stores/components/InteractiveStoreCard.js +7 -3
  75. package/dist/features/stores/components/StoreProductsListing.js +6 -10
  76. package/dist/features/stores/schemas/firestore.d.ts +2 -0
  77. package/dist/index.d.ts +6 -0
  78. package/dist/index.js +8 -0
  79. package/dist/next/routing/route-map.d.ts +79 -0
  80. package/dist/next/routing/route-map.js +34 -0
  81. package/dist/react/hooks/useFormStatePreservation.d.ts +17 -0
  82. package/dist/react/hooks/useFormStatePreservation.js +62 -0
  83. package/dist/react/hooks/useInlineRowEdit.d.ts +24 -0
  84. package/dist/react/hooks/useInlineRowEdit.js +68 -0
  85. package/dist/react/index.d.ts +4 -0
  86. package/dist/react/index.js +4 -0
  87. package/dist/repositories/index.d.ts +4 -0
  88. package/dist/repositories/index.js +5 -0
  89. package/dist/seed/actions/demo-seed-actions.d.ts +1 -1
  90. package/dist/seed/claimed-coupons-seed-data.d.ts +13 -0
  91. package/dist/seed/claimed-coupons-seed-data.js +79 -0
  92. package/dist/seed/index.d.ts +2 -0
  93. package/dist/seed/index.js +3 -0
  94. package/dist/seed/manifest.js +17 -0
  95. package/dist/seed/store-extensions-seed-data.d.ts +19 -0
  96. package/dist/seed/store-extensions-seed-data.js +421 -0
  97. package/dist/tailwind-utilities.css +1 -1
  98. package/dist/ui/components/Button.style.css +20 -12
  99. package/dist/ui/components/ClaimCouponButton.d.ts +28 -0
  100. package/dist/ui/components/ClaimCouponButton.js +89 -0
  101. package/dist/ui/components/QuickCreateModal.d.ts +15 -0
  102. package/dist/ui/components/QuickCreateModal.js +48 -0
  103. package/dist/ui/components/QuickCreateModal.style.css +84 -0
  104. package/dist/ui/components/StickyBottomBar.d.ts +22 -0
  105. package/dist/ui/components/StickyBottomBar.js +20 -0
  106. package/dist/ui/components/VacationBanner.d.ts +11 -0
  107. package/dist/ui/components/VacationBanner.js +16 -0
  108. package/dist/ui/index.d.ts +8 -0
  109. package/dist/ui/index.js +4 -0
  110. package/package.json +1 -1
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Claimed Coupons Seed Data — plan §10.
3
+ *
4
+ * Top-level `claimedCoupons` collection (one doc per user × coupon). These
5
+ * rows populate the /user/coupons wallet with one example per status so the
6
+ * tabs (Active / Expired / Used) all have something to render in demo.
7
+ *
8
+ * Coupon snapshots mirror coupons-seed-data.ts (WELCOME10, POKEMON25,
9
+ * FREESHIP999) so the discount badge labels render correctly. Seed user is
10
+ * `user-mohsin-c` to match the dev-account convention used elsewhere.
11
+ */
12
+ import { createClaimedCouponId } from "../features/promotions/schemas";
13
+ const NOW = new Date();
14
+ const daysAgo = (n) => new Date(NOW.getTime() - n * 86400000);
15
+ const daysAhead = (n) => new Date(NOW.getTime() + n * 86400000);
16
+ export const claimedCouponsSeedData = [
17
+ // Active — won from a spin wheel, expires in 14 days
18
+ {
19
+ id: createClaimedCouponId("user-mohsin-c", "WELCOME10"),
20
+ userId: "user-mohsin-c",
21
+ couponId: "coupon-welcome10",
22
+ couponCode: "WELCOME10",
23
+ source: "spin",
24
+ couponSnapshot: {
25
+ name: "Welcome 10% Off",
26
+ description: "10% off your first order across the marketplace.",
27
+ type: "percentage",
28
+ scope: "admin",
29
+ discount: { value: 10, maxDiscount: 50000, minPurchase: 99900 },
30
+ restrictions: { firstTimeUserOnly: true, combineWithSellerCoupons: false },
31
+ },
32
+ status: "active",
33
+ expiresAt: daysAhead(14),
34
+ claimedAt: daysAgo(2),
35
+ updatedAt: daysAgo(2),
36
+ },
37
+ // Expired — manually claimed 30 days ago, no purchase made
38
+ {
39
+ id: createClaimedCouponId("user-mohsin-c", "POKEMON25"),
40
+ userId: "user-mohsin-c",
41
+ couponId: "coupon-pokemon25",
42
+ couponCode: "POKEMON25",
43
+ source: "manual",
44
+ couponSnapshot: {
45
+ name: "Pokémon 25% Off",
46
+ description: "25% off Pokémon TCG products.",
47
+ type: "percentage",
48
+ scope: "admin",
49
+ discount: { value: 25, maxDiscount: 250000, minPurchase: 199900 },
50
+ restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: true },
51
+ },
52
+ status: "expired",
53
+ expiresAt: daysAgo(5),
54
+ claimedAt: daysAgo(45),
55
+ updatedAt: daysAgo(5),
56
+ },
57
+ // Used — applied to a prior order
58
+ {
59
+ id: createClaimedCouponId("user-mohsin-c", "FREESHIP999"),
60
+ userId: "user-mohsin-c",
61
+ couponId: "coupon-freeship999",
62
+ couponCode: "FREESHIP999",
63
+ source: "manual",
64
+ couponSnapshot: {
65
+ name: "Free Shipping Over ₹999",
66
+ description: "Free shipping on orders above ₹999.",
67
+ type: "free_shipping",
68
+ scope: "admin",
69
+ discount: { value: 0, minPurchase: 99900 },
70
+ restrictions: { firstTimeUserOnly: false, combineWithSellerCoupons: true },
71
+ },
72
+ status: "used",
73
+ expiresAt: daysAhead(60),
74
+ usedAt: daysAgo(10),
75
+ usedOrderId: "order-3-20260508-a1b2c3",
76
+ claimedAt: daysAgo(20),
77
+ updatedAt: daysAgo(10),
78
+ },
79
+ ];
@@ -56,6 +56,7 @@ export { bidsSeedData } from "./bids-seed-data";
56
56
  export { couponsSeedData } from "./coupons-seed-data";
57
57
  export type { CouponUsageSeedRecord } from "./coupon-usage-seed-data";
58
58
  export { couponUsageSeedData } from "./coupon-usage-seed-data";
59
+ export { claimedCouponsSeedData } from "./claimed-coupons-seed-data";
59
60
  export { eventsSeedData, eventEntriesSeedData } from "./events-seed-data";
60
61
  export { payoutsSeedData } from "./payouts-seed-data";
61
62
  export { notificationsSeedData } from "./notifications-seed-data";
@@ -73,6 +74,7 @@ export { scammersSeedData } from "./scammers-seed-data";
73
74
  export { supportTicketsSeedData } from "./support-tickets-seed-data";
74
75
  export { productFeaturesSeedData } from "./product-features-seed-data";
75
76
  export { offersSeedData } from "./offers-seed-data";
77
+ export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data";
76
78
  export type { SeedManifest, SeedManifestEntry } from "./manifest";
77
79
  export { SEED_MANIFEST } from "./manifest";
78
80
  export type { FirestoreIndexConfig } from "./firestore-indexes";
@@ -43,6 +43,7 @@ export { cartsSeedData } from "./cart-seed-data";
43
43
  export { bidsSeedData } from "./bids-seed-data";
44
44
  export { couponsSeedData } from "./coupons-seed-data";
45
45
  export { couponUsageSeedData } from "./coupon-usage-seed-data";
46
+ export { claimedCouponsSeedData } from "./claimed-coupons-seed-data";
46
47
  export { eventsSeedData, eventEntriesSeedData } from "./events-seed-data";
47
48
  export { payoutsSeedData } from "./payouts-seed-data";
48
49
  export { notificationsSeedData } from "./notifications-seed-data";
@@ -62,6 +63,8 @@ export { scammersSeedData } from "./scammers-seed-data";
62
63
  export { supportTicketsSeedData } from "./support-tickets-seed-data";
63
64
  export { productFeaturesSeedData } from "./product-features-seed-data";
64
65
  export { offersSeedData } from "./offers-seed-data";
66
+ // S-STORE Extensions (Tier S-STORE) — 11 new collections
67
+ export { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data";
65
68
  export { SEED_MANIFEST } from "./manifest";
66
69
  export { mergeFirestoreIndices, generateMergedFirestoreIndexFile, } from "./firestore-indexes";
67
70
  // Test utilities (Firestore emulator + PII assertion)
@@ -5,6 +5,7 @@
5
5
  * Imported by SeedPanel to render previews without loading full seed data.
6
6
  * Auto-derived from the live seed data files — stays in sync automatically.
7
7
  */
8
+ import { payoutMethodsSeedData, shippingConfigsSeedData, analyticsCardsSeedData, analyticsAlertsSeedData, storeCategoriesSeedData, listingTemplatesSeedData, moderationQueueSeedData, reportsSeedData, itemRequestsSeedData, storeWhatsAppConfigSeedData, storeGoogleConfigSeedData, } from "./store-extensions-seed-data";
8
9
  // SB-UNI-C — brandsSeedData merged into categoriesSeedData.
9
10
  import { categoriesSeedData } from "./categories-seed-data";
10
11
  import { usersSeedData } from "./users-seed-data";
@@ -172,4 +173,20 @@ export const SEED_MANIFEST = {
172
173
  ...o,
173
174
  name: o.productTitle ?? o.id,
174
175
  }))),
176
+ // S-STORE foundation collections — entries derived lazily from store-extensions-seed-data
177
+ payoutMethods: pick(asArr(payoutMethodsSeedData)),
178
+ shippingConfigs: pick(asArr(shippingConfigsSeedData)),
179
+ analyticsCards: pick(asArr(analyticsCardsSeedData).map((c) => ({ ...c, name: c.title ?? c.id }))),
180
+ analyticsAlerts: pick(asArr(analyticsAlertsSeedData).map((a) => ({ ...a, name: a.label ?? a.id }))),
181
+ storeCategories: pick(asArr(storeCategoriesSeedData)),
182
+ listingTemplates: pick(asArr(listingTemplatesSeedData).map((t) => ({ ...t, name: t.name ?? t.id }))),
183
+ moderationQueue: pick(asArr(moderationQueueSeedData)),
184
+ reports: pick(asArr(reportsSeedData)),
185
+ itemRequests: pick(asArr(itemRequestsSeedData).map((r) => ({ ...r, name: r.title ?? r.id }))),
186
+ storeWhatsAppConfig: pick(asArr(storeWhatsAppConfigSeedData)),
187
+ storeGoogleConfig: pick(asArr(storeGoogleConfigSeedData)),
188
+ // RBAC + admin notifications — no seed docs yet; manifest stays empty until populated.
189
+ roleOverrides: [],
190
+ customRoles: [],
191
+ adminNotifications: [],
175
192
  };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * S-STORE Extensions Seed Data
3
+ *
4
+ * Compact sample documents for the 11 new Tier S-STORE collections.
5
+ * Used by SeedPanel ("Store" group). Full demo dataset rewrite ships
6
+ * with S-STORE-11.
7
+ */
8
+ import type { AnalyticsAlertDocument, AnalyticsCardDocument, ItemRequestDocument, ListingTemplateDocument, ModerationQueueDocument, PayoutMethodDocument, ReportDocument, ShippingConfigDocument, StoreCategoryDocument, StoreGoogleConfigDocument, StoreWhatsAppConfigDocument } from "../features/store-extensions/schemas/firestore";
9
+ export declare const payoutMethodsSeedData: Partial<PayoutMethodDocument>[];
10
+ export declare const shippingConfigsSeedData: Partial<ShippingConfigDocument>[];
11
+ export declare const analyticsCardsSeedData: Partial<AnalyticsCardDocument>[];
12
+ export declare const analyticsAlertsSeedData: Partial<AnalyticsAlertDocument>[];
13
+ export declare const storeCategoriesSeedData: Partial<StoreCategoryDocument>[];
14
+ export declare const listingTemplatesSeedData: Partial<ListingTemplateDocument>[];
15
+ export declare const moderationQueueSeedData: Partial<ModerationQueueDocument>[];
16
+ export declare const reportsSeedData: Partial<ReportDocument>[];
17
+ export declare const itemRequestsSeedData: Partial<ItemRequestDocument>[];
18
+ export declare const storeWhatsAppConfigSeedData: Partial<StoreWhatsAppConfigDocument>[];
19
+ export declare const storeGoogleConfigSeedData: Partial<StoreGoogleConfigDocument>[];
@@ -0,0 +1,421 @@
1
+ /**
2
+ * S-STORE Extensions Seed Data
3
+ *
4
+ * Compact sample documents for the 11 new Tier S-STORE collections.
5
+ * Used by SeedPanel ("Store" group). Full demo dataset rewrite ships
6
+ * with S-STORE-11.
7
+ */
8
+ const NOW = new Date();
9
+ // ───── payoutMethods (6 records) ──────────────────────────────────────────
10
+ export const payoutMethodsSeedData = [
11
+ {
12
+ id: "payout-method-pokemon-palace-upi-default",
13
+ sellerId: "user-pokemon-palace-owner",
14
+ storeId: "store-pokemon-palace",
15
+ type: "upi",
16
+ label: "Primary UPI",
17
+ upiVpa: "pokemonpalace@upi",
18
+ isDefault: true,
19
+ isActive: true,
20
+ },
21
+ {
22
+ id: "payout-method-pokemon-palace-bank",
23
+ sellerId: "user-pokemon-palace-owner",
24
+ storeId: "store-pokemon-palace",
25
+ type: "bank",
26
+ label: "HDFC Current Account",
27
+ accountNumber: "50200012345678",
28
+ ifscCode: "HDFC0001234",
29
+ accountHolderName: "Pokemon Palace LLP",
30
+ bankName: "HDFC Bank",
31
+ isDefault: false,
32
+ isActive: true,
33
+ },
34
+ {
35
+ id: "payout-method-diecast-depot-upi",
36
+ sellerId: "user-diecast-depot-owner",
37
+ storeId: "store-diecast-depot",
38
+ type: "upi",
39
+ label: "Default UPI",
40
+ upiVpa: "diecastdepot@okhdfc",
41
+ isDefault: true,
42
+ isActive: true,
43
+ },
44
+ {
45
+ id: "payout-method-tokyo-toys-upi",
46
+ sellerId: "user-tokyo-toys-owner",
47
+ storeId: "store-tokyo-toys-india",
48
+ type: "upi",
49
+ label: "Tokyo Toys UPI",
50
+ upiVpa: "tokyotoys@ybl",
51
+ isDefault: true,
52
+ isActive: true,
53
+ },
54
+ {
55
+ id: "payout-method-cardgame-hub-bank",
56
+ sellerId: "user-cardgame-hub-owner",
57
+ storeId: "store-cardgame-hub",
58
+ type: "bank",
59
+ label: "ICICI Current Account",
60
+ accountNumber: "001234567890",
61
+ ifscCode: "ICIC0000012",
62
+ accountHolderName: "Cardgame Hub Pvt Ltd",
63
+ bankName: "ICICI Bank",
64
+ isDefault: true,
65
+ isActive: true,
66
+ },
67
+ {
68
+ id: "payout-method-beyblade-arena-upi",
69
+ sellerId: "user-beyblade-arena-owner",
70
+ storeId: "store-beyblade-arena",
71
+ type: "upi",
72
+ label: "Arena UPI",
73
+ upiVpa: "beyarena@paytm",
74
+ isDefault: true,
75
+ isActive: true,
76
+ },
77
+ ];
78
+ // ───── shippingConfigs (8 records) ────────────────────────────────────────
79
+ export const shippingConfigsSeedData = [
80
+ {
81
+ id: "ship-config-pokemon-palace-free",
82
+ storeId: "store-pokemon-palace",
83
+ label: "Free over Rs 999",
84
+ method: "free",
85
+ freeAbovePaise: 99900,
86
+ estimatedDays: 5,
87
+ isDefault: true,
88
+ isActive: true,
89
+ },
90
+ {
91
+ id: "ship-config-pokemon-palace-express",
92
+ storeId: "store-pokemon-palace",
93
+ label: "Express (2 days)",
94
+ method: "express",
95
+ flatRateInPaise: 19900,
96
+ expressSurchargeInPaise: 9900,
97
+ estimatedDays: 2,
98
+ isDefault: false,
99
+ isActive: true,
100
+ },
101
+ {
102
+ id: "ship-config-diecast-flat",
103
+ storeId: "store-diecast-depot",
104
+ label: "Flat Rs 99",
105
+ method: "flat",
106
+ flatRateInPaise: 9900,
107
+ estimatedDays: 4,
108
+ isDefault: true,
109
+ isActive: true,
110
+ },
111
+ {
112
+ id: "ship-config-diecast-pickup",
113
+ storeId: "store-diecast-depot",
114
+ label: "Pickup (Bangalore)",
115
+ method: "pickup",
116
+ estimatedDays: 0,
117
+ isDefault: false,
118
+ isActive: true,
119
+ },
120
+ {
121
+ id: "ship-config-tokyo-toys-weight",
122
+ storeId: "store-tokyo-toys-india",
123
+ label: "By weight",
124
+ method: "weight",
125
+ pricePerKgInPaise: 12000,
126
+ estimatedDays: 6,
127
+ isDefault: true,
128
+ isActive: true,
129
+ },
130
+ {
131
+ id: "ship-config-cardgame-free-1500",
132
+ storeId: "store-cardgame-hub",
133
+ label: "Free over Rs 1500",
134
+ method: "free",
135
+ freeAbovePaise: 150000,
136
+ estimatedDays: 5,
137
+ isDefault: true,
138
+ isActive: true,
139
+ },
140
+ {
141
+ id: "ship-config-beyblade-flat",
142
+ storeId: "store-beyblade-arena",
143
+ label: "Flat Rs 79",
144
+ method: "flat",
145
+ flatRateInPaise: 7900,
146
+ estimatedDays: 4,
147
+ isDefault: true,
148
+ isActive: true,
149
+ },
150
+ {
151
+ id: "ship-config-gundam-galaxy-express",
152
+ storeId: "store-gundam-galaxy",
153
+ label: "Express Premium",
154
+ method: "express",
155
+ flatRateInPaise: 29900,
156
+ estimatedDays: 3,
157
+ isDefault: true,
158
+ isActive: true,
159
+ },
160
+ ];
161
+ // ───── analyticsCards (9 records) ─────────────────────────────────────────
162
+ export const analyticsCardsSeedData = [
163
+ { id: "ac-seller-revenue-30d", scope: "seller", ownerId: "user-pokemon-palace-owner", title: "Revenue · 30d", type: "metric", metric: "revenue:30d", filters: {}, position: 0, isBuiltIn: true, isVisible: true },
164
+ { id: "ac-seller-orders-30d", scope: "seller", ownerId: "user-pokemon-palace-owner", title: "Orders · 30d", type: "metric", metric: "orders:30d", filters: {}, position: 1, isBuiltIn: true, isVisible: true },
165
+ { id: "ac-seller-aov", scope: "seller", ownerId: "user-pokemon-palace-owner", title: "Avg Order Value", type: "metric", metric: "aov:30d", filters: {}, position: 2, isBuiltIn: true, isVisible: true },
166
+ { id: "ac-seller-traffic", scope: "seller", ownerId: "user-pokemon-palace-owner", title: "Storefront Traffic", type: "line", metric: "store-views:30d", filters: {}, position: 3, isBuiltIn: true, isVisible: true },
167
+ { id: "ac-seller-top-products", scope: "seller", ownerId: "user-pokemon-palace-owner", title: "Top Products", type: "table", metric: "top-products:30d", filters: {}, position: 4, isBuiltIn: true, isVisible: true },
168
+ { id: "ac-admin-platform-gmv", scope: "admin", ownerId: "user-admin-letitrip", title: "Platform GMV", type: "metric", metric: "platform-gmv:30d", filters: {}, position: 0, isBuiltIn: true, isVisible: true },
169
+ { id: "ac-admin-active-stores", scope: "admin", ownerId: "user-admin-letitrip", title: "Active Stores", type: "metric", metric: "active-stores", filters: {}, position: 1, isBuiltIn: true, isVisible: true },
170
+ { id: "ac-admin-pending-mod", scope: "admin", ownerId: "user-admin-letitrip", title: "Pending Moderation", type: "metric", metric: "moderation-pending", filters: {}, position: 2, isBuiltIn: true, isVisible: true },
171
+ { id: "ac-admin-open-reports", scope: "admin", ownerId: "user-admin-letitrip", title: "Open Reports", type: "metric", metric: "reports-open", filters: {}, position: 3, isBuiltIn: true, isVisible: true },
172
+ ];
173
+ // ───── analyticsAlerts (4 records) ────────────────────────────────────────
174
+ export const analyticsAlertsSeedData = [
175
+ { id: "alert-low-stock-pokemon", scope: "seller", ownerId: "user-pokemon-palace-owner", label: "Low stock", metric: "min-stock", operator: "<", threshold: 5, windowHours: 24, isActive: true, notifyChannels: ["in-app", "email"] },
176
+ { id: "alert-no-sales-pokemon", scope: "seller", ownerId: "user-pokemon-palace-owner", label: "Zero sales 48h", metric: "orders-window", operator: "==", threshold: 0, windowHours: 48, isActive: true, notifyChannels: ["in-app"] },
177
+ { id: "alert-platform-error-rate", scope: "admin", ownerId: "user-admin-letitrip", label: "API error rate > 5%", metric: "api-error-rate", operator: ">", threshold: 0.05, windowHours: 1, isActive: true, notifyChannels: ["in-app", "email", "whatsapp"] },
178
+ { id: "alert-fraud-surge", scope: "admin", ownerId: "user-admin-letitrip", label: "Fraud reports surge", metric: "reports-1h", operator: ">", threshold: 10, windowHours: 1, isActive: true, notifyChannels: ["in-app", "email"] },
179
+ ];
180
+ // ───── storeCategories (6 records) ────────────────────────────────────────
181
+ export const storeCategoriesSeedData = [
182
+ { id: "scat-pokemon-1st-edition", storeId: "store-pokemon-palace", label: "1st Edition Holos", slug: "1st-edition-holos", displayOrder: 0, productIds: [], isActive: true, description: "Vintage 1st-edition Pokémon holos.", coverImageUrl: "https://picsum.photos/seed/scat-pokemon-1e/640/360" },
183
+ { id: "scat-pokemon-japanese", storeId: "store-pokemon-palace", label: "Japanese Imports", slug: "japanese-imports", displayOrder: 1, productIds: [], isActive: true, coverImageUrl: "https://picsum.photos/seed/scat-pokemon-jp/640/360" },
184
+ { id: "scat-diecast-redline", storeId: "store-diecast-depot", label: "Hot Wheels Redline", slug: "hot-wheels-redline", displayOrder: 0, productIds: [], isActive: true, coverImageUrl: "https://picsum.photos/seed/scat-redline/640/360" },
185
+ { id: "scat-diecast-tomica", storeId: "store-diecast-depot", label: "Tomica Premium", slug: "tomica-premium", displayOrder: 1, productIds: [], isActive: true, coverImageUrl: "https://picsum.photos/seed/scat-tomica/640/360" },
186
+ { id: "scat-beyblade-burst", storeId: "store-beyblade-arena", label: "Burst Series", slug: "burst-series", displayOrder: 0, productIds: [], isActive: true, coverImageUrl: "https://picsum.photos/seed/scat-bey/640/360" },
187
+ { id: "scat-gundam-rg", storeId: "store-gundam-galaxy", label: "Real Grade Kits", slug: "real-grade", displayOrder: 0, productIds: [], isActive: true, coverImageUrl: "https://picsum.photos/seed/scat-gundam/640/360" },
188
+ ];
189
+ // ───── listingTemplates (5 records) ───────────────────────────────────────
190
+ export const listingTemplatesSeedData = [
191
+ {
192
+ id: "tmpl-standard-pokemon-card",
193
+ storeId: "store-pokemon-palace",
194
+ ownerId: "user-pokemon-palace-owner",
195
+ name: "Pokémon Card · Standard",
196
+ description: "Default fields for a graded Pokémon card listing.",
197
+ listingType: "standard",
198
+ defaults: { condition: "mint", currency: "INR", tags: ["pokemon", "tcg"] },
199
+ isShared: true,
200
+ isActive: true,
201
+ usageCount: 14,
202
+ },
203
+ {
204
+ id: "tmpl-auction-vintage-pokemon",
205
+ storeId: "store-pokemon-palace",
206
+ ownerId: "user-pokemon-palace-owner",
207
+ name: "Vintage Pokémon Auction",
208
+ listingType: "auction",
209
+ defaults: { reserveMultiplier: 1.2, auctionDays: 7, currency: "INR" },
210
+ isShared: false,
211
+ isActive: true,
212
+ usageCount: 5,
213
+ },
214
+ {
215
+ id: "tmpl-preorder-bandai",
216
+ storeId: "store-tokyo-toys-india",
217
+ ownerId: "user-tokyo-toys-owner",
218
+ name: "Bandai Pre-Order",
219
+ listingType: "pre-order",
220
+ defaults: { releaseLeadDays: 90, depositPercent: 30 },
221
+ isShared: false,
222
+ isActive: true,
223
+ usageCount: 9,
224
+ },
225
+ {
226
+ id: "tmpl-bundle-starter",
227
+ storeId: "store-diecast-depot",
228
+ ownerId: "user-diecast-depot-owner",
229
+ name: "Starter Bundle",
230
+ listingType: "bundle",
231
+ defaults: { minItems: 3, maxItems: 10, autoDiscountPercent: 12 },
232
+ isShared: true,
233
+ isActive: true,
234
+ usageCount: 2,
235
+ },
236
+ {
237
+ id: "tmpl-digital-code-steam",
238
+ storeId: "store-cardgame-hub",
239
+ ownerId: "user-cardgame-hub-owner",
240
+ name: "Steam Key Listing",
241
+ listingType: "digital-code",
242
+ defaults: { vendor: "steam", region: "in" },
243
+ isShared: false,
244
+ isActive: true,
245
+ usageCount: 1,
246
+ },
247
+ ];
248
+ // ───── moderationQueue (5 records) ────────────────────────────────────────
249
+ export const moderationQueueSeedData = [
250
+ { id: "mod-video-pokemon-charizard", mediaType: "video", mediaUrl: "/media/product-video-charizard-psa9-20260518.mp4", entityType: "product", entityId: "product-pokemon-charizard-psa9", ownerId: "user-pokemon-palace-owner", storeId: "store-pokemon-palace", status: "pending", submittedAt: new Date(NOW.getTime() - 3600000) },
251
+ { id: "mod-video-beyblade-burst", mediaType: "video", mediaUrl: "/media/product-video-beyblade-burst-20260518.mp4", entityType: "product", entityId: "product-beyblade-burst-evolution", ownerId: "user-beyblade-arena-owner", storeId: "store-beyblade-arena", status: "pending", submittedAt: new Date(NOW.getTime() - 7200000) },
252
+ { id: "mod-review-hot-wheels", mediaType: "rich-text", entityType: "review", entityId: "review-hot-wheels-redline-1", ownerId: "user-ravi-kumar", status: "approved", reviewerId: "user-admin-letitrip", reviewedAt: new Date(NOW.getTime() - 86400000), submittedAt: new Date(NOW.getTime() - 90000000) },
253
+ { id: "mod-image-diecast-banner", mediaType: "image", mediaUrl: "/media/store-banner-diecast-depot-20260518.jpg", entityType: "storefront", entityId: "store-diecast-depot", ownerId: "user-diecast-depot-owner", storeId: "store-diecast-depot", status: "auto-approved", submittedAt: new Date(NOW.getTime() - 172800000) },
254
+ { id: "mod-blog-grading-guide", mediaType: "rich-text", entityType: "blog", entityId: "blog-how-to-grade-pokemon-cards", ownerId: "user-admin-letitrip", status: "approved", reviewerId: "user-admin-letitrip", reviewedAt: new Date(NOW.getTime() - 432000000), submittedAt: new Date(NOW.getTime() - 438000000) },
255
+ { id: "mod-video-tomica-unbox", mediaType: "video", mediaUrl: "/media/product-video-tomica-tlv-bmw-20260518.mp4", entityType: "product", entityId: "product-tomica-tlv-bmw-2002", ownerId: "user-diecast-depot-owner", storeId: "store-diecast-depot", status: "pending", submittedAt: new Date(NOW.getTime() - 1800000) },
256
+ { id: "mod-video-rg-build-time", mediaType: "video", mediaUrl: "/media/product-video-rg-nu-gundam-20260518.mp4", entityType: "product", entityId: "product-rg-nu-gundam-real-grade", ownerId: "user-gundam-galaxy-owner", storeId: "store-gundam-galaxy", status: "pending", submittedAt: new Date(NOW.getTime() - 5400000) },
257
+ { id: "mod-event-cover", mediaType: "image", mediaUrl: "/media/event-cover-summer-tcg-meetup-20260518.jpg", entityType: "event", entityId: "event-summer-tcg-meetup", ownerId: "user-admin-letitrip", status: "approved", reviewerId: "user-admin-letitrip", reviewedAt: new Date(NOW.getTime() - 86400000), submittedAt: new Date(NOW.getTime() - 90000000) },
258
+ { id: "mod-storefront-bey-banner", mediaType: "image", mediaUrl: "/media/store-banner-beyblade-arena-20260518.jpg", entityType: "storefront", entityId: "store-beyblade-arena", ownerId: "user-beyblade-arena-owner", storeId: "store-beyblade-arena", status: "rejected", reason: "Banner has off-brand watermark.", reviewerId: "user-admin-letitrip", reviewedAt: new Date(NOW.getTime() - 172800000), submittedAt: new Date(NOW.getTime() - 180000000) },
259
+ { id: "mod-review-bootleg-flag", mediaType: "rich-text", entityType: "review", entityId: "review-bootleg-flag", ownerId: "user-anonymous-2", status: "pending", submittedAt: new Date(NOW.getTime() - 600000) },
260
+ { id: "mod-blog-collectibles-trends", mediaType: "rich-text", entityType: "blog", entityId: "blog-2026-collectibles-trends", ownerId: "user-admin-letitrip", status: "auto-approved", submittedAt: new Date(NOW.getTime() - 14400000) },
261
+ ];
262
+ // ───── reports (4 records) ────────────────────────────────────────────────
263
+ export const reportsSeedData = [
264
+ { id: "report-counterfeit-charizard", entityType: "product", entityId: "product-suspect-charizard", reporterId: "user-ravi-kumar", reason: "counterfeit", detail: "Card edges look reprinted; texture inconsistent.", evidenceUrls: [], status: "pending" },
265
+ { id: "report-scam-store-fly-by-night", entityType: "store", entityId: "store-suspect-fly-by-night", reporterId: "user-priya-sharma", reason: "scam", detail: "Reports of orders not shipped after 4 weeks.", evidenceUrls: [], status: "under-review", assignedTo: "user-admin-letitrip" },
266
+ { id: "report-spam-review-bey", entityType: "review", entityId: "review-bey-spammy", reporterId: "user-arjun-rao", reason: "spam", detail: "Promotional link in review.", evidenceUrls: [], status: "actioned", resolution: "Review hidden.", resolvedAt: new Date(NOW.getTime() - 86400000) },
267
+ { id: "report-harassment-comment", entityType: "comment", entityId: "comment-bad-actor-1", reporterId: "user-mohsin-c", reason: "harassment", detail: "Targeted abuse in blog comments.", evidenceUrls: [], status: "dismissed", resolvedAt: new Date(NOW.getTime() - 172800000) },
268
+ { id: "report-prohibited-replica-listing", entityType: "product", entityId: "product-suspect-replica-rolex", reporterId: "user-mohsin-c", reason: "prohibited", detail: "Replica branded merchandise.", evidenceUrls: [], status: "pending" },
269
+ { id: "report-ip-violation-fan-art-print", entityType: "product", entityId: "product-bootleg-pokemon-print", reporterId: "user-priya-sharma", reason: "ip-violation", detail: "Unauthorised Pokémon art prints.", evidenceUrls: [], status: "under-review", assignedTo: "user-admin-letitrip" },
270
+ { id: "report-spam-listing-mass-post", entityType: "store", entityId: "store-spammer-mass", reporterId: "user-arjun-rao", reason: "spam", detail: "Same product listed 50+ times.", evidenceUrls: [], status: "pending" },
271
+ { id: "report-inappropriate-blog", entityType: "blog", entityId: "blog-controversial-post", reporterId: "user-anonymous-1", reason: "inappropriate", detail: "Off-topic political content.", evidenceUrls: [], status: "dismissed", resolvedAt: new Date(NOW.getTime() - 259200000) },
272
+ ];
273
+ // ───── itemRequests (3 records) ───────────────────────────────────────────
274
+ export const itemRequestsSeedData = [
275
+ {
276
+ id: "irq-charizard-shadowless",
277
+ opUserId: "user-ravi-kumar",
278
+ opDisplayName: "Ravi Kumar",
279
+ title: "Looking for Shadowless Charizard PSA 8+",
280
+ description: "Hunting a Shadowless Base Set Charizard, grade 8 or above. Budget Rs 2,50,000.",
281
+ category: "trading-cards",
282
+ brand: "pokemon",
283
+ maxBudgetInPaise: 25000000,
284
+ imageUrls: ["https://picsum.photos/seed/irq-1/640/480"],
285
+ status: "open",
286
+ replyCount: 2,
287
+ replies: [],
288
+ approvedAt: new Date(NOW.getTime() - 86400000),
289
+ approvedBy: "user-admin-letitrip",
290
+ },
291
+ {
292
+ id: "irq-tomica-redline-bmw",
293
+ opUserId: "user-arjun-rao",
294
+ opDisplayName: "Arjun Rao",
295
+ title: "Tomica Limited Vintage BMW 2002",
296
+ description: "Mint condition only. Box must be intact.",
297
+ category: "diecast-vehicles",
298
+ brand: "tomica",
299
+ maxBudgetInPaise: 850000,
300
+ imageUrls: ["https://picsum.photos/seed/irq-2/640/480"],
301
+ status: "open",
302
+ replyCount: 0,
303
+ replies: [],
304
+ approvedAt: new Date(NOW.getTime() - 43200000),
305
+ approvedBy: "user-admin-letitrip",
306
+ },
307
+ {
308
+ id: "irq-pending-funko-grail",
309
+ opUserId: "user-priya-sharma",
310
+ opDisplayName: "Priya Sharma",
311
+ title: "Funko Pop SDCC Exclusive Glow Batman",
312
+ description: "Searching for the 2013 SDCC Glow-in-Dark Batman exclusive.",
313
+ category: "action-figures",
314
+ brand: "funko",
315
+ imageUrls: ["https://picsum.photos/seed/irq-3/640/480"],
316
+ status: "pending-approval",
317
+ replyCount: 0,
318
+ replies: [],
319
+ },
320
+ {
321
+ id: "irq-bey-spriggan-bb-105",
322
+ opUserId: "user-arjun-rao",
323
+ opDisplayName: "Arjun Rao",
324
+ title: "Beyblade Spriggan BB-105 boxed",
325
+ description: "Need original-box Spriggan from the Metal Fight series. Mint launcher.",
326
+ category: "spinning-tops",
327
+ brand: "takara-tomy",
328
+ maxBudgetInPaise: 450000,
329
+ imageUrls: ["https://picsum.photos/seed/irq-4/640/480"],
330
+ status: "open",
331
+ replyCount: 1,
332
+ replies: [],
333
+ approvedAt: new Date(NOW.getTime() - 28800000),
334
+ approvedBy: "user-admin-letitrip",
335
+ },
336
+ {
337
+ id: "irq-rg-nu-gundam",
338
+ opUserId: "user-mohsin-c",
339
+ opDisplayName: "Mohsin C",
340
+ title: "RG 1/144 Nu Gundam mint sealed",
341
+ description: "Sealed runner. Will pay shipping insurance.",
342
+ category: "model-kits",
343
+ brand: "bandai",
344
+ maxBudgetInPaise: 320000,
345
+ imageUrls: ["https://picsum.photos/seed/irq-5/640/480"],
346
+ status: "fulfilled",
347
+ replyCount: 4,
348
+ replies: [],
349
+ approvedAt: new Date(NOW.getTime() - 7 * 86400000),
350
+ approvedBy: "user-admin-letitrip",
351
+ closedAt: new Date(NOW.getTime() - 2 * 86400000),
352
+ },
353
+ {
354
+ id: "irq-tcg-base-set-booster",
355
+ opUserId: "user-ravi-kumar",
356
+ opDisplayName: "Ravi Kumar",
357
+ title: "Pokémon Base Set booster pack — unopened",
358
+ description: "Any printing. Western or Japanese OK. Sealed only.",
359
+ category: "trading-cards",
360
+ brand: "pokemon",
361
+ maxBudgetInPaise: 1500000,
362
+ imageUrls: ["https://picsum.photos/seed/irq-6/640/480"],
363
+ status: "open",
364
+ replyCount: 0,
365
+ replies: [],
366
+ approvedAt: new Date(NOW.getTime() - 14400000),
367
+ approvedBy: "user-admin-letitrip",
368
+ },
369
+ {
370
+ id: "irq-rejected-replica-watch",
371
+ opUserId: "user-anonymous-flagged",
372
+ opDisplayName: "Anonymous",
373
+ title: "Replica luxury watches",
374
+ description: "Looking for replica watches at discount.",
375
+ category: "other",
376
+ imageUrls: ["https://picsum.photos/seed/irq-7/640/480"],
377
+ status: "rejected",
378
+ replyCount: 0,
379
+ replies: [],
380
+ },
381
+ ];
382
+ // ───── storeWhatsAppConfig (2 records) ────────────────────────────────────
383
+ export const storeWhatsAppConfigSeedData = [
384
+ {
385
+ id: "whatsapp-pokemon-palace",
386
+ storeId: "store-pokemon-palace",
387
+ isConnected: true,
388
+ isPaid: true,
389
+ phoneNumber: "+919876543210",
390
+ businessProfileName: "Pokémon Palace",
391
+ catalogUrl: "https://wa.me/c/919876543210",
392
+ autoReply: "Hi! Thanks for messaging Pokémon Palace. We respond within 2 hours.",
393
+ welcomeMessage: "Welcome to Pokémon Palace! Browse our catalog above.",
394
+ onboardingStatus: "approved",
395
+ },
396
+ {
397
+ id: "whatsapp-tokyo-toys",
398
+ storeId: "store-tokyo-toys-india",
399
+ isConnected: false,
400
+ isPaid: false,
401
+ onboardingStatus: "pending",
402
+ },
403
+ ];
404
+ // ───── storeGoogleConfig (2 records) ──────────────────────────────────────
405
+ export const storeGoogleConfigSeedData = [
406
+ {
407
+ id: "google-pokemon-palace",
408
+ storeId: "store-pokemon-palace",
409
+ isConnected: true,
410
+ placeId: "ChIJpokemonpalace12345",
411
+ businessName: "Pokémon Palace",
412
+ averageRating: 4.7,
413
+ totalReviews: 124,
414
+ lastSyncedAt: new Date(NOW.getTime() - 3600000),
415
+ },
416
+ {
417
+ id: "google-diecast-depot",
418
+ storeId: "store-diecast-depot",
419
+ isConnected: false,
420
+ },
421
+ ];