2021-10-19 23:32:22 +02:00
|
|
|
import { RoomEngineEvent, RoomEngineObjectEvent, RoomObjectCategory } from '@nitrots/nitro-renderer';
|
|
|
|
import { FC, useCallback, useReducer, useState } from 'react';
|
|
|
|
import { GetRoomSession } from '../../api';
|
2021-06-21 12:21:25 +02:00
|
|
|
import { ModToolsEvent } from '../../events/mod-tools/ModToolsEvent';
|
2021-10-19 23:32:22 +02:00
|
|
|
import { ModToolsOpenRoomChatlogEvent } from '../../events/mod-tools/ModToolsOpenRoomChatlogEvent';
|
2021-06-22 13:10:01 +02:00
|
|
|
import { ModToolsOpenRoomInfoEvent } from '../../events/mod-tools/ModToolsOpenRoomInfoEvent';
|
2021-10-19 23:32:22 +02:00
|
|
|
import { ModToolsOpenUserChatlogEvent } from '../../events/mod-tools/ModToolsOpenUserChatlogEvent';
|
|
|
|
import { ModToolsOpenUserInfoEvent } from '../../events/mod-tools/ModToolsOpenUserInfoEvent';
|
2021-06-22 13:10:01 +02:00
|
|
|
import { useRoomEngineEvent } from '../../hooks/events';
|
|
|
|
import { dispatchUiEvent, useUiEvent } from '../../hooks/events/ui/ui-event';
|
2021-07-21 23:52:45 +02:00
|
|
|
import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../layout';
|
2021-06-21 12:21:25 +02:00
|
|
|
import { ModToolsContextProvider } from './context/ModToolsContext';
|
|
|
|
import { ModToolsViewProps } from './ModToolsView.types';
|
2021-06-22 13:10:01 +02:00
|
|
|
import { initialModTools, ModToolsActions, ModToolsReducer } from './reducers/ModToolsReducer';
|
2021-10-19 23:32:22 +02:00
|
|
|
import { ISelectedUser } from './utils/ISelectedUser';
|
2021-10-20 02:04:58 +02:00
|
|
|
import { ModToolsChatlogView } from './views/room/room-chatlog/ModToolsChatlogView';
|
|
|
|
import { ModToolsRoomView } from './views/room/room-tools/ModToolsRoomView';
|
2021-06-22 13:10:01 +02:00
|
|
|
import { ModToolsTicketsView } from './views/tickets/ModToolsTicketsView';
|
2021-10-20 02:04:58 +02:00
|
|
|
import { ModToolsUserChatlogView } from './views/user/user-chatlog/ModToolsUserChatlogView';
|
|
|
|
import { ModToolsUserView } from './views/user/user-info/ModToolsUserView';
|
2021-06-21 12:21:25 +02:00
|
|
|
|
|
|
|
export const ModToolsView: FC<ModToolsViewProps> = props =>
|
|
|
|
{
|
|
|
|
const [ isVisible, setIsVisible ] = useState(false);
|
|
|
|
const [ modToolsState, dispatchModToolsState ] = useReducer(ModToolsReducer, initialModTools);
|
2021-10-19 23:32:22 +02:00
|
|
|
const { currentRoomId = null, openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null } = modToolsState;
|
|
|
|
const [ selectedUser, setSelectedUser] = useState<ISelectedUser>(null);
|
2021-06-22 13:10:01 +02:00
|
|
|
const [ isTicketsVisible, setIsTicketsVisible ] = useState(false);
|
|
|
|
|
2021-06-21 12:21:25 +02:00
|
|
|
const onModToolsEvent = useCallback((event: ModToolsEvent) =>
|
|
|
|
{
|
|
|
|
switch(event.type)
|
|
|
|
{
|
|
|
|
case ModToolsEvent.SHOW_MOD_TOOLS:
|
|
|
|
setIsVisible(true);
|
|
|
|
return;
|
|
|
|
case ModToolsEvent.HIDE_MOD_TOOLS:
|
|
|
|
setIsVisible(false);
|
|
|
|
return;
|
|
|
|
case ModToolsEvent.TOGGLE_MOD_TOOLS:
|
|
|
|
setIsVisible(value => !value);
|
|
|
|
return;
|
2021-10-19 23:32:22 +02:00
|
|
|
case ModToolsEvent.OPEN_ROOM_INFO: {
|
|
|
|
const castedEvent = (event as ModToolsOpenRoomInfoEvent);
|
|
|
|
|
|
|
|
if(openRooms && openRooms.includes(castedEvent.roomId)) return;
|
|
|
|
|
|
|
|
const rooms = openRooms || [];
|
2021-06-22 13:10:01 +02:00
|
|
|
|
|
|
|
dispatchModToolsState({
|
2021-10-19 23:32:22 +02:00
|
|
|
type: ModToolsActions.SET_OPEN_ROOMS,
|
2021-06-22 13:10:01 +02:00
|
|
|
payload: {
|
2021-10-19 23:32:22 +02:00
|
|
|
openRooms: [...rooms, castedEvent.roomId]
|
2021-06-22 13:10:01 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2021-10-19 23:32:22 +02:00
|
|
|
case ModToolsEvent.OPEN_ROOM_CHATLOG: {
|
|
|
|
const castedEvent = (event as ModToolsOpenRoomChatlogEvent);
|
|
|
|
|
|
|
|
if(openRoomChatlogs && openRoomChatlogs.includes(castedEvent.roomId)) return;
|
|
|
|
|
|
|
|
const chatlogs = openRoomChatlogs || [];
|
|
|
|
|
2021-06-22 13:10:01 +02:00
|
|
|
dispatchModToolsState({
|
2021-10-19 23:32:22 +02:00
|
|
|
type: ModToolsActions.SET_OPEN_ROOM_CHATLOGS,
|
|
|
|
payload: {
|
|
|
|
openRoomChatlogs: [...chatlogs, castedEvent.roomId]
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
case ModToolsEvent.OPEN_USER_INFO: {
|
|
|
|
const castedEvent = (event as ModToolsOpenUserInfoEvent);
|
|
|
|
|
|
|
|
if(openUserInfo && openUserInfo.includes(castedEvent.userId)) return;
|
|
|
|
|
|
|
|
const userInfo = openUserInfo || [];
|
|
|
|
|
|
|
|
dispatchModToolsState({
|
|
|
|
type: ModToolsActions.SET_OPEN_USERINFO,
|
|
|
|
payload: {
|
|
|
|
openUserInfo: [...userInfo, castedEvent.userId]
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
case ModToolsEvent.OPEN_USER_CHATLOG: {
|
|
|
|
const castedEvent = (event as ModToolsOpenUserChatlogEvent);
|
|
|
|
|
|
|
|
if(openUserChatlogs && openUserChatlogs.includes(castedEvent.userId)) return;
|
|
|
|
|
|
|
|
const userChatlog = openUserChatlogs || [];
|
|
|
|
|
|
|
|
dispatchModToolsState({
|
|
|
|
type: ModToolsActions.SET_OPEN_USER_CHATLOGS,
|
2021-06-22 13:10:01 +02:00
|
|
|
payload: {
|
2021-10-19 23:32:22 +02:00
|
|
|
openUserChatlogs: [...userChatlog, castedEvent.userId]
|
2021-06-22 13:10:01 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2021-06-21 12:21:25 +02:00
|
|
|
}
|
2021-10-19 23:32:22 +02:00
|
|
|
}, [openRooms, openRoomChatlogs, openUserInfo, openUserChatlogs]);
|
2021-06-21 12:21:25 +02:00
|
|
|
|
|
|
|
useUiEvent(ModToolsEvent.SHOW_MOD_TOOLS, onModToolsEvent);
|
|
|
|
useUiEvent(ModToolsEvent.HIDE_MOD_TOOLS, onModToolsEvent);
|
|
|
|
useUiEvent(ModToolsEvent.TOGGLE_MOD_TOOLS, onModToolsEvent);
|
2021-06-22 13:10:01 +02:00
|
|
|
useUiEvent(ModToolsEvent.OPEN_ROOM_INFO, onModToolsEvent);
|
2021-10-19 23:32:22 +02:00
|
|
|
useUiEvent(ModToolsEvent.OPEN_ROOM_CHATLOG, onModToolsEvent);
|
|
|
|
useUiEvent(ModToolsEvent.OPEN_USER_INFO, onModToolsEvent);
|
|
|
|
useUiEvent(ModToolsEvent.OPEN_USER_CHATLOG, onModToolsEvent);
|
2021-06-22 13:10:01 +02:00
|
|
|
|
|
|
|
const onRoomEngineEvent = useCallback((event: RoomEngineEvent) =>
|
|
|
|
{
|
|
|
|
switch(event.type)
|
|
|
|
{
|
|
|
|
case RoomEngineEvent.INITIALIZED:
|
|
|
|
dispatchModToolsState({
|
|
|
|
type: ModToolsActions.SET_CURRENT_ROOM_ID,
|
|
|
|
payload: {
|
|
|
|
currentRoomId: event.roomId
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
case RoomEngineEvent.DISPOSED:
|
|
|
|
dispatchModToolsState({
|
|
|
|
type: ModToolsActions.SET_CURRENT_ROOM_ID,
|
|
|
|
payload: {
|
|
|
|
currentRoomId: null
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}, [ dispatchModToolsState ]);
|
|
|
|
|
|
|
|
useRoomEngineEvent(RoomEngineEvent.INITIALIZED, onRoomEngineEvent);
|
|
|
|
useRoomEngineEvent(RoomEngineEvent.DISPOSED, onRoomEngineEvent);
|
|
|
|
|
2021-10-19 23:32:22 +02:00
|
|
|
const onRoomEngineObjectEvent = useCallback((event: RoomEngineObjectEvent) =>
|
|
|
|
{
|
|
|
|
if(event.category !== RoomObjectCategory.UNIT) return;
|
|
|
|
|
|
|
|
const roomSession = GetRoomSession();
|
|
|
|
|
|
|
|
if(!roomSession) return;
|
|
|
|
|
|
|
|
const userData = roomSession.userDataManager.getUserDataByIndex(event.objectId);
|
|
|
|
|
|
|
|
if(!userData) return;
|
|
|
|
|
|
|
|
setSelectedUser({ userId: userData.webID, username: userData.name });
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
useRoomEngineEvent(RoomEngineObjectEvent.SELECTED, onRoomEngineObjectEvent);
|
|
|
|
|
2021-06-22 13:10:01 +02:00
|
|
|
const handleClick = useCallback((action: string, value?: string) =>
|
|
|
|
{
|
|
|
|
if(!action) return;
|
|
|
|
|
|
|
|
switch(action)
|
|
|
|
{
|
|
|
|
case 'toggle_room': {
|
|
|
|
if(!openRooms)
|
|
|
|
{
|
|
|
|
dispatchUiEvent(new ModToolsOpenRoomInfoEvent(currentRoomId));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const itemIndex = openRooms.indexOf(currentRoomId);
|
|
|
|
|
|
|
|
if(itemIndex > -1)
|
|
|
|
{
|
|
|
|
handleClick('close_room', currentRoomId.toString());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dispatchUiEvent(new ModToolsOpenRoomInfoEvent(currentRoomId));
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
case 'close_room': {
|
|
|
|
const itemIndex = openRooms.indexOf(Number(value));
|
|
|
|
|
|
|
|
const clone = Array.from(openRooms);
|
|
|
|
clone.splice(itemIndex, 1);
|
|
|
|
|
|
|
|
dispatchModToolsState({
|
|
|
|
type: ModToolsActions.SET_OPEN_ROOMS,
|
|
|
|
payload: {
|
|
|
|
openRooms: clone
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2021-10-19 23:32:22 +02:00
|
|
|
case 'toggle_room_chatlog': {
|
|
|
|
if(!openRoomChatlogs)
|
|
|
|
{
|
|
|
|
dispatchUiEvent(new ModToolsOpenRoomChatlogEvent(currentRoomId));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const itemIndex = openRoomChatlogs.indexOf(currentRoomId);
|
2021-06-22 13:10:01 +02:00
|
|
|
|
2021-10-19 23:32:22 +02:00
|
|
|
if(itemIndex > -1)
|
|
|
|
{
|
|
|
|
handleClick('close_room_chatlog', currentRoomId.toString());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dispatchUiEvent(new ModToolsOpenRoomChatlogEvent(currentRoomId));
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
case 'close_room_chatlog': {
|
|
|
|
const itemIndex = openRoomChatlogs.indexOf(Number(value));
|
|
|
|
|
|
|
|
const clone = Array.from(openRoomChatlogs);
|
2021-06-22 13:10:01 +02:00
|
|
|
clone.splice(itemIndex, 1);
|
|
|
|
|
|
|
|
dispatchModToolsState({
|
2021-10-19 23:32:22 +02:00
|
|
|
type: ModToolsActions.SET_OPEN_ROOM_CHATLOGS,
|
2021-06-22 13:10:01 +02:00
|
|
|
payload: {
|
2021-10-19 23:32:22 +02:00
|
|
|
openRoomChatlogs: clone
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
case 'toggle_user_info': {
|
|
|
|
|
|
|
|
if(!selectedUser) return;
|
|
|
|
|
|
|
|
const userId = selectedUser.userId;
|
|
|
|
|
|
|
|
if(!openUserInfo)
|
|
|
|
{
|
|
|
|
dispatchUiEvent(new ModToolsOpenUserInfoEvent(userId));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const itemIndex = openUserInfo.indexOf(userId);
|
|
|
|
|
|
|
|
if(itemIndex > -1)
|
|
|
|
{
|
|
|
|
handleClick('close_user_info', userId.toString());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
dispatchUiEvent(new ModToolsOpenUserInfoEvent(userId));
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
case 'close_user_info': {
|
|
|
|
const itemIndex = openUserInfo.indexOf(Number(value));
|
|
|
|
|
|
|
|
const clone = Array.from(openUserInfo);
|
|
|
|
clone.splice(itemIndex, 1);
|
|
|
|
|
|
|
|
dispatchModToolsState({
|
|
|
|
type: ModToolsActions.SET_OPEN_USERINFO,
|
|
|
|
payload: {
|
|
|
|
openUserInfo: clone
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
case 'close_user_chatlog': {
|
|
|
|
const itemIndex = openUserChatlogs.indexOf(Number(value));
|
|
|
|
|
|
|
|
const clone = Array.from(openUserChatlogs);
|
|
|
|
clone.splice(itemIndex, 1);
|
|
|
|
|
|
|
|
dispatchModToolsState({
|
|
|
|
type: ModToolsActions.SET_OPEN_USER_CHATLOGS,
|
|
|
|
payload: {
|
|
|
|
openUserChatlogs: clone
|
2021-06-22 13:10:01 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2021-10-19 23:32:22 +02:00
|
|
|
}, [openRooms, currentRoomId, openRoomChatlogs, selectedUser, openUserInfo, openUserChatlogs]);
|
2021-06-21 12:21:25 +02:00
|
|
|
|
2021-10-19 23:32:22 +02:00
|
|
|
if(!isVisible) return null;
|
2021-06-21 12:21:25 +02:00
|
|
|
|
|
|
|
return (
|
|
|
|
<ModToolsContextProvider value={ { modToolsState, dispatchModToolsState } }>
|
|
|
|
{ isVisible &&
|
2021-09-06 10:00:29 +02:00
|
|
|
<NitroCardView uniqueKey="mod-tools" className="nitro-mod-tools" simple={ false }>
|
2021-08-16 08:00:31 +02:00
|
|
|
<NitroCardHeaderView headerText={ 'Mod Tools' } onCloseClick={ event => setIsVisible(false) } />
|
2021-06-22 13:10:01 +02:00
|
|
|
<NitroCardContentView className="text-black">
|
2021-09-06 10:00:29 +02:00
|
|
|
<button className="btn btn-primary btn-sm w-100 mb-2" onClick={ () => handleClick('toggle_room') } disabled={ !currentRoomId }><i className="fas fa-home"></i> Room Tool</button>
|
2021-10-19 23:32:22 +02:00
|
|
|
<button className="btn btn-primary btn-sm w-100 mb-2" onClick={ () => handleClick('toggle_room_chatlog') } disabled={ !currentRoomId }><i className="fas fa-comments"></i> Chatlog Tool</button>
|
|
|
|
<button className="btn btn-primary btn-sm w-100 mb-2" onClick={ () => handleClick('toggle_user_info') } disabled={ !selectedUser }><i className="fas fa-user"></i> User: { selectedUser ? selectedUser.username : '' }</button>
|
2021-09-06 10:00:29 +02:00
|
|
|
<button className="btn btn-primary btn-sm w-100" onClick={ () => setIsTicketsVisible(value => !value) }><i className="fas fa-exclamation-circle"></i> Report Tool</button>
|
2021-06-21 12:21:25 +02:00
|
|
|
</NitroCardContentView>
|
|
|
|
</NitroCardView> }
|
2021-06-22 13:10:01 +02:00
|
|
|
{ openRooms && openRooms.map(roomId =>
|
|
|
|
{
|
|
|
|
return <ModToolsRoomView key={ roomId } roomId={ roomId } onCloseClick={ () => handleClick('close_room', roomId.toString()) } />;
|
2021-10-16 04:34:36 +02:00
|
|
|
})
|
|
|
|
}
|
2021-10-19 23:32:22 +02:00
|
|
|
{ openRoomChatlogs && openRoomChatlogs.map(roomId =>
|
|
|
|
{
|
|
|
|
return <ModToolsChatlogView key={ roomId } roomId={ roomId } onCloseClick={ () => handleClick('close_room_chatlog', roomId.toString()) } />;
|
|
|
|
})
|
|
|
|
}
|
|
|
|
{ openUserInfo && openUserInfo.map(userId =>
|
|
|
|
{
|
|
|
|
return <ModToolsUserView key={userId} userId={userId} onCloseClick={ () => handleClick('close_user_info', userId.toString())}/>
|
|
|
|
})
|
|
|
|
}
|
|
|
|
{ openUserChatlogs && openUserChatlogs.map(userId =>
|
|
|
|
{
|
|
|
|
return <ModToolsUserChatlogView key={userId} userId={userId} onCloseClick={ () => handleClick('close_user_chatlog', userId.toString())}/>
|
|
|
|
})
|
|
|
|
}
|
2021-06-22 13:10:01 +02:00
|
|
|
|
2021-09-06 10:00:29 +02:00
|
|
|
{ isTicketsVisible && <ModToolsTicketsView onCloseClick={ () => setIsTicketsVisible(false) } /> }
|
2021-06-21 12:21:25 +02:00
|
|
|
</ModToolsContextProvider>
|
|
|
|
);
|
|
|
|
}
|