nitro-react/src/views/room/widgets/avatar-info/AvatarInfoWidgetView.tsx

87 lines
3.4 KiB
TypeScript
Raw Normal View History

2021-06-13 10:13:46 +02:00
import { RoomObjectCategory } from 'nitro-renderer';
import { FC, useCallback, useState } from 'react';
2021-06-15 20:06:46 +02:00
import { GetObjectName, RoomObjectNameData } from '../../../../api';
2021-06-12 04:53:56 +02:00
import { CreateEventDispatcherHook } from '../../../../hooks/events/event-dispatcher.base';
2021-06-13 10:13:46 +02:00
import { RoomWidgetRoomEngineUpdateEvent, RoomWidgetRoomObjectUpdateEvent } from '../events';
2021-06-12 04:53:56 +02:00
import { AvatarInfoWidgetViewProps } from './AvatarInfoWidgetView.types';
2021-06-13 10:13:46 +02:00
import { AvatarInfoWidgetNameView } from './views/name/AvatarInfoWidgetNameView';
2021-06-12 04:53:56 +02:00
export const AvatarInfoWidgetView: FC<AvatarInfoWidgetViewProps> = props =>
{
const { events = null } = props;
2021-06-13 10:13:46 +02:00
const [ names, setNames ] = useState<RoomObjectNameData[]>([]);
const [ isGameMode, setGameMode ] = useState(false);
2021-06-12 04:53:56 +02:00
2021-06-13 10:13:46 +02:00
const onRoomWidgetRoomObjectUpdateEvent = useCallback((event: RoomWidgetRoomObjectUpdateEvent) =>
2021-06-12 04:53:56 +02:00
{
2021-06-13 10:13:46 +02:00
switch(event.type)
2021-06-12 04:53:56 +02:00
{
2021-06-13 10:13:46 +02:00
case RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OVER: {
if(isGameMode) return;
2021-06-12 04:53:56 +02:00
2021-06-13 10:13:46 +02:00
if(event.category !== RoomObjectCategory.UNIT) return;
2021-06-12 04:53:56 +02:00
2021-06-15 20:06:46 +02:00
const nameData = GetObjectName(event.roomId, event.id, event.category);
2021-06-13 10:13:46 +02:00
if(nameData)
2021-06-12 04:53:56 +02:00
{
2021-06-13 10:13:46 +02:00
setNames(prevValue =>
{
const existing = prevValue.filter(value =>
{
if(value.objectId === nameData.id) return null;
return value;
});
return [ ...existing, new RoomObjectNameData(nameData.objectId, nameData.category, nameData.id, nameData.name, nameData.type) ]
});
2021-06-12 04:53:56 +02:00
}
2021-06-13 10:13:46 +02:00
return;
}
case RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OUT: {
if(isGameMode) return;
setNames(prevValue =>
2021-06-12 04:53:56 +02:00
{
2021-06-13 10:13:46 +02:00
return prevValue.filter(value =>
{
if(value.objectId === event.id) return null;
2021-06-12 04:53:56 +02:00
2021-06-13 10:13:46 +02:00
return value;
});
});
return;
}
2021-06-12 04:53:56 +02:00
}
2021-06-13 10:13:46 +02:00
}, [ isGameMode ]);
2021-06-12 04:53:56 +02:00
2021-06-13 10:13:46 +02:00
const onRoomWidgetRoomEngineUpdateEvent = useCallback((event: RoomWidgetRoomEngineUpdateEvent) =>
2021-06-12 04:53:56 +02:00
{
switch(event.type)
{
2021-06-13 10:13:46 +02:00
case RoomWidgetRoomEngineUpdateEvent.RWREUE_NORMAL_MODE:
setGameMode(false);
break;
case RoomWidgetRoomEngineUpdateEvent.RWREUE_GAME_MODE:
setGameMode(true);
break;
2021-06-12 04:53:56 +02:00
}
}, []);
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OVER, events, onRoomWidgetRoomObjectUpdateEvent);
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.OBJECT_ROLL_OUT, events, onRoomWidgetRoomObjectUpdateEvent);
2021-06-13 10:13:46 +02:00
CreateEventDispatcherHook(RoomWidgetRoomEngineUpdateEvent.RWREUE_NORMAL_MODE, events, onRoomWidgetRoomEngineUpdateEvent);
CreateEventDispatcherHook(RoomWidgetRoomEngineUpdateEvent.RWREUE_GAME_MODE, events, onRoomWidgetRoomEngineUpdateEvent);
return (
<>
{ names && (names.length > 0) && names.map((data, index) =>
{
return <AvatarInfoWidgetNameView key={ index } nameData={ data } />
}) }
</>
)
2021-06-12 04:53:56 +02:00
}