From 2d2604cdc9b5e00e7b5a401c9e33fd023391c8b2 Mon Sep 17 00:00:00 2001 From: dank074 Date: Fri, 15 Oct 2021 21:34:36 -0500 Subject: [PATCH 01/29] created chatlog component --- src/views/mod-tools/ModToolsView.scss | 3 +- src/views/mod-tools/ModToolsView.tsx | 8 +- .../mod-tools/views/chatlog/ChatlogView.scss | 28 +++++++ .../mod-tools/views/chatlog/ChatlogView.tsx | 57 +++++++++++++ .../views/chatlog/ChatlogView.types.ts | 6 ++ .../views/chatlog/ModToolsChatlogView.scss | 26 ------ .../views/chatlog/ModToolsChatlogView.tsx | 84 ------------------- .../room-chatlog/ModToolsChatlogView.scss | 3 + .../room-chatlog/ModToolsChatlogView.tsx | 62 ++++++++++++++ .../ModToolsChatlogView.types.ts | 0 10 files changed, 164 insertions(+), 113 deletions(-) create mode 100644 src/views/mod-tools/views/chatlog/ChatlogView.scss create mode 100644 src/views/mod-tools/views/chatlog/ChatlogView.tsx create mode 100644 src/views/mod-tools/views/chatlog/ChatlogView.types.ts delete mode 100644 src/views/mod-tools/views/chatlog/ModToolsChatlogView.scss delete mode 100644 src/views/mod-tools/views/chatlog/ModToolsChatlogView.tsx create mode 100644 src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.scss create mode 100644 src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx rename src/views/mod-tools/views/{chatlog => room-chatlog}/ModToolsChatlogView.types.ts (100%) diff --git a/src/views/mod-tools/ModToolsView.scss b/src/views/mod-tools/ModToolsView.scss index 9f5554e9..66fe1306 100644 --- a/src/views/mod-tools/ModToolsView.scss +++ b/src/views/mod-tools/ModToolsView.scss @@ -2,5 +2,6 @@ width: 200px; } -@import './views/chatlog/ModToolsChatlogView'; +@import './views/room-chatlog/ModToolsChatlogView'; @import './views/room/ModToolsRoomView'; +@import './views/chatlog/ChatlogView'; diff --git a/src/views/mod-tools/ModToolsView.tsx b/src/views/mod-tools/ModToolsView.tsx index b6591d92..60fc1ba3 100644 --- a/src/views/mod-tools/ModToolsView.tsx +++ b/src/views/mod-tools/ModToolsView.tsx @@ -9,6 +9,7 @@ import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../ import { ModToolsContextProvider } from './context/ModToolsContext'; import { ModToolsViewProps } from './ModToolsView.types'; import { initialModTools, ModToolsActions, ModToolsReducer } from './reducers/ModToolsReducer'; +import { ModToolsChatlogView } from './views/room-chatlog/ModToolsChatlogView'; import { ModToolsRoomView } from './views/room/ModToolsRoomView'; import { ModToolsTicketsView } from './views/tickets/ModToolsTicketsView'; import { ModToolsUserView } from './views/user/ModToolsUserView'; @@ -22,6 +23,7 @@ export const ModToolsView: FC = props => const [ isRoomVisible, setIsRoomVisible ] = useState(false); const [ isUserVisible, setIsUserVisible ] = useState(false); const [ isTicketsVisible, setIsTicketsVisible ] = useState(false); + const [ isChatlogVisible, setChatlogVisible ] = useState(false); const onModToolsEvent = useCallback((event: ModToolsEvent) => { @@ -166,7 +168,7 @@ export const ModToolsView: FC = props => setIsVisible(false) } /> - + @@ -174,10 +176,12 @@ export const ModToolsView: FC = props => { openRooms && openRooms.map(roomId => { return handleClick('close_room', roomId.toString()) } />; - }) } + }) + } { isUserVisible && } { isTicketsVisible && setIsTicketsVisible(false) } /> } + { isChatlogVisible && setChatlogVisible(false) }/>} ); } diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.scss b/src/views/mod-tools/views/chatlog/ChatlogView.scss new file mode 100644 index 00000000..332ccc31 --- /dev/null +++ b/src/views/mod-tools/views/chatlog/ChatlogView.scss @@ -0,0 +1,28 @@ +.chatlog-messages { + color: $black; + + $username-col-width: 100px; + + .username-label { + width: $username-col-width; + } + + .chatlog { + min-height: 200px; + min-width: 400px; + + .chatlog-container { + color: $black; + + div.chatlog-entry { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + + .username { + color: #1E7295; + text-decoration: underline; + width: $username-col-width; + } + } + } + } +} diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.tsx b/src/views/mod-tools/views/chatlog/ChatlogView.tsx new file mode 100644 index 00000000..b56a9b86 --- /dev/null +++ b/src/views/mod-tools/views/chatlog/ChatlogView.tsx @@ -0,0 +1,57 @@ +import { UserProfileComposer } from '@nitrots/nitro-renderer'; +import { FC } from 'react'; +import { AutoSizer, CellMeasurerCache, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; +import { SendMessageHook } from '../../../../hooks'; +import { ChatlogViewProps } from './ChatlogView.types'; + +export const ChatlogView: FC = props => +{ + const { record = null } = props; + + const cache = new CellMeasurerCache({ + defaultHeight: 20, + fixedWidth: true + }); + + const rowRenderer: ListRowRenderer = (props: ListRowProps) => + { + const item = record.chatlog[props.index]; + + return ( +
+
{item.timestamp}
+
SendMessageHook(new UserProfileComposer(item.userId))}>{item.userName}
+
{item.message}
+
+ ); + } + + return ( + <> + {record &&
+
+
Time
+
User
+
Message
+
+
+ + {({ height, width }) => + { + return ( + + ) + } + } + +
+
} + + ); +} diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.types.ts b/src/views/mod-tools/views/chatlog/ChatlogView.types.ts new file mode 100644 index 00000000..edf5ed3e --- /dev/null +++ b/src/views/mod-tools/views/chatlog/ChatlogView.types.ts @@ -0,0 +1,6 @@ +import { ChatRecordData } from '@nitrots/nitro-renderer'; + +export interface ChatlogViewProps +{ + record: ChatRecordData; +} diff --git a/src/views/mod-tools/views/chatlog/ModToolsChatlogView.scss b/src/views/mod-tools/views/chatlog/ModToolsChatlogView.scss deleted file mode 100644 index 7a2ddc8a..00000000 --- a/src/views/mod-tools/views/chatlog/ModToolsChatlogView.scss +++ /dev/null @@ -1,26 +0,0 @@ -.nitro-mod-tools-chatlog { - width: 480px; - - .chatlog-messages { - height: 300px; - max-height: 300px; - - .table { - color: $black; - - > :not(caption) > * > * { - box-shadow: none; - border-bottom: 1px solid rgba(0, 0, 0, .2); - } - - &.table-striped > tbody > tr:nth-of-type(odd) { - color: $black; - background: rgba(0, 0, 0, .05); - } - - td { - padding: 0px 5px; - } - } - } -} diff --git a/src/views/mod-tools/views/chatlog/ModToolsChatlogView.tsx b/src/views/mod-tools/views/chatlog/ModToolsChatlogView.tsx deleted file mode 100644 index 18f20609..00000000 --- a/src/views/mod-tools/views/chatlog/ModToolsChatlogView.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { ModtoolRequestRoomChatlogComposer, ModtoolRoomChatlogEvent, ModtoolRoomChatlogLine } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { TryVisitRoom } from '../../../../api'; -import { CreateMessageHook, SendMessageHook } from '../../../../hooks/messages'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; -import { ModToolsChatlogViewProps } from './ModToolsChatlogView.types'; - -export const ModToolsChatlogView: FC = props => -{ - const { roomId = null, onCloseClick = null } = props; - - const [ roomName, setRoomName ] = useState(null); - const [ messages, setMessages ] = useState(null); - const [ loadedRoomId, setLoadedRoomId ] = useState(null); - - const [ messagesRequested, setMessagesRequested ] = useState(false); - - useEffect(() => - { - if(messagesRequested) return; - - SendMessageHook(new ModtoolRequestRoomChatlogComposer(roomId)); - setMessagesRequested(true); - }, [ roomId, messagesRequested, setMessagesRequested ]); - - const onModtoolRoomChatlogEvent = useCallback((event: ModtoolRoomChatlogEvent) => - { - const parser = event.getParser(); - - setRoomName(parser.data.roomName); - setMessages(parser.data.chatlog); - setLoadedRoomId(parser.data.roomId); - }, [ setRoomName, setMessages ]); - - CreateMessageHook(ModtoolRoomChatlogEvent, onModtoolRoomChatlogEvent); - - const handleClick = useCallback((action: string, value?: string) => - { - if(!action) return; - - switch(action) - { - case 'close': - onCloseClick(); - return; - case 'visit_room': - TryVisitRoom(loadedRoomId); - return; - } - }, [ onCloseClick, loadedRoomId ]); - - return ( - - handleClick('close') } /> - -
- - -
-
- { messages && - - - - - - - - - { messages.map((message, index) => - { - return - - - - ; - }) } - -
TimeUserMessage
{ message.timestamp }{ message.userName }{ message.message }
} -
-
-
- ); -} diff --git a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.scss b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.scss new file mode 100644 index 00000000..cf1d0dca --- /dev/null +++ b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.scss @@ -0,0 +1,3 @@ +.nitro-mod-tools-room-chatlog { + +} diff --git a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx new file mode 100644 index 00000000..dbf902c6 --- /dev/null +++ b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx @@ -0,0 +1,62 @@ +import { ChatRecordData, ModtoolRequestRoomChatlogComposer, ModtoolRoomChatlogEvent } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { TryVisitRoom } from '../../../../api'; +import { CreateMessageHook, SendMessageHook } from '../../../../hooks/messages'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; +import { ChatlogView } from '../chatlog/ChatlogView'; +import { ModToolsChatlogViewProps } from './ModToolsChatlogView.types'; + +export const ModToolsChatlogView: FC = props => +{ + const { roomId = null, onCloseClick = null } = props; + + const [roomChatlog, setRoomChatlog] = useState(null); + + useEffect(() => + { + SendMessageHook(new ModtoolRequestRoomChatlogComposer(roomId)); + }, [roomId]); + + const onModtoolRoomChatlogEvent = useCallback((event: ModtoolRoomChatlogEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + setRoomChatlog(parser.data); + }, [setRoomChatlog]); + + CreateMessageHook(ModtoolRoomChatlogEvent, onModtoolRoomChatlogEvent); + + const handleClick = useCallback((action: string, value?: string) => + { + if(!action) return; + + switch(action) + { + case 'close': + onCloseClick(); + return; + case 'visit_room': + TryVisitRoom(roomChatlog.roomId); + return; + } + }, [onCloseClick, roomChatlog]); + + return ( + + handleClick('close')} /> + + {roomChatlog && + <> +
+ + +
+ + + } +
+
+ ); +} diff --git a/src/views/mod-tools/views/chatlog/ModToolsChatlogView.types.ts b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.types.ts similarity index 100% rename from src/views/mod-tools/views/chatlog/ModToolsChatlogView.types.ts rename to src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.types.ts From 7d9b6f933637cb26a27e20b483f9b771edad94d9 Mon Sep 17 00:00:00 2001 From: dank074 Date: Fri, 15 Oct 2021 22:34:34 -0500 Subject: [PATCH 02/29] fixed row height --- .../mod-tools/views/chatlog/ChatlogView.scss | 5 +++- .../mod-tools/views/chatlog/ChatlogView.tsx | 24 +++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.scss b/src/views/mod-tools/views/chatlog/ChatlogView.scss index 332ccc31..6d9ceb16 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.scss +++ b/src/views/mod-tools/views/chatlog/ChatlogView.scss @@ -16,12 +16,15 @@ div.chatlog-entry { border-bottom: 1px solid rgba(0, 0, 0, 0.2); - .username { color: #1E7295; text-decoration: underline; width: $username-col-width; } + + .message { + word-break: break-all; + } } } } diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.tsx b/src/views/mod-tools/views/chatlog/ChatlogView.tsx index b56a9b86..67eab764 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/views/mod-tools/views/chatlog/ChatlogView.tsx @@ -1,6 +1,6 @@ import { UserProfileComposer } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { AutoSizer, CellMeasurerCache, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; +import { AutoSizer, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; import { SendMessageHook } from '../../../../hooks'; import { ChatlogViewProps } from './ChatlogView.types'; @@ -8,10 +8,14 @@ export const ChatlogView: FC = props => { const { record = null } = props; - const cache = new CellMeasurerCache({ - defaultHeight: 20, - fixedWidth: true - }); + const getRowHeight = ({ index }) => + { + const item = record.chatlog[index]; + + if(item.message.length < 40) return 20; + else if(item.message.length < 70) return 42; + else return 62; + }; const rowRenderer: ListRowRenderer = (props: ListRowProps) => { @@ -21,7 +25,7 @@ export const ChatlogView: FC = props =>
{item.timestamp}
SendMessageHook(new UserProfileComposer(item.userId))}>{item.userName}
-
{item.message}
+
{item.message}
); } @@ -30,9 +34,9 @@ export const ChatlogView: FC = props => <> {record &&
-
Time
-
User
-
Message
+
Time
+
User
+
Message
@@ -43,7 +47,7 @@ export const ChatlogView: FC = props => width={width} height={height} rowCount={record.chatlog.length} - rowHeight={20} + rowHeight={getRowHeight} className={'chatlog-container'} rowRenderer={rowRenderer} /> ) From 5c914a6de13076cd7c029bdfa568c5dddaae0088 Mon Sep 17 00:00:00 2001 From: dank074 Date: Sat, 16 Oct 2021 00:44:36 -0500 Subject: [PATCH 03/29] fix dynamic row height for real this time --- .../mod-tools/views/chatlog/ChatlogView.tsx | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.tsx b/src/views/mod-tools/views/chatlog/ChatlogView.tsx index 67eab764..64e9a9ca 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/views/mod-tools/views/chatlog/ChatlogView.tsx @@ -1,6 +1,6 @@ import { UserProfileComposer } from '@nitrots/nitro-renderer'; import { FC } from 'react'; -import { AutoSizer, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; +import { AutoSizer, CellMeasurer, CellMeasurerCache, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; import { SendMessageHook } from '../../../../hooks'; import { ChatlogViewProps } from './ChatlogView.types'; @@ -8,27 +8,31 @@ export const ChatlogView: FC = props => { const { record = null } = props; - const getRowHeight = ({ index }) => - { - const item = record.chatlog[index]; - - if(item.message.length < 40) return 20; - else if(item.message.length < 70) return 42; - else return 62; - }; - const rowRenderer: ListRowRenderer = (props: ListRowProps) => { const item = record.chatlog[props.index]; return ( -
-
{item.timestamp}
-
SendMessageHook(new UserProfileComposer(item.userId))}>{item.userName}
-
{item.message}
-
+ +
+
{item.timestamp}
+
SendMessageHook(new UserProfileComposer(item.userId))}>{item.userName}
+
{item.message}
+
+
); - } + }; + + const cache = new CellMeasurerCache({ + defaultHeight: 25, + fixedWidth: true + }); return ( <> @@ -47,9 +51,10 @@ export const ChatlogView: FC = props => width={width} height={height} rowCount={record.chatlog.length} - rowHeight={getRowHeight} + rowHeight={cache.rowHeight} className={'chatlog-container'} - rowRenderer={rowRenderer} /> + rowRenderer={rowRenderer} + deferredMeasurementCache={cache} /> ) } } From d4e44b888ee3d89a239429f9781dd0c48ee76a1d Mon Sep 17 00:00:00 2001 From: dank074 Date: Sat, 16 Oct 2021 01:26:03 -0500 Subject: [PATCH 04/29] detect window resize --- src/views/mod-tools/views/chatlog/ChatlogView.scss | 2 +- src/views/mod-tools/views/chatlog/ChatlogView.tsx | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.scss b/src/views/mod-tools/views/chatlog/ChatlogView.scss index 6d9ceb16..662d0c7a 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.scss +++ b/src/views/mod-tools/views/chatlog/ChatlogView.scss @@ -1,5 +1,6 @@ .chatlog-messages { color: $black; + min-width: 400px; $username-col-width: 100px; @@ -9,7 +10,6 @@ .chatlog { min-height: 200px; - min-width: 400px; .chatlog-container { color: $black; diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.tsx b/src/views/mod-tools/views/chatlog/ChatlogView.tsx index 64e9a9ca..78b3dd07 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/views/mod-tools/views/chatlog/ChatlogView.tsx @@ -21,7 +21,7 @@ export const ChatlogView: FC = props => rowIndex={props.index} >
-
{item.timestamp}
+
{item.timestamp}
SendMessageHook(new UserProfileComposer(item.userId))}>{item.userName}
{item.message}
@@ -38,7 +38,7 @@ export const ChatlogView: FC = props => <> {record &&
-
Time
+
Time
User
Message
@@ -46,6 +46,8 @@ export const ChatlogView: FC = props => {({ height, width }) => { + cache.clearAll(); + return ( Date: Sat, 16 Oct 2021 03:10:53 -0500 Subject: [PATCH 05/29] add rights check to mod tool icon --- src/views/toolbar/ToolbarView.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/views/toolbar/ToolbarView.tsx b/src/views/toolbar/ToolbarView.tsx index 34b1ac71..1e9fbab2 100644 --- a/src/views/toolbar/ToolbarView.tsx +++ b/src/views/toolbar/ToolbarView.tsx @@ -29,6 +29,7 @@ export const ToolbarView: FC = props => const [ unseenInventoryCount, setUnseenInventoryCount ] = useState(0); const [ unseenAchievementCount, setUnseenAchievementCount ] = useState(0); + const isMod = GetSessionDataManager().isModerator; const unseenFriendListCount = 0; const onUserInfoEvent = useCallback((event: UserInfoEvent) => @@ -200,9 +201,10 @@ export const ToolbarView: FC = props =>
handleToolbarItemClick(ToolbarViewItems.CAMERA_ITEM) }>
) } -
handleToolbarItemClick(ToolbarViewItems.MOD_TOOLS_ITEM) }> + { isMod && ( +
handleToolbarItemClick(ToolbarViewItems.MOD_TOOLS_ITEM) }> -
+
) }
From b54e18bf01e32dc9297dece4a7b9549a7de02808 Mon Sep 17 00:00:00 2001 From: Bill Date: Sat, 16 Oct 2021 04:13:54 -0400 Subject: [PATCH 06/29] Update trophy --- .../widgets/furniture/trophy/FurnitureTrophyView.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/views/room/widgets/furniture/trophy/FurnitureTrophyView.tsx b/src/views/room/widgets/furniture/trophy/FurnitureTrophyView.tsx index 5f21e504..403a60e2 100644 --- a/src/views/room/widgets/furniture/trophy/FurnitureTrophyView.tsx +++ b/src/views/room/widgets/furniture/trophy/FurnitureTrophyView.tsx @@ -1,6 +1,6 @@ import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { FC, useCallback, useState } from 'react'; -import { GetRoomEngine, RoomWidgetRoomObjectUpdateEvent } from '../../../../../api'; +import { GetRoomEngine, RoomWidgetUpdateRoomObjectEvent } from '../../../../../api'; import { CreateEventDispatcherHook } from '../../../../../hooks/events/event-dispatcher.base'; import { useRoomEngineEvent } from '../../../../../hooks/events/nitro/room/room-engine-event'; import { NitroLayoutTrophyView } from '../../../../../layout'; @@ -9,6 +9,7 @@ import { FurnitureTrophyData } from './FurnitureTrophyData'; export const FurnitureTrophyView: FC<{}> = props => { + const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); const [ trophyData, setTrophyData ] = useState(null); @@ -39,8 +40,8 @@ export const FurnitureTrophyView: FC<{}> = props => setTrophyData(new FurnitureTrophyData(widgetEvent.objectId, widgetEvent.category, color, ownerName, trophyDate, trophyText)); return; } - case RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED: { - const widgetEvent = (event as RoomWidgetRoomObjectUpdateEvent); + case RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED: { + const widgetEvent = (event as RoomWidgetUpdateRoomObjectEvent); setTrophyData(prevState => { @@ -54,7 +55,7 @@ export const FurnitureTrophyView: FC<{}> = props => }, []); useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_TROPHY, onNitroEvent); - CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED, widgetHandler.eventDispatcher, onNitroEvent); + CreateEventDispatcherHook(RoomWidgetUpdateRoomObjectEvent.FURNI_REMOVED, widgetHandler.eventDispatcher, onNitroEvent); const processAction = useCallback((type: string, value: string = null) => { From dca22b58c3f60763db20d981a185157a4bae4c3e Mon Sep 17 00:00:00 2001 From: dank074 Date: Tue, 19 Oct 2021 16:32:22 -0500 Subject: [PATCH 07/29] finish room and user chatlogs --- src/events/mod-tools/ModToolsEvent.ts | 4 +- .../mod-tools/ModToolsOpenRoomChatlogEvent.ts | 18 ++ .../mod-tools/ModToolsOpenUserChatlogEvent.ts | 18 ++ .../mod-tools/ModToolsOpenUserInfoEvent.ts | 18 ++ .../mod-tools/ModToolsSelectUserEvent.ts | 25 -- src/views/mod-tools/ModToolsView.scss | 2 +- src/views/mod-tools/ModToolsView.tsx | 213 ++++++++++++++---- .../mod-tools/reducers/ModToolsReducer.tsx | 40 ++-- src/views/mod-tools/utils/ISelectedUser.ts | 4 + .../mod-tools/views/chatlog/ChatlogView.scss | 4 + .../mod-tools/views/chatlog/ChatlogView.tsx | 150 +++++++++--- .../views/chatlog/ChatlogView.types.ts | 2 +- .../room-chatlog/ModToolsChatlogView.scss | 3 - .../room-chatlog/ModToolsChatlogView.tsx | 26 +-- .../views/room/ModToolsRoomView.scss | 5 + .../mod-tools/views/room/ModToolsRoomView.tsx | 9 +- .../user-chatlog/ModToolsUserChatlogView.tsx | 41 ++++ .../ModToolsUserChatlogView.types.ts | 5 + .../views/user/ModToolsUserView.scss | 8 + .../mod-tools/views/user/ModToolsUserView.tsx | 52 ++++- .../views/user/ModToolsUserView.types.ts | 6 +- 21 files changed, 505 insertions(+), 148 deletions(-) create mode 100644 src/events/mod-tools/ModToolsOpenRoomChatlogEvent.ts create mode 100644 src/events/mod-tools/ModToolsOpenUserChatlogEvent.ts create mode 100644 src/events/mod-tools/ModToolsOpenUserInfoEvent.ts delete mode 100644 src/events/mod-tools/ModToolsSelectUserEvent.ts create mode 100644 src/views/mod-tools/utils/ISelectedUser.ts delete mode 100644 src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.scss create mode 100644 src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx create mode 100644 src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.types.ts create mode 100644 src/views/mod-tools/views/user/ModToolsUserView.scss diff --git a/src/events/mod-tools/ModToolsEvent.ts b/src/events/mod-tools/ModToolsEvent.ts index b6070a36..ac7dc7d8 100644 --- a/src/events/mod-tools/ModToolsEvent.ts +++ b/src/events/mod-tools/ModToolsEvent.ts @@ -5,6 +5,8 @@ export class ModToolsEvent extends NitroEvent public static SHOW_MOD_TOOLS: string = 'MTE_SHOW_MOD_TOOLS'; public static HIDE_MOD_TOOLS: string = 'MTE_HIDE_MOD_TOOLS'; public static TOGGLE_MOD_TOOLS: string = 'MTE_TOGGLE_MOD_TOOLS'; - public static SELECT_USER: string = 'MTE_SELECT_USER'; public static OPEN_ROOM_INFO: string = 'MTE_OPEN_ROOM_INFO'; + public static OPEN_ROOM_CHATLOG: string = 'MTE_OPEN_ROOM_CHATLOG'; + public static OPEN_USER_INFO: string = 'MTE_OPEN_USER_INFO'; + public static OPEN_USER_CHATLOG: string = 'MTE_OPEN_USER_CHATLOG'; } diff --git a/src/events/mod-tools/ModToolsOpenRoomChatlogEvent.ts b/src/events/mod-tools/ModToolsOpenRoomChatlogEvent.ts new file mode 100644 index 00000000..692e687d --- /dev/null +++ b/src/events/mod-tools/ModToolsOpenRoomChatlogEvent.ts @@ -0,0 +1,18 @@ +import { ModToolsEvent } from './ModToolsEvent'; + +export class ModToolsOpenRoomChatlogEvent extends ModToolsEvent +{ + private _roomId: number; + + constructor(roomId: number) + { + super(ModToolsEvent.OPEN_ROOM_CHATLOG); + + this._roomId = roomId; + } + + public get roomId(): number + { + return this._roomId; + } +} diff --git a/src/events/mod-tools/ModToolsOpenUserChatlogEvent.ts b/src/events/mod-tools/ModToolsOpenUserChatlogEvent.ts new file mode 100644 index 00000000..aa8858e8 --- /dev/null +++ b/src/events/mod-tools/ModToolsOpenUserChatlogEvent.ts @@ -0,0 +1,18 @@ +import { ModToolsEvent } from './ModToolsEvent'; + +export class ModToolsOpenUserChatlogEvent extends ModToolsEvent +{ + private _userId: number; + + constructor(userId: number) + { + super(ModToolsEvent.OPEN_USER_CHATLOG); + + this._userId = userId; + } + + public get userId(): number + { + return this._userId; + } +} diff --git a/src/events/mod-tools/ModToolsOpenUserInfoEvent.ts b/src/events/mod-tools/ModToolsOpenUserInfoEvent.ts new file mode 100644 index 00000000..58148ee9 --- /dev/null +++ b/src/events/mod-tools/ModToolsOpenUserInfoEvent.ts @@ -0,0 +1,18 @@ +import { ModToolsEvent } from './ModToolsEvent'; + +export class ModToolsOpenUserInfoEvent extends ModToolsEvent +{ + private _userId: number; + + constructor(userId: number) + { + super(ModToolsEvent.OPEN_USER_INFO); + + this._userId = userId; + } + + public get userId(): number + { + return this._userId; + } +} diff --git a/src/events/mod-tools/ModToolsSelectUserEvent.ts b/src/events/mod-tools/ModToolsSelectUserEvent.ts deleted file mode 100644 index 148ffe28..00000000 --- a/src/events/mod-tools/ModToolsSelectUserEvent.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ModToolsEvent } from './ModToolsEvent'; - -export class ModToolsSelectUserEvent extends ModToolsEvent -{ - private _webID: number; - private _name: string; - - constructor(webID: number, name: string) - { - super(ModToolsEvent.SELECT_USER); - - this._webID = webID; - this._name = name; - } - - public get webID(): number - { - return this._webID; - } - - public get name(): string - { - return this._name; - } -} diff --git a/src/views/mod-tools/ModToolsView.scss b/src/views/mod-tools/ModToolsView.scss index 66fe1306..73b4142d 100644 --- a/src/views/mod-tools/ModToolsView.scss +++ b/src/views/mod-tools/ModToolsView.scss @@ -2,6 +2,6 @@ width: 200px; } -@import './views/room-chatlog/ModToolsChatlogView'; @import './views/room/ModToolsRoomView'; @import './views/chatlog/ChatlogView'; +@import './views/user/ModToolsUserView'; diff --git a/src/views/mod-tools/ModToolsView.tsx b/src/views/mod-tools/ModToolsView.tsx index 60fc1ba3..3c5dec10 100644 --- a/src/views/mod-tools/ModToolsView.tsx +++ b/src/views/mod-tools/ModToolsView.tsx @@ -1,29 +1,31 @@ -import { RoomEngineEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useReducer, useState } from 'react'; +import { RoomEngineEvent, RoomEngineObjectEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useReducer, useState } from 'react'; +import { GetRoomSession } from '../../api'; import { ModToolsEvent } from '../../events/mod-tools/ModToolsEvent'; +import { ModToolsOpenRoomChatlogEvent } from '../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; import { ModToolsOpenRoomInfoEvent } from '../../events/mod-tools/ModToolsOpenRoomInfoEvent'; -import { ModToolsSelectUserEvent } from '../../events/mod-tools/ModToolsSelectUserEvent'; +import { ModToolsOpenUserChatlogEvent } from '../../events/mod-tools/ModToolsOpenUserChatlogEvent'; +import { ModToolsOpenUserInfoEvent } from '../../events/mod-tools/ModToolsOpenUserInfoEvent'; import { useRoomEngineEvent } from '../../hooks/events'; import { dispatchUiEvent, useUiEvent } from '../../hooks/events/ui/ui-event'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../layout'; import { ModToolsContextProvider } from './context/ModToolsContext'; import { ModToolsViewProps } from './ModToolsView.types'; import { initialModTools, ModToolsActions, ModToolsReducer } from './reducers/ModToolsReducer'; +import { ISelectedUser } from './utils/ISelectedUser'; import { ModToolsChatlogView } from './views/room-chatlog/ModToolsChatlogView'; import { ModToolsRoomView } from './views/room/ModToolsRoomView'; import { ModToolsTicketsView } from './views/tickets/ModToolsTicketsView'; +import { ModToolsUserChatlogView } from './views/user-chatlog/ModToolsUserChatlogView'; import { ModToolsUserView } from './views/user/ModToolsUserView'; export const ModToolsView: FC = props => { const [ isVisible, setIsVisible ] = useState(false); const [ modToolsState, dispatchModToolsState ] = useReducer(ModToolsReducer, initialModTools); - const { currentRoomId = null, selectedUser = null, openRooms = null, openChatlogs = null } = modToolsState; - - const [ isRoomVisible, setIsRoomVisible ] = useState(false); - const [ isUserVisible, setIsUserVisible ] = useState(false); + const { currentRoomId = null, openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null } = modToolsState; + const [ selectedUser, setSelectedUser] = useState(null); const [ isTicketsVisible, setIsTicketsVisible ] = useState(false); - const [ isChatlogVisible, setChatlogVisible ] = useState(false); const onModToolsEvent = useCallback((event: ModToolsEvent) => { @@ -38,41 +40,76 @@ export const ModToolsView: FC = props => case ModToolsEvent.TOGGLE_MOD_TOOLS: setIsVisible(value => !value); return; - case ModToolsEvent.SELECT_USER: { - const castedEvent = (event as ModToolsSelectUserEvent); - - dispatchModToolsState({ - type: ModToolsActions.SET_SELECTED_USER, - payload: { - selectedUser: { - webID: castedEvent.webID, - name: castedEvent.name - } - } - }); - return; - } case ModToolsEvent.OPEN_ROOM_INFO: { const castedEvent = (event as ModToolsOpenRoomInfoEvent); if(openRooms && openRooms.includes(castedEvent.roomId)) return; + const rooms = openRooms || []; + dispatchModToolsState({ type: ModToolsActions.SET_OPEN_ROOMS, payload: { - openRooms: [...openRooms, castedEvent.roomId] + openRooms: [...rooms, castedEvent.roomId] + } + }); + return; + } + case ModToolsEvent.OPEN_ROOM_CHATLOG: { + const castedEvent = (event as ModToolsOpenRoomChatlogEvent); + + if(openRoomChatlogs && openRoomChatlogs.includes(castedEvent.roomId)) return; + + const chatlogs = openRoomChatlogs || []; + + dispatchModToolsState({ + 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, + payload: { + openUserChatlogs: [...userChatlog, castedEvent.userId] } }); return; } } - }, [ dispatchModToolsState, setIsVisible, openRooms ]); + }, [openRooms, openRoomChatlogs, openUserInfo, openUserChatlogs]); useUiEvent(ModToolsEvent.SHOW_MOD_TOOLS, onModToolsEvent); useUiEvent(ModToolsEvent.HIDE_MOD_TOOLS, onModToolsEvent); useUiEvent(ModToolsEvent.TOGGLE_MOD_TOOLS, onModToolsEvent); - useUiEvent(ModToolsEvent.SELECT_USER, onModToolsEvent); useUiEvent(ModToolsEvent.OPEN_ROOM_INFO, onModToolsEvent); + useUiEvent(ModToolsEvent.OPEN_ROOM_CHATLOG, onModToolsEvent); + useUiEvent(ModToolsEvent.OPEN_USER_INFO, onModToolsEvent); + useUiEvent(ModToolsEvent.OPEN_USER_CHATLOG, onModToolsEvent); const onRoomEngineEvent = useCallback((event: RoomEngineEvent) => { @@ -100,6 +137,23 @@ export const ModToolsView: FC = props => useRoomEngineEvent(RoomEngineEvent.INITIALIZED, onRoomEngineEvent); useRoomEngineEvent(RoomEngineEvent.DISPOSED, onRoomEngineEvent); + 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); + const handleClick = useCallback((action: string, value?: string) => { if(!action) return; @@ -139,27 +193,95 @@ export const ModToolsView: FC = props => }); return; } - case 'close_chatlog': { - const itemIndex = openChatlogs.indexOf(Number(value)); + case 'toggle_room_chatlog': { + if(!openRoomChatlogs) + { + dispatchUiEvent(new ModToolsOpenRoomChatlogEvent(currentRoomId)); + return; + } - const clone = Array.from(openChatlogs); + const itemIndex = openRoomChatlogs.indexOf(currentRoomId); + + 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); clone.splice(itemIndex, 1); dispatchModToolsState({ - type: ModToolsActions.SET_OPEN_CHATLOGS, + type: ModToolsActions.SET_OPEN_ROOM_CHATLOGS, payload: { - openChatlogs: clone + 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 } }); return; } } - }, [ dispatchModToolsState, openRooms, openChatlogs, currentRoomId ]); + }, [openRooms, currentRoomId, openRoomChatlogs, selectedUser, openUserInfo, openUserChatlogs]); - useEffect(() => - { - if(!isVisible) return; - }, [ isVisible ]); + if(!isVisible) return null; return ( @@ -168,8 +290,8 @@ export const ModToolsView: FC = props => setIsVisible(false) } /> - - + + } @@ -178,10 +300,23 @@ export const ModToolsView: FC = props => return handleClick('close_room', roomId.toString()) } />; }) } + { openRoomChatlogs && openRoomChatlogs.map(roomId => + { + return handleClick('close_room_chatlog', roomId.toString()) } />; + }) + } + { openUserInfo && openUserInfo.map(userId => + { + return handleClick('close_user_info', userId.toString())}/> + }) + } + { openUserChatlogs && openUserChatlogs.map(userId => + { + return handleClick('close_user_chatlog', userId.toString())}/> + }) + } - { isUserVisible && } { isTicketsVisible && setIsTicketsVisible(false) } /> } - { isChatlogVisible && setChatlogVisible(false) }/>} ); } diff --git a/src/views/mod-tools/reducers/ModToolsReducer.tsx b/src/views/mod-tools/reducers/ModToolsReducer.tsx index 955d70b9..9301e941 100644 --- a/src/views/mod-tools/reducers/ModToolsReducer.tsx +++ b/src/views/mod-tools/reducers/ModToolsReducer.tsx @@ -2,48 +2,47 @@ import { Reducer } from 'react'; export interface IModToolsState { - selectedUser: {webID: number, name: string}; currentRoomId: number; openRooms: number[]; - openChatlogs: number[]; + openRoomChatlogs: number[]; + openUserInfo: number[]; + openUserChatlogs: number[]; } export interface IModToolsAction { type: string; payload: { - selectedUser?: {webID: number, name: string}; currentRoomId?: number; openRooms?: number[]; - openChatlogs?: number[]; + openRoomChatlogs?: number[]; + openUserInfo?: number[]; + openUserChatlogs?: number[]; } } export class ModToolsActions { - public static SET_SELECTED_USER: string = 'MTA_SET_SELECTED_USER'; public static SET_CURRENT_ROOM_ID: string = 'MTA_SET_CURRENT_ROOM_ID'; public static SET_OPEN_ROOMS: string = 'MTA_SET_OPEN_ROOMS'; - public static SET_OPEN_CHATLOGS: string = 'MTA_SET_OPEN_CHATLOGS'; + public static SET_OPEN_USERINFO: string = 'MTA_SET_OPEN_USERINFO'; + public static SET_OPEN_ROOM_CHATLOGS: string = 'MTA_SET_OPEN_CHATLOGS'; + public static SET_OPEN_USER_CHATLOGS: string = 'MTA_SET_OPEN_USER_CHATLOGS'; public static RESET_STATE: string = 'MTA_RESET_STATE'; } export const initialModTools: IModToolsState = { - selectedUser: null, currentRoomId: null, openRooms: null, - openChatlogs: null + openRoomChatlogs: null, + openUserChatlogs: null, + openUserInfo: null }; export const ModToolsReducer: Reducer = (state, action) => { switch(action.type) { - case ModToolsActions.SET_SELECTED_USER: { - const selectedUser = (action.payload.selectedUser || state.selectedUser || null); - - return { ...state, selectedUser }; - } case ModToolsActions.SET_CURRENT_ROOM_ID: { const currentRoomId = (action.payload.currentRoomId || state.currentRoomId || null); @@ -54,6 +53,21 @@ export const ModToolsReducer: Reducer = (state, return { ...state, openRooms }; } + case ModToolsActions.SET_OPEN_USERINFO: { + const openUserInfo = (action.payload.openUserInfo || state.openUserInfo || null); + + return { ...state, openUserInfo }; + } + case ModToolsActions.SET_OPEN_ROOM_CHATLOGS: { + const openRoomChatlogs = (action.payload.openRoomChatlogs || state.openRoomChatlogs || null); + + return { ...state, openRoomChatlogs }; + } + case ModToolsActions.SET_OPEN_USER_CHATLOGS: { + const openUserChatlogs = (action.payload.openUserChatlogs || state.openUserChatlogs || null); + + return { ...state, openUserChatlogs }; + } case ModToolsActions.RESET_STATE: { return { ...initialModTools }; } diff --git a/src/views/mod-tools/utils/ISelectedUser.ts b/src/views/mod-tools/utils/ISelectedUser.ts new file mode 100644 index 00000000..c5a657a9 --- /dev/null +++ b/src/views/mod-tools/utils/ISelectedUser.ts @@ -0,0 +1,4 @@ +export interface ISelectedUser { + userId: number; + username: string; +} diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.scss b/src/views/mod-tools/views/chatlog/ChatlogView.scss index 662d0c7a..33df955a 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.scss +++ b/src/views/mod-tools/views/chatlog/ChatlogView.scss @@ -26,6 +26,10 @@ word-break: break-all; } } + + .room-info { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + } } } } diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.tsx b/src/views/mod-tools/views/chatlog/ChatlogView.tsx index 78b3dd07..563bf700 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/views/mod-tools/views/chatlog/ChatlogView.tsx @@ -1,16 +1,18 @@ -import { UserProfileComposer } from '@nitrots/nitro-renderer'; -import { FC } from 'react'; +import { ChatRecordData, ModtoolRoomChatlogLine, UserProfileComposer } from '@nitrots/nitro-renderer'; +import { FC, useCallback } from 'react'; import { AutoSizer, CellMeasurer, CellMeasurerCache, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; -import { SendMessageHook } from '../../../../hooks'; +import { TryVisitRoom } from '../../../../api'; +import { ModToolsOpenRoomInfoEvent } from '../../../../events/mod-tools/ModToolsOpenRoomInfoEvent'; +import { dispatchUiEvent, SendMessageHook } from '../../../../hooks'; import { ChatlogViewProps } from './ChatlogView.types'; export const ChatlogView: FC = props => { - const { record = null } = props; + const { records = null } = props; - const rowRenderer: ListRowRenderer = (props: ListRowProps) => + const simpleRowRenderer: ListRowRenderer = (props: ListRowProps) => { - const item = record.chatlog[props.index]; + const item = records[0].chatlog[props.index]; return ( = props => ); }; + const advancedRowRenderer: ListRowRenderer = (props: ListRowProps) => + { + let chatlogEntry: ModtoolRoomChatlogLine; + let currentRecord: ChatRecordData; + let isRoomInfo = false; + + let totalIndex = 0; + for(let i = 0; i < records.length; i++) + { + currentRecord = records[i]; + + totalIndex++; // row for room info + totalIndex = totalIndex + currentRecord.chatlog.length; + + if(props.index > (totalIndex - 1)) + { + continue; // it is not in current one + } + + if( (props.index + 1) === (totalIndex - currentRecord.chatlog.length)) + { + console.log(`global: ${props.index} roomInfo ${currentRecord.roomName}`); + isRoomInfo = true; + break; + } + const index = props.index - (totalIndex - currentRecord.chatlog.length); + chatlogEntry = currentRecord.chatlog[index]; + console.log(`global: ${props.index} local: ${index} value: ${chatlogEntry}`); + break; + } + + return ( + + {isRoomInfo && } + {!isRoomInfo && +
+
{chatlogEntry.timestamp}
+
SendMessageHook(new UserProfileComposer(chatlogEntry.userId))}>{chatlogEntry.userName}
+
{chatlogEntry.message}
+
+ } + +
+ ); + } + + const getNumRowsForAdvanced = useCallback(() => + { + let count = 0; + + for(let i = 0; i < records.length; i++) + { + count++; // add room info row + count = count + records[i].chatlog.length; + } + + return count; + }, [records]); + const cache = new CellMeasurerCache({ defaultHeight: 25, fixedWidth: true }); + const RoomInfo = useCallback(({ roomId, roomName, uniqueKey, style }) => + { + return ( +
+
Room: {roomName}
+ + +
+ ); + }, []); + return ( <> - {record &&
-
-
Time
-
User
-
Message
-
-
- - {({ height, width }) => - { - cache.clearAll(); - - return ( - - ) - } - } - -
-
} + { + (records && records.length) && + <> + {(records.length === 1) && } +
+
+
Time
+
User
+
Message
+
+
+ + {({ height, width }) => + { + cache.clearAll(); + + return ( + 1 ? getNumRowsForAdvanced() : records[0].chatlog.length} + rowHeight={cache.rowHeight} + className={'chatlog-container'} + rowRenderer={records.length > 1 ? advancedRowRenderer : simpleRowRenderer} + deferredMeasurementCache={cache} /> + ) + } + } + +
+
+ + } ); } diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.types.ts b/src/views/mod-tools/views/chatlog/ChatlogView.types.ts index edf5ed3e..f307109f 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.types.ts +++ b/src/views/mod-tools/views/chatlog/ChatlogView.types.ts @@ -2,5 +2,5 @@ import { ChatRecordData } from '@nitrots/nitro-renderer'; export interface ChatlogViewProps { - record: ChatRecordData; + records: ChatRecordData[]; } diff --git a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.scss b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.scss deleted file mode 100644 index cf1d0dca..00000000 --- a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.scss +++ /dev/null @@ -1,3 +0,0 @@ -.nitro-mod-tools-room-chatlog { - -} diff --git a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx index dbf902c6..b1799000 100644 --- a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx +++ b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx @@ -1,6 +1,5 @@ import { ChatRecordData, ModtoolRequestRoomChatlogComposer, ModtoolRoomChatlogEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { TryVisitRoom } from '../../../../api'; import { CreateMessageHook, SendMessageHook } from '../../../../hooks/messages'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; import { ChatlogView } from '../chatlog/ChatlogView'; @@ -28,33 +27,12 @@ export const ModToolsChatlogView: FC = props => CreateMessageHook(ModtoolRoomChatlogEvent, onModtoolRoomChatlogEvent); - const handleClick = useCallback((action: string, value?: string) => - { - if(!action) return; - - switch(action) - { - case 'close': - onCloseClick(); - return; - case 'visit_room': - TryVisitRoom(roomChatlog.roomId); - return; - } - }, [onCloseClick, roomChatlog]); - return ( - handleClick('close')} /> + onCloseClick()} /> {roomChatlog && - <> -
- - -
- - + }
diff --git a/src/views/mod-tools/views/room/ModToolsRoomView.scss b/src/views/mod-tools/views/room/ModToolsRoomView.scss index 55ed938a..4faa2b33 100644 --- a/src/views/mod-tools/views/room/ModToolsRoomView.scss +++ b/src/views/mod-tools/views/room/ModToolsRoomView.scss @@ -1,3 +1,8 @@ .nitro-mod-tools-room { width: 240px; + + .username { + color: #1E7295; + text-decoration: underline; + } } diff --git a/src/views/mod-tools/views/room/ModToolsRoomView.tsx b/src/views/mod-tools/views/room/ModToolsRoomView.tsx index c236a9d2..a6bd2a7b 100644 --- a/src/views/mod-tools/views/room/ModToolsRoomView.tsx +++ b/src/views/mod-tools/views/room/ModToolsRoomView.tsx @@ -1,5 +1,8 @@ import { ModtoolRequestRoomInfoComposer, ModtoolRoomInfoEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; +import { TryVisitRoom } from '../../../../api'; +import { ModToolsOpenRoomChatlogEvent } from '../../../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; +import { dispatchUiEvent } from '../../../../hooks'; import { CreateMessageHook, SendMessageHook } from '../../../../hooks/messages'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; import { ModToolsRoomViewProps } from './ModToolsRoomView.types'; @@ -57,15 +60,15 @@ export const ModToolsRoomView: FC = props =>
- Room Owner: { ownerName } + Room Owner: { ownerName }
- +
Users in room: { usersInRoom }
- +
diff --git a/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx b/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx new file mode 100644 index 00000000..23b1590d --- /dev/null +++ b/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx @@ -0,0 +1,41 @@ +import { ChatRecordData, ModtoolRequestUserChatlogComposer, ModtoolUserChatlogEvent } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { CreateMessageHook, SendMessageHook } from '../../../../hooks'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; +import { ChatlogView } from '../chatlog/ChatlogView'; +import { ModToolsUserChatlogViewProps } from './ModToolsUserChatlogView.types'; + +export const ModToolsUserChatlogView: FC = props => +{ + const { userId = null, onCloseClick = null } = props; + const [userChatlog, setUserChatlog] = useState(null); + const [username, setUsername] = useState(null); + + useEffect(() => + { + SendMessageHook(new ModtoolRequestUserChatlogComposer(userId)); + }, [userId]); + + const onModtoolUserChatlogEvent = useCallback((event: ModtoolUserChatlogEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + setUsername(parser.username); + setUserChatlog(parser.roomVisits); + }, [setUsername, setUserChatlog]); + + CreateMessageHook(ModtoolUserChatlogEvent, onModtoolUserChatlogEvent); + + return ( + + onCloseClick()} /> + + {userChatlog && + + } + + + ); +} diff --git a/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.types.ts b/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.types.ts new file mode 100644 index 00000000..c8eea569 --- /dev/null +++ b/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.types.ts @@ -0,0 +1,5 @@ +export interface ModToolsUserChatlogViewProps +{ + userId: number; + onCloseClick: () => void; +} diff --git a/src/views/mod-tools/views/user/ModToolsUserView.scss b/src/views/mod-tools/views/user/ModToolsUserView.scss new file mode 100644 index 00000000..05757d6c --- /dev/null +++ b/src/views/mod-tools/views/user/ModToolsUserView.scss @@ -0,0 +1,8 @@ +.nitro-mod-tools-user { + width: 240px; + + .username { + color: #1E7295; + text-decoration: underline; + } +} diff --git a/src/views/mod-tools/views/user/ModToolsUserView.tsx b/src/views/mod-tools/views/user/ModToolsUserView.tsx index d3a2f076..03c109fa 100644 --- a/src/views/mod-tools/views/user/ModToolsUserView.tsx +++ b/src/views/mod-tools/views/user/ModToolsUserView.tsx @@ -1,14 +1,58 @@ -import { FC } from 'react'; +import { ModeratorUserInfoData, ModtoolRequestUserInfoComposer, ModtoolUserInfoEvent } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { ModToolsOpenUserChatlogEvent } from '../../../../events/mod-tools/ModToolsOpenUserChatlogEvent'; +import { CreateMessageHook, dispatchUiEvent, SendMessageHook } from '../../../../hooks'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; +import { AvatarImageView } from '../../../shared/avatar-image/AvatarImageView'; import { ModToolsUserViewProps } from './ModToolsUserView.types'; export const ModToolsUserView: FC = props => { + const { onCloseClick = null, userId = null, simple = true } = props; + const [userInfo, setUserInfo] = useState(null); + + useEffect(() => + { + SendMessageHook(new ModtoolRequestUserInfoComposer(userId)); + }, [userId]); + + + const onModtoolUserInfoEvent = useCallback((event: ModtoolUserInfoEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + console.log(parser); + setUserInfo(parser.data); + }, [setUserInfo]); + + CreateMessageHook(ModtoolUserInfoEvent, onModtoolUserInfoEvent); + return ( - - {} } /> + + onCloseClick()} /> - + {userInfo && + <> + {!simple && +
+ +
+ } +
+
+ Name: {userInfo.userName} +
+ +
+
+
+ CFHs: {userInfo.cfhCount} +
+
+ + }
); diff --git a/src/views/mod-tools/views/user/ModToolsUserView.types.ts b/src/views/mod-tools/views/user/ModToolsUserView.types.ts index 55b9477c..21d30670 100644 --- a/src/views/mod-tools/views/user/ModToolsUserView.types.ts +++ b/src/views/mod-tools/views/user/ModToolsUserView.types.ts @@ -1,2 +1,6 @@ export interface ModToolsUserViewProps -{} +{ + userId: number; + onCloseClick: () => void; + simple?: boolean; +} From 8b4a09bdf68c7b1d960b5467be9146740f600f17 Mon Sep 17 00:00:00 2001 From: dank074 Date: Tue, 19 Oct 2021 16:35:46 -0500 Subject: [PATCH 08/29] remove console logs --- src/views/mod-tools/views/chatlog/ChatlogView.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.tsx b/src/views/mod-tools/views/chatlog/ChatlogView.tsx index 563bf700..426fd5a6 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/views/mod-tools/views/chatlog/ChatlogView.tsx @@ -52,13 +52,11 @@ export const ChatlogView: FC = props => if( (props.index + 1) === (totalIndex - currentRecord.chatlog.length)) { - console.log(`global: ${props.index} roomInfo ${currentRecord.roomName}`); isRoomInfo = true; break; } const index = props.index - (totalIndex - currentRecord.chatlog.length); chatlogEntry = currentRecord.chatlog[index]; - console.log(`global: ${props.index} local: ${index} value: ${chatlogEntry}`); break; } From c959bbc25547a1ce54d60374e248c971998622a7 Mon Sep 17 00:00:00 2001 From: dank074 Date: Tue, 19 Oct 2021 16:41:13 -0500 Subject: [PATCH 09/29] fix mod tools packet listener --- .../mod-tools/views/room-chatlog/ModToolsChatlogView.tsx | 4 ++-- src/views/mod-tools/views/room/ModToolsRoomView.tsx | 4 +++- .../mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx | 4 ++-- src/views/mod-tools/views/user/ModToolsUserView.tsx | 5 ++--- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx index b1799000..2c23264f 100644 --- a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx +++ b/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx @@ -20,10 +20,10 @@ export const ModToolsChatlogView: FC = props => { const parser = event.getParser(); - if(!parser) return; + if(!parser || parser.data.roomId !== roomId) return; setRoomChatlog(parser.data); - }, [setRoomChatlog]); + }, [roomId, setRoomChatlog]); CreateMessageHook(ModtoolRoomChatlogEvent, onModtoolRoomChatlogEvent); diff --git a/src/views/mod-tools/views/room/ModToolsRoomView.tsx b/src/views/mod-tools/views/room/ModToolsRoomView.tsx index a6bd2a7b..31d8459f 100644 --- a/src/views/mod-tools/views/room/ModToolsRoomView.tsx +++ b/src/views/mod-tools/views/room/ModToolsRoomView.tsx @@ -32,13 +32,15 @@ export const ModToolsRoomView: FC = props => { const parser = event.getParser(); + if(!parser || parser.id !== roomId) return; + setLoadedRoomId(parser.id); setName(parser.name); setOwnerId(parser.ownerId); setOwnerName(parser.ownerName); setOwnerInRoom(parser.ownerInRoom); setUsersInRoom(parser.playerAmount); - }, [ setLoadedRoomId, setName, setOwnerId, setOwnerName, setOwnerInRoom, setUsersInRoom ]); + }, [ setLoadedRoomId, setName, setOwnerId, setOwnerName, setOwnerInRoom, setUsersInRoom, roomId ]); CreateMessageHook(ModtoolRoomInfoEvent, onModtoolRoomInfoEvent); diff --git a/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx b/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx index 23b1590d..d2ca9bd0 100644 --- a/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx +++ b/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx @@ -20,11 +20,11 @@ export const ModToolsUserChatlogView: FC = props = { const parser = event.getParser(); - if(!parser) return; + if(!parser || parser.userId !== userId) return; setUsername(parser.username); setUserChatlog(parser.roomVisits); - }, [setUsername, setUserChatlog]); + }, [setUsername, setUserChatlog, userId]); CreateMessageHook(ModtoolUserChatlogEvent, onModtoolUserChatlogEvent); diff --git a/src/views/mod-tools/views/user/ModToolsUserView.tsx b/src/views/mod-tools/views/user/ModToolsUserView.tsx index 03c109fa..373bd2df 100644 --- a/src/views/mod-tools/views/user/ModToolsUserView.tsx +++ b/src/views/mod-tools/views/user/ModToolsUserView.tsx @@ -21,11 +21,10 @@ export const ModToolsUserView: FC = props => { const parser = event.getParser(); - if(!parser) return; + if(!parser || parser.data.userId !== userId) return; - console.log(parser); setUserInfo(parser.data); - }, [setUserInfo]); + }, [setUserInfo, userId]); CreateMessageHook(ModtoolUserInfoEvent, onModtoolUserInfoEvent); From e81cc1e7fd4a51e6c069eb2c5e6f7092573ea2e7 Mon Sep 17 00:00:00 2001 From: dank074 Date: Tue, 19 Oct 2021 19:04:58 -0500 Subject: [PATCH 10/29] style changes --- src/views/mod-tools/ModToolsView.scss | 4 +- src/views/mod-tools/ModToolsView.tsx | 8 +- src/views/mod-tools/utils/IUserInfo.ts | 6 + .../mod-tools/views/chatlog/ChatlogView.scss | 1 + .../room-chatlog/ModToolsChatlogView.tsx | 6 +- .../room-chatlog/ModToolsChatlogView.types.ts | 0 .../{ => room-tools}/ModToolsRoomView.scss | 0 .../{ => room-tools}/ModToolsRoomView.tsx | 46 +++-- .../ModToolsRoomView.types.ts | 0 .../views/user/ModToolsUserView.scss | 8 - .../mod-tools/views/user/ModToolsUserView.tsx | 58 ------- .../user-chatlog/ModToolsUserChatlogView.tsx | 6 +- .../ModToolsUserChatlogView.types.ts | 0 .../user/user-info/ModToolsUserView.scss | 27 +++ .../views/user/user-info/ModToolsUserView.tsx | 161 ++++++++++++++++++ .../{ => user-info}/ModToolsUserView.types.ts | 0 16 files changed, 236 insertions(+), 95 deletions(-) create mode 100644 src/views/mod-tools/utils/IUserInfo.ts rename src/views/mod-tools/views/{ => room}/room-chatlog/ModToolsChatlogView.tsx (93%) rename src/views/mod-tools/views/{ => room}/room-chatlog/ModToolsChatlogView.types.ts (100%) rename src/views/mod-tools/views/room/{ => room-tools}/ModToolsRoomView.scss (100%) rename src/views/mod-tools/views/room/{ => room-tools}/ModToolsRoomView.tsx (68%) rename src/views/mod-tools/views/room/{ => room-tools}/ModToolsRoomView.types.ts (100%) delete mode 100644 src/views/mod-tools/views/user/ModToolsUserView.scss delete mode 100644 src/views/mod-tools/views/user/ModToolsUserView.tsx rename src/views/mod-tools/views/{ => user}/user-chatlog/ModToolsUserChatlogView.tsx (94%) rename src/views/mod-tools/views/{ => user}/user-chatlog/ModToolsUserChatlogView.types.ts (100%) create mode 100644 src/views/mod-tools/views/user/user-info/ModToolsUserView.scss create mode 100644 src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx rename src/views/mod-tools/views/user/{ => user-info}/ModToolsUserView.types.ts (100%) diff --git a/src/views/mod-tools/ModToolsView.scss b/src/views/mod-tools/ModToolsView.scss index 73b4142d..c340a20f 100644 --- a/src/views/mod-tools/ModToolsView.scss +++ b/src/views/mod-tools/ModToolsView.scss @@ -2,6 +2,6 @@ width: 200px; } -@import './views/room/ModToolsRoomView'; +@import './views/room/room-tools/ModToolsRoomView'; @import './views/chatlog/ChatlogView'; -@import './views/user/ModToolsUserView'; +@import './views/user/user-info/ModToolsUserView'; diff --git a/src/views/mod-tools/ModToolsView.tsx b/src/views/mod-tools/ModToolsView.tsx index 3c5dec10..71964dc0 100644 --- a/src/views/mod-tools/ModToolsView.tsx +++ b/src/views/mod-tools/ModToolsView.tsx @@ -13,11 +13,11 @@ import { ModToolsContextProvider } from './context/ModToolsContext'; import { ModToolsViewProps } from './ModToolsView.types'; import { initialModTools, ModToolsActions, ModToolsReducer } from './reducers/ModToolsReducer'; import { ISelectedUser } from './utils/ISelectedUser'; -import { ModToolsChatlogView } from './views/room-chatlog/ModToolsChatlogView'; -import { ModToolsRoomView } from './views/room/ModToolsRoomView'; +import { ModToolsChatlogView } from './views/room/room-chatlog/ModToolsChatlogView'; +import { ModToolsRoomView } from './views/room/room-tools/ModToolsRoomView'; import { ModToolsTicketsView } from './views/tickets/ModToolsTicketsView'; -import { ModToolsUserChatlogView } from './views/user-chatlog/ModToolsUserChatlogView'; -import { ModToolsUserView } from './views/user/ModToolsUserView'; +import { ModToolsUserChatlogView } from './views/user/user-chatlog/ModToolsUserChatlogView'; +import { ModToolsUserView } from './views/user/user-info/ModToolsUserView'; export const ModToolsView: FC = props => { diff --git a/src/views/mod-tools/utils/IUserInfo.ts b/src/views/mod-tools/utils/IUserInfo.ts new file mode 100644 index 00000000..8d49aa74 --- /dev/null +++ b/src/views/mod-tools/utils/IUserInfo.ts @@ -0,0 +1,6 @@ +export interface IUserInfo +{ + nameKey: string; + nameKeyFallback: string; + value: string; +} diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.scss b/src/views/mod-tools/views/chatlog/ChatlogView.scss index 33df955a..0b61e1d1 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.scss +++ b/src/views/mod-tools/views/chatlog/ChatlogView.scss @@ -29,6 +29,7 @@ .room-info { border-bottom: 1px solid rgba(0, 0, 0, 0.2); + background: rgba(0, 0, 0, .05); } } } diff --git a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx b/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx similarity index 93% rename from src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx rename to src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx index 2c23264f..77573e30 100644 --- a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.tsx +++ b/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx @@ -1,8 +1,8 @@ import { ChatRecordData, ModtoolRequestRoomChatlogComposer, ModtoolRoomChatlogEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { CreateMessageHook, SendMessageHook } from '../../../../hooks/messages'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; -import { ChatlogView } from '../chatlog/ChatlogView'; +import { CreateMessageHook, SendMessageHook } from '../../../../../hooks/messages'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; +import { ChatlogView } from '../../chatlog/ChatlogView'; import { ModToolsChatlogViewProps } from './ModToolsChatlogView.types'; export const ModToolsChatlogView: FC = props => diff --git a/src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.types.ts b/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.types.ts similarity index 100% rename from src/views/mod-tools/views/room-chatlog/ModToolsChatlogView.types.ts rename to src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.types.ts diff --git a/src/views/mod-tools/views/room/ModToolsRoomView.scss b/src/views/mod-tools/views/room/room-tools/ModToolsRoomView.scss similarity index 100% rename from src/views/mod-tools/views/room/ModToolsRoomView.scss rename to src/views/mod-tools/views/room/room-tools/ModToolsRoomView.scss diff --git a/src/views/mod-tools/views/room/ModToolsRoomView.tsx b/src/views/mod-tools/views/room/room-tools/ModToolsRoomView.tsx similarity index 68% rename from src/views/mod-tools/views/room/ModToolsRoomView.tsx rename to src/views/mod-tools/views/room/room-tools/ModToolsRoomView.tsx index 31d8459f..6a5c69e3 100644 --- a/src/views/mod-tools/views/room/ModToolsRoomView.tsx +++ b/src/views/mod-tools/views/room/room-tools/ModToolsRoomView.tsx @@ -1,10 +1,10 @@ -import { ModtoolRequestRoomInfoComposer, ModtoolRoomInfoEvent } from '@nitrots/nitro-renderer'; +import { ModerateRoomMessageComposer, ModeratorActionMessageComposer, ModtoolRequestRoomInfoComposer, ModtoolRoomInfoEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { TryVisitRoom } from '../../../../api'; -import { ModToolsOpenRoomChatlogEvent } from '../../../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; -import { dispatchUiEvent } from '../../../../hooks'; -import { CreateMessageHook, SendMessageHook } from '../../../../hooks/messages'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; +import { TryVisitRoom } from '../../../../../api'; +import { ModToolsOpenRoomChatlogEvent } from '../../../../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; +import { dispatchUiEvent } from '../../../../../hooks'; +import { CreateMessageHook, SendMessageHook } from '../../../../../hooks/messages'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; import { ModToolsRoomViewProps } from './ModToolsRoomView.types'; export const ModToolsRoomView: FC = props => @@ -20,6 +20,12 @@ export const ModToolsRoomView: FC = props => const [ ownerInRoom, setOwnerInRoom ] = useState(false); const [ usersInRoom, setUsersInRoom ] = useState(0); + //form data + const [kickUsers, setKickUsers] = useState(false); + const [lockRoom, setLockRoom] = useState(false); + const [changeRoomName, setChangeRoomName] = useState(false); + const [message, setMessage] = useState(''); + useEffect(() => { if(infoRequested) return; @@ -50,15 +56,21 @@ export const ModToolsRoomView: FC = props => switch(action) { - case 'close': - onCloseClick(); + case 'alert_only': + if(message.trim().length === 0) return; + SendMessageHook(new ModeratorActionMessageComposer(ModeratorActionMessageComposer.ACTION_ALERT, message, '')); + return; + case 'send_message': + if(message.trim().length === 0) return; + SendMessageHook(new ModeratorActionMessageComposer(ModeratorActionMessageComposer.ACTION_MESSAGE, message, '')); + SendMessageHook(new ModerateRoomMessageComposer(roomId, lockRoom ? 1 : 0, changeRoomName ? 1 : 0, kickUsers ? 1 : 0)) return; } - }, [ onCloseClick ]); + }, [changeRoomName, kickUsers, lockRoom, message, roomId]); return ( - handleClick('close') } /> + onCloseClick() } />
@@ -80,28 +92,28 @@ export const ModToolsRoomView: FC = props =>
- + setKickUsers(e.target.checked)}/>
- + setLockRoom(e.target.checked)}/>
- -
- +
- - + +
diff --git a/src/views/mod-tools/views/room/ModToolsRoomView.types.ts b/src/views/mod-tools/views/room/room-tools/ModToolsRoomView.types.ts similarity index 100% rename from src/views/mod-tools/views/room/ModToolsRoomView.types.ts rename to src/views/mod-tools/views/room/room-tools/ModToolsRoomView.types.ts diff --git a/src/views/mod-tools/views/user/ModToolsUserView.scss b/src/views/mod-tools/views/user/ModToolsUserView.scss deleted file mode 100644 index 05757d6c..00000000 --- a/src/views/mod-tools/views/user/ModToolsUserView.scss +++ /dev/null @@ -1,8 +0,0 @@ -.nitro-mod-tools-user { - width: 240px; - - .username { - color: #1E7295; - text-decoration: underline; - } -} diff --git a/src/views/mod-tools/views/user/ModToolsUserView.tsx b/src/views/mod-tools/views/user/ModToolsUserView.tsx deleted file mode 100644 index 373bd2df..00000000 --- a/src/views/mod-tools/views/user/ModToolsUserView.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { ModeratorUserInfoData, ModtoolRequestUserInfoComposer, ModtoolUserInfoEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; -import { ModToolsOpenUserChatlogEvent } from '../../../../events/mod-tools/ModToolsOpenUserChatlogEvent'; -import { CreateMessageHook, dispatchUiEvent, SendMessageHook } from '../../../../hooks'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; -import { AvatarImageView } from '../../../shared/avatar-image/AvatarImageView'; -import { ModToolsUserViewProps } from './ModToolsUserView.types'; - -export const ModToolsUserView: FC = props => -{ - const { onCloseClick = null, userId = null, simple = true } = props; - const [userInfo, setUserInfo] = useState(null); - - useEffect(() => - { - SendMessageHook(new ModtoolRequestUserInfoComposer(userId)); - }, [userId]); - - - const onModtoolUserInfoEvent = useCallback((event: ModtoolUserInfoEvent) => - { - const parser = event.getParser(); - - if(!parser || parser.data.userId !== userId) return; - - setUserInfo(parser.data); - }, [setUserInfo, userId]); - - CreateMessageHook(ModtoolUserInfoEvent, onModtoolUserInfoEvent); - - return ( - - onCloseClick()} /> - - {userInfo && - <> - {!simple && -
- -
- } -
-
- Name: {userInfo.userName} -
- -
-
-
- CFHs: {userInfo.cfhCount} -
-
- - } -
-
- ); -} diff --git a/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx b/src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.tsx similarity index 94% rename from src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx rename to src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.tsx index d2ca9bd0..0da179cb 100644 --- a/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.tsx +++ b/src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.tsx @@ -1,8 +1,8 @@ import { ChatRecordData, ModtoolRequestUserChatlogComposer, ModtoolUserChatlogEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; -import { CreateMessageHook, SendMessageHook } from '../../../../hooks'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../layout'; -import { ChatlogView } from '../chatlog/ChatlogView'; +import { CreateMessageHook, SendMessageHook } from '../../../../../hooks'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; +import { ChatlogView } from '../../chatlog/ChatlogView'; import { ModToolsUserChatlogViewProps } from './ModToolsUserChatlogView.types'; export const ModToolsUserChatlogView: FC = props => diff --git a/src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.types.ts b/src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.types.ts similarity index 100% rename from src/views/mod-tools/views/user-chatlog/ModToolsUserChatlogView.types.ts rename to src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.types.ts diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss b/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss new file mode 100644 index 00000000..202b92fa --- /dev/null +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss @@ -0,0 +1,27 @@ +.nitro-mod-tools-user { + width: 350px; + height: 400px; + + .username { + color: #1E7295; + text-decoration: underline; + } + + .table { + color: $black; + + > :not(caption) > * > * { + box-shadow: none; + border-bottom: 1px solid rgba(0, 0, 0, .2); + } + + &.table-striped > tbody > tr:nth-of-type(odd) { + color: $black; + background: rgba(0, 0, 0, .05); + } + + td { + padding: 0px 5px; + } + } +} diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx new file mode 100644 index 00000000..762dcc3d --- /dev/null +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx @@ -0,0 +1,161 @@ +import { FriendlyTime, ModeratorUserInfoData, ModtoolRequestUserInfoComposer, ModtoolUserInfoEvent } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { ModToolsOpenUserChatlogEvent } from '../../../../../events/mod-tools/ModToolsOpenUserChatlogEvent'; +import { CreateMessageHook, dispatchUiEvent, SendMessageHook } from '../../../../../hooks'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; +import { AvatarImageView } from '../../../../shared/avatar-image/AvatarImageView'; +import { IUserInfo } from '../../../utils/IUserInfo'; +import { ModToolsUserViewProps } from './ModToolsUserView.types'; + + +export const ModToolsUserView: FC = props => +{ + const { onCloseClick = null, userId = null, simple = true } = props; + const [userInfo, setUserInfo] = useState(null); + + useEffect(() => + { + SendMessageHook(new ModtoolRequestUserInfoComposer(userId)); + }, [userId]); + + + const onModtoolUserInfoEvent = useCallback((event: ModtoolUserInfoEvent) => + { + const parser = event.getParser(); + + if(!parser || parser.data.userId !== userId) return; + + setUserInfo(parser.data); + }, [setUserInfo, userId]); + + CreateMessageHook(ModtoolUserInfoEvent, onModtoolUserInfoEvent); + + const OnlineIcon = useCallback(() => + { + if(userInfo.online) return (); + else return (); + }, [userInfo]); + + const userProperties = useCallback(() => + { + let properties: IUserInfo[] = []; + + if(!userInfo) return properties; + + properties = [ + { + nameKey: 'name', + nameKeyFallback: 'Name', + value: userInfo.userName + }, + { + nameKey: 'cfhs', + nameKeyFallback: 'CFHs', + value: userInfo.cfhCount.toString() + }, + { + nameKey: 'abusive_cfhs', + nameKeyFallback: 'Abusive CFHs', + value: userInfo.abusiveCfhCount.toString() + }, + { + nameKey: 'cautions', + nameKeyFallback: 'Cautions', + value: userInfo.cautionCount.toString() + }, + { + nameKey: 'bans', + nameKeyFallback: 'Bans', + value: userInfo.banCount.toString() + }, + { + nameKey: 'last_sanction', + nameKeyFallback: 'Last sanction', + value: userInfo.lastSanctionTime + }, + { + nameKey: 'trade_locks', + nameKeyFallback: 'Trade locks', + value: userInfo.tradingLockCount.toString() + }, + { + nameKey: 'lock_expires', + nameKeyFallback: 'Lock expires', + value: userInfo.tradingExpiryDate + }, + { + nameKey: 'last_login', + nameKeyFallback: 'Last login', + value: FriendlyTime.format(userInfo.minutesSinceLastLogin * 60, '.ago', 2) + }, + { + nameKey: 'purchase', + nameKeyFallback: 'Purchases', + value: userInfo.lastPurchaseDate + }, + { + nameKey: 'email', + nameKeyFallback: 'Email', + value: userInfo.primaryEmailAddress + }, + { + nameKey: 'acc_bans', + nameKeyFallback: 'Banned Accs.', + value: userInfo.identityRelatedBanCount.toString() + }, + { + nameKey: 'registered', + nameKeyFallback: 'Registered', + value: FriendlyTime.format(userInfo.registrationAgeInMinutes * 60, '.ago', 2) + }, + { + nameKey: 'rank', + nameKeyFallback: 'Rank', + value: userInfo.userClassification + } + ]; + + return properties; + + }, [userInfo]); + + return ( + + onCloseClick()} /> + + {userInfo && +
+ {!simple && +
+ +
+ } +
+ + + {userProperties().map(property => + { + return ( + + + + + ) + })} + +
{property.nameKeyFallback} + {property.value} {(property.nameKey === 'name') && } +
+
+
+ + + + +
+
+ } +
+
+ ); +} diff --git a/src/views/mod-tools/views/user/ModToolsUserView.types.ts b/src/views/mod-tools/views/user/user-info/ModToolsUserView.types.ts similarity index 100% rename from src/views/mod-tools/views/user/ModToolsUserView.types.ts rename to src/views/mod-tools/views/user/user-info/ModToolsUserView.types.ts From 59dfb8d9b4d58918c2fa1d7ae0521c74e7580689 Mon Sep 17 00:00:00 2001 From: dank074 Date: Tue, 19 Oct 2021 21:48:43 -0500 Subject: [PATCH 11/29] added user room visits view --- src/views/mod-tools/ModToolsView.scss | 1 + src/views/mod-tools/ModToolsView.tsx | 19 +++++- .../mod-tools/reducers/ModToolsReducer.tsx | 10 +++ .../user/user-info/ModToolsUserView.scss | 2 +- .../views/user/user-info/ModToolsUserView.tsx | 17 ++++- .../ModToolsUserModActionView.tsx | 17 +++++ .../ModToolsUserModActionView.types.ts | 7 ++ .../ModToolsUserRoomVisitsView.scss | 14 ++++ .../ModToolsUserRoomVisitsView.tsx | 66 +++++++++++++++++++ .../ModToolsUserRoomVisitsView.types.ts | 5 ++ .../ModToolsSendUserMessage.types.ts | 7 ++ .../ModToolsSendUserMessageView.tsx | 37 +++++++++++ 12 files changed, 197 insertions(+), 5 deletions(-) create mode 100644 src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx create mode 100644 src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.types.ts create mode 100644 src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.scss create mode 100644 src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx create mode 100644 src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.types.ts create mode 100644 src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessage.types.ts create mode 100644 src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessageView.tsx diff --git a/src/views/mod-tools/ModToolsView.scss b/src/views/mod-tools/ModToolsView.scss index c340a20f..be84aaef 100644 --- a/src/views/mod-tools/ModToolsView.scss +++ b/src/views/mod-tools/ModToolsView.scss @@ -5,3 +5,4 @@ @import './views/room/room-tools/ModToolsRoomView'; @import './views/chatlog/ChatlogView'; @import './views/user/user-info/ModToolsUserView'; +@import './views/user/user-room-visits/ModToolsUserRoomVisitsView'; diff --git a/src/views/mod-tools/ModToolsView.tsx b/src/views/mod-tools/ModToolsView.tsx index 71964dc0..9df029de 100644 --- a/src/views/mod-tools/ModToolsView.tsx +++ b/src/views/mod-tools/ModToolsView.tsx @@ -1,4 +1,4 @@ -import { RoomEngineEvent, RoomEngineObjectEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { ModeratorInitMessageEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC, useCallback, useReducer, useState } from 'react'; import { GetRoomSession } from '../../api'; import { ModToolsEvent } from '../../events/mod-tools/ModToolsEvent'; @@ -6,6 +6,7 @@ import { ModToolsOpenRoomChatlogEvent } from '../../events/mod-tools/ModToolsOpe import { ModToolsOpenRoomInfoEvent } from '../../events/mod-tools/ModToolsOpenRoomInfoEvent'; import { ModToolsOpenUserChatlogEvent } from '../../events/mod-tools/ModToolsOpenUserChatlogEvent'; import { ModToolsOpenUserInfoEvent } from '../../events/mod-tools/ModToolsOpenUserInfoEvent'; +import { CreateMessageHook } from '../../hooks'; import { useRoomEngineEvent } from '../../hooks/events'; import { dispatchUiEvent, useUiEvent } from '../../hooks/events/ui/ui-event'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../layout'; @@ -154,6 +155,22 @@ export const ModToolsView: FC = props => useRoomEngineEvent(RoomEngineObjectEvent.SELECTED, onRoomEngineObjectEvent); + const onModeratorInitMessageEvent = useCallback((event: ModeratorInitMessageEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + dispatchModToolsState({ + type: ModToolsActions.SET_INIT_DATA, + payload: { + settings: parser.data + } + }); + }, []); + + CreateMessageHook(ModeratorInitMessageEvent, onModeratorInitMessageEvent); + const handleClick = useCallback((action: string, value?: string) => { if(!action) return; diff --git a/src/views/mod-tools/reducers/ModToolsReducer.tsx b/src/views/mod-tools/reducers/ModToolsReducer.tsx index 9301e941..c2c9df87 100644 --- a/src/views/mod-tools/reducers/ModToolsReducer.tsx +++ b/src/views/mod-tools/reducers/ModToolsReducer.tsx @@ -1,7 +1,9 @@ +import { ModeratorInitData } from '@nitrots/nitro-renderer'; import { Reducer } from 'react'; export interface IModToolsState { + settings: ModeratorInitData; currentRoomId: number; openRooms: number[]; openRoomChatlogs: number[]; @@ -13,6 +15,7 @@ export interface IModToolsAction { type: string; payload: { + settings?: ModeratorInitData; currentRoomId?: number; openRooms?: number[]; openRoomChatlogs?: number[]; @@ -23,6 +26,7 @@ export interface IModToolsAction export class ModToolsActions { + public static SET_INIT_DATA: string = 'MTA_SET_INIT_DATA'; public static SET_CURRENT_ROOM_ID: string = 'MTA_SET_CURRENT_ROOM_ID'; public static SET_OPEN_ROOMS: string = 'MTA_SET_OPEN_ROOMS'; public static SET_OPEN_USERINFO: string = 'MTA_SET_OPEN_USERINFO'; @@ -32,6 +36,7 @@ export class ModToolsActions } export const initialModTools: IModToolsState = { + settings: null, currentRoomId: null, openRooms: null, openRoomChatlogs: null, @@ -43,6 +48,11 @@ export const ModToolsReducer: Reducer = (state, { switch(action.type) { + case ModToolsActions.SET_INIT_DATA: { + const data = (action.payload.settings || state.settings || null); + + return { ...state, data }; + } case ModToolsActions.SET_CURRENT_ROOM_ID: { const currentRoomId = (action.payload.currentRoomId || state.currentRoomId || null); diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss b/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss index 202b92fa..cb138384 100644 --- a/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss @@ -1,6 +1,6 @@ .nitro-mod-tools-user { width: 350px; - height: 400px; + height: 370px; .username { color: #1E7295; diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx index 762dcc3d..b056553b 100644 --- a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx @@ -5,6 +5,9 @@ import { CreateMessageHook, dispatchUiEvent, SendMessageHook } from '../../../.. import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; import { AvatarImageView } from '../../../../shared/avatar-image/AvatarImageView'; import { IUserInfo } from '../../../utils/IUserInfo'; +import { ModToolsUserModActionView } from '../user-mod-action/ModToolsUserModActionView'; +import { ModToolsUserRoomVisitsView } from '../user-room-visits/ModToolsUserRoomVisitsView'; +import { ModToolsSendUserMessageView } from '../user-sendmessage/ModToolsSendUserMessageView'; import { ModToolsUserViewProps } from './ModToolsUserView.types'; @@ -12,6 +15,9 @@ export const ModToolsUserView: FC = props => { const { onCloseClick = null, userId = null, simple = true } = props; const [userInfo, setUserInfo] = useState(null); + const [sendMessageVisible, setSendMessageVisible] = useState(false); + const [modActionVisible, setModActionVisible] = useState(false); + const [roomVisitsVisible, setRoomVisitsVisible] = useState(false); useEffect(() => { @@ -120,6 +126,7 @@ export const ModToolsUserView: FC = props => }, [userInfo]); return ( + <> onCloseClick()} /> @@ -149,13 +156,17 @@ export const ModToolsUserView: FC = props =>
- - - + + +
} + {(sendMessageVisible && userInfo) && setSendMessageVisible(false)}/>} + {(userInfo && modActionVisible) && setModActionVisible(false)}/>} + {(userInfo && roomVisitsVisible) && setRoomVisitsVisible(false)}/>} + ); } diff --git a/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx new file mode 100644 index 00000000..c78f12f6 --- /dev/null +++ b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx @@ -0,0 +1,17 @@ +import { FC } from 'react'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; +import { ModToolsUserModActionViewProps } from './ModToolsUserModActionView.types'; + +export const ModToolsUserModActionView: FC = props => +{ + const { user = null, onCloseClick = null } = props; + + return ( + + onCloseClick()} /> + + {user &&
} +
+
+ ); +} diff --git a/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.types.ts b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.types.ts new file mode 100644 index 00000000..2025d10d --- /dev/null +++ b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.types.ts @@ -0,0 +1,7 @@ +import { ISelectedUser } from '../../../utils/ISelectedUser'; + +export interface ModToolsUserModActionViewProps +{ + user: ISelectedUser; + onCloseClick: () => void; +} diff --git a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.scss b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.scss new file mode 100644 index 00000000..46efbaa5 --- /dev/null +++ b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.scss @@ -0,0 +1,14 @@ +.nitro-mod-tools-user-visits { + min-width: 300px; + + .user-visits { + min-height: 200px; + + .roomvisits-container { + div.room-visit { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + } + } + + } +} diff --git a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx new file mode 100644 index 00000000..8d1a709e --- /dev/null +++ b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx @@ -0,0 +1,66 @@ +import { ModtoolReceivedRoomsUserEvent, ModtoolRequestUserRoomsComposer, ModtoolRoomVisitedData } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { AutoSizer, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; +import { CreateMessageHook, SendMessageHook } from '../../../../../hooks'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; +import { ModToolsUserRoomVisitsViewProps } from './ModToolsUserRoomVisitsView.types'; + +export const ModToolsUserRoomVisitsView: FC = props => +{ + const { userId = null, onCloseClick = null } = props; + + const [roomVisitData, setRoomVisitData] = useState(null); + + useEffect(() => + { + SendMessageHook(new ModtoolRequestUserRoomsComposer(userId)); + }, [userId]); + + const onModtoolReceivedRoomsUserEvent = useCallback((event: ModtoolReceivedRoomsUserEvent) => + { + const parser = event.getParser(); + + if(!parser || parser.data.userId !== userId) return; + + setRoomVisitData(parser.data); + }, [userId]); + + CreateMessageHook(ModtoolReceivedRoomsUserEvent, onModtoolReceivedRoomsUserEvent); + + const RowRenderer: ListRowRenderer = (props: ListRowProps) => + { + const item = roomVisitData.rooms[props.index]; + + return ( +
+ {item.enterHour}:{item.enterMinute} Room: {item.roomName} +
); + } + + return ( + + onCloseClick()} /> + + {roomVisitData && +
+ + {({ height, width }) => + { + return ( + + ) + }} + +
+ } +
+
+ ); +} diff --git a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.types.ts b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.types.ts new file mode 100644 index 00000000..8aaebec5 --- /dev/null +++ b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.types.ts @@ -0,0 +1,5 @@ +export interface ModToolsUserRoomVisitsViewProps +{ + userId: number; + onCloseClick: () => void; +} diff --git a/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessage.types.ts b/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessage.types.ts new file mode 100644 index 00000000..617945f0 --- /dev/null +++ b/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessage.types.ts @@ -0,0 +1,7 @@ +import { ISelectedUser } from '../../../utils/ISelectedUser'; + +export interface ModToolsSendUserMessageViewProps +{ + user: ISelectedUser; + onCloseClick: () => void; +} diff --git a/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessageView.tsx b/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessageView.tsx new file mode 100644 index 00000000..7305bf93 --- /dev/null +++ b/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessageView.tsx @@ -0,0 +1,37 @@ +import { ModMessageMessageComposer } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useState } from 'react'; +import { SendMessageHook } from '../../../../../hooks'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; +import { ModToolsSendUserMessageViewProps } from './ModToolsSendUserMessage.types'; + +export const ModToolsSendUserMessageView: FC = props => +{ + const { user = null, onCloseClick = null } = props; + const [message, setMessage] = useState(''); + + + const sendMessage = useCallback(() => + { + if(message.trim().length === 0) return; + + SendMessageHook(new ModMessageMessageComposer(user.userId, message, -999)); + }, [message, user.userId]); + + return ( + + onCloseClick()} /> + + {user && <> +
Message To: {user.username}
+
+ +
+ +
+ +
+ } +
+
+ ); +} From 0f7b13a8fc5d6e056fcaff55868ced85077fb6b9 Mon Sep 17 00:00:00 2001 From: dank074 Date: Wed, 20 Oct 2021 01:01:26 -0500 Subject: [PATCH 12/29] style changes to room visits --- src/views/mod-tools/ModToolsView.tsx | 12 ++---- .../ModToolsUserRoomVisitsView.tsx | 41 ++++++++++--------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/views/mod-tools/ModToolsView.tsx b/src/views/mod-tools/ModToolsView.tsx index 9df029de..45ea7b46 100644 --- a/src/views/mod-tools/ModToolsView.tsx +++ b/src/views/mod-tools/ModToolsView.tsx @@ -184,9 +184,7 @@ export const ModToolsView: FC = props => return; } - const itemIndex = openRooms.indexOf(currentRoomId); - - if(itemIndex > -1) + if(openRooms.indexOf(currentRoomId) > -1) { handleClick('close_room', currentRoomId.toString()); } @@ -217,9 +215,7 @@ export const ModToolsView: FC = props => return; } - const itemIndex = openRoomChatlogs.indexOf(currentRoomId); - - if(itemIndex > -1) + if(openRoomChatlogs.indexOf(currentRoomId) > -1) { handleClick('close_room_chatlog', currentRoomId.toString()); } @@ -255,9 +251,7 @@ export const ModToolsView: FC = props => return; } - const itemIndex = openUserInfo.indexOf(userId); - - if(itemIndex > -1) + if(openUserInfo.indexOf(userId) > -1) { handleClick('close_user_info', userId.toString()); } diff --git a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx index 8d1a709e..1bc05a91 100644 --- a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx +++ b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx @@ -1,6 +1,7 @@ import { ModtoolReceivedRoomsUserEvent, ModtoolRequestUserRoomsComposer, ModtoolRoomVisitedData } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { AutoSizer, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; +import { TryVisitRoom } from '../../../../../api'; import { CreateMessageHook, SendMessageHook } from '../../../../../hooks'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; import { ModToolsUserRoomVisitsViewProps } from './ModToolsUserRoomVisitsView.types'; @@ -32,9 +33,11 @@ export const ModToolsUserRoomVisitsView: FC = p const item = roomVisitData.rooms[props.index]; return ( -
- {item.enterHour}:{item.enterMinute} Room: {item.roomName} -
); +
+
{item.enterHour.toString().padStart(2, '0')}:{item.enterMinute.toString().padStart(2, '0')}
+
Room: {item.roomName}
+ +
); } return ( @@ -42,22 +45,22 @@ export const ModToolsUserRoomVisitsView: FC = p onCloseClick()} /> {roomVisitData && -
- - {({ height, width }) => - { - return ( - - ) - }} - +
+ + {({ height, width }) => + { + return ( + + ) + }} +
} From fe6f27737cb71d299f1b9822f934b375041a5c3c Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 20 Oct 2021 02:45:04 -0400 Subject: [PATCH 13/29] Update mod tools user info --- .../user/user-info/ModToolsUserView.scss | 4 - .../views/user/user-info/ModToolsUserView.tsx | 165 ++++++++---------- .../user/user-info/ModToolsUserView.types.ts | 1 - .../ModToolsUserModActionView.tsx | 2 +- .../ModToolsUserModActionView.types.ts | 3 +- .../ModToolsUserRoomVisitsView.tsx | 2 +- .../ModToolsUserRoomVisitsView.types.ts | 4 +- .../ModToolsSendUserMessage.types.ts | 3 +- .../ModToolsSendUserMessageView.tsx | 2 +- 9 files changed, 83 insertions(+), 103 deletions(-) diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss b/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss index cb138384..ddc24350 100644 --- a/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.scss @@ -19,9 +19,5 @@ color: $black; background: rgba(0, 0, 0, .05); } - - td { - padding: 0px 5px; - } } } diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx index b056553b..5981f666 100644 --- a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx @@ -1,29 +1,26 @@ import { FriendlyTime, ModeratorUserInfoData, ModtoolRequestUserInfoComposer, ModtoolUserInfoEvent } from '@nitrots/nitro-renderer'; -import { FC, useCallback, useEffect, useState } from 'react'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { LocalizeText } from '../../../../../api'; import { ModToolsOpenUserChatlogEvent } from '../../../../../events/mod-tools/ModToolsOpenUserChatlogEvent'; import { CreateMessageHook, dispatchUiEvent, SendMessageHook } from '../../../../../hooks'; -import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; -import { AvatarImageView } from '../../../../shared/avatar-image/AvatarImageView'; -import { IUserInfo } from '../../../utils/IUserInfo'; +import { NitroCardContentView, NitroCardHeaderView, NitroCardView, NitroLayoutButton, NitroLayoutGrid, NitroLayoutGridColumn } from '../../../../../layout'; import { ModToolsUserModActionView } from '../user-mod-action/ModToolsUserModActionView'; import { ModToolsUserRoomVisitsView } from '../user-room-visits/ModToolsUserRoomVisitsView'; import { ModToolsSendUserMessageView } from '../user-sendmessage/ModToolsSendUserMessageView'; import { ModToolsUserViewProps } from './ModToolsUserView.types'; - export const ModToolsUserView: FC = props => { - const { onCloseClick = null, userId = null, simple = true } = props; - const [userInfo, setUserInfo] = useState(null); - const [sendMessageVisible, setSendMessageVisible] = useState(false); - const [modActionVisible, setModActionVisible] = useState(false); - const [roomVisitsVisible, setRoomVisitsVisible] = useState(false); + const { onCloseClick = null, userId = null } = props; + const [ userInfo, setUserInfo ] = useState(null); + const [ sendMessageVisible, setSendMessageVisible ] = useState(false); + const [ modActionVisible, setModActionVisible ] = useState(false); + const [ roomVisitsVisible, setRoomVisitsVisible ] = useState(false); useEffect(() => { SendMessageHook(new ModtoolRequestUserInfoComposer(userId)); - }, [userId]); - + }, [ userId ]); const onModtoolUserInfoEvent = useCallback((event: ModtoolUserInfoEvent) => { @@ -36,137 +33,121 @@ export const ModToolsUserView: FC = props => CreateMessageHook(ModtoolUserInfoEvent, onModtoolUserInfoEvent); - const OnlineIcon = useCallback(() => + const userProperties = useMemo(() => { - if(userInfo.online) return (); - else return (); - }, [userInfo]); + if(!userInfo) return null; - const userProperties = useCallback(() => - { - let properties: IUserInfo[] = []; - - if(!userInfo) return properties; - - properties = [ + return [ { - nameKey: 'name', - nameKeyFallback: 'Name', - value: userInfo.userName + localeKey: 'modtools.userinfo.userName', + value: userInfo.userName, + showOnline: true }, { - nameKey: 'cfhs', - nameKeyFallback: 'CFHs', + localeKey: 'modtools.userinfo.cfhCount', value: userInfo.cfhCount.toString() }, { - nameKey: 'abusive_cfhs', - nameKeyFallback: 'Abusive CFHs', + localeKey: 'modtools.userinfo.abusiveCfhCount', value: userInfo.abusiveCfhCount.toString() }, { - nameKey: 'cautions', - nameKeyFallback: 'Cautions', + localeKey: 'modtools.userinfo.cautionCount', value: userInfo.cautionCount.toString() }, { - nameKey: 'bans', - nameKeyFallback: 'Bans', + localeKey: 'modtools.userinfo.banCount', value: userInfo.banCount.toString() }, { - nameKey: 'last_sanction', - nameKeyFallback: 'Last sanction', + localeKey: 'modtools.userinfo.lastSanctionTime', value: userInfo.lastSanctionTime }, { - nameKey: 'trade_locks', - nameKeyFallback: 'Trade locks', + localeKey: 'modtools.userinfo.tradingLockCount', value: userInfo.tradingLockCount.toString() }, { - nameKey: 'lock_expires', - nameKeyFallback: 'Lock expires', + localeKey: 'modtools.userinfo.tradingExpiryDate', value: userInfo.tradingExpiryDate }, { - nameKey: 'last_login', - nameKeyFallback: 'Last login', + localeKey: 'modtools.userinfo.minutesSinceLastLogin', value: FriendlyTime.format(userInfo.minutesSinceLastLogin * 60, '.ago', 2) }, { - nameKey: 'purchase', - nameKeyFallback: 'Purchases', + localeKey: 'modtools.userinfo.lastPurchaseDate', value: userInfo.lastPurchaseDate }, { - nameKey: 'email', - nameKeyFallback: 'Email', + localeKey: 'modtools.userinfo.primaryEmailAddress', value: userInfo.primaryEmailAddress }, { - nameKey: 'acc_bans', - nameKeyFallback: 'Banned Accs.', + localeKey: 'modtools.userinfo.identityRelatedBanCount', value: userInfo.identityRelatedBanCount.toString() }, { - nameKey: 'registered', - nameKeyFallback: 'Registered', + localeKey: 'modtools.userinfo.registrationAgeInMinutes', value: FriendlyTime.format(userInfo.registrationAgeInMinutes * 60, '.ago', 2) }, { - nameKey: 'rank', - nameKeyFallback: 'Rank', + localeKey: 'modtools.userinfo.userClassification', value: userInfo.userClassification } ]; + }, [ userInfo ]); - return properties; - - }, [userInfo]); + if(!userInfo) return null; return ( <> - - onCloseClick()} /> - - {userInfo && -
- {!simple && -
- -
- } -
- + + + + + +
- {userProperties().map(property => - { - return ( - - - - - ) - })} + { userProperties.map(property => + { + + return ( + + + + + ); + }) }
{property.nameKeyFallback} - {property.value} {(property.nameKey === 'name') && } -
{ LocalizeText(property.localeKey) } + { property.value } + { property.showOnline && } +
-
-
- - - - -
-
- } -
-
- {(sendMessageVisible && userInfo) && setSendMessageVisible(false)}/>} - {(userInfo && modActionVisible) && setModActionVisible(false)}/>} - {(userInfo && roomVisitsVisible) && setRoomVisitsVisible(false)}/>} + + + dispatchUiEvent(new ModToolsOpenUserChatlogEvent(userId)) }> + Room Chat + + setSendMessageVisible(!sendMessageVisible) }> + Send Message + + setRoomVisitsVisible(!roomVisitsVisible) }> + Room Visits + + setModActionVisible(!modActionVisible) }> + Mod Action + + + + + + { sendMessageVisible && + setSendMessageVisible(false) } /> } + { modActionVisible && + setModActionVisible(false) } /> } + { roomVisitsVisible && + setRoomVisitsVisible(false) } /> } ); } diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.types.ts b/src/views/mod-tools/views/user/user-info/ModToolsUserView.types.ts index 21d30670..534d647d 100644 --- a/src/views/mod-tools/views/user/user-info/ModToolsUserView.types.ts +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.types.ts @@ -2,5 +2,4 @@ export interface ModToolsUserViewProps { userId: number; onCloseClick: () => void; - simple?: boolean; } diff --git a/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx index c78f12f6..2a8495a2 100644 --- a/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx +++ b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx @@ -8,7 +8,7 @@ export const ModToolsUserModActionView: FC = pro return ( - onCloseClick()} /> + {user &&
}
diff --git a/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.types.ts b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.types.ts index 2025d10d..28714abc 100644 --- a/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.types.ts +++ b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.types.ts @@ -1,7 +1,8 @@ +import { MouseEvent } from 'react'; import { ISelectedUser } from '../../../utils/ISelectedUser'; export interface ModToolsUserModActionViewProps { user: ISelectedUser; - onCloseClick: () => void; + onCloseClick: (event: MouseEvent) => void; } diff --git a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx index 8d1a709e..76aff1fd 100644 --- a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx +++ b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx @@ -39,7 +39,7 @@ export const ModToolsUserRoomVisitsView: FC = p return ( - onCloseClick()} /> + {roomVisitData &&
diff --git a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.types.ts b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.types.ts index 8aaebec5..4bbcaf40 100644 --- a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.types.ts +++ b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.types.ts @@ -1,5 +1,7 @@ +import { MouseEvent } from 'react'; + export interface ModToolsUserRoomVisitsViewProps { userId: number; - onCloseClick: () => void; + onCloseClick: (event: MouseEvent) => void; } diff --git a/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessage.types.ts b/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessage.types.ts index 617945f0..e8f071d8 100644 --- a/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessage.types.ts +++ b/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessage.types.ts @@ -1,7 +1,8 @@ +import { MouseEvent } from 'react'; import { ISelectedUser } from '../../../utils/ISelectedUser'; export interface ModToolsSendUserMessageViewProps { user: ISelectedUser; - onCloseClick: () => void; + onCloseClick: (event: MouseEvent) => void; } diff --git a/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessageView.tsx b/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessageView.tsx index 7305bf93..f1e5f01f 100644 --- a/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessageView.tsx +++ b/src/views/mod-tools/views/user/user-sendmessage/ModToolsSendUserMessageView.tsx @@ -19,7 +19,7 @@ export const ModToolsSendUserMessageView: FC = return ( - onCloseClick()} /> + {user && <>
Message To: {user.username}
From e0fa8912661e1383e465cbc108482b32c37b8a16 Mon Sep 17 00:00:00 2001 From: dank074 Date: Wed, 20 Oct 2021 19:28:50 -0500 Subject: [PATCH 14/29] updated packets --- .../room/room-chatlog/ModToolsChatlogView.tsx | 4 ++-- .../room/room-tools/ModToolsRoomView.tsx | 22 +++++++++---------- .../tickets/ModToolsOpenIssuesTabView.tsx | 6 +++++ .../views/tickets/ModToolsTicketsView.tsx | 16 ++++++++++++-- .../user-chatlog/ModToolsUserChatlogView.tsx | 14 ++++++------ .../views/user/user-info/ModToolsUserView.tsx | 8 +++---- .../ModToolsUserRoomVisitsView.tsx | 10 ++++----- 7 files changed, 49 insertions(+), 31 deletions(-) create mode 100644 src/views/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx diff --git a/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx b/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx index 77573e30..4097d8c9 100644 --- a/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx +++ b/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx @@ -1,4 +1,4 @@ -import { ChatRecordData, ModtoolRequestRoomChatlogComposer, ModtoolRoomChatlogEvent } from '@nitrots/nitro-renderer'; +import { ChatRecordData, GetRoomChatlogMessageComposer, ModtoolRoomChatlogEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { CreateMessageHook, SendMessageHook } from '../../../../../hooks/messages'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; @@ -13,7 +13,7 @@ export const ModToolsChatlogView: FC = props => useEffect(() => { - SendMessageHook(new ModtoolRequestRoomChatlogComposer(roomId)); + SendMessageHook(new GetRoomChatlogMessageComposer(roomId)); }, [roomId]); const onModtoolRoomChatlogEvent = useCallback((event: ModtoolRoomChatlogEvent) => diff --git a/src/views/mod-tools/views/room/room-tools/ModToolsRoomView.tsx b/src/views/mod-tools/views/room/room-tools/ModToolsRoomView.tsx index 6a5c69e3..d169c1fb 100644 --- a/src/views/mod-tools/views/room/room-tools/ModToolsRoomView.tsx +++ b/src/views/mod-tools/views/room/room-tools/ModToolsRoomView.tsx @@ -1,4 +1,4 @@ -import { ModerateRoomMessageComposer, ModeratorActionMessageComposer, ModtoolRequestRoomInfoComposer, ModtoolRoomInfoEvent } from '@nitrots/nitro-renderer'; +import { GetModeratorRoomInfoMessageComposer, ModerateRoomMessageComposer, ModeratorActionMessageComposer, ModeratorRoomInfoEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { TryVisitRoom } from '../../../../../api'; import { ModToolsOpenRoomChatlogEvent } from '../../../../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; @@ -30,25 +30,25 @@ export const ModToolsRoomView: FC = props => { if(infoRequested) return; - SendMessageHook(new ModtoolRequestRoomInfoComposer(roomId)); + SendMessageHook(new GetModeratorRoomInfoMessageComposer(roomId)); setInfoRequested(true); }, [ roomId, infoRequested, setInfoRequested ]); - const onModtoolRoomInfoEvent = useCallback((event: ModtoolRoomInfoEvent) => + const onModtoolRoomInfoEvent = useCallback((event: ModeratorRoomInfoEvent) => { const parser = event.getParser(); - if(!parser || parser.id !== roomId) return; + if(!parser || parser.data.flatId !== roomId) return; - setLoadedRoomId(parser.id); - setName(parser.name); - setOwnerId(parser.ownerId); - setOwnerName(parser.ownerName); - setOwnerInRoom(parser.ownerInRoom); - setUsersInRoom(parser.playerAmount); + setLoadedRoomId(parser.data.flatId); + setName(parser.data.room.name); + setOwnerId(parser.data.ownerId); + setOwnerName(parser.data.ownerName); + setOwnerInRoom(parser.data.ownerInRoom); + setUsersInRoom(parser.data.userCount); }, [ setLoadedRoomId, setName, setOwnerId, setOwnerName, setOwnerInRoom, setUsersInRoom, roomId ]); - CreateMessageHook(ModtoolRoomInfoEvent, onModtoolRoomInfoEvent); + CreateMessageHook(ModeratorRoomInfoEvent, onModtoolRoomInfoEvent); const handleClick = useCallback((action: string, value?: string) => { diff --git a/src/views/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx b/src/views/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx new file mode 100644 index 00000000..6d4392b7 --- /dev/null +++ b/src/views/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx @@ -0,0 +1,6 @@ +import { FC } from 'react'; + +export const ModToolsOpenIssuesTabView: FC<{}> = props => +{ + return null; +} diff --git a/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx b/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx index 5d2ebf47..60651532 100644 --- a/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx +++ b/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx @@ -1,5 +1,6 @@ -import { FC, useState } from 'react'; +import { FC, useCallback, useState } from 'react'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../layout'; +import { ModToolsOpenIssuesTabView } from './ModToolsOpenIssuesTabView'; import { ModToolsTicketsViewProps } from './ModToolsTicketsView.types'; const TABS: string[] = [ @@ -14,6 +15,15 @@ export const ModToolsTicketsView: FC = props => const [ currentTab, setCurrentTab ] = useState(0); + const CurrentTabComponent = useCallback(() => + { + switch(currentTab) + { + case 0: return ; + default: return null; + } + }, [currentTab]); + return ( @@ -26,7 +36,9 @@ export const ModToolsTicketsView: FC = props => ); }) } -
+
+ +
); diff --git a/src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.tsx b/src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.tsx index 0da179cb..705cc690 100644 --- a/src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.tsx +++ b/src/views/mod-tools/views/user/user-chatlog/ModToolsUserChatlogView.tsx @@ -1,4 +1,4 @@ -import { ChatRecordData, ModtoolRequestUserChatlogComposer, ModtoolUserChatlogEvent } from '@nitrots/nitro-renderer'; +import { ChatRecordData, GetUserChatlogMessageComposer, UserChatlogEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { CreateMessageHook, SendMessageHook } from '../../../../../hooks'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; @@ -13,20 +13,20 @@ export const ModToolsUserChatlogView: FC = props = useEffect(() => { - SendMessageHook(new ModtoolRequestUserChatlogComposer(userId)); + SendMessageHook(new GetUserChatlogMessageComposer(userId)); }, [userId]); - const onModtoolUserChatlogEvent = useCallback((event: ModtoolUserChatlogEvent) => + const onModtoolUserChatlogEvent = useCallback((event: UserChatlogEvent) => { const parser = event.getParser(); - if(!parser || parser.userId !== userId) return; + if(!parser || parser.data.userId !== userId) return; - setUsername(parser.username); - setUserChatlog(parser.roomVisits); + setUsername(parser.data.username); + setUserChatlog(parser.data.roomChatlogs); }, [setUsername, setUserChatlog, userId]); - CreateMessageHook(ModtoolUserChatlogEvent, onModtoolUserChatlogEvent); + CreateMessageHook(UserChatlogEvent, onModtoolUserChatlogEvent); return ( diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx index 5981f666..fa1a3214 100644 --- a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx @@ -1,4 +1,4 @@ -import { FriendlyTime, ModeratorUserInfoData, ModtoolRequestUserInfoComposer, ModtoolUserInfoEvent } from '@nitrots/nitro-renderer'; +import { FriendlyTime, GetModeratorUserInfoMessageComposer, ModeratorUserInfoData, ModtoolUserInfoEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { LocalizeText } from '../../../../../api'; import { ModToolsOpenUserChatlogEvent } from '../../../../../events/mod-tools/ModToolsOpenUserChatlogEvent'; @@ -19,7 +19,7 @@ export const ModToolsUserView: FC = props => useEffect(() => { - SendMessageHook(new ModtoolRequestUserInfoComposer(userId)); + SendMessageHook(new GetModeratorUserInfoMessageComposer(userId)); }, [ userId ]); const onModtoolUserInfoEvent = useCallback((event: ModtoolUserInfoEvent) => @@ -109,11 +109,11 @@ export const ModToolsUserView: FC = props => - { userProperties.map(property => + { userProperties.map( (property, index) => { return ( - +
{ LocalizeText(property.localeKey) } { property.value } diff --git a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx index 0faec1ef..c79117dc 100644 --- a/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx +++ b/src/views/mod-tools/views/user/user-room-visits/ModToolsUserRoomVisitsView.tsx @@ -1,4 +1,4 @@ -import { ModtoolReceivedRoomsUserEvent, ModtoolRequestUserRoomsComposer, ModtoolRoomVisitedData } from '@nitrots/nitro-renderer'; +import { GetRoomVisitsMessageComposer, RoomVisitsData, RoomVisitsEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { AutoSizer, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; import { TryVisitRoom } from '../../../../../api'; @@ -10,14 +10,14 @@ export const ModToolsUserRoomVisitsView: FC = p { const { userId = null, onCloseClick = null } = props; - const [roomVisitData, setRoomVisitData] = useState(null); + const [roomVisitData, setRoomVisitData] = useState(null); useEffect(() => { - SendMessageHook(new ModtoolRequestUserRoomsComposer(userId)); + SendMessageHook(new GetRoomVisitsMessageComposer(userId)); }, [userId]); - const onModtoolReceivedRoomsUserEvent = useCallback((event: ModtoolReceivedRoomsUserEvent) => + const onModtoolReceivedRoomsUserEvent = useCallback((event: RoomVisitsEvent) => { const parser = event.getParser(); @@ -26,7 +26,7 @@ export const ModToolsUserRoomVisitsView: FC = p setRoomVisitData(parser.data); }, [userId]); - CreateMessageHook(ModtoolReceivedRoomsUserEvent, onModtoolReceivedRoomsUserEvent); + CreateMessageHook(RoomVisitsEvent, onModtoolReceivedRoomsUserEvent); const RowRenderer: ListRowRenderer = (props: ListRowProps) => { From e268a5a459e50edf1e7c2a3455592b32aceae212 Mon Sep 17 00:00:00 2001 From: dank074 Date: Wed, 20 Oct 2021 19:50:23 -0500 Subject: [PATCH 15/29] updated more packets --- src/views/mod-tools/views/chatlog/ChatlogView.tsx | 4 ++-- .../views/room/room-chatlog/ModToolsChatlogView.tsx | 6 +++--- .../mod-tools/views/user/user-info/ModToolsUserView.tsx | 6 +++--- .../NotificationCenterMessageHandler.tsx | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/views/mod-tools/views/chatlog/ChatlogView.tsx b/src/views/mod-tools/views/chatlog/ChatlogView.tsx index 426fd5a6..1eedefe8 100644 --- a/src/views/mod-tools/views/chatlog/ChatlogView.tsx +++ b/src/views/mod-tools/views/chatlog/ChatlogView.tsx @@ -1,4 +1,4 @@ -import { ChatRecordData, ModtoolRoomChatlogLine, UserProfileComposer } from '@nitrots/nitro-renderer'; +import { ChatlineData, ChatRecordData, UserProfileComposer } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; import { AutoSizer, CellMeasurer, CellMeasurerCache, List, ListRowProps, ListRowRenderer } from 'react-virtualized'; import { TryVisitRoom } from '../../../../api'; @@ -33,7 +33,7 @@ export const ChatlogView: FC = props => const advancedRowRenderer: ListRowRenderer = (props: ListRowProps) => { - let chatlogEntry: ModtoolRoomChatlogLine; + let chatlogEntry: ChatlineData; let currentRecord: ChatRecordData; let isRoomInfo = false; diff --git a/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx b/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx index 4097d8c9..96d11aba 100644 --- a/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx +++ b/src/views/mod-tools/views/room/room-chatlog/ModToolsChatlogView.tsx @@ -1,4 +1,4 @@ -import { ChatRecordData, GetRoomChatlogMessageComposer, ModtoolRoomChatlogEvent } from '@nitrots/nitro-renderer'; +import { ChatRecordData, GetRoomChatlogMessageComposer, RoomChatlogEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useState } from 'react'; import { CreateMessageHook, SendMessageHook } from '../../../../../hooks/messages'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; @@ -16,7 +16,7 @@ export const ModToolsChatlogView: FC = props => SendMessageHook(new GetRoomChatlogMessageComposer(roomId)); }, [roomId]); - const onModtoolRoomChatlogEvent = useCallback((event: ModtoolRoomChatlogEvent) => + const onModtoolRoomChatlogEvent = useCallback((event: RoomChatlogEvent) => { const parser = event.getParser(); @@ -25,7 +25,7 @@ export const ModToolsChatlogView: FC = props => setRoomChatlog(parser.data); }, [roomId, setRoomChatlog]); - CreateMessageHook(ModtoolRoomChatlogEvent, onModtoolRoomChatlogEvent); + CreateMessageHook(RoomChatlogEvent, onModtoolRoomChatlogEvent); return ( diff --git a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx index fa1a3214..ab1fc54e 100644 --- a/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx +++ b/src/views/mod-tools/views/user/user-info/ModToolsUserView.tsx @@ -1,4 +1,4 @@ -import { FriendlyTime, GetModeratorUserInfoMessageComposer, ModeratorUserInfoData, ModtoolUserInfoEvent } from '@nitrots/nitro-renderer'; +import { FriendlyTime, GetModeratorUserInfoMessageComposer, ModeratorUserInfoData, ModeratorUserInfoEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { LocalizeText } from '../../../../../api'; import { ModToolsOpenUserChatlogEvent } from '../../../../../events/mod-tools/ModToolsOpenUserChatlogEvent'; @@ -22,7 +22,7 @@ export const ModToolsUserView: FC = props => SendMessageHook(new GetModeratorUserInfoMessageComposer(userId)); }, [ userId ]); - const onModtoolUserInfoEvent = useCallback((event: ModtoolUserInfoEvent) => + const onModtoolUserInfoEvent = useCallback((event: ModeratorUserInfoEvent) => { const parser = event.getParser(); @@ -31,7 +31,7 @@ export const ModToolsUserView: FC = props => setUserInfo(parser.data); }, [setUserInfo, userId]); - CreateMessageHook(ModtoolUserInfoEvent, onModtoolUserInfoEvent); + CreateMessageHook(ModeratorUserInfoEvent, onModtoolUserInfoEvent); const userProperties = useMemo(() => { diff --git a/src/views/notification-center/NotificationCenterMessageHandler.tsx b/src/views/notification-center/NotificationCenterMessageHandler.tsx index 9afc098d..76c68e65 100644 --- a/src/views/notification-center/NotificationCenterMessageHandler.tsx +++ b/src/views/notification-center/NotificationCenterMessageHandler.tsx @@ -60,7 +60,7 @@ export const NotificationCenterMessageHandler: FC Date: Wed, 20 Oct 2021 20:31:26 -0500 Subject: [PATCH 16/29] bill fix this --- src/views/mod-tools/ModToolsView.tsx | 7 ++++-- .../tickets/ModToolsOpenIssuesTabView.tsx | 6 ----- .../views/tickets/ModToolsTicketsView.tsx | 24 ++++++++++++++----- .../open-issues/ModToolsOpenIssuesTabView.tsx | 11 +++++++++ .../ModToolsOpenIssuesTabView.types.ts | 6 +++++ 5 files changed, 40 insertions(+), 14 deletions(-) delete mode 100644 src/views/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx create mode 100644 src/views/mod-tools/views/tickets/open-issues/ModToolsOpenIssuesTabView.tsx create mode 100644 src/views/mod-tools/views/tickets/open-issues/ModToolsOpenIssuesTabView.types.ts diff --git a/src/views/mod-tools/ModToolsView.tsx b/src/views/mod-tools/ModToolsView.tsx index 45ea7b46..4f73d340 100644 --- a/src/views/mod-tools/ModToolsView.tsx +++ b/src/views/mod-tools/ModToolsView.tsx @@ -161,12 +161,15 @@ export const ModToolsView: FC = props => if(!parser) return; + const data = parser.data; + dispatchModToolsState({ type: ModToolsActions.SET_INIT_DATA, payload: { - settings: parser.data + settings: data } - }); + }); + console.log(parser); }, []); CreateMessageHook(ModeratorInitMessageEvent, onModeratorInitMessageEvent); diff --git a/src/views/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx b/src/views/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx deleted file mode 100644 index 6d4392b7..00000000 --- a/src/views/mod-tools/views/tickets/ModToolsOpenIssuesTabView.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { FC } from 'react'; - -export const ModToolsOpenIssuesTabView: FC<{}> = props => -{ - return null; -} diff --git a/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx b/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx index 60651532..6f9471ae 100644 --- a/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx +++ b/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx @@ -1,7 +1,9 @@ -import { FC, useCallback, useState } from 'react'; +import { IssueMessageData } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useMemo, useState } from 'react'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../layout'; -import { ModToolsOpenIssuesTabView } from './ModToolsOpenIssuesTabView'; +import { useModToolsContext } from '../../context/ModToolsContext'; import { ModToolsTicketsViewProps } from './ModToolsTicketsView.types'; +import { ModToolsOpenIssuesTabView } from './open-issues/ModToolsOpenIssuesTabView'; const TABS: string[] = [ 'Open Issues', @@ -12,17 +14,27 @@ const TABS: string[] = [ export const ModToolsTicketsView: FC = props => { const { onCloseClick = null } = props; - + const { modToolsState = null } = useModToolsContext(); + const { settings = null } = modToolsState; const [ currentTab, setCurrentTab ] = useState(0); + const openIssues = useMemo(() => + { + if(!settings) return []; + + return settings.issues.filter(issue => issue.state === IssueMessageData.STATE_OPEN) + }, [settings]); + const CurrentTabComponent = useCallback(() => { switch(currentTab) { - case 0: return ; + case 0: return ; default: return null; } - }, [currentTab]); + }, [currentTab, openIssues]); + + console.log(settings); return ( @@ -37,7 +49,7 @@ export const ModToolsTicketsView: FC = props => }) }
- + {settings && }
diff --git a/src/views/mod-tools/views/tickets/open-issues/ModToolsOpenIssuesTabView.tsx b/src/views/mod-tools/views/tickets/open-issues/ModToolsOpenIssuesTabView.tsx new file mode 100644 index 00000000..d6ebe1bc --- /dev/null +++ b/src/views/mod-tools/views/tickets/open-issues/ModToolsOpenIssuesTabView.tsx @@ -0,0 +1,11 @@ +import { FC } from 'react'; +import { ModToolsOpenIssuesTabViewProps } from './ModToolsOpenIssuesTabView.types'; + +export const ModToolsOpenIssuesTabView: FC = props => +{ + const { openIssues = null } = props; + + return ( +
{openIssues.length}
+ ); +} diff --git a/src/views/mod-tools/views/tickets/open-issues/ModToolsOpenIssuesTabView.types.ts b/src/views/mod-tools/views/tickets/open-issues/ModToolsOpenIssuesTabView.types.ts new file mode 100644 index 00000000..45a80d7d --- /dev/null +++ b/src/views/mod-tools/views/tickets/open-issues/ModToolsOpenIssuesTabView.types.ts @@ -0,0 +1,6 @@ +import { IssueMessageData } from '@nitrots/nitro-renderer'; + +export interface ModToolsOpenIssuesTabViewProps +{ + openIssues: IssueMessageData[]; +} From 5ad80cadca6233560d9bc4571122f86bc9f5779b Mon Sep 17 00:00:00 2001 From: Bill Date: Wed, 20 Oct 2021 21:37:54 -0400 Subject: [PATCH 17/29] Fixed --- src/views/mod-tools/reducers/ModToolsReducer.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/mod-tools/reducers/ModToolsReducer.tsx b/src/views/mod-tools/reducers/ModToolsReducer.tsx index c2c9df87..e1515e76 100644 --- a/src/views/mod-tools/reducers/ModToolsReducer.tsx +++ b/src/views/mod-tools/reducers/ModToolsReducer.tsx @@ -49,9 +49,9 @@ export const ModToolsReducer: Reducer = (state, switch(action.type) { case ModToolsActions.SET_INIT_DATA: { - const data = (action.payload.settings || state.settings || null); + const settings = (action.payload.settings || state.settings || null); - return { ...state, data }; + return { ...state, settings }; } case ModToolsActions.SET_CURRENT_ROOM_ID: { const currentRoomId = (action.payload.currentRoomId || state.currentRoomId || null); From cf17d152d4ccebc363f75469ba06443ccf27886d Mon Sep 17 00:00:00 2001 From: dank074 Date: Wed, 20 Oct 2021 22:32:44 -0500 Subject: [PATCH 18/29] bill fix this again --- .../mod-tools/ModToolsMessageHandler.tsx | 67 +++++++++++++++++++ src/views/mod-tools/ModToolsView.tsx | 26 ++----- .../mod-tools/reducers/ModToolsReducer.tsx | 13 +++- .../views/tickets/ModToolsTicketsView.tsx | 27 ++++++-- 4 files changed, 102 insertions(+), 31 deletions(-) create mode 100644 src/views/mod-tools/ModToolsMessageHandler.tsx diff --git a/src/views/mod-tools/ModToolsMessageHandler.tsx b/src/views/mod-tools/ModToolsMessageHandler.tsx new file mode 100644 index 00000000..b9bae911 --- /dev/null +++ b/src/views/mod-tools/ModToolsMessageHandler.tsx @@ -0,0 +1,67 @@ +import { IssueInfoMessageEvent, ModeratorInitMessageEvent } from '@nitrots/nitro-renderer'; +import { FC, useCallback } from 'react'; +import { CreateMessageHook } from '../../hooks'; +import { useModToolsContext } from './context/ModToolsContext'; +import { ModToolsActions } from './reducers/ModToolsReducer'; + +export const ModToolsMessageHandler: FC<{}> = props => +{ + const { modToolsState = null, dispatchModToolsState = null } = useModToolsContext(); + const { tickets= null } = modToolsState; + + const onModeratorInitMessageEvent = useCallback((event: ModeratorInitMessageEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + const data = parser.data; + + dispatchModToolsState({ + type: ModToolsActions.SET_INIT_DATA, + payload: { + settings: data + } + }); + + dispatchModToolsState({ + type: ModToolsActions.SET_TICKETS, + payload: { + tickets: data.issues + } + }); + + console.log(parser); + }, [dispatchModToolsState]); + + const onIssueInfoMessageEvent = useCallback((event: IssueInfoMessageEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + const newTickets = tickets ? Array.from(tickets) : []; + const existingIndex = newTickets.findIndex( entry => entry.issueId === parser.issueData.issueId) + + if(existingIndex > -1) + { + newTickets[existingIndex] = parser.issueData; + } + else + { + newTickets.push(parser.issueData); + } + + dispatchModToolsState({ + type: ModToolsActions.SET_TICKETS, + payload: { + tickets: newTickets + } + }) + }, [dispatchModToolsState, tickets]); + + CreateMessageHook(ModeratorInitMessageEvent, onModeratorInitMessageEvent); + CreateMessageHook(IssueInfoMessageEvent, onIssueInfoMessageEvent); + + return null; +} diff --git a/src/views/mod-tools/ModToolsView.tsx b/src/views/mod-tools/ModToolsView.tsx index 4f73d340..5f3ba8d5 100644 --- a/src/views/mod-tools/ModToolsView.tsx +++ b/src/views/mod-tools/ModToolsView.tsx @@ -1,4 +1,4 @@ -import { ModeratorInitMessageEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { RoomEngineEvent, RoomEngineObjectEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC, useCallback, useReducer, useState } from 'react'; import { GetRoomSession } from '../../api'; import { ModToolsEvent } from '../../events/mod-tools/ModToolsEvent'; @@ -6,11 +6,11 @@ import { ModToolsOpenRoomChatlogEvent } from '../../events/mod-tools/ModToolsOpe import { ModToolsOpenRoomInfoEvent } from '../../events/mod-tools/ModToolsOpenRoomInfoEvent'; import { ModToolsOpenUserChatlogEvent } from '../../events/mod-tools/ModToolsOpenUserChatlogEvent'; import { ModToolsOpenUserInfoEvent } from '../../events/mod-tools/ModToolsOpenUserInfoEvent'; -import { CreateMessageHook } from '../../hooks'; import { useRoomEngineEvent } from '../../hooks/events'; import { dispatchUiEvent, useUiEvent } from '../../hooks/events/ui/ui-event'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../layout'; import { ModToolsContextProvider } from './context/ModToolsContext'; +import { ModToolsMessageHandler } from './ModToolsMessageHandler'; import { ModToolsViewProps } from './ModToolsView.types'; import { initialModTools, ModToolsActions, ModToolsReducer } from './reducers/ModToolsReducer'; import { ISelectedUser } from './utils/ISelectedUser'; @@ -24,7 +24,7 @@ export const ModToolsView: FC = props => { const [ isVisible, setIsVisible ] = useState(false); const [ modToolsState, dispatchModToolsState ] = useReducer(ModToolsReducer, initialModTools); - const { currentRoomId = null, openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null } = modToolsState; + const { currentRoomId = null, openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null, tickets = null } = modToolsState; const [ selectedUser, setSelectedUser] = useState(null); const [ isTicketsVisible, setIsTicketsVisible ] = useState(false); @@ -155,25 +155,6 @@ export const ModToolsView: FC = props => useRoomEngineEvent(RoomEngineObjectEvent.SELECTED, onRoomEngineObjectEvent); - const onModeratorInitMessageEvent = useCallback((event: ModeratorInitMessageEvent) => - { - const parser = event.getParser(); - - if(!parser) return; - - const data = parser.data; - - dispatchModToolsState({ - type: ModToolsActions.SET_INIT_DATA, - payload: { - settings: data - } - }); - console.log(parser); - }, []); - - CreateMessageHook(ModeratorInitMessageEvent, onModeratorInitMessageEvent); - const handleClick = useCallback((action: string, value?: string) => { if(!action) return; @@ -299,6 +280,7 @@ export const ModToolsView: FC = props => return ( + { isVisible && setIsVisible(false) } /> diff --git a/src/views/mod-tools/reducers/ModToolsReducer.tsx b/src/views/mod-tools/reducers/ModToolsReducer.tsx index e1515e76..ee94db45 100644 --- a/src/views/mod-tools/reducers/ModToolsReducer.tsx +++ b/src/views/mod-tools/reducers/ModToolsReducer.tsx @@ -1,4 +1,4 @@ -import { ModeratorInitData } from '@nitrots/nitro-renderer'; +import { IssueMessageData, ModeratorInitData } from '@nitrots/nitro-renderer'; import { Reducer } from 'react'; export interface IModToolsState @@ -9,6 +9,7 @@ export interface IModToolsState openRoomChatlogs: number[]; openUserInfo: number[]; openUserChatlogs: number[]; + tickets: IssueMessageData[] } export interface IModToolsAction @@ -21,6 +22,7 @@ export interface IModToolsAction openRoomChatlogs?: number[]; openUserInfo?: number[]; openUserChatlogs?: number[]; + tickets?: IssueMessageData[]; } } @@ -32,6 +34,7 @@ export class ModToolsActions public static SET_OPEN_USERINFO: string = 'MTA_SET_OPEN_USERINFO'; public static SET_OPEN_ROOM_CHATLOGS: string = 'MTA_SET_OPEN_CHATLOGS'; public static SET_OPEN_USER_CHATLOGS: string = 'MTA_SET_OPEN_USER_CHATLOGS'; + public static SET_TICKETS: string = 'MTA_SET_TICKETS'; public static RESET_STATE: string = 'MTA_RESET_STATE'; } @@ -41,7 +44,8 @@ export const initialModTools: IModToolsState = { openRooms: null, openRoomChatlogs: null, openUserChatlogs: null, - openUserInfo: null + openUserInfo: null, + tickets: null }; export const ModToolsReducer: Reducer = (state, action) => @@ -78,6 +82,11 @@ export const ModToolsReducer: Reducer = (state, return { ...state, openUserChatlogs }; } + case ModToolsActions.SET_TICKETS: { + const tickets = (action.payload.tickets || state.tickets || null); + + return { ...state, tickets }; + } case ModToolsActions.RESET_STATE: { return { ...initialModTools }; } diff --git a/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx b/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx index 6f9471ae..38b7986b 100644 --- a/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx +++ b/src/views/mod-tools/views/tickets/ModToolsTicketsView.tsx @@ -1,5 +1,6 @@ import { IssueMessageData } from '@nitrots/nitro-renderer'; import { FC, useCallback, useMemo, useState } from 'react'; +import { GetSessionDataManager } from '../../../../api'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../layout'; import { useModToolsContext } from '../../context/ModToolsContext'; import { ModToolsTicketsViewProps } from './ModToolsTicketsView.types'; @@ -15,15 +16,29 @@ export const ModToolsTicketsView: FC = props => { const { onCloseClick = null } = props; const { modToolsState = null } = useModToolsContext(); - const { settings = null } = modToolsState; + const { tickets= null } = modToolsState; const [ currentTab, setCurrentTab ] = useState(0); const openIssues = useMemo(() => { - if(!settings) return []; + if(!tickets) return []; - return settings.issues.filter(issue => issue.state === IssueMessageData.STATE_OPEN) - }, [settings]); + return tickets.filter(issue => issue.state === IssueMessageData.STATE_OPEN); + }, [tickets]); + + const myIssues = useMemo(() => + { + if(!tickets) return []; + + return tickets.filter(issue => (issue.state === IssueMessageData.STATE_PICKED) && (issue.pickerUserId === GetSessionDataManager().userId)); + }, [tickets]); + + const pickedIssues = useMemo(() => + { + if(!tickets) return []; + + return tickets.filter(issue => issue.state === IssueMessageData.STATE_PICKED); + }, [tickets]); const CurrentTabComponent = useCallback(() => { @@ -34,8 +49,6 @@ export const ModToolsTicketsView: FC = props => } }, [currentTab, openIssues]); - console.log(settings); - return ( @@ -49,7 +62,7 @@ export const ModToolsTicketsView: FC = props => }) }
- {settings && } +
From 301cf3aa5a3dcac31d8efa1fa808636f10e87d9f Mon Sep 17 00:00:00 2001 From: dank074 Date: Wed, 20 Oct 2021 22:45:21 -0500 Subject: [PATCH 19/29] moved stuff to message handler --- .../mod-tools/ModToolsMessageHandler.tsx | 109 +++++++++++++++++- src/views/mod-tools/ModToolsView.tsx | 101 +--------------- 2 files changed, 110 insertions(+), 100 deletions(-) diff --git a/src/views/mod-tools/ModToolsMessageHandler.tsx b/src/views/mod-tools/ModToolsMessageHandler.tsx index b9bae911..9b3fa5a4 100644 --- a/src/views/mod-tools/ModToolsMessageHandler.tsx +++ b/src/views/mod-tools/ModToolsMessageHandler.tsx @@ -1,13 +1,18 @@ -import { IssueInfoMessageEvent, ModeratorInitMessageEvent } from '@nitrots/nitro-renderer'; +import { IssueInfoMessageEvent, ModeratorInitMessageEvent, RoomEngineEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; -import { CreateMessageHook } from '../../hooks'; +import { ModToolsEvent } from '../../events/mod-tools/ModToolsEvent'; +import { ModToolsOpenRoomChatlogEvent } from '../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; +import { ModToolsOpenRoomInfoEvent } from '../../events/mod-tools/ModToolsOpenRoomInfoEvent'; +import { ModToolsOpenUserChatlogEvent } from '../../events/mod-tools/ModToolsOpenUserChatlogEvent'; +import { ModToolsOpenUserInfoEvent } from '../../events/mod-tools/ModToolsOpenUserInfoEvent'; +import { CreateMessageHook, useRoomEngineEvent, useUiEvent } from '../../hooks'; import { useModToolsContext } from './context/ModToolsContext'; import { ModToolsActions } from './reducers/ModToolsReducer'; export const ModToolsMessageHandler: FC<{}> = props => { const { modToolsState = null, dispatchModToolsState = null } = useModToolsContext(); - const { tickets= null } = modToolsState; + const { openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null, tickets= null } = modToolsState; const onModeratorInitMessageEvent = useCallback((event: ModeratorInitMessageEvent) => { @@ -63,5 +68,103 @@ export const ModToolsMessageHandler: FC<{}> = props => CreateMessageHook(ModeratorInitMessageEvent, onModeratorInitMessageEvent); CreateMessageHook(IssueInfoMessageEvent, onIssueInfoMessageEvent); + 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); + + const onModToolsEvent = useCallback((event: ModToolsEvent) => + { + switch(event.type) + { + case ModToolsEvent.OPEN_ROOM_INFO: { + const castedEvent = (event as ModToolsOpenRoomInfoEvent); + + if(openRooms && openRooms.includes(castedEvent.roomId)) return; + + const rooms = openRooms || []; + + dispatchModToolsState({ + type: ModToolsActions.SET_OPEN_ROOMS, + payload: { + openRooms: [...rooms, castedEvent.roomId] + } + }); + return; + } + case ModToolsEvent.OPEN_ROOM_CHATLOG: { + const castedEvent = (event as ModToolsOpenRoomChatlogEvent); + + if(openRoomChatlogs && openRoomChatlogs.includes(castedEvent.roomId)) return; + + const chatlogs = openRoomChatlogs || []; + + dispatchModToolsState({ + 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, + payload: { + openUserChatlogs: [...userChatlog, castedEvent.userId] + } + }); + return; + } + } + }, [openRooms, dispatchModToolsState, openRoomChatlogs, openUserInfo, openUserChatlogs]); + + useUiEvent(ModToolsEvent.OPEN_ROOM_INFO, onModToolsEvent); + useUiEvent(ModToolsEvent.OPEN_ROOM_CHATLOG, onModToolsEvent); + useUiEvent(ModToolsEvent.OPEN_USER_INFO, onModToolsEvent); + useUiEvent(ModToolsEvent.OPEN_USER_CHATLOG, onModToolsEvent); + return null; } diff --git a/src/views/mod-tools/ModToolsView.tsx b/src/views/mod-tools/ModToolsView.tsx index 5f3ba8d5..902ec5b9 100644 --- a/src/views/mod-tools/ModToolsView.tsx +++ b/src/views/mod-tools/ModToolsView.tsx @@ -1,10 +1,9 @@ -import { RoomEngineEvent, RoomEngineObjectEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; +import { RoomEngineObjectEvent, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC, useCallback, useReducer, useState } from 'react'; import { GetRoomSession } from '../../api'; import { ModToolsEvent } from '../../events/mod-tools/ModToolsEvent'; import { ModToolsOpenRoomChatlogEvent } from '../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; import { ModToolsOpenRoomInfoEvent } from '../../events/mod-tools/ModToolsOpenRoomInfoEvent'; -import { ModToolsOpenUserChatlogEvent } from '../../events/mod-tools/ModToolsOpenUserChatlogEvent'; import { ModToolsOpenUserInfoEvent } from '../../events/mod-tools/ModToolsOpenUserInfoEvent'; import { useRoomEngineEvent } from '../../hooks/events'; import { dispatchUiEvent, useUiEvent } from '../../hooks/events/ui/ui-event'; @@ -24,7 +23,7 @@ export const ModToolsView: FC = props => { const [ isVisible, setIsVisible ] = useState(false); const [ modToolsState, dispatchModToolsState ] = useReducer(ModToolsReducer, initialModTools); - const { currentRoomId = null, openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null, tickets = null } = modToolsState; + const { currentRoomId = null, openRooms = null, openRoomChatlogs = null, openUserChatlogs = null, openUserInfo = null } = modToolsState; const [ selectedUser, setSelectedUser] = useState(null); const [ isTicketsVisible, setIsTicketsVisible ] = useState(false); @@ -41,103 +40,13 @@ export const ModToolsView: FC = props => case ModToolsEvent.TOGGLE_MOD_TOOLS: setIsVisible(value => !value); return; - case ModToolsEvent.OPEN_ROOM_INFO: { - const castedEvent = (event as ModToolsOpenRoomInfoEvent); - - if(openRooms && openRooms.includes(castedEvent.roomId)) return; - - const rooms = openRooms || []; - - dispatchModToolsState({ - type: ModToolsActions.SET_OPEN_ROOMS, - payload: { - openRooms: [...rooms, castedEvent.roomId] - } - }); - return; - } - case ModToolsEvent.OPEN_ROOM_CHATLOG: { - const castedEvent = (event as ModToolsOpenRoomChatlogEvent); - - if(openRoomChatlogs && openRoomChatlogs.includes(castedEvent.roomId)) return; - - const chatlogs = openRoomChatlogs || []; - - dispatchModToolsState({ - 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, - payload: { - openUserChatlogs: [...userChatlog, castedEvent.userId] - } - }); - return; - } } - }, [openRooms, openRoomChatlogs, openUserInfo, openUserChatlogs]); + }, []); useUiEvent(ModToolsEvent.SHOW_MOD_TOOLS, onModToolsEvent); useUiEvent(ModToolsEvent.HIDE_MOD_TOOLS, onModToolsEvent); useUiEvent(ModToolsEvent.TOGGLE_MOD_TOOLS, onModToolsEvent); - useUiEvent(ModToolsEvent.OPEN_ROOM_INFO, onModToolsEvent); - useUiEvent(ModToolsEvent.OPEN_ROOM_CHATLOG, onModToolsEvent); - useUiEvent(ModToolsEvent.OPEN_USER_INFO, onModToolsEvent); - useUiEvent(ModToolsEvent.OPEN_USER_CHATLOG, onModToolsEvent); - - 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); - + const onRoomEngineObjectEvent = useCallback((event: RoomEngineObjectEvent) => { if(event.category !== RoomObjectCategory.UNIT) return; @@ -276,8 +185,6 @@ export const ModToolsView: FC = props => } }, [openRooms, currentRoomId, openRoomChatlogs, selectedUser, openUserInfo, openUserChatlogs]); - if(!isVisible) return null; - return ( From 5bcca108584a1547e088a4aa566e460dea3b943a Mon Sep 17 00:00:00 2001 From: dank074 Date: Wed, 20 Oct 2021 23:47:01 -0500 Subject: [PATCH 20/29] add packets --- .../mod-tools/ModToolsMessageHandler.tsx | 86 ++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/src/views/mod-tools/ModToolsMessageHandler.tsx b/src/views/mod-tools/ModToolsMessageHandler.tsx index 9b3fa5a4..1c5713d1 100644 --- a/src/views/mod-tools/ModToolsMessageHandler.tsx +++ b/src/views/mod-tools/ModToolsMessageHandler.tsx @@ -1,4 +1,4 @@ -import { IssueInfoMessageEvent, ModeratorInitMessageEvent, RoomEngineEvent } from '@nitrots/nitro-renderer'; +import { CfhSanctionMessageEvent, CfhTopicsInitEvent, IssueDeletedMessageEvent, IssueInfoMessageEvent, IssuePickFailedMessageEvent, ModeratorActionResultMessageEvent, ModeratorInitMessageEvent, ModeratorToolPreferencesEvent, RoomEngineEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; import { ModToolsEvent } from '../../events/mod-tools/ModToolsEvent'; import { ModToolsOpenRoomChatlogEvent } from '../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; @@ -62,11 +62,93 @@ export const ModToolsMessageHandler: FC<{}> = props => payload: { tickets: newTickets } - }) + }); + + //todo: play ticket sound + //GetNitroInstance().events.dispatchEvent(new NitroSoundEvent(NitroSoundEvent.PLAY_SOUND, sound) }, [dispatchModToolsState, tickets]); + const onModeratorToolPreferencesEvent = useCallback((event: ModeratorToolPreferencesEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + console.log(parser); + }, []); + + const onIssuePickFailedMessageEvent = useCallback((event: IssuePickFailedMessageEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + // todo: let user know it failed + }, []); + + const onIssueDeletedMessageEvent = useCallback((event: IssueDeletedMessageEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + const newTickets = tickets ? Array.from(tickets) : []; + const existingIndex = newTickets.findIndex( entry => entry.issueId === parser.issueId); + + if(existingIndex === -1) return; + + newTickets.splice(existingIndex, 1); + + dispatchModToolsState({ + type: ModToolsActions.SET_TICKETS, + payload: { + tickets: newTickets + } + }); + }, [dispatchModToolsState, tickets]); + + const onModeratorActionResultMessageEvent = useCallback((event: ModeratorActionResultMessageEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + if(parser.success) + { + // do something + } + else + { + // let user know it was a failure + } + }, []); + + const onCfhTopicsInitEvent = useCallback((event: CfhTopicsInitEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + console.log(parser); + }, []); + + const onCfhSanctionMessageEvent = useCallback((event: CfhSanctionMessageEvent) => + { + const parser = event.getParser(); + + if(!parser) return; + + console.log(parser); + }, []); + CreateMessageHook(ModeratorInitMessageEvent, onModeratorInitMessageEvent); CreateMessageHook(IssueInfoMessageEvent, onIssueInfoMessageEvent); + CreateMessageHook(ModeratorToolPreferencesEvent, onModeratorToolPreferencesEvent); + CreateMessageHook(IssuePickFailedMessageEvent, onIssuePickFailedMessageEvent); + CreateMessageHook(IssueDeletedMessageEvent, onIssueDeletedMessageEvent); + CreateMessageHook(ModeratorActionResultMessageEvent, onModeratorActionResultMessageEvent); + CreateMessageHook(CfhTopicsInitEvent, onCfhTopicsInitEvent); + CreateMessageHook(CfhSanctionMessageEvent, onCfhSanctionMessageEvent); const onRoomEngineEvent = useCallback((event: RoomEngineEvent) => { From 3ca58c81a4634462596c26ff09a0d9be35ea33ea Mon Sep 17 00:00:00 2001 From: dank074 Date: Thu, 21 Oct 2021 02:06:12 -0500 Subject: [PATCH 21/29] finished mod action --- .../mod-tools/ModToolsMessageHandler.tsx | 19 +- .../mod-tools/reducers/ModToolsReducer.tsx | 13 +- .../mod-tools/utils/ModActionDefinition.ts | 49 +++++ .../ModToolsUserModActionView.tsx | 181 +++++++++++++++++- .../ModToolsSendUserMessageView.tsx | 4 +- 5 files changed, 256 insertions(+), 10 deletions(-) create mode 100644 src/views/mod-tools/utils/ModActionDefinition.ts diff --git a/src/views/mod-tools/ModToolsMessageHandler.tsx b/src/views/mod-tools/ModToolsMessageHandler.tsx index 1c5713d1..0ffe0d0f 100644 --- a/src/views/mod-tools/ModToolsMessageHandler.tsx +++ b/src/views/mod-tools/ModToolsMessageHandler.tsx @@ -1,11 +1,12 @@ import { CfhSanctionMessageEvent, CfhTopicsInitEvent, IssueDeletedMessageEvent, IssueInfoMessageEvent, IssuePickFailedMessageEvent, ModeratorActionResultMessageEvent, ModeratorInitMessageEvent, ModeratorToolPreferencesEvent, RoomEngineEvent } from '@nitrots/nitro-renderer'; import { FC, useCallback } from 'react'; +import { NotificationAlertEvent } from '../../events'; import { ModToolsEvent } from '../../events/mod-tools/ModToolsEvent'; import { ModToolsOpenRoomChatlogEvent } from '../../events/mod-tools/ModToolsOpenRoomChatlogEvent'; import { ModToolsOpenRoomInfoEvent } from '../../events/mod-tools/ModToolsOpenRoomInfoEvent'; import { ModToolsOpenUserChatlogEvent } from '../../events/mod-tools/ModToolsOpenUserChatlogEvent'; import { ModToolsOpenUserInfoEvent } from '../../events/mod-tools/ModToolsOpenUserInfoEvent'; -import { CreateMessageHook, useRoomEngineEvent, useUiEvent } from '../../hooks'; +import { CreateMessageHook, dispatchUiEvent, useRoomEngineEvent, useUiEvent } from '../../hooks'; import { useModToolsContext } from './context/ModToolsContext'; import { ModToolsActions } from './reducers/ModToolsReducer'; @@ -84,6 +85,7 @@ export const ModToolsMessageHandler: FC<{}> = props => if(!parser) return; // todo: let user know it failed + dispatchUiEvent(new NotificationAlertEvent(['Failed to pick issue'], null, null, null, 'Error', null)); }, []); const onIssueDeletedMessageEvent = useCallback((event: IssueDeletedMessageEvent) => @@ -115,11 +117,11 @@ export const ModToolsMessageHandler: FC<{}> = props => if(parser.success) { - // do something + dispatchUiEvent(new NotificationAlertEvent(['Moderation action was successfull'], null, null, null, 'Success', null)); } else { - // let user know it was a failure + dispatchUiEvent(new NotificationAlertEvent(['There was a problem applying that moderation action'], null, null, null, 'Error', null)); } }, []); @@ -128,9 +130,18 @@ export const ModToolsMessageHandler: FC<{}> = props => const parser = event.getParser(); if(!parser) return; + + const categories = parser.callForHelpCategories; + + dispatchModToolsState({ + type: ModToolsActions.SET_CFH_CATEGORIES, + payload: { + cfhCategories: categories + } + }); console.log(parser); - }, []); + }, [dispatchModToolsState]); const onCfhSanctionMessageEvent = useCallback((event: CfhSanctionMessageEvent) => { diff --git a/src/views/mod-tools/reducers/ModToolsReducer.tsx b/src/views/mod-tools/reducers/ModToolsReducer.tsx index ee94db45..b6fcf343 100644 --- a/src/views/mod-tools/reducers/ModToolsReducer.tsx +++ b/src/views/mod-tools/reducers/ModToolsReducer.tsx @@ -1,4 +1,4 @@ -import { IssueMessageData, ModeratorInitData } from '@nitrots/nitro-renderer'; +import { CallForHelpCategoryData, IssueMessageData, ModeratorInitData } from '@nitrots/nitro-renderer'; import { Reducer } from 'react'; export interface IModToolsState @@ -10,6 +10,7 @@ export interface IModToolsState openUserInfo: number[]; openUserChatlogs: number[]; tickets: IssueMessageData[] + cfhCategories: CallForHelpCategoryData[]; } export interface IModToolsAction @@ -23,6 +24,7 @@ export interface IModToolsAction openUserInfo?: number[]; openUserChatlogs?: number[]; tickets?: IssueMessageData[]; + cfhCategories?: CallForHelpCategoryData[]; } } @@ -35,6 +37,7 @@ export class ModToolsActions public static SET_OPEN_ROOM_CHATLOGS: string = 'MTA_SET_OPEN_CHATLOGS'; public static SET_OPEN_USER_CHATLOGS: string = 'MTA_SET_OPEN_USER_CHATLOGS'; public static SET_TICKETS: string = 'MTA_SET_TICKETS'; + public static SET_CFH_CATEGORIES: string = 'MTA_SET_CFH_CATEGORIES'; public static RESET_STATE: string = 'MTA_RESET_STATE'; } @@ -45,7 +48,8 @@ export const initialModTools: IModToolsState = { openRoomChatlogs: null, openUserChatlogs: null, openUserInfo: null, - tickets: null + tickets: null, + cfhCategories: null }; export const ModToolsReducer: Reducer = (state, action) => @@ -87,6 +91,11 @@ export const ModToolsReducer: Reducer = (state, return { ...state, tickets }; } + case ModToolsActions.SET_CFH_CATEGORIES: { + const cfhCategories = (action.payload.cfhCategories || state.cfhCategories || null); + + return { ...state, cfhCategories }; + } case ModToolsActions.RESET_STATE: { return { ...initialModTools }; } diff --git a/src/views/mod-tools/utils/ModActionDefinition.ts b/src/views/mod-tools/utils/ModActionDefinition.ts new file mode 100644 index 00000000..b8318afa --- /dev/null +++ b/src/views/mod-tools/utils/ModActionDefinition.ts @@ -0,0 +1,49 @@ +export class ModActionDefinition +{ + public static ALERT:number = 1; + public static MUTE:number = 2; + public static BAN:number = 3; + public static KICK:number = 4; + public static TRADE_LOCK:number = 5; + public static MESSAGE:number = 6; + + private readonly _actionId:number; + private readonly _name:string; + private readonly _actionType:number; + private readonly _sanctionTypeId:number; + private readonly _actionLengthHours:number; + + constructor(actionId:number, actionName:string, actionType:number, sanctionTypeId:number, actionLengthHours:number) + { + this._actionId = actionId; + this._name = actionName; + this._actionType = actionType; + this._sanctionTypeId = sanctionTypeId; + this._actionLengthHours = actionLengthHours; + } + + public get actionId():number + { + return this._actionId; + } + + public get name():string + { + return this._name; + } + + public get actionType():number + { + return this._actionType; + } + + public get sanctionTypeId():number + { + return this._sanctionTypeId; + } + + public get actionLengthHours():number + { + return this._actionLengthHours; + } +} diff --git a/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx index 2a8495a2..59e244f8 100644 --- a/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx +++ b/src/views/mod-tools/views/user/user-mod-action/ModToolsUserModActionView.tsx @@ -1,16 +1,191 @@ -import { FC } from 'react'; +import { CallForHelpTopicData, DefaultSanctionMessageComposer, ModAlertMessageComposer, ModBanMessageComposer, ModKickMessageComposer, ModMessageMessageComposer, ModMuteMessageComposer, ModTradingLockMessageComposer } from '@nitrots/nitro-renderer'; +import { FC, useCallback, useMemo, useState } from 'react'; +import { LocalizeText } from '../../../../../api'; +import { NotificationAlertEvent } from '../../../../../events'; +import { dispatchUiEvent, SendMessageHook } from '../../../../../hooks'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; +import { useModToolsContext } from '../../../context/ModToolsContext'; +import { ModActionDefinition } from '../../../utils/ModActionDefinition'; import { ModToolsUserModActionViewProps } from './ModToolsUserModActionView.types'; +const actions = [ + new ModActionDefinition(1, 'Alert', ModActionDefinition.ALERT, 1, 0), + new ModActionDefinition(2, 'Mute 1h', ModActionDefinition.MUTE, 2, 0), + new ModActionDefinition(4, 'Ban 7 days', ModActionDefinition.BAN, 4, 0), + new ModActionDefinition(3, 'Ban 18h', ModActionDefinition.BAN, 3, 0), + new ModActionDefinition(5, 'Ban 30 days (step 1)', ModActionDefinition.BAN, 5, 0), + new ModActionDefinition(7, 'Ban 30 days (step 2)', ModActionDefinition.BAN, 7, 0), + new ModActionDefinition(6, 'Ban 100 years', ModActionDefinition.BAN, 6, 0), + new ModActionDefinition(106, 'Ban avatar-only 100 years', ModActionDefinition.BAN, 6, 0), + new ModActionDefinition(101, 'Kick', ModActionDefinition.KICK, 0, 0), + new ModActionDefinition(102, 'Lock trade 1 week', ModActionDefinition.TRADE_LOCK, 0, 168), + new ModActionDefinition(104, 'Lock trade permanent', ModActionDefinition.TRADE_LOCK, 0, 876000), + new ModActionDefinition(105, 'Message', ModActionDefinition.MESSAGE, 0, 0), +]; + export const ModToolsUserModActionView: FC = props => { const { user = null, onCloseClick = null } = props; + const { modToolsState = null, dispatchModToolsState = null } = useModToolsContext(); + const { cfhCategories = null, settings = null } = modToolsState; + const [ selectedTopic, setSelectedTopic ] = useState(-1); + const [ selectedAction, setSelectedAction ] = useState(-1); + const [ message, setMessage ] = useState(''); + + const topics = useMemo(() => + { + const values: CallForHelpTopicData[] = []; + + if(!cfhCategories) return values; + + for(let category of cfhCategories) + { + for(let topic of category._Str_14841) + { + values.push(topic) + } + } + + return values; + }, [cfhCategories]); + + const sendSanction = useCallback(() => + { + if(selectedTopic === -1) + { + dispatchUiEvent(new NotificationAlertEvent(['You must select a CFH topic'], null, null, null, 'Error', null)); + return; + } + if(!settings || !settings.cfhPermission) + { + dispatchUiEvent(new NotificationAlertEvent(['You do not have permission to do this'], null, null, null, 'Error', null)); + return; + } + + const category = topics[selectedTopic]; + const sanction = actions[selectedAction]; + + if(!category) + { + dispatchUiEvent(new NotificationAlertEvent(['You must select a CFH topic'], null, null, null, 'Error', null)); + return; + } + + const messageOrDefault = message.trim().length === 0 ? LocalizeText('help.cfh.topic.' + category.id) : message; + + if(!sanction) // send default sanction + { + SendMessageHook(new DefaultSanctionMessageComposer(user.userId, category.id, messageOrDefault)); + onCloseClick(null); + return; + } + + switch(sanction.actionType) + { + case ModActionDefinition.ALERT: + + if(!settings.alertPermission) + { + dispatchUiEvent(new NotificationAlertEvent(['You have insufficient permissions.'], null, null, null, 'Error', null)); + return; + } + + if(message.trim().length === 0) + { + dispatchUiEvent(new NotificationAlertEvent(['Please write a message to user.'], null, null, null, 'Error', null)); + return; + } + + SendMessageHook(new ModAlertMessageComposer(user.userId, message, category.id)); + + break; + case ModActionDefinition.MUTE: + SendMessageHook(new ModMuteMessageComposer(user.userId, messageOrDefault, category.id)); + + break; + case ModActionDefinition.BAN: + + if(!settings.banPermission) + { + dispatchUiEvent(new NotificationAlertEvent(['You have insufficient permissions.'], null, null, null, 'Error', null)); + return; + } + + SendMessageHook(new ModBanMessageComposer(user.userId, messageOrDefault, category.id, selectedAction, (sanction.actionId === 106))); + + break; + + case ModActionDefinition.KICK: + + if(!settings.kickPermission) + { + dispatchUiEvent(new NotificationAlertEvent(['You have insufficient permissions.'], null, null, null, 'Error', null)); + return; + } + + SendMessageHook(new ModKickMessageComposer(user.userId, messageOrDefault, category.id)); + + break; + + case ModActionDefinition.TRADE_LOCK: + { + const numSeconds = sanction.actionLengthHours * 60; + SendMessageHook(new ModTradingLockMessageComposer(user.userId, messageOrDefault, numSeconds, category.id)); + } + break; + + case ModActionDefinition.MESSAGE: + + if(message.trim().length === 0) + { + dispatchUiEvent(new NotificationAlertEvent(['Please write a message to user.'], null, null, null, 'Error', null)); + return; + } + + SendMessageHook(new ModMessageMessageComposer(user.userId, message, category.id)); + + break; + } + + onCloseClick(null); + }, [message, onCloseClick, selectedAction, selectedTopic, settings, topics, user.userId]); return ( - + - {user &&
} + { user && + <> +
+ +
+ +
+ +
+ +
+ +