Skip to content

Commit 160a659

Browse files
committed
FE: Topics: Save field previews into local storage
Resolves: #439
1 parent 28677a9 commit 160a659

File tree

2 files changed

+53
-12
lines changed

2 files changed

+53
-12
lines changed

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

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,81 @@ import PageLoader from 'components/common/PageLoader/PageLoader';
22
import { Table } from 'components/common/table/Table/Table.styled';
33
import TableHeaderCell from 'components/common/table/TableHeaderCell/TableHeaderCell';
44
import { TopicMessage } from 'generated-sources';
5-
import React, { useState } from 'react';
5+
import React, { useEffect, useState } from 'react';
66
import { Button } from 'components/common/Button/Button';
77
import * as S from 'components/common/NewTable/Table.styled';
88
import { usePaginateTopics, useIsLiveMode } from 'lib/hooks/useMessagesFilters';
99
import { useMessageFiltersStore } from 'lib/hooks/useMessageFiltersStore';
10+
import useAppParams from 'lib/hooks/useAppParams';
11+
import { RouteParamsClusterTopic } from 'lib/paths';
12+
import { useLocalStorage } from 'lib/hooks/useLocalStorage';
1013

11-
import PreviewModal from './PreviewModal';
1214
import Message, { PreviewFilter } from './Message';
15+
import PreviewModal from './PreviewModal';
1316

1417
export interface MessagesTableProps {
1518
messages: TopicMessage[];
1619
isFetching: boolean;
1720
}
1821

22+
interface MessagePreviewProps {
23+
[key: string]: {
24+
keyFilters: PreviewFilter[];
25+
contentFilters: PreviewFilter[];
26+
};
27+
}
28+
1929
const MessagesTable: React.FC<MessagesTableProps> = ({
2030
messages,
2131
isFetching,
2232
}) => {
2333
const paginate = usePaginateTopics();
24-
const [previewFor, setPreviewFor] = useState<string | null>(null);
25-
34+
const [previewFor, setPreviewFor] = useState<'key' | 'content' | null>(null);
2635
const [keyFilters, setKeyFilters] = useState<PreviewFilter[]>([]);
2736
const [contentFilters, setContentFilters] = useState<PreviewFilter[]>([]);
2837
const nextCursor = useMessageFiltersStore((state) => state.nextCursor);
2938
const isLive = useIsLiveMode();
39+
const { topicName } = useAppParams<RouteParamsClusterTopic>();
40+
const [messagesPreview, setMessagesPreview] =
41+
useLocalStorage<MessagePreviewProps>('message-preview', {
42+
[topicName]: {
43+
keyFilters: [],
44+
contentFilters: [],
45+
},
46+
});
47+
48+
useEffect(() => {
49+
setKeyFilters(messagesPreview[topicName]?.keyFilters || []);
50+
setContentFilters(messagesPreview[topicName]?.contentFilters || []);
51+
}, []);
3052

3153
return (
3254
<div style={{ position: 'relative' }}>
3355
{previewFor !== null && (
3456
<PreviewModal
3557
values={previewFor === 'key' ? keyFilters : contentFilters}
3658
toggleIsOpen={() => setPreviewFor(null)}
37-
setFilters={(payload: PreviewFilter[]) =>
38-
previewFor === 'key'
39-
? setKeyFilters(payload)
40-
: setContentFilters(payload)
41-
}
59+
setFilters={(payload: PreviewFilter[]) => {
60+
if (previewFor === 'key') {
61+
setKeyFilters(payload);
62+
setMessagesPreview({
63+
...messagesPreview,
64+
[topicName]: {
65+
...messagesPreview[topicName],
66+
keyFilters: payload,
67+
},
68+
});
69+
} else {
70+
setContentFilters(payload);
71+
setMessagesPreview({
72+
...messagesPreview,
73+
[topicName]: {
74+
...messagesPreview[topicName],
75+
contentFilters: payload,
76+
},
77+
});
78+
}
79+
}}
4280
/>
4381
)}
4482
<Table isFullwidth>

frontend/src/lib/hooks/useLocalStorage.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import { LOCAL_STORAGE_KEY_PREFIX } from 'lib/constants';
2-
import { useState, useEffect } from 'react';
2+
import { useState, useEffect, Dispatch, SetStateAction } from 'react';
33

4-
export const useLocalStorage = (featureKey: string, defaultValue: string) => {
4+
export const useLocalStorage = <T>(
5+
featureKey: string,
6+
defaultValue: T
7+
): [T, Dispatch<SetStateAction<T>>] => {
58
const key = `${LOCAL_STORAGE_KEY_PREFIX}-${featureKey}`;
6-
const [value, setValue] = useState(() => {
9+
const [value, setValue] = useState<T>(() => {
710
const saved = localStorage.getItem(key);
811

912
if (saved !== null) {

0 commit comments

Comments
 (0)