@mohasinac/appkit 2.7.36 → 2.7.37

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 (140) hide show
  1. package/dist/_internal/client/features/layout/DashboardLayoutClient.js +1 -1
  2. package/dist/_internal/client/features/seller/print-center/InventoryLabel.d.ts +12 -0
  3. package/dist/_internal/client/features/seller/print-center/InventoryLabel.js +49 -0
  4. package/dist/_internal/client/features/seller/print-center/LabelDesignPicker.d.ts +7 -0
  5. package/dist/_internal/client/features/seller/print-center/LabelDesignPicker.js +32 -0
  6. package/dist/_internal/client/features/seller/print-center/OrderPackingLabel.d.ts +28 -0
  7. package/dist/_internal/client/features/seller/print-center/OrderPackingLabel.js +33 -0
  8. package/dist/_internal/client/features/seller/print-center/PhysicalLocationModal.d.ts +12 -0
  9. package/dist/_internal/client/features/seller/print-center/PhysicalLocationModal.js +30 -0
  10. package/dist/_internal/client/features/seller/print-center/PrintCenterView.d.ts +12 -0
  11. package/dist/_internal/client/features/seller/print-center/PrintCenterView.js +102 -0
  12. package/dist/_internal/client/features/seller/print-center/PrintGrid.d.ts +12 -0
  13. package/dist/_internal/client/features/seller/print-center/PrintGrid.js +13 -0
  14. package/dist/_internal/client/features/seller/print-center/StoreCard.d.ts +19 -0
  15. package/dist/_internal/client/features/seller/print-center/StoreCard.js +30 -0
  16. package/dist/_internal/client/features/seller/print-center/WebsiteCard.d.ts +11 -0
  17. package/dist/_internal/client/features/seller/print-center/WebsiteCard.js +25 -0
  18. package/dist/_internal/client/features/seller/print-center/index.d.ts +11 -0
  19. package/dist/_internal/client/features/seller/print-center/index.js +10 -0
  20. package/dist/_internal/client/features/seller/print-center/types.d.ts +20 -0
  21. package/dist/_internal/client/features/seller/print-center/types.js +20 -0
  22. package/dist/_internal/client/features/seller/print-center/useInventoryPdf.d.ts +18 -0
  23. package/dist/_internal/client/features/seller/print-center/useInventoryPdf.js +76 -0
  24. package/dist/_internal/server/jobs/core/draftPrune.d.ts +2 -0
  25. package/dist/_internal/server/jobs/core/draftPrune.js +15 -0
  26. package/dist/_internal/server/jobs/core/onBidPlaced.js +1 -1
  27. package/dist/_internal/server/jobs/core/promotions.d.ts +1 -0
  28. package/dist/_internal/server/jobs/core/promotions.js +21 -6
  29. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +18 -1
  30. package/dist/_internal/server/jobs/handlers/draftPrune.d.ts +2 -0
  31. package/dist/_internal/server/jobs/handlers/draftPrune.js +2 -0
  32. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  33. package/dist/_internal/server/jobs/handlers/index.js +2 -0
  34. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -1
  35. package/dist/_internal/shared/actions/action-registry.js +32 -0
  36. package/dist/_internal/shared/features/blog/schema.d.ts +8 -8
  37. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +10 -10
  38. package/dist/_internal/shared/features/orders/schema.d.ts +8 -8
  39. package/dist/_internal/shared/features/products/schema.d.ts +8 -8
  40. package/dist/_internal/shared/features/promotions/schema.d.ts +6 -6
  41. package/dist/_internal/shared/features/reviews/schema.d.ts +2 -2
  42. package/dist/client.d.ts +11 -1
  43. package/dist/client.js +6 -1
  44. package/dist/configs/next.js +1 -0
  45. package/dist/constants/api-endpoints.d.ts +6 -0
  46. package/dist/constants/api-endpoints.js +2 -0
  47. package/dist/core/server-action.d.ts +4 -0
  48. package/dist/errors/error-codes.d.ts +18 -0
  49. package/dist/errors/error-codes.js +18 -0
  50. package/dist/errors/index.d.ts +1 -1
  51. package/dist/errors/index.js +1 -1
  52. package/dist/errors/messages.d.ts +1 -0
  53. package/dist/errors/messages.js +1 -0
  54. package/dist/features/account/components/UserSidebar.js +1 -1
  55. package/dist/features/account/schemas/index.d.ts +12 -12
  56. package/dist/features/admin/components/AdminSidebar.js +1 -1
  57. package/dist/features/auctions/actions/bid-actions.js +13 -6
  58. package/dist/features/auctions/components/PlaceBidFormClient.js +10 -2
  59. package/dist/features/auctions/repository/bid.repository.d.ts +7 -0
  60. package/dist/features/auctions/repository/bid.repository.js +16 -0
  61. package/dist/features/auctions/schemas/index.d.ts +18 -18
  62. package/dist/features/auth/schemas/index.d.ts +2 -2
  63. package/dist/features/before-after/schemas/index.d.ts +2 -2
  64. package/dist/features/blog/actions/blog-actions.d.ts +32 -32
  65. package/dist/features/blog/components/BlogPostForm.js +1 -1
  66. package/dist/features/blog/schemas/index.d.ts +38 -38
  67. package/dist/features/categories/schemas/index.d.ts +10 -10
  68. package/dist/features/collections/schemas/index.d.ts +4 -4
  69. package/dist/features/consultation/schemas/index.d.ts +9 -9
  70. package/dist/features/corporate/schemas/index.d.ts +4 -4
  71. package/dist/features/events/schemas/index.d.ts +50 -50
  72. package/dist/features/faq/actions/faq-actions.d.ts +6 -6
  73. package/dist/features/faq/schemas/index.d.ts +8 -8
  74. package/dist/features/homepage/actions/homepage-section-actions.d.ts +4 -4
  75. package/dist/features/layout/AppLayoutShell.js +1 -1
  76. package/dist/features/layout/AutoBreadcrumbs.js +1 -1
  77. package/dist/features/media/AvatarUpload.js +1 -1
  78. package/dist/features/media/types/index.d.ts +4 -4
  79. package/dist/features/media/upload/ImageUpload.js +18 -9
  80. package/dist/features/media/upload/MediaUploadList.js +2 -2
  81. package/dist/features/orders/schemas/firestore.d.ts +6 -0
  82. package/dist/features/orders/schemas/index.d.ts +10 -10
  83. package/dist/features/orders/types/index.d.ts +5 -0
  84. package/dist/features/payments/schemas/index.d.ts +4 -4
  85. package/dist/features/pre-orders/schemas/index.d.ts +8 -8
  86. package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
  87. package/dist/features/products/components/ProductForm.js +20 -2
  88. package/dist/features/products/repository/products.repository.d.ts +3 -1
  89. package/dist/features/products/repository/products.repository.js +12 -1
  90. package/dist/features/products/schemas/firestore.d.ts +7 -0
  91. package/dist/features/products/schemas/index.d.ts +34 -34
  92. package/dist/features/products/schemas/product-features.validators.d.ts +6 -6
  93. package/dist/features/products/types/index.d.ts +6 -0
  94. package/dist/features/promotions/schemas/index.d.ts +14 -14
  95. package/dist/features/reviews/schemas/index.d.ts +18 -18
  96. package/dist/features/seller/actions/offer-actions.js +10 -1
  97. package/dist/features/seller/components/PhysicalLocationModal.d.ts +12 -0
  98. package/dist/features/seller/components/PhysicalLocationModal.js +30 -0
  99. package/dist/features/seller/components/PrintCenterView.d.ts +40 -0
  100. package/dist/features/seller/components/PrintCenterView.js +6 -0
  101. package/dist/features/seller/components/SellerOrdersView.js +48 -3
  102. package/dist/features/seller/components/SellerProductShell.d.ts +1 -0
  103. package/dist/features/seller/components/SellerProductShell.js +26 -4
  104. package/dist/features/seller/components/SellerProductsView.js +54 -13
  105. package/dist/features/seller/components/SellerSidebar.js +1 -1
  106. package/dist/features/seller/components/index.d.ts +1 -0
  107. package/dist/features/seller/components/index.js +1 -0
  108. package/dist/features/seller/schemas/firestore.d.ts +2 -0
  109. package/dist/features/seller/schemas/firestore.js +1 -0
  110. package/dist/features/seller/schemas/index.d.ts +22 -22
  111. package/dist/features/shell/FormShell.js +1 -1
  112. package/dist/features/shell/StepForm.d.ts +3 -1
  113. package/dist/features/shell/StepForm.js +3 -3
  114. package/dist/features/stores/schemas/index.d.ts +4 -4
  115. package/dist/index.d.ts +9 -1
  116. package/dist/index.js +6 -1
  117. package/dist/next/routing/route-map.d.ts +8 -0
  118. package/dist/next/routing/route-map.js +3 -0
  119. package/dist/tailwind-utilities.css +1 -1
  120. package/dist/ui/components/RowActionMenu.js +45 -10
  121. package/dist/ui/components/SideDrawer.style.css +2 -2
  122. package/dist/ui/forms/FieldCheckbox.d.ts +13 -0
  123. package/dist/ui/forms/FieldCheckbox.js +25 -0
  124. package/dist/ui/forms/FieldInput.d.ts +11 -0
  125. package/dist/ui/forms/FieldInput.js +25 -0
  126. package/dist/ui/forms/FieldSelect.d.ts +17 -0
  127. package/dist/ui/forms/FieldSelect.js +25 -0
  128. package/dist/ui/forms/FormShell.d.ts +48 -0
  129. package/dist/ui/forms/FormShell.js +176 -0
  130. package/dist/ui/forms/FormShell.style.css +287 -0
  131. package/dist/ui/forms/index.d.ts +8 -0
  132. package/dist/ui/forms/index.js +4 -0
  133. package/dist/ui/index.d.ts +9 -0
  134. package/dist/ui/index.js +5 -0
  135. package/dist/utils/action-response.d.ts +6 -0
  136. package/dist/utils/action-response.js +22 -0
  137. package/dist/utils/index.d.ts +1 -0
  138. package/dist/utils/index.js +1 -0
  139. package/dist/validation/schemas.d.ts +10 -10
  140. package/package.json +2 -2
