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