nitro-react/src/components/inventory/InventoryView.tsx

153 lines
5.9 KiB
TypeScript
Raw Normal View History

2022-03-30 18:42:04 +02:00
import { BadgePointLimitsEvent, ILinkEventTracker, IRoomSession, RoomEngineObjectEvent, RoomEngineObjectPlacedEvent, RoomPreviewer, RoomSessionEvent } from '@nitrots/nitro-renderer';
2022-07-28 08:10:06 +02:00
import { FC, useEffect, useState } from 'react';
2022-07-19 17:29:13 +02:00
import { AddEventLinkTracker, GetLocalization, GetRoomEngine, isObjectMoverRequested, LocalizeText, RemoveLinkEventTracker, setObjectMoverRequested, UnseenItemCategory } from '../../api';
2022-03-03 08:23:01 +01:00
import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common';
2022-07-19 02:48:54 +02:00
import { useInventoryTrade, useInventoryUnseenTracker, useMessageEvent, useRoomEngineEvent, useRoomSessionManagerEvent } from '../../hooks';
2022-04-02 07:33:29 +02:00
import { InventoryBadgeView } from './views/badge/InventoryBadgeView';
import { InventoryBotView } from './views/bot/InventoryBotView';
import { InventoryFurnitureView } from './views/furniture/InventoryFurnitureView';
import { InventoryTradeView } from './views/furniture/InventoryTradeView';
import { InventoryPetView } from './views/pet/InventoryPetView';
2021-07-05 08:46:47 +02:00
2021-12-09 06:37:19 +01:00
const TAB_FURNITURE: string = 'inventory.furni';
const TAB_BOTS: string = 'inventory.bots';
const TAB_PETS: string = 'inventory.furni.tab.pets';
const TAB_BADGES: string = 'inventory.badges';
const TABS = [ TAB_FURNITURE, TAB_BOTS, TAB_PETS, TAB_BADGES ];
2021-07-16 19:17:52 +02:00
const UNSEEN_CATEGORIES = [ UnseenItemCategory.FURNI, UnseenItemCategory.BOT, UnseenItemCategory.PET, UnseenItemCategory.BADGE ];
2021-04-22 07:29:42 +02:00
2021-12-09 06:37:19 +01:00
export const InventoryView: FC<{}> = props =>
2021-04-22 05:18:44 +02:00
{
2022-04-02 07:33:29 +02:00
const [ isVisible, setIsVisible ] = useState(false);
2021-07-16 19:17:52 +02:00
const [ currentTab, setCurrentTab ] = useState<string>(TABS[0]);
2021-04-28 07:27:15 +02:00
const [ roomSession, setRoomSession ] = useState<IRoomSession>(null);
const [ roomPreviewer, setRoomPreviewer ] = useState<RoomPreviewer>(null);
2022-03-30 18:46:48 +02:00
const { isTrading = false, stopTrading = null } = useInventoryTrade();
const { getCount = null, resetCategory = null } = useInventoryUnseenTracker();
2021-04-28 07:27:15 +02:00
2022-07-28 01:08:53 +02:00
const onClose = () =>
2021-07-07 11:05:27 +02:00
{
2022-03-30 18:42:04 +02:00
if(isTrading) stopTrading();
2021-07-05 08:46:47 +02:00
2022-03-30 18:42:04 +02:00
setIsVisible(false);
}
2021-04-22 05:18:44 +02:00
2022-07-28 08:10:06 +02:00
useRoomEngineEvent<RoomEngineObjectPlacedEvent>(RoomEngineObjectEvent.PLACED, event =>
2021-04-28 19:47:33 +02:00
{
if(!isObjectMoverRequested()) return;
setObjectMoverRequested(false);
2021-06-13 22:01:22 +02:00
if(!event.placedInRoom) setIsVisible(true);
2022-07-28 08:10:06 +02:00
});
2021-04-28 19:47:33 +02:00
2022-07-28 08:10:06 +02:00
useRoomSessionManagerEvent<RoomSessionEvent>([
RoomSessionEvent.CREATED,
RoomSessionEvent.ENDED
], event =>
2021-04-22 08:45:47 +02:00
{
switch(event.type)
{
case RoomSessionEvent.CREATED:
2021-04-28 07:27:15 +02:00
setRoomSession(event.session);
2021-04-22 08:45:47 +02:00
return;
case RoomSessionEvent.ENDED:
2021-04-28 07:27:15 +02:00
setRoomSession(null);
2021-04-22 08:45:47 +02:00
setIsVisible(false);
return;
}
2022-07-28 08:10:06 +02:00
});
2021-04-22 08:45:47 +02:00
2022-07-28 08:10:06 +02:00
useMessageEvent<BadgePointLimitsEvent>(BadgePointLimitsEvent, event =>
2021-07-16 19:17:52 +02:00
{
2022-03-30 16:19:09 +02:00
const parser = event.getParser();
2021-07-16 19:17:52 +02:00
2022-03-30 16:19:09 +02:00
for(const data of parser.data) GetLocalization().setBadgePointLimit(data.badgeId, data.limit);
2022-07-28 08:10:06 +02:00
});
2021-07-16 19:17:52 +02:00
2022-03-30 16:19:09 +02:00
useEffect(() =>
2021-07-16 19:17:52 +02:00
{
2022-03-30 16:19:09 +02:00
const linkTracker: ILinkEventTracker = {
linkReceived: (url: string) =>
{
const parts = url.split('/');
2021-07-16 19:17:52 +02:00
2022-03-30 16:19:09 +02:00
if(parts.length < 2) return;
switch(parts[1])
{
case 'show':
setIsVisible(true);
return;
case 'hide':
setIsVisible(false);
return;
case 'toggle':
setIsVisible(prevValue => !prevValue);
return;
}
},
eventUrlPrefix: 'inventory/'
};
2021-07-16 19:17:52 +02:00
2022-03-30 16:19:09 +02:00
AddEventLinkTracker(linkTracker);
2021-07-16 19:17:52 +02:00
2022-03-30 16:19:09 +02:00
return () => RemoveLinkEventTracker(linkTracker);
}, []);
2021-07-16 19:17:52 +02:00
2021-04-28 07:27:15 +02:00
useEffect(() =>
{
setRoomPreviewer(new RoomPreviewer(GetRoomEngine(), ++RoomPreviewer.PREVIEW_COUNTER));
return () =>
{
setRoomPreviewer(prevValue =>
2022-04-01 22:12:46 +02:00
{
prevValue.dispose();
2021-04-28 07:27:15 +02:00
2022-04-01 22:12:46 +02:00
return null;
});
2021-04-28 07:27:15 +02:00
}
}, []);
2021-07-05 08:46:47 +02:00
useEffect(() =>
{
2022-03-30 18:42:04 +02:00
if(!isVisible && isTrading) setIsVisible(true);
}, [ isVisible, isTrading ]);
2022-03-30 16:19:09 +02:00
if(!isVisible) return null;
2021-07-23 06:27:55 +02:00
2021-04-22 05:18:44 +02:00
return (
2022-04-04 02:52:34 +02:00
<NitroCardView uniqueKey={ 'inventory' } className="nitro-inventory" theme={ isTrading ? 'primary-slim' : '' } >
2022-07-28 01:08:53 +02:00
<NitroCardHeaderView headerText={ LocalizeText('inventory.title') } onCloseClick={ onClose } />
2022-03-30 16:19:09 +02:00
{ !isTrading &&
<>
<NitroCardTabsView>
{ TABS.map((name, index) =>
2022-04-01 22:12:46 +02:00
{
return (
2022-04-02 07:33:29 +02:00
<NitroCardTabsItemView key={ index } isActive={ (currentTab === name) } onClick={ event => setCurrentTab(name) } count={ getCount(UNSEEN_CATEGORIES[index]) }>
2022-04-01 22:12:46 +02:00
{ LocalizeText(name) }
</NitroCardTabsItemView>
);
}) }
2022-03-30 16:19:09 +02:00
</NitroCardTabsView>
<NitroCardContentView>
{ (currentTab === TAB_FURNITURE ) &&
<InventoryFurnitureView roomSession={ roomSession } roomPreviewer={ roomPreviewer } /> }
{ (currentTab === TAB_BOTS ) &&
<InventoryBotView roomSession={ roomSession } roomPreviewer={ roomPreviewer } /> }
{ (currentTab === TAB_PETS ) &&
<InventoryPetView roomSession={ roomSession } roomPreviewer={ roomPreviewer } /> }
{ (currentTab === TAB_BADGES ) &&
<InventoryBadgeView /> }
</NitroCardContentView>
</> }
{ isTrading &&
<NitroCardContentView>
2022-07-28 01:08:53 +02:00
<InventoryTradeView cancelTrade={ onClose } />
2022-03-30 16:19:09 +02:00
</NitroCardContentView> }
</NitroCardView>
2021-04-22 05:18:44 +02:00
);
}