@rpg-engine/long-bow 0.8.218 → 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 (33) hide show
  1. package/dist/components/Store/MetadataCollector.d.ts +2 -2
  2. package/dist/components/Store/Store.d.ts +10 -21
  3. package/dist/components/Store/StoreHeader.d.ts +14 -0
  4. package/dist/components/Store/hooks/useStoreCart.d.ts +2 -0
  5. package/dist/components/Store/hooks/useStoreMetadata.d.ts +4 -11
  6. package/dist/components/Store/hooks/useStoreTabs.d.ts +20 -0
  7. package/dist/components/Store/internal/packToBlueprint.d.ts +2 -0
  8. package/dist/components/Store/sections/StoreItemsSection.d.ts +5 -3
  9. package/dist/hooks/useStoreFiltering.d.ts +7 -4
  10. package/dist/long-bow.cjs.development.js +346 -375
  11. package/dist/long-bow.cjs.development.js.map +1 -1
  12. package/dist/long-bow.cjs.production.min.js +1 -1
  13. package/dist/long-bow.cjs.production.min.js.map +1 -1
  14. package/dist/long-bow.esm.js +348 -377
  15. package/dist/long-bow.esm.js.map +1 -1
  16. package/package.json +1 -1
  17. package/src/components/Store/CartView.tsx +7 -2
  18. package/src/components/Store/MetadataCollector.tsx +60 -40
  19. package/src/components/Store/Store.tsx +75 -270
  20. package/src/components/Store/StoreHeader.tsx +74 -0
  21. package/src/components/Store/__test__/MetadataCollector.spec.tsx +94 -164
  22. package/src/components/Store/__test__/Store.spec.tsx +4 -0
  23. package/src/components/Store/__test__/useStoreMetadata.spec.tsx +58 -156
  24. package/src/components/Store/__test__/useStoreTabs.spec.tsx +69 -0
  25. package/src/components/Store/hooks/useStoreCart.ts +5 -2
  26. package/src/components/Store/hooks/useStoreMetadata.ts +30 -48
  27. package/src/components/Store/hooks/useStoreTabs.ts +104 -0
  28. package/src/components/Store/internal/packToBlueprint.ts +21 -0
  29. package/src/components/Store/sections/StoreItemsSection.tsx +19 -60
  30. package/src/components/Store/sections/StorePacksSection.tsx +0 -1
  31. package/src/components/shared/ScrollableContent/ScrollableContent.tsx +3 -6
  32. package/src/hooks/useStoreFiltering.spec.tsx +79 -0
  33. package/src/hooks/useStoreFiltering.ts +27 -9
@@ -37712,11 +37712,11 @@ var CartView = function CartView(_ref2) {
37712
37712
  var Container$M = /*#__PURE__*/styled__default.div.withConfig({
37713
37713
  displayName: "CartView__Container",
37714
37714
  componentId: "sc-ydtyl1-0"
37715
- })(["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;"]);
37716
37716
  var Header$g = /*#__PURE__*/styled__default.div.withConfig({
37717
37717
  displayName: "CartView__Header",
37718
37718
  componentId: "sc-ydtyl1-1"
37719
- })(["display:flex;justify-content:space-between;align-items:center;"]);
37719
+ })(["display:flex;justify-content:space-between;align-items:center;flex-shrink:0;"]);
37720
37720
  var Title$n = /*#__PURE__*/styled__default.h2.withConfig({
37721
37721
  displayName: "CartView__Title",
37722
37722
  componentId: "sc-ydtyl1-2"
@@ -37728,7 +37728,7 @@ var CloseButton$h = /*#__PURE__*/styled__default.div.withConfig({
37728
37728
  var CartItems = /*#__PURE__*/styled__default.div.withConfig({
37729
37729
  displayName: "CartView__CartItems",
37730
37730
  componentId: "sc-ydtyl1-4"
37731
- })(["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;}}"]);
37732
37732
  var EmptyCart = /*#__PURE__*/styled__default.div.withConfig({
37733
37733
  displayName: "CartView__EmptyCart",
37734
37734
  componentId: "sc-ydtyl1-5"
@@ -38030,53 +38030,31 @@ var useStoreMetadata = function useStoreMetadata() {
38030
38030
  var _useState = React.useState(false),
38031
38031
  isCollectingMetadata = _useState[0],
38032
38032
  setIsCollectingMetadata = _useState[1];
38033
- var collectMetadata = /*#__PURE__*/function () {
38034
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(item) {
38035
- return _regeneratorRuntime().wrap(function _callee$(_context) {
38036
- while (1) switch (_context.prev = _context.next) {
38037
- case 0:
38038
- if (!(!item.metadataType || item.metadataType !== shared.MetadataType.CharacterSkin)) {
38039
- _context.next = 2;
38040
- break;
38041
- }
38042
- return _context.abrupt("return", null);
38043
- case 2:
38044
- setIsCollectingMetadata(true);
38045
- _context.prev = 3;
38046
- _context.next = 6;
38047
- return new Promise(function (_resolve) {
38048
- // We'll store the resolver functions in a global context
38049
- // that will be accessible to the MetadataCollector component
38050
- window.__metadataResolvers = {
38051
- resolve: function resolve(metadata) {
38052
- _resolve(metadata);
38053
- },
38054
- item: item
38055
- };
38056
- });
38057
- case 6:
38058
- return _context.abrupt("return", _context.sent);
38059
- case 7:
38060
- _context.prev = 7;
38061
- setIsCollectingMetadata(false);
38062
- // Clean up the resolvers
38063
- if (window.__metadataResolvers) {
38064
- delete window.__metadataResolvers;
38065
- }
38066
- return _context.finish(7);
38067
- case 11:
38068
- case "end":
38069
- return _context.stop();
38070
- }
38071
- }, _callee, null, [[3,, 7, 11]]);
38072
- }));
38073
- return function collectMetadata(_x) {
38074
- return _ref.apply(this, arguments);
38075
- };
38076
- }();
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
+ };
38077
38053
  return {
38078
38054
  collectMetadata: collectMetadata,
38079
- isCollectingMetadata: isCollectingMetadata
38055
+ resolveMetadata: resolveMetadata,
38056
+ isCollectingMetadata: isCollectingMetadata,
38057
+ currentMetadataItem: currentMetadataItem
38080
38058
  };
38081
38059
  };
38082
38060
 
@@ -38095,7 +38073,9 @@ var useStoreCart = function useStoreCart() {
38095
38073
  }, []);
38096
38074
  var _useStoreMetadata = useStoreMetadata(),
38097
38075
  collectMetadata = _useStoreMetadata.collectMetadata,
38098
- isCollectingMetadata = _useStoreMetadata.isCollectingMetadata;
38076
+ resolveMetadata = _useStoreMetadata.resolveMetadata,
38077
+ isCollectingMetadata = _useStoreMetadata.isCollectingMetadata,
38078
+ currentMetadataItem = _useStoreMetadata.currentMetadataItem;
38099
38079
  var handleAddToCart = /*#__PURE__*/function () {
38100
38080
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(item, quantity, preselectedMetadata) {
38101
38081
  var metadata;
@@ -38227,7 +38207,9 @@ var useStoreCart = function useStoreCart() {
38227
38207
  closeCart: closeCart,
38228
38208
  getTotalItems: getTotalItems,
38229
38209
  getTotalPrice: getTotalPrice,
38230
- isCollectingMetadata: isCollectingMetadata
38210
+ isCollectingMetadata: isCollectingMetadata,
38211
+ currentMetadataItem: currentMetadataItem,
38212
+ resolveMetadata: resolveMetadata
38231
38213
  };
38232
38214
  };
38233
38215
  // Helper functions
@@ -38256,23 +38238,42 @@ var MetadataCollector = function MetadataCollector(_ref) {
38256
38238
  config = _ref.config,
38257
38239
  onCollect = _ref.onCollect,
38258
38240
  onCancel = _ref.onCancel;
38259
- // 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]);
38260
38257
  React.useEffect(function () {
38261
38258
  return function () {
38262
- // If we're unmounting without explicitly collecting or canceling,
38263
- // make sure to call onCancel to prevent any hanging promises
38264
- if (window.__metadataResolvers) {
38265
- onCancel();
38266
- }
38259
+ handleCancel();
38267
38260
  };
38268
- }, [onCancel]);
38269
- // Use string comparison instead of direct property access
38270
- 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) {
38271
38272
  return React__default.createElement(CharacterSkinSelectionModal, {
38272
38273
  isOpen: true,
38273
- onClose: onCancel,
38274
+ onClose: handleCancel,
38274
38275
  onConfirm: function onConfirm(selectedSkin) {
38275
- return onCollect({
38276
+ return handleCollect({
38276
38277
  selectedSkin: selectedSkin
38277
38278
  });
38278
38279
  },
@@ -38281,12 +38282,9 @@ var MetadataCollector = function MetadataCollector(_ref) {
38281
38282
  atlasIMG: config.atlasIMG,
38282
38283
  initialSelectedSkin: config.initialSelectedSkin
38283
38284
  });
38284
- } else {
38285
- console.warn("No collector implemented for metadata type: " + metadataType);
38286
- // Auto-cancel for unhandled types to prevent hanging promises
38287
- setTimeout(onCancel, 0);
38288
- return null;
38289
38285
  }
38286
+ console.warn("No collector implemented for metadata type: " + metadataType);
38287
+ return null;
38290
38288
  };
38291
38289
 
38292
38290
  var PaymentMethodModal = function PaymentMethodModal(_ref) {
@@ -38436,6 +38434,159 @@ var ConfirmRow$1 = /*#__PURE__*/styled__default.div.withConfig({
38436
38434
  componentId: "sc-1dxy6lr-12"
38437
38435
  })(["display:flex;justify-content:center;margin-top:4px;"]);
38438
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
+
38439
38590
  var ScrollableContent = function ScrollableContent(_ref) {
38440
38591
  var items = _ref.items,
38441
38592
  renderItem = _ref.renderItem,
@@ -38448,8 +38599,7 @@ var ScrollableContent = function ScrollableContent(_ref) {
38448
38599
  layout = _ref$layout === void 0 ? 'list' : _ref$layout,
38449
38600
  _ref$gridColumns = _ref.gridColumns,
38450
38601
  gridColumns = _ref$gridColumns === void 0 ? 4 : _ref$gridColumns,
38451
- _ref$maxHeight = _ref.maxHeight,
38452
- maxHeight = _ref$maxHeight === void 0 ? '500px' : _ref$maxHeight;
38602
+ maxHeight = _ref.maxHeight;
38453
38603
  if (items.length === 0) {
38454
38604
  return React__default.createElement(EmptyMessage$3, null, emptyMessage);
38455
38605
  }
@@ -38505,8 +38655,8 @@ var StyledDropdown$7 = /*#__PURE__*/styled__default(Dropdown).withConfig({
38505
38655
  var Content$4 = /*#__PURE__*/styled__default.div.withConfig({
38506
38656
  displayName: "ScrollableContent__Content",
38507
38657
  componentId: "sc-xhh2um-7"
38508
- })(["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) {
38509
- 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;" : '';
38510
38660
  }, function (props) {
38511
38661
  return props.$gridColumns;
38512
38662
  });
@@ -39088,7 +39238,7 @@ var TextInput = /*#__PURE__*/styled__default.input.withConfig({
39088
39238
  componentId: "sc-ptotuo-12"
39089
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;"]);
39090
39240
 
39091
- var useStoreFiltering = function useStoreFiltering(items) {
39241
+ var useStoreFiltering = function useStoreFiltering(items, overrideCategoryOptions) {
39092
39242
  var _useState = React.useState(''),
39093
39243
  searchQuery = _useState[0],
39094
39244
  setSearchQuery = _useState[1];
@@ -39096,6 +39246,21 @@ var useStoreFiltering = function useStoreFiltering(items) {
39096
39246
  selectedCategory = _useState2[0],
39097
39247
  setSelectedCategory = _useState2[1];
39098
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
+ }
39099
39264
  var uniqueCategories = Array.from(new Set(items.map(function (item) {
39100
39265
  return item.itemType;
39101
39266
  })));
@@ -39107,7 +39272,16 @@ var useStoreFiltering = function useStoreFiltering(items) {
39107
39272
  option: category === 'all' ? 'All' : category
39108
39273
  };
39109
39274
  });
39110
- }, [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]);
39111
39285
  var filteredItems = React.useMemo(function () {
39112
39286
  return items.filter(function (item) {
39113
39287
  var matchesSearch = item.name.toLowerCase().includes(searchQuery.toLowerCase());
@@ -39146,22 +39320,21 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39146
39320
  onItemView = _ref.onItemView,
39147
39321
  onCategoryChange = _ref.onCategoryChange,
39148
39322
  _ref$currencySymbol = _ref.currencySymbol,
39149
- currencySymbol = _ref$currencySymbol === void 0 ? '$' : _ref$currencySymbol;
39150
- var _useStoreFiltering = useStoreFiltering(items),
39323
+ currencySymbol = _ref$currencySymbol === void 0 ? '$' : _ref$currencySymbol,
39324
+ categoryOptionsProp = _ref.categoryOptions;
39325
+ var _useStoreFiltering = useStoreFiltering(items, categoryOptionsProp),
39151
39326
  searchQuery = _useStoreFiltering.searchQuery,
39152
39327
  setSearchQuery = _useStoreFiltering.setSearchQuery,
39153
39328
  selectedCategory = _useStoreFiltering.selectedCategory,
39154
39329
  setSelectedCategory = _useStoreFiltering.setSelectedCategory,
39155
39330
  categoryOptions = _useStoreFiltering.categoryOptions,
39156
39331
  filteredItems = _useStoreFiltering.filteredItems;
39157
- // Fire category change event when the filter changes
39158
39332
  React.useEffect(function () {
39159
39333
  onCategoryChange == null ? void 0 : onCategoryChange(selectedCategory, filteredItems.length);
39160
39334
  }, [selectedCategory, filteredItems.length]);
39161
39335
  var renderStoreItem = function renderStoreItem(item) {
39162
39336
  var meta = itemBadges[item.key];
39163
39337
  var position = filteredItems.indexOf(item);
39164
- // Prefer a specialized character skin row when needed
39165
39338
  if (item.metadataType === shared.MetadataType.CharacterSkin) {
39166
39339
  return React__default.createElement(StoreCharacterSkinRow, {
39167
39340
  key: item.key,
@@ -39172,7 +39345,6 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39172
39345
  userAccountType: userAccountType || shared.UserAccountTypes.Free
39173
39346
  });
39174
39347
  }
39175
- // Render text input row when configured for this item key
39176
39348
  if (textInputItemKeys.includes(item.key)) {
39177
39349
  return React__default.createElement(StoreItemRow, Object.assign({
39178
39350
  key: item.key,
@@ -39188,7 +39360,6 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39188
39360
  currencySymbol: currencySymbol
39189
39361
  }, meta));
39190
39362
  }
39191
- // Fallback to standard arrow-based row
39192
39363
  return React__default.createElement(StoreItemRow, Object.assign({
39193
39364
  key: item.key,
39194
39365
  item: item,
@@ -39202,19 +39373,7 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39202
39373
  currencySymbol: currencySymbol
39203
39374
  }, meta));
39204
39375
  };
39205
- var _useState = React.useState(false),
39206
- showFilters = _useState[0],
39207
- setShowFilters = _useState[1];
39208
- return React__default.createElement(StoreContainer, null, React__default.createElement(FilterBar, null, React__default.createElement(FilterToggle, {
39209
- "$active": showFilters,
39210
- onClick: function onClick() {
39211
- return setShowFilters(function (prev) {
39212
- return !prev;
39213
- });
39214
- }
39215
- }, React__default.createElement(fa.FaFilter, {
39216
- size: 12
39217
- }), 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, {
39218
39377
  value: searchQuery,
39219
39378
  onChange: setSearchQuery,
39220
39379
  placeholder: "Search items..."
@@ -39226,15 +39385,12 @@ var StoreItemsSection = function StoreItemsSection(_ref) {
39226
39385
  };
39227
39386
  }),
39228
39387
  activeId: selectedCategory,
39229
- onChange: function onChange(id) {
39230
- return setSelectedCategory(id);
39231
- }
39388
+ onChange: setSelectedCategory
39232
39389
  })), React__default.createElement(ScrollableContent, {
39233
39390
  items: filteredItems,
39234
39391
  renderItem: renderStoreItem,
39235
39392
  emptyMessage: "No items match your filters.",
39236
- layout: "list",
39237
- maxHeight: "none"
39393
+ layout: "list"
39238
39394
  }));
39239
39395
  };
39240
39396
  var StoreContainer = /*#__PURE__*/styled__default.div.withConfig({
@@ -39244,22 +39400,11 @@ var StoreContainer = /*#__PURE__*/styled__default.div.withConfig({
39244
39400
  var SearchHeader$2 = /*#__PURE__*/styled__default.div.withConfig({
39245
39401
  displayName: "StoreItemsSection__SearchHeader",
39246
39402
  componentId: "sc-l6f466-1"
39247
- })(["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;"]);
39248
39404
  var SearchBarContainer$1 = /*#__PURE__*/styled__default.div.withConfig({
39249
39405
  displayName: "StoreItemsSection__SearchBarContainer",
39250
39406
  componentId: "sc-l6f466-2"
39251
39407
  })(["flex:0.75;"]);
39252
- var FilterBar = /*#__PURE__*/styled__default.div.withConfig({
39253
- displayName: "StoreItemsSection__FilterBar",
39254
- componentId: "sc-l6f466-3"
39255
- })(["display:flex;padding-top:0.25rem;"]);
39256
- var FilterToggle = /*#__PURE__*/styled__default.button.withConfig({
39257
- displayName: "StoreItemsSection__FilterToggle",
39258
- componentId: "sc-l6f466-4"
39259
- })(["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) {
39260
- var $active = _ref2.$active;
39261
- return $active ? 'rgba(255,255,255,0.15)' : 'transparent';
39262
- });
39263
39408
 
39264
39409
  var usePackFiltering = function usePackFiltering(packs) {
39265
39410
  var _useState = React.useState(''),
@@ -39407,8 +39552,7 @@ var StorePacksSection = function StorePacksSection(_ref2) {
39407
39552
  onChange: setSearchQuery,
39408
39553
  placeholder: 'Search packs...'
39409
39554
  },
39410
- layout: "list",
39411
- maxHeight: "50vh"
39555
+ layout: "list"
39412
39556
  });
39413
39557
  };
39414
39558
  var PackRow = /*#__PURE__*/styled__default(ItemRowWrapper).withConfig({
@@ -39712,7 +39856,7 @@ var Store = function Store(_ref) {
39712
39856
  packs = _ref$packs === void 0 ? [] : _ref$packs,
39713
39857
  atlasJSON = _ref.atlasJSON,
39714
39858
  atlasIMG = _ref.atlasIMG,
39715
- _onPurchase4 = _ref.onPurchase,
39859
+ _onPurchase = _ref.onPurchase,
39716
39860
  onShowHistory = _ref.onShowHistory,
39717
39861
  onShowWallet = _ref.onShowWallet,
39718
39862
  walletLabel = _ref.walletLabel,
@@ -39733,8 +39877,6 @@ var Store = function Store(_ref) {
39733
39877
  customHistoryContent = _ref.customHistoryContent,
39734
39878
  _ref$fullScreen = _ref.fullScreen,
39735
39879
  fullScreen = _ref$fullScreen === void 0 ? false : _ref$fullScreen,
39736
- containerWidth = _ref.containerWidth,
39737
- containerHeight = _ref.containerHeight,
39738
39880
  _ref$packsTabLabel = _ref.packsTabLabel,
39739
39881
  packsTabLabel = _ref$packsTabLabel === void 0 ? 'Packs' : _ref$packsTabLabel,
39740
39882
  packsBadge = _ref.packsBadge,
@@ -39744,7 +39886,7 @@ var Store = function Store(_ref) {
39744
39886
  packBadges = _ref.packBadges,
39745
39887
  onItemView = _ref.onItemView,
39746
39888
  onPackView = _ref.onPackView,
39747
- _onTabChange = _ref.onTabChange,
39889
+ onTabChange = _ref.onTabChange,
39748
39890
  onCategoryChange = _ref.onCategoryChange,
39749
39891
  onCartOpen = _ref.onCartOpen,
39750
39892
  onAddToCart = _ref.onAddToCart,
@@ -39757,24 +39899,15 @@ var Store = function Store(_ref) {
39757
39899
  currencySymbol = _ref$currencySymbol === void 0 ? '$' : _ref$currencySymbol,
39758
39900
  onRedeem = _ref.onRedeem,
39759
39901
  onRedeemInputFocus = _ref.onRedeemInputFocus,
39760
- onRedeemInputBlur = _ref.onRedeemInputBlur;
39761
- 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;
39762
39908
  var _useState = React.useState(null),
39763
39909
  selectedPack = _useState[0],
39764
39910
  setSelectedPack = _useState[1];
39765
- var _useState2 = React.useState(function () {
39766
- var _validTabs$;
39767
- var allTabIds = [].concat(tabOrder != null ? tabOrder : defaultTabOrder, customCharactersContent ? ['characters'] : [], onRedeem ? ['redeem'] : [], onShowWallet || customWalletContent ? ['wallet'] : [], onShowHistory || customHistoryContent ? ['history'] : []);
39768
- var validTabs = Array.from(new Set(allTabIds.filter(function (id) {
39769
- return !(hidePremiumTab && id === 'premium');
39770
- })));
39771
- if (defaultActiveTab && validTabs.includes(defaultActiveTab)) {
39772
- return defaultActiveTab;
39773
- }
39774
- return (_validTabs$ = validTabs[0]) != null ? _validTabs$ : hidePremiumTab ? 'items' : 'premium';
39775
- }),
39776
- activeTab = _useState2[0],
39777
- setActiveTab = _useState2[1];
39778
39911
  var _useStoreCart = useStoreCart(),
39779
39912
  cartItems = _useStoreCart.cartItems,
39780
39913
  handleAddToCart = _useStoreCart.handleAddToCart,
@@ -39784,13 +39917,38 @@ var Store = function Store(_ref) {
39784
39917
  closeCart = _useStoreCart.closeCart,
39785
39918
  getTotalItems = _useStoreCart.getTotalItems,
39786
39919
  getTotalPrice = _useStoreCart.getTotalPrice,
39787
- isCartOpen = _useStoreCart.isCartOpen;
39788
- var _useState3 = React.useState(false),
39789
- isCollectingMetadata = _useState3[0],
39790
- setIsCollectingMetadata = _useState3[1];
39791
- var _useState4 = React.useState(null),
39792
- currentMetadataItem = _useState4[0],
39793
- 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;
39794
39952
  var handleOpenCart = function handleOpenCart() {
39795
39953
  openCart();
39796
39954
  onCartOpen == null ? void 0 : onCartOpen();
@@ -39807,85 +39965,13 @@ var Store = function Store(_ref) {
39807
39965
  if (quantity === void 0) {
39808
39966
  quantity = 1;
39809
39967
  }
39810
- var packItem = {
39811
- key: pack.key,
39812
- name: pack.title,
39813
- description: pack.description || '',
39814
- price: pack.priceUSD,
39815
- currency: shared.PaymentCurrency.USD,
39816
- texturePath: pack.image["default"] || pack.image.src,
39817
- type: shared.PurchaseType.Pack,
39818
- onPurchase: function () {
39819
- var _onPurchase = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
39820
- return _regeneratorRuntime().wrap(function _callee$(_context) {
39821
- while (1) switch (_context.prev = _context.next) {
39822
- case 0:
39823
- case "end":
39824
- return _context.stop();
39825
- }
39826
- }, _callee);
39827
- }));
39828
- function onPurchase() {
39829
- return _onPurchase.apply(this, arguments);
39830
- }
39831
- return onPurchase;
39832
- }(),
39833
- itemType: shared.ItemType.Consumable,
39834
- itemSubType: shared.ItemSubType.Other,
39835
- rarity: shared.ItemRarities.Common,
39836
- weight: 0,
39837
- isStackable: false,
39838
- maxStackSize: 1,
39839
- isUsable: false
39840
- };
39841
- handleAddToCart(packItem, quantity);
39842
- onAddToCart == null ? void 0 : onAddToCart(packItem, quantity);
39843
- };
39844
- var filterItems = function filterItems(itemsToFilter, type) {
39845
- return itemsToFilter.filter(function (item) {
39846
- if (type === 'premium') {
39847
- var _item$requiredAccount, _item$requiredAccount2;
39848
- return (_item$requiredAccount = (_item$requiredAccount2 = item.requiredAccountType) == null ? void 0 : _item$requiredAccount2.length) != null ? _item$requiredAccount : 0 > 0;
39849
- }
39850
- return true;
39851
- });
39852
- };
39853
- var filteredItems = React.useMemo(function () {
39854
- return {
39855
- items: filterItems(items, 'items'),
39856
- premium: filterItems(items, 'premium')
39857
- };
39858
- }, [items]);
39859
- var handleMetadataCollected = function handleMetadataCollected(metadata) {
39860
- if (currentMetadataItem && window.__metadataResolvers) {
39861
- // Resolve the promise in the useStoreMetadata hook
39862
- window.__metadataResolvers.resolve(metadata);
39863
- // Reset the metadata collection state
39864
- setCurrentMetadataItem(null);
39865
- // Removed unused setPendingMetadataQuantity call
39866
- }
39867
- };
39868
- var handleMetadataCancel = function handleMetadataCancel() {
39869
- if (window.__metadataResolvers) {
39870
- // Resolve with null to indicate cancellation
39871
- window.__metadataResolvers.resolve(null);
39872
- }
39873
- // Reset the metadata collection state
39874
- setCurrentMetadataItem(null);
39875
- // Removed unused setPendingMetadataQuantity call
39876
- setIsCollectingMetadata(false);
39968
+ var bp = packToBlueprint(pack);
39969
+ handleAddToCart(bp, quantity);
39970
+ onAddToCart == null ? void 0 : onAddToCart(bp, quantity);
39877
39971
  };
39878
- if (loading) {
39879
- return React__default.createElement(LoadingMessage$1, null, "Loading...");
39880
- }
39881
- if (error) {
39882
- return React__default.createElement(ErrorMessage$3, null, error);
39883
- }
39884
- // Build tabs dynamically based on props
39885
- var tabIds = [].concat(tabOrder != null ? tabOrder : defaultTabOrder, customCharactersContent ? ['characters'] : [], onRedeem ? ['redeem'] : [], onShowWallet || customWalletContent ? ['wallet'] : [], onShowHistory || customHistoryContent ? ['history'] : []);
39886
- var availableTabIds = Array.from(new Set(tabIds.filter(function (id) {
39887
- return !(hidePremiumTab && id === 'premium');
39888
- })));
39972
+ var makePackQuickBuy = onQuickBuy ? function (pack, qty) {
39973
+ return onQuickBuy(packToBlueprint(pack), qty);
39974
+ } : undefined;
39889
39975
  var tabsMap = {
39890
39976
  premium: {
39891
39977
  id: 'premium',
@@ -39899,40 +39985,7 @@ var Store = function Store(_ref) {
39899
39985
  return pack.priceUSD >= 9.99;
39900
39986
  }),
39901
39987
  onAddToCart: handleAddPackToCart,
39902
- onQuickBuy: onQuickBuy ? function (pack, qty) {
39903
- var bp = {
39904
- key: pack.key,
39905
- name: pack.title,
39906
- description: pack.description || '',
39907
- price: pack.priceUSD,
39908
- currency: shared.PaymentCurrency.USD,
39909
- texturePath: pack.image["default"] || pack.image.src,
39910
- type: shared.PurchaseType.Pack,
39911
- onPurchase: function () {
39912
- var _onPurchase2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
39913
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
39914
- while (1) switch (_context2.prev = _context2.next) {
39915
- case 0:
39916
- case "end":
39917
- return _context2.stop();
39918
- }
39919
- }, _callee2);
39920
- }));
39921
- function onPurchase() {
39922
- return _onPurchase2.apply(this, arguments);
39923
- }
39924
- return onPurchase;
39925
- }(),
39926
- itemType: shared.ItemType.Consumable,
39927
- itemSubType: shared.ItemSubType.Other,
39928
- rarity: shared.ItemRarities.Common,
39929
- weight: 0,
39930
- isStackable: false,
39931
- maxStackSize: 1,
39932
- isUsable: false
39933
- };
39934
- onQuickBuy(bp, qty);
39935
- } : undefined,
39988
+ onQuickBuy: makePackQuickBuy,
39936
39989
  onSelectPack: setSelectedPack,
39937
39990
  atlasJSON: atlasJSON,
39938
39991
  atlasIMG: atlasIMG,
@@ -39957,40 +40010,7 @@ var Store = function Store(_ref) {
39957
40010
  return pack.priceUSD < 9.99;
39958
40011
  }),
39959
40012
  onAddToCart: handleAddPackToCart,
39960
- onQuickBuy: onQuickBuy ? function (pack, qty) {
39961
- var bp = {
39962
- key: pack.key,
39963
- name: pack.title,
39964
- description: pack.description || '',
39965
- price: pack.priceUSD,
39966
- currency: shared.PaymentCurrency.USD,
39967
- texturePath: pack.image["default"] || pack.image.src,
39968
- type: shared.PurchaseType.Pack,
39969
- onPurchase: function () {
39970
- var _onPurchase3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
39971
- return _regeneratorRuntime().wrap(function _callee3$(_context3) {
39972
- while (1) switch (_context3.prev = _context3.next) {
39973
- case 0:
39974
- case "end":
39975
- return _context3.stop();
39976
- }
39977
- }, _callee3);
39978
- }));
39979
- function onPurchase() {
39980
- return _onPurchase3.apply(this, arguments);
39981
- }
39982
- return onPurchase;
39983
- }(),
39984
- itemType: shared.ItemType.Consumable,
39985
- itemSubType: shared.ItemSubType.Other,
39986
- rarity: shared.ItemRarities.Common,
39987
- weight: 0,
39988
- isStackable: false,
39989
- maxStackSize: 1,
39990
- isUsable: false
39991
- };
39992
- onQuickBuy(bp, qty);
39993
- } : undefined,
40013
+ onQuickBuy: makePackQuickBuy,
39994
40014
  onSelectPack: setSelectedPack,
39995
40015
  atlasJSON: atlasJSON,
39996
40016
  atlasIMG: atlasIMG,
@@ -40009,7 +40029,7 @@ var Store = function Store(_ref) {
40009
40029
  content: React__default.createElement(StoreItemsSection, {
40010
40030
  items: filteredItems.items,
40011
40031
  onAddToCart: handleAddToCartTracked,
40012
- onQuickBuy: onQuickBuy ? function (item, qty, _meta) {
40032
+ onQuickBuy: onQuickBuy ? function (item, qty) {
40013
40033
  return onQuickBuy(item, qty);
40014
40034
  } : undefined,
40015
40035
  atlasJSON: atlasJSON,
@@ -40019,7 +40039,8 @@ var Store = function Store(_ref) {
40019
40039
  itemBadges: itemBadges,
40020
40040
  onItemView: onItemView,
40021
40041
  onCategoryChange: onCategoryChange,
40022
- currencySymbol: currencySymbol
40042
+ currencySymbol: currencySymbol,
40043
+ categoryOptions: itemCategoryOptions
40023
40044
  })
40024
40045
  },
40025
40046
  characters: {
@@ -40069,39 +40090,42 @@ var Store = function Store(_ref) {
40069
40090
  }))
40070
40091
  }
40071
40092
  };
40093
+ if (loading) return React__default.createElement(LoadingMessage$1, null, "Loading...");
40094
+ if (error) return React__default.createElement(ErrorMessage$3, null, error);
40072
40095
  return React__default.createElement(DraggableContainer, {
40073
- title: "Store",
40074
40096
  onCloseButton: onClose,
40075
- width: containerWidth != null ? containerWidth : "1000px",
40097
+ width: width,
40076
40098
  minWidth: "700px",
40077
- height: containerHeight != null ? containerHeight : "80vh",
40099
+ height: height,
40078
40100
  type: exports.RPGUIContainerTypes.Framed,
40079
- cancelDrag: "[class*='Store__Container'], [class*='CartView'], [class*='StoreItemDetails'], .close-button",
40101
+ cancelDrag: ".store-scroll-area, [class*='CartView'], [class*='StoreItemDetails'], .close-button",
40080
40102
  isFullScreen: fullScreen
40081
- }, isCollectingMetadata && currentMetadataItem && currentMetadataItem.metadataType ? React__default.createElement(MetadataCollector, {
40103
+ }, isCollectingMetadata && currentMetadataItem != null && currentMetadataItem.metadataType ? React__default.createElement(MetadataCollector, {
40082
40104
  metadataType: currentMetadataItem.metadataType,
40083
40105
  config: currentMetadataItem.metadataConfig || {},
40084
- onCollect: handleMetadataCollected,
40085
- onCancel: handleMetadataCancel
40106
+ onCollect: resolveMetadata,
40107
+ onCancel: function onCancel() {
40108
+ return resolveMetadata(null);
40109
+ }
40086
40110
  }) : isCartOpen ? React__default.createElement(CartView, {
40087
40111
  cartItems: cartItems,
40088
40112
  onRemoveFromCart: handleRemoveFromCartTracked,
40089
40113
  onClose: closeCart,
40090
40114
  onPurchase: function () {
40091
- var _onPurchase5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
40092
- return _regeneratorRuntime().wrap(function _callee4$(_context4) {
40093
- 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) {
40094
40118
  case 0:
40095
- handleCartPurchase(_onPurchase4);
40096
- return _context4.abrupt("return", true);
40119
+ handleCartPurchase(_onPurchase);
40120
+ return _context.abrupt("return", true);
40097
40121
  case 2:
40098
40122
  case "end":
40099
- return _context4.stop();
40123
+ return _context.stop();
40100
40124
  }
40101
- }, _callee4);
40125
+ }, _callee);
40102
40126
  }));
40103
40127
  function onPurchase() {
40104
- return _onPurchase5.apply(this, arguments);
40128
+ return _onPurchase2.apply(this, arguments);
40105
40129
  }
40106
40130
  return onPurchase;
40107
40131
  }(),
@@ -40125,7 +40149,9 @@ var Store = function Store(_ref) {
40125
40149
  return handleAddPackToCart(selectedPack);
40126
40150
  },
40127
40151
  currencySymbol: currencySymbol
40128
- }) : 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, {
40129
40155
  items: featuredItems,
40130
40156
  atlasJSON: atlasJSON,
40131
40157
  atlasIMG: atlasIMG,
@@ -40139,48 +40165,17 @@ var Store = function Store(_ref) {
40139
40165
  var blueprint = items.find(function (bp) {
40140
40166
  return bp.key === item.key;
40141
40167
  });
40142
- if (blueprint) onQuickBuy(blueprint, 1);else {
40168
+ if (blueprint) {
40169
+ onQuickBuy(blueprint, 1);
40170
+ } else {
40143
40171
  var pack = packs.find(function (p) {
40144
40172
  return p.key === item.key;
40145
40173
  });
40146
- if (pack) {
40147
- var packBlueprint = {
40148
- key: pack.key,
40149
- name: pack.title,
40150
- description: pack.description || '',
40151
- price: pack.priceUSD,
40152
- currency: shared.PaymentCurrency.USD,
40153
- texturePath: pack.image["default"] || pack.image.src,
40154
- type: shared.PurchaseType.Pack,
40155
- onPurchase: function () {
40156
- var _onPurchase6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
40157
- return _regeneratorRuntime().wrap(function _callee5$(_context5) {
40158
- while (1) switch (_context5.prev = _context5.next) {
40159
- case 0:
40160
- case "end":
40161
- return _context5.stop();
40162
- }
40163
- }, _callee5);
40164
- }));
40165
- function onPurchase() {
40166
- return _onPurchase6.apply(this, arguments);
40167
- }
40168
- return onPurchase;
40169
- }(),
40170
- itemType: shared.ItemType.Consumable,
40171
- itemSubType: shared.ItemSubType.Other,
40172
- rarity: shared.ItemRarities.Common,
40173
- weight: 0,
40174
- isStackable: false,
40175
- maxStackSize: 1,
40176
- isUsable: false
40177
- };
40178
- onQuickBuy(packBlueprint, 1);
40179
- }
40174
+ if (pack) onQuickBuy(packToBlueprint(pack), 1);
40180
40175
  }
40181
40176
  } : undefined
40182
- }), React__default.createElement(MainContent$1, null, React__default.createElement(HeaderRow, null, React__default.createElement(TabsFlexWrapper, null, React__default.createElement(Tabs, {
40183
- options: availableTabIds.map(function (id) {
40177
+ }), React__default.createElement(MainContent$1, null, React__default.createElement(StoreHeader, {
40178
+ tabs: availableTabIds.map(function (id) {
40184
40179
  var _tabsMap$id, _tabsMap$id2;
40185
40180
  return {
40186
40181
  id: id,
@@ -40189,20 +40184,12 @@ var Store = function Store(_ref) {
40189
40184
  };
40190
40185
  }),
40191
40186
  activeTabId: activeTab,
40192
- onTabChange: function onTabChange(tabId) {
40193
- var nextTab = tabId;
40194
- setActiveTab(nextTab);
40195
- if (_onTabChange) {
40196
- var itemCount = nextTab === 'items' ? filteredItems.items.length : nextTab === 'premium' ? filteredItems.premium.length : nextTab === 'packs' ? packs.length : 0;
40197
- _onTabChange(nextTab, itemCount);
40198
- }
40199
- }
40200
- })), React__default.createElement(CartButtonWrapper, null, React__default.createElement(CTAButton, {
40201
- icon: React__default.createElement(fa.FaShoppingCart, null),
40202
- onClick: handleOpenCart
40203
- }), 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, {
40204
40191
  icon: React__default.createElement(fa.FaShoppingCart, null),
40205
- label: "Checkout \xB7 " + getTotalItems() + " item" + (getTotalItems() !== 1 ? 's' : '') + " (" + currencySymbol + getTotalPrice().toFixed(2) + ")",
40192
+ label: "Proceed to Checkout (" + currencySymbol + getTotalPrice().toFixed(2) + ")",
40206
40193
  onClick: handleOpenCart,
40207
40194
  fullWidth: true
40208
40195
  }))));
@@ -40210,50 +40197,34 @@ var Store = function Store(_ref) {
40210
40197
  var Container$Q = /*#__PURE__*/styled__default.div.withConfig({
40211
40198
  displayName: "Store__Container",
40212
40199
  componentId: "sc-64dj00-0"
40213
- })(["display:flex;flex-direction:column;width:100%;height:calc(100% - 48px);gap:0.5rem;position:relative;overflow:hidden;"]);
40214
- var HeaderRow = /*#__PURE__*/styled__default.div.withConfig({
40215
- displayName: "Store__HeaderRow",
40216
- componentId: "sc-64dj00-1"
40217
- })(["display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:0.25rem;padding-top:10px;padding-right:12px;"]);
40218
- var TabsFlexWrapper = /*#__PURE__*/styled__default.div.withConfig({
40219
- displayName: "Store__TabsFlexWrapper",
40220
- componentId: "sc-64dj00-2"
40221
- })(["flex:1;min-width:0;"]);
40222
- var CartButtonWrapper = /*#__PURE__*/styled__default.div.withConfig({
40223
- displayName: "Store__CartButtonWrapper",
40224
- componentId: "sc-64dj00-3"
40225
- })(["position:relative;flex-shrink:0;"]);
40226
- var CartBadge = /*#__PURE__*/styled__default.div.withConfig({
40227
- displayName: "Store__CartBadge",
40228
- componentId: "sc-64dj00-4"
40229
- })(["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;"]);
40230
40201
  var MainContent$1 = /*#__PURE__*/styled__default.div.withConfig({
40231
40202
  displayName: "Store__MainContent",
40232
- componentId: "sc-64dj00-5"
40203
+ componentId: "sc-64dj00-1"
40233
40204
  })(["flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden;"]);
40234
40205
  var TabContent = /*#__PURE__*/styled__default.div.withConfig({
40235
40206
  displayName: "Store__TabContent",
40236
- componentId: "sc-64dj00-6"
40207
+ componentId: "sc-64dj00-2"
40237
40208
  })(["flex:1;overflow-y:auto;"]);
40238
40209
  var Footer$3 = /*#__PURE__*/styled__default.div.withConfig({
40239
40210
  displayName: "Store__Footer",
40240
- componentId: "sc-64dj00-7"
40241
- })(["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;"]);
40242
40213
  var TabLabelWithBadge = /*#__PURE__*/styled__default.span.withConfig({
40243
40214
  displayName: "Store__TabLabelWithBadge",
40244
- componentId: "sc-64dj00-8"
40215
+ componentId: "sc-64dj00-4"
40245
40216
  })(["display:inline-flex;align-items:center;gap:5px;"]);
40246
40217
  var LoadingMessage$1 = /*#__PURE__*/styled__default.div.withConfig({
40247
40218
  displayName: "Store__LoadingMessage",
40248
- componentId: "sc-64dj00-9"
40219
+ componentId: "sc-64dj00-5"
40249
40220
  })(["text-align:center;color:", ";padding:2rem;"], uiColors.white);
40250
40221
  var ErrorMessage$3 = /*#__PURE__*/styled__default.div.withConfig({
40251
40222
  displayName: "Store__ErrorMessage",
40252
- componentId: "sc-64dj00-10"
40223
+ componentId: "sc-64dj00-6"
40253
40224
  })(["text-align:center;color:", ";padding:2rem;"], uiColors.red);
40254
40225
  var CenteredContent = /*#__PURE__*/styled__default.div.withConfig({
40255
40226
  displayName: "Store__CenteredContent",
40256
- componentId: "sc-64dj00-11"
40227
+ componentId: "sc-64dj00-7"
40257
40228
  })(["display:flex;align-items:center;justify-content:center;height:100%;padding:2rem;"]);
40258
40229
 
40259
40230
  var TextArea = function TextArea(_ref) {