@rpg-engine/long-bow 0.8.219 → 0.8.220

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 (35) hide show
  1. package/dist/components/DraggableContainer.d.ts +0 -6
  2. package/dist/components/Store/MetadataCollector.d.ts +2 -2
  3. package/dist/components/Store/Store.d.ts +10 -27
  4. package/dist/components/Store/StoreHeader.d.ts +14 -0
  5. package/dist/components/Store/hooks/useStoreCart.d.ts +2 -0
  6. package/dist/components/Store/hooks/useStoreMetadata.d.ts +4 -11
  7. package/dist/components/Store/hooks/useStoreTabs.d.ts +20 -0
  8. package/dist/components/Store/internal/packToBlueprint.d.ts +2 -0
  9. package/dist/components/Store/sections/StoreItemsSection.d.ts +5 -3
  10. package/dist/hooks/useStoreFiltering.d.ts +7 -4
  11. package/dist/long-bow.cjs.development.js +349 -396
  12. package/dist/long-bow.cjs.development.js.map +1 -1
  13. package/dist/long-bow.cjs.production.min.js +1 -1
  14. package/dist/long-bow.cjs.production.min.js.map +1 -1
  15. package/dist/long-bow.esm.js +351 -398
  16. package/dist/long-bow.esm.js.map +1 -1
  17. package/package.json +1 -1
  18. package/src/components/DraggableContainer.tsx +0 -24
  19. package/src/components/Store/CartView.tsx +7 -2
  20. package/src/components/Store/MetadataCollector.tsx +60 -40
  21. package/src/components/Store/Store.tsx +75 -282
  22. package/src/components/Store/StoreHeader.tsx +74 -0
  23. package/src/components/Store/__test__/MetadataCollector.spec.tsx +94 -164
  24. package/src/components/Store/__test__/Store.spec.tsx +4 -0
  25. package/src/components/Store/__test__/useStoreMetadata.spec.tsx +58 -156
  26. package/src/components/Store/__test__/useStoreTabs.spec.tsx +69 -0
  27. package/src/components/Store/hooks/useStoreCart.ts +5 -2
  28. package/src/components/Store/hooks/useStoreMetadata.ts +30 -48
  29. package/src/components/Store/hooks/useStoreTabs.ts +104 -0
  30. package/src/components/Store/internal/packToBlueprint.ts +21 -0
  31. package/src/components/Store/sections/StoreItemsSection.tsx +19 -60
  32. package/src/components/Store/sections/StorePacksSection.tsx +0 -1
  33. package/src/components/shared/ScrollableContent/ScrollableContent.tsx +3 -6
  34. package/src/hooks/useStoreFiltering.spec.tsx +79 -0
  35. package/src/hooks/useStoreFiltering.ts +27 -9
@@ -2474,10 +2474,6 @@ var DraggableContainer = function DraggableContainer(_ref) {
2474
2474
  height = _ref.height,
2475
2475
  minHeight = _ref.minHeight,
2476
2476
  minWidth = _ref.minWidth,
2477
- mobileWidth = _ref.mobileWidth,
2478
- mobileHeight = _ref.mobileHeight,
2479
- _ref$mobileBreakpoint = _ref.mobileBreakpoint,
2480
- mobileBreakpoint = _ref$mobileBreakpoint === void 0 ? 768 : _ref$mobileBreakpoint,
2481
2477
  className = _ref.className,
2482
2478
  _ref$type = _ref.type,
2483
2479
  type = _ref$type === void 0 ? exports.RPGUIContainerTypes.FramedGold : _ref$type,
@@ -2554,9 +2550,6 @@ var DraggableContainer = function DraggableContainer(_ref) {
2554
2550
  height: height || 'auto',
2555
2551
  minWidth: minWidth,
2556
2552
  minHeight: minHeight,
2557
- mobileWidth: mobileWidth,
2558
- mobileHeight: mobileHeight,
2559
- mobileBreakpoint: mobileBreakpoint,
2560
2553
  className: "rpgui-container " + type + " " + className,
2561
2554
  isFullScreen: isFullScreen,
2562
2555
  opacity: opacity
@@ -2573,7 +2566,7 @@ var DraggableContainer = function DraggableContainer(_ref) {
2573
2566
  var Container$a = /*#__PURE__*/styled__default.div.withConfig({
2574
2567
  displayName: "DraggableContainer__Container",
2575
2568
  componentId: "sc-184mpyl-0"
2576
- })(["height:", ";width:", ";min-width:", ";min-height:", ";display:flex;flex-wrap:wrap;image-rendering:pixelated;overflow-y:hidden;", " ", " ", " &.rpgui-container{padding-top:1.5rem;}"], function (props) {
2569
+ })(["height:", ";width:", ";min-width:", ";min-height:", ";display:flex;flex-wrap:wrap;image-rendering:pixelated;overflow-y:hidden;", " ", " &.rpgui-container{padding-top:1.5rem;}"], function (props) {
2577
2570
  return props.height;
2578
2571
  }, function (_ref2) {
2579
2572
  var width = _ref2.width;
@@ -2590,11 +2583,6 @@ var Container$a = /*#__PURE__*/styled__default.div.withConfig({
2590
2583
  }, function (_ref6) {
2591
2584
  var isFullScreen = _ref6.isFullScreen;
2592
2585
  return isFullScreen && styled.css(["justify-content:center;align-items:flex-start;align-content:flex-start;"]);
2593
- }, function (_ref7) {
2594
- var mobileWidth = _ref7.mobileWidth,
2595
- mobileHeight = _ref7.mobileHeight,
2596
- mobileBreakpoint = _ref7.mobileBreakpoint;
2597
- return (mobileWidth || mobileHeight) && styled.css(["@media (max-width:", "px){", " ", "}"], mobileBreakpoint != null ? mobileBreakpoint : 768, mobileWidth && "width: " + mobileWidth + "; min-width: unset;", mobileHeight && "height: " + mobileHeight + "; min-height: unset;");
2598
2586
  });
2599
2587
  var CloseButton$4 = /*#__PURE__*/styled__default.div.withConfig({
2600
2588
  displayName: "DraggableContainer__CloseButton",
@@ -2611,8 +2599,8 @@ var Title$1 = /*#__PURE__*/styled__default.h1.withConfig({
2611
2599
  var Icon = /*#__PURE__*/styled__default.img.withConfig({
2612
2600
  displayName: "DraggableContainer__Icon",
2613
2601
  componentId: "sc-184mpyl-4"
2614
- })(["color:white;z-index:22;font-size:", ";width:", ";margin-right:0.5rem;"], uiFonts.size.xsmall, function (_ref8) {
2615
- var width = _ref8.width;
2602
+ })(["color:white;z-index:22;font-size:", ";width:", ";margin-right:0.5rem;"], uiFonts.size.xsmall, function (_ref7) {
2603
+ var width = _ref7.width;
2616
2604
  return width;
2617
2605
  });
2618
2606
 
@@ -37724,11 +37712,11 @@ var CartView = function CartView(_ref2) {
37724
37712
  var Container$M = /*#__PURE__*/styled__default.div.withConfig({
37725
37713
  displayName: "CartView__Container",
37726
37714
  componentId: "sc-ydtyl1-0"
37727
- })(["display:flex;flex-direction:column;width:100%;gap:1rem;padding:1rem;"]);
37715
+ })(["display:flex;flex-direction:column;width:100%;height:100%;padding:1rem;overflow:hidden;box-sizing:border-box;"]);
37728
37716
  var Header$g = /*#__PURE__*/styled__default.div.withConfig({
37729
37717
  displayName: "CartView__Header",
37730
37718
  componentId: "sc-ydtyl1-1"
37731
- })(["display:flex;justify-content:space-between;align-items:center;"]);
37719
+ })(["display:flex;justify-content:space-between;align-items:center;flex-shrink:0;"]);
37732
37720
  var Title$n = /*#__PURE__*/styled__default.h2.withConfig({
37733
37721
  displayName: "CartView__Title",
37734
37722
  componentId: "sc-ydtyl1-2"
@@ -37740,7 +37728,7 @@ var CloseButton$h = /*#__PURE__*/styled__default.div.withConfig({
37740
37728
  var CartItems = /*#__PURE__*/styled__default.div.withConfig({
37741
37729
  displayName: "CartView__CartItems",
37742
37730
  componentId: "sc-ydtyl1-4"
37743
- })(["display:flex;flex-direction:column;gap:0.5rem;overflow-y:auto;max-height:250px;padding-right:0.5rem;&::-webkit-scrollbar{width:6px;}&::-webkit-scrollbar-track{background:rgba(0,0,0,0.2);border-radius:4px;}&::-webkit-scrollbar-thumb{background:#f59e0b;border-radius:4px;&:hover{background:#fbbf24;}}"]);
37731
+ })(["display:flex;flex-direction:column;gap:0.5rem;flex:1;min-height:0;overflow-y:auto;margin:1rem 0;padding-right:0.5rem;&::-webkit-scrollbar{width:6px;}&::-webkit-scrollbar-track{background:rgba(0,0,0,0.2);border-radius:4px;}&::-webkit-scrollbar-thumb{background:#f59e0b;border-radius:4px;&:hover{background:#fbbf24;}}"]);
37744
37732
  var EmptyCart = /*#__PURE__*/styled__default.div.withConfig({
37745
37733
  displayName: "CartView__EmptyCart",
37746
37734
  componentId: "sc-ydtyl1-5"
@@ -38042,53 +38030,31 @@ var useStoreMetadata = function useStoreMetadata() {
38042
38030
  var _useState = React.useState(false),
38043
38031
  isCollectingMetadata = _useState[0],
38044
38032
  setIsCollectingMetadata = _useState[1];
38045
- var collectMetadata = /*#__PURE__*/function () {
38046
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(item) {
38047
- return _regeneratorRuntime().wrap(function _callee$(_context) {
38048
- while (1) switch (_context.prev = _context.next) {
38049
- case 0:
38050
- if (!(!item.metadataType || item.metadataType !== shared.MetadataType.CharacterSkin)) {
38051
- _context.next = 2;
38052
- break;
38053
- }
38054
- return _context.abrupt("return", null);
38055
- case 2:
38056
- setIsCollectingMetadata(true);
38057
- _context.prev = 3;
38058
- _context.next = 6;
38059
- return new Promise(function (_resolve) {
38060
- // We'll store the resolver functions in a global context
38061
- // that will be accessible to the MetadataCollector component
38062
- window.__metadataResolvers = {
38063
- resolve: function resolve(metadata) {
38064
- _resolve(metadata);
38065
- },
38066
- item: item
38067
- };
38068
- });
38069
- case 6:
38070
- return _context.abrupt("return", _context.sent);
38071
- case 7:
38072
- _context.prev = 7;
38073
- setIsCollectingMetadata(false);
38074
- // Clean up the resolvers
38075
- if (window.__metadataResolvers) {
38076
- delete window.__metadataResolvers;
38077
- }
38078
- return _context.finish(7);
38079
- case 11:
38080
- case "end":
38081
- return _context.stop();
38082
- }
38083
- }, _callee, null, [[3,, 7, 11]]);
38084
- }));
38085
- return function collectMetadata(_x) {
38086
- return _ref.apply(this, arguments);
38087
- };
38088
- }();
38033
+ var _useState2 = React.useState(null),
38034
+ currentMetadataItem = _useState2[0],
38035
+ setCurrentMetadataItem = _useState2[1];
38036
+ var resolverRef = React.useRef(null);
38037
+ var collectMetadata = function collectMetadata(item) {
38038
+ if (!item.metadataType || item.metadataType !== shared.MetadataType.CharacterSkin) {
38039
+ return Promise.resolve(null);
38040
+ }
38041
+ setIsCollectingMetadata(true);
38042
+ setCurrentMetadataItem(item);
38043
+ return new Promise(function (resolve) {
38044
+ resolverRef.current = resolve;
38045
+ });
38046
+ };
38047
+ var resolveMetadata = function resolveMetadata(metadata) {
38048
+ resolverRef.current == null ? void 0 : resolverRef.current(metadata);
38049
+ resolverRef.current = null;
38050
+ setIsCollectingMetadata(false);
38051
+ setCurrentMetadataItem(null);
38052
+ };
38089
38053
  return {
38090
38054
  collectMetadata: collectMetadata,
38091
- isCollectingMetadata: isCollectingMetadata
38055
+ resolveMetadata: resolveMetadata,
38056
+ isCollectingMetadata: isCollectingMetadata,
38057
+ currentMetadataItem: currentMetadataItem
38092
38058
  };
38093
38059
  };
38094
38060
 
@@ -38107,7 +38073,9 @@ var useStoreCart = function useStoreCart() {
38107
38073
  }, []);
38108
38074
  var _useStoreMetadata = useStoreMetadata(),
38109
38075
  collectMetadata = _useStoreMetadata.collectMetadata,
38110
- isCollectingMetadata = _useStoreMetadata.isCollectingMetadata;
38076
+ resolveMetadata = _useStoreMetadata.resolveMetadata,
38077
+ isCollectingMetadata = _useStoreMetadata.isCollectingMetadata,
38078
+ currentMetadataItem = _useStoreMetadata.currentMetadataItem;
38111
38079
  var handleAddToCart = /*#__PURE__*/function () {
38112
38080
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(item, quantity, preselectedMetadata) {
38113
38081
  var metadata;
@@ -38239,7 +38207,9 @@ var useStoreCart = function useStoreCart() {
38239
38207
  closeCart: closeCart,
38240
38208
  getTotalItems: getTotalItems,
38241
38209
  getTotalPrice: getTotalPrice,
38242
- isCollectingMetadata: isCollectingMetadata
38210
+ isCollectingMetadata: isCollectingMetadata,
38211
+ currentMetadataItem: currentMetadataItem,
38212
+ resolveMetadata: resolveMetadata
38243
38213
  };
38244
38214
  };
38245
38215
  // Helper functions
@@ -38268,23 +38238,42 @@ var MetadataCollector = function MetadataCollector(_ref) {
38268
38238
  config = _ref.config,
38269
38239
  onCollect = _ref.onCollect,
38270
38240
  onCancel = _ref.onCancel;
38271
- // Make sure we clean up if unmounted without collecting
38241
+ var isPendingRef = React.useRef(true);
38242
+ var finalize = React.useCallback(function (callback) {
38243
+ if (!isPendingRef.current) {
38244
+ return;
38245
+ }
38246
+ isPendingRef.current = false;
38247
+ callback();
38248
+ }, []);
38249
+ var handleCollect = React.useCallback(function (metadata) {
38250
+ finalize(function () {
38251
+ return onCollect(metadata);
38252
+ });
38253
+ }, [finalize, onCollect]);
38254
+ var handleCancel = React.useCallback(function () {
38255
+ finalize(onCancel);
38256
+ }, [finalize, onCancel]);
38272
38257
  React.useEffect(function () {
38273
38258
  return function () {
38274
- // If we're unmounting without explicitly collecting or canceling,
38275
- // make sure to call onCancel to prevent any hanging promises
38276
- if (window.__metadataResolvers) {
38277
- onCancel();
38278
- }
38259
+ handleCancel();
38279
38260
  };
38280
- }, [onCancel]);
38281
- // Use string comparison instead of direct property access
38282
- if (metadataType === 'CharacterSkin') {
38261
+ }, [handleCancel]);
38262
+ React.useEffect(function () {
38263
+ if (metadataType === shared.MetadataType.CharacterSkin) {
38264
+ return undefined;
38265
+ }
38266
+ var timer = window.setTimeout(handleCancel, 0);
38267
+ return function () {
38268
+ return window.clearTimeout(timer);
38269
+ };
38270
+ }, [handleCancel, metadataType]);
38271
+ if (metadataType === shared.MetadataType.CharacterSkin) {
38283
38272
  return React__default.createElement(CharacterSkinSelectionModal, {
38284
38273
  isOpen: true,
38285
- onClose: onCancel,
38274
+ onClose: handleCancel,
38286
38275
  onConfirm: function onConfirm(selectedSkin) {
38287
- return onCollect({
38276
+ return handleCollect({
38288
38277
  selectedSkin: selectedSkin
38289
38278
  });
38290
38279
  },
@@ -38293,12 +38282,9 @@ var MetadataCollector = function MetadataCollector(_ref) {
38293
38282
  atlasIMG: config.atlasIMG,
38294
38283
  initialSelectedSkin: config.initialSelectedSkin
38295
38284
  });
38296
- } else {
38297
- console.warn("No collector implemented for metadata type: " + metadataType);
38298
- // Auto-cancel for unhandled types to prevent hanging promises
38299
- setTimeout(onCancel, 0);
38300
- return null;
38301
38285
  }
38286
+ console.warn("No collector implemented for metadata type: " + metadataType);
38287
+ return null;
38302
38288
  };
38303
38289
 
38304
38290
  var PaymentMethodModal = function PaymentMethodModal(_ref) {
@@ -38448,6 +38434,159 @@ var ConfirmRow$1 = /*#__PURE__*/styled__default.div.withConfig({
38448
38434
  componentId: "sc-1dxy6lr-12"
38449
38435
  })(["display:flex;justify-content:center;margin-top:4px;"]);
38450
38436
 
38437
+ function packToBlueprint(pack) {
38438
+ return {
38439
+ key: pack.key,
38440
+ name: pack.title,
38441
+ description: pack.description || '',
38442
+ price: pack.priceUSD,
38443
+ currency: shared.PaymentCurrency.USD,
38444
+ texturePath: pack.image["default"] || pack.image.src,
38445
+ type: shared.PurchaseType.Pack,
38446
+ onPurchase: function () {
38447
+ var _onPurchase = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
38448
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
38449
+ while (1) switch (_context.prev = _context.next) {
38450
+ case 0:
38451
+ case "end":
38452
+ return _context.stop();
38453
+ }
38454
+ }, _callee);
38455
+ }));
38456
+ function onPurchase() {
38457
+ return _onPurchase.apply(this, arguments);
38458
+ }
38459
+ return onPurchase;
38460
+ }(),
38461
+ itemType: shared.ItemType.Consumable,
38462
+ itemSubType: shared.ItemSubType.Other,
38463
+ rarity: shared.ItemRarities.Common,
38464
+ weight: 0,
38465
+ isStackable: false,
38466
+ maxStackSize: 1,
38467
+ isUsable: false
38468
+ };
38469
+ }
38470
+
38471
+ var DEFAULT_TAB_ORDER = ['premium', 'packs', 'items'];
38472
+ function isTabAvailable(tabId, params) {
38473
+ var hidePremiumTab = params.hidePremiumTab,
38474
+ hasCharacters = params.hasCharacters,
38475
+ hasRedeem = params.hasRedeem,
38476
+ hasWallet = params.hasWallet,
38477
+ hasHistory = params.hasHistory;
38478
+ if (tabId === 'premium') return !hidePremiumTab;
38479
+ if (tabId === 'characters') return !!hasCharacters;
38480
+ if (tabId === 'redeem') return !!hasRedeem;
38481
+ if (tabId === 'wallet') return !!hasWallet;
38482
+ if (tabId === 'history') return !!hasHistory;
38483
+ return true;
38484
+ }
38485
+ function getInitialActiveTab(availableTabIds, defaultActiveTab) {
38486
+ var _availableTabIds$;
38487
+ if (defaultActiveTab && availableTabIds.includes(defaultActiveTab)) {
38488
+ return defaultActiveTab;
38489
+ }
38490
+ return (_availableTabIds$ = availableTabIds[0]) != null ? _availableTabIds$ : 'items';
38491
+ }
38492
+ function buildAvailableTabIds(params) {
38493
+ var tabOrder = params.tabOrder,
38494
+ hasCharacters = params.hasCharacters,
38495
+ hasRedeem = params.hasRedeem,
38496
+ hasWallet = params.hasWallet,
38497
+ hasHistory = params.hasHistory;
38498
+ var ids = [].concat(tabOrder != null ? tabOrder : DEFAULT_TAB_ORDER, hasCharacters ? ['characters'] : [], hasRedeem ? ['redeem'] : [], hasWallet ? ['wallet'] : [], hasHistory ? ['history'] : []);
38499
+ return Array.from(new Set(ids.filter(function (id) {
38500
+ return isTabAvailable(id, params);
38501
+ })));
38502
+ }
38503
+ function useStoreTabs(params) {
38504
+ var tabOrder = params.tabOrder,
38505
+ hidePremiumTab = params.hidePremiumTab,
38506
+ hasCharacters = params.hasCharacters,
38507
+ hasRedeem = params.hasRedeem,
38508
+ hasWallet = params.hasWallet,
38509
+ hasHistory = params.hasHistory,
38510
+ defaultActiveTab = params.defaultActiveTab,
38511
+ onTabChange = params.onTabChange,
38512
+ getItemCount = params.getItemCount;
38513
+ var availableTabIds = React.useMemo(function () {
38514
+ return buildAvailableTabIds({
38515
+ tabOrder: tabOrder,
38516
+ hidePremiumTab: hidePremiumTab,
38517
+ hasCharacters: hasCharacters,
38518
+ hasRedeem: hasRedeem,
38519
+ hasWallet: hasWallet,
38520
+ hasHistory: hasHistory
38521
+ });
38522
+ }, [tabOrder, hidePremiumTab, hasCharacters, hasRedeem, hasWallet, hasHistory]);
38523
+ var _useState = React.useState(function () {
38524
+ return getInitialActiveTab(availableTabIds, defaultActiveTab);
38525
+ }),
38526
+ activeTab = _useState[0],
38527
+ setActiveTab = _useState[1];
38528
+ var resolvedActiveTab = availableTabIds.includes(activeTab) ? activeTab : getInitialActiveTab(availableTabIds, defaultActiveTab);
38529
+ React.useEffect(function () {
38530
+ if (resolvedActiveTab === activeTab) {
38531
+ return;
38532
+ }
38533
+ setActiveTab(resolvedActiveTab);
38534
+ }, [activeTab, resolvedActiveTab]);
38535
+ var handleTabChange = function handleTabChange(tabId) {
38536
+ var _getItemCount;
38537
+ var nextTab = tabId;
38538
+ if (!availableTabIds.includes(nextTab) || nextTab === resolvedActiveTab) {
38539
+ return;
38540
+ }
38541
+ setActiveTab(nextTab);
38542
+ onTabChange == null ? void 0 : onTabChange(nextTab, (_getItemCount = getItemCount == null ? void 0 : getItemCount(nextTab)) != null ? _getItemCount : 0);
38543
+ };
38544
+ return {
38545
+ availableTabIds: availableTabIds,
38546
+ activeTab: resolvedActiveTab,
38547
+ setActiveTab: setActiveTab,
38548
+ handleTabChange: handleTabChange
38549
+ };
38550
+ }
38551
+
38552
+ var StoreHeader = function StoreHeader(_ref) {
38553
+ var tabs = _ref.tabs,
38554
+ activeTabId = _ref.activeTabId,
38555
+ onTabChange = _ref.onTabChange,
38556
+ cartItemCount = _ref.cartItemCount,
38557
+ onOpenCart = _ref.onOpenCart;
38558
+ return React__default.createElement(HeaderRow, null, React__default.createElement(TabsFlexWrapper, null, React__default.createElement(Tabs, {
38559
+ options: tabs.map(function (t) {
38560
+ return {
38561
+ id: t.id,
38562
+ label: t.label,
38563
+ icon: t.icon
38564
+ };
38565
+ }),
38566
+ activeTabId: activeTabId,
38567
+ onTabChange: onTabChange
38568
+ })), React__default.createElement(CartButtonWrapper, null, React__default.createElement(CTAButton, {
38569
+ icon: React__default.createElement(fa.FaShoppingCart, null),
38570
+ onClick: onOpenCart
38571
+ }), cartItemCount > 0 && React__default.createElement(CartBadge, null, cartItemCount)));
38572
+ };
38573
+ var HeaderRow = /*#__PURE__*/styled__default.div.withConfig({
38574
+ displayName: "StoreHeader__HeaderRow",
38575
+ componentId: "sc-1y26lw-0"
38576
+ })(["display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:0.25rem;padding-top:10px;padding-right:12px;"]);
38577
+ var TabsFlexWrapper = /*#__PURE__*/styled__default.div.withConfig({
38578
+ displayName: "StoreHeader__TabsFlexWrapper",
38579
+ componentId: "sc-1y26lw-1"
38580
+ })(["flex:1;min-width:0;"]);
38581
+ var CartButtonWrapper = /*#__PURE__*/styled__default.div.withConfig({
38582
+ displayName: "StoreHeader__CartButtonWrapper",
38583
+ componentId: "sc-1y26lw-2"
38584
+ })(["position:relative;flex-shrink:0;"]);
38585
+ var CartBadge = /*#__PURE__*/styled__default.div.withConfig({
38586
+ displayName: "StoreHeader__CartBadge",
38587
+ componentId: "sc-1y26lw-3"
38588
+ })(["position:absolute;top:-8px;right:-8px;background:#ef4444;color:white;font-family:'Press Start 2P',cursive;font-size:0.5rem;padding:4px;border-radius:50%;border:2px solid #000;display:flex;align-items:center;justify-content:center;min-width:16px;min-height:16px;box-sizing:content-box;"]);
38589
+
38451
38590
  var ScrollableContent = function ScrollableContent(_ref) {
38452
38591
  var items = _ref.items,
38453
38592
  renderItem = _ref.renderItem,
@@ -38460,8 +38599,7 @@ var ScrollableContent = function ScrollableContent(_ref) {
38460
38599
  layout = _ref$layout === void 0 ? 'list' : _ref$layout,
38461
38600
  _ref$gridColumns = _ref.gridColumns,
38462
38601
  gridColumns = _ref$gridColumns === void 0 ? 4 : _ref$gridColumns,
38463
- _ref$maxHeight = _ref.maxHeight,
38464
- maxHeight = _ref$maxHeight === void 0 ? '500px' : _ref$maxHeight;
38602
+ maxHeight = _ref.maxHeight;
38465
38603
  if (items.length === 0) {
38466
38604
  return React__default.createElement(EmptyMessage$3, null, emptyMessage);
38467
38605
  }
@@ -38517,8 +38655,8 @@ var StyledDropdown$7 = /*#__PURE__*/styled__default(Dropdown).withConfig({
38517
38655
  var Content$4 = /*#__PURE__*/styled__default.div.withConfig({
38518
38656
  displayName: "ScrollableContent__Content",
38519
38657
  componentId: "sc-xhh2um-7"
38520
- })(["display:flex;flex-direction:column;gap:0.5rem;flex:1;padding:1rem;max-height:", ";overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable;&.grid{display:grid;grid-template-columns:repeat( ", ",minmax(0,1fr) );gap:1rem;align-items:start;.ScrollableContent-item{display:flex;align-items:flex-start;}}&.list{display:flex;flex-direction:column;gap:0.5rem;}"], function (props) {
38521
- return props.$maxHeight;
38658
+ })(["display:flex;flex-direction:column;gap:0.5rem;flex:1;padding:1rem;", " &.grid{display:grid;grid-template-columns:repeat( ", ",minmax(0,1fr) );gap:1rem;align-items:start;.ScrollableContent-item{display:flex;align-items:flex-start;}}&.list{display:flex;flex-direction:column;gap:0.5rem;}"], function (p) {
38659
+ return p.$maxHeight ? "max-height: " + p.$maxHeight + "; overflow-y: auto; overflow-x: hidden; scrollbar-gutter: stable;" : '';
38522
38660
  }, function (props) {
38523
38661
  return props.$gridColumns;
38524
38662
  });
@@ -39100,7 +39238,7 @@ var TextInput = /*#__PURE__*/styled__default.input.withConfig({
39100
39238
  componentId: "sc-ptotuo-12"
39101
39239
  })(["width:120px;text-align:center;margin:0 auto;font-size:0.875rem;background:rgba(0,0,0,0.2);color:#ffffff;border:none;padding:0.25rem;"]);
39102
39240
 
39103
- var useStoreFiltering = function useStoreFiltering(items) {
39241
+ var useStoreFiltering = function useStoreFiltering(items, overrideCategoryOptions) {
39104
39242
  var _useState = React.useState(''),
39105
39243
  searchQuery = _useState[0],
39106
39244
  setSearchQuery = _useState[1];
@@ -39108,6 +39246,21 @@ var useStoreFiltering = function useStoreFiltering(items) {
39108
39246
  selectedCategory = _useState2[0],
39109
39247
  setSelectedCategory = _useState2[1];
39110
39248
  var categoryOptions = React.useMemo(function () {
39249
+ if (overrideCategoryOptions) {
39250
+ var normalizedOptions = overrideCategoryOptions.some(function (opt) {
39251
+ return opt.value === 'all';
39252
+ }) ? overrideCategoryOptions : [{
39253
+ value: 'all',
39254
+ label: 'All'
39255
+ }].concat(overrideCategoryOptions);
39256
+ return normalizedOptions.map(function (opt, index) {
39257
+ return {
39258
+ id: index,
39259
+ value: opt.value,
39260
+ option: opt.label
39261
+ };
39262
+ });
39263
+ }
39111
39264
  var uniqueCategories = Array.from(new Set(items.map(function (item) {
39112
39265
  return item.itemType;
39113
39266
  })));
@@ -39119,7 +39272,16 @@ var useStoreFiltering = function useStoreFiltering(items) {
39119
39272
  option: category === 'all' ? 'All' : category
39120
39273
  };
39121
39274
  });
39122
- }, [items]);
39275
+ }, [items, overrideCategoryOptions]);
39276
+ React.useEffect(function () {
39277
+ var _categoryOptions$0$va, _categoryOptions$;
39278
+ if (categoryOptions.some(function (option) {
39279
+ return option.value === selectedCategory;
39280
+ })) {
39281
+ return;
39282
+ }
39283
+ setSelectedCategory((_categoryOptions$0$va = (_categoryOptions$ = categoryOptions[0]) == null ? void 0 : _categoryOptions$.value) != null ? _categoryOptions$0$va : 'all');
39284
+ }, [categoryOptions, selectedCategory]);
39123
39285
  var filteredItems = React.useMemo(function () {
39124
39286
  return items.filter(function (item) {
39125
39287
  var matchesSearch = item.name.toLowerCase().includes(searchQuery.toLowerCase());
@@ -39158,22 +39320,21 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39158
39320
  onItemView = _ref.onItemView,
39159
39321
  onCategoryChange = _ref.onCategoryChange,
39160
39322
  _ref$currencySymbol = _ref.currencySymbol,
39161
- currencySymbol = _ref$currencySymbol === void 0 ? '$' : _ref$currencySymbol;
39162
- var _useStoreFiltering = useStoreFiltering(items),
39323
+ currencySymbol = _ref$currencySymbol === void 0 ? '$' : _ref$currencySymbol,
39324
+ categoryOptionsProp = _ref.categoryOptions;
39325
+ var _useStoreFiltering = useStoreFiltering(items, categoryOptionsProp),
39163
39326
  searchQuery = _useStoreFiltering.searchQuery,
39164
39327
  setSearchQuery = _useStoreFiltering.setSearchQuery,
39165
39328
  selectedCategory = _useStoreFiltering.selectedCategory,
39166
39329
  setSelectedCategory = _useStoreFiltering.setSelectedCategory,
39167
39330
  categoryOptions = _useStoreFiltering.categoryOptions,
39168
39331
  filteredItems = _useStoreFiltering.filteredItems;
39169
- // Fire category change event when the filter changes
39170
39332
  React.useEffect(function () {
39171
39333
  onCategoryChange == null ? void 0 : onCategoryChange(selectedCategory, filteredItems.length);
39172
39334
  }, [selectedCategory, filteredItems.length]);
39173
39335
  var renderStoreItem = function renderStoreItem(item) {
39174
39336
  var meta = itemBadges[item.key];
39175
39337
  var position = filteredItems.indexOf(item);
39176
- // Prefer a specialized character skin row when needed
39177
39338
  if (item.metadataType === shared.MetadataType.CharacterSkin) {
39178
39339
  return React__default.createElement(StoreCharacterSkinRow, {
39179
39340
  key: item.key,
@@ -39184,7 +39345,6 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39184
39345
  userAccountType: userAccountType || shared.UserAccountTypes.Free
39185
39346
  });
39186
39347
  }
39187
- // Render text input row when configured for this item key
39188
39348
  if (textInputItemKeys.includes(item.key)) {
39189
39349
  return React__default.createElement(StoreItemRow, Object.assign({
39190
39350
  key: item.key,
@@ -39200,7 +39360,6 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39200
39360
  currencySymbol: currencySymbol
39201
39361
  }, meta));
39202
39362
  }
39203
- // Fallback to standard arrow-based row
39204
39363
  return React__default.createElement(StoreItemRow, Object.assign({
39205
39364
  key: item.key,
39206
39365
  item: item,
@@ -39214,19 +39373,7 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39214
39373
  currencySymbol: currencySymbol
39215
39374
  }, meta));
39216
39375
  };
39217
- var _useState = React.useState(false),
39218
- showFilters = _useState[0],
39219
- setShowFilters = _useState[1];
39220
- return React__default.createElement(StoreContainer, null, React__default.createElement(FilterBar, null, React__default.createElement(FilterToggle, {
39221
- "$active": showFilters,
39222
- onClick: function onClick() {
39223
- return setShowFilters(function (prev) {
39224
- return !prev;
39225
- });
39226
- }
39227
- }, React__default.createElement(fa.FaFilter, {
39228
- size: 12
39229
- }), React__default.createElement("span", null, "Filter"))), showFilters && React__default.createElement(SearchHeader$2, null, React__default.createElement(SearchBarContainer$1, null, React__default.createElement(SearchBar, {
39376
+ return React__default.createElement(StoreContainer, null, React__default.createElement(SearchHeader$2, null, React__default.createElement(SearchBarContainer$1, null, React__default.createElement(SearchBar, {
39230
39377
  value: searchQuery,
39231
39378
  onChange: setSearchQuery,
39232
39379
  placeholder: "Search items..."
@@ -39238,15 +39385,12 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39238
39385
  };
39239
39386
  }),
39240
39387
  activeId: selectedCategory,
39241
- onChange: function onChange(id) {
39242
- return setSelectedCategory(id);
39243
- }
39388
+ onChange: setSelectedCategory
39244
39389
  })), React__default.createElement(ScrollableContent, {
39245
39390
  items: filteredItems,
39246
39391
  renderItem: renderStoreItem,
39247
39392
  emptyMessage: "No items match your filters.",
39248
- layout: "list",
39249
- maxHeight: "none"
39393
+ layout: "list"
39250
39394
  }));
39251
39395
  };
39252
39396
  var StoreContainer = /*#__PURE__*/styled__default.div.withConfig({
@@ -39256,22 +39400,11 @@ var StoreContainer = /*#__PURE__*/styled__default.div.withConfig({
39256
39400
  var SearchHeader$2 = /*#__PURE__*/styled__default.div.withConfig({
39257
39401
  displayName: "StoreItemsSection__SearchHeader",
39258
39402
  componentId: "sc-l6f466-1"
39259
- })(["display:flex;gap:0.5rem;align-items:center;padding-top:0.25rem;"]);
39403
+ })(["display:flex;gap:0.5rem;align-items:center;padding:0.25rem 1rem 0;"]);
39260
39404
  var SearchBarContainer$1 = /*#__PURE__*/styled__default.div.withConfig({
39261
39405
  displayName: "StoreItemsSection__SearchBarContainer",
39262
39406
  componentId: "sc-l6f466-2"
39263
39407
  })(["flex:0.75;"]);
39264
- var FilterBar = /*#__PURE__*/styled__default.div.withConfig({
39265
- displayName: "StoreItemsSection__FilterBar",
39266
- componentId: "sc-l6f466-3"
39267
- })(["display:flex;padding-top:0.25rem;"]);
39268
- var FilterToggle = /*#__PURE__*/styled__default.button.withConfig({
39269
- displayName: "StoreItemsSection__FilterToggle",
39270
- componentId: "sc-l6f466-4"
39271
- })(["display:flex;align-items:center;gap:0.4rem;background:", ";border:1px solid rgba(255,255,255,0.3);color:#fff;padding:0.3rem 0.6rem;border-radius:4px;cursor:pointer;font-family:'Press Start 2P',cursive;font-size:0.55rem;&:hover{background:rgba(255,255,255,0.1);}"], function (_ref2) {
39272
- var $active = _ref2.$active;
39273
- return $active ? 'rgba(255,255,255,0.15)' : 'transparent';
39274
- });
39275
39408
 
39276
39409
  var usePackFiltering = function usePackFiltering(packs) {
39277
39410
  var _useState = React.useState(''),
@@ -39419,8 +39552,7 @@ var StorePacksSection = function StorePacksSection(_ref2) {
39419
39552
  onChange: setSearchQuery,
39420
39553
  placeholder: 'Search packs...'
39421
39554
  },
39422
- layout: "list",
39423
- maxHeight: "50vh"
39555
+ layout: "list"
39424
39556
  });
39425
39557
  };
39426
39558
  var PackRow = /*#__PURE__*/styled__default(ItemRowWrapper).withConfig({
@@ -39724,7 +39856,7 @@ var Store = function Store(_ref) {
39724
39856
  packs = _ref$packs === void 0 ? [] : _ref$packs,
39725
39857
  atlasJSON = _ref.atlasJSON,
39726
39858
  atlasIMG = _ref.atlasIMG,
39727
- _onPurchase4 = _ref.onPurchase,
39859
+ _onPurchase = _ref.onPurchase,
39728
39860
  onShowHistory = _ref.onShowHistory,
39729
39861
  onShowWallet = _ref.onShowWallet,
39730
39862
  walletLabel = _ref.walletLabel,
@@ -39745,11 +39877,6 @@ var Store = function Store(_ref) {
39745
39877
  customHistoryContent = _ref.customHistoryContent,
39746
39878
  _ref$fullScreen = _ref.fullScreen,
39747
39879
  fullScreen = _ref$fullScreen === void 0 ? false : _ref$fullScreen,
39748
- containerWidth = _ref.containerWidth,
39749
- containerHeight = _ref.containerHeight,
39750
- mobileContainerWidth = _ref.mobileContainerWidth,
39751
- mobileContainerHeight = _ref.mobileContainerHeight,
39752
- mobileBreakpoint = _ref.mobileBreakpoint,
39753
39880
  _ref$packsTabLabel = _ref.packsTabLabel,
39754
39881
  packsTabLabel = _ref$packsTabLabel === void 0 ? 'Packs' : _ref$packsTabLabel,
39755
39882
  packsBadge = _ref.packsBadge,
@@ -39759,7 +39886,7 @@ var Store = function Store(_ref) {
39759
39886
  packBadges = _ref.packBadges,
39760
39887
  onItemView = _ref.onItemView,
39761
39888
  onPackView = _ref.onPackView,
39762
- _onTabChange = _ref.onTabChange,
39889
+ onTabChange = _ref.onTabChange,
39763
39890
  onCategoryChange = _ref.onCategoryChange,
39764
39891
  onCartOpen = _ref.onCartOpen,
39765
39892
  onAddToCart = _ref.onAddToCart,
@@ -39772,24 +39899,15 @@ var Store = function Store(_ref) {
39772
39899
  currencySymbol = _ref$currencySymbol === void 0 ? '$' : _ref$currencySymbol,
39773
39900
  onRedeem = _ref.onRedeem,
39774
39901
  onRedeemInputFocus = _ref.onRedeemInputFocus,
39775
- onRedeemInputBlur = _ref.onRedeemInputBlur;
39776
- var defaultTabOrder = ['premium', 'packs', 'items'];
39902
+ onRedeemInputBlur = _ref.onRedeemInputBlur,
39903
+ _ref$width = _ref.width,
39904
+ width = _ref$width === void 0 ? '1000px' : _ref$width,
39905
+ _ref$height = _ref.height,
39906
+ height = _ref$height === void 0 ? 'min(85vh, 900px)' : _ref$height,
39907
+ itemCategoryOptions = _ref.itemCategoryOptions;
39777
39908
  var _useState = React.useState(null),
39778
39909
  selectedPack = _useState[0],
39779
39910
  setSelectedPack = _useState[1];
39780
- var _useState2 = React.useState(function () {
39781
- var _validTabs$;
39782
- var allTabIds = [].concat(tabOrder != null ? tabOrder : defaultTabOrder, customCharactersContent ? ['characters'] : [], onRedeem ? ['redeem'] : [], onShowWallet || customWalletContent ? ['wallet'] : [], onShowHistory || customHistoryContent ? ['history'] : []);
39783
- var validTabs = Array.from(new Set(allTabIds.filter(function (id) {
39784
- return !(hidePremiumTab && id === 'premium');
39785
- })));
39786
- if (defaultActiveTab && validTabs.includes(defaultActiveTab)) {
39787
- return defaultActiveTab;
39788
- }
39789
- return (_validTabs$ = validTabs[0]) != null ? _validTabs$ : hidePremiumTab ? 'items' : 'premium';
39790
- }),
39791
- activeTab = _useState2[0],
39792
- setActiveTab = _useState2[1];
39793
39911
  var _useStoreCart = useStoreCart(),
39794
39912
  cartItems = _useStoreCart.cartItems,
39795
39913
  handleAddToCart = _useStoreCart.handleAddToCart,
@@ -39799,13 +39917,38 @@ var Store = function Store(_ref) {
39799
39917
  closeCart = _useStoreCart.closeCart,
39800
39918
  getTotalItems = _useStoreCart.getTotalItems,
39801
39919
  getTotalPrice = _useStoreCart.getTotalPrice,
39802
- isCartOpen = _useStoreCart.isCartOpen;
39803
- var _useState3 = React.useState(false),
39804
- isCollectingMetadata = _useState3[0],
39805
- setIsCollectingMetadata = _useState3[1];
39806
- var _useState4 = React.useState(null),
39807
- currentMetadataItem = _useState4[0],
39808
- setCurrentMetadataItem = _useState4[1];
39920
+ isCartOpen = _useStoreCart.isCartOpen,
39921
+ isCollectingMetadata = _useStoreCart.isCollectingMetadata,
39922
+ currentMetadataItem = _useStoreCart.currentMetadataItem,
39923
+ resolveMetadata = _useStoreCart.resolveMetadata;
39924
+ var filteredItems = React.useMemo(function () {
39925
+ return {
39926
+ items: items,
39927
+ premium: items.filter(function (item) {
39928
+ var _item$requiredAccount, _item$requiredAccount2;
39929
+ return ((_item$requiredAccount = (_item$requiredAccount2 = item.requiredAccountType) == null ? void 0 : _item$requiredAccount2.length) != null ? _item$requiredAccount : 0) > 0;
39930
+ })
39931
+ };
39932
+ }, [items]);
39933
+ var _useStoreTabs = useStoreTabs({
39934
+ tabOrder: tabOrder,
39935
+ defaultActiveTab: defaultActiveTab,
39936
+ hidePremiumTab: hidePremiumTab,
39937
+ hasCharacters: !!customCharactersContent,
39938
+ hasRedeem: !!onRedeem,
39939
+ hasWallet: !!(onShowWallet || customWalletContent),
39940
+ hasHistory: !!(onShowHistory || customHistoryContent),
39941
+ onTabChange: onTabChange,
39942
+ getItemCount: function getItemCount(tab) {
39943
+ if (tab === 'items') return filteredItems.items.length;
39944
+ if (tab === 'premium') return filteredItems.premium.length;
39945
+ if (tab === 'packs') return packs.length;
39946
+ return 0;
39947
+ }
39948
+ }),
39949
+ availableTabIds = _useStoreTabs.availableTabIds,
39950
+ activeTab = _useStoreTabs.activeTab,
39951
+ handleTabChange = _useStoreTabs.handleTabChange;
39809
39952
  var handleOpenCart = function handleOpenCart() {
39810
39953
  openCart();
39811
39954
  onCartOpen == null ? void 0 : onCartOpen();
@@ -39822,85 +39965,13 @@ var Store = function Store(_ref) {
39822
39965
  if (quantity === void 0) {
39823
39966
  quantity = 1;
39824
39967
  }
39825
- var packItem = {
39826
- key: pack.key,
39827
- name: pack.title,
39828
- description: pack.description || '',
39829
- price: pack.priceUSD,
39830
- currency: shared.PaymentCurrency.USD,
39831
- texturePath: pack.image["default"] || pack.image.src,
39832
- type: shared.PurchaseType.Pack,
39833
- onPurchase: function () {
39834
- var _onPurchase = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
39835
- return _regeneratorRuntime().wrap(function _callee$(_context) {
39836
- while (1) switch (_context.prev = _context.next) {
39837
- case 0:
39838
- case "end":
39839
- return _context.stop();
39840
- }
39841
- }, _callee);
39842
- }));
39843
- function onPurchase() {
39844
- return _onPurchase.apply(this, arguments);
39845
- }
39846
- return onPurchase;
39847
- }(),
39848
- itemType: shared.ItemType.Consumable,
39849
- itemSubType: shared.ItemSubType.Other,
39850
- rarity: shared.ItemRarities.Common,
39851
- weight: 0,
39852
- isStackable: false,
39853
- maxStackSize: 1,
39854
- isUsable: false
39855
- };
39856
- handleAddToCart(packItem, quantity);
39857
- onAddToCart == null ? void 0 : onAddToCart(packItem, quantity);
39858
- };
39859
- var filterItems = function filterItems(itemsToFilter, type) {
39860
- return itemsToFilter.filter(function (item) {
39861
- if (type === 'premium') {
39862
- var _item$requiredAccount, _item$requiredAccount2;
39863
- return (_item$requiredAccount = (_item$requiredAccount2 = item.requiredAccountType) == null ? void 0 : _item$requiredAccount2.length) != null ? _item$requiredAccount : 0 > 0;
39864
- }
39865
- return true;
39866
- });
39867
- };
39868
- var filteredItems = React.useMemo(function () {
39869
- return {
39870
- items: filterItems(items, 'items'),
39871
- premium: filterItems(items, 'premium')
39872
- };
39873
- }, [items]);
39874
- var handleMetadataCollected = function handleMetadataCollected(metadata) {
39875
- if (currentMetadataItem && window.__metadataResolvers) {
39876
- // Resolve the promise in the useStoreMetadata hook
39877
- window.__metadataResolvers.resolve(metadata);
39878
- // Reset the metadata collection state
39879
- setCurrentMetadataItem(null);
39880
- // Removed unused setPendingMetadataQuantity call
39881
- }
39882
- };
39883
- var handleMetadataCancel = function handleMetadataCancel() {
39884
- if (window.__metadataResolvers) {
39885
- // Resolve with null to indicate cancellation
39886
- window.__metadataResolvers.resolve(null);
39887
- }
39888
- // Reset the metadata collection state
39889
- setCurrentMetadataItem(null);
39890
- // Removed unused setPendingMetadataQuantity call
39891
- setIsCollectingMetadata(false);
39968
+ var bp = packToBlueprint(pack);
39969
+ handleAddToCart(bp, quantity);
39970
+ onAddToCart == null ? void 0 : onAddToCart(bp, quantity);
39892
39971
  };
39893
- if (loading) {
39894
- return React__default.createElement(LoadingMessage$1, null, "Loading...");
39895
- }
39896
- if (error) {
39897
- return React__default.createElement(ErrorMessage$3, null, error);
39898
- }
39899
- // Build tabs dynamically based on props
39900
- var tabIds = [].concat(tabOrder != null ? tabOrder : defaultTabOrder, customCharactersContent ? ['characters'] : [], onRedeem ? ['redeem'] : [], onShowWallet || customWalletContent ? ['wallet'] : [], onShowHistory || customHistoryContent ? ['history'] : []);
39901
- var availableTabIds = Array.from(new Set(tabIds.filter(function (id) {
39902
- return !(hidePremiumTab && id === 'premium');
39903
- })));
39972
+ var makePackQuickBuy = onQuickBuy ? function (pack, qty) {
39973
+ return onQuickBuy(packToBlueprint(pack), qty);
39974
+ } : undefined;
39904
39975
  var tabsMap = {
39905
39976
  premium: {
39906
39977
  id: 'premium',
@@ -39914,40 +39985,7 @@ var Store = function Store(_ref) {
39914
39985
  return pack.priceUSD >= 9.99;
39915
39986
  }),
39916
39987
  onAddToCart: handleAddPackToCart,
39917
- onQuickBuy: onQuickBuy ? function (pack, qty) {
39918
- var bp = {
39919
- key: pack.key,
39920
- name: pack.title,
39921
- description: pack.description || '',
39922
- price: pack.priceUSD,
39923
- currency: shared.PaymentCurrency.USD,
39924
- texturePath: pack.image["default"] || pack.image.src,
39925
- type: shared.PurchaseType.Pack,
39926
- onPurchase: function () {
39927
- var _onPurchase2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
39928
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
39929
- while (1) switch (_context2.prev = _context2.next) {
39930
- case 0:
39931
- case "end":
39932
- return _context2.stop();
39933
- }
39934
- }, _callee2);
39935
- }));
39936
- function onPurchase() {
39937
- return _onPurchase2.apply(this, arguments);
39938
- }
39939
- return onPurchase;
39940
- }(),
39941
- itemType: shared.ItemType.Consumable,
39942
- itemSubType: shared.ItemSubType.Other,
39943
- rarity: shared.ItemRarities.Common,
39944
- weight: 0,
39945
- isStackable: false,
39946
- maxStackSize: 1,
39947
- isUsable: false
39948
- };
39949
- onQuickBuy(bp, qty);
39950
- } : undefined,
39988
+ onQuickBuy: makePackQuickBuy,
39951
39989
  onSelectPack: setSelectedPack,
39952
39990
  atlasJSON: atlasJSON,
39953
39991
  atlasIMG: atlasIMG,
@@ -39972,40 +40010,7 @@ var Store = function Store(_ref) {
39972
40010
  return pack.priceUSD < 9.99;
39973
40011
  }),
39974
40012
  onAddToCart: handleAddPackToCart,
39975
- onQuickBuy: onQuickBuy ? function (pack, qty) {
39976
- var bp = {
39977
- key: pack.key,
39978
- name: pack.title,
39979
- description: pack.description || '',
39980
- price: pack.priceUSD,
39981
- currency: shared.PaymentCurrency.USD,
39982
- texturePath: pack.image["default"] || pack.image.src,
39983
- type: shared.PurchaseType.Pack,
39984
- onPurchase: function () {
39985
- var _onPurchase3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
39986
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
39987
- while (1) switch (_context3.prev = _context3.next) {
39988
- case 0:
39989
- case "end":
39990
- return _context3.stop();
39991
- }
39992
- }, _callee3);
39993
- }));
39994
- function onPurchase() {
39995
- return _onPurchase3.apply(this, arguments);
39996
- }
39997
- return onPurchase;
39998
- }(),
39999
- itemType: shared.ItemType.Consumable,
40000
- itemSubType: shared.ItemSubType.Other,
40001
- rarity: shared.ItemRarities.Common,
40002
- weight: 0,
40003
- isStackable: false,
40004
- maxStackSize: 1,
40005
- isUsable: false
40006
- };
40007
- onQuickBuy(bp, qty);
40008
- } : undefined,
40013
+ onQuickBuy: makePackQuickBuy,
40009
40014
  onSelectPack: setSelectedPack,
40010
40015
  atlasJSON: atlasJSON,
40011
40016
  atlasIMG: atlasIMG,
@@ -40024,7 +40029,7 @@ var Store = function Store(_ref) {
40024
40029
  content: React__default.createElement(StoreItemsSection, {
40025
40030
  items: filteredItems.items,
40026
40031
  onAddToCart: handleAddToCartTracked,
40027
- onQuickBuy: onQuickBuy ? function (item, qty, _meta) {
40032
+ onQuickBuy: onQuickBuy ? function (item, qty) {
40028
40033
  return onQuickBuy(item, qty);
40029
40034
  } : undefined,
40030
40035
  atlasJSON: atlasJSON,
@@ -40034,7 +40039,8 @@ var Store = function Store(_ref) {
40034
40039
  itemBadges: itemBadges,
40035
40040
  onItemView: onItemView,
40036
40041
  onCategoryChange: onCategoryChange,
40037
- currencySymbol: currencySymbol
40042
+ currencySymbol: currencySymbol,
40043
+ categoryOptions: itemCategoryOptions
40038
40044
  })
40039
40045
  },
40040
40046
  characters: {
@@ -40084,42 +40090,42 @@ var Store = function Store(_ref) {
40084
40090
  }))
40085
40091
  }
40086
40092
  };
40093
+ if (loading) return React__default.createElement(LoadingMessage$1, null, "Loading...");
40094
+ if (error) return React__default.createElement(ErrorMessage$3, null, error);
40087
40095
  return React__default.createElement(DraggableContainer, {
40088
- title: "Store",
40089
40096
  onCloseButton: onClose,
40090
- width: containerWidth != null ? containerWidth : "1000px",
40097
+ width: width,
40091
40098
  minWidth: "700px",
40092
- height: containerHeight != null ? containerHeight : "min(85vh, 900px)",
40093
- mobileWidth: mobileContainerWidth != null ? mobileContainerWidth : "95vw",
40094
- mobileHeight: mobileContainerHeight != null ? mobileContainerHeight : "95vh",
40095
- mobileBreakpoint: mobileBreakpoint,
40099
+ height: height,
40096
40100
  type: exports.RPGUIContainerTypes.Framed,
40097
- cancelDrag: "[class*='Store__Container'], [class*='CartView'], [class*='StoreItemDetails'], .close-button",
40101
+ cancelDrag: ".store-scroll-area, [class*='CartView'], [class*='StoreItemDetails'], .close-button",
40098
40102
  isFullScreen: fullScreen
40099
- }, isCollectingMetadata && currentMetadataItem && currentMetadataItem.metadataType ? React__default.createElement(MetadataCollector, {
40103
+ }, isCollectingMetadata && currentMetadataItem != null && currentMetadataItem.metadataType ? React__default.createElement(MetadataCollector, {
40100
40104
  metadataType: currentMetadataItem.metadataType,
40101
40105
  config: currentMetadataItem.metadataConfig || {},
40102
- onCollect: handleMetadataCollected,
40103
- onCancel: handleMetadataCancel
40106
+ onCollect: resolveMetadata,
40107
+ onCancel: function onCancel() {
40108
+ return resolveMetadata(null);
40109
+ }
40104
40110
  }) : isCartOpen ? React__default.createElement(CartView, {
40105
40111
  cartItems: cartItems,
40106
40112
  onRemoveFromCart: handleRemoveFromCartTracked,
40107
40113
  onClose: closeCart,
40108
40114
  onPurchase: function () {
40109
- var _onPurchase5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
40110
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
40111
- while (1) switch (_context4.prev = _context4.next) {
40115
+ var _onPurchase2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
40116
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
40117
+ while (1) switch (_context.prev = _context.next) {
40112
40118
  case 0:
40113
- handleCartPurchase(_onPurchase4);
40114
- return _context4.abrupt("return", true);
40119
+ handleCartPurchase(_onPurchase);
40120
+ return _context.abrupt("return", true);
40115
40121
  case 2:
40116
40122
  case "end":
40117
- return _context4.stop();
40123
+ return _context.stop();
40118
40124
  }
40119
- }, _callee4);
40125
+ }, _callee);
40120
40126
  }));
40121
40127
  function onPurchase() {
40122
- return _onPurchase5.apply(this, arguments);
40128
+ return _onPurchase2.apply(this, arguments);
40123
40129
  }
40124
40130
  return onPurchase;
40125
40131
  }(),
@@ -40143,7 +40149,9 @@ var Store = function Store(_ref) {
40143
40149
  return handleAddPackToCart(selectedPack);
40144
40150
  },
40145
40151
  currencySymbol: currencySymbol
40146
- }) : React__default.createElement(Container$Q, null, featuredItems && featuredItems.length > 0 && React__default.createElement(FeaturedBanner, {
40152
+ }) : React__default.createElement(Container$Q, {
40153
+ className: "store-scroll-area"
40154
+ }, featuredItems && featuredItems.length > 0 && React__default.createElement(FeaturedBanner, {
40147
40155
  items: featuredItems,
40148
40156
  atlasJSON: atlasJSON,
40149
40157
  atlasIMG: atlasIMG,
@@ -40157,48 +40165,17 @@ var Store = function Store(_ref) {
40157
40165
  var blueprint = items.find(function (bp) {
40158
40166
  return bp.key === item.key;
40159
40167
  });
40160
- if (blueprint) onQuickBuy(blueprint, 1);else {
40168
+ if (blueprint) {
40169
+ onQuickBuy(blueprint, 1);
40170
+ } else {
40161
40171
  var pack = packs.find(function (p) {
40162
40172
  return p.key === item.key;
40163
40173
  });
40164
- if (pack) {
40165
- var packBlueprint = {
40166
- key: pack.key,
40167
- name: pack.title,
40168
- description: pack.description || '',
40169
- price: pack.priceUSD,
40170
- currency: shared.PaymentCurrency.USD,
40171
- texturePath: pack.image["default"] || pack.image.src,
40172
- type: shared.PurchaseType.Pack,
40173
- onPurchase: function () {
40174
- var _onPurchase6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
40175
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
40176
- while (1) switch (_context5.prev = _context5.next) {
40177
- case 0:
40178
- case "end":
40179
- return _context5.stop();
40180
- }
40181
- }, _callee5);
40182
- }));
40183
- function onPurchase() {
40184
- return _onPurchase6.apply(this, arguments);
40185
- }
40186
- return onPurchase;
40187
- }(),
40188
- itemType: shared.ItemType.Consumable,
40189
- itemSubType: shared.ItemSubType.Other,
40190
- rarity: shared.ItemRarities.Common,
40191
- weight: 0,
40192
- isStackable: false,
40193
- maxStackSize: 1,
40194
- isUsable: false
40195
- };
40196
- onQuickBuy(packBlueprint, 1);
40197
- }
40174
+ if (pack) onQuickBuy(packToBlueprint(pack), 1);
40198
40175
  }
40199
40176
  } : undefined
40200
- }), React__default.createElement(MainContent$1, null, React__default.createElement(HeaderRow, null, React__default.createElement(TabsFlexWrapper, null, React__default.createElement(Tabs, {
40201
- options: availableTabIds.map(function (id) {
40177
+ }), React__default.createElement(MainContent$1, null, React__default.createElement(StoreHeader, {
40178
+ tabs: availableTabIds.map(function (id) {
40202
40179
  var _tabsMap$id, _tabsMap$id2;
40203
40180
  return {
40204
40181
  id: id,
@@ -40207,20 +40184,12 @@ var Store = function Store(_ref) {
40207
40184
  };
40208
40185
  }),
40209
40186
  activeTabId: activeTab,
40210
- onTabChange: function onTabChange(tabId) {
40211
- var nextTab = tabId;
40212
- setActiveTab(nextTab);
40213
- if (_onTabChange) {
40214
- var itemCount = nextTab === 'items' ? filteredItems.items.length : nextTab === 'premium' ? filteredItems.premium.length : nextTab === 'packs' ? packs.length : 0;
40215
- _onTabChange(nextTab, itemCount);
40216
- }
40217
- }
40218
- })), React__default.createElement(CartButtonWrapper, null, React__default.createElement(CTAButton, {
40219
- icon: React__default.createElement(fa.FaShoppingCart, null),
40220
- onClick: handleOpenCart
40221
- }), getTotalItems() > 0 && React__default.createElement(CartBadge, null, getTotalItems()))), React__default.createElement(TabContent, null, (_tabsMap$activeTab = tabsMap[activeTab]) == null ? void 0 : _tabsMap$activeTab.content)), cartItems.length > 0 && React__default.createElement(Footer$3, null, React__default.createElement(CTAButton, {
40187
+ onTabChange: handleTabChange,
40188
+ cartItemCount: getTotalItems(),
40189
+ onOpenCart: handleOpenCart
40190
+ }), React__default.createElement(TabContent, null, (_tabsMap$activeTab = tabsMap[activeTab]) == null ? void 0 : _tabsMap$activeTab.content)), cartItems.length > 0 && React__default.createElement(Footer$3, null, React__default.createElement(CTAButton, {
40222
40191
  icon: React__default.createElement(fa.FaShoppingCart, null),
40223
- label: "Checkout \xB7 " + getTotalItems() + " item" + (getTotalItems() !== 1 ? 's' : '') + " (" + currencySymbol + getTotalPrice().toFixed(2) + ")",
40192
+ label: "Proceed to Checkout (" + currencySymbol + getTotalPrice().toFixed(2) + ")",
40224
40193
  onClick: handleOpenCart,
40225
40194
  fullWidth: true
40226
40195
  }))));
@@ -40228,50 +40197,34 @@ var Store = function Store(_ref) {
40228
40197
  var Container$Q = /*#__PURE__*/styled__default.div.withConfig({
40229
40198
  displayName: "Store__Container",
40230
40199
  componentId: "sc-64dj00-0"
40231
- })(["display:flex;flex-direction:column;width:100%;height:calc(100% - 48px);gap:0.5rem;position:relative;overflow:hidden;"]);
40232
- var HeaderRow = /*#__PURE__*/styled__default.div.withConfig({
40233
- displayName: "Store__HeaderRow",
40234
- componentId: "sc-64dj00-1"
40235
- })(["display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:0.25rem;padding-top:10px;padding-right:12px;"]);
40236
- var TabsFlexWrapper = /*#__PURE__*/styled__default.div.withConfig({
40237
- displayName: "Store__TabsFlexWrapper",
40238
- componentId: "sc-64dj00-2"
40239
- })(["flex:1;min-width:0;"]);
40240
- var CartButtonWrapper = /*#__PURE__*/styled__default.div.withConfig({
40241
- displayName: "Store__CartButtonWrapper",
40242
- componentId: "sc-64dj00-3"
40243
- })(["position:relative;flex-shrink:0;"]);
40244
- var CartBadge = /*#__PURE__*/styled__default.div.withConfig({
40245
- displayName: "Store__CartBadge",
40246
- componentId: "sc-64dj00-4"
40247
- })(["position:absolute;top:-8px;right:-8px;background:#ef4444;color:white;font-family:'Press Start 2P',cursive;font-size:0.5rem;padding:4px;border-radius:50%;border:2px solid #000;display:flex;align-items:center;justify-content:center;min-width:16px;min-height:16px;box-sizing:content-box;"]);
40200
+ })(["display:flex;flex-direction:column;width:100%;height:100%;gap:0.5rem;position:relative;overflow:hidden;"]);
40248
40201
  var MainContent$1 = /*#__PURE__*/styled__default.div.withConfig({
40249
40202
  displayName: "Store__MainContent",
40250
- componentId: "sc-64dj00-5"
40203
+ componentId: "sc-64dj00-1"
40251
40204
  })(["flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden;"]);
40252
40205
  var TabContent = /*#__PURE__*/styled__default.div.withConfig({
40253
40206
  displayName: "Store__TabContent",
40254
- componentId: "sc-64dj00-6"
40207
+ componentId: "sc-64dj00-2"
40255
40208
  })(["flex:1;overflow-y:auto;"]);
40256
40209
  var Footer$3 = /*#__PURE__*/styled__default.div.withConfig({
40257
40210
  displayName: "Store__Footer",
40258
- componentId: "sc-64dj00-7"
40259
- })(["padding:0.5rem;border-top:2px solid #f59e0b;background:rgba(0,0,0,0.2);flex-shrink:0;"]);
40211
+ componentId: "sc-64dj00-3"
40212
+ })(["padding:1rem;border-top:2px solid #f59e0b;background:rgba(0,0,0,0.2);flex-shrink:0;"]);
40260
40213
  var TabLabelWithBadge = /*#__PURE__*/styled__default.span.withConfig({
40261
40214
  displayName: "Store__TabLabelWithBadge",
40262
- componentId: "sc-64dj00-8"
40215
+ componentId: "sc-64dj00-4"
40263
40216
  })(["display:inline-flex;align-items:center;gap:5px;"]);
40264
40217
  var LoadingMessage$1 = /*#__PURE__*/styled__default.div.withConfig({
40265
40218
  displayName: "Store__LoadingMessage",
40266
- componentId: "sc-64dj00-9"
40219
+ componentId: "sc-64dj00-5"
40267
40220
  })(["text-align:center;color:", ";padding:2rem;"], uiColors.white);
40268
40221
  var ErrorMessage$3 = /*#__PURE__*/styled__default.div.withConfig({
40269
40222
  displayName: "Store__ErrorMessage",
40270
- componentId: "sc-64dj00-10"
40223
+ componentId: "sc-64dj00-6"
40271
40224
  })(["text-align:center;color:", ";padding:2rem;"], uiColors.red);
40272
40225
  var CenteredContent = /*#__PURE__*/styled__default.div.withConfig({
40273
40226
  displayName: "Store__CenteredContent",
40274
- componentId: "sc-64dj00-11"
40227
+ componentId: "sc-64dj00-7"
40275
40228
  })(["display:flex;align-items:center;justify-content:center;height:100%;padding:2rem;"]);
40276
40229
 
40277
40230
  var TextArea = function TextArea(_ref) {