import { AddLinkEventTracker, CreateLinkEvent, ILinkEventTracker, RemoveLinkEventTracker, RoomEngineEvent, RoomId, RoomObjectCategory, RoomObjectType } from '@nitrots/nitro-renderer'; import { FC, useEffect, useRef, useState } from 'react'; import { GetRoomSession, ISelectedUser } from '../../api'; import { Button, DraggableWindowPosition, NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../common'; import { useModTools, useNitroEvent, useObjectSelectedEvent } from '../../hooks'; import { ModToolsChatlogView } from './views/room/ModToolsChatlogView'; import { ModToolsRoomView } from './views/room/ModToolsRoomView'; import { ModToolsTicketsView } from './views/tickets/ModToolsTicketsView'; import { ModToolsUserChatlogView } from './views/user/ModToolsUserChatlogView'; import { ModToolsUserView } from './views/user/ModToolsUserView'; export const ModToolsView: FC<{}> = props => { const [ isVisible, setIsVisible ] = useState(false); const [ currentRoomId, setCurrentRoomId ] = useState(-1); const [ selectedUser, setSelectedUser ] = useState(null); const [ isTicketsVisible, setIsTicketsVisible ] = useState(false); const { openRooms = [], openRoomChatlogs = [], openUserChatlogs = [], openUserInfos = [], openRoomInfo = null, closeRoomInfo = null, toggleRoomInfo = null, openRoomChatlog = null, closeRoomChatlog = null, toggleRoomChatlog = null, openUserInfo = null, closeUserInfo = null, toggleUserInfo = null, openUserChatlog = null, closeUserChatlog = null, toggleUserChatlog = null } = useModTools(); const elementRef = useRef(null); useNitroEvent([ RoomEngineEvent.INITIALIZED, RoomEngineEvent.DISPOSED ], event => { if(RoomId.isRoomPreviewerId(event.roomId)) return; switch(event.type) { case RoomEngineEvent.INITIALIZED: setCurrentRoomId(event.roomId); return; case RoomEngineEvent.DISPOSED: setCurrentRoomId(-1); return; } }); useObjectSelectedEvent(event => { if(event.category !== RoomObjectCategory.UNIT) return; const roomSession = GetRoomSession(); if(!roomSession) return; const userData = roomSession.userDataManager.getUserDataByIndex(event.id); if(!userData || userData.type !== RoomObjectType.USER) return; setSelectedUser({ userId: userData.webID, username: userData.name }); }); useEffect(() => { const linkTracker: ILinkEventTracker = { linkReceived: (url: string) => { const parts = url.split('/'); if(parts.length < 2) return; switch(parts[1]) { case 'show': setIsVisible(true); return; case 'hide': setIsVisible(false); return; case 'toggle': setIsVisible(prevValue => !prevValue); return; case 'open-room-info': openRoomInfo(Number(parts[2])); return; case 'close-room-info': closeRoomInfo(Number(parts[2])); return; case 'toggle-room-info': toggleRoomInfo(Number(parts[2])); return; case 'open-room-chatlog': openRoomChatlog(Number(parts[2])); return; case 'close-room-chatlog': closeRoomChatlog(Number(parts[2])); return; case 'toggle-room-chatlog': toggleRoomChatlog(Number(parts[2])); return; case 'open-user-info': openUserInfo(Number(parts[2])); return; case 'close-user-info': closeUserInfo(Number(parts[2])); return; case 'toggle-user-info': toggleUserInfo(Number(parts[2])); return; case 'open-user-chatlog': openUserChatlog(Number(parts[2])); return; case 'close-user-chatlog': closeUserChatlog(Number(parts[2])); return; case 'toggle-user-chatlog': toggleUserChatlog(Number(parts[2])); return; } }, eventUrlPrefix: 'mod-tools/' }; AddLinkEventTracker(linkTracker); return () => RemoveLinkEventTracker(linkTracker); }, [ openRoomInfo, closeRoomInfo, toggleRoomInfo, openRoomChatlog, closeRoomChatlog, toggleRoomChatlog, openUserInfo, closeUserInfo, toggleUserInfo, openUserChatlog, closeUserChatlog, toggleUserChatlog ]); const isRoomInfoOpen = currentRoomId > 0 && openRooms.includes(currentRoomId); const isRoomChatlogOpen = currentRoomId > 0 && openRoomChatlogs.includes(currentRoomId); const isUserInfoOpen = selectedUser && openUserInfos.includes(selectedUser.userId); return ( <> { isVisible && setIsVisible(false) } /> } { (openRooms.length > 0) && openRooms.map(roomId => CreateLinkEvent(`mod-tools/close-room-info/${ roomId }`) } />) } { (openRoomChatlogs.length > 0) && openRoomChatlogs.map(roomId => CreateLinkEvent(`mod-tools/close-room-chatlog/${ roomId }`) } />) } { (openUserInfos.length > 0) && openUserInfos.map(userId => CreateLinkEvent(`mod-tools/close-user-info/${ userId }`) } />) } { (openUserChatlogs.length > 0) && openUserChatlogs.map(userId => CreateLinkEvent(`mod-tools/close-user-chatlog/${ userId }`) } />) } { isTicketsVisible && setIsTicketsVisible(false) } /> } ); };