nitro-react/src/components/mod-tools/ModToolsView.tsx

230 lines
9.7 KiB
TypeScript
Raw Normal View History

2022-03-25 22:52:42 +01:00
import { RoomEngineObjectEvent, RoomObjectCategory, RoomObjectType } from '@nitrots/nitro-renderer';
2022-03-30 16:19:09 +02:00
import { FC, useCallback, useReducer, useRef, useState } from 'react';
2021-10-19 23:32:22 +02:00
import { GetRoomSession } from '../../api';
2022-03-17 21:02:43 +01:00
import { Base, Button, DraggableWindowPosition, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common';
2022-03-03 10:11:31 +01:00
import { ModToolsEvent, ModToolsOpenRoomChatlogEvent, ModToolsOpenRoomInfoEvent, ModToolsOpenUserInfoEvent } from '../../events';
import { DispatchUiEvent, UseRoomEngineEvent, UseUiEvent } from '../../hooks';
2022-03-14 11:54:05 +01:00
import { ISelectedUser } from './common/ISelectedUser';
2022-02-21 05:28:21 +01:00
import { ModToolsContextProvider } from './ModToolsContext';
2021-10-21 05:32:44 +02:00
import { ModToolsMessageHandler } from './ModToolsMessageHandler';
2021-06-22 13:10:01 +02:00
import { initialModTools, ModToolsActions, ModToolsReducer } from './reducers/ModToolsReducer';
2022-02-21 05:28:21 +01:00
import { ModToolsChatlogView } from './views/room/ModToolsChatlogView';
import { ModToolsRoomView } from './views/room/ModToolsRoomView';
2021-06-22 13:10:01 +02:00
import { ModToolsTicketsView } from './views/tickets/ModToolsTicketsView';
2022-02-21 05:28:21 +01:00
import { ModToolsUserChatlogView } from './views/user/ModToolsUserChatlogView';
import { ModToolsUserView } from './views/user/ModToolsUserView';
2021-06-21 12:21:25 +02:00
2022-02-17 06:35:27 +01:00
export const ModToolsView: FC<{}> = props =>
2021-06-21 12:21:25 +02:00
{
const [ isVisible, setIsVisible ] = useState(false);
2022-04-01 19:33:08 +02:00
const [ selectedUser, setSelectedUser ] = useState<ISelectedUser>(null);
2021-06-22 13:10:01 +02:00
const [ isTicketsVisible, setIsTicketsVisible ] = useState(false);
2022-02-21 05:28:21 +01:00
const [ modToolsState, dispatchModToolsState ] = useReducer(ModToolsReducer, initialModTools);
const { currentRoomId = null, openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null } = modToolsState;
2022-03-30 16:19:09 +02:00
const elementRef = useRef<HTMLDivElement>(null);
2021-06-22 13:10:01 +02:00
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-21 05:45:21 +02:00
}, []);
2021-06-21 12:21:25 +02:00
2022-03-03 10:11:31 +01:00
UseUiEvent(ModToolsEvent.SHOW_MOD_TOOLS, onModToolsEvent);
UseUiEvent(ModToolsEvent.HIDE_MOD_TOOLS, onModToolsEvent);
UseUiEvent(ModToolsEvent.TOGGLE_MOD_TOOLS, onModToolsEvent);
2021-10-21 05:45:21 +02:00
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);
2022-03-25 22:52:42 +01:00
if(!userData || userData.type !== RoomObjectType.USER) return;
2021-10-19 23:32:22 +02:00
setSelectedUser({ userId: userData.webID, username: userData.name });
}, []);
2022-03-03 10:11:31 +01:00
UseRoomEngineEvent(RoomEngineObjectEvent.SELECTED, onRoomEngineObjectEvent);
2021-10-19 23:32:22 +02:00
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)
{
2022-03-03 10:11:31 +01:00
DispatchUiEvent(new ModToolsOpenRoomInfoEvent(currentRoomId));
2021-06-22 13:10:01 +02:00
return;
}
2021-10-20 08:01:26 +02:00
if(openRooms.indexOf(currentRoomId) > -1)
2021-06-22 13:10:01 +02:00
{
handleClick('close_room', currentRoomId.toString());
}
else
{
2022-03-03 10:11:31 +01:00
DispatchUiEvent(new ModToolsOpenRoomInfoEvent(currentRoomId));
2021-06-22 13:10:01 +02:00
}
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)
{
2022-03-03 10:11:31 +01:00
DispatchUiEvent(new ModToolsOpenRoomChatlogEvent(currentRoomId));
2021-10-19 23:32:22 +02:00
return;
}
2021-10-20 08:01:26 +02:00
if(openRoomChatlogs.indexOf(currentRoomId) > -1)
2021-10-19 23:32:22 +02:00
{
handleClick('close_room_chatlog', currentRoomId.toString());
}
else
{
2022-03-03 10:11:31 +01:00
DispatchUiEvent(new ModToolsOpenRoomChatlogEvent(currentRoomId));
2021-10-19 23:32:22 +02:00
}
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)
{
2022-03-03 10:11:31 +01:00
DispatchUiEvent(new ModToolsOpenUserInfoEvent(userId));
2021-10-19 23:32:22 +02:00
return;
}
2021-10-20 08:01:26 +02:00
if(openUserInfo.indexOf(userId) > -1)
2021-10-19 23:32:22 +02:00
{
handleClick('close_user_info', userId.toString());
}
else
{
2022-03-03 10:11:31 +01:00
DispatchUiEvent(new ModToolsOpenUserInfoEvent(userId));
2021-10-19 23:32:22 +02:00
}
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;
}
}
2022-04-01 19:33:08 +02:00
}, [ openRooms, currentRoomId, openRoomChatlogs, selectedUser, openUserInfo, openUserChatlogs ]);
2021-06-21 12:21:25 +02:00
return (
<ModToolsContextProvider value={ { modToolsState, dispatchModToolsState } }>
2021-10-21 05:32:44 +02:00
<ModToolsMessageHandler />
2021-06-21 12:21:25 +02:00
{ isVisible &&
<NitroCardView uniqueKey="mod-tools" className="nitro-mod-tools" windowPosition={ DraggableWindowPosition.TOP_LEFT } theme="primary-slim" >
2021-08-16 08:00:31 +02:00
<NitroCardHeaderView headerText={ 'Mod Tools' } onCloseClick={ event => setIsVisible(false) } />
2022-02-21 05:28:21 +01:00
<NitroCardContentView className="text-black" gap={ 1 }>
2022-03-17 21:02:43 +01:00
<Button gap={ 1 } onClick={ event => handleClick('toggle_room') } disabled={ !currentRoomId } className="position-relative">
<Base className="icon icon-small-room position-absolute start-1"/> Room Tool
2022-02-21 05:28:21 +01:00
</Button>
2022-03-30 16:19:09 +02:00
<Button innerRef={ elementRef } gap={ 1 } onClick={ event => handleClick('toggle_room_chatlog') } disabled={ !currentRoomId } className="position-relative">
2022-04-01 19:33:08 +02:00
<Base className="icon icon-chat-history position-absolute start-1"/> Chatlog Tool
2022-02-21 05:28:21 +01:00
</Button>
2022-03-17 21:02:43 +01:00
<Button gap={ 1 } onClick={ () => handleClick('toggle_user_info') } disabled={ !selectedUser } className="position-relative">
2022-04-01 19:33:08 +02:00
<Base className="icon icon-user position-absolute start-1"/> User: { selectedUser ? selectedUser.username : '' }
2022-02-21 05:28:21 +01:00
</Button>
2022-03-17 21:02:43 +01:00
<Button gap={ 1 } onClick={ () => setIsTicketsVisible(value => !value) } className="position-relative">
2022-04-01 19:33:08 +02:00
<Base className="icon icon-tickets position-absolute start-1"/> Report Tool
2022-02-21 05:28:21 +01:00
</Button>
2021-06-21 12:21:25 +02:00
</NitroCardContentView>
</NitroCardView> }
2021-06-22 13:10:01 +02:00
{ openRooms && openRooms.map(roomId =>
2022-04-01 19:33:08 +02:00
{
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 =>
2022-04-01 19:33:08 +02:00
{
return <ModToolsChatlogView key={ roomId } roomId={ roomId } onCloseClick={ () => handleClick('close_room_chatlog', roomId.toString()) } />;
})
2021-10-19 23:32:22 +02:00
}
{ openUserInfo && openUserInfo.map(userId =>
2022-04-01 19:33:08 +02:00
{
2022-04-04 02:52:34 +02:00
return <ModToolsUserView key={ userId } userId={ userId } onCloseClick={ () => handleClick('close_user_info', userId.toString()) }/>
2022-04-01 19:33:08 +02:00
})
2021-10-19 23:32:22 +02:00
}
{ openUserChatlogs && openUserChatlogs.map(userId =>
2022-04-01 19:33:08 +02:00
{
2022-04-04 02:52:34 +02:00
return <ModToolsUserChatlogView key={ userId } userId={ userId } onCloseClick={ () => handleClick('close_user_chatlog', userId.toString()) }/>
2022-04-01 19:33:08 +02:00
})
2021-10-19 23:32:22 +02:00
}
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>
);
}