feat(catalog): live-merge imported furni on catalog open

On catalog open, re-fetch the custom furnidata chunk (custom/imported.json5) via
SessionDataManager.mergeFurnitureDataFromUrl() and feed the new entries to
RoomContentLoader.processFurnitureData(), so furniture imported from the admin
panel appears without a full client reload.
This commit is contained in:
medievalshell
2026-06-03 23:28:33 +02:00
parent 7625520c4d
commit f8e943d262
+28 -3
View File
@@ -1,4 +1,4 @@
import { BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, CreateLinkEvent, FrontPageItem, FurniturePlaceComposer, FurniturePlacePaintComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetRoomEngine, GetSessionDataManager, GetTickerTime, LegacyDataType, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseFromCatalogComposer, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, RoomEngineObjectPlacedEvent, RoomObjectPlacementSource, RoomObjectVariable, RoomPreviewer, Vector3d } from '@nitrots/nitro-renderer';
import { BuildersClubFurniCountMessageEvent, BuildersClubPlaceRoomItemMessageComposer, BuildersClubPlaceWallItemMessageComposer, BuildersClubQueryFurniCountMessageComposer, BuildersClubSubscriptionStatusMessageEvent, CatalogPageMessageEvent, CatalogPagesListEvent, CatalogPublishedMessageEvent, CreateLinkEvent, FrontPageItem, FurniturePlaceComposer, FurniturePlacePaintComposer, GetCatalogIndexComposer, GetCatalogPageComposer, GetConfiguration, GetRoomContentLoader, GetRoomEngine, GetSessionDataManager, GetTickerTime, LegacyDataType, LimitedEditionSoldOutEvent, MarketplaceMakeOfferResult, ProductOfferEvent, PurchaseErrorMessageEvent, PurchaseFromCatalogComposer, PurchaseNotAllowedMessageEvent, PurchaseOKMessageEvent, RoomEngineObjectPlacedEvent, RoomObjectPlacementSource, RoomObjectVariable, RoomPreviewer, Vector3d } from '@nitrots/nitro-renderer';
import { useCallback, useEffect, useRef, useState } from 'react';
import { useBetween } from 'use-between';
import { BuilderFurniPlaceableStatus, CatalogPage, CatalogType, DispatchUiEvent, FurniCategory, GetFurnitureData, GetProductDataForLocalization, GetRoomSession, ICatalogNode, ICatalogPage, IPageLocalization, IProduct, IPurchasableOffer, IPurchaseOptions, LocalizeText, NotificationAlertType, Offer, PageLocalization, PlacedObjectPurchaseData, PlaySound, Product, ProductTypeEnum, RequestedPage, SearchResult, SendMessageComposer, SoundNames } from '../../api';
@@ -89,6 +89,27 @@ const useCatalogStore = () =>
setCurrentType(normalizeCatalogType(type));
}, []);
// Real-time furni importati: ri-mergia il chunk custom/imported.json5 nelle Map
// furnidata + RoomContentLoader all'apertura del catalogo, SENZA reload del client.
const refreshImportedFurnidata = useCallback(() =>
{
try
{
const base = GetConfiguration().getValue<string>('furnidata.url');
if(!base || !base.length) return;
const importedUrl = base.replace(/\/+$/, '') + '/custom/imported.json5';
GetSessionDataManager().mergeFurnitureDataFromUrl(importedUrl).then(added =>
{
if(added && added.length) GetRoomContentLoader().processFurnitureData(added);
}).catch(() => {});
}
catch
{}
}, []);
const openCatalogByType = useCallback((type?: string) =>
{
const catalogType = normalizeCatalogType(type);
@@ -98,8 +119,10 @@ const useCatalogStore = () =>
resetVisibleCatalogState(catalogType);
}
refreshImportedFurnidata();
setIsVisible(true);
}, [ currentType, resetVisibleCatalogState ]);
}, [ currentType, resetVisibleCatalogState, refreshImportedFurnidata ]);
const toggleCatalogByType = useCallback((type?: string) =>
{
@@ -117,8 +140,10 @@ const useCatalogStore = () =>
resetVisibleCatalogState(catalogType);
}
refreshImportedFurnidata();
setIsVisible(true);
}, [ isVisible, currentType, resetVisibleCatalogState ]);
}, [ isVisible, currentType, resetVisibleCatalogState, refreshImportedFurnidata ]);
const getBuilderFurniPlaceableStatus = useCallback((offer: IPurchasableOffer) =>
{