@mohasinac/appkit 3.8.2 → 3.9.1

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 (508) hide show
  1. package/dist/_internal/client/features/live/LiveItemDetailView.js +2 -2
  2. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +4 -4
  3. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +8 -8
  4. package/dist/_internal/client/features/lottery/LotteryAdminSlotView.d.ts +1 -1
  5. package/dist/_internal/client/features/lottery/LotteryAdminSlotView.js +2 -2
  6. package/dist/_internal/server/features/bundles/actions.js +2 -2
  7. package/dist/_internal/server/features/bundles/og.d.ts +1 -1
  8. package/dist/_internal/server/features/bundles/og.js +4 -5
  9. package/dist/_internal/server/features/checkout/actions.js +57 -21
  10. package/dist/_internal/server/features/checkout/stock-restore.d.ts +19 -0
  11. package/dist/_internal/server/features/checkout/stock-restore.js +80 -0
  12. package/dist/_internal/server/features/checkout/upi-resolution.d.ts +11 -0
  13. package/dist/_internal/server/features/checkout/upi-resolution.js +28 -0
  14. package/dist/_internal/server/features/classified/og.js +1 -1
  15. package/dist/_internal/server/features/digital-code/og.js +1 -1
  16. package/dist/_internal/server/features/item-requests/og.d.ts +2 -2
  17. package/dist/_internal/server/features/item-requests/og.js +4 -5
  18. package/dist/_internal/server/features/live/og.js +1 -1
  19. package/dist/_internal/server/features/lottery/adapters.d.ts +2 -2
  20. package/dist/_internal/server/features/lottery/adapters.js +1 -1
  21. package/dist/_internal/server/features/orders/actions.d.ts +28 -0
  22. package/dist/_internal/server/features/orders/actions.js +239 -4
  23. package/dist/_internal/server/features/orders/adapters.js +3 -0
  24. package/dist/_internal/server/features/payments/data.js +3 -2
  25. package/dist/_internal/server/features/payouts/actions.d.ts +2 -2
  26. package/dist/_internal/server/features/payouts/actions.js +4 -3
  27. package/dist/_internal/server/features/pre-orders/service.d.ts +1 -1
  28. package/dist/_internal/server/features/pre-orders/service.js +3 -2
  29. package/dist/_internal/server/features/prize-draws/og.js +5 -5
  30. package/dist/_internal/server/features/products/og.js +1 -1
  31. package/dist/_internal/server/features/promotions/service.js +3 -1
  32. package/dist/_internal/server/features/refunds/actions.d.ts +2 -2
  33. package/dist/_internal/server/features/refunds/actions.js +7 -6
  34. package/dist/_internal/server/functions/firestore.js +1 -1
  35. package/dist/_internal/server/functions/scheduled.d.ts +4 -1
  36. package/dist/_internal/server/functions/scheduled.js +26 -2
  37. package/dist/_internal/server/jobs/core/emiInstallmentReminder.js +1 -1
  38. package/dist/_internal/server/jobs/core/hardBanCascade.d.ts +4 -0
  39. package/dist/_internal/server/jobs/core/hardBanCascade.js +15 -4
  40. package/dist/_internal/server/jobs/core/hardBanReinstatement.d.ts +16 -0
  41. package/dist/_internal/server/jobs/core/hardBanReinstatement.js +63 -0
  42. package/dist/_internal/server/jobs/core/jobRunners.js +3 -1
  43. package/dist/_internal/server/jobs/core/onScamReportCreate.js +1 -1
  44. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.d.ts +10 -0
  45. package/dist/_internal/server/jobs/core/paymentReviewAutoApprove.js +60 -0
  46. package/dist/_internal/server/jobs/core/paymentWindowTimeout.d.ts +15 -0
  47. package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +59 -0
  48. package/dist/_internal/server/jobs/core/pendingOrderTimeout.d.ts +7 -0
  49. package/dist/_internal/server/jobs/core/pendingOrderTimeout.js +32 -6
  50. package/dist/_internal/server/jobs/handlers/hardBanReinstatement.d.ts +2 -0
  51. package/dist/_internal/server/jobs/handlers/hardBanReinstatement.js +2 -0
  52. package/dist/_internal/server/jobs/handlers/index.d.ts +3 -0
  53. package/dist/_internal/server/jobs/handlers/index.js +3 -0
  54. package/dist/_internal/server/jobs/handlers/messages.d.ts +4 -0
  55. package/dist/_internal/server/jobs/handlers/messages.js +4 -0
  56. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.d.ts +3 -3
  57. package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +12 -12
  58. package/dist/_internal/server/jobs/handlers/onShipmentItemWrite.d.ts +1 -1
  59. package/dist/_internal/server/jobs/handlers/onShipmentItemWrite.js +5 -5
  60. package/dist/_internal/server/jobs/handlers/paymentReviewAutoApprove.d.ts +2 -0
  61. package/dist/_internal/server/jobs/handlers/paymentReviewAutoApprove.js +2 -0
  62. package/dist/_internal/server/jobs/handlers/paymentWindowTimeout.d.ts +2 -0
  63. package/dist/_internal/server/jobs/handlers/paymentWindowTimeout.js +2 -0
  64. package/dist/_internal/shared/actions/action-registry.js +27 -0
  65. package/dist/_internal/shared/checkout/order-math.js +3 -2
  66. package/dist/_internal/shared/checkout/rules/_defaults.js +1 -0
  67. package/dist/_internal/shared/checkout/rules/preorder.rule.js +7 -0
  68. package/dist/_internal/shared/checkout/rules/prize-draw.rule.js +7 -0
  69. package/dist/_internal/shared/checkout/rules/types.d.ts +11 -0
  70. package/dist/_internal/shared/features/auctions/errors.js +1 -1
  71. package/dist/_internal/shared/features/categories/bundle-copy.d.ts +0 -1
  72. package/dist/_internal/shared/features/categories/bundle-copy.js +0 -1
  73. package/dist/_internal/shared/features/categories/bundle-schemas.d.ts +6 -6
  74. package/dist/_internal/shared/features/categories/bundle-schemas.js +2 -2
  75. package/dist/_internal/shared/features/checkout/config.d.ts +3 -3
  76. package/dist/_internal/shared/features/checkout/config.js +3 -3
  77. package/dist/_internal/shared/features/emi/schedule.d.ts +6 -6
  78. package/dist/_internal/shared/features/emi/schedule.js +10 -9
  79. package/dist/_internal/shared/features/promotions/errors.js +1 -1
  80. package/dist/_internal/shared/fees/calculator.d.ts +5 -5
  81. package/dist/_internal/shared/fees/calculator.js +19 -19
  82. package/dist/client.d.ts +1 -1
  83. package/dist/client.js +1 -1
  84. package/dist/constants/api-endpoints.d.ts +9 -0
  85. package/dist/constants/api-endpoints.js +3 -0
  86. package/dist/constants/field-names.d.ts +4 -0
  87. package/dist/constants/field-names.js +4 -0
  88. package/dist/features/admin/components/AdminArtView.js +2 -2
  89. package/dist/features/admin/components/AdminBidsView.js +2 -2
  90. package/dist/features/admin/components/AdminBundleEditorView.d.ts +1 -1
  91. package/dist/features/admin/components/AdminBundleEditorView.js +8 -8
  92. package/dist/features/admin/components/AdminBundlesView.js +6 -6
  93. package/dist/features/admin/components/AdminClassifiedView.js +2 -2
  94. package/dist/features/admin/components/AdminDigitalCodesView.js +2 -2
  95. package/dist/features/admin/components/AdminLiveView.js +2 -2
  96. package/dist/features/admin/components/AdminOrderEditorView.d.ts +6 -1
  97. package/dist/features/admin/components/AdminOrderEditorView.js +45 -5
  98. package/dist/features/admin/components/AdminOrdersView.js +8 -3
  99. package/dist/features/admin/components/AdminPayoutsView.js +2 -2
  100. package/dist/features/admin/components/AdminPrizeDrawsView.js +2 -2
  101. package/dist/features/admin/components/AdminReturnRequestsView.js +2 -2
  102. package/dist/features/admin/components/AdminSectionsView.js +4 -4
  103. package/dist/features/admin/components/AdminSiteSettingsView.js +11 -11
  104. package/dist/features/admin/components/AdminStickersView.js +2 -2
  105. package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
  106. package/dist/features/admin/components/sections/adminSectionsBuildParse.js +13 -5
  107. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +4 -0
  108. package/dist/features/admin/components/sections/adminSectionsTypes.js +9 -5
  109. package/dist/features/admin/hooks/useAdminListingData.d.ts +1 -1
  110. package/dist/features/admin/hooks/useAdminListingData.js +3 -2
  111. package/dist/features/admin/schemas/firestore.d.ts +9 -7
  112. package/dist/features/admin/schemas/firestore.js +4 -3
  113. package/dist/features/auctions/components/AuctionBidsTable.js +3 -3
  114. package/dist/features/auth/checkout-value-otp.d.ts +46 -0
  115. package/dist/features/auth/checkout-value-otp.js +73 -0
  116. package/dist/features/auth/repository/user.repository.d.ts +6 -0
  117. package/dist/features/auth/repository/user.repository.js +19 -0
  118. package/dist/features/auth/schemas/firestore.d.ts +10 -0
  119. package/dist/features/auth/schemas/firestore.js +2 -0
  120. package/dist/features/cart/actions/cart-actions.d.ts +1 -1
  121. package/dist/features/cart/actions/cart-actions.js +4 -4
  122. package/dist/features/cart/components/CartView.d.ts +2 -2
  123. package/dist/features/cart/components/ShippingPicker.d.ts +4 -4
  124. package/dist/features/cart/components/ShippingPicker.js +11 -11
  125. package/dist/features/cart/repository/cart.repository.d.ts +1 -1
  126. package/dist/features/cart/repository/cart.repository.js +2 -2
  127. package/dist/features/cart/schemas/firestore.d.ts +2 -2
  128. package/dist/features/catalogue/components/CatalogueItemEditorView.js +3 -3
  129. package/dist/features/catalogue/components/PublicCatalogueView.js +2 -2
  130. package/dist/features/catalogue/schemas/validation.js +1 -1
  131. package/dist/features/categories/components/BundleCollage.js +2 -2
  132. package/dist/features/categories/components/BundleDetailView.js +2 -2
  133. package/dist/features/categories/components/BundleItemsPicker.d.ts +1 -1
  134. package/dist/features/categories/components/BundleItemsPicker.js +2 -2
  135. package/dist/features/categories/components/CategoryBundlesListing.js +2 -2
  136. package/dist/features/categories/schemas/firestore.d.ts +1 -1
  137. package/dist/features/categories/schemas/index.d.ts +3 -3
  138. package/dist/features/categories/schemas/index.js +2 -2
  139. package/dist/features/checkout/actions/checkout-value-otp-actions.d.ts +16 -0
  140. package/dist/features/checkout/actions/checkout-value-otp-actions.js +83 -0
  141. package/dist/features/checkout/actions/index.d.ts +1 -0
  142. package/dist/features/checkout/actions/index.js +1 -0
  143. package/dist/features/checkout/schemas/firestore.d.ts +1 -1
  144. package/dist/features/classified/components/index.d.ts +0 -4
  145. package/dist/features/classified/components/index.js +0 -2
  146. package/dist/features/digital-codes/components/index.d.ts +0 -4
  147. package/dist/features/digital-codes/components/index.js +0 -2
  148. package/dist/features/events/schemas/index.d.ts +1 -1
  149. package/dist/features/events/schemas/index.js +1 -1
  150. package/dist/features/homepage/components/BrandsSection.d.ts +4 -1
  151. package/dist/features/homepage/components/BrandsSection.js +2 -2
  152. package/dist/features/homepage/components/CustomCardsSection.js +3 -3
  153. package/dist/features/homepage/components/CustomerReviewsSection.d.ts +4 -1
  154. package/dist/features/homepage/components/CustomerReviewsSection.js +2 -2
  155. package/dist/features/homepage/components/EventsSection.d.ts +4 -1
  156. package/dist/features/homepage/components/EventsSection.js +2 -2
  157. package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +2 -1
  158. package/dist/features/homepage/components/FeaturedAuctionsSection.js +2 -2
  159. package/dist/features/homepage/components/FeaturedBundlesSection.js +2 -2
  160. package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +2 -1
  161. package/dist/features/homepage/components/FeaturedPreOrdersSection.js +2 -2
  162. package/dist/features/homepage/components/FeaturedProductsSection.d.ts +2 -1
  163. package/dist/features/homepage/components/FeaturedProductsSection.js +2 -2
  164. package/dist/features/homepage/components/FeaturedStoresSection.d.ts +4 -1
  165. package/dist/features/homepage/components/FeaturedStoresSection.js +2 -2
  166. package/dist/features/homepage/components/HomepageCustomerReviewsSection.d.ts +4 -1
  167. package/dist/features/homepage/components/HomepageCustomerReviewsSection.js +2 -2
  168. package/dist/features/homepage/components/SectionCarousel.d.ts +3 -1
  169. package/dist/features/homepage/components/SectionCarousel.js +2 -2
  170. package/dist/features/homepage/components/ShopByCategorySection.d.ts +4 -1
  171. package/dist/features/homepage/components/ShopByCategorySection.js +2 -2
  172. package/dist/features/homepage/lib/section-renderer.js +9 -9
  173. package/dist/features/homepage/schemas/firestore.d.ts +8 -0
  174. package/dist/features/live/components/index.d.ts +0 -4
  175. package/dist/features/live/components/index.js +0 -2
  176. package/dist/features/lottery/types/index.d.ts +3 -3
  177. package/dist/features/lottery/types/index.js +5 -5
  178. package/dist/features/orders/components/OrderPaymentSummary.js +2 -2
  179. package/dist/features/orders/components/OrderSiblingPayments.js +1 -1
  180. package/dist/features/orders/components/RefundHistoryTable.js +1 -1
  181. package/dist/features/orders/components/RefundRequestView.js +1 -1
  182. package/dist/features/orders/constants/payment-window.d.ts +10 -0
  183. package/dist/features/orders/constants/payment-window.js +10 -0
  184. package/dist/features/orders/repository/orders.repository.d.ts +25 -0
  185. package/dist/features/orders/repository/orders.repository.js +50 -1
  186. package/dist/features/orders/schemas/firestore.d.ts +50 -2
  187. package/dist/features/orders/schemas/index.d.ts +24 -24
  188. package/dist/features/orders/schemas/index.js +20 -20
  189. package/dist/features/orders/types/index.d.ts +4 -0
  190. package/dist/features/orders/utils/bundle-grouping.d.ts +1 -1
  191. package/dist/features/orders/utils/bundle-grouping.js +1 -1
  192. package/dist/features/payments/schemas/index.d.ts +10 -10
  193. package/dist/features/payments/schemas/index.js +9 -9
  194. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +2 -2
  195. package/dist/features/products/components/ArtStickersListView.d.ts +7 -0
  196. package/dist/features/products/components/ArtStickersListView.js +57 -0
  197. package/dist/features/products/components/GroupSettingsPanel.js +1 -1
  198. package/dist/features/products/components/MakeOfferButton.js +3 -3
  199. package/dist/features/products/components/MarketplaceBundleCard.d.ts +1 -1
  200. package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
  201. package/dist/features/products/components/PrizeDrawCollage.js +2 -2
  202. package/dist/features/products/components/PrizeDrawItemsEditor.js +2 -2
  203. package/dist/features/products/components/PrizeRevealModal.js +1 -1
  204. package/dist/features/products/components/ProductDetailPageView.js +2 -9
  205. package/dist/features/products/components/ProductForm.js +2 -2
  206. package/dist/features/products/components/ProductGrid.js +2 -2
  207. package/dist/features/products/components/ProductsIndexListing.d.ts +13 -1
  208. package/dist/features/products/components/ProductsIndexListing.js +7 -5
  209. package/dist/features/products/components/ProductsIndexPageView.js +6 -1
  210. package/dist/features/products/constants/listing-tabs.d.ts +42 -17
  211. package/dist/features/products/constants/listing-tabs.js +25 -6
  212. package/dist/features/products/schemas/catalog-product.d.ts +5 -5
  213. package/dist/features/products/schemas/catalog-product.js +1 -1
  214. package/dist/features/products/schemas/firestore.d.ts +5 -5
  215. package/dist/features/products/schemas/firestore.js +2 -2
  216. package/dist/features/products/types/index.d.ts +5 -2
  217. package/dist/features/promotions/components/CouponCard.js +2 -2
  218. package/dist/features/promotions/schemas/firestore.d.ts +2 -0
  219. package/dist/features/promotions/schemas/firestore.js +1 -0
  220. package/dist/features/promotions/schemas/index.d.ts +14 -14
  221. package/dist/features/promotions/schemas/index.js +6 -6
  222. package/dist/features/scams/components/ScamProfileView.js +3 -7
  223. package/dist/features/scams/components/ScamRegistryView.js +2 -6
  224. package/dist/features/scams/schemas/firestore.d.ts +1 -1
  225. package/dist/features/search/components/Search.d.ts +1 -1
  226. package/dist/features/seller/actions/offer-actions.js +1 -1
  227. package/dist/features/seller/components/PrintCenterView.js +2 -2
  228. package/dist/features/seller/components/QuickProductForm.js +5 -5
  229. package/dist/features/seller/components/SellerArtView.js +2 -2
  230. package/dist/features/seller/components/SellerAuctionsView.js +2 -2
  231. package/dist/features/seller/components/SellerBidsView.js +2 -2
  232. package/dist/features/seller/components/SellerBundlesView.js +6 -6
  233. package/dist/features/seller/components/SellerClassifiedView.js +2 -2
  234. package/dist/features/seller/components/SellerDigitalCodesView.js +2 -2
  235. package/dist/features/seller/components/SellerLiveView.js +2 -2
  236. package/dist/features/seller/components/SellerOffersView.js +2 -2
  237. package/dist/features/seller/components/SellerOrdersView.js +3 -3
  238. package/dist/features/seller/components/SellerPayoutRequestView.js +2 -2
  239. package/dist/features/seller/components/SellerPayoutSettingsView.js +2 -2
  240. package/dist/features/seller/components/SellerPayoutsView.js +2 -2
  241. package/dist/features/seller/components/SellerPreOrdersView.js +2 -2
  242. package/dist/features/seller/components/SellerPrizeDrawsView.js +2 -2
  243. package/dist/features/seller/components/SellerProductShell.js +8 -8
  244. package/dist/features/seller/components/SellerProductsView.js +1 -1
  245. package/dist/features/seller/components/SellerShippingView.js +6 -6
  246. package/dist/features/seller/components/SellerStickersView.js +2 -2
  247. package/dist/features/seller/hooks/useSellerListingData.d.ts +1 -1
  248. package/dist/features/seller/hooks/useSellerListingData.js +3 -2
  249. package/dist/features/shipments/components/AdminShipmentEditorView.js +10 -10
  250. package/dist/features/shipments/components/AdminShipmentLotItemsView.js +4 -4
  251. package/dist/features/shipments/components/AdminShipmentProjectionsView.js +5 -5
  252. package/dist/features/shipments/components/AdminShipmentsView.js +4 -4
  253. package/dist/features/shipments/repository/shipment-lots.repository.d.ts +2 -2
  254. package/dist/features/shipments/repository/shipment-lots.repository.js +8 -8
  255. package/dist/features/shipments/schemas/firestore.d.ts +21 -21
  256. package/dist/features/shipments/schemas/firestore.js +9 -9
  257. package/dist/features/shipments/schemas/validation.d.ts +30 -30
  258. package/dist/features/shipments/schemas/validation.js +6 -6
  259. package/dist/features/shipments/utils/cost-allocation.d.ts +5 -5
  260. package/dist/features/shipments/utils/cost-allocation.js +39 -38
  261. package/dist/features/store-extensions/schemas/firestore.d.ts +5 -5
  262. package/dist/features/stores/components/StoreDetailLayoutView.js +9 -13
  263. package/dist/features/stores/schemas/firestore.d.ts +7 -7
  264. package/dist/features/stores/schemas/index.d.ts +84 -84
  265. package/dist/features/stores/schemas/index.js +5 -5
  266. package/dist/features/tester/seed-data/categories-tester-seed-data.js +1 -1
  267. package/dist/features/tester/seed-data/products-tester-seed-data.js +6 -6
  268. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +9 -2
  269. package/dist/features/whatsapp-bot/helpers/whatsapp.d.ts +8 -1
  270. package/dist/features/whatsapp-bot/helpers/whatsapp.js +13 -2
  271. package/dist/features/whatsapp-bot/types/index.d.ts +9 -1
  272. package/dist/index.d.ts +3 -7
  273. package/dist/index.js +7 -5
  274. package/dist/next/routing/route-map.d.ts +2 -0
  275. package/dist/next/routing/route-map.js +6 -0
  276. package/dist/schemas/firestore-helpers.d.ts +2 -2
  277. package/dist/schemas/firestore-helpers.js +2 -2
  278. package/dist/schemas/registry.d.ts +73 -73
  279. package/dist/seed/bids-seed-data.js +6 -6
  280. package/dist/seed/blog-posts-seed-data.js +1 -0
  281. package/dist/seed/cart-seed-data.js +13 -13
  282. package/dist/seed/catalogue-seed-data.js +6 -6
  283. package/dist/seed/categories-seed-data.js +5 -5
  284. package/dist/seed/claimed-coupons-seed-data.js +3 -3
  285. package/dist/seed/coupons-seed-data.js +20 -20
  286. package/dist/seed/events-seed-data.js +27 -27
  287. package/dist/seed/factories/bid.factory.js +1 -1
  288. package/dist/seed/faq-seed-data.js +20 -1
  289. package/dist/seed/grouped-listings-seed-data.d.ts +2 -2
  290. package/dist/seed/grouped-listings-seed-data.js +3 -3
  291. package/dist/seed/homepage-sections-seed-data.js +10 -0
  292. package/dist/seed/offers-seed-data.js +19 -19
  293. package/dist/seed/orders-seed-data.js +29 -29
  294. package/dist/seed/payouts-seed-data.js +7 -7
  295. package/dist/seed/products-auctions-seed-data.js +6 -6
  296. package/dist/seed/products-preorders-seed-data.d.ts +2 -2
  297. package/dist/seed/products-preorders-seed-data.js +1 -1
  298. package/dist/seed/products-standard-seed-data.js +8 -8
  299. package/dist/seed/scammers-seed-data.js +2 -2
  300. package/dist/seed/shipments-seed-data.js +29 -29
  301. package/dist/seed/site-settings-seed-data.js +3 -2
  302. package/dist/seed/store-extensions-seed-data.js +8 -8
  303. package/dist/seed/stores-seed-data.js +37 -8
  304. package/dist/seed/users-seed-data.js +38 -1
  305. package/dist/server-entry.d.ts +1 -3
  306. package/dist/server-entry.js +1 -3
  307. package/dist/server.d.ts +2 -1
  308. package/dist/server.js +3 -1
  309. package/dist/ui/components/HorizontalScroller.js +3 -0
  310. package/dist/ui/components/PriceDisplay.js +3 -12
  311. package/dist/utils/number.formatter.d.ts +2 -7
  312. package/dist/utils/number.formatter.js +3 -8
  313. package/package.json +1 -1
  314. package/scripts/seed-cli.mjs +8 -3
  315. package/dist/_internal/client/scaffolds/DashboardScaffold.d.ts +0 -34
  316. package/dist/_internal/client/scaffolds/DashboardScaffold.js +0 -26
  317. package/dist/_internal/client/theme/__tests__/ThemeProvider.test.d.ts +0 -1
  318. package/dist/_internal/client/theme/__tests__/ThemeProvider.test.js +0 -109
  319. package/dist/_internal/server/features/auctions/__tests__/service.test.d.ts +0 -1
  320. package/dist/_internal/server/features/auctions/__tests__/service.test.js +0 -140
  321. package/dist/_internal/server/features/checkout/__tests__/actions.test.d.ts +0 -1
  322. package/dist/_internal/server/features/checkout/__tests__/actions.test.js +0 -600
  323. package/dist/_internal/server/features/refunds/__tests__/actions.test.d.ts +0 -1
  324. package/dist/_internal/server/features/refunds/__tests__/actions.test.js +0 -263
  325. package/dist/_internal/server/jobs/core/__tests__/auctionSettlement.test.d.ts +0 -1
  326. package/dist/_internal/server/jobs/core/__tests__/auctionSettlement.test.js +0 -249
  327. package/dist/_internal/server/jobs/core/__tests__/couponExpiry.test.d.ts +0 -1
  328. package/dist/_internal/server/jobs/core/__tests__/couponExpiry.test.js +0 -65
  329. package/dist/_internal/server/jobs/core/__tests__/listingProcessor.test.d.ts +0 -1
  330. package/dist/_internal/server/jobs/core/__tests__/listingProcessor.test.js +0 -163
  331. package/dist/_internal/server/jobs/core/__tests__/mediaTmpCleanup.test.d.ts +0 -1
  332. package/dist/_internal/server/jobs/core/__tests__/mediaTmpCleanup.test.js +0 -115
  333. package/dist/_internal/server/jobs/core/__tests__/onBidPlaced.test.d.ts +0 -1
  334. package/dist/_internal/server/jobs/core/__tests__/onBidPlaced.test.js +0 -201
  335. package/dist/_internal/server/jobs/core/__tests__/onOrderCreate.test.d.ts +0 -1
  336. package/dist/_internal/server/jobs/core/__tests__/onOrderCreate.test.js +0 -169
  337. package/dist/_internal/server/jobs/core/__tests__/onOrderStatusChange.test.d.ts +0 -1
  338. package/dist/_internal/server/jobs/core/__tests__/onOrderStatusChange.test.js +0 -148
  339. package/dist/_internal/server/jobs/core/__tests__/onProductStockChange.test.d.ts +0 -1
  340. package/dist/_internal/server/jobs/core/__tests__/onProductStockChange.test.js +0 -210
  341. package/dist/_internal/server/jobs/core/__tests__/onReviewWrite.test.d.ts +0 -1
  342. package/dist/_internal/server/jobs/core/__tests__/onReviewWrite.test.js +0 -190
  343. package/dist/_internal/server/jobs/core/__tests__/onUserBanChange.test.d.ts +0 -1
  344. package/dist/_internal/server/jobs/core/__tests__/onUserBanChange.test.js +0 -161
  345. package/dist/_internal/server/jobs/core/__tests__/payoutBatch.test.d.ts +0 -1
  346. package/dist/_internal/server/jobs/core/__tests__/payoutBatch.test.js +0 -302
  347. package/dist/_internal/server/jobs/core/__tests__/pendingOrderTimeout.test.d.ts +0 -1
  348. package/dist/_internal/server/jobs/core/__tests__/pendingOrderTimeout.test.js +0 -96
  349. package/dist/_internal/server/jobs/core/__tests__/triggerEventRaffle.test.d.ts +0 -1
  350. package/dist/_internal/server/jobs/core/__tests__/triggerEventRaffle.test.js +0 -252
  351. package/dist/_internal/server/jobs/core/__tests__/wrapJobHandler.test.d.ts +0 -1
  352. package/dist/_internal/server/jobs/core/__tests__/wrapJobHandler.test.js +0 -129
  353. package/dist/_internal/server/jobs/core/onCatalogueSubmittedForApproval.d.ts +0 -15
  354. package/dist/_internal/server/jobs/core/onCatalogueSubmittedForApproval.js +0 -38
  355. package/dist/_internal/server/providers/index.d.ts +0 -11
  356. package/dist/_internal/server/providers/index.js +0 -11
  357. package/dist/_internal/server/providers/payment/razorpay-mock.d.ts +0 -52
  358. package/dist/_internal/server/providers/payment/razorpay-mock.js +0 -118
  359. package/dist/_internal/server/providers/resolve.d.ts +0 -36
  360. package/dist/_internal/server/providers/resolve.js +0 -31
  361. package/dist/_internal/server/providers/shipping/shiprocket-mock.d.ts +0 -29
  362. package/dist/_internal/server/providers/shipping/shiprocket-mock.js +0 -152
  363. package/dist/_internal/shared/types/__tests__/action-result.test.d.ts +0 -1
  364. package/dist/_internal/shared/types/__tests__/action-result.test.js +0 -65
  365. package/dist/errors/__tests__/error-mapping.test.d.ts +0 -1
  366. package/dist/errors/__tests__/error-mapping.test.js +0 -122
  367. package/dist/errors/__tests__/safe-read.test.d.ts +0 -1
  368. package/dist/errors/__tests__/safe-read.test.js +0 -39
  369. package/dist/features/addresses/repository/__tests__/addresses.repository.test.d.ts +0 -1
  370. package/dist/features/addresses/repository/__tests__/addresses.repository.test.js +0 -386
  371. package/dist/features/admin/components/AdminListingScaffold.d.ts +0 -41
  372. package/dist/features/admin/components/AdminListingScaffold.js +0 -68
  373. package/dist/features/admin/components/QuickActionsPanel.d.ts +0 -15
  374. package/dist/features/admin/components/QuickActionsPanel.js +0 -5
  375. package/dist/features/admin/repository/__tests__/notification.repository.test.d.ts +0 -1
  376. package/dist/features/admin/repository/__tests__/notification.repository.test.js +0 -356
  377. package/dist/features/admin/repository/__tests__/site-settings.repository.test.d.ts +0 -1
  378. package/dist/features/admin/repository/__tests__/site-settings.repository.test.js +0 -298
  379. package/dist/features/auctions/repository/__tests__/bid.repository.test.d.ts +0 -1
  380. package/dist/features/auctions/repository/__tests__/bid.repository.test.js +0 -290
  381. package/dist/features/auctions/repository/auctions.repository.d.ts +0 -12
  382. package/dist/features/auctions/repository/auctions.repository.js +0 -42
  383. package/dist/features/auth/repository/__tests__/session.repository.test.d.ts +0 -1
  384. package/dist/features/auth/repository/__tests__/session.repository.test.js +0 -310
  385. package/dist/features/auth/repository/__tests__/session.test.d.ts +0 -1
  386. package/dist/features/auth/repository/__tests__/session.test.js +0 -146
  387. package/dist/features/auth/repository/__tests__/sms-counter.repository.test.d.ts +0 -1
  388. package/dist/features/auth/repository/__tests__/sms-counter.repository.test.js +0 -171
  389. package/dist/features/auth/repository/__tests__/sms-counter.test.d.ts +0 -1
  390. package/dist/features/auth/repository/__tests__/sms-counter.test.js +0 -88
  391. package/dist/features/auth/repository/__tests__/token.repository.test.d.ts +0 -1
  392. package/dist/features/auth/repository/__tests__/token.repository.test.js +0 -260
  393. package/dist/features/auth/repository/__tests__/token.test.d.ts +0 -1
  394. package/dist/features/auth/repository/__tests__/token.test.js +0 -140
  395. package/dist/features/auth/repository/__tests__/user.repository.test.d.ts +0 -1
  396. package/dist/features/auth/repository/__tests__/user.repository.test.js +0 -352
  397. package/dist/features/auth/repository/__tests__/user.test.d.ts +0 -1
  398. package/dist/features/auth/repository/__tests__/user.test.js +0 -226
  399. package/dist/features/before-after/repository/before-after.repository.d.ts +0 -13
  400. package/dist/features/before-after/repository/before-after.repository.js +0 -36
  401. package/dist/features/before-after/server.d.ts +0 -6
  402. package/dist/features/before-after/server.js +0 -6
  403. package/dist/features/cart/repository/__tests__/cart.repository.test.d.ts +0 -1
  404. package/dist/features/cart/repository/__tests__/cart.repository.test.js +0 -371
  405. package/dist/features/categories/repository/__tests__/categories.repository.test.d.ts +0 -1
  406. package/dist/features/categories/repository/__tests__/categories.repository.test.js +0 -813
  407. package/dist/features/collections/repository/collections.repository.d.ts +0 -8
  408. package/dist/features/collections/repository/collections.repository.js +0 -16
  409. package/dist/features/collections/server.d.ts +0 -6
  410. package/dist/features/collections/server.js +0 -6
  411. package/dist/features/events/repository/__tests__/event.repository.test.d.ts +0 -1
  412. package/dist/features/events/repository/__tests__/event.repository.test.js +0 -299
  413. package/dist/features/faq/repository/__tests__/faqs.repository.test.d.ts +0 -1
  414. package/dist/features/faq/repository/__tests__/faqs.repository.test.js +0 -311
  415. package/dist/features/forms/Form.d.ts +0 -25
  416. package/dist/features/forms/Form.js +0 -37
  417. package/dist/features/history/repository/__tests__/user-history.repository.test.d.ts +0 -1
  418. package/dist/features/history/repository/__tests__/user-history.repository.test.js +0 -180
  419. package/dist/features/homepage/repository/__tests__/carousel.repository.test.d.ts +0 -1
  420. package/dist/features/homepage/repository/__tests__/carousel.repository.test.js +0 -182
  421. package/dist/features/homepage/repository/__tests__/homepage-sections.repository.test.d.ts +0 -1
  422. package/dist/features/homepage/repository/__tests__/homepage-sections.repository.test.js +0 -185
  423. package/dist/features/layout/ListingLayout.d.ts +0 -34
  424. package/dist/features/layout/ListingLayout.js +0 -103
  425. package/dist/features/messages/repository/__tests__/conversations.repository.test.d.ts +0 -1
  426. package/dist/features/messages/repository/__tests__/conversations.repository.test.js +0 -257
  427. package/dist/features/orders/repository/__tests__/orders.repository.test.d.ts +0 -1
  428. package/dist/features/orders/repository/__tests__/orders.repository.test.js +0 -211
  429. package/dist/features/payments/repository/__tests__/payout.repository.test.d.ts +0 -1
  430. package/dist/features/payments/repository/__tests__/payout.repository.test.js +0 -292
  431. package/dist/features/pre-orders/repository/preorders.repository.d.ts +0 -8
  432. package/dist/features/pre-orders/repository/preorders.repository.js +0 -25
  433. package/dist/features/products/repository/__tests__/product-features.repository.test.d.ts +0 -1
  434. package/dist/features/products/repository/__tests__/product-features.repository.test.js +0 -329
  435. package/dist/features/products/repository/__tests__/products.repository.test.d.ts +0 -1
  436. package/dist/features/products/repository/__tests__/products.repository.test.js +0 -607
  437. package/dist/features/promotions/repository/__tests__/claimed-coupons.repository.test.d.ts +0 -1
  438. package/dist/features/promotions/repository/__tests__/claimed-coupons.repository.test.js +0 -219
  439. package/dist/features/promotions/repository/__tests__/coupons.repository.test.d.ts +0 -1
  440. package/dist/features/promotions/repository/__tests__/coupons.repository.test.js +0 -480
  441. package/dist/features/promotions/repository/promotions.repository.d.ts +0 -14
  442. package/dist/features/promotions/repository/promotions.repository.js +0 -43
  443. package/dist/features/reviews/repository/__tests__/reviews.repository.test.d.ts +0 -1
  444. package/dist/features/reviews/repository/__tests__/reviews.repository.test.js +0 -327
  445. package/dist/features/scams/repository/__tests__/scammer.repository.test.d.ts +0 -1
  446. package/dist/features/scams/repository/__tests__/scammer.repository.test.js +0 -385
  447. package/dist/features/search/repository/__tests__/search.repository.test.d.ts +0 -1
  448. package/dist/features/search/repository/__tests__/search.repository.test.js +0 -369
  449. package/dist/features/seller/components/SellerStatCard.d.ts +0 -14
  450. package/dist/features/seller/components/SellerStatCard.js +0 -6
  451. package/dist/features/seller/components/seller-products-styles.d.ts +0 -7
  452. package/dist/features/seller/components/seller-products-styles.js +0 -14
  453. package/dist/features/seller/repository/__tests__/offer.repository.test.d.ts +0 -1
  454. package/dist/features/seller/repository/__tests__/offer.repository.test.js +0 -458
  455. package/dist/features/seller/repository/seller.repository.d.ts +0 -22
  456. package/dist/features/seller/repository/seller.repository.js +0 -72
  457. package/dist/features/site-settings/components/__tests__/ThemeManagerView.test.d.ts +0 -1
  458. package/dist/features/site-settings/components/__tests__/ThemeManagerView.test.js +0 -37
  459. package/dist/features/stores/repository/__tests__/store.repository.test.d.ts +0 -1
  460. package/dist/features/stores/repository/__tests__/store.repository.test.js +0 -261
  461. package/dist/features/stores/repository/stores.repository.d.ts +0 -11
  462. package/dist/features/stores/repository/stores.repository.js +0 -37
  463. package/dist/features/support/repository/__tests__/support.repository.test.d.ts +0 -1
  464. package/dist/features/support/repository/__tests__/support.repository.test.js +0 -312
  465. package/dist/features/wishlist/repository/__tests__/user-wishlist.repository.test.d.ts +0 -1
  466. package/dist/features/wishlist/repository/__tests__/user-wishlist.repository.test.js +0 -139
  467. package/dist/features/wishlist/repository/wishlist.repository.d.ts +0 -13
  468. package/dist/features/wishlist/repository/wishlist.repository.js +0 -31
  469. package/dist/providers/db-firebase/__tests__/filter-aliases.test.d.ts +0 -1
  470. package/dist/providers/db-firebase/__tests__/filter-aliases.test.js +0 -93
  471. package/dist/providers/shipping-shiprocket/index.d.ts +0 -297
  472. package/dist/providers/shipping-shiprocket/index.js +0 -194
  473. package/dist/providers/shipping-shiprocket/shiprocket-provider.d.ts +0 -45
  474. package/dist/providers/shipping-shiprocket/shiprocket-provider.js +0 -168
  475. package/dist/react/contexts/ThemeContext.d.ts +0 -13
  476. package/dist/react/contexts/ThemeContext.js +0 -64
  477. package/dist/schemas/webhooks/shiprocket.d.ts +0 -30
  478. package/dist/schemas/webhooks/shiprocket.js +0 -22
  479. package/dist/seed/actions/demo-seed-actions.d.ts +0 -42
  480. package/dist/seed/actions/demo-seed-actions.js +0 -36
  481. package/dist/seed/actions/index.d.ts +0 -1
  482. package/dist/seed/actions/index.js +0 -1
  483. package/dist/seed/sub-listings-seed-data.d.ts +0 -123
  484. package/dist/seed/sub-listings-seed-data.js +0 -447
  485. package/dist/seed/tester-checklist-seed-data.d.ts +0 -2
  486. package/dist/seed/tester-checklist-seed-data.js +0 -248
  487. package/dist/ui/components/DashboardStatsCard.d.ts +0 -15
  488. package/dist/ui/components/DashboardStatsCard.js +0 -27
  489. package/dist/ui/components/DashboardStatsCard.style.css +0 -68
  490. package/dist/ui/components/DynamicSelect.d.ts +0 -23
  491. package/dist/ui/components/DynamicSelect.js +0 -77
  492. package/dist/ui/components/DynamicSelect.style.css +0 -101
  493. package/dist/ui/components/InlineCreateSelect.d.ts +0 -48
  494. package/dist/ui/components/InlineCreateSelect.js +0 -75
  495. package/dist/ui/components/ListingViewShell.d.ts +0 -37
  496. package/dist/ui/components/ListingViewShell.js +0 -9
  497. package/dist/ui/components/PaginatedMultiSelect.d.ts +0 -28
  498. package/dist/ui/components/PaginatedMultiSelect.js +0 -141
  499. package/dist/ui/components/PaginatedMultiSelect.style.css +0 -272
  500. package/dist/ui/components/SectionTabs.d.ts +0 -19
  501. package/dist/ui/components/SectionTabs.js +0 -66
  502. package/dist/ui/components/SectionTabs.style.css +0 -164
  503. package/dist/ui/components/__tests__/BulkActionBar.test.d.ts +0 -1
  504. package/dist/ui/components/__tests__/BulkActionBar.test.js +0 -96
  505. package/dist/ui/components/__tests__/ListingToolbar.test.d.ts +0 -1
  506. package/dist/ui/components/__tests__/ListingToolbar.test.js +0 -125
  507. package/dist/ui/components/__tests__/new-primitives.test.d.ts +0 -1
  508. package/dist/ui/components/__tests__/new-primitives.test.js +0 -187
@@ -255,7 +255,7 @@ function OrderItemsPanel(props) {
255
255
  const q = Math.max(0, parseInt(raw, 10) || 0);
256
256
  setOrderItems((prev) => prev.map((p, i) => (i === idx ? { ...p, quantity: q } : p)));
257
257
  };
258
- return (_jsxs(Stack, { padding: "sm", className: "border border-info/40 bg-[var(--appkit-color-info-surface)]/40", gap: "sm", rounded: "lg", children: [_jsx(Text, { className: "text-info tracking-wide", size: "xs", weight: "semibold", transform: "uppercase", children: "Modify order items" }), linkedOrderId ? (_jsxs(_Fragment, { children: [_jsxs(Text, { size: "xs", color: "muted", children: ["Editing order: ", _jsx(Code, { className: "font-mono", children: linkedOrderId })] }), !orderItemsOpen ? (_jsx(Button, { type: "button", variant: "secondary", size: "sm", isLoading: loadOrderItems.isPending, disabled: loadOrderItems.isPending, onClick: () => loadOrderItems.mutate(), children: "Load current items" })) : (_jsxs(_Fragment, { children: [orderItems.length === 0 ? (_jsx(Text, { size: "xs", color: "muted", children: "Order has no items." })) : (_jsx(Stack, { gap: "sm", children: orderItems.map((it, idx) => (_jsxs(Row, { paddingY: "y-2xs", padding: "x-xs", rounded: "default", align: "center", gap: "sm", border: "default", children: [_jsxs(Div, { className: "flex-1 min-w-0", children: [_jsx(Text, { className: "truncate", size: "xs", weight: "medium", children: it.productTitle }), _jsxs(Text, { size: "xs", color: "muted", children: [it.productId, " \u00B7 \u20B9", (it.unitPrice / 100).toFixed(2), "/ea"] })] }), _jsx(Input, { bare: true, type: "number", min: "0", value: it.quantity, onChange: (e) => updateQty(idx, e.target.value), className: "w-16 rounded border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] px-[var(--appkit-space-2)] py-[var(--appkit-space-1)] text-[length:var(--appkit-text-xs)]" })] }, `${it.productId}-${idx}`))) })), _jsxs(Row, { gap: "sm", children: [_jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setOrderItemsOpen(false), children: "Cancel" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", isLoading: applyOrderItems.isPending, disabled: applyOrderItems.isPending, onClick: () => applyOrderItems.mutate(), children: "Apply changes" })] })] }))] })) : (_jsxs(Text, { size: "xs", color: "muted", children: ["Set the", " ", _jsx(Text, { as: "span", weight: "semibold", children: "Order ID" }), " ", "field in the Linked parties panel above to enable this action."] }))] }));
258
+ return (_jsxs(Stack, { padding: "sm", className: "border border-info/40 bg-[var(--appkit-color-info-surface)]/40", gap: "sm", rounded: "lg", children: [_jsx(Text, { className: "text-info tracking-wide", size: "xs", weight: "semibold", transform: "uppercase", children: "Modify order items" }), linkedOrderId ? (_jsxs(_Fragment, { children: [_jsxs(Text, { size: "xs", color: "muted", children: ["Editing order: ", _jsx(Code, { className: "font-mono", children: linkedOrderId })] }), !orderItemsOpen ? (_jsx(Button, { type: "button", variant: "secondary", size: "sm", isLoading: loadOrderItems.isPending, disabled: loadOrderItems.isPending, onClick: () => loadOrderItems.mutate(), children: "Load current items" })) : (_jsxs(_Fragment, { children: [orderItems.length === 0 ? (_jsx(Text, { size: "xs", color: "muted", children: "Order has no items." })) : (_jsx(Stack, { gap: "sm", children: orderItems.map((it, idx) => (_jsxs(Row, { paddingY: "y-2xs", padding: "x-xs", rounded: "default", align: "center", gap: "sm", border: "default", children: [_jsxs(Div, { className: "flex-1 min-w-0", children: [_jsx(Text, { className: "truncate", size: "xs", weight: "medium", children: it.productTitle }), _jsxs(Text, { size: "xs", color: "muted", children: [it.productId, " \u00B7 \u20B9", it.unitPrice.toFixed(2), "/ea"] })] }), _jsx(Input, { bare: true, type: "number", min: "0", value: it.quantity, onChange: (e) => updateQty(idx, e.target.value), className: "w-16 rounded border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] px-[var(--appkit-space-2)] py-[var(--appkit-space-1)] text-[length:var(--appkit-text-xs)]" })] }, `${it.productId}-${idx}`))) })), _jsxs(Row, { gap: "sm", children: [_jsx(Button, { type: "button", variant: "secondary", size: "sm", onClick: () => setOrderItemsOpen(false), children: "Cancel" }), _jsx(Button, { type: "button", variant: "primary", size: "sm", isLoading: applyOrderItems.isPending, disabled: applyOrderItems.isPending, onClick: () => applyOrderItems.mutate(), children: "Apply changes" })] })] }))] })) : (_jsxs(Text, { size: "xs", color: "muted", children: ["Set the", " ", _jsx(Text, { as: "span", weight: "semibold", children: "Order ID" }), " ", "field in the Linked parties panel above to enable this action."] }))] }));
259
259
  }
260
260
  function StoreChangePanel(props) {
261
261
  const { linkedStoreId, storeStatus, setStoreStatus, storeIsVerified, setStoreIsVerified, storeIsFeatured, setStoreIsFeatured, applyStoreChange, } = props;
@@ -190,7 +190,7 @@ export function parseProductsBuilder(config) {
190
190
  manualResourceIds: toStringArray(resources.ids).join(", "),
191
191
  filterByCategory: toStringValue(config.filterByCategory),
192
192
  maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
193
- loop: toBooleanValue(config.loop, false),
193
+ loop: toBooleanValue(config.loop, DEFAULT_PRODUCTS_BUILDER.loop),
194
194
  };
195
195
  }
196
196
  export function parseAuctionsBuilder(config) {
@@ -210,7 +210,7 @@ export function parseAuctionsBuilder(config) {
210
210
  manualResourceIds: toStringArray(resources.ids).join(", "),
211
211
  filterByCategory: toStringValue(config.filterByCategory),
212
212
  maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
213
- loop: toBooleanValue(config.loop, false),
213
+ loop: toBooleanValue(config.loop, DEFAULT_AUCTIONS_BUILDER.loop),
214
214
  };
215
215
  }
216
216
  export function parseStatsBuilder(config) {
@@ -271,7 +271,7 @@ export function parsePreOrdersBuilder(config) {
271
271
  manualResourceIds: toStringArray(resources.ids).join(", "),
272
272
  filterByCategory: toStringValue(config.filterByCategory),
273
273
  maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
274
- loop: toBooleanValue(config.loop, false),
274
+ loop: toBooleanValue(config.loop, DEFAULT_PRE_ORDERS_BUILDER.loop),
275
275
  };
276
276
  }
277
277
  export function parseStoresBuilder(config) {
@@ -292,7 +292,7 @@ export function parseStoresBuilder(config) {
292
292
  manualResourceIds: toStringArray(resources.ids).join(", "),
293
293
  filterByCategory: toStringValue(config.filterByCategory),
294
294
  maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
295
- loop: toBooleanValue(config.loop, false),
295
+ loop: toBooleanValue(config.loop, DEFAULT_STORES_BUILDER.loop),
296
296
  };
297
297
  }
298
298
  export function parseEventsBuilder(config) {
@@ -313,7 +313,7 @@ export function parseEventsBuilder(config) {
313
313
  manualResourceIds: toStringArray(resources.ids).join(", "),
314
314
  filterByCategory: toStringValue(config.filterByCategory),
315
315
  maxCount: ([5, 10, 20].includes(maxCount) ? maxCount : 10),
316
- loop: toBooleanValue(config.loop, false),
316
+ loop: toBooleanValue(config.loop, DEFAULT_EVENTS_BUILDER.loop),
317
317
  };
318
318
  }
319
319
  export function buildSocialFeedConfig(builder) {
@@ -395,6 +395,7 @@ export function buildCategoriesConfig(builder) {
395
395
  maxCategories: builder.maxCategories,
396
396
  autoScroll: builder.autoScroll,
397
397
  scrollInterval: builder.scrollInterval,
398
+ loop: builder.loop,
398
399
  };
399
400
  }
400
401
  export function parseCategoriesBuilder(config) {
@@ -403,6 +404,7 @@ export function parseCategoriesBuilder(config) {
403
404
  maxCategories: toNumberValue(config.maxCategories, DEFAULT_CATEGORIES_BUILDER.maxCategories),
404
405
  autoScroll: toBooleanValue(config.autoScroll, DEFAULT_CATEGORIES_BUILDER.autoScroll),
405
406
  scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_CATEGORIES_BUILDER.scrollInterval),
407
+ loop: toBooleanValue(config.loop, DEFAULT_CATEGORIES_BUILDER.loop),
406
408
  };
407
409
  }
408
410
  export function buildBrandsConfig(builder) {
@@ -412,6 +414,7 @@ export function buildBrandsConfig(builder) {
412
414
  maxBrands: builder.maxBrands,
413
415
  autoScroll: builder.autoScroll,
414
416
  scrollInterval: builder.scrollInterval,
417
+ loop: builder.loop,
415
418
  };
416
419
  }
417
420
  export function parseBrandsBuilder(config) {
@@ -421,6 +424,7 @@ export function parseBrandsBuilder(config) {
421
424
  maxBrands: toNumberValue(config.maxBrands, DEFAULT_BRANDS_BUILDER.maxBrands),
422
425
  autoScroll: toBooleanValue(config.autoScroll, DEFAULT_BRANDS_BUILDER.autoScroll),
423
426
  scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_BRANDS_BUILDER.scrollInterval),
427
+ loop: toBooleanValue(config.loop, DEFAULT_BRANDS_BUILDER.loop),
424
428
  };
425
429
  }
426
430
  export function buildBannerConfig(builder) {
@@ -486,6 +490,7 @@ export function buildReviewsConfig(builder) {
486
490
  mobileItemsPerView: 1,
487
491
  autoScroll: builder.autoScroll,
488
492
  scrollInterval: builder.scrollInterval,
493
+ loop: builder.loop,
489
494
  source: builder.source,
490
495
  placeId: builder.source === "google" ? builder.placeId || undefined : undefined,
491
496
  };
@@ -497,6 +502,7 @@ export function parseReviewsBuilder(config) {
497
502
  itemsPerView: toNumberValue(config.itemsPerView, DEFAULT_REVIEWS_BUILDER.itemsPerView),
498
503
  autoScroll: toBooleanValue(config.autoScroll, DEFAULT_REVIEWS_BUILDER.autoScroll),
499
504
  scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_REVIEWS_BUILDER.scrollInterval),
505
+ loop: toBooleanValue(config.loop, DEFAULT_REVIEWS_BUILDER.loop),
500
506
  source: toStringValue(config.source, "platform"),
501
507
  placeId: toStringValue(config.placeId),
502
508
  };
@@ -613,6 +619,7 @@ export function buildCustomCardsConfig(builder) {
613
619
  columns: builder.columns,
614
620
  autoScroll: builder.autoScroll,
615
621
  scrollIntervalMs: builder.scrollIntervalMs,
622
+ loop: builder.loop,
616
623
  cards: builder.cards.map((card, index) => ({
617
624
  id: card.id || `card-${index + 1}`,
618
625
  image: card.image || undefined,
@@ -639,6 +646,7 @@ export function parseCustomCardsBuilder(config) {
639
646
  columns: ([1, 2, 3, 4].includes(cols) ? cols : DEFAULT_CUSTOM_CARDS_BUILDER.columns),
640
647
  autoScroll: toBooleanValue(config.autoScroll, DEFAULT_CUSTOM_CARDS_BUILDER.autoScroll),
641
648
  scrollIntervalMs: toNumberValue(config.scrollIntervalMs, DEFAULT_CUSTOM_CARDS_BUILDER.scrollIntervalMs),
649
+ loop: toBooleanValue(config.loop, DEFAULT_CUSTOM_CARDS_BUILDER.loop),
642
650
  cards: cardsRaw.map((item, index) => {
643
651
  const c = (item ?? {});
644
652
  const br = toStringValue(c.borderRadius, "none");
@@ -150,6 +150,7 @@ export interface CategoriesBuilderState {
150
150
  maxCategories: number;
151
151
  autoScroll: boolean;
152
152
  scrollInterval: number;
153
+ loop: boolean;
153
154
  }
154
155
  export interface BrandsBuilderState {
155
156
  title: string;
@@ -157,6 +158,7 @@ export interface BrandsBuilderState {
157
158
  maxBrands: number;
158
159
  autoScroll: boolean;
159
160
  scrollInterval: number;
161
+ loop: boolean;
160
162
  }
161
163
  export interface BannerBuilderState {
162
164
  height: "sm" | "md" | "lg" | "xl";
@@ -185,6 +187,7 @@ export interface ReviewsBuilderState {
185
187
  itemsPerView: number;
186
188
  autoScroll: boolean;
187
189
  scrollInterval: number;
190
+ loop: boolean;
188
191
  source: "platform" | "google";
189
192
  placeId: string;
190
193
  }
@@ -249,6 +252,7 @@ export interface CustomCardsBuilderState {
249
252
  columns: 1 | 2 | 3 | 4;
250
253
  autoScroll: boolean;
251
254
  scrollIntervalMs: number;
255
+ loop: boolean;
252
256
  cards: CustomCardsCardBuilderEntry[];
253
257
  }
254
258
  export interface GoogleReviewsBuilderState {
@@ -42,7 +42,7 @@ export const DEFAULT_PRODUCTS_BUILDER = {
42
42
  manualResourceIds: "",
43
43
  filterByCategory: "",
44
44
  maxCount: 10,
45
- loop: false,
45
+ loop: true,
46
46
  };
47
47
  export const DEFAULT_AUCTIONS_BUILDER = {
48
48
  title: "Live Auctions",
@@ -57,7 +57,7 @@ export const DEFAULT_AUCTIONS_BUILDER = {
57
57
  manualResourceIds: "",
58
58
  filterByCategory: "",
59
59
  maxCount: 10,
60
- loop: false,
60
+ loop: true,
61
61
  };
62
62
  const DEFAULT_STAT_ROW = {
63
63
  source: "static",
@@ -89,7 +89,7 @@ export const DEFAULT_PRE_ORDERS_BUILDER = {
89
89
  manualResourceIds: "",
90
90
  filterByCategory: "",
91
91
  maxCount: 10,
92
- loop: false,
92
+ loop: true,
93
93
  };
94
94
  export const DEFAULT_STORES_BUILDER = {
95
95
  title: "Featured Stores",
@@ -105,7 +105,7 @@ export const DEFAULT_STORES_BUILDER = {
105
105
  manualResourceIds: "",
106
106
  filterByCategory: "",
107
107
  maxCount: 10,
108
- loop: false,
108
+ loop: true,
109
109
  };
110
110
  export const DEFAULT_EVENTS_BUILDER = {
111
111
  title: "Events & Offers",
@@ -121,7 +121,7 @@ export const DEFAULT_EVENTS_BUILDER = {
121
121
  manualResourceIds: "",
122
122
  filterByCategory: "",
123
123
  maxCount: 10,
124
- loop: false,
124
+ loop: true,
125
125
  };
126
126
  export const DEFAULT_SOCIAL_FEED_BUILDER = {
127
127
  title: "",
@@ -156,6 +156,7 @@ export const DEFAULT_CATEGORIES_BUILDER = {
156
156
  maxCategories: 8,
157
157
  autoScroll: false,
158
158
  scrollInterval: 5000,
159
+ loop: true,
159
160
  };
160
161
  export const DEFAULT_BRANDS_BUILDER = {
161
162
  title: "Top Brands",
@@ -163,6 +164,7 @@ export const DEFAULT_BRANDS_BUILDER = {
163
164
  maxBrands: 13,
164
165
  autoScroll: true,
165
166
  scrollInterval: 4000,
167
+ loop: true,
166
168
  };
167
169
  export const DEFAULT_BANNER_BUILDER = {
168
170
  height: "lg",
@@ -187,6 +189,7 @@ export const DEFAULT_REVIEWS_BUILDER = {
187
189
  itemsPerView: 3,
188
190
  autoScroll: true,
189
191
  scrollInterval: 5000,
192
+ loop: true,
190
193
  source: "platform",
191
194
  placeId: "",
192
195
  };
@@ -237,6 +240,7 @@ export const DEFAULT_CUSTOM_CARDS_BUILDER = {
237
240
  columns: 3,
238
241
  autoScroll: false,
239
242
  scrollIntervalMs: 4000,
243
+ loop: true,
240
244
  cards: [],
241
245
  };
242
246
  export const DEFAULT_GOOGLE_REVIEWS_BUILDER = {
@@ -32,6 +32,6 @@ export declare function useAdminListingData<TResponse, TRow extends {
32
32
  }>({ queryKey, endpoint, page, pageSize, sorts, filters, q, mapRows, getTotal, }: UseAdminListingDataOptions<TResponse, TRow>): UseAdminListingDataResult<TRow>;
33
33
  export declare function toRecordArray(value: unknown): ListingItemRecord[];
34
34
  export declare function toStringValue(value: unknown, fallback?: string): string;
35
- export declare function toRupees(value: unknown): string;
35
+ export declare function toCurrency(value: unknown): string;
36
36
  export declare function toRelativeDate(value: unknown): string;
37
37
  export {};
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
  import { apiClient, ApiClientError } from "../../../http";
4
+ import { formatCurrency } from "../../../utils/number.formatter";
4
5
  function withQueryParams(endpoint, params) {
5
6
  const hasQuery = endpoint.includes("?");
6
7
  const query = new URLSearchParams(params).toString();
@@ -49,11 +50,11 @@ export function toStringValue(value, fallback = "-") {
49
50
  }
50
51
  return fallback;
51
52
  }
52
- export function toRupees(value) {
53
+ export function toCurrency(value) {
53
54
  if (typeof value !== "number" || Number.isNaN(value)) {
54
55
  return "-";
55
56
  }
56
- return `INR ${value.toLocaleString("en-IN")}`;
57
+ return formatCurrency(value);
57
58
  }
58
59
  export function toRelativeDate(value) {
59
60
  const date = parseDate(value);
@@ -3,7 +3,7 @@
3
3
  * Covers: notifications, chat rooms, site settings
4
4
  */
5
5
  export declare const ADMIN_CHECKOUT_BYPASS_FLAG_KEY: "adminCheckoutBypass";
6
- export type NotificationType = "order_placed" | "order_confirmed" | "order_shipped" | "order_delivered" | "order_cancelled" | "bid_placed" | "bid_outbid" | "bid_won" | "bid_lost" | "review_approved" | "review_replied" | "product_available" | "promotion" | "system" | "welcome" | "account_action" | "offer_received" | "offer_responded" | "offer_expired" | "offer_counter_accepted" | "refund_initiated" | "prize_reveal_ready" | "prize_reveal_expired" | "prize_reveal_reminder" | "emi_installment_due_soon" | "emi_installment_overdue";
6
+ export type NotificationType = "order_placed" | "order_confirmed" | "order_shipped" | "order_delivered" | "order_cancelled" | "bid_placed" | "bid_outbid" | "bid_won" | "bid_lost" | "review_approved" | "review_replied" | "product_available" | "promotion" | "system" | "welcome" | "account_action" | "offer_received" | "offer_responded" | "offer_expired" | "offer_counter_accepted" | "refund_initiated" | "prize_reveal_ready" | "prize_reveal_expired" | "prize_reveal_reminder" | "emi_installment_due_soon" | "emi_installment_overdue" | "payment_review";
7
7
  import type { BaseDocument } from "../../../_internal/shared/types/base-document";
8
8
  export type NotificationPriority = "low" | "normal" | "high";
9
9
  export interface NotificationDocument extends BaseDocument {
@@ -288,12 +288,14 @@ export interface SiteSettingsDocument extends BaseDocument {
288
288
  razorpayEnabled: boolean;
289
289
  upiManualEnabled: boolean;
290
290
  codEnabled: boolean;
291
+ /** Tier PP — cart total (rupees) at/above which checkout requires OTP verification. Applies to all payment methods except COD. Optional — falls back to no OTP gate when unset. */
292
+ otpCheckoutThreshold?: number;
291
293
  };
292
294
  /** Site-wide EMI (installment) settings. A seller must ALSO have `StoreDocument.emiEnabled` on for EMI to appear at checkout for their items. */
293
295
  emi: {
294
296
  enabled: boolean;
295
- /** Paise — a seller's cart subtotal must exceed this for EMI to appear as an option. */
296
- minOrderValueInPaise: number;
297
+ /** Decimal rupees — a seller's cart subtotal must exceed this for EMI to appear as an option. */
298
+ minOrderValue: number;
297
299
  tenureOptions: number[];
298
300
  /** Down payment % collected at checkout. */
299
301
  tokenPercent: number;
@@ -314,8 +316,8 @@ export interface SiteSettingsDocument extends BaseDocument {
314
316
  /** Razorpay gateway cost % (absorbed by platform, not passed through separately). */
315
317
  gatewayFeePercent: number;
316
318
  codDepositPercent: number;
317
- /** COD handling fee charged to the buyer: max(codHandlingFeeMinInPaise, subtotal × codHandlingFeePercent / 100). */
318
- codHandlingFeeMinInPaise: number;
319
+ /** COD handling fee charged to the buyer: max(codHandlingFeeMin, subtotal × codHandlingFeePercent / 100). */
320
+ codHandlingFeeMin: number;
319
321
  codHandlingFeePercent: number;
320
322
  sellerShippingFixed: number;
321
323
  platformShippingPercent: number;
@@ -331,10 +333,10 @@ export interface SiteSettingsDocument extends BaseDocument {
331
333
  promotedSlotFee?: number;
332
334
  };
333
335
  /** Procurement Shipments (Feature A) — the hourly rate used to compute a
334
- * shipment's laborCostPaise, and the daily-hour cap used to project
336
+ * shipment's laborCost, and the daily-hour cap used to project
335
337
  * estimatedProcessingDays. */
336
338
  laborRate: {
337
- hourlyRatePaise: number;
339
+ hourlyRate: number;
338
340
  maxHoursPerDay: number;
339
341
  };
340
342
  /** P-8 GST — Indian tax compliance. Distinct from commissions.gstPercent
@@ -170,10 +170,11 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
170
170
  razorpayEnabled: false,
171
171
  upiManualEnabled: true,
172
172
  codEnabled: true,
173
+ otpCheckoutThreshold: 5000,
173
174
  },
174
175
  emi: {
175
176
  enabled: false,
176
- minOrderValueInPaise: 1000000,
177
+ minOrderValue: 10000,
177
178
  tenureOptions: [2, 3, 4, 5, 6],
178
179
  tokenPercent: 10,
179
180
  billingDay: 5,
@@ -186,7 +187,7 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
186
187
  minimumTransactionFee: 0,
187
188
  gatewayFeePercent: 2,
188
189
  codDepositPercent: 10,
189
- codHandlingFeeMinInPaise: 20000,
190
+ codHandlingFeeMin: 200,
190
191
  codHandlingFeePercent: 10,
191
192
  sellerShippingFixed: 0,
192
193
  platformShippingPercent: 10,
@@ -200,7 +201,7 @@ export const DEFAULT_SITE_SETTINGS_DATA = {
200
201
  promotedSlotFee: 499,
201
202
  },
202
203
  laborRate: {
203
- hourlyRatePaise: 20000,
204
+ hourlyRate: 200,
204
205
  maxHoursPerDay: 6,
205
206
  },
206
207
  gst: {
@@ -6,12 +6,12 @@ import { Badge, Button, Div, Row, Span, Stack, Text } from "../../../ui";
6
6
  const __O = {
7
7
  hidden: "overflow-hidden",
8
8
  };
9
- function paise(amount) {
9
+ function formatBidAmount(amount) {
10
10
  return new Intl.NumberFormat("en-IN", {
11
11
  style: "currency",
12
12
  currency: "INR",
13
13
  maximumFractionDigits: 0,
14
- }).format(amount / 100);
14
+ }).format(amount);
15
15
  }
16
16
  function relDate(d) {
17
17
  const ms = new Date(d).getTime();
@@ -54,7 +54,7 @@ function AuctionRow({ auction, portal, }) {
54
54
  const sorted = useMemo(() => [...auction.bids].sort((a, b) => b.bidAmount - a.bidAmount), [auction.bids]);
55
55
  const highest = sorted[0]?.bidAmount ?? 0;
56
56
  const isWinning = auction.bids.some((b) => b.isWinning);
57
- return (_jsxs(Div, { className: `border border-[var(--appkit-color-border)] ${__O.hidden} bg-[var(--appkit-color-surface)]`, rounded: "xl", shadow: "sm", children: [_jsxs(Button, { type: "button", variant: "ghost", onClick: () => setExpanded((v) => !v), gap: "lg", paddingX: "md", paddingY: "md", className: "w-full text-left", "aria-expanded": expanded, children: [_jsx(ChevronRight, { className: `shrink-0 text-[var(--appkit-color-text-muted)] transition-transform ${expanded ? "rotate-90" : ""}`, size: 16 }), _jsx(Div, { className: "flex-1 min-w-0", children: _jsx(Text, { className: "text-[var(--appkit-color-text)] line-clamp-1", size: "sm", weight: "semibold", children: auction.productTitle }) }), _jsxs(Row, { gap: "sm", className: "shrink-0", children: [isWinning && (_jsx(Badge, { variant: "active", children: "Winning" })), _jsxs(Text, { variant: "secondary", size: "xs", children: [auction.bids.length, " bid", auction.bids.length !== 1 ? "s" : ""] }), _jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "semibold", children: paise(highest) })] })] }), expanded && (_jsxs(Div, { className: "border-t border-[var(--appkit-color-border)]", children: [_jsxs(Div, { textSize: "xs", textWeight: "medium", paddingX: "x-md", paddingY: "y-xs", className: `grid text-[var(--appkit-color-text-muted)] uppercase tracking-wide border-b border-[var(--appkit-color-border-subtle)] ${portal === "buyer" ? "[grid-template-columns:1fr_auto_auto]" : "[grid-template-columns:1fr_1fr_auto_auto]"}`, children: [_jsx(Span, { children: portal === "buyer" ? "Amount" : "Bidder" }), portal !== "buyer" && _jsx(Span, { children: "Amount" }), _jsx(Span, { children: "Status" }), _jsx(Span, { className: "text-right", children: "Time" })] }), sorted.map((bid) => (_jsxs(Div, { layout: "grid", align: "center", paddingX: "x-md", paddingY: "y-xs-tall", className: `border-b border-[var(--appkit-color-border-subtle)] last:border-0 hover:bg-[var(--appkit-color-border-subtle)] transition-colors ${portal === "buyer" ? "[grid-template-columns:1fr_auto_auto]" : "[grid-template-columns:1fr_1fr_auto_auto]"}`, children: [portal !== "buyer" && (_jsx(Text, { className: "text-[var(--appkit-color-text)] truncate pr-[0.75rem]", size: "sm", children: bid.userName || bid.userId })), _jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "medium", children: paise(bid.bidAmount) }), _jsx(Badge, { variant: STATUS_VARIANT[bid.status] ?? "pending", className: "capitalize", children: bid.status }), _jsx(Text, { variant: "secondary", size: "xs", align: "end", children: relDate(bid.bidDate) })] }, bid.id)))] }))] }));
57
+ return (_jsxs(Div, { className: `border border-[var(--appkit-color-border)] ${__O.hidden} bg-[var(--appkit-color-surface)]`, rounded: "xl", shadow: "sm", children: [_jsxs(Button, { type: "button", variant: "ghost", onClick: () => setExpanded((v) => !v), gap: "lg", paddingX: "md", paddingY: "md", className: "w-full text-left", "aria-expanded": expanded, children: [_jsx(ChevronRight, { className: `shrink-0 text-[var(--appkit-color-text-muted)] transition-transform ${expanded ? "rotate-90" : ""}`, size: 16 }), _jsx(Div, { className: "flex-1 min-w-0", children: _jsx(Text, { className: "text-[var(--appkit-color-text)] line-clamp-1", size: "sm", weight: "semibold", children: auction.productTitle }) }), _jsxs(Row, { gap: "sm", className: "shrink-0", children: [isWinning && (_jsx(Badge, { variant: "active", children: "Winning" })), _jsxs(Text, { variant: "secondary", size: "xs", children: [auction.bids.length, " bid", auction.bids.length !== 1 ? "s" : ""] }), _jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "semibold", children: formatBidAmount(highest) })] })] }), expanded && (_jsxs(Div, { className: "border-t border-[var(--appkit-color-border)]", children: [_jsxs(Div, { textSize: "xs", textWeight: "medium", paddingX: "x-md", paddingY: "y-xs", className: `grid text-[var(--appkit-color-text-muted)] uppercase tracking-wide border-b border-[var(--appkit-color-border-subtle)] ${portal === "buyer" ? "[grid-template-columns:1fr_auto_auto]" : "[grid-template-columns:1fr_1fr_auto_auto]"}`, children: [_jsx(Span, { children: portal === "buyer" ? "Amount" : "Bidder" }), portal !== "buyer" && _jsx(Span, { children: "Amount" }), _jsx(Span, { children: "Status" }), _jsx(Span, { className: "text-right", children: "Time" })] }), sorted.map((bid) => (_jsxs(Div, { layout: "grid", align: "center", paddingX: "x-md", paddingY: "y-xs-tall", className: `border-b border-[var(--appkit-color-border-subtle)] last:border-0 hover:bg-[var(--appkit-color-border-subtle)] transition-colors ${portal === "buyer" ? "[grid-template-columns:1fr_auto_auto]" : "[grid-template-columns:1fr_1fr_auto_auto]"}`, children: [portal !== "buyer" && (_jsx(Text, { className: "text-[var(--appkit-color-text)] truncate pr-[0.75rem]", size: "sm", children: bid.userName || bid.userId })), _jsx(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "medium", children: formatBidAmount(bid.bidAmount) }), _jsx(Badge, { variant: STATUS_VARIANT[bid.status] ?? "pending", className: "capitalize", children: bid.status }), _jsx(Text, { variant: "secondary", size: "xs", align: "end", children: relDate(bid.bidDate) })] }, bid.id)))] }))] }));
58
58
  }
59
59
  export function AuctionBidsTable({ bids, portal = "buyer", emptyLabel = "No bids found.", }) {
60
60
  const auctions = useMemo(() => groupByAuction(bids), [bids]);
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Checkout Value OTP — Tier PP.
3
+ *
4
+ * A distinct OTP purpose from `consent-otp.ts` (which gates third-party
5
+ * shipping consent): this one gates placing a checkout ≥ the site's
6
+ * `payment.otpCheckoutThreshold` (skipped for COD — see
7
+ * `createCheckoutOrderAction`). Deliberately a SEPARATE Firestore namespace
8
+ * (`checkoutValueOtps` vs `consentOtps`) rather than reusing the shipping-
9
+ * consent one — different purpose, different copy, independently tunable
10
+ * rate limits. Reuses `generateOtpCode()`/`hashOtp()` from `consent-otp.ts`
11
+ * rather than duplicating the crypto.
12
+ */
13
+ import { generateOtpCode, hashOtp } from "./consent-otp";
14
+ export { generateOtpCode, hashOtp };
15
+ /** OTP validity window (10 minutes) — matches consent-OTP's window; independently tunable if policy diverges later. */
16
+ export declare const CHECKOUT_VALUE_OTP_EXPIRY_MS: number;
17
+ export declare const CHECKOUT_VALUE_OTP_EXPIRY_MINUTES = 10;
18
+ /** Per-user send cooldown (15 minutes). */
19
+ export declare const CHECKOUT_VALUE_OTP_COOLDOWN_MS: number;
20
+ /** Maximum failed verification attempts before the OTP is locked. */
21
+ export declare const CHECKOUT_VALUE_OTP_MAX_ATTEMPTS = 5;
22
+ /** Rate-limit config for the verify endpoint / action (10 attempts per 5 min). */
23
+ export declare const CHECKOUT_VALUE_OTP_VERIFY_RATE_LIMIT: {
24
+ readonly limit: 10;
25
+ readonly window: 300;
26
+ };
27
+ type Db = FirebaseFirestore.Firestore;
28
+ /**
29
+ * Single-slot doc per user — unlike consent OTP (one per address), a buyer
30
+ * can only be mid-checkout once, so there's no per-context key needed.
31
+ */
32
+ export declare function checkoutValueOtpRef(db: Db, uid: string): FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
33
+ export declare function checkoutValueOtpRateLimitRef(db: Db, uid: string): FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
34
+ export interface CheckoutValueOtpDoc {
35
+ codeHash: string;
36
+ expiresAt: FirebaseFirestore.Timestamp;
37
+ attempts: number;
38
+ verified: boolean;
39
+ }
40
+ /**
41
+ * Enforce the per-user send rate-limit.
42
+ * Throws AuthorizationError("checkoutValueOtpRateLimit") when throttled.
43
+ */
44
+ export declare function enforceCheckoutValueOtpRateLimit(db: Db, uid: string): Promise<void>;
45
+ /** Build the checkout-value OTP WhatsApp/SMS message body. */
46
+ export declare function buildCheckoutValueOtpMessage(code: string, siteName: string): string;
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Checkout Value OTP — Tier PP.
3
+ *
4
+ * A distinct OTP purpose from `consent-otp.ts` (which gates third-party
5
+ * shipping consent): this one gates placing a checkout ≥ the site's
6
+ * `payment.otpCheckoutThreshold` (skipped for COD — see
7
+ * `createCheckoutOrderAction`). Deliberately a SEPARATE Firestore namespace
8
+ * (`checkoutValueOtps` vs `consentOtps`) rather than reusing the shipping-
9
+ * consent one — different purpose, different copy, independently tunable
10
+ * rate limits. Reuses `generateOtpCode()`/`hashOtp()` from `consent-otp.ts`
11
+ * rather than duplicating the crypto.
12
+ */
13
+ import { AuthorizationError } from "../../errors";
14
+ import { resolveDate } from "../../utils";
15
+ import { USER_COLLECTION } from "./schemas";
16
+ import { generateOtpCode, hashOtp } from "./consent-otp";
17
+ export { generateOtpCode, hashOtp };
18
+ /** OTP validity window (10 minutes) — matches consent-OTP's window; independently tunable if policy diverges later. */
19
+ export const CHECKOUT_VALUE_OTP_EXPIRY_MS = 10 * 60 * 1000;
20
+ export const CHECKOUT_VALUE_OTP_EXPIRY_MINUTES = 10;
21
+ /** Per-user send cooldown (15 minutes). */
22
+ export const CHECKOUT_VALUE_OTP_COOLDOWN_MS = 15 * 60 * 1000;
23
+ /** Maximum failed verification attempts before the OTP is locked. */
24
+ export const CHECKOUT_VALUE_OTP_MAX_ATTEMPTS = 5;
25
+ /** Rate-limit config for the verify endpoint / action (10 attempts per 5 min). */
26
+ export const CHECKOUT_VALUE_OTP_VERIFY_RATE_LIMIT = {
27
+ limit: 10,
28
+ window: 300,
29
+ };
30
+ /**
31
+ * Single-slot doc per user — unlike consent OTP (one per address), a buyer
32
+ * can only be mid-checkout once, so there's no per-context key needed.
33
+ */
34
+ export function checkoutValueOtpRef(db, uid) {
35
+ return db
36
+ .collection(USER_COLLECTION)
37
+ .doc(uid)
38
+ .collection("checkoutValueOtps")
39
+ .doc("current");
40
+ }
41
+ export function checkoutValueOtpRateLimitRef(db, uid) {
42
+ return db
43
+ .collection(USER_COLLECTION)
44
+ .doc(uid)
45
+ .collection("checkoutValueOtpRateLimit")
46
+ .doc("meta");
47
+ }
48
+ /**
49
+ * Enforce the per-user send rate-limit.
50
+ * Throws AuthorizationError("checkoutValueOtpRateLimit") when throttled.
51
+ */
52
+ export async function enforceCheckoutValueOtpRateLimit(db, uid) {
53
+ const metaRef = checkoutValueOtpRateLimitRef(db, uid);
54
+ await db.runTransaction(async (tx) => {
55
+ const metaSnap = await tx.get(metaRef);
56
+ const meta = metaSnap.exists
57
+ ? metaSnap.data()
58
+ : null;
59
+ const lastSentMs = resolveDate(meta?.lastSentAt)?.getTime() ?? 0;
60
+ const elapsed = Date.now() - lastSentMs;
61
+ if (elapsed < CHECKOUT_VALUE_OTP_COOLDOWN_MS) {
62
+ throw new AuthorizationError("checkoutValueOtpRateLimit");
63
+ }
64
+ tx.set(metaRef, { lastSentAt: new Date() }, { merge: true });
65
+ });
66
+ }
67
+ /** Build the checkout-value OTP WhatsApp/SMS message body. */
68
+ export function buildCheckoutValueOtpMessage(code, siteName) {
69
+ return (`*${siteName} — Order Verification*\n\n` +
70
+ `Your verification code for this high-value order is: *${code}*\n\n` +
71
+ `This code expires in ${CHECKOUT_VALUE_OTP_EXPIRY_MINUTES} minutes. ` +
72
+ `If you did not request this, please ignore this message.`);
73
+ }
@@ -16,6 +16,12 @@ export declare class UserRepository extends BaseRepository<UserDocument> {
16
16
  findByRole(role: UserRole): Promise<UserDocument[]>;
17
17
  findVerified(limit?: number): Promise<UserDocument[]>;
18
18
  findActive(limit?: number): Promise<UserDocument[]>;
19
+ /**
20
+ * Cloud Functions: temporary hard-bans past their `hardBanExpiresAt` —
21
+ * the `hardBanReinstatement` sweep re-enables Auth login for these.
22
+ * Permanent bans (`hardBanExpiresAt` null/absent) never match this query.
23
+ */
24
+ getExpiredHardBans(): Promise<UserDocument[]>;
19
25
  update(uid: string, data: Partial<UserDocument>): Promise<UserDocument>;
20
26
  markEmailAsVerified(uid: string): Promise<UserDocument>;
21
27
  disable(uid: string): Promise<UserDocument>;
@@ -106,6 +106,25 @@ export class UserRepository extends BaseRepository {
106
106
  throw new DatabaseError("Failed to fetch active users", error);
107
107
  }
108
108
  }
109
+ /**
110
+ * Cloud Functions: temporary hard-bans past their `hardBanExpiresAt` —
111
+ * the `hardBanReinstatement` sweep re-enables Auth login for these.
112
+ * Permanent bans (`hardBanExpiresAt` null/absent) never match this query.
113
+ */
114
+ async getExpiredHardBans() {
115
+ try {
116
+ const snapshot = await this.getCollection()
117
+ .where(USER_FIELDS.IS_DISABLED, "==", true)
118
+ .where(USER_FIELDS.HARD_BAN_EXPIRES_AT, "<=", new Date())
119
+ .limit(500)
120
+ .get();
121
+ return snapshot.docs.map((doc) => this.mapDoc(doc));
122
+ }
123
+ catch (error) {
124
+ void normalizeError(error);
125
+ throw new DatabaseError("Failed to fetch expired hard bans", error);
126
+ }
127
+ }
109
128
  async update(uid, data) {
110
129
  const encrypted = this.encryptUserData(data);
111
130
  return super.update(uid, encrypted);
@@ -44,6 +44,8 @@ export interface UserDocument extends BaseDocument {
44
44
  passwordHash?: string;
45
45
  emailVerified: boolean;
46
46
  disabled: boolean;
47
+ /** Hard-ban flag — disables Firebase Auth login. Distinct from `disabled` (used elsewhere); read alongside `hardBanReason`/`hardBannedAt`/`hardBannedBy`. Set by `hardBanCascade`, cleared by `hardBanReinstatement` for temporary bans. */
48
+ isDisabled?: boolean;
47
49
  storeId?: string;
48
50
  storeSlug?: string;
49
51
  storeStatus?: "pending" | "approved" | "rejected";
@@ -95,6 +97,12 @@ export interface UserDocument extends BaseDocument {
95
97
  hardBanReason?: string;
96
98
  hardBannedAt?: Date;
97
99
  hardBannedBy?: string;
100
+ /** Null/absent = permanent hard ban (the default). A future Date makes this a temporary ban, auto-reinstated by the `hardBanReinstatement` sweep — mirrors `UserSoftBan.expiresAt`'s null-vs-past-date convention. Set only by the payment-fraud-reject path today. */
101
+ hardBanExpiresAt?: Date | null;
102
+ /** Order that triggered a fraud-rejection ban, for traceability. */
103
+ hardBanFraudOrderId?: string;
104
+ /** Stamped by `hardBanReinstatement` when a temporary ban's `hardBanExpiresAt` passes and login is re-enabled. `hardBanReason`/`hardBannedAt`/`hardBannedBy`/`hardBanExpiresAt` are left in place as historical record — not cleared. */
105
+ hardBanReinstatedAt?: Date;
98
106
  /** Timestamp when user confirmed they read the scam awareness guide. Required before full platform access. */
99
107
  scamAwarenessAcknowledgedAt?: Date;
100
108
  /** User-controlled notification channel and type preferences. */
@@ -206,6 +214,8 @@ export declare const USER_FIELDS: {
206
214
  readonly PASSWORD_HASH: "passwordHash";
207
215
  readonly EMAIL_VERIFIED: "emailVerified";
208
216
  readonly DISABLED: "disabled";
217
+ readonly IS_DISABLED: "isDisabled";
218
+ readonly HARD_BAN_EXPIRES_AT: "hardBanExpiresAt";
209
219
  readonly CREATED_AT: "createdAt";
210
220
  readonly UPDATED_AT: "updatedAt";
211
221
  readonly STORE_ID: "storeId";
@@ -102,6 +102,8 @@ export const USER_FIELDS = {
102
102
  PASSWORD_HASH: "passwordHash",
103
103
  EMAIL_VERIFIED: "emailVerified",
104
104
  DISABLED: "disabled",
105
+ IS_DISABLED: "isDisabled",
106
+ HARD_BAN_EXPIRES_AT: "hardBanExpiresAt",
105
107
  CREATED_AT: "createdAt",
106
108
  UPDATED_AT: "updatedAt",
107
109
  STORE_ID: "storeId",
@@ -14,4 +14,4 @@ export declare function mergeGuestCart(userId: string, items: Array<{
14
14
  quantity: number;
15
15
  }>): Promise<void>;
16
16
  export declare function getCart(userId: string): Promise<CartDocument | null>;
17
- export declare function updateCartItemShipping(userId: string, itemId: string, providerId: string, feeInPaise: number): Promise<CartDocument>;
17
+ export declare function updateCartItemShipping(userId: string, itemId: string, providerId: string, fee: number): Promise<CartDocument>;
@@ -77,11 +77,11 @@ export async function mergeGuestCart(userId, items) {
77
77
  export async function getCart(userId) {
78
78
  return cartRepository.findByUserId(userId);
79
79
  }
80
- export async function updateCartItemShipping(userId, itemId, providerId, feeInPaise) {
80
+ export async function updateCartItemShipping(userId, itemId, providerId, fee) {
81
81
  if (!itemId || !providerId)
82
82
  throw new ValidationError("itemId and providerId are required");
83
- if (!Number.isFinite(feeInPaise) || feeInPaise < 0) {
84
- throw new ValidationError("feeInPaise must be a non-negative number");
83
+ if (!Number.isFinite(fee) || fee < 0) {
84
+ throw new ValidationError("fee must be a non-negative number");
85
85
  }
86
- return cartRepository.updateItemShipping(userId, itemId, providerId, feeInPaise);
86
+ return cartRepository.updateItemShipping(userId, itemId, providerId, fee);
87
87
  }
@@ -8,8 +8,8 @@ export interface CartOrderGroup {
8
8
  storeName: string;
9
9
  orderType: string;
10
10
  items: JsonArray;
11
- subtotalInPaise: number;
12
- shippingFeeInPaise: number;
11
+ subtotal: number;
12
+ shippingFee: number;
13
13
  }
14
14
  export interface CartViewProps {
15
15
  labels?: {
@@ -11,11 +11,11 @@ export interface ShippingPickerProps {
11
11
  providers: ShippingProviderConfig[];
12
12
  /** Currently persisted provider id (from CartItemDocument.chosenShippingProviderId). */
13
13
  selectedProviderId?: string;
14
- /** Order subtotal in paise — used to evaluate freeAboveInPaise + percentOfOrder rules. */
15
- subtotalInPaise?: number;
14
+ /** Order subtotal, decimal rupees — used to evaluate freeAbove + percentOfOrder rules. */
15
+ subtotal?: number;
16
16
  /** Called when the buyer picks (or changes) a provider. */
17
- onPickProvider: (providerId: string, feeInPaise: number) => void | Promise<void>;
17
+ onPickProvider: (providerId: string, fee: number) => void | Promise<void>;
18
18
  isLoading?: boolean;
19
19
  className?: string;
20
20
  }
21
- export declare function ShippingPicker({ providers, selectedProviderId, subtotalInPaise, onPickProvider, isLoading, className, }: ShippingPickerProps): React.JSX.Element;
21
+ export declare function ShippingPicker({ providers, selectedProviderId, subtotal, onPickProvider, isLoading, className, }: ShippingPickerProps): React.JSX.Element;