@@ -16,8 +16,8 @@ export declare const orderItemSchema: z.ZodObject<{
16
16
  productId: string;
17
17
  quantity: number;
18
18
  currency?: string | undefined;
19
- storeId?: string | undefined;
20
19
  image?: string | undefined;
20
+ storeId?: string | undefined;
21
21
  attributes?: Record<string, string> | undefined;
22
22
  }, {
23
23
  title: string;
@@ -25,8 +25,8 @@ export declare const orderItemSchema: z.ZodObject<{
25
25
  productId: string;
26
26
  quantity: number;
27
27
  currency?: string | undefined;
28
- storeId?: string | undefined;
29
28
  image?: string | undefined;
29
+ storeId?: string | undefined;
30
30
  attributes?: Record<string, string> | undefined;
31
31
  }>;
32
32
  export declare const orderTimelineSchema: z.ZodObject<{
@@ -76,8 +76,8 @@ export declare const orderSchema: z.ZodObject<{
76
76
  productId: string;
77
77
  quantity: number;
78
78
  currency?: string | undefined;
79
- storeId?: string | undefined;
80
79
  image?: string | undefined;
80
+ storeId?: string | undefined;
81
81
  attributes?: Record<string, string> | undefined;
82
82
  }, {
83
83
  title: string;
@@ -85,8 +85,8 @@ export declare const orderSchema: z.ZodObject<{
85
85
  productId: string;
86
86
  quantity: number;
87
87
  currency?: string | undefined;
88
- storeId?: string | undefined;
89
88
  image?: string | undefined;
89
+ storeId?: string | undefined;
90
90
  attributes?: Record<string, string> | undefined;
91
91
  }>, "many">;
92
92
  address: z.ZodRecord<z.ZodString, z.ZodUnknown>;
@@ -131,8 +131,8 @@ export declare const orderSchema: z.ZodObject<{
131
131
  productId: string;
132
132
  quantity: number;
133
133
  currency?: string | undefined;
134
- storeId?: string | undefined;
135
134
  image?: string | undefined;
135
+ storeId?: string | undefined;
136
136
  attributes?: Record<string, string> | undefined;
137
137
  }[];
138
138
  total: number;
@@ -143,10 +143,10 @@ export declare const orderSchema: z.ZodObject<{
143
143
  createdAt?: string | undefined;
144
144
  updatedAt?: string | undefined;
145
145
  notes?: string | undefined;
146
+ tax?: number | undefined;
146
147
  trackingNumber?: string | undefined;
147
148
  couponCode?: string | undefined;
148
149
  shippingCarrier?: string | undefined;
149
- tax?: number | undefined;
150
150
  discount?: number | undefined;
151
151
  paymentGateway?: string | undefined;
152
152
  shippingCost?: number | undefined;
@@ -166,8 +166,8 @@ export declare const orderSchema: z.ZodObject<{
166
166
  productId: string;
167
167
  quantity: number;
168
168
  currency?: string | undefined;
169
- storeId?: string | undefined;
170
169
  image?: string | undefined;
170
+ storeId?: string | undefined;
171
171
  attributes?: Record<string, string> | undefined;
172
172
  }[];
173
173
  total: number;
@@ -178,10 +178,10 @@ export declare const orderSchema: z.ZodObject<{
178
178
  createdAt?: string | undefined;
179
179
  updatedAt?: string | undefined;
180
180
  notes?: string | undefined;
181
+ tax?: number | undefined;
181
182
  trackingNumber?: string | undefined;
182
183
  couponCode?: string | undefined;
183
184
  shippingCarrier?: string | undefined;
184
- tax?: number | undefined;
185
185
  discount?: number | undefined;
186
186
  paymentGateway?: string | undefined;
187
187
  shippingCost?: number | undefined;
@@ -202,15 +202,15 @@ export declare const orderListParamsSchema: z.ZodObject<{
202
202
  perPage: z.ZodOptional<z.ZodNumber>;
203
203
  }, "strip", z.ZodTypeAny, {
204
204
  sort?: string | undefined;
205
- perPage?: number | undefined;
206
205
  page?: number | undefined;
206
+ perPage?: number | undefined;
207
207
  userId?: string | undefined;
208
208
  paymentStatus?: string | undefined;
209
209
  orderStatus?: "pending" | "processing" | "refunded" | "confirmed" | "shipped" | "delivered" | "cancelled" | "return_requested" | "returned" | undefined;
210
210
  }, {
211
211
  sort?: string | undefined;
212
- perPage?: number | undefined;
213
212
  page?: number | undefined;
213
+ perPage?: number | undefined;
214
214
  userId?: string | undefined;
215
215
  paymentStatus?: string | undefined;
216
216
  orderStatus?: "pending" | "processing" | "refunded" | "confirmed" | "shipped" | "delivered" | "cancelled" | "return_requested" | "returned" | undefined;
@@ -71,6 +71,11 @@ export interface Order {
71
71
  shippingCarrier?: string;
72
72
  notes?: string;
73
73
  timeline?: OrderTimeline[];
74
+ physicalLocation?: {
75
+ zone: string;
76
+ shelf: string;
77
+ bin: string;
78
+ };
74
79
  createdAt?: string;
75
80
  updatedAt?: string;
76
81
  }
@@ -39,8 +39,8 @@ export declare const paymentRecordSchema: z.ZodObject<{
39
39
  createdAt: z.ZodOptional<z.ZodString>;
40
40
  }, "strip", z.ZodTypeAny, {
41
41
  currency: string;
42
+ status: "pending" | "failed" | "captured" | "authorized" | "refunded" | "partially_refunded";
42
43
  id: string;
43
- status: "failed" | "captured" | "pending" | "authorized" | "refunded" | "partially_refunded";
44
44
  amount: number;
45
45
  orderId: string;
46
46
  gateway: "bank_transfer" | "upi" | "razorpay" | "stripe" | "paypal" | "cod" | "whatsapp";
@@ -52,8 +52,8 @@ export declare const paymentRecordSchema: z.ZodObject<{
52
52
  orderId: string;
53
53
  gateway: "bank_transfer" | "upi" | "razorpay" | "stripe" | "paypal" | "cod" | "whatsapp";
54
54
  currency?: string | undefined;
55
+ status?: "pending" | "failed" | "captured" | "authorized" | "refunded" | "partially_refunded" | undefined;
55
56
  createdAt?: string | undefined;
56
- status?: "failed" | "captured" | "pending" | "authorized" | "refunded" | "partially_refunded" | undefined;
57
57
  gatewayPaymentId?: string | undefined;
58
58
  }>;
59
59
  export declare const paymentGatewayConfigSchema: z.ZodObject<{
@@ -64,14 +64,14 @@ export declare const paymentGatewayConfigSchema: z.ZodObject<{
64
64
  sortOrder: z.ZodDefault<z.ZodNumber>;
65
65
  }, "strip", z.ZodTypeAny, {
66
66
  id: string;
67
+ displayName: string;
67
68
  gateway: "bank_transfer" | "upi" | "razorpay" | "stripe" | "paypal" | "cod" | "whatsapp";
68
69
  isEnabled: boolean;
69
- displayName: string;
70
70
  sortOrder: number;
71
71
  }, {
72
72
  id: string;
73
- gateway: "bank_transfer" | "upi" | "razorpay" | "stripe" | "paypal" | "cod" | "whatsapp";
74
73
  displayName: string;
74
+ gateway: "bank_transfer" | "upi" | "razorpay" | "stripe" | "paypal" | "cod" | "whatsapp";
75
75
  isEnabled?: boolean | undefined;
76
76
  sortOrder?: number | undefined;
77
77
  }>;
@@ -22,18 +22,18 @@ export declare const preorderItemSchema: z.ZodObject<{
22
22
  source: z.ZodOptional<z.ZodEnum<["upload", "youtube", "external"]>>;
23
23
  youtubeId: z.ZodOptional<z.ZodString>;
24
24
  }, "strip", z.ZodTypeAny, {
25
- type: "video" | "image" | "file";
26
25
  url: string;
27
- source?: "upload" | "youtube" | "external" | undefined;
26
+ type: "image" | "video" | "file";
28
27
  alt?: string | undefined;
29
28
  thumbnailUrl?: string | undefined;
29
+ source?: "upload" | "youtube" | "external" | undefined;
30
30
  youtubeId?: string | undefined;
31
31
  }, {
32
- type: "video" | "image" | "file";
33
32
  url: string;
34
- source?: "upload" | "youtube" | "external" | undefined;
33
+ type: "image" | "video" | "file";
35
34
  alt?: string | undefined;
36
35
  thumbnailUrl?: string | undefined;
36
+ source?: "upload" | "youtube" | "external" | undefined;
37
37
  youtubeId?: string | undefined;
38
38
  }>, "many">>;
39
39
  salePrice: z.ZodNumber;
@@ -56,11 +56,11 @@ export declare const preorderItemSchema: z.ZodObject<{
56
56
  brand?: string | undefined;
57
57
  images?: string[] | undefined;
58
58
  media?: {
59
- type: "video" | "image" | "file";
60
59
  url: string;
61
- source?: "upload" | "youtube" | "external" | undefined;
60
+ type: "image" | "video" | "file";
62
61
  alt?: string | undefined;
63
62
  thumbnailUrl?: string | undefined;
63
+ source?: "upload" | "youtube" | "external" | undefined;
64
64
  youtubeId?: string | undefined;
65
65
  }[] | undefined;
66
66
  franchise?: string | undefined;
@@ -75,11 +75,11 @@ export declare const preorderItemSchema: z.ZodObject<{
75
75
  brand?: string | undefined;
76
76
  images?: string[] | undefined;
77
77
  media?: {
78
- type: "video" | "image" | "file";
79
78
  url: string;
80
- source?: "upload" | "youtube" | "external" | undefined;
79
+ type: "image" | "video" | "file";
81
80
  alt?: string | undefined;
82
81
  thumbnailUrl?: string | undefined;
82
+ source?: "upload" | "youtube" | "external" | undefined;
83
83
  youtubeId?: string | undefined;
84
84
  }[] | undefined;
85
85
  active?: boolean | undefined;
@@ -93,7 +93,7 @@ export function PrizeDrawItemsEditor({ items, onChange, onUploadImage, onUploadV
93
93
  }), disabled: locked, placeholder: "2999" }) })] }), _jsxs(Stack, { gap: "xs", children: [_jsxs(Text, { className: "text-sm font-medium", children: ["Images (", (it.images ?? []).length, "/", MAX_IMAGES_PER_ITEM, ")"] }), _jsx(Row, { gap: "sm", className: "flex-wrap", children: Array.from({ length: MAX_IMAGES_PER_ITEM }).map((_, slot) => {
94
94
  const existing = (it.images ?? [])[slot];
95
95
  return (_jsxs(Div, { className: "w-40", children: [_jsx(ImageUpload, { currentImage: existing, label: existing ? "Replace" : `Image ${slot + 1}`, onUpload: (file) => onUploadImage(file, it.itemNumber), onChange: (url) => setImage(index, slot, url) }), existing && !locked ? (_jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => removeImage(index, slot), children: "Remove" })) : null] }, slot));
96
- }) })] }), onUploadVideo ? (_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { className: "text-sm font-medium", children: "Video (optional)" }), _jsx("input", { type: "file", accept: "video/mp4,video/webm", disabled: locked, onChange: (e) => handleVideoFileChange(e, index, it.itemNumber) }), it.video?.url ? (_jsxs(Text, { className: "text-xs text-[var(--appkit-color-text-muted)] truncate", children: ["Current: ", it.video.url] })) : null] })) : null] })] }, `prize-item-${it.itemNumber}-${index}`));
96
+ }) })] }), onUploadVideo ? (_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { className: "text-sm font-medium", children: "Video (optional)" }), _jsx("input", { type: "file", accept: "video/*", disabled: locked, onChange: (e) => handleVideoFileChange(e, index, it.itemNumber) }), it.video?.url ? (_jsxs(Text, { className: "text-xs text-[var(--appkit-color-text-muted)] truncate", children: ["Current: ", it.video.url] })) : null] })) : null] })] }, `prize-item-${it.itemNumber}-${index}`));
97
97
  }) }), items.length < MIN_ITEMS ? (_jsxs(Div, { className: "rounded border border-red-400/40 bg-red-50 px-3 py-2 text-sm text-red-900 dark:bg-red-900/30 dark:text-red-100", children: ["At least ", MIN_ITEMS, " prizes are required."] })) : null] }));
98
98
  }
99
99
  export default PrizeDrawItemsEditor;
@@ -90,7 +90,7 @@ export function ProductForm({ product, onChange, isReadonly = false, renderDescr
90
90
  name: product.title || "product",
91
91
  category: (product.categorySlugs?.[0] ?? product.category) || "uncategorized",
92
92
  store: product.storeName || "store",
93
- }), onChange: (url) => update({ mainImage: url }), label: t("formMainImage"), helperText: "Recommended: 800x800px (1:1)" })), isReadonly && product.mainImage && (_jsx(FormField, { name: "mainImage", label: t("formMainImage"), type: "text", value: product.mainImage, onChange: () => { }, disabled: true })), !isReadonly && (_jsx(MediaUploadList, { label: t("formGalleryImages"), value: galleryImages, onChange: (fields) => update({ images: fields.map((f) => f.url) }), onUpload: handleGalleryUpload, accept: "image/*", maxItems: 5, maxSizeMB: 10, helperText: t("formGalleryImagesHelper"), onAbort: onMediaAbort })), !isReadonly && (_jsx(MediaUploadField, { label: t("formVideo"), value: product.video?.url || "", onChange: (url) => update({
93
+ }), onChange: (url) => update({ mainImage: url }), label: t("formMainImage"), helperText: "Recommended: 800x800px (1:1)" })), isReadonly && product.mainImage && (_jsx(FormField, { name: "mainImage", label: t("formMainImage"), type: "text", value: product.mainImage, onChange: () => { }, disabled: true })), !isReadonly && (_jsx(MediaUploadList, { label: t("formGalleryImages"), value: galleryImages, onChange: (fields) => update({ images: fields.map((f) => f.url) }), onUpload: handleGalleryUpload, accept: "image/*,video/*", maxItems: 5, maxSizeMB: 10, helperText: t("formGalleryImagesHelper"), onAbort: onMediaAbort })), !isReadonly && (_jsx(MediaUploadField, { label: t("formVideo"), value: product.video?.url || "", onChange: (url) => update({
94
94
  video: url
95
95
  ? {
96
96
  url,
@@ -178,5 +178,23 @@ export function ProductForm({ product, onChange, isReadonly = false, renderDescr
178
178
  ? "auction"
179
179
  : isPreOrderListing(product)
180
180
  ? "preorder"
181
- : "product"), storeId: product.storeId, disabled: isReadonly }), _jsxs(Div, { children: [_jsx(Heading, { level: 3, className: "mb-1 text-sm font-semibold text-zinc-700 dark:text-zinc-300", children: "Custom Sections" }), _jsx(Text, { className: "mb-3 text-xs text-zinc-500 dark:text-zinc-400", children: "Add up to 3 custom tabs to your product page \u2014 e.g. \"Box Contents\", \"Compatibility\", \"Grading Details\"." }), _jsx(CustomSectionsEditor, { sections: product.customSections ?? [], onChange: (sections) => update({ customSections: sections }) })] }), _jsx(FormField, { name: "shippingInfo", label: t("formShipping"), type: "textarea", value: product.shippingInfo || "", onChange: (value) => update({ shippingInfo: value }), disabled: isReadonly, placeholder: "Shipping information..." }), _jsx(FormField, { name: "returnPolicy", label: t("formReturnPolicy"), type: "textarea", value: product.returnPolicy || "", onChange: (value) => update({ returnPolicy: value }), disabled: isReadonly, placeholder: "Return policy details..." }), product.storeName && (_jsx(FormField, { name: "storeName", label: t("formSeller"), type: "text", value: product.storeName, onChange: () => { }, disabled: true }))] }));
181
+ : "product"), storeId: product.storeId, disabled: isReadonly }), _jsxs(Div, { children: [_jsx(Heading, { level: 3, className: "mb-1 text-sm font-semibold text-zinc-700 dark:text-zinc-300", children: "Custom Sections" }), _jsx(Text, { className: "mb-3 text-xs text-zinc-500 dark:text-zinc-400", children: "Add up to 3 custom tabs to your product page \u2014 e.g. \"Box Contents\", \"Compatibility\", \"Grading Details\"." }), _jsx(CustomSectionsEditor, { sections: product.customSections ?? [], onChange: (sections) => update({ customSections: sections }) })] }), _jsx(FormField, { name: "shippingInfo", label: t("formShipping"), type: "textarea", value: product.shippingInfo || "", onChange: (value) => update({ shippingInfo: value }), disabled: isReadonly, placeholder: "Shipping information..." }), _jsx(FormField, { name: "returnPolicy", label: t("formReturnPolicy"), type: "textarea", value: product.returnPolicy || "", onChange: (value) => update({ returnPolicy: value }), disabled: isReadonly, placeholder: "Return policy details..." }), _jsxs(Div, { children: [_jsx(Heading, { level: 3, className: "mb-1 text-sm font-semibold text-zinc-700 dark:text-zinc-300", children: "Physical Inventory" }), _jsx(Text, { className: "mb-3 text-xs text-zinc-500 dark:text-zinc-400", children: "Assign a storage location for warehouse or shelf organisation. Used by the Print & Label Center." }), _jsxs(FormGroup, { columns: 3, children: [_jsx(FormField, { name: "physicalLocation.zone", label: "Zone", type: "text", placeholder: "e.g. A", value: product.physicalLocation?.zone ?? "", onChange: (v) => update({
182
+ physicalLocation: {
183
+ zone: v,
184
+ shelf: product.physicalLocation?.shelf ?? "",
185
+ bin: product.physicalLocation?.bin ?? "",
186
+ },
187
+ }), disabled: isReadonly }), _jsx(FormField, { name: "physicalLocation.shelf", label: "Shelf", type: "text", placeholder: "e.g. 3", value: product.physicalLocation?.shelf ?? "", onChange: (v) => update({
188
+ physicalLocation: {
189
+ zone: product.physicalLocation?.zone ?? "",
190
+ shelf: v,
191
+ bin: product.physicalLocation?.bin ?? "",
192
+ },
193
+ }), disabled: isReadonly }), _jsx(FormField, { name: "physicalLocation.bin", label: "Bin", type: "text", placeholder: "e.g. Blue", value: product.physicalLocation?.bin ?? "", onChange: (v) => update({
194
+ physicalLocation: {
195
+ zone: product.physicalLocation?.zone ?? "",
196
+ shelf: product.physicalLocation?.shelf ?? "",
197
+ bin: v,
198
+ },
199
+ }), disabled: isReadonly })] })] }), product.storeName && (_jsx(FormField, { name: "storeName", label: t("formSeller"), type: "text", value: product.storeName, onChange: () => { }, disabled: true }))] }));
182
200
  }
@@ -239,7 +239,7 @@ export declare class ProductRepository extends BaseRepository<ProductDocument> {
239
239
  /**
240
240
  * Cloud Functions: stage an atomic bid-count increment into a caller-owned WriteBatch.
241
241
  */
242
- incrementBidCountInBatch(batch: WriteBatch, productId: string, currentBid: number): void;
242
+ incrementBidCountInBatch(batch: WriteBatch, productId: string, currentBid: number, leadingBidderId?: string): void;
243
243
  /**
244
244
  * SB6-C / SB4-H — atomically bump `prizeCurrentEntries` by `count`. The
245
245
  * checkout transaction calls this after pool-cap validation; the reveal
@@ -248,6 +248,8 @@ export declare class ProductRepository extends BaseRepository<ProductDocument> {
248
248
  */
249
249
  incrementPrizeEntriesInBatch(batch: WriteBatch, productId: string, count: number): void;
250
250
  productRef(productId: string): DocumentReference;
251
+ /** Cloud Functions: returns refs for draft products older than `cutoff` (for 30-day prune). */
252
+ getStaleDraftRefs(cutoff: Date): Promise<DocumentReference[]>;
251
253
  }
252
254
  export declare class ProductsRepository extends ProductRepository {
253
255
  }
@@ -385,10 +385,11 @@ export class ProductRepository extends BaseRepository {
385
385
  /**
386
386
  * Cloud Functions: stage an atomic bid-count increment into a caller-owned WriteBatch.
387
387
  */
388
- incrementBidCountInBatch(batch, productId, currentBid) {
388
+ incrementBidCountInBatch(batch, productId, currentBid, leadingBidderId) {
389
389
  batch.update(this.db.collection(this.collection).doc(productId), {
390
390
  currentBid,
391
391
  bidCount: increment(1),
392
+ ...(leadingBidderId && { leadingBidderId }),
392
393
  // SB-UNI-H 2026-05-13 — flip `bidsHaveStarted` when any bid lands.
393
394
  // Idempotent on subsequent bids; the BIN button is hidden by the PDP
394
395
  // as soon as this is true (eBay-style hybrid auction rule).
@@ -411,6 +412,16 @@ export class ProductRepository extends BaseRepository {
411
412
  productRef(productId) {
412
413
  return this.db.collection(this.collection).doc(productId);
413
414
  }
415
+ /** Cloud Functions: returns refs for draft products older than `cutoff` (for 30-day prune). */
416
+ async getStaleDraftRefs(cutoff) {
417
+ const snap = await this.db
418
+ .collection(this.collection)
419
+ .where("status", "==", "draft")
420
+ .where("updatedAt", "<", cutoff)
421
+ .limit(200)
422
+ .get();
423
+ return snap.docs.map((d) => d.ref);
424
+ }
414
425
  }
415
426
  ProductRepository.CACHE_TTL_MS = 30000;
416
427
  ProductRepository.SIEVE_FIELDS = {
@@ -146,6 +146,7 @@ export interface ProductDocument {
146
146
  startingBid?: number;
147
147
  currentBid?: number;
148
148
  bidCount?: number;
149
+ leadingBidderId?: string;
149
150
  reservePrice?: number;
150
151
  buyNowPrice?: number;
151
152
  minBidIncrement?: number;
@@ -237,6 +238,12 @@ export interface ProductDocument {
237
238
  etaDaysMax?: number;
238
239
  }>;
239
240
  };
241
+ /** Physical storage location for inventory management (Print & Label Center). */
242
+ physicalLocation?: {
243
+ zone: string;
244
+ shelf: string;
245
+ bin: string;
246
+ };
240
247
  createdAt: Date;
241
248
  updatedAt: Date;
242
249
  }
@@ -60,18 +60,18 @@ export declare const productItemSchema: z.ZodObject<{
60
60
  source: z.ZodOptional<z.ZodEnum<["upload", "youtube", "external"]>>;
61
61
  youtubeId: z.ZodOptional<z.ZodString>;
62
62
  }, "strip", z.ZodTypeAny, {
63
- type: "video" | "image" | "file";
64
63
  url: string;
65
- source?: "upload" | "youtube" | "external" | undefined;
64
+ type: "image" | "video" | "file";
66
65
  alt?: string | undefined;
67
66
  thumbnailUrl?: string | undefined;
67
+ source?: "upload" | "youtube" | "external" | undefined;
68
68
  youtubeId?: string | undefined;
69
69
  }, {
70
- type: "video" | "image" | "file";
71
70
  url: string;
72
- source?: "upload" | "youtube" | "external" | undefined;
71
+ type: "image" | "video" | "file";
73
72
  alt?: string | undefined;
74
73
  thumbnailUrl?: string | undefined;
74
+ source?: "upload" | "youtube" | "external" | undefined;
75
75
  youtubeId?: string | undefined;
76
76
  }>, "many">>;
77
77
  video: z.ZodOptional<z.ZodObject<{
@@ -232,13 +232,13 @@ export declare const productItemSchema: z.ZodObject<{
232
232
  value: z.ZodString;
233
233
  unit: z.ZodOptional<z.ZodString>;
234
234
  }, "strip", z.ZodTypeAny, {
235
+ type: "number" | "boolean" | "url" | "text";
235
236
  value: string;
236
- type: "number" | "boolean" | "text" | "url";
237
237
  key: string;
238
238
  unit?: string | undefined;
239
239
  }, {
240
+ type: "number" | "boolean" | "url" | "text";
240
241
  value: string;
241
- type: "number" | "boolean" | "text" | "url";
242
242
  key: string;
243
243
  unit?: string | undefined;
244
244
  }>, "many">>;
@@ -252,13 +252,13 @@ export declare const productItemSchema: z.ZodObject<{
252
252
  value: z.ZodString;
253
253
  unit: z.ZodOptional<z.ZodString>;
254
254
  }, "strip", z.ZodTypeAny, {
255
+ type: "number" | "boolean" | "url" | "text";
255
256
  value: string;
256
- type: "number" | "boolean" | "text" | "url";
257
257
  key: string;
258
258
  unit?: string | undefined;
259
259
  }, {
260
+ type: "number" | "boolean" | "url" | "text";
260
261
  value: string;
261
- type: "number" | "boolean" | "text" | "url";
262
262
  key: string;
263
263
  unit?: string | undefined;
264
264
  }>, "many">>;
@@ -267,8 +267,8 @@ export declare const productItemSchema: z.ZodObject<{
267
267
  title: string;
268
268
  text?: string | undefined;
269
269
  fields?: {
270
+ type: "number" | "boolean" | "url" | "text";
270
271
  value: string;
271
- type: "number" | "boolean" | "text" | "url";
272
272
  key: string;
273
273
  unit?: string | undefined;
274
274
  }[] | undefined;
@@ -277,29 +277,28 @@ export declare const productItemSchema: z.ZodObject<{
277
277
  title: string;
278
278
  text?: string | undefined;
279
279
  fields?: {
280
+ type: "number" | "boolean" | "url" | "text";
280
281
  value: string;
281
- type: "number" | "boolean" | "text" | "url";
282
282
  key: string;
283
283
  unit?: string | undefined;
284
284
  }[] | undefined;
285
285
  }>, "many">>;
286
286
  }, "strip", z.ZodTypeAny, {
287
- id: string;
288
287
  status: "draft" | "published" | "archived" | "sold" | "out_of_stock" | "discontinued";
288
+ id: string;
289
289
  title: string;
290
290
  price: number;
291
291
  currency?: string | undefined;
292
- createdAt?: string | undefined;
293
- updatedAt?: string | undefined;
294
- storeId?: string | undefined;
295
292
  video?: {
296
293
  url: string;
297
294
  thumbnailUrl?: string | undefined;
298
295
  } | undefined;
296
+ storeId?: string | undefined;
299
297
  category?: string | undefined;
300
298
  featured?: boolean | undefined;
301
299
  listingType?: "standard" | "auction" | "pre-order" | "prize-draw" | "bundle" | undefined;
302
300
  isPromoted?: boolean | undefined;
301
+ createdAt?: string | undefined;
303
302
  description?: string | undefined;
304
303
  slug?: string | undefined;
305
304
  subcategory?: string | undefined;
@@ -351,8 +350,8 @@ export declare const productItemSchema: z.ZodObject<{
351
350
  allowOffers?: boolean | undefined;
352
351
  minOfferPercent?: number | undefined;
353
352
  customFields?: {
353
+ type: "number" | "boolean" | "url" | "text";
354
354
  value: string;
355
- type: "number" | "boolean" | "text" | "url";
356
355
  key: string;
357
356
  unit?: string | undefined;
358
357
  }[] | undefined;
@@ -361,8 +360,8 @@ export declare const productItemSchema: z.ZodObject<{
361
360
  title: string;
362
361
  text?: string | undefined;
363
362
  fields?: {
363
+ type: "number" | "boolean" | "url" | "text";
364
364
  value: string;
365
- type: "number" | "boolean" | "text" | "url";
366
365
  key: string;
367
366
  unit?: string | undefined;
368
367
  }[] | undefined;
@@ -388,15 +387,16 @@ export declare const productItemSchema: z.ZodObject<{
388
387
  prizeCurrentEntries?: number | undefined;
389
388
  prizeRevealWindowStart?: string | Date | undefined;
390
389
  prizeRevealWindowEnd?: string | Date | undefined;
391
- prizeRevealStatus?: "pending" | "closed" | "open" | undefined;
390
+ prizeRevealStatus?: "pending" | "open" | "closed" | undefined;
392
391
  prizeRevealDeadlineDays?: number | undefined;
393
392
  prizeGithubFileUrl?: string | undefined;
393
+ updatedAt?: string | undefined;
394
394
  media?: {
395
- type: "video" | "image" | "file";
396
395
  url: string;
397
- source?: "upload" | "youtube" | "external" | undefined;
396
+ type: "image" | "video" | "file";
398
397
  alt?: string | undefined;
399
398
  thumbnailUrl?: string | undefined;
399
+ source?: "upload" | "youtube" | "external" | undefined;
400
400
  youtubeId?: string | undefined;
401
401
  }[] | undefined;
402
402
  inStock?: boolean | undefined;
@@ -413,22 +413,21 @@ export declare const productItemSchema: z.ZodObject<{
413
413
  } | undefined;
414
414
  publishedAt?: string | undefined;
415
415
  }, {
416
- id: string;
417
416
  status: "draft" | "published" | "archived" | "sold" | "out_of_stock" | "discontinued";
417
+ id: string;
418
418
  title: string;
419
419
  price: number;
420
420
  currency?: string | undefined;
421
- createdAt?: string | undefined;
422
- updatedAt?: string | undefined;
423
- storeId?: string | undefined;
424
421
  video?: {
425
422
  url: string;
426
423
  thumbnailUrl?: string | undefined;
427
424
  } | undefined;
425
+ storeId?: string | undefined;
428
426
  category?: string | undefined;
429
427
  featured?: boolean | undefined;
430
428
  listingType?: "standard" | "auction" | "pre-order" | "prize-draw" | "bundle" | undefined;
431
429
  isPromoted?: boolean | undefined;
430
+ createdAt?: string | undefined;
432
431
  description?: string | undefined;
433
432
  slug?: string | undefined;
434
433
  subcategory?: string | undefined;
@@ -480,8 +479,8 @@ export declare const productItemSchema: z.ZodObject<{
480
479
  allowOffers?: boolean | undefined;
481
480
  minOfferPercent?: number | undefined;
482
481
  customFields?: {
482
+ type: "number" | "boolean" | "url" | "text";
483
483
  value: string;
484
- type: "number" | "boolean" | "text" | "url";
485
484
  key: string;
486
485
  unit?: string | undefined;
487
486
  }[] | undefined;
@@ -490,8 +489,8 @@ export declare const productItemSchema: z.ZodObject<{
490
489
  title: string;
491
490
  text?: string | undefined;
492
491
  fields?: {
492
+ type: "number" | "boolean" | "url" | "text";
493
493
  value: string;
494
- type: "number" | "boolean" | "text" | "url";
495
494
  key: string;
496
495
  unit?: string | undefined;
497
496
  }[] | undefined;
@@ -517,15 +516,16 @@ export declare const productItemSchema: z.ZodObject<{
517
516
  prizeCurrentEntries?: number | undefined;
518
517
  prizeRevealWindowStart?: string | Date | undefined;
519
518
  prizeRevealWindowEnd?: string | Date | undefined;
520
- prizeRevealStatus?: "pending" | "closed" | "open" | undefined;
519
+ prizeRevealStatus?: "pending" | "open" | "closed" | undefined;
521
520
  prizeRevealDeadlineDays?: number | undefined;
522
521
  prizeGithubFileUrl?: string | undefined;
522
+ updatedAt?: string | undefined;
523
523
  media?: {
524
- type: "video" | "image" | "file";
525
524
  url: string;
526
- source?: "upload" | "youtube" | "external" | undefined;
525
+ type: "image" | "video" | "file";
527
526
  alt?: string | undefined;
528
527
  thumbnailUrl?: string | undefined;
528
+ source?: "upload" | "youtube" | "external" | undefined;
529
529
  youtubeId?: string | undefined;
530
530
  }[] | undefined;
531
531
  inStock?: boolean | undefined;
@@ -558,30 +558,30 @@ export declare const productListParamsSchema: z.ZodObject<{
558
558
  perPage: z.ZodOptional<z.ZodNumber>;
559
559
  featured: z.ZodOptional<z.ZodBoolean>;
560
560
  }, "strip", z.ZodTypeAny, {
561
+ status?: "draft" | "published" | "archived" | "sold" | "out_of_stock" | "discontinued" | undefined;
561
562
  sort?: string | undefined;
562
- perPage?: number | undefined;
563
563
  storeId?: string | undefined;
564
- status?: "draft" | "published" | "archived" | "sold" | "out_of_stock" | "discontinued" | undefined;
565
- q?: string | undefined;
566
564
  category?: string | undefined;
567
565
  featured?: boolean | undefined;
568
566
  listingType?: "standard" | "auction" | "pre-order" | "prize-draw" | "bundle" | undefined;
569
567
  condition?: "new" | "used" | "refurbished" | "broken" | "like_new" | "good" | "fair" | "poor" | undefined;
568
+ q?: string | undefined;
570
569
  page?: number | undefined;
570
+ perPage?: number | undefined;
571
571
  minPrice?: number | undefined;
572
572
  maxPrice?: number | undefined;
573
573
  inStock?: boolean | undefined;
574
574
  }, {
575
+ status?: "draft" | "published" | "archived" | "sold" | "out_of_stock" | "discontinued" | undefined;
575
576
  sort?: string | undefined;
576
- perPage?: number | undefined;
577
577
  storeId?: string | undefined;
578
- status?: "draft" | "published" | "archived" | "sold" | "out_of_stock" | "discontinued" | undefined;
579
- q?: string | undefined;
580
578
  category?: string | undefined;
581
579
  featured?: boolean | undefined;
582
580
  listingType?: "standard" | "auction" | "pre-order" | "prize-draw" | "bundle" | undefined;
583
581
  condition?: "new" | "used" | "refurbished" | "broken" | "like_new" | "good" | "fair" | "poor" | undefined;
582
+ q?: string | undefined;
584
583
  page?: number | undefined;
584
+ perPage?: number | undefined;
585
585
  minPrice?: number | undefined;
586
586
  maxPrice?: number | undefined;
587
587
  inStock?: boolean | undefined;
@@ -22,9 +22,9 @@ export declare const productFeatureAdminCreateSchema: z.ZodObject<{
22
22
  isActive: z.ZodBoolean;
23
23
  displayOrder: z.ZodNumber;
24
24
  }, "strip", z.ZodTypeAny, {
25
+ category: "seller" | "custom" | "auction" | "condition" | "shipping" | "preorder" | "platform";
25
26
  label: string;
26
27
  scope: "store" | "platform";
27
- category: "seller" | "custom" | "auction" | "condition" | "shipping" | "preorder" | "platform";
28
28
  icon: string;
29
29
  isActive: boolean;
30
30
  displayOrder: number;
@@ -33,9 +33,9 @@ export declare const productFeatureAdminCreateSchema: z.ZodObject<{
33
33
  description?: string | undefined;
34
34
  iconColor?: string | undefined;
35
35
  }, {
36
+ category: "seller" | "custom" | "auction" | "condition" | "shipping" | "preorder" | "platform";
36
37
  label: string;
37
38
  scope: "store" | "platform";
38
- category: "seller" | "custom" | "auction" | "condition" | "shipping" | "preorder" | "platform";
39
39
  icon: string;
40
40
  isActive: boolean;
41
41
  displayOrder: number;
@@ -55,8 +55,8 @@ export declare const productFeatureStoreCreateSchema: z.ZodObject<{
55
55
  isActive: z.ZodBoolean;
56
56
  displayOrder: z.ZodNumber;
57
57
  }, "strip", z.ZodTypeAny, {
58
- label: string;
59
58
  category: "seller" | "custom" | "auction" | "condition" | "shipping" | "preorder" | "platform";
59
+ label: string;
60
60
  icon: string;
61
61
  isActive: boolean;
62
62
  displayOrder: number;
@@ -64,8 +64,8 @@ export declare const productFeatureStoreCreateSchema: z.ZodObject<{
64
64
  description?: string | undefined;
65
65
  iconColor?: string | undefined;
66
66
  }, {
67
- label: string;
68
67
  category: "seller" | "custom" | "auction" | "condition" | "shipping" | "preorder" | "platform";
68
+ label: string;
69
69
  icon: string;
70
70
  isActive: boolean;
71
71
  displayOrder: number;
@@ -84,18 +84,18 @@ export declare const productFeatureUpdateSchema: z.ZodObject<{
84
84
  isActive: z.ZodOptional<z.ZodBoolean>;
85
85
  displayOrder: z.ZodOptional<z.ZodNumber>;
86
86
  }, "strip", z.ZodTypeAny, {
87
- label?: string | undefined;
88
87
  category?: "seller" | "custom" | "auction" | "condition" | "shipping" | "preorder" | "platform" | undefined;
89
88
  description?: string | undefined;
89
+ label?: string | undefined;
90
90
  icon?: string | undefined;
91
91
  isActive?: boolean | undefined;
92
92
  iconColor?: string | undefined;
93
93
  displayOrder?: number | undefined;
94
94
  productTypes?: ("auction" | "prize-draw" | "classified" | "digital-code" | "live" | "all" | "product" | "preorder")[] | undefined;
95
95
  }, {
96
- label?: string | undefined;
97
96
  category?: "seller" | "custom" | "auction" | "condition" | "shipping" | "preorder" | "platform" | undefined;
98
97
  description?: string | undefined;
98
+ label?: string | undefined;
99
99
  icon?: string | undefined;
100
100
  isActive?: boolean | undefined;
101
101
  iconColor?: string | undefined;
@@ -139,6 +139,12 @@ export interface ProductItem {
139
139
  insuranceCost?: number;
140
140
  customFields?: CustomField[];
141
141
  customSections?: CustomSection[];
142
+ /** Physical storage location set in the Print & Label Center. */
143
+ physicalLocation?: {
144
+ zone: string;
145
+ shelf: string;
146
+ bin: string;
147
+ };
142
148
  }
143
149
  export interface ProductListResponse {
144
150
  items: ProductItem[];