diff --git a/kafka-ui-react-app/src/components/KsqlDb/Query/__test__/Query.spec.tsx b/kafka-ui-react-app/src/components/KsqlDb/Query/__test__/Query.spec.tsx index 0e4884ce1c..7b6f133f2a 100644 --- a/kafka-ui-react-app/src/components/KsqlDb/Query/__test__/Query.spec.tsx +++ b/kafka-ui-react-app/src/components/KsqlDb/Query/__test__/Query.spec.tsx @@ -1,4 +1,4 @@ -import { render } from 'lib/testHelpers'; +import { render, EventSourceMock } from 'lib/testHelpers'; import React from 'react'; import Query, { getFormattedErrorFromTableData, @@ -20,27 +20,6 @@ const renderComponent = () => } ); -// Small mock to get rid of reference error -class EventSourceMock { - url: string; - - close: () => void; - - open: () => void; - - error: () => void; - - onmessage: () => void; - - constructor(url: string) { - this.url = url; - this.open = jest.fn(); - this.error = jest.fn(); - this.onmessage = jest.fn(); - this.close = jest.fn(); - } -} - describe('Query', () => { it('renders', () => { renderComponent(); diff --git a/kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/Filters.tsx b/kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/Filters.tsx index 84aaa0c762..379a48f68e 100644 --- a/kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/Filters.tsx +++ b/kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/Filters.tsx @@ -10,7 +10,7 @@ import { TopicMessageEventTypeEnum, MessageFilterType, } from 'generated-sources'; -import React from 'react'; +import React, { useContext } from 'react'; import { omitBy } from 'lodash'; import { useHistory, useLocation } from 'react-router'; import DatePicker from 'react-datepicker'; @@ -25,6 +25,8 @@ import { Button } from 'components/common/Button/Button'; import FilterModal, { FilterEdit, } from 'components/Topics/Topic/Details/Messages/Filters/FilterModal'; +import { SeekDirectionOptions } from 'components/Topics/Topic/Details/Messages/Messages'; +import TopicMessagesContext from 'components/contexts/TopicMessagesContext'; import * as S from './Filters.styled'; import { @@ -66,11 +68,6 @@ export const SeekTypeOptions = [ { value: SeekType.OFFSET, label: 'Offset' }, { value: SeekType.TIMESTAMP, label: 'Timestamp' }, ]; -export const SeekDirectionOptions = [ - { value: SeekDirection.FORWARD, label: 'Oldest First', isLive: false }, - { value: SeekDirection.BACKWARD, label: 'Newest First', isLive: false }, - { value: SeekDirection.TAILING, label: 'Live Mode', isLive: true }, -]; const Filters: React.FC = ({ clusterName, @@ -88,16 +85,14 @@ const Filters: React.FC = ({ const location = useLocation(); const history = useHistory(); + const { searchParams, seekDirection, isLive, changeSeekDirection } = + useContext(TopicMessagesContext); + const [isOpen, setIsOpen] = React.useState(false); const toggleIsOpen = () => setIsOpen(!isOpen); const source = React.useRef(null); - const searchParams = React.useMemo( - () => new URLSearchParams(location.search), - [location] - ); - const [selectedPartitions, setSelectedPartitions] = React.useState( getSelectedPartitionsFromSeekToParam(searchParams, partitions) ); @@ -132,10 +127,6 @@ const Filters: React.FC = ({ : MessageFilterType.STRING_CONTAINS ); const [query, setQuery] = React.useState(searchParams.get('q') || ''); - const [seekDirection, setSeekDirection] = React.useState( - (searchParams.get('seekDirection') as SeekDirection) || - SeekDirection.FORWARD - ); const isSeekTypeControlVisible = React.useMemo( () => selectedPartitions.length > 0, [selectedPartitions] @@ -178,7 +169,7 @@ const Filters: React.FC = ({ setAttempt(attempt + 1); if (isSeekTypeControlVisible) { - props.seekType = currentSeekType; + props.seekType = isLive ? SeekType.LATEST : currentSeekType; props.seekTo = selectedPartitions.map(({ value }) => { let seekToOffset; @@ -217,21 +208,6 @@ const Filters: React.FC = ({ query, ]); - const toggleSeekDirection = (val: string) => { - switch (val) { - case SeekDirection.FORWARD: - setSeekDirection(SeekDirection.FORWARD); - break; - case SeekDirection.BACKWARD: - setSeekDirection(SeekDirection.BACKWARD); - break; - case SeekDirection.TAILING: - setSeekDirection(SeekDirection.TAILING); - break; - default: - } - }; - const handleSSECancel = () => { if (!source.current) return; @@ -295,7 +271,7 @@ const Filters: React.FC = ({ }; // eslint-disable-next-line consistent-return React.useEffect(() => { - if (location.search.length !== 0) { + if (location.search?.length !== 0) { const url = `${BASE_PARAMS.basePath}/api/clusters/${clusterName}/topics/${topicName}/messages${location.search}`; const sse = new EventSource(url); @@ -346,7 +322,7 @@ const Filters: React.FC = ({ updatePhase, ]); React.useEffect(() => { - if (location.search.length === 0) { + if (location.search?.length === 0) { handleFiltersSubmit(); } }, [handleFiltersSubmit, location]); @@ -376,7 +352,7 @@ const Filters: React.FC = ({ selectSize="M" minWidth="100px" options={SeekTypeOptions} - disabled={seekDirection === SeekDirection.TAILING} + disabled={isLive} /> {currentSeekType === SeekType.OFFSET ? ( = ({ className="offset-selector" placeholder="Offset" onChange={({ target: { value } }) => setOffset(value)} - disabled={seekDirection === SeekDirection.TAILING} + disabled={isLive} /> ) : ( = ({ dateFormat="MMMM d, yyyy HH:mm" className="date-picker" placeholderText="Select timestamp" - disabled={seekDirection === SeekDirection.TAILING} + disabled={isLive} /> )} @@ -440,11 +416,11 @@ const Filters: React.FC = ({