Skip to content

Commit 7d68c19

Browse files
committed
FE: Add Prevoius button to topic message page - frontend side (kafbat#550)
1 parent 55fc250 commit 7d68c19

File tree

6 files changed

+39
-1
lines changed

6 files changed

+39
-1
lines changed

api/src/main/java/io/kafbat/ui/emitter/ConsumingStats.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ void sendFinishEvent(FluxSink<TopicMessageEventDTO> sink, @Nullable Cursor.Track
3232
sink.next(
3333
new TopicMessageEventDTO()
3434
.type(TopicMessageEventDTO.TypeEnum.DONE)
35+
.prevCursor( // FIXME
36+
null
37+
)
3538
.nextCursor(
3639
cursor != null
3740
? new TopicMessagePageCursorDTO().id(cursor.registerCursor())

contract/src/main/resources/swagger/kafbat-ui-api.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2954,6 +2954,8 @@ components:
29542954
$ref: "#/components/schemas/TopicMessagePhase"
29552955
consuming:
29562956
$ref: "#/components/schemas/TopicMessageConsuming"
2957+
prevCursor:
2958+
$ref: "#/components/schemas/TopicMessagePageCursor"
29572959
nextCursor:
29582960
$ref: "#/components/schemas/TopicMessagePageCursor"
29592961

frontend/src/components/Topics/Topic/Messages/MessagesTable.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { TopicMessage } from 'generated-sources';
55
import React, { useState } from 'react';
66
import { Button } from 'components/common/Button/Button';
77
import * as S from 'components/common/NewTable/Table.styled';
8-
import { useGoToNextPage, useIsLiveMode } from 'lib/hooks/useMessagesFilters';
8+
import { useGoToPrevPage, useGoToNextPage, useIsLiveMode } from 'lib/hooks/useMessagesFilters';
99
import { useMessageFiltersStore } from 'lib/hooks/useMessageFiltersStore';
1010

1111
import PreviewModal from './PreviewModal';
@@ -21,11 +21,13 @@ const MessagesTable: React.FC<MessagesTableProps> = ({
2121
isFetching,
2222
}) => {
2323
const goToNextPage = useGoToNextPage();
24+
const goToPrevPage = useGoToPrevPage();
2425
const [previewFor, setPreviewFor] = useState<string | null>(null);
2526

2627
const [keyFilters, setKeyFilters] = useState<PreviewFilter[]>([]);
2728
const [contentFilters, setContentFilters] = useState<PreviewFilter[]>([]);
2829
const nextCursor = useMessageFiltersStore((state) => state.nextCursor);
30+
const prevCursor = useMessageFiltersStore((state) => state.prevCursor);
2931
const isLive = useIsLiveMode();
3032

3133
return (
@@ -97,6 +99,14 @@ const MessagesTable: React.FC<MessagesTableProps> = ({
9799
</Table>
98100
<S.Pagination>
99101
<S.Pages>
102+
<Button
103+
disabled={isLive || isFetching || !prevCursor}
104+
buttonType="secondary"
105+
buttonSize="L"
106+
onClick={goToPrevPage}
107+
>
108+
← Previous
109+
</Button>
100110
<Button
101111
disabled={isLive || isFetching || !nextCursor}
102112
buttonType="secondary"

frontend/src/lib/hooks/api/topicMessages.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,13 @@ export const useTopicMessages = ({
102102
requestParams.append(MessagesFilterKeys.partitions, partitions);
103103
}
104104
const { nextCursor, setNextCursor } = useMessageFiltersStore.getState();
105+
const { prevCursor, setPrevCursor } = useMessageFiltersStore.getState();
105106

106107
const searchParamPage = getPageValue(searchParams);
107108
if (currentPage.current < searchParamPage && nextCursor) {
108109
requestParams.set(MessagesFilterKeys.cursor, nextCursor);
110+
} else if (currentPage.current > searchParamPage && prevCursor) {
111+
requestParams.set(MessagesFilterKeys.cursor, prevCursor);
109112
}
110113
currentPage.current = searchParamPage;
111114

@@ -147,6 +150,9 @@ export const useTopicMessages = ({
147150
if (nextCursor !== parsedData.nextCursor?.id) {
148151
setNextCursor(parsedData.nextCursor?.id || undefined);
149152
}
153+
if (prevCursor !== parsedData.prevCursor?.id) {
154+
setPrevCursor(parsedData.prevCursor?.id || undefined);
155+
}
150156
break;
151157
default:
152158
}
@@ -157,6 +163,7 @@ export const useTopicMessages = ({
157163
},
158164
onerror(err) {
159165
setNextCursor(undefined);
166+
setPrevCursor(undefined);
160167
setIsFetching(false);
161168
abortController.current = new AbortController();
162169
showServerError(err);

frontend/src/lib/hooks/useMessageFiltersStore.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ interface MessageFiltersState {
1515
notPersistedFilter: AdvancedFilter | undefined;
1616
save: (filter: AdvancedFilter) => void;
1717
nextCursor: string | undefined;
18+
prevCursor: string | undefined;
1819
setNextCursor: (str: string | undefined) => void;
20+
setPrevCursor: (str: string | undefined) => void;
1921
replace: (filterId: string, filter: AdvancedFilter) => void;
2022
commit: (filter: AdvancedFilter | undefined) => void;
2123
remove: (id: string) => void;
@@ -39,6 +41,7 @@ export const useMessageFiltersStore = create<MessageFiltersState>()(
3941
(set) => ({
4042
filters: {},
4143
nextCursor: undefined,
44+
prevCursor: undefined,
4245
notPersistedFilter: undefined,
4346
save: (filter) =>
4447
set((state) => ({
@@ -73,6 +76,7 @@ export const useMessageFiltersStore = create<MessageFiltersState>()(
7376
}),
7477
removeAll: () => set(() => ({ filters: {} })),
7578
setNextCursor: (cursor) => set(() => ({ nextCursor: cursor })),
79+
setPrevCursor: (cursor) => set(() => ({ prevCursor: cursor })),
7680
}),
7781
{
7882
name: `${LOCAL_STORAGE_KEY_PREFIX}-message-filters`,

frontend/src/lib/hooks/useMessagesFilters.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ export function getPageValue(urlSearchParam: URLSearchParams) {
6363
return page;
6464
}
6565

66+
export function useGoToPrevPage(initSearchParams?: URLSearchParams) {
67+
const [, setSearchParams] = useSearchParams(initSearchParams);
68+
return () => {
69+
setSearchParams((params) => {
70+
const prevPage = getPageValue(params) - 1;
71+
params.set(MessagesFilterKeys.page, prevPage.toString());
72+
73+
return params;
74+
});
75+
};
76+
}
77+
6678
export function useGoToNextPage(initSearchParams?: URLSearchParams) {
6779
const [, setSearchParams] = useSearchParams(initSearchParams);
6880
return () => {

0 commit comments

Comments
 (0)