diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessageListWrapper.styles.tsx b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessageListWrapper.styles.tsx index dfa1aaab02..1abbe30800 100644 --- a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessageListWrapper.styles.tsx +++ b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessageListWrapper.styles.tsx @@ -1,15 +1,6 @@ import styled from 'styled-components' import { Col } from 'uiSrc/components/base/layout/flex' -export const InnerContainer = styled(Col)` - background-color: ${({ theme }) => - theme.semantic.color.background.neutral300}; - border-radius: ${({ theme }) => theme.core.space.space100}; - border: 1px solid ${({ theme }) => theme.semantic.color.border.neutral500}; - padding: ${({ theme }) => theme.core.space.space300}; - margin: ${({ theme }) => theme.core.space.space200}; -` - export const Wrapper = styled(Col)` margin: ${({ theme }) => theme.core.space.space200}; /* diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/MessagesList.spec.tsx b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/MessagesList.spec.tsx deleted file mode 100644 index 67143618a5..0000000000 --- a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/MessagesList.spec.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' -import { mock } from 'ts-mockito' -import { render } from 'uiSrc/utils/test-utils' - -import MessagesList, { Props } from './MessagesList' - -const mockedProps = { - ...mock(), - height: 20, - width: 20, -} - -describe('MessagesList', () => { - it('should render', () => { - expect(render()).toBeTruthy() - }) -}) diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/MessagesList.tsx b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/MessagesList.tsx deleted file mode 100644 index f6564992d7..0000000000 --- a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/MessagesList.tsx +++ /dev/null @@ -1,181 +0,0 @@ -import React, { useCallback, useEffect, useRef, useState } from 'react' -import { - ListChildComponentProps, - ListOnScrollProps, - VariableSizeList as List, -} from 'react-window' -import { useParams } from 'react-router-dom' - -import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' -import { FormatedDate, RiTooltip } from 'uiSrc/components' -import { ChevronDownIcon } from 'uiSrc/components/base/icons' -import { IconButton } from 'uiSrc/components/base/forms/buttons' -import { IMessage } from 'apiSrc/modules/pub-sub/interfaces/message.interface' - -import styles from './styles.module.scss' - -export interface Props { - items: IMessage[] - width?: number - height?: number -} - -const PROTRUDING_OFFSET = 2 -const MIN_ROW_HEIGHT = 30 - -const MessagesList = (props: Props) => { - const { items = [], width = 0, height = 0 } = props - - const [showAnchor, setShowAnchor] = useState(false) - const listRef = useRef(null) - const followRef = useRef(true) - const hasMountedRef = useRef(false) - const rowHeights = useRef<{ [key: number]: number }>({}) - const outerRef = useRef(null) - - const { instanceId = '' } = useParams<{ instanceId: string }>() - - useEffect(() => { - scrollToBottom() - }, []) - - useEffect(() => { - if (items.length > 0 && followRef.current) { - setTimeout(() => { - scrollToBottom() - }, 0) - } - }, [items]) - - useEffect(() => { - if (followRef.current) { - setTimeout(() => { - scrollToBottom() - }, 0) - } - }, [width, height]) - - const getRowHeight = (index: number) => - rowHeights.current[index] > MIN_ROW_HEIGHT - ? rowHeights.current[index] + 2 - : MIN_ROW_HEIGHT - - const setRowHeight = (index: number, size: number) => { - listRef.current?.resetAfterIndex(0) - rowHeights.current = { ...rowHeights.current, [index]: size } - } - - const scrollToBottom = () => { - listRef.current?.scrollToItem(items.length - 1, 'end') - requestAnimationFrame(() => { - listRef.current?.scrollToItem(items.length - 1, 'end') - }) - } - - const handleAnchorClick = () => { - scrollToBottom() - } - - const handleScroll = useCallback((e: ListOnScrollProps) => { - if (!hasMountedRef.current) { - hasMountedRef.current = true - return - } - - if (!e.scrollUpdateWasRequested) { - if ( - followRef.current && - outerRef.current?.scrollHeight !== outerRef.current?.offsetHeight - ) { - sendEventTelemetry({ - event: TelemetryEvent.PUBSUB_AUTOSCROLL_PAUSED, - eventData: { - databaseId: instanceId, - }, - }) - } - followRef.current = false - setShowAnchor(true) - } - - if (!outerRef.current) { - return - } - - if ( - e.scrollOffset + outerRef.current.offsetHeight === - outerRef.current.scrollHeight - ) { - if ( - !followRef.current && - outerRef.current.scrollHeight !== outerRef.current.offsetHeight - ) { - sendEventTelemetry({ - event: TelemetryEvent.PUBSUB_AUTOSCROLL_RESUMED, - eventData: { - databaseId: instanceId, - }, - }) - } - followRef.current = true - setShowAnchor(false) - } - }, []) - - const Row = ({ index, style }: ListChildComponentProps) => { - const rowRef = useRef(null) - - useEffect(() => { - if (rowRef.current) { - setRowHeight(index, rowRef.current?.clientHeight) - } - }, [rowRef]) - - const { channel, message, time } = items[index] - - return ( -
-
- -
-
- -
{channel}
-
-
-
- {message} -
-
- ) - } - - return ( - <> - - {Row} - - {showAnchor && ( - - )} - - ) -} - -export default MessagesList diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/index.ts b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/index.ts deleted file mode 100644 index b8c4ff258f..0000000000 --- a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import MessagesList from './MessagesList' - -export default MessagesList diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/styles.module.scss b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/styles.module.scss deleted file mode 100644 index 54a6b9d8dd..0000000000 --- a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesList/styles.module.scss +++ /dev/null @@ -1,99 +0,0 @@ -.time, -.channel, -.message { - display: inline-block !important; - font-size: 13px; - line-height: 18px; - letter-spacing: -0.13px; - padding-bottom: 10px; - vertical-align: text-top; -} - -.time { - color: var(--defaultGreenColor); - width: 150px; - padding-right: 4px; -} - -.channel { - color: var(--euiColorMediumShade); - width: 220px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; -} - -.channelAnchor { - max-width: 220px; - padding-right: 12px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - display: inline-block; - vertical-align: middle; -} - -.message { - width: calc(100% - 372px); - color: var(--htmlColor); - word-break: break-word; - - span { - display: inline-block; - vertical-align: middle; - } -} - -.header { - width: 100%; - display: flex; - height: 24px; - - .time, - .channel, - .message { - font-size: 14px; - line-height: 24px; - color: var(--htmlColor); - } -} - -.wrapperContainer { - display: flex; - flex-direction: column; - height: 100%; - width: 100%; -} - -.listContainer { - height: 100%; - width: 100%; - padding-top: 14px; - padding-right: 6px; - display: flex; - flex-direction: column; - overflow: hidden; -} - -.listContent { - @include eui.scrollBar; -} - -.anchorBtn { - position: absolute; - z-index: 10; - bottom: 10px; - right: 28px; - background-color: var(--euiColorSecondary) !important; - color: var(--euiColorPrimaryText) !important; - width: 36px !important; - height: 36px !important; - - box-shadow: 0 3px 6px #00000099 !important; - border-radius: 18px !important; - - svg { - width: 20px; - height: 20px; - } -} diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.config.tsx b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.config.tsx new file mode 100644 index 0000000000..1078e17434 --- /dev/null +++ b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.config.tsx @@ -0,0 +1,31 @@ +import { IMessage } from 'apiSrc/modules/pub-sub/interfaces/message.interface' +import { ColumnDef } from 'uiSrc/components/base/layout/table' +import { + PUB_SUB_TABLE_COLUMN_FIELD_NAME_MAP, + PubSubTableColumn, +} from './MessagesListTable.constants' +import MessagesListTableCellTimestamp from './components/MessagesListTableCellTimestamp' + +export const PUB_SUB_TABLE_COLUMNS: ColumnDef[] = [ + { + id: PubSubTableColumn.Timestamp, + accessorKey: PubSubTableColumn.Timestamp, + header: PUB_SUB_TABLE_COLUMN_FIELD_NAME_MAP.get( + PubSubTableColumn.Timestamp, + ), + size: 30, + enableSorting: true, + cell: MessagesListTableCellTimestamp, + }, + { + id: PubSubTableColumn.Channel, + accessorKey: PubSubTableColumn.Channel, + header: PUB_SUB_TABLE_COLUMN_FIELD_NAME_MAP.get(PubSubTableColumn.Channel), + size: 40, + }, + { + id: PubSubTableColumn.Message, + accessorKey: PubSubTableColumn.Message, + header: PUB_SUB_TABLE_COLUMN_FIELD_NAME_MAP.get(PubSubTableColumn.Message), + }, +] diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.constants.ts b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.constants.ts new file mode 100644 index 0000000000..e2818cf7a0 --- /dev/null +++ b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.constants.ts @@ -0,0 +1,14 @@ +export enum PubSubTableColumn { + Timestamp = 'time', + Channel = 'channel', + Message = 'message', +} + +export const PUB_SUB_TABLE_COLUMN_FIELD_NAME_MAP = new Map< + PubSubTableColumn, + string +>([ + [PubSubTableColumn.Timestamp, 'Timestamp'], + [PubSubTableColumn.Channel, 'Channel'], + [PubSubTableColumn.Message, 'Message'], +]) diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.types.ts b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.types.ts new file mode 100644 index 0000000000..ff2ee074b9 --- /dev/null +++ b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/MessagesListTable.types.ts @@ -0,0 +1,7 @@ +import { ReactElement } from 'react' +import { CellContext } from 'uiSrc/components/base/layout/table' +import { IMessage } from 'apiSrc/modules/pub-sub/interfaces/message.interface' + +export type IMessagesListTableCell = ( + props: CellContext, +) => ReactElement | null diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/components/MessagesListTableCellTimestamp.tsx b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/components/MessagesListTableCellTimestamp.tsx new file mode 100644 index 0000000000..dc254b9972 --- /dev/null +++ b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListTable/components/MessagesListTableCellTimestamp.tsx @@ -0,0 +1,12 @@ +import React from 'react' + +import { FormatedDate } from 'uiSrc/components' +import { IMessagesListTableCell } from '../MessagesListTable.types' + +const MessagesListTableCellTimestamp: IMessagesListTableCell = ({ row }) => { + const date = row.original.time * 1000 + + return +} + +export default MessagesListTableCellTimestamp diff --git a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListWrapper.tsx b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListWrapper.tsx index f42cb4f5b0..fb5941ef5c 100644 --- a/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListWrapper.tsx +++ b/redisinsight/ui/src/pages/pub-sub/components/messages-list/MessagesListWrapper.tsx @@ -1,6 +1,5 @@ import React, { useEffect, useState } from 'react' import { useSelector } from 'react-redux' -import AutoSizer from 'react-virtualized-auto-sizer' import { connectedInstanceOverviewSelector } from 'uiSrc/slices/instances/instances' import { pubSubSelector } from 'uiSrc/slices/pubsub/pubsub' @@ -9,7 +8,6 @@ import { CommandsVersions } from 'uiSrc/constants/commandsVersions' import { useConnectionType } from 'uiSrc/components/hooks/useConnectionType' import { DEFAULT_SEARCH_MATCH } from 'uiSrc/constants/api' import EmptyMessagesList from './EmptyMessagesList' -import MessagesList from './MessagesList' import { Row } from 'uiSrc/components/base/layout/flex' import { Text } from 'uiSrc/components/base/text' @@ -17,7 +15,10 @@ import { RiBadge } from 'uiSrc/components/base/display/badge/RiBadge' import { HorizontalSpacer } from 'uiSrc/components/base/layout' import SubscribeForm from '../subscribe-form' import PatternsInfo from '../patternsInfo' -import { InnerContainer, Wrapper } from './MessageListWrapper.styles' +import { Wrapper } from './MessageListWrapper.styles' +import { Table } from 'uiSrc/components/base/layout/table' +import { PUB_SUB_TABLE_COLUMNS } from './MessagesListTable/MessagesListTable.config' +import { PubSubTableColumn } from './MessagesListTable/MessagesListTable.constants' const MessagesListWrapper = () => { const { @@ -48,7 +49,7 @@ const MessagesListWrapper = () => { if (hasMessages || isSubscribed) { return ( - + @@ -72,29 +73,17 @@ const MessagesListWrapper = () => { - - - Timestamp - - Channel - - Message - - - {hasMessages && ( - - {({ width, height }) => ( - - )} - - )} - - {!hasMessages && ( - - No messages published yet - - )} - +
+ + ) }