Skip to content

Commit 1748880

Browse files
Merge pull request #145 from kaleido-io/nav-bug
[nav-bug] fixing router bug
2 parents 6bb83ab + 17de793 commit 1748880

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+596
-794
lines changed

package-lock.json

Lines changed: 0 additions & 36 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
"react-scripts": "^5.0.0",
3535
"reconnecting-websocket": "^4.4.0",
3636
"typescript": "^4.5.5",
37-
"use-query-params": "^1.2.3",
3837
"web-vitals": "^2.1.4"
3938
},
4039
"scripts": {

src/App.tsx

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,7 @@ import {
3131
} from './components/Snackbar/MessageSnackbar';
3232
import { ApplicationContext } from './contexts/ApplicationContext';
3333
import { SnackbarContext } from './contexts/SnackbarContext';
34-
import {
35-
CreatedFilterOptions,
36-
INamespace,
37-
IStatus,
38-
NAMESPACES_PATH,
39-
} from './interfaces';
34+
import { INamespace, IStatus, NAMESPACES_PATH } from './interfaces';
4035
import { FF_Paths } from './interfaces/constants';
4136
import { themeOptions } from './theme';
4237
import { fetchWithCredentials, summarizeFetchError } from './utils';
@@ -62,8 +57,6 @@ const App: React.FC = () => {
6257
const [orgName, setOrgName] = useState('');
6358
const [nodeID, setNodeID] = useState('');
6459
const [nodeName, setNodeName] = useState('');
65-
const [createdFilter, setCreatedFilter] =
66-
useState<CreatedFilterOptions>('24hours');
6760
const protocol = window.location.protocol === 'https:' ? 'wss' : 'ws';
6861

6962
const { pathname: currentPath } = useMemo(() => {
@@ -167,8 +160,6 @@ const App: React.FC = () => {
167160
identity,
168161
lastEvent,
169162
setLastEvent,
170-
createdFilter,
171-
setCreatedFilter,
172163
}}
173164
>
174165
<SnackbarContext.Provider

src/components/AppWrapper.tsx

Lines changed: 96 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
import { styled } from '@mui/material';
22
import React, { useContext, useEffect, useState } from 'react';
3-
import { Navigate, Outlet, useLocation } from 'react-router-dom';
4-
import { ArrayParam, useQueryParam, withDefault } from 'use-query-params';
3+
import {
4+
Navigate,
5+
Outlet,
6+
useLocation,
7+
useSearchParams,
8+
} from 'react-router-dom';
59
import { ApplicationContext } from '../contexts/ApplicationContext';
10+
import { DateFilterContext } from '../contexts/DateFilterContext';
611
import { FilterContext } from '../contexts/FilterContext';
7-
import { NAMESPACES_PATH } from '../interfaces';
12+
import { SlideContext } from '../contexts/SlideContext';
13+
import {
14+
CreatedFilterOptions,
15+
ICreatedTimeFilter,
16+
NAMESPACES_PATH,
17+
} from '../interfaces';
18+
import { getCreatedTimeFilter, isValidUUID } from '../utils';
819
import { Navigation, NAV_WIDTH } from './Navigation/Navigation';
920

1021
const Main = styled('main')({
@@ -22,18 +33,25 @@ const RootDiv = styled('div')({
2233
display: 'flex',
2334
});
2435

36+
export const FILTERS_QUERY_KEY = 'filters';
37+
export const SLIDE_QUERY_KEY = 'slide';
38+
export const TIME_QUERY_KEY = 'time';
39+
2540
export const AppWrapper: React.FC = () => {
2641
const { pathname } = useLocation();
2742
const { selectedNamespace } = useContext(ApplicationContext);
2843
const [filterAnchor, setFilterAnchor] = useState<HTMLButtonElement | null>(
2944
null
3045
);
31-
const location = useLocation();
32-
const [activeFilters, setActiveFilters] = useState<string[]>([]);
46+
const [searchParams, setSearchParams] = useSearchParams();
47+
// Table filters
48+
const [filterArray, setFilterArray] = useState<string[]>([]);
3349
const [filterString, setFilterString] = useState('');
34-
const [filterQuery, setFilterQuery] = useQueryParam(
35-
'filters',
36-
withDefault(ArrayParam, [])
50+
// Slide filters
51+
const [slideQuery, setSlideQuery] = useState<string | null>(null);
52+
// Date filter
53+
const [dateFilter, setDateFilter] = useState<ICreatedTimeFilter>(
54+
getCreatedTimeFilter('24hours')
3755
);
3856

3957
if (pathname === '/') {
@@ -45,49 +63,92 @@ export const AppWrapper: React.FC = () => {
4563
);
4664
}
4765

48-
// Filter
66+
// Table Filters
4967
useEffect(() => {
50-
// set filters if they are present in the URL
51-
if (filterQuery.length !== 0) {
52-
setActiveFilters(filterQuery as string[]);
53-
}
54-
}, [setActiveFilters, filterQuery]);
68+
const filterArray = searchParams.getAll(FILTERS_QUERY_KEY);
69+
setFilterArray(filterArray);
70+
setFilterString(`&${filterArray.join('&')}`);
71+
}, [pathname]);
72+
73+
// Slide ID
74+
useEffect(() => {
75+
const slideQuery = searchParams.get(SLIDE_QUERY_KEY);
76+
slideQuery !== null && setSlideQuery(slideQuery);
77+
}, [pathname, setSearchParams]);
5578

79+
// Time string
5680
useEffect(() => {
57-
//set query param state
58-
setFilterQuery(activeFilters);
59-
if (activeFilters.length === 0) {
60-
setFilterString('');
61-
return;
81+
const timeString = searchParams.get(TIME_QUERY_KEY) as CreatedFilterOptions;
82+
if (timeString === null) {
83+
addDateToParams(dateFilter.filterShortString);
84+
} else {
85+
setDateFilter(getCreatedTimeFilter(timeString));
6286
}
87+
}, [pathname]);
6388

64-
setFilterString(`&${activeFilters.join('&')}`);
65-
}, [activeFilters, setFilterQuery]);
89+
const addFilterToParams = (filter: string) => {
90+
searchParams.append(FILTERS_QUERY_KEY, filter);
91+
setSearchParams(searchParams);
92+
const filterArray = searchParams.getAll(FILTERS_QUERY_KEY);
93+
setFilterArray(filterArray);
94+
setFilterString(`&${filterArray.join('&')}`);
95+
};
6696

67-
useEffect(() => {
68-
setActiveFilters(filterQuery as string[]);
69-
}, [location]);
97+
const clearAllFilters = () => {
98+
searchParams.delete(FILTERS_QUERY_KEY);
99+
setSearchParams(searchParams);
100+
setFilterArray([]);
101+
setFilterString('');
102+
};
103+
104+
const addSlideToParams = (slideID: string | undefined) => {
105+
if (slideID === undefined) {
106+
searchParams.delete(SLIDE_QUERY_KEY);
107+
} else {
108+
isValidUUID(slideID) && searchParams.set(SLIDE_QUERY_KEY, slideID);
109+
setSearchParams(searchParams);
110+
}
111+
};
112+
113+
const addDateToParams = (timeFilterString: CreatedFilterOptions) => {
114+
searchParams.set(TIME_QUERY_KEY, timeFilterString);
115+
setSearchParams(searchParams);
116+
setDateFilter(getCreatedTimeFilter(timeFilterString));
117+
};
70118

71119
return (
72120
<RootDiv>
73121
<FilterContext.Provider
74122
value={{
75123
filterAnchor,
76124
setFilterAnchor,
77-
activeFilters,
78-
setActiveFilters,
79125
filterString,
80-
setFilterString,
81-
filterQuery,
82-
setFilterQuery,
126+
filterArray,
127+
addFilterToParams,
128+
clearAllFilters,
83129
}}
84130
>
85-
<Main>
86-
<Navigation />
87-
<ContentDiv>
88-
<Outlet />
89-
</ContentDiv>
90-
</Main>
131+
<DateFilterContext.Provider
132+
value={{
133+
searchParams,
134+
dateFilter,
135+
addDateToParams,
136+
}}
137+
>
138+
<SlideContext.Provider
139+
value={{
140+
slideQuery,
141+
addSlideToParams,
142+
}}
143+
>
144+
<Main>
145+
<Navigation />
146+
<ContentDiv>
147+
<Outlet />
148+
</ContentDiv>
149+
</Main>
150+
</SlideContext.Provider>
151+
</DateFilterContext.Provider>
91152
</FilterContext.Provider>
92153
</RootDiv>
93154
);

src/components/Filters/FilterButton.tsx

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,18 @@
1515
// limitations under the License.
1616

1717
import { Button, Chip, Grid, Typography } from '@mui/material';
18-
import React from 'react';
18+
import React, { useContext } from 'react';
1919
import { useTranslation } from 'react-i18next';
20+
import { FilterContext } from '../../contexts/FilterContext';
2021
import { DEFAULT_PADDING } from '../../theme';
2122

2223
interface Props {
23-
filters: string[];
24-
setFilters: React.Dispatch<React.SetStateAction<string[]>>;
2524
onSetFilterAnchor: any;
2625
}
2726

28-
export const FilterButton: React.FC<Props> = ({
29-
filters,
30-
setFilters,
31-
onSetFilterAnchor,
32-
}) => {
27+
export const FilterButton: React.FC<Props> = ({ onSetFilterAnchor }) => {
3328
const { t } = useTranslation();
34-
35-
const handleClear = () => {
36-
setFilters([]);
37-
};
38-
39-
const handleRemoveFilter = (filter: string) => {
40-
setFilters(filters.filter((item) => item !== filter));
41-
};
29+
const { clearAllFilters, filterArray } = useContext(FilterContext);
4230

4331
const handleOpenFilter = (event: React.MouseEvent<HTMLButtonElement>) => {
4432
onSetFilterAnchor(event);
@@ -52,7 +40,7 @@ export const FilterButton: React.FC<Props> = ({
5240
item
5341
alignItems="center"
5442
>
55-
{filters.length > 0 && (
43+
{filterArray.length > 0 && (
5644
<Grid
5745
container
5846
item
@@ -61,17 +49,18 @@ export const FilterButton: React.FC<Props> = ({
6149
my={DEFAULT_PADDING}
6250
>
6351
<Grid container alignItems="center" justifyContent="flex-end">
64-
{filters.map((filter, index) => (
52+
{filterArray.map((filter, index) => (
6553
<Grid key={`${filter}${index}`} item>
6654
<Chip
67-
onDelete={() => handleRemoveFilter(filter)}
55+
// TODO: Add back
56+
// onDelete={() => handleRemoveFilter(filter)}
6857
label={filter}
6958
/>
7059
</Grid>
7160
))}
7261
<Grid item>
7362
<Chip
74-
onClick={handleClear}
63+
onClick={clearAllFilters}
7564
variant="outlined"
7665
label={t('clear')}
7766
/>

src/components/Filters/FilterModal.tsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,19 @@ import {
2929
Typography,
3030
} from '@mui/material';
3131
import CloseIcon from 'mdi-react/CloseIcon';
32-
import React, { useEffect, useState } from 'react';
32+
import React, { useContext, useEffect, useState } from 'react';
3333
import { useTranslation } from 'react-i18next';
34+
import { FilterContext } from '../../contexts/FilterContext';
3435

3536
interface Props {
3637
anchor: HTMLButtonElement | null;
3738
onClose: () => void;
3839
fields: string[];
39-
addFilter: (filter: string) => void;
4040
}
4141

42-
export const FilterModal: React.FC<Props> = ({
43-
anchor,
44-
onClose,
45-
fields,
46-
addFilter,
47-
}) => {
42+
export const FilterModal: React.FC<Props> = ({ anchor, onClose, fields }) => {
4843
const { t } = useTranslation();
44+
const { addFilterToParams } = useContext(FilterContext);
4945
const [open, setOpen] = useState(false);
5046
const [filterValue, setFilterValue] = useState('');
5147
const [filterField, setFilterField] = useState('');
@@ -63,7 +59,7 @@ export const FilterModal: React.FC<Props> = ({
6359
const filter = `${filterField}=${filterNegate ? '!' : ''}${
6460
filterCaseInsensitive ? ':' : ''
6561
}${filterOperator}${filterValue}`;
66-
addFilter(filter);
62+
addFilterToParams(filter);
6763
onClose();
6864
};
6965

src/components/NetworkMap/NetworkMap.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ export const NetworkMap: React.FC<Props> = ({ size }) => {
7474
const [popoverNode, setPopoverNode] = useState<any>(undefined);
7575
const [anchorEl, setAnchorEl] = React.useState(null);
7676
const handleClick = (node: any, event: any) => {
77-
console.log(event);
7877
setAnchorPosition({
7978
top: node.x,
8079
left: node.y,

0 commit comments

Comments
 (0)