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

179 lines
6.5 KiB
TypeScript
Raw Normal View History

2021-04-29 10:05:49 +02:00
import { BadgesEvent, BotAddedToInventoryEvent, BotInventoryMessageEvent, BotRemovedFromInventoryEvent, FurnitureListAddOrUpdateEvent, FurnitureListEvent, FurnitureListInvalidateEvent, FurnitureListItemParser, FurnitureListRemovedEvent, FurniturePostItPlacedEvent, PetAddedToInventoryEvent, PetData, PetInventoryEvent, PetRemovedFromInventory } from 'nitro-renderer';
2021-04-28 07:27:15 +02:00
import { FC, useCallback } from 'react';
import { CreateMessageHook } from '../../hooks/messages/message-event';
2021-04-28 19:47:33 +02:00
import { useInventoryContext } from './context/InventoryContext';
2021-04-22 05:18:44 +02:00
import { InventoryMessageHandlerProps } from './InventoryMessageHandler.types';
2021-04-29 10:05:49 +02:00
import { InventoryBadgeActions } from './reducers/InventoryBadgeReducer';
import { InventoryBotActions } from './reducers/InventoryBotReducer';
2021-04-28 19:47:33 +02:00
import { InventoryFurnitureActions } from './reducers/InventoryFurnitureReducer';
2021-04-29 10:05:49 +02:00
import { InventoryPetActions } from './reducers/InventoryPetReducer';
import { mergeFurniFragments } from './utils/FurnitureUtilities';
import { mergePetFragments } from './utils/PetUtilities';
2021-04-22 05:18:44 +02:00
2021-04-28 07:27:15 +02:00
let furniMsgFragments: Map<number, FurnitureListItemParser>[] = null;
2021-04-29 10:05:49 +02:00
let petMsgFragments: Map<number, PetData>[] = null;
2021-04-28 07:27:15 +02:00
2021-04-22 05:18:44 +02:00
export const InventoryMessageHandler: FC<InventoryMessageHandlerProps> = props =>
{
2021-04-29 10:05:49 +02:00
const { dispatchFurnitureState = null, dispatchBotState = null, dispatchPetState = null, dispatchBadgeState = null } = useInventoryContext();
2021-04-28 07:27:15 +02:00
const onFurnitureListAddOrUpdateEvent = useCallback((event: FurnitureListAddOrUpdateEvent) =>
{
const parser = event.getParser();
2021-04-28 19:47:33 +02:00
dispatchFurnitureState({
type: InventoryFurnitureActions.ADD_OR_UPDATE_FURNITURE,
payload: {
parsers: parser.items
}
});
}, [ dispatchFurnitureState ]);
2021-04-28 07:27:15 +02:00
const onFurnitureListEvent = useCallback((event: FurnitureListEvent) =>
{
const parser = event.getParser();
if(!furniMsgFragments) furniMsgFragments = new Array(parser.totalFragments);
2021-04-29 10:05:49 +02:00
const fragment = mergeFurniFragments(parser.fragment, parser.totalFragments, parser.fragmentNumber, furniMsgFragments);
2021-04-28 07:27:15 +02:00
2021-04-28 19:47:33 +02:00
if(!fragment) return;
2021-04-28 07:27:15 +02:00
2021-04-28 19:47:33 +02:00
dispatchFurnitureState({
type: InventoryFurnitureActions.PROCESS_FRAGMENT,
payload: { fragment }
});
}, [ dispatchFurnitureState ]);
2021-04-28 07:27:15 +02:00
const onFurnitureListInvalidateEvent = useCallback((event: FurnitureListInvalidateEvent) =>
{
2021-04-28 19:47:33 +02:00
dispatchFurnitureState({
type: InventoryFurnitureActions.SET_NEEDS_UPDATE,
2021-04-29 10:05:49 +02:00
payload: {
2021-04-28 19:47:33 +02:00
flag: true
}
});
}, [ dispatchFurnitureState ]);
2021-04-28 07:27:15 +02:00
const onFurnitureListRemovedEvent = useCallback((event: FurnitureListRemovedEvent) =>
{
const parser = event.getParser();
2021-04-28 19:47:33 +02:00
dispatchFurnitureState({
type: InventoryFurnitureActions.REMOVE_FURNITURE,
2021-04-29 10:05:49 +02:00
payload: {
2021-04-28 19:47:33 +02:00
itemId: parser.itemId
}
});
}, [ dispatchFurnitureState ]);
2021-04-28 07:27:15 +02:00
const onFurniturePostItPlacedEvent = useCallback((event: FurniturePostItPlacedEvent) =>
{
}, []);
2021-04-29 10:05:49 +02:00
const onBotInventoryMessageEvent = useCallback((event: BotInventoryMessageEvent) =>
{
const parser = event.getParser();
const fragment = Array.from(parser.items.values());
dispatchBotState({
type: InventoryBotActions.PROCESS_FRAGMENT,
payload: { fragment }
});
}, [ dispatchBotState ]);
const onBotAddedToInventoryEvent = useCallback((event: BotAddedToInventoryEvent) =>
{
const parser = event.getParser();
dispatchBotState({
type: InventoryBotActions.ADD_BOT,
payload: {
botData: parser.item
}
});
}, [ dispatchBotState ]);
const onBotRemovedFromInventoryEvent = useCallback((event: BotRemovedFromInventoryEvent) =>
{
const parser = event.getParser();
dispatchBotState({
type: InventoryBotActions.REMOVE_BOT,
payload: {
botId: parser.itemId
}
});
}, [ dispatchBotState ]);
const onPetInventoryEvent = useCallback((event: PetInventoryEvent) =>
{
const parser = event.getParser();
if(!petMsgFragments) petMsgFragments = new Array(parser.totalFragments);
const fragment = mergePetFragments(parser.fragment, parser.totalFragments, parser.fragmentNumber, petMsgFragments);
if(!fragment) return;
dispatchPetState({
type: InventoryPetActions.PROCESS_FRAGMENT,
payload: { fragment }
});
}, [dispatchPetState ]);
const onPetAddedToInventoryEvent = useCallback((event: PetAddedToInventoryEvent) =>
{
const parser = event.getParser();
dispatchPetState({
type: InventoryPetActions.ADD_PET,
payload: {
petData: parser.pet
}
});
}, [ dispatchPetState ]);
const onPetRemovedFromInventory = useCallback((event: PetRemovedFromInventory) =>
{
const parser = event.getParser();
dispatchPetState({
type: InventoryPetActions.REMOVE_PET,
payload: {
petId: parser.petId
}
});
}, [ dispatchPetState ]);
const onBadgesEvent = useCallback((event: BadgesEvent) =>
{
const parser = event.getParser();
dispatchBadgeState({
type: InventoryBadgeActions.SET_BADGES,
payload: {
badgeCodes: parser.getAllBadgeCodes(),
activeBadgeCodes: parser.getActiveBadgeCodes()
}
});
}, [ dispatchBadgeState ]);
2021-04-28 07:27:15 +02:00
CreateMessageHook(FurnitureListAddOrUpdateEvent, onFurnitureListAddOrUpdateEvent);
CreateMessageHook(FurnitureListEvent, onFurnitureListEvent);
CreateMessageHook(FurnitureListInvalidateEvent, onFurnitureListInvalidateEvent);
CreateMessageHook(FurnitureListRemovedEvent, onFurnitureListRemovedEvent);
CreateMessageHook(FurniturePostItPlacedEvent, onFurniturePostItPlacedEvent);
2021-04-29 10:05:49 +02:00
CreateMessageHook(BotInventoryMessageEvent, onBotInventoryMessageEvent);
CreateMessageHook(BotRemovedFromInventoryEvent, onBotRemovedFromInventoryEvent);
CreateMessageHook(BotAddedToInventoryEvent, onBotAddedToInventoryEvent);
CreateMessageHook(PetInventoryEvent, onPetInventoryEvent);
CreateMessageHook(PetRemovedFromInventory, onPetRemovedFromInventory);
CreateMessageHook(PetAddedToInventoryEvent, onPetAddedToInventoryEvent);
CreateMessageHook(BadgesEvent, onBadgesEvent);
2021-04-28 07:27:15 +02:00
return null;
2021-04-22 05:18:44 +02:00
}