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

234 lines
9.9 KiB
TypeScript
Raw Normal View History

import { IRoomSession, RoomEngineObjectEvent, RoomEngineObjectPlacedEvent, RoomPreviewer, RoomSessionEvent, TradingCancelComposer, TradingCloseComposer, TradingOpenComposer } from '@nitrots/nitro-renderer';
2021-04-28 19:47:33 +02:00
import { FC, useCallback, useEffect, useReducer, useState } from 'react';
2021-08-17 05:38:07 +02:00
import { GetRoomEngine, LocalizeText } from '../../api';
2021-07-23 06:27:55 +02:00
import { InventoryBadgesUpdatedEvent, InventoryEvent, InventoryTradeRequestEvent } from '../../events';
2021-04-28 19:47:33 +02:00
import { useRoomEngineEvent } from '../../hooks/events/nitro/room/room-engine-event';
2021-04-22 08:45:47 +02:00
import { useRoomSessionManagerEvent } from '../../hooks/events/nitro/session/room-session-manager-event';
2021-07-23 06:27:55 +02:00
import { dispatchUiEvent, useUiEvent } from '../../hooks/events/ui/ui-event';
2021-07-07 11:05:27 +02:00
import { SendMessageHook } from '../../hooks/messages';
2021-05-02 06:16:03 +02:00
import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../layout';
2021-06-23 06:03:56 +02:00
import { isObjectMoverRequested, setObjectMoverRequested } from './common/InventoryUtilities';
2021-07-07 11:05:27 +02:00
import { TradeState } from './common/TradeState';
2021-07-16 19:17:52 +02:00
import { IUnseenItemTracker } from './common/unseen/IUnseenItemTracker';
import { UnseenItemCategory } from './common/unseen/UnseenItemCategory';
import { UnseenItemTracker } from './common/unseen/UnseenItemTracker';
2021-04-28 19:47:33 +02:00
import { InventoryContextProvider } from './context/InventoryContext';
2021-04-22 05:18:44 +02:00
import { InventoryMessageHandler } from './InventoryMessageHandler';
2021-04-24 03:03:34 +02:00
import { InventoryTabs, InventoryViewProps } from './InventoryView.types';
2021-04-30 06:29:37 +02:00
import { initialInventoryBadge, InventoryBadgeReducer } from './reducers/InventoryBadgeReducer';
import { initialInventoryBot, InventoryBotReducer } from './reducers/InventoryBotReducer';
import { initialInventoryFurniture, InventoryFurnitureReducer } from './reducers/InventoryFurnitureReducer';
import { initialInventoryPet, InventoryPetReducer } from './reducers/InventoryPetReducer';
2021-04-29 10:03:40 +02:00
import { InventoryBadgeView } from './views/badge/InventoryBadgeView';
import { InventoryBotView } from './views/bot/InventoryBotView';
2021-04-28 07:27:15 +02:00
import { InventoryFurnitureView } from './views/furniture/InventoryFurnitureView';
2021-04-29 10:03:40 +02:00
import { InventoryPetView } from './views/pet/InventoryPetView';
2021-07-05 08:46:47 +02:00
import { InventoryTradeView } from './views/trade/InventoryTradeView';
2021-07-16 19:17:52 +02:00
const TABS = [ InventoryTabs.FURNITURE, InventoryTabs.BOTS, InventoryTabs.PETS, InventoryTabs.BADGES ];
const UNSEEN_CATEGORIES = [ UnseenItemCategory.FURNI, UnseenItemCategory.BOT, UnseenItemCategory.PET, UnseenItemCategory.BADGE ];
2021-04-22 07:29:42 +02:00
2021-04-22 05:18:44 +02:00
export const InventoryView: FC<InventoryViewProps> = props =>
{
2021-04-24 03:03:34 +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);
2021-04-30 06:29:37 +02:00
const [ furnitureState, dispatchFurnitureState ] = useReducer(InventoryFurnitureReducer, initialInventoryFurniture);
const [ botState, dispatchBotState ] = useReducer(InventoryBotReducer, initialInventoryBot);
const [ petState, dispatchPetState ] = useReducer(InventoryPetReducer, initialInventoryPet);
const [ badgeState, dispatchBadgeState ] = useReducer(InventoryBadgeReducer, initialInventoryBadge);
2021-07-16 19:17:52 +02:00
const [ unseenTracker ] = useState<IUnseenItemTracker>(new UnseenItemTracker());
2021-04-28 07:27:15 +02:00
2021-07-07 11:05:27 +02:00
const close = useCallback(() =>
{
if(furnitureState.tradeData)
{
switch(furnitureState.tradeData.state)
{
case TradeState.TRADING_STATE_RUNNING:
SendMessageHook(new TradingCloseComposer());
return;
2021-07-08 10:26:04 +02:00
default:
2021-07-07 11:05:27 +02:00
SendMessageHook(new TradingCancelComposer());
return;
}
}
setIsVisible(false);
}, [ furnitureState.tradeData ]);
2021-04-22 05:18:44 +02:00
const onInventoryEvent = useCallback((event: InventoryEvent) =>
{
switch(event.type)
{
case InventoryEvent.SHOW_INVENTORY:
2021-07-07 11:05:27 +02:00
if(isVisible) return;
2021-04-22 05:18:44 +02:00
setIsVisible(true);
return;
2021-04-28 07:27:15 +02:00
case InventoryEvent.HIDE_INVENTORY:
2021-07-07 11:05:27 +02:00
if(!isVisible) return;
close();
2021-04-28 07:27:15 +02:00
return;
2021-04-22 05:18:44 +02:00
case InventoryEvent.TOGGLE_INVENTORY:
2021-07-07 11:05:27 +02:00
if(!isVisible)
{
setIsVisible(true);
}
else
{
close();
}
2021-04-22 05:18:44 +02:00
return;
2021-07-05 08:46:47 +02:00
case InventoryTradeRequestEvent.REQUEST_TRADE: {
const tradeEvent = (event as InventoryTradeRequestEvent);
2021-07-08 10:26:04 +02:00
SendMessageHook(new TradingOpenComposer(tradeEvent.objectId));
2021-07-05 08:46:47 +02:00
}
2021-04-22 05:18:44 +02:00
}
2021-07-07 11:05:27 +02:00
}, [ isVisible, close ]);
2021-04-22 05:18:44 +02:00
useUiEvent(InventoryEvent.SHOW_INVENTORY, onInventoryEvent);
2021-04-28 07:27:15 +02:00
useUiEvent(InventoryEvent.HIDE_INVENTORY, onInventoryEvent);
2021-04-22 05:18:44 +02:00
useUiEvent(InventoryEvent.TOGGLE_INVENTORY, onInventoryEvent);
2021-07-05 08:46:47 +02:00
useUiEvent(InventoryTradeRequestEvent.REQUEST_TRADE, onInventoryEvent);
2021-04-22 05:18:44 +02:00
2021-04-28 19:47:33 +02:00
const onRoomEngineObjectPlacedEvent = useCallback((event: RoomEngineObjectPlacedEvent) =>
{
if(!isObjectMoverRequested()) return;
setObjectMoverRequested(false);
2021-06-13 22:01:22 +02:00
if(!event.placedInRoom) setIsVisible(true);
2021-04-28 19:47:33 +02:00
}, []);
useRoomEngineEvent(RoomEngineObjectEvent.PLACED, onRoomEngineObjectPlacedEvent);
2021-04-22 08:45:47 +02:00
const onRoomSessionEvent = useCallback((event: RoomSessionEvent) =>
{
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;
}
}, []);
useRoomSessionManagerEvent(RoomSessionEvent.CREATED, onRoomSessionEvent);
useRoomSessionManagerEvent(RoomSessionEvent.ENDED, onRoomSessionEvent);
2021-07-16 19:17:52 +02:00
const resetTrackerForTab = useCallback((name: string) =>
{
const tabIndex = TABS.indexOf(name);
if(tabIndex === -1) return;
const unseenCategory = UNSEEN_CATEGORIES[tabIndex];
if(unseenCategory === -1) return;
const count = unseenTracker.getCount(unseenCategory);
if(!count) return;
unseenTracker.resetCategory(unseenCategory);
switch(unseenCategory)
{
case UnseenItemCategory.FURNI:
for(const groupItem of furnitureState.groupItems) groupItem.hasUnseenItems = false;
return;
}
}, [ furnitureState.groupItems, unseenTracker ]);
const switchTab = useCallback((prevTab: string, nextTab: string) =>
{
if(nextTab) setCurrentTab(nextTab);
resetTrackerForTab(prevTab);
}, [ resetTrackerForTab ]);
useEffect(() =>
{
if(isVisible) return;
if(currentTab) resetTrackerForTab(currentTab);
}, [ currentTab, isVisible, resetTrackerForTab ]);
2021-04-28 07:27:15 +02:00
useEffect(() =>
{
setRoomPreviewer(new RoomPreviewer(GetRoomEngine(), ++RoomPreviewer.PREVIEW_COUNTER));
return () =>
{
setRoomPreviewer(prevValue =>
{
prevValue.dispose();
return null;
});
}
}, []);
2021-07-05 08:46:47 +02:00
useEffect(() =>
{
if(!isVisible)
{
2021-07-07 11:05:27 +02:00
if(furnitureState.tradeData) setIsVisible(true);
2021-07-05 08:46:47 +02:00
}
2021-07-07 04:25:36 +02:00
}, [ furnitureState.tradeData, isVisible ]);
2021-07-05 08:46:47 +02:00
2021-07-23 06:27:55 +02:00
useEffect(() =>
{
if(!badgeState.badges) return;
dispatchUiEvent(new InventoryBadgesUpdatedEvent(InventoryBadgesUpdatedEvent.BADGES_UPDATED, badgeState.badges));
}, [ badgeState.badges ]);
2021-04-22 05:18:44 +02:00
return (
2021-07-16 19:17:52 +02:00
<InventoryContextProvider value={ { furnitureState, dispatchFurnitureState, botState, dispatchBotState, petState, dispatchPetState, badgeState, dispatchBadgeState, unseenTracker } }>
2021-04-28 19:47:33 +02:00
<InventoryMessageHandler />
2021-05-02 06:16:03 +02:00
{ isVisible &&
2021-08-09 18:15:08 +02:00
<NitroCardView uniqueKey={ 'inventory' } className="nitro-inventory">
2021-07-07 11:05:27 +02:00
<NitroCardHeaderView headerText={ LocalizeText('inventory.title') } onCloseClick={ close } />
2021-07-07 04:25:36 +02:00
{ !furnitureState.tradeData &&
<>
<NitroCardTabsView>
2021-07-16 19:17:52 +02:00
{ TABS.map((name, index) =>
2021-07-07 04:25:36 +02:00
{
2021-07-16 19:17:52 +02:00
const unseenCount = unseenTracker.getCount(UNSEEN_CATEGORIES[index]);
2021-07-07 04:25:36 +02:00
return (
2021-07-16 19:17:52 +02:00
<NitroCardTabsItemView key={ index } isActive={ (currentTab === name) } onClick={ event => switchTab(currentTab, name) } count={ unseenCount }>
2021-07-07 04:25:36 +02:00
{ LocalizeText(name) }
</NitroCardTabsItemView>
);
}) }
</NitroCardTabsView>
<NitroCardContentView>
{ (currentTab === InventoryTabs.FURNITURE ) &&
<InventoryFurnitureView roomSession={ roomSession } roomPreviewer={ roomPreviewer } /> }
{ (currentTab === InventoryTabs.BOTS ) &&
<InventoryBotView roomSession={ roomSession } roomPreviewer={ roomPreviewer } /> }
{ (currentTab === InventoryTabs.PETS ) &&
<InventoryPetView roomSession={ roomSession } roomPreviewer={ roomPreviewer } /> }
{ (currentTab === InventoryTabs.BADGES ) &&
<InventoryBadgeView /> }
</NitroCardContentView>
</> }
{ furnitureState.tradeData &&
<NitroCardContentView>
2021-07-07 11:05:27 +02:00
<InventoryTradeView cancelTrade={ close } />
2021-07-07 04:25:36 +02:00
</NitroCardContentView> }
2021-05-02 06:16:03 +02:00
</NitroCardView> }
2021-04-28 19:47:33 +02:00
</InventoryContextProvider>
2021-04-22 05:18:44 +02:00
);
}