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