From a931fe0ddf34481e01b2474882504ba5f23d21ca Mon Sep 17 00:00:00 2001 From: Gabe Kangas Date: Sun, 2 Oct 2022 11:02:21 -0700 Subject: [PATCH] Update the chat moderation modal with slightly better layout. Closes #2073 --- .../ChatModerationActionMenu.tsx | 11 +- .../ChatModerationDetailsModal.module.scss | 10 +- .../ChatModerationDetailsModal.tsx | 155 +++++++++--------- 3 files changed, 90 insertions(+), 86 deletions(-) diff --git a/web/components/chat/ChatModerationActionMenu/ChatModerationActionMenu.tsx b/web/components/chat/ChatModerationActionMenu/ChatModerationActionMenu.tsx index 7da89f734..7b68a54af 100644 --- a/web/components/chat/ChatModerationActionMenu/ChatModerationActionMenu.tsx +++ b/web/components/chat/ChatModerationActionMenu/ChatModerationActionMenu.tsx @@ -4,13 +4,14 @@ import { EyeInvisibleOutlined, SmallDashOutlined, } from '@ant-design/icons'; -import { Dropdown, Menu, MenuProps, Space, Modal, message } from 'antd'; +import { Dropdown, Menu, MenuProps, Space, message, Modal as AntModal } from 'antd'; import { FC, useState } from 'react'; +import { Modal } from '../../ui/Modal/Modal'; import { ChatModerationDetailsModal } from '../ChatModerationDetailsModal/ChatModerationDetailsModal'; import styles from './ChatModerationActionMenu.module.scss'; import ChatModeration from '../../../services/moderation-service'; -const { confirm } = Modal; +const { confirm } = AntModal; export type ChatModerationActionMenuProps = { accessToken: string; @@ -119,11 +120,9 @@ export const ChatModerationActionMenu: FC = ({ { + handleCancel={() => { setShowUserDetailsModal(false); }} > diff --git a/web/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal.module.scss b/web/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal.module.scss index 4ac5e234e..2ce6d34a8 100644 --- a/web/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal.module.scss +++ b/web/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal.module.scss @@ -10,8 +10,16 @@ } .colorBlock { - width: 50%; + display: inline-block; + width: 60px; height: 20px; border: 1px solid #000; text-align: center; + font-size: 0.8rem; +} + +.displayName { + font-weight: bold; + padding-right: 10px; + font-size: 1.2rem; } diff --git a/web/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal.tsx b/web/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal.tsx index 9d6a9ef9f..9a9d90055 100644 --- a/web/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal.tsx +++ b/web/components/chat/ChatModerationDetailsModal/ChatModerationDetailsModal.tsx @@ -1,7 +1,13 @@ -import { Button, Col, Row, Spin } from 'antd'; +import { Button, Col, Collapse, Row, Spin, Table, Tag } from 'antd'; import { FC, useEffect, useState } from 'react'; +import format from 'date-fns/format'; +import { DeleteOutlined } from '@ant-design/icons'; +import { ColumnsType } from 'antd/lib/table'; import ChatModeration from '../../../services/moderation-service'; import styles from './ChatModerationDetailsModal.module.scss'; +import { formatUAstring } from '../../../utils/format'; + +const { Panel } = Collapse; export type ChatModerationDetailsModalProps = { userId: string; @@ -54,48 +60,25 @@ const ValueRow = ({ label, value }: { label: string; value: string }) => ( ); -const ChatMessageRow = ({ - id, - body, - accessToken, -}: { - id: string; - body: string; - accessToken: string; -}) => ( - - {body} - - - - -); - const ConnectedClient = ({ client }: { client: Client }) => { - const { messageCount, userAgent, connectedAt, geo } = client; + const { messageCount, connectedAt, geo } = client; + const connectedAtDate = format(new Date(connectedAt), 'PP pp'); return (
- - - + {geo !== 'N/A' && } +
); }; -// eslint-disable-next-line react/prop-types const UserColorBlock = ({ color }) => { const bg = `var(--theme-color-users-${color})`; return ( - - Color - -
- {color} -
- -
+
+ Color {color} +
); }; @@ -108,7 +91,9 @@ export const ChatModerationDetailsModal: FC = ( const getDetails = async () => { try { - const response = await (await fetch(`/api/moderation/chat/user/${userId}`)).json(); + const response = await ( + await fetch(`/api/moderation/chat/user/${userId}?accessToken=${accessToken}`) + ).json(); setUserDetails(response); setLoading(false); } catch (e) { @@ -125,57 +110,69 @@ export const ChatModerationDetailsModal: FC = ( } const { user, connectedClients, messages } = userDetails; - const { displayName, displayColor, createdAt, previousNames, scopes, isBot, authenticated } = - user; + const { displayColor, createdAt, previousNames, scopes, isBot, authenticated } = user; + + const totalMessagesSent = connectedClients.reduce((acc, client) => acc + client.messageCount, 0); + const createdAtDate = format(new Date(createdAt), 'PP pp'); + + const chatMessageColumns: ColumnsType = [ + { + title: 'Message', + dataIndex: 'body', + key: 'body', + }, + { + title: 'Sent At', + dataIndex: 'timestamp', + key: 'timestamp', + render: timestamp => format(new Date(timestamp), 'PP pp'), + }, + { + title: 'Delete', + key: 'delete', + render: (text, record) => ( +