2022-01-16 05:56:31 +01:00
|
|
|
import { ApproveNameMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, ClubGiftInfoEvent, GiftReceiverNotFoundEvent, GiftWrappingConfigurationEvent, HabboClubOffersMessageEvent, LimitedEditionSoldOutEvent, MarketplaceConfigurationEvent, MarketplaceMakeOfferResult, NodeData, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, SellablePetPalettesMessageEvent, UserSubscriptionEvent } from '@nitrots/nitro-renderer';
|
2021-08-25 23:20:32 +02:00
|
|
|
import { GuildMembershipsMessageEvent } from '@nitrots/nitro-renderer/src/nitro/communication/messages/incoming/user/GuildMembershipsMessageEvent';
|
2021-05-05 09:14:54 +02:00
|
|
|
import { FC, useCallback } from 'react';
|
2022-01-16 05:56:31 +01:00
|
|
|
import { GetFurnitureData, GetProductDataForLocalization, LocalizeText } from '../../api';
|
2022-02-01 07:58:19 +01:00
|
|
|
import { CatalogNameResultEvent, CatalogPurchaseFailureEvent, CatalogPurchaseNotAllowedEvent, CatalogSetExtraPurchaseParameterEvent } from '../../events';
|
2021-09-14 21:34:13 +02:00
|
|
|
import { CatalogGiftReceiverNotFoundEvent } from '../../events/catalog/CatalogGiftReceiverNotFoundEvent';
|
2021-05-10 19:11:16 +02:00
|
|
|
import { CatalogPurchasedEvent } from '../../events/catalog/CatalogPurchasedEvent';
|
|
|
|
import { CatalogPurchaseSoldOutEvent } from '../../events/catalog/CatalogPurchaseSoldOutEvent';
|
2022-01-16 05:56:31 +01:00
|
|
|
import { BatchUpdates } from '../../hooks';
|
2021-05-10 19:11:16 +02:00
|
|
|
import { dispatchUiEvent } from '../../hooks/events/ui/ui-event';
|
2021-05-05 09:14:54 +02:00
|
|
|
import { CreateMessageHook } from '../../hooks/messages/message-event';
|
2022-01-06 04:09:53 +01:00
|
|
|
import { NotificationAlertType } from '../../views/notification-center/common/NotificationAlertType';
|
|
|
|
import { NotificationUtilities } from '../../views/notification-center/common/NotificationUtilities';
|
2022-02-02 21:54:40 +01:00
|
|
|
import { useCatalogContext } from './CatalogContext';
|
2022-01-16 05:56:31 +01:00
|
|
|
import { CatalogNode } from './common/CatalogNode';
|
2021-06-23 06:03:56 +02:00
|
|
|
import { CatalogPetPalette } from './common/CatalogPetPalette';
|
2022-01-16 05:56:31 +01:00
|
|
|
import { CatalogType } from './common/CatalogType';
|
2022-02-01 07:58:19 +01:00
|
|
|
import { GiftWrappingConfiguration } from './common/GiftWrappingConfiguration';
|
2022-01-16 05:56:31 +01:00
|
|
|
import { ICatalogNode } from './common/ICatalogNode';
|
|
|
|
import { IProduct } from './common/IProduct';
|
|
|
|
import { IPurchasableOffer } from './common/IPurchasableOffer';
|
|
|
|
import { Offer } from './common/Offer';
|
|
|
|
import { PageLocalization } from './common/PageLocalization';
|
|
|
|
import { Product } from './common/Product';
|
2022-01-19 00:12:48 +01:00
|
|
|
import { ProductTypeEnum } from './common/ProductTypeEnum';
|
2021-06-23 06:03:56 +02:00
|
|
|
import { SubscriptionInfo } from './common/SubscriptionInfo';
|
2021-04-22 05:26:30 +02:00
|
|
|
|
2022-01-06 04:07:33 +01:00
|
|
|
export const CatalogMessageHandler: FC<{}> = props =>
|
2021-04-22 05:26:30 +02:00
|
|
|
{
|
2022-02-01 07:58:19 +01:00
|
|
|
const { setIsBusy, pageId, currentType, setRootNode, setOffersToNodes, currentPage, setCurrentOffer, setFrontPageItems, resetState, showCatalogPage, setCatalogOptions = null } = useCatalogContext();
|
2021-05-05 09:14:54 +02:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onCatalogPagesListEvent = useCallback((event: CatalogPagesListEvent) =>
|
2021-05-05 09:14:54 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
2022-01-16 05:56:31 +01:00
|
|
|
const offers: Map<number, ICatalogNode[]> = new Map();
|
2021-05-05 09:14:54 +02:00
|
|
|
|
2022-01-16 05:56:31 +01:00
|
|
|
const getCatalogNode = (node: NodeData, depth: number, parent: ICatalogNode) =>
|
|
|
|
{
|
|
|
|
const catalogNode = (new CatalogNode(node, depth, parent) as ICatalogNode);
|
|
|
|
|
|
|
|
for(const offerId of catalogNode.offerIds)
|
|
|
|
{
|
|
|
|
if(offers.has(offerId)) offers.get(offerId).push(catalogNode);
|
|
|
|
else offers.set(offerId, [ catalogNode ]);
|
2021-05-05 09:14:54 +02:00
|
|
|
}
|
2022-01-16 05:56:31 +01:00
|
|
|
|
|
|
|
depth++;
|
|
|
|
|
|
|
|
for(const child of node.children) catalogNode.addChild(getCatalogNode(child, depth, catalogNode));
|
|
|
|
|
|
|
|
return catalogNode;
|
|
|
|
}
|
|
|
|
|
|
|
|
BatchUpdates(() =>
|
|
|
|
{
|
2022-01-19 00:12:48 +01:00
|
|
|
setRootNode(getCatalogNode(parser.root, 0, null));
|
2022-01-20 19:24:51 +01:00
|
|
|
setOffersToNodes(offers);
|
2021-05-05 09:14:54 +02:00
|
|
|
});
|
2022-01-20 19:24:51 +01:00
|
|
|
}, [ setRootNode, setOffersToNodes ]);
|
2021-05-05 09:14:54 +02:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onCatalogPageMessageEvent = useCallback((event: CatalogPageMessageEvent) =>
|
2021-05-05 09:14:54 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
2022-01-16 05:56:31 +01:00
|
|
|
if(parser.catalogType !== currentType) return;
|
|
|
|
|
|
|
|
const purchasableOffers: IPurchasableOffer[] = [];
|
|
|
|
|
|
|
|
for(const offer of parser.offers)
|
|
|
|
{
|
|
|
|
const products: IProduct[] = [];
|
|
|
|
const productData = GetProductDataForLocalization(offer.localizationId);
|
|
|
|
|
|
|
|
for(const product of offer.products)
|
|
|
|
{
|
|
|
|
const furnitureData = GetFurnitureData(product.furniClassId, product.productType);
|
|
|
|
|
|
|
|
products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft));
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!products.length) continue;
|
|
|
|
|
|
|
|
const purchasableOffer = new Offer(offer.offerId, offer.localizationId, offer.rent, offer.priceCredits, offer.priceActivityPoints, offer.priceActivityPointsType, offer.giftable, offer.clubLevel, products, offer.bundlePurchaseAllowed);
|
|
|
|
|
|
|
|
if((currentType === CatalogType.NORMAL) || ((purchasableOffer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (purchasableOffer.pricingModel !== Offer.PRICING_MODEL_MULTI))) purchasableOffers.push(purchasableOffer);
|
|
|
|
}
|
|
|
|
|
|
|
|
BatchUpdates(() =>
|
|
|
|
{
|
|
|
|
if(parser.frontPageItems && parser.frontPageItems.length) setFrontPageItems(parser.frontPageItems);
|
|
|
|
|
|
|
|
setIsBusy(false);
|
|
|
|
|
|
|
|
if(pageId === parser.pageId)
|
|
|
|
{
|
|
|
|
showCatalogPage(parser.pageId, parser.layoutCode, new PageLocalization(parser.localization.images.concat(), parser.localization.texts.concat()), purchasableOffers, parser.offerId, parser.acceptSeasonCurrencyAsCredits);
|
2021-05-05 09:14:54 +02:00
|
|
|
}
|
|
|
|
});
|
2022-01-16 05:56:31 +01:00
|
|
|
}, [ currentType, pageId, setFrontPageItems, setIsBusy, showCatalogPage ]);
|
2021-05-05 09:14:54 +02:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onPurchaseOKMessageEvent = useCallback((event: PurchaseOKMessageEvent) =>
|
2021-05-10 19:11:16 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
|
|
|
dispatchUiEvent(new CatalogPurchasedEvent(parser.offer));
|
|
|
|
}, []);
|
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onPurchaseErrorMessageEvent = useCallback((event: PurchaseErrorMessageEvent) =>
|
2021-05-10 19:11:16 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
|
|
|
dispatchUiEvent(new CatalogPurchaseFailureEvent(parser.code));
|
|
|
|
}, []);
|
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onPurchaseNotAllowedMessageEvent = useCallback((event: PurchaseNotAllowedMessageEvent) =>
|
2021-05-10 19:11:16 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
2022-02-01 07:58:19 +01:00
|
|
|
|
|
|
|
dispatchUiEvent(new CatalogPurchaseNotAllowedEvent(parser.code));
|
2021-05-10 19:11:16 +02:00
|
|
|
}, []);
|
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onLimitedEditionSoldOutEvent = useCallback((event: LimitedEditionSoldOutEvent) =>
|
2021-05-10 19:11:16 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
|
|
|
dispatchUiEvent(new CatalogPurchaseSoldOutEvent());
|
|
|
|
}, []);
|
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onProductOfferEvent = useCallback((event: ProductOfferEvent) =>
|
2021-05-10 19:11:16 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
2022-01-16 05:56:31 +01:00
|
|
|
const offerData = parser.offer;
|
2021-05-10 19:11:16 +02:00
|
|
|
|
2022-01-16 05:56:31 +01:00
|
|
|
if(!offerData || !offerData.products.length) return;
|
|
|
|
|
|
|
|
const offerProductData = offerData.products[0];
|
|
|
|
|
|
|
|
if(offerProductData.uniqueLimitedItem)
|
|
|
|
{
|
|
|
|
// update unique
|
|
|
|
}
|
|
|
|
|
|
|
|
const products: IProduct[] = [];
|
|
|
|
const productData = GetProductDataForLocalization(offerData.localizationId);
|
|
|
|
|
|
|
|
for(const product of offerData.products)
|
|
|
|
{
|
|
|
|
const furnitureData = GetFurnitureData(product.furniClassId, product.productType);
|
|
|
|
|
|
|
|
products.push(new Product(product.productType, product.furniClassId, product.extraParam, product.productCount, productData, furnitureData, product.uniqueLimitedItem, product.uniqueLimitedSeriesSize, product.uniqueLimitedItemsLeft));
|
|
|
|
}
|
|
|
|
|
|
|
|
const offer = new Offer(offerData.offerId, offerData.localizationId, offerData.rent, offerData.priceCredits, offerData.priceActivityPoints, offerData.priceActivityPointsType, offerData.giftable, offerData.clubLevel, products, offerData.bundlePurchaseAllowed);
|
|
|
|
|
|
|
|
if(!((currentType === CatalogType.NORMAL) || ((offer.pricingModel !== Offer.PRICING_MODEL_BUNDLE) && (offer.pricingModel !== Offer.PRICING_MODEL_MULTI)))) return;
|
|
|
|
|
|
|
|
offer.page = currentPage;
|
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
setCurrentOffer(offer);
|
2022-01-16 05:56:31 +01:00
|
|
|
|
2022-01-19 00:12:48 +01:00
|
|
|
if(offer.product && (offer.product.productType === ProductTypeEnum.WALL))
|
2022-01-16 05:56:31 +01:00
|
|
|
{
|
2022-01-19 00:12:48 +01:00
|
|
|
dispatchUiEvent(new CatalogSetExtraPurchaseParameterEvent(offer.product.extraParam));
|
|
|
|
}
|
|
|
|
|
|
|
|
// (this._isObjectMoverRequested) && (this._purchasableOffer)
|
2022-02-01 07:58:19 +01:00
|
|
|
}, [ currentType, currentPage, setCurrentOffer ]);
|
2021-05-10 19:11:16 +02:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onSellablePetPalettesMessageEvent = useCallback((event: SellablePetPalettesMessageEvent) =>
|
2021-05-22 19:27:39 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
const petPalette = new CatalogPetPalette(parser.productCode, parser.palettes.slice());
|
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
setCatalogOptions(prevValue =>
|
|
|
|
{
|
|
|
|
const petPalettes = [];
|
|
|
|
|
|
|
|
if(prevValue.petPalettes) petPalettes.push(...prevValue.petPalettes);
|
|
|
|
|
|
|
|
for(let i = 0; i < petPalettes.length; i++)
|
|
|
|
{
|
|
|
|
const palette = petPalettes[i];
|
|
|
|
|
|
|
|
if(palette.breed === petPalette.breed)
|
|
|
|
{
|
|
|
|
petPalettes.splice(i, 1);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
petPalettes.push(petPalette);
|
|
|
|
|
|
|
|
return { ...prevValue, petPalettes };
|
|
|
|
});
|
|
|
|
}, [ setCatalogOptions ]);
|
2021-05-22 19:27:39 +02:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onApproveNameMessageEvent = useCallback((event: ApproveNameMessageEvent) =>
|
2021-05-22 19:27:39 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
|
|
|
dispatchUiEvent(new CatalogNameResultEvent(parser.result, parser.validationInfo));
|
|
|
|
}, []);
|
|
|
|
|
2021-09-14 21:34:13 +02:00
|
|
|
const onGiftReceiverNotFoundEvent = useCallback(() =>
|
|
|
|
{
|
|
|
|
dispatchUiEvent(new CatalogGiftReceiverNotFoundEvent());
|
|
|
|
}, []);
|
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onHabboClubOffersMessageEvent = useCallback((event: HabboClubOffersMessageEvent) =>
|
2021-05-24 07:28:37 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
setCatalogOptions(prevValue =>
|
|
|
|
{
|
|
|
|
const clubOffers = parser.offers;
|
|
|
|
|
|
|
|
return { ...prevValue, clubOffers };
|
|
|
|
});
|
|
|
|
}, [ setCatalogOptions ]);
|
2021-05-24 07:28:37 +02:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onGuildMembershipsMessageEvent = useCallback((event: GuildMembershipsMessageEvent) =>
|
2021-06-21 11:54:29 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
setCatalogOptions(prevValue =>
|
|
|
|
{
|
|
|
|
const groups = parser.groups;
|
|
|
|
|
|
|
|
return { ...prevValue, groups };
|
|
|
|
});
|
|
|
|
}, [ setCatalogOptions ]);
|
2021-06-21 11:54:29 +02:00
|
|
|
|
2021-06-12 04:53:56 +02:00
|
|
|
const onUserSubscriptionEvent = useCallback((event: UserSubscriptionEvent) =>
|
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
setCatalogOptions(prevValue =>
|
|
|
|
{
|
|
|
|
const subscriptionInfo = new SubscriptionInfo(
|
2021-07-24 10:04:27 +02:00
|
|
|
Math.max(0, parser.daysToPeriodEnd),
|
|
|
|
Math.max(0, parser.periodsSubscribedAhead),
|
2021-06-12 04:53:56 +02:00
|
|
|
parser.isVip,
|
|
|
|
parser.pastClubDays,
|
2022-02-01 07:58:19 +01:00
|
|
|
parser.pastVipDays);
|
|
|
|
|
|
|
|
return { ...prevValue, subscriptionInfo };
|
|
|
|
});
|
|
|
|
}, [ setCatalogOptions ]);
|
2021-06-12 04:53:56 +02:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onCatalogPublishedMessageEvent = useCallback((event: CatalogPublishedMessageEvent) =>
|
2021-06-12 04:53:56 +02:00
|
|
|
{
|
2022-01-19 00:12:48 +01:00
|
|
|
resetState();
|
|
|
|
}, [ resetState ]);
|
2021-06-12 04:53:56 +02:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
const onGiftWrappingConfigurationEvent = useCallback((event: GiftWrappingConfigurationEvent) =>
|
2021-07-17 19:11:47 +02:00
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
setCatalogOptions(prevValue =>
|
|
|
|
{
|
|
|
|
const giftConfiguration = new GiftWrappingConfiguration(parser);
|
|
|
|
|
|
|
|
return { ...prevValue, giftConfiguration };
|
|
|
|
});
|
|
|
|
}, [ setCatalogOptions ]);
|
2021-07-17 19:11:47 +02:00
|
|
|
|
2022-01-05 18:56:39 +01:00
|
|
|
const onMarketplaceMakeOfferResult = useCallback((event: MarketplaceMakeOfferResult) =>
|
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
|
|
|
if(!parser) return;
|
|
|
|
|
|
|
|
let title = '';
|
|
|
|
if(parser.result === 1)
|
|
|
|
{
|
|
|
|
title = LocalizeText('inventory.marketplace.result.title.success');
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
title = LocalizeText('inventory.marketplace.result.title.failure');
|
|
|
|
}
|
|
|
|
|
|
|
|
const message = LocalizeText(`inventory.marketplace.result.${parser.result}`);
|
|
|
|
|
|
|
|
NotificationUtilities.simpleAlert(message, NotificationAlertType.DEFAULT, null, null, title);
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
const onMarketplaceConfigurationEvent = useCallback((event: MarketplaceConfigurationEvent) =>
|
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
setCatalogOptions(prevValue =>
|
|
|
|
{
|
|
|
|
const marketplaceConfiguration = parser;
|
|
|
|
|
|
|
|
return { ...prevValue, marketplaceConfiguration };
|
|
|
|
});
|
|
|
|
}, [ setCatalogOptions ]);
|
2022-01-05 18:56:39 +01:00
|
|
|
|
2022-01-05 22:12:29 +01:00
|
|
|
const onClubGiftInfoEvent = useCallback((event: ClubGiftInfoEvent) =>
|
|
|
|
{
|
|
|
|
const parser = event.getParser();
|
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
setCatalogOptions(prevValue =>
|
|
|
|
{
|
|
|
|
const clubGifts = parser;
|
2022-01-05 22:12:29 +01:00
|
|
|
|
2022-02-01 07:58:19 +01:00
|
|
|
return { ...prevValue, clubGifts };
|
|
|
|
});
|
|
|
|
}, [ setCatalogOptions ]);
|
2022-01-05 22:12:29 +01:00
|
|
|
|
2021-09-01 00:18:53 +02:00
|
|
|
CreateMessageHook(CatalogPagesListEvent, onCatalogPagesListEvent);
|
|
|
|
CreateMessageHook(CatalogPageMessageEvent, onCatalogPageMessageEvent);
|
|
|
|
CreateMessageHook(PurchaseOKMessageEvent, onPurchaseOKMessageEvent);
|
|
|
|
CreateMessageHook(PurchaseErrorMessageEvent, onPurchaseErrorMessageEvent);
|
|
|
|
CreateMessageHook(PurchaseNotAllowedMessageEvent, onPurchaseNotAllowedMessageEvent);
|
|
|
|
CreateMessageHook(LimitedEditionSoldOutEvent, onLimitedEditionSoldOutEvent);
|
|
|
|
CreateMessageHook(ProductOfferEvent, onProductOfferEvent);
|
|
|
|
CreateMessageHook(GuildMembershipsMessageEvent, onGuildMembershipsMessageEvent);
|
|
|
|
CreateMessageHook(SellablePetPalettesMessageEvent, onSellablePetPalettesMessageEvent);
|
|
|
|
CreateMessageHook(ApproveNameMessageEvent, onApproveNameMessageEvent);
|
2021-09-14 21:34:13 +02:00
|
|
|
CreateMessageHook(GiftReceiverNotFoundEvent, onGiftReceiverNotFoundEvent);
|
2021-09-01 00:18:53 +02:00
|
|
|
CreateMessageHook(HabboClubOffersMessageEvent, onHabboClubOffersMessageEvent);
|
2021-06-12 04:53:56 +02:00
|
|
|
CreateMessageHook(UserSubscriptionEvent, onUserSubscriptionEvent);
|
2021-09-01 00:18:53 +02:00
|
|
|
CreateMessageHook(CatalogPublishedMessageEvent, onCatalogPublishedMessageEvent);
|
|
|
|
CreateMessageHook(GiftWrappingConfigurationEvent, onGiftWrappingConfigurationEvent);
|
2022-01-05 22:12:29 +01:00
|
|
|
CreateMessageHook(ClubGiftInfoEvent, onClubGiftInfoEvent);
|
2022-01-05 18:56:39 +01:00
|
|
|
CreateMessageHook(MarketplaceMakeOfferResult, onMarketplaceMakeOfferResult);
|
|
|
|
CreateMessageHook(MarketplaceConfigurationEvent, onMarketplaceConfigurationEvent);
|
2021-05-05 09:14:54 +02:00
|
|
|
|
|
|
|
return null;
|
2021-04-22 05:26:30 +02:00
|
|
|
}
|