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

104 lines
3.5 KiB
TypeScript
Raw Normal View History

2021-04-28 07:27:15 +02:00
import { FurnitureListAddOrUpdateEvent, FurnitureListEvent, FurnitureListInvalidateEvent, FurnitureListItemParser, FurnitureListRemovedEvent, FurniturePostItPlacedEvent } from 'nitro-renderer';
import { FC, useCallback } from 'react';
import { CreateMessageHook } from '../../hooks/messages/message-event';
2021-04-22 05:18:44 +02:00
import { InventoryMessageHandlerProps } from './InventoryMessageHandler.types';
2021-04-28 07:27:15 +02:00
import { FurnitureItem } from './utils/FurnitureItem';
import { addFurnitureItem, getGroupItemForFurnitureId, mergeFragments, processFragment, removeItemById } from './utils/FurnitureUtilities';
2021-04-22 05:18:44 +02:00
2021-04-28 07:27:15 +02:00
let furniMsgFragments: Map<number, FurnitureListItemParser>[] = null;
2021-04-22 05:18:44 +02:00
export const InventoryMessageHandler: FC<InventoryMessageHandlerProps> = props =>
{
2021-04-28 07:27:15 +02:00
const { setNeedsFurniUpdate = null, setGroupItems = null } = props;
const onFurnitureListAddOrUpdateEvent = useCallback((event: FurnitureListAddOrUpdateEvent) =>
{
const parser = event.getParser();
setGroupItems(prevValue =>
{
const newSet = [ ...prevValue ];
for(const item of parser.items)
{
const groupItem = getGroupItemForFurnitureId(newSet, item.itemId);
if(groupItem)
{
const furniture = groupItem.getItemById(item.itemId);
if(furniture)
{
furniture.update(item);
groupItem.hasUnseenItems = true;
}
}
else
{
const furniture = new FurnitureItem(item);
addFurnitureItem(newSet, furniture, false);
}
}
return newSet;
});
}, [ setGroupItems ]);
const onFurnitureListEvent = useCallback((event: FurnitureListEvent) =>
{
const parser = event.getParser();
if(!furniMsgFragments) furniMsgFragments = new Array(parser.totalFragments);
const merged = mergeFragments(parser.fragment, parser.totalFragments, parser.fragmentNumber, furniMsgFragments);
if(!merged) return;
setGroupItems(prevValue =>
{
return processFragment(prevValue, merged);
});
}, [ setGroupItems ]);
const onFurnitureListInvalidateEvent = useCallback((event: FurnitureListInvalidateEvent) =>
{
setNeedsFurniUpdate(true);
}, [ setNeedsFurniUpdate ]);
const onFurnitureListRemovedEvent = useCallback((event: FurnitureListRemovedEvent) =>
{
const parser = event.getParser();
setGroupItems(prevValue =>
{
const newSet = [ ...prevValue ];
const groupItem = removeItemById(parser.itemId, newSet);
if(groupItem)
{
// set all seen
return newSet;
}
return prevValue;
});
}, [ setGroupItems ]);
const onFurniturePostItPlacedEvent = useCallback((event: FurniturePostItPlacedEvent) =>
{
}, []);
CreateMessageHook(FurnitureListAddOrUpdateEvent, onFurnitureListAddOrUpdateEvent);
CreateMessageHook(FurnitureListEvent, onFurnitureListEvent);
CreateMessageHook(FurnitureListInvalidateEvent, onFurnitureListInvalidateEvent);
CreateMessageHook(FurnitureListRemovedEvent, onFurnitureListRemovedEvent);
CreateMessageHook(FurniturePostItPlacedEvent, onFurniturePostItPlacedEvent);
return null;
2021-04-22 05:18:44 +02:00
}