@mohasinac/appkit 3.0.4 → 3.1.0

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 (320) hide show
  1. package/dist/_internal/client/features/lottery/LotteryAdminEditView.d.ts +42 -0
  2. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +86 -0
  3. package/dist/_internal/client/features/lottery/LotteryAdminSlotView.d.ts +14 -0
  4. package/dist/_internal/client/features/lottery/LotteryAdminSlotView.js +46 -0
  5. package/dist/_internal/client/features/lottery/LotteryDetailView.d.ts +28 -0
  6. package/dist/_internal/client/features/lottery/LotteryDetailView.js +17 -0
  7. package/dist/_internal/client/features/lottery/LotteryEntriesView.d.ts +23 -0
  8. package/dist/_internal/client/features/lottery/LotteryEntriesView.js +58 -0
  9. package/dist/_internal/client/features/lottery/LotteryListView.d.ts +21 -0
  10. package/dist/_internal/client/features/lottery/LotteryListView.js +25 -0
  11. package/dist/_internal/client/features/lottery/LotteryPullForm.d.ts +19 -0
  12. package/dist/_internal/client/features/lottery/LotteryPullForm.js +65 -0
  13. package/dist/_internal/client/features/lottery/LotterySlotGrid.d.ts +13 -0
  14. package/dist/_internal/client/features/lottery/LotterySlotGrid.js +21 -0
  15. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.d.ts +28 -0
  16. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +18 -0
  17. package/dist/_internal/server/features/auctions/__tests__/service.test.d.ts +1 -0
  18. package/dist/_internal/server/features/auctions/__tests__/service.test.js +140 -0
  19. package/dist/_internal/server/features/auctions/data.d.ts +2 -4
  20. package/dist/_internal/server/features/auctions/data.js +3 -9
  21. package/dist/_internal/server/features/checkout/__tests__/actions.test.d.ts +1 -0
  22. package/dist/_internal/server/features/checkout/__tests__/actions.test.js +600 -0
  23. package/dist/_internal/server/features/classified/adapters.d.ts +2 -15
  24. package/dist/_internal/server/features/classified/adapters.js +2 -17
  25. package/dist/_internal/server/features/classified/data.d.ts +1 -6
  26. package/dist/_internal/server/features/classified/data.js +2 -10
  27. package/dist/_internal/server/features/digital-code/adapters.d.ts +2 -15
  28. package/dist/_internal/server/features/digital-code/adapters.js +2 -17
  29. package/dist/_internal/server/features/digital-code/data.d.ts +1 -6
  30. package/dist/_internal/server/features/digital-code/data.js +2 -10
  31. package/dist/_internal/server/features/live/adapters.d.ts +2 -15
  32. package/dist/_internal/server/features/live/adapters.js +2 -17
  33. package/dist/_internal/server/features/live/data.d.ts +1 -6
  34. package/dist/_internal/server/features/live/data.js +2 -10
  35. package/dist/_internal/server/features/lottery/actions.d.ts +43 -0
  36. package/dist/_internal/server/features/lottery/actions.js +243 -0
  37. package/dist/_internal/server/features/lottery/adapters.d.ts +9 -0
  38. package/dist/_internal/server/features/lottery/adapters.js +21 -0
  39. package/dist/_internal/server/features/lottery/data.d.ts +20 -0
  40. package/dist/_internal/server/features/lottery/data.js +41 -0
  41. package/dist/_internal/server/features/lottery/metadata.d.ts +6 -0
  42. package/dist/_internal/server/features/lottery/metadata.js +31 -0
  43. package/dist/_internal/server/features/pre-orders/data.d.ts +2 -4
  44. package/dist/_internal/server/features/pre-orders/data.js +3 -9
  45. package/dist/_internal/server/features/prize-draws/actions.d.ts +2 -0
  46. package/dist/_internal/server/features/prize-draws/actions.js +22 -0
  47. package/dist/_internal/server/features/prize-draws/data.d.ts +1 -17
  48. package/dist/_internal/server/features/prize-draws/data.js +2 -20
  49. package/dist/_internal/server/features/prize-draws/index.d.ts +3 -1
  50. package/dist/_internal/server/features/prize-draws/index.js +2 -0
  51. package/dist/_internal/server/features/prize-draws/service.d.ts +3 -0
  52. package/dist/_internal/server/features/prize-draws/service.js +19 -0
  53. package/dist/_internal/server/features/refunds/__tests__/actions.test.d.ts +1 -0
  54. package/dist/_internal/server/features/refunds/__tests__/actions.test.js +263 -0
  55. package/dist/_internal/server/features/shared/listing-adapters.d.ts +19 -0
  56. package/dist/_internal/server/features/shared/listing-adapters.js +20 -0
  57. package/dist/_internal/server/features/shared/listing-data-factory.d.ts +9 -0
  58. package/dist/_internal/server/features/shared/listing-data-factory.js +33 -0
  59. package/dist/_internal/server/features/stores/data.d.ts +3 -14
  60. package/dist/_internal/server/features/stores/data.js +6 -44
  61. package/dist/_internal/server/jobs/core/__tests__/auctionSettlement.test.d.ts +1 -0
  62. package/dist/_internal/server/jobs/core/__tests__/auctionSettlement.test.js +249 -0
  63. package/dist/_internal/server/jobs/core/__tests__/onBidPlaced.test.d.ts +1 -0
  64. package/dist/_internal/server/jobs/core/__tests__/onBidPlaced.test.js +201 -0
  65. package/dist/_internal/server/jobs/core/__tests__/onOrderCreate.test.d.ts +1 -0
  66. package/dist/_internal/server/jobs/core/__tests__/onOrderCreate.test.js +169 -0
  67. package/dist/_internal/server/jobs/core/__tests__/onOrderStatusChange.test.d.ts +1 -0
  68. package/dist/_internal/server/jobs/core/__tests__/onOrderStatusChange.test.js +148 -0
  69. package/dist/_internal/server/jobs/core/__tests__/onProductStockChange.test.d.ts +1 -0
  70. package/dist/_internal/server/jobs/core/__tests__/onProductStockChange.test.js +210 -0
  71. package/dist/_internal/server/jobs/core/__tests__/onReviewWrite.test.d.ts +1 -0
  72. package/dist/_internal/server/jobs/core/__tests__/onReviewWrite.test.js +190 -0
  73. package/dist/_internal/server/jobs/core/__tests__/onUserBanChange.test.d.ts +1 -0
  74. package/dist/_internal/server/jobs/core/__tests__/onUserBanChange.test.js +161 -0
  75. package/dist/_internal/server/jobs/core/__tests__/payoutBatch.test.d.ts +1 -0
  76. package/dist/_internal/server/jobs/core/__tests__/payoutBatch.test.js +302 -0
  77. package/dist/_internal/server/jobs/core/__tests__/triggerEventRaffle.test.d.ts +1 -0
  78. package/dist/_internal/server/jobs/core/__tests__/triggerEventRaffle.test.js +252 -0
  79. package/dist/_internal/server/jobs/core/__tests__/wrapJobHandler.test.d.ts +1 -0
  80. package/dist/_internal/server/jobs/core/__tests__/wrapJobHandler.test.js +129 -0
  81. package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
  82. package/dist/_internal/shared/actions/action-registry.js +46 -0
  83. package/dist/_internal/shared/features/cart/schema.d.ts +8 -8
  84. package/dist/_internal/shared/features/cart/schema.js +3 -0
  85. package/dist/_internal/shared/features/products/schema.d.ts +8 -8
  86. package/dist/_internal/shared/listing-types/_registry.js +2 -0
  87. package/dist/_internal/shared/listing-types/auction/schema.d.ts +3 -1
  88. package/dist/_internal/shared/listing-types/auction/schema.js +7 -1
  89. package/dist/_internal/shared/listing-types/classified/schema.d.ts +2 -1
  90. package/dist/_internal/shared/listing-types/classified/schema.js +3 -1
  91. package/dist/_internal/shared/listing-types/digital-code/schema.d.ts +3 -1
  92. package/dist/_internal/shared/listing-types/digital-code/schema.js +7 -1
  93. package/dist/_internal/shared/listing-types/live/schema.d.ts +2 -1
  94. package/dist/_internal/shared/listing-types/live/schema.js +3 -1
  95. package/dist/_internal/shared/listing-types/pre-order/schema.d.ts +3 -1
  96. package/dist/_internal/shared/listing-types/pre-order/schema.js +7 -1
  97. package/dist/_internal/shared/listing-types/prize-draw/schema.d.ts +3 -1
  98. package/dist/_internal/shared/listing-types/prize-draw/schema.js +13 -1
  99. package/dist/_internal/shared/listing-types/standard/schema.d.ts +2 -1
  100. package/dist/_internal/shared/listing-types/standard/schema.js +4 -1
  101. package/dist/_internal/shared/types/base-document.d.ts +15 -0
  102. package/dist/_internal/shared/types/base-document.js +1 -0
  103. package/dist/_internal/shared/types/index.d.ts +2 -0
  104. package/dist/_internal/shared/types/index.js +1 -0
  105. package/dist/client.d.ts +13 -4
  106. package/dist/client.js +11 -2
  107. package/dist/constants/api-endpoints.d.ts +12 -0
  108. package/dist/constants/api-endpoints.js +4 -0
  109. package/dist/constants/field-names.d.ts +5 -1
  110. package/dist/constants/field-names.js +5 -1
  111. package/dist/features/addresses/repository/__tests__/addresses.repository.test.d.ts +1 -0
  112. package/dist/features/addresses/repository/__tests__/addresses.repository.test.js +386 -0
  113. package/dist/features/addresses/schemas/firestore.d.ts +2 -4
  114. package/dist/features/admin/api/bids/route.d.ts +2 -2
  115. package/dist/features/admin/api/coupons/route.d.ts +2 -2
  116. package/dist/features/admin/api/products/route.d.ts +2 -2
  117. package/dist/features/admin/api/reviews/route.d.ts +2 -2
  118. package/dist/features/admin/components/AdminFulfillmentView.d.ts +6 -0
  119. package/dist/features/admin/components/AdminFulfillmentView.js +107 -0
  120. package/dist/features/admin/components/AdminProductEditorView.js +21 -9
  121. package/dist/features/admin/components/AdminProductsView.js +3 -0
  122. package/dist/features/admin/components/DataListingView.d.ts +1 -0
  123. package/dist/features/admin/components/index.d.ts +2 -0
  124. package/dist/features/admin/components/index.js +1 -0
  125. package/dist/features/admin/repository/__tests__/notification.repository.test.d.ts +1 -0
  126. package/dist/features/admin/repository/__tests__/notification.repository.test.js +356 -0
  127. package/dist/features/admin/repository/__tests__/site-settings.repository.test.d.ts +1 -0
  128. package/dist/features/admin/repository/__tests__/site-settings.repository.test.js +298 -0
  129. package/dist/features/admin/schemas/firestore.d.ts +3 -8
  130. package/dist/features/auctions/repository/__tests__/bid.repository.test.d.ts +1 -0
  131. package/dist/features/auctions/repository/__tests__/bid.repository.test.js +290 -0
  132. package/dist/features/auctions/schemas/firestore.d.ts +2 -4
  133. package/dist/features/auctions/schemas/index.d.ts +2 -2
  134. package/dist/features/auth/api/route.d.ts +2 -2
  135. package/dist/features/auth/repository/__tests__/session.repository.test.d.ts +1 -0
  136. package/dist/features/auth/repository/__tests__/session.repository.test.js +310 -0
  137. package/dist/features/auth/repository/__tests__/session.test.d.ts +1 -0
  138. package/dist/features/auth/repository/__tests__/session.test.js +146 -0
  139. package/dist/features/auth/repository/__tests__/sms-counter.repository.test.d.ts +1 -0
  140. package/dist/features/auth/repository/__tests__/sms-counter.repository.test.js +171 -0
  141. package/dist/features/auth/repository/__tests__/sms-counter.test.d.ts +1 -0
  142. package/dist/features/auth/repository/__tests__/sms-counter.test.js +88 -0
  143. package/dist/features/auth/repository/__tests__/token.repository.test.d.ts +1 -0
  144. package/dist/features/auth/repository/__tests__/token.repository.test.js +260 -0
  145. package/dist/features/auth/repository/__tests__/token.test.d.ts +1 -0
  146. package/dist/features/auth/repository/__tests__/token.test.js +140 -0
  147. package/dist/features/auth/repository/__tests__/user.repository.test.d.ts +1 -0
  148. package/dist/features/auth/repository/__tests__/user.repository.test.js +352 -0
  149. package/dist/features/auth/repository/__tests__/user.test.d.ts +1 -0
  150. package/dist/features/auth/repository/__tests__/user.test.js +226 -0
  151. package/dist/features/auth/repository/session.repository.js +10 -1
  152. package/dist/features/before-after/schemas/index.d.ts +2 -2
  153. package/dist/features/blog/schemas/firestore.d.ts +2 -4
  154. package/dist/features/blog/schemas/index.d.ts +4 -4
  155. package/dist/features/cart/repository/__tests__/cart.repository.test.d.ts +1 -0
  156. package/dist/features/cart/repository/__tests__/cart.repository.test.js +371 -0
  157. package/dist/features/cart/repository/cart.repository.js +2 -2
  158. package/dist/features/cart/schemas/firestore.d.ts +2 -4
  159. package/dist/features/categories/api/[id]/route.d.ts +4 -4
  160. package/dist/features/categories/api/route.d.ts +2 -2
  161. package/dist/features/categories/repository/__tests__/categories.repository.test.d.ts +1 -0
  162. package/dist/features/categories/repository/__tests__/categories.repository.test.js +813 -0
  163. package/dist/features/categories/schemas/firestore.d.ts +2 -4
  164. package/dist/features/categories/schemas/index.d.ts +4 -4
  165. package/dist/features/events/components/EventCard.js +1 -0
  166. package/dist/features/events/repository/__tests__/event.repository.test.d.ts +1 -0
  167. package/dist/features/events/repository/__tests__/event.repository.test.js +299 -0
  168. package/dist/features/events/schemas/firestore.d.ts +5 -4
  169. package/dist/features/events/schemas/index.d.ts +836 -16
  170. package/dist/features/events/schemas/index.js +80 -1
  171. package/dist/features/events/types/index.d.ts +4 -1
  172. package/dist/features/faq/repository/__tests__/faqs.repository.test.d.ts +1 -0
  173. package/dist/features/faq/repository/__tests__/faqs.repository.test.js +311 -0
  174. package/dist/features/faq/schemas/firestore.d.ts +2 -4
  175. package/dist/features/faq/schemas/index.d.ts +2 -2
  176. package/dist/features/grouped/schemas/index.d.ts +2 -2
  177. package/dist/features/history/repository/__tests__/user-history.repository.test.d.ts +1 -0
  178. package/dist/features/history/repository/__tests__/user-history.repository.test.js +180 -0
  179. package/dist/features/homepage/api/[id]/route.d.ts +4 -4
  180. package/dist/features/homepage/api/carousel/[id]/route.d.ts +4 -4
  181. package/dist/features/homepage/api/carousel/route.d.ts +2 -2
  182. package/dist/features/homepage/api/route.d.ts +2 -2
  183. package/dist/features/homepage/repository/__tests__/carousel.repository.test.d.ts +1 -0
  184. package/dist/features/homepage/repository/__tests__/carousel.repository.test.js +182 -0
  185. package/dist/features/homepage/repository/__tests__/homepage-sections.repository.test.d.ts +1 -0
  186. package/dist/features/homepage/repository/__tests__/homepage-sections.repository.test.js +185 -0
  187. package/dist/features/homepage/schemas/firestore.d.ts +4 -12
  188. package/dist/features/homepage/schemas/index.d.ts +2 -2
  189. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +33 -0
  190. package/dist/features/lottery/repository/lottery-entry.repository.js +130 -0
  191. package/dist/features/lottery/schemas/firestore.d.ts +49 -0
  192. package/dist/features/lottery/schemas/firestore.js +25 -0
  193. package/dist/features/lottery/schemas/zod.d.ts +113 -0
  194. package/dist/features/lottery/schemas/zod.js +39 -0
  195. package/dist/features/lottery/types/index.d.ts +67 -0
  196. package/dist/features/lottery/types/index.js +55 -0
  197. package/dist/features/messages/repository/__tests__/conversations.repository.test.d.ts +1 -0
  198. package/dist/features/messages/repository/__tests__/conversations.repository.test.js +257 -0
  199. package/dist/features/messages/schemas/firestore.d.ts +2 -4
  200. package/dist/features/messages/schemas/index.d.ts +2 -2
  201. package/dist/features/orders/repository/__tests__/orders.repository.test.d.ts +1 -0
  202. package/dist/features/orders/repository/__tests__/orders.repository.test.js +211 -0
  203. package/dist/features/orders/repository/orders.repository.d.ts +5 -0
  204. package/dist/features/orders/repository/orders.repository.js +26 -0
  205. package/dist/features/orders/schemas/firestore.d.ts +9 -5
  206. package/dist/features/orders/schemas/firestore.js +3 -0
  207. package/dist/features/payments/repository/__tests__/payout.repository.test.d.ts +1 -0
  208. package/dist/features/payments/repository/__tests__/payout.repository.test.js +292 -0
  209. package/dist/features/payments/schemas/firestore.d.ts +2 -4
  210. package/dist/features/pre-orders/schemas/index.d.ts +2 -2
  211. package/dist/features/products/api/[id]/route.d.ts +4 -4
  212. package/dist/features/products/api/route.d.ts +2 -2
  213. package/dist/features/products/constants/action-defs.d.ts +16 -0
  214. package/dist/features/products/constants/action-defs.js +16 -0
  215. package/dist/features/products/constants/listing-tabs.d.ts +48 -0
  216. package/dist/features/products/constants/listing-tabs.js +12 -0
  217. package/dist/features/products/repository/__tests__/product-features.repository.test.d.ts +1 -0
  218. package/dist/features/products/repository/__tests__/product-features.repository.test.js +329 -0
  219. package/dist/features/products/repository/__tests__/products.repository.test.d.ts +1 -0
  220. package/dist/features/products/repository/__tests__/products.repository.test.js +607 -0
  221. package/dist/features/products/repository/products.repository.d.ts +37 -0
  222. package/dist/features/products/repository/products.repository.js +28 -1
  223. package/dist/features/products/schemas/firestore.d.ts +23 -7
  224. package/dist/features/products/schemas/firestore.js +2 -0
  225. package/dist/features/products/schemas/index.d.ts +18 -18
  226. package/dist/features/products/schemas/index.js +4 -2
  227. package/dist/features/products/types/index.d.ts +3 -1
  228. package/dist/features/promotions/repository/__tests__/claimed-coupons.repository.test.d.ts +1 -0
  229. package/dist/features/promotions/repository/__tests__/claimed-coupons.repository.test.js +219 -0
  230. package/dist/features/promotions/repository/__tests__/coupons.repository.test.d.ts +1 -0
  231. package/dist/features/promotions/repository/__tests__/coupons.repository.test.js +480 -0
  232. package/dist/features/promotions/schemas/firestore.d.ts +2 -4
  233. package/dist/features/promotions/schemas/index.d.ts +4 -4
  234. package/dist/features/reviews/api/[id]/route.d.ts +4 -4
  235. package/dist/features/reviews/api/route.d.ts +2 -2
  236. package/dist/features/reviews/repository/__tests__/reviews.repository.test.d.ts +1 -0
  237. package/dist/features/reviews/repository/__tests__/reviews.repository.test.js +327 -0
  238. package/dist/features/reviews/schemas/firestore.d.ts +2 -4
  239. package/dist/features/reviews/schemas/index.d.ts +2 -2
  240. package/dist/features/scams/repository/__tests__/scammer.repository.test.d.ts +1 -0
  241. package/dist/features/scams/repository/__tests__/scammer.repository.test.js +385 -0
  242. package/dist/features/scams/schemas/firestore.d.ts +2 -4
  243. package/dist/features/scams/schemas/index.d.ts +4 -4
  244. package/dist/features/search/repository/__tests__/search.repository.test.d.ts +1 -0
  245. package/dist/features/search/repository/__tests__/search.repository.test.js +369 -0
  246. package/dist/features/search/schemas/index.d.ts +2 -2
  247. package/dist/features/seller/api/coupons/route.d.ts +2 -2
  248. package/dist/features/seller/api/offers/route.d.ts +2 -2
  249. package/dist/features/seller/api/products/route.d.ts +2 -2
  250. package/dist/features/seller/api/store/route.d.ts +2 -2
  251. package/dist/features/seller/components/BarcodeField.d.ts +17 -0
  252. package/dist/features/seller/components/BarcodeField.js +30 -0
  253. package/dist/features/seller/components/FulfillmentView.d.ts +5 -0
  254. package/dist/features/seller/components/FulfillmentView.js +120 -0
  255. package/dist/features/seller/components/PrintCenterView.d.ts +3 -1
  256. package/dist/features/seller/components/PrintCenterView.js +52 -4
  257. package/dist/features/seller/components/SellerProductShell.d.ts +2 -0
  258. package/dist/features/seller/components/SellerProductShell.js +2 -1
  259. package/dist/features/seller/components/index.d.ts +4 -0
  260. package/dist/features/seller/components/index.js +2 -0
  261. package/dist/features/seller/repository/__tests__/offer.repository.test.d.ts +1 -0
  262. package/dist/features/seller/repository/__tests__/offer.repository.test.js +458 -0
  263. package/dist/features/seller/schemas/index.d.ts +2 -2
  264. package/dist/features/store-extensions/schemas/firestore.d.ts +12 -44
  265. package/dist/features/stores/components/StoreClassifiedsListing.d.ts +5 -0
  266. package/dist/features/stores/components/StoreClassifiedsListing.js +48 -0
  267. package/dist/features/stores/components/StoreClassifiedsPageView.d.ts +4 -0
  268. package/dist/features/stores/components/StoreClassifiedsPageView.js +20 -0
  269. package/dist/features/stores/components/StoreDetailLayoutView.js +23 -2
  270. package/dist/features/stores/components/StoreDigitalCodesListing.d.ts +5 -0
  271. package/dist/features/stores/components/StoreDigitalCodesListing.js +48 -0
  272. package/dist/features/stores/components/StoreDigitalCodesPageView.d.ts +4 -0
  273. package/dist/features/stores/components/StoreDigitalCodesPageView.js +20 -0
  274. package/dist/features/stores/components/StoreLiveItemsListing.d.ts +5 -0
  275. package/dist/features/stores/components/StoreLiveItemsListing.js +48 -0
  276. package/dist/features/stores/components/StoreLiveItemsPageView.d.ts +4 -0
  277. package/dist/features/stores/components/StoreLiveItemsPageView.js +20 -0
  278. package/dist/features/stores/components/index.d.ts +9 -0
  279. package/dist/features/stores/components/index.js +3 -0
  280. package/dist/features/stores/repository/__tests__/store.repository.test.d.ts +1 -0
  281. package/dist/features/stores/repository/__tests__/store.repository.test.js +261 -0
  282. package/dist/features/stores/schemas/firestore.d.ts +2 -4
  283. package/dist/features/stores/schemas/index.d.ts +4 -4
  284. package/dist/features/support/repository/__tests__/support.repository.test.d.ts +1 -0
  285. package/dist/features/support/repository/__tests__/support.repository.test.js +312 -0
  286. package/dist/features/support/schemas/firestore.d.ts +2 -4
  287. package/dist/features/support/schemas/index.d.ts +2 -2
  288. package/dist/features/wishlist/repository/__tests__/user-wishlist.repository.test.d.ts +1 -0
  289. package/dist/features/wishlist/repository/__tests__/user-wishlist.repository.test.js +139 -0
  290. package/dist/index.d.ts +14 -0
  291. package/dist/index.js +17 -0
  292. package/dist/next/api/routeHandler.d.ts +1 -1
  293. package/dist/next/routing/route-map.d.ts +24 -0
  294. package/dist/next/routing/route-map.js +11 -0
  295. package/dist/repositories/index.d.ts +1 -0
  296. package/dist/repositories/index.js +2 -0
  297. package/dist/schemas/registry.d.ts +24 -24
  298. package/dist/security/index.d.ts +1 -1
  299. package/dist/security/index.js +1 -1
  300. package/dist/security/pii-schemas.d.ts +2 -0
  301. package/dist/security/pii-schemas.js +6 -0
  302. package/dist/seed/actions/demo-seed-actions.d.ts +1 -1
  303. package/dist/seed/events-seed-data.js +85 -2
  304. package/dist/seed/grouped-listings-seed-data.d.ts +5 -2
  305. package/dist/seed/index.d.ts +1 -0
  306. package/dist/seed/index.js +1 -0
  307. package/dist/seed/lottery-entries-seed-data.d.ts +2 -0
  308. package/dist/seed/lottery-entries-seed-data.js +108 -0
  309. package/dist/seed/manifest.js +1 -0
  310. package/dist/seed/products-preorders-seed-data.d.ts +5 -2
  311. package/dist/seed/products-standard-seed-data.js +8 -0
  312. package/dist/server-entry.d.ts +3 -0
  313. package/dist/server-entry.js +3 -0
  314. package/dist/server.d.ts +10 -4
  315. package/dist/server.js +6 -0
  316. package/dist/styles.css +1 -1
  317. package/dist/tailwind-utilities.css +1 -1
  318. package/dist/utils/id-generators.d.ts +8 -0
  319. package/dist/utils/id-generators.js +14 -0
  320. package/package.json +2 -1
@@ -0,0 +1,369 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { SearchRepository } from "../search.repository";
3
+ function makePagedResult(overrides = {}) {
4
+ return {
5
+ data: [],
6
+ total: 0,
7
+ page: 1,
8
+ perPage: 24,
9
+ totalPages: 0,
10
+ ...overrides,
11
+ };
12
+ }
13
+ const mockFindAll = vi.fn().mockResolvedValue(makePagedResult());
14
+ const repo = new SearchRepository({ findAll: mockFindAll });
15
+ function captureFilters() {
16
+ const call = mockFindAll.mock.calls[0][0];
17
+ return call.filters;
18
+ }
19
+ function captureSieveQuery() {
20
+ return mockFindAll.mock.calls[0][0];
21
+ }
22
+ beforeEach(() => {
23
+ vi.clearAllMocks();
24
+ mockFindAll.mockResolvedValue(makePagedResult());
25
+ });
26
+ // ---------------------------------------------------------------------------
27
+ // Mandatory status filter
28
+ // ---------------------------------------------------------------------------
29
+ describe("SearchRepository.search — mandatory status==published", () => {
30
+ it("always appends status==published as the last filter", async () => {
31
+ await repo.search({});
32
+ const filters = captureFilters();
33
+ expect(filters.split(",").at(-1)).toBe("status==published");
34
+ });
35
+ it("includes status==published even when no other filters given", async () => {
36
+ await repo.search({});
37
+ const filters = captureFilters();
38
+ expect(filters).toBe("status==published");
39
+ });
40
+ it("includes status==published alongside other filters", async () => {
41
+ await repo.search({ q: "charizard", category: "category-trading-cards" });
42
+ const filters = captureFilters();
43
+ expect(filters).toContain("status==published");
44
+ });
45
+ it("status==published appears exactly once regardless of query shape", async () => {
46
+ await repo.search({ q: "test", category: "cat-1", minRating: 4 });
47
+ const filters = captureFilters();
48
+ const occurrences = filters.split(",").filter((p) => p === "status==published").length;
49
+ expect(occurrences).toBe(1);
50
+ });
51
+ });
52
+ // ---------------------------------------------------------------------------
53
+ // Text search filter
54
+ // ---------------------------------------------------------------------------
55
+ describe("SearchRepository.search — text query (q)", () => {
56
+ it("sets title_=<q> when q is provided", async () => {
57
+ await repo.search({ q: "charizard" });
58
+ expect(captureFilters()).toContain("title_=charizard");
59
+ });
60
+ it("does NOT add a title filter when q is undefined", async () => {
61
+ await repo.search({});
62
+ expect(captureFilters()).not.toContain("title_=");
63
+ });
64
+ it("does NOT add a title filter when q is empty string", async () => {
65
+ await repo.search({ q: "" });
66
+ expect(captureFilters()).not.toContain("title_=");
67
+ });
68
+ });
69
+ // ---------------------------------------------------------------------------
70
+ // Category filter
71
+ // ---------------------------------------------------------------------------
72
+ describe("SearchRepository.search — category", () => {
73
+ it("adds category==<slug> filter when category is provided", async () => {
74
+ await repo.search({ category: "category-trading-cards" });
75
+ expect(captureFilters()).toContain("category==category-trading-cards");
76
+ });
77
+ it("does NOT add category filter when category is undefined", async () => {
78
+ await repo.search({});
79
+ expect(captureFilters()).not.toContain("category==");
80
+ });
81
+ });
82
+ // ---------------------------------------------------------------------------
83
+ // Subcategory filter
84
+ // ---------------------------------------------------------------------------
85
+ describe("SearchRepository.search — subcategory", () => {
86
+ it("adds subcategory==<slug> filter when subcategory is provided", async () => {
87
+ await repo.search({ subcategory: "category-pokemon" });
88
+ expect(captureFilters()).toContain("subcategory==category-pokemon");
89
+ });
90
+ it("does NOT add subcategory filter when subcategory is undefined", async () => {
91
+ await repo.search({});
92
+ expect(captureFilters()).not.toContain("subcategory==");
93
+ });
94
+ });
95
+ // ---------------------------------------------------------------------------
96
+ // Price range filter
97
+ // ---------------------------------------------------------------------------
98
+ describe("SearchRepository.search — price range", () => {
99
+ it("adds price>=<min> filter when minPrice is provided", async () => {
100
+ await repo.search({ minPrice: 500 });
101
+ expect(captureFilters()).toContain("price>=500");
102
+ });
103
+ it("adds price<=<max> filter when maxPrice is provided", async () => {
104
+ await repo.search({ maxPrice: 10000 });
105
+ expect(captureFilters()).toContain("price<=10000");
106
+ });
107
+ it("adds both min and max when a price range is specified", async () => {
108
+ await repo.search({ minPrice: 100, maxPrice: 5000 });
109
+ const filters = captureFilters();
110
+ expect(filters).toContain("price>=100");
111
+ expect(filters).toContain("price<=5000");
112
+ });
113
+ it("does NOT add price filters when neither minPrice nor maxPrice provided", async () => {
114
+ await repo.search({});
115
+ expect(captureFilters()).not.toContain("price");
116
+ });
117
+ it("adds price>=0 filter when minPrice is 0", async () => {
118
+ await repo.search({ minPrice: 0 });
119
+ expect(captureFilters()).toContain("price>=0");
120
+ });
121
+ });
122
+ // ---------------------------------------------------------------------------
123
+ // Condition filter
124
+ // ---------------------------------------------------------------------------
125
+ describe("SearchRepository.search — condition", () => {
126
+ it("adds condition==<value> filter when condition is provided", async () => {
127
+ await repo.search({ condition: "mint" });
128
+ expect(captureFilters()).toContain("condition==mint");
129
+ });
130
+ it("does NOT add condition filter when condition is undefined", async () => {
131
+ await repo.search({});
132
+ expect(captureFilters()).not.toContain("condition==");
133
+ });
134
+ });
135
+ // ---------------------------------------------------------------------------
136
+ // listingType filter
137
+ // ---------------------------------------------------------------------------
138
+ describe("SearchRepository.search — listingType", () => {
139
+ it("adds listingType==auction filter for auction search", async () => {
140
+ await repo.search({ listingType: "auction" });
141
+ expect(captureFilters()).toContain("listingType==auction");
142
+ });
143
+ it("adds listingType==standard for standard search", async () => {
144
+ await repo.search({ listingType: "standard" });
145
+ expect(captureFilters()).toContain("listingType==standard");
146
+ });
147
+ it("adds listingType==pre-order for pre-order search", async () => {
148
+ await repo.search({ listingType: "pre-order" });
149
+ expect(captureFilters()).toContain("listingType==pre-order");
150
+ });
151
+ it("does NOT add listingType filter when listingType is undefined", async () => {
152
+ await repo.search({});
153
+ expect(captureFilters()).not.toContain("listingType==");
154
+ });
155
+ });
156
+ // ---------------------------------------------------------------------------
157
+ // In-stock filter
158
+ // ---------------------------------------------------------------------------
159
+ describe("SearchRepository.search — inStock", () => {
160
+ it("adds availableQuantity>0 filter when inStock: true", async () => {
161
+ await repo.search({ inStock: true });
162
+ expect(captureFilters()).toContain("availableQuantity>0");
163
+ });
164
+ it("does NOT add availableQuantity filter when inStock: false", async () => {
165
+ await repo.search({ inStock: false });
166
+ expect(captureFilters()).not.toContain("availableQuantity");
167
+ });
168
+ it("does NOT add availableQuantity filter when inStock is undefined", async () => {
169
+ await repo.search({});
170
+ expect(captureFilters()).not.toContain("availableQuantity");
171
+ });
172
+ });
173
+ // ---------------------------------------------------------------------------
174
+ // Minimum rating filter
175
+ // ---------------------------------------------------------------------------
176
+ describe("SearchRepository.search — minRating", () => {
177
+ it("adds averageRating>=<value> filter when minRating is provided", async () => {
178
+ await repo.search({ minRating: 4 });
179
+ expect(captureFilters()).toContain("averageRating>=4");
180
+ });
181
+ it("adds averageRating>=0 filter when minRating is 0", async () => {
182
+ await repo.search({ minRating: 0 });
183
+ expect(captureFilters()).toContain("averageRating>=0");
184
+ });
185
+ it("does NOT add averageRating filter when minRating is undefined", async () => {
186
+ await repo.search({});
187
+ expect(captureFilters()).not.toContain("averageRating");
188
+ });
189
+ });
190
+ // ---------------------------------------------------------------------------
191
+ // All filters combined
192
+ // ---------------------------------------------------------------------------
193
+ describe("SearchRepository.search — combined filters", () => {
194
+ it("builds combined filter string for full-featured query", async () => {
195
+ const query = {
196
+ q: "pikachu",
197
+ category: "category-trading-cards",
198
+ subcategory: "category-pokemon",
199
+ minPrice: 100,
200
+ maxPrice: 5000,
201
+ condition: "near-mint",
202
+ listingType: "standard",
203
+ inStock: true,
204
+ minRating: 3,
205
+ };
206
+ await repo.search(query);
207
+ const filters = captureFilters();
208
+ expect(filters).toContain("title_=pikachu");
209
+ expect(filters).toContain("category==category-trading-cards");
210
+ expect(filters).toContain("subcategory==category-pokemon");
211
+ expect(filters).toContain("price>=100");
212
+ expect(filters).toContain("price<=5000");
213
+ expect(filters).toContain("condition==near-mint");
214
+ expect(filters).toContain("listingType==standard");
215
+ expect(filters).toContain("availableQuantity>0");
216
+ expect(filters).toContain("averageRating>=3");
217
+ expect(filters).toContain("status==published");
218
+ // status is always last
219
+ expect(filters.split(",").at(-1)).toBe("status==published");
220
+ });
221
+ });
222
+ // ---------------------------------------------------------------------------
223
+ // Sorting
224
+ // ---------------------------------------------------------------------------
225
+ describe("SearchRepository.search — sort", () => {
226
+ it("defaults to sort: createdAt, order: asc when no sort specified", async () => {
227
+ await repo.search({});
228
+ const q = captureSieveQuery();
229
+ expect(q.sort).toBe("createdAt");
230
+ expect(q.order).toBe("asc");
231
+ });
232
+ it("ascending sort: sort='price', no leading dash → order: asc", async () => {
233
+ await repo.search({ sort: "price" });
234
+ const q = captureSieveQuery();
235
+ expect(q.sort).toBe("price");
236
+ expect(q.order).toBe("asc");
237
+ });
238
+ it("descending sort: sort='-price' → order: desc, field: price", async () => {
239
+ await repo.search({ sort: "-price" });
240
+ const q = captureSieveQuery();
241
+ expect(q.sort).toBe("price");
242
+ expect(q.order).toBe("desc");
243
+ });
244
+ it("descending sort: sort='-createdAt' → order: desc, field: createdAt", async () => {
245
+ await repo.search({ sort: "-createdAt" });
246
+ const q = captureSieveQuery();
247
+ expect(q.sort).toBe("createdAt");
248
+ expect(q.order).toBe("desc");
249
+ });
250
+ it("ascending sort: sort='averageRating' → order: asc, field: averageRating", async () => {
251
+ await repo.search({ sort: "averageRating" });
252
+ const q = captureSieveQuery();
253
+ expect(q.sort).toBe("averageRating");
254
+ expect(q.order).toBe("asc");
255
+ });
256
+ });
257
+ // ---------------------------------------------------------------------------
258
+ // Pagination
259
+ // ---------------------------------------------------------------------------
260
+ describe("SearchRepository.search — pagination", () => {
261
+ it("defaults to page: 1 when not provided", async () => {
262
+ await repo.search({});
263
+ const q = captureSieveQuery();
264
+ expect(q.page).toBe(1);
265
+ });
266
+ it("defaults to perPage: 24 when pageSize not provided", async () => {
267
+ await repo.search({});
268
+ const q = captureSieveQuery();
269
+ expect(q.perPage).toBe(24);
270
+ });
271
+ it("forwards custom page and pageSize", async () => {
272
+ await repo.search({ page: 3, pageSize: 12 });
273
+ const q = captureSieveQuery();
274
+ expect(q.page).toBe(3);
275
+ expect(q.perPage).toBe(12);
276
+ });
277
+ });
278
+ // ---------------------------------------------------------------------------
279
+ // Response shape
280
+ // ---------------------------------------------------------------------------
281
+ describe("SearchRepository.search — response shape", () => {
282
+ it("maps PagedResult to SearchResponse correctly", async () => {
283
+ mockFindAll.mockResolvedValue({
284
+ data: [{ id: "p-1", title: "Charizard" }],
285
+ total: 1,
286
+ page: 1,
287
+ perPage: 24,
288
+ totalPages: 1,
289
+ });
290
+ const result = await repo.search({ q: "charizard" });
291
+ expect(result.items).toHaveLength(1);
292
+ expect(result.total).toBe(1);
293
+ expect(result.page).toBe(1);
294
+ expect(result.pageSize).toBe(24);
295
+ expect(result.totalPages).toBe(1);
296
+ });
297
+ it("hasMore: true when page < totalPages", async () => {
298
+ mockFindAll.mockResolvedValue({
299
+ data: [],
300
+ total: 100,
301
+ page: 1,
302
+ perPage: 24,
303
+ totalPages: 5,
304
+ });
305
+ const result = await repo.search({});
306
+ expect(result.hasMore).toBe(true);
307
+ });
308
+ it("hasMore: false when page == totalPages", async () => {
309
+ mockFindAll.mockResolvedValue({
310
+ data: [],
311
+ total: 24,
312
+ page: 1,
313
+ perPage: 24,
314
+ totalPages: 1,
315
+ });
316
+ const result = await repo.search({});
317
+ expect(result.hasMore).toBe(false);
318
+ });
319
+ it("hasMore: false when page > totalPages (edge case)", async () => {
320
+ mockFindAll.mockResolvedValue({
321
+ data: [],
322
+ total: 0,
323
+ page: 2,
324
+ perPage: 24,
325
+ totalPages: 1,
326
+ });
327
+ const result = await repo.search({});
328
+ expect(result.hasMore).toBe(false);
329
+ });
330
+ it("q is empty string in response when no q provided", async () => {
331
+ const result = await repo.search({});
332
+ expect(result.q).toBe("");
333
+ });
334
+ it("q reflects the search term in response", async () => {
335
+ const result = await repo.search({ q: "pokemon" });
336
+ expect(result.q).toBe("pokemon");
337
+ });
338
+ it("returns empty items array when no results", async () => {
339
+ mockFindAll.mockResolvedValue(makePagedResult());
340
+ const result = await repo.search({ q: "nonexistent-product" });
341
+ expect(result.items).toEqual([]);
342
+ expect(result.total).toBe(0);
343
+ });
344
+ });
345
+ // ---------------------------------------------------------------------------
346
+ // Filter string format
347
+ // ---------------------------------------------------------------------------
348
+ describe("SearchRepository.search — filter string format", () => {
349
+ it("joins multiple filters with commas", async () => {
350
+ await repo.search({ q: "test", category: "cat-1" });
351
+ const filters = captureFilters();
352
+ const parts = filters.split(",");
353
+ expect(parts.length).toBeGreaterThan(1);
354
+ // No empty segments (no stray commas)
355
+ expect(parts.every((p) => p.length > 0)).toBe(true);
356
+ });
357
+ it("single active filter + status produces exactly 2 comma-separated parts", async () => {
358
+ await repo.search({ category: "cat-1" });
359
+ const filters = captureFilters();
360
+ const parts = filters.split(",");
361
+ expect(parts).toHaveLength(2);
362
+ expect(parts[0]).toBe("category==cat-1");
363
+ expect(parts[1]).toBe("status==published");
364
+ });
365
+ it("empty query produces filter string with only status==published", async () => {
366
+ await repo.search({});
367
+ expect(captureFilters()).toBe("status==published");
368
+ });
369
+ });
@@ -21,9 +21,9 @@ export declare const searchProductItemSchema: z.ZodObject<{
21
21
  isPromoted: z.ZodOptional<z.ZodBoolean>;
22
22
  slug: z.ZodString;
23
23
  }, "strip", z.ZodTypeAny, {
24
- id: string;
25
24
  title: string;
26
25
  slug: string;
26
+ id: string;
27
27
  status?: string | undefined;
28
28
  currency?: string | undefined;
29
29
  featured?: boolean | undefined;
@@ -32,9 +32,9 @@ export declare const searchProductItemSchema: z.ZodObject<{
32
32
  price?: number | undefined;
33
33
  mainImage?: string | undefined;
34
34
  }, {
35
- id: string;
36
35
  title: string;
37
36
  slug: string;
37
+ id: string;
38
38
  status?: string | undefined;
39
39
  currency?: string | undefined;
40
40
  featured?: boolean | undefined;
@@ -12,6 +12,6 @@
12
12
  * export { sellerCouponsGET as GET } from "@mohasinac/feat-seller";
13
13
  * ```
14
14
  */
15
- export declare const GET: (request: Request, context: {
15
+ export declare const GET: (request: Request, context?: {
16
16
  params: Promise<Record<string, string>>;
17
- }) => Promise<Response>;
17
+ } | undefined) => Promise<Response>;
@@ -12,6 +12,6 @@
12
12
  * export { sellerOffersGET as GET } from "@mohasinac/feat-seller";
13
13
  * ```
14
14
  */
15
- export declare const GET: (request: Request, context: {
15
+ export declare const GET: (request: Request, context?: {
16
16
  params: Promise<Record<string, string>>;
17
- }) => Promise<Response>;
17
+ } | undefined) => Promise<Response>;
@@ -12,6 +12,6 @@
12
12
  * export { sellerProductsGET as GET } from "@mohasinac/feat-seller";
13
13
  * ```
14
14
  */
15
- export declare const GET: (request: Request, context: {
15
+ export declare const GET: (request: Request, context?: {
16
16
  params: Promise<Record<string, string>>;
17
- }) => Promise<Response>;
17
+ } | undefined) => Promise<Response>;
@@ -12,6 +12,6 @@
12
12
  * export { sellerStoreGET as GET } from "@mohasinac/feat-seller";
13
13
  * ```
14
14
  */
15
- export declare const GET: (request: Request, context: {
15
+ export declare const GET: (request: Request, context?: {
16
16
  params: Promise<Record<string, string>>;
17
- }) => Promise<Response>;
17
+ } | undefined) => Promise<Response>;
@@ -0,0 +1,17 @@
1
+ export interface BarcodeFieldProps {
2
+ label?: string;
3
+ value: string;
4
+ onChange: (value: string) => void;
5
+ /** Called when the scanner fires Enter after rapid character input (< 50 ms between keys). */
6
+ onScan?: (value: string) => void;
7
+ placeholder?: string;
8
+ helperText?: string;
9
+ autoFocus?: boolean;
10
+ readOnly?: boolean;
11
+ }
12
+ /**
13
+ * Text field that detects USB/Bluetooth barcode scanner input.
14
+ * Scanners type characters rapidly (< 50 ms per keydown) then send Enter.
15
+ * onScan is called when Enter follows rapid input; manual typing is ignored.
16
+ */
17
+ export declare function BarcodeField({ label, value, onChange, onScan, placeholder, helperText, autoFocus, readOnly, }: BarcodeFieldProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useCallback } from "react";
4
+ import { FieldInput } from "../../../ui/forms/FieldInput";
5
+ import { Text } from "../../../ui/components/Typography";
6
+ import { Stack } from "../../../ui/components/Layout";
7
+ /**
8
+ * Text field that detects USB/Bluetooth barcode scanner input.
9
+ * Scanners type characters rapidly (< 50 ms per keydown) then send Enter.
10
+ * onScan is called when Enter follows rapid input; manual typing is ignored.
11
+ */
12
+ export function BarcodeField({ label = "Barcode / Sticker ID", value, onChange, onScan, placeholder = "Scan or type barcode…", helperText, autoFocus, readOnly, }) {
13
+ const lastKeyTime = useRef(0);
14
+ const buffer = useRef("");
15
+ const handleKeyDown = useCallback((e) => {
16
+ const now = Date.now();
17
+ if (e.key === "Enter") {
18
+ e.preventDefault();
19
+ if (buffer.current) {
20
+ onScan?.(buffer.current);
21
+ buffer.current = "";
22
+ }
23
+ return;
24
+ }
25
+ const interval = now - lastKeyTime.current;
26
+ buffer.current = interval < 50 ? buffer.current + e.key : e.key;
27
+ lastKeyTime.current = now;
28
+ }, [onScan]);
29
+ return (_jsxs(Stack, { gap: "xs", children: [_jsx(FieldInput, { name: "barcodeId", label: label, type: "text", value: value, onChange: onChange, onKeyDown: handleKeyDown, placeholder: placeholder, autoFocus: autoFocus, readOnly: readOnly }), helperText && (_jsx(Text, { size: "xs", color: "muted", children: helperText }))] }));
30
+ }
@@ -0,0 +1,5 @@
1
+ export interface FulfillmentViewProps {
2
+ currentUserId?: string;
3
+ currentUserName?: string;
4
+ }
5
+ export declare function FulfillmentView({ currentUserId, }: FulfillmentViewProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,120 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useState } from "react";
4
+ import { Heading, Text } from "../../../ui/components/Typography";
5
+ import { Stack, Row } from "../../../ui/components/Layout";
6
+ import { Button } from "../../../ui/components/Button";
7
+ import { Badge } from "../../../ui/components/Badge";
8
+ import { apiClient } from "../../../http";
9
+ import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
10
+ import { BarcodeField } from "./BarcodeField";
11
+ import { normalizeError } from "../../../errors/normalize";
12
+ import { useToast } from "../../../ui";
13
+ function statusBadgeVariant(status) {
14
+ if (status === "confirmed")
15
+ return "warning";
16
+ if (status === "processing")
17
+ return "info";
18
+ if (status === "shipped")
19
+ return "success";
20
+ return "default";
21
+ }
22
+ export function FulfillmentView({ currentUserId, }) {
23
+ const [mode, setMode] = useState("scan");
24
+ const [orders, setOrders] = useState([]);
25
+ const [scanValue, setScanValue] = useState("");
26
+ const [scanResult, setScanResult] = useState(null);
27
+ const [scanError, setScanError] = useState(null);
28
+ const [filterMine, setFilterMine] = useState(false);
29
+ const [isLoadingOrders, setIsLoadingOrders] = useState(true);
30
+ const [isConfirming, setIsConfirming] = useState(false);
31
+ const [actionLoadingId, setActionLoadingId] = useState(null);
32
+ const { showToast } = useToast();
33
+ const fetchOrders = useCallback(async () => {
34
+ // toast-intentionally-silent: background data loader — stale list is kept on error
35
+ setIsLoadingOrders(true);
36
+ try {
37
+ const res = await apiClient.get(SELLER_ENDPOINTS.ORDERS_FULFILLMENT);
38
+ setOrders(res.orders ?? []);
39
+ }
40
+ catch {
41
+ // keep stale list on error
42
+ }
43
+ finally {
44
+ setIsLoadingOrders(false);
45
+ }
46
+ }, []);
47
+ useEffect(() => {
48
+ void fetchOrders();
49
+ }, [fetchOrders]);
50
+ const handleScan = useCallback(async (barcode) => {
51
+ setScanError(null);
52
+ setScanResult(null);
53
+ try {
54
+ const product = await apiClient.get(SELLER_ENDPOINTS.PRODUCTS_SCAN(barcode));
55
+ const matchedOrder = orders.find((o) => o.productId === product.id ||
56
+ o.items?.some((i) => i.productId === product.id));
57
+ if (!matchedOrder) {
58
+ setScanError(`No pending order found for barcode "${barcode}".`);
59
+ return;
60
+ }
61
+ setScanResult({ product, order: matchedOrder });
62
+ }
63
+ catch (err) {
64
+ setScanError(normalizeError(err).message);
65
+ }
66
+ }, [orders]);
67
+ const confirmPick = useCallback(async () => {
68
+ if (!scanResult)
69
+ return;
70
+ setIsConfirming(true);
71
+ try {
72
+ await apiClient.patch(SELLER_ENDPOINTS.ORDERS_BY_ID(scanResult.order.id), { markPicked: true });
73
+ setScanResult(null);
74
+ setScanValue("");
75
+ setScanError(null);
76
+ showToast("Order marked as picked!", "success");
77
+ await fetchOrders();
78
+ }
79
+ catch (err) {
80
+ setScanError(normalizeError(err).message);
81
+ }
82
+ finally {
83
+ setIsConfirming(false);
84
+ }
85
+ }, [scanResult, fetchOrders, showToast]);
86
+ const handleMarkPicked = useCallback(async (orderId) => {
87
+ setActionLoadingId(orderId + ":picked");
88
+ try {
89
+ await apiClient.patch(SELLER_ENDPOINTS.ORDERS_BY_ID(orderId), {
90
+ markPicked: true,
91
+ });
92
+ await fetchOrders();
93
+ }
94
+ finally {
95
+ setActionLoadingId(null);
96
+ }
97
+ }, [fetchOrders]);
98
+ const handleMarkPacked = useCallback(async (orderId) => {
99
+ setActionLoadingId(orderId + ":packed");
100
+ try {
101
+ await apiClient.patch(SELLER_ENDPOINTS.ORDERS_BY_ID(orderId), {
102
+ markPacked: true,
103
+ });
104
+ await fetchOrders();
105
+ }
106
+ finally {
107
+ setActionLoadingId(null);
108
+ }
109
+ }, [fetchOrders]);
110
+ const visibleOrders = filterMine
111
+ ? orders.filter((o) => o.assignedWorkerId === currentUserId)
112
+ : orders;
113
+ return (_jsxs(Stack, { gap: "md", padding: "md", children: [_jsxs(Row, { align: "center", justify: "between", gap: "sm", wrap: true, children: [_jsx(Heading, { level: 3, children: "Pick & Pack" }), _jsxs(Row, { gap: "xs", children: [_jsx(Button, { onClick: () => setMode("scan"), variant: mode === "scan" ? "primary" : "secondary", size: "sm", children: "Scan Mode" }), _jsx(Button, { onClick: () => setMode("list"), variant: mode === "list" ? "primary" : "secondary", size: "sm", children: "List Mode" })] })] }), mode === "scan" && (_jsxs(Stack, { gap: "md", children: [_jsx(BarcodeField, { autoFocus: true, value: scanValue, onChange: setScanValue, onScan: handleScan, helperText: "Point scanner at an item sticker or type the barcode and press Enter." }), scanError && (_jsx(Text, { color: "error", size: "sm", children: scanError })), scanResult && (_jsxs(Stack, { surface: "card", padding: "md", rounded: "md", gap: "sm", children: [_jsx(Text, { size: "xs", color: "muted", children: "Scanned item" }), _jsx(Heading, { level: 5, children: scanResult.product.title ?? scanResult.product.id }), _jsxs(Row, { gap: "md", wrap: true, children: [_jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "xs", color: "muted", children: "Order" }), _jsxs(Text, { size: "sm", weight: "medium", children: ["#", scanResult.order.id] })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "xs", color: "muted", children: "Buyer" }), _jsx(Text, { size: "sm", weight: "medium", children: scanResult.order.userName })] }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "xs", color: "muted", children: "Status" }), _jsx(Badge, { variant: statusBadgeVariant(scanResult.order.status), children: scanResult.order.status })] })] }), _jsxs(Row, { gap: "xs", children: [_jsx(Button, { variant: "primary", onClick: confirmPick, isLoading: isConfirming, children: "Confirm Pick" }), _jsx(Button, { variant: "secondary", onClick: () => {
114
+ setScanResult(null);
115
+ setScanValue("");
116
+ setScanError(null);
117
+ }, children: "Cancel" })] })] })), !scanResult && !scanError && (_jsx(Text, { color: "muted", size: "sm", children: orders.length === 0 && !isLoadingOrders
118
+ ? "No orders waiting — great work!"
119
+ : `${orders.length} order${orders.length === 1 ? "" : "s"} in queue.` }))] })), mode === "list" && (_jsxs(Stack, { gap: "sm", children: [_jsxs(Row, { align: "center", gap: "sm", children: [_jsx(Button, { variant: filterMine ? "primary" : "secondary", size: "sm", onClick: () => setFilterMine((v) => !v), children: filterMine ? "Showing My Orders" : "My Orders" }), _jsx(Text, { size: "xs", color: "muted", children: isLoadingOrders ? "Loading…" : `${visibleOrders.length} order${visibleOrders.length === 1 ? "" : "s"}` })] }), visibleOrders.length === 0 && !isLoadingOrders && (_jsx(Text, { color: "muted", children: "No orders waiting \u2014 great work!" })), visibleOrders.map((order) => (_jsxs(Stack, { surface: "card", padding: "sm", rounded: "md", gap: "xs", children: [_jsxs(Row, { align: "center", gap: "xs", wrap: true, children: [_jsxs(Text, { size: "sm", weight: "medium", children: ["#", order.id] }), _jsx(Badge, { variant: statusBadgeVariant(order.status), children: order.status }), order.pickedAt && (_jsx(Badge, { variant: "success", children: "Picked" })), order.packedAt && (_jsx(Badge, { variant: "success", children: "Packed" }))] }), _jsxs(Text, { size: "xs", color: "muted", children: [order.userName, order.items && order.items.length > 0 && (_jsxs(_Fragment, { children: [" \u00B7 ", order.items.map((i) => i.productTitle).join(", ")] }))] }), order.assignedWorkerId && (_jsxs(Text, { size: "xs", color: "muted", children: ["Assigned: ", order.assignedWorkerId === currentUserId ? "Me" : order.assignedWorkerId] })), _jsxs(Row, { gap: "xs", children: [!order.pickedAt && (_jsx(Button, { size: "sm", variant: "secondary", onClick: () => handleMarkPicked(order.id), isLoading: actionLoadingId === order.id + ":picked", children: "Mark Picked" })), order.pickedAt && !order.packedAt && (_jsx(Button, { size: "sm", variant: "secondary", onClick: () => handleMarkPacked(order.id), isLoading: actionLoadingId === order.id + ":packed", children: "Mark Packed" }))] })] }, order.id)))] }))] }));
120
+ }
@@ -14,6 +14,7 @@ interface PrintCenterProduct {
14
14
  condition?: string;
15
15
  stockCount?: number;
16
16
  physicalLocation?: string;
17
+ barcodeId?: string;
17
18
  }
18
19
  interface PrintCenterOrder {
19
20
  id: string;
@@ -25,6 +26,7 @@ interface PrintCenterOrder {
25
26
  productName: string;
26
27
  quantity: number;
27
28
  price: number;
29
+ barcodeId?: string;
28
30
  }[];
29
31
  physicalLocation?: string;
30
32
  }
@@ -36,5 +38,5 @@ interface PrintCenterViewProps {
36
38
  initialProducts?: PrintCenterProduct[];
37
39
  initialOrders?: PrintCenterOrder[];
38
40
  }
39
- export declare function PrintCenterView({ store, brandName }: PrintCenterViewProps): import("react/jsx-runtime").JSX.Element;
41
+ export declare function PrintCenterView({ store, brandName, initialProducts, initialOrders, }: PrintCenterViewProps): import("react/jsx-runtime").JSX.Element;
40
42
  export {};