@@ -11,11 +11,11 @@ import { DateFilterContext } from '../contexts/DateFilterContext';
1111import { FilterContext } from '../contexts/FilterContext' ;
1212import { SlideContext } from '../contexts/SlideContext' ;
1313import {
14- CreatedFilterOptions ,
15- ICreatedTimeFilter ,
14+ ITimeFilterObject ,
1615 NAMESPACES_PATH ,
16+ TimeFilterEnum ,
1717} from '../interfaces' ;
18- import { getCreatedTimeFilter , isValidUUID } from '../utils' ;
18+ import { getTimeFilterObject , isValidUUID } from '../utils' ;
1919import { Navigation , NAV_WIDTH } from './Navigation/Navigation' ;
2020
2121const Main = styled ( 'main' ) ( {
@@ -38,7 +38,7 @@ export const SLIDE_QUERY_KEY = 'slide';
3838export const TIME_QUERY_KEY = 'time' ;
3939
4040export const AppWrapper : React . FC = ( ) => {
41- const { pathname } = useLocation ( ) ;
41+ const { pathname, search } = useLocation ( ) ;
4242 const { selectedNamespace } = useContext ( ApplicationContext ) ;
4343 const [ filterAnchor , setFilterAnchor ] = useState < HTMLButtonElement | null > (
4444 null
@@ -47,12 +47,9 @@ export const AppWrapper: React.FC = () => {
4747 // Table filters
4848 const [ filterArray , setFilterArray ] = useState < string [ ] > ( [ ] ) ;
4949 const [ filterString , setFilterString ] = useState ( '' ) ;
50- // Slide filters
51- const [ slideQuery , setSlideQuery ] = useState < string | null > ( null ) ;
50+ const [ slideID , setSlideID ] = useState < string | null > ( null ) ;
5251 // Date filter
53- const [ dateFilter , setDateFilter ] = useState < ICreatedTimeFilter > (
54- getCreatedTimeFilter ( '24hours' )
55- ) ;
52+ const [ dateFilter , setDateFilter ] = useState < ITimeFilterObject > ( ) ;
5653
5754 if ( pathname === '/' ) {
5855 return (
@@ -63,28 +60,68 @@ export const AppWrapper: React.FC = () => {
6360 ) ;
6461 }
6562
66- // Table Filters
6763 useEffect ( ( ) => {
68- const filterArray = searchParams . getAll ( FILTERS_QUERY_KEY ) ;
69- setFilterArray ( filterArray ) ;
70- setFilterString ( `& ${ filterArray . join ( '&' ) } ` ) ;
71- } , [ pathname ] ) ;
64+ initializeTimeSearchParams ( ) ;
65+ initializeSlideSearchParams ( ) ;
66+ initializeTableFilterSearchParams ( ) ;
67+ } , [ pathname , search ] ) ;
7268
73- // Slide ID
74- useEffect ( ( ) => {
75- const slideQuery = searchParams . get ( SLIDE_QUERY_KEY ) ;
76- slideQuery !== null && setSlideQuery ( slideQuery ) ;
77- } , [ pathname , setSearchParams ] ) ;
69+ const initializeTimeSearchParams = ( ) => {
70+ // If date has already been set
71+ if (
72+ dateFilter ?. filterShortString &&
73+ dateFilter ?. filterShortString in TimeFilterEnum
74+ ) {
75+ setTimeSearchParam ( dateFilter . filterShortString ) ;
76+ return ;
77+ }
78+ // If time param is invalid
79+ const existingTimeParam = searchParams . get ( TIME_QUERY_KEY ) ;
80+ if ( existingTimeParam === null || ! ( existingTimeParam in TimeFilterEnum ) ) {
81+ setTimeSearchParam ( TimeFilterEnum [ '24hours' ] ) ;
82+ } else {
83+ // Set filter string for components to consume
84+ setDateFilter ( getTimeFilterObject ( existingTimeParam as TimeFilterEnum ) ) ;
85+ }
86+ } ;
7887
79- // Time string
80- useEffect ( ( ) => {
81- const timeString = searchParams . get ( TIME_QUERY_KEY ) as CreatedFilterOptions ;
82- if ( timeString === null ) {
83- addDateToParams ( dateFilter . filterShortString ) ;
88+ const setTimeSearchParam = ( timeFilter : TimeFilterEnum ) => {
89+ searchParams . set ( TIME_QUERY_KEY , timeFilter ) ;
90+ setSearchParams ( searchParams ) ;
91+ if (
92+ getTimeFilterObject ( timeFilter ) . filterShortString !==
93+ dateFilter ?. filterShortString
94+ ) {
95+ setDateFilter ( getTimeFilterObject ( timeFilter ) ) ;
96+ }
97+ } ;
98+
99+ const initializeSlideSearchParams = ( ) => {
100+ setSlideID ( null ) ;
101+ const existingSlideParam = searchParams . get ( SLIDE_QUERY_KEY ) ;
102+ if ( existingSlideParam === null || ! isValidUUID ( existingSlideParam ) ) {
103+ setSlideSearchParam ( null ) ;
84104 } else {
85- setDateFilter ( getCreatedTimeFilter ( timeString ) ) ;
105+ setSlideSearchParam ( existingSlideParam ) ;
86106 }
87- } , [ pathname ] ) ;
107+ } ;
108+
109+ const setSlideSearchParam = ( slideID : string | null ) => {
110+ if ( slideID === null ) {
111+ searchParams . delete ( SLIDE_QUERY_KEY ) ;
112+ setSearchParams ( searchParams ) ;
113+ } else if ( isValidUUID ( slideID ) ) {
114+ searchParams . set ( SLIDE_QUERY_KEY , slideID ) ;
115+ setSearchParams ( searchParams ) ;
116+ setSlideID ( slideID ) ;
117+ }
118+ } ;
119+
120+ const initializeTableFilterSearchParams = ( ) => {
121+ const existingFilterArray = searchParams . getAll ( FILTERS_QUERY_KEY ) ;
122+ setFilterArray ( existingFilterArray ) ;
123+ setFilterString ( `&${ existingFilterArray . join ( '&' ) } ` ) ;
124+ } ;
88125
89126 const addFilterToParams = ( filter : string ) => {
90127 searchParams . append ( FILTERS_QUERY_KEY , filter ) ;
@@ -101,21 +138,22 @@ export const AppWrapper: React.FC = () => {
101138 setFilterString ( '' ) ;
102139 } ;
103140
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 ) ;
141+ const removeFilter = ( filterToRemove : string ) => {
142+ const filters = searchParams . getAll ( FILTERS_QUERY_KEY ) ;
143+ searchParams . delete ( FILTERS_QUERY_KEY ) ;
144+ if ( filters . length > 0 ) {
145+ filters . forEach ( ( f ) => {
146+ if ( f !== filterToRemove ) {
147+ searchParams . append ( FILTERS_QUERY_KEY , f ) ;
148+ }
149+ } ) ;
109150 setSearchParams ( searchParams ) ;
151+ const filterArray = searchParams . getAll ( FILTERS_QUERY_KEY ) ;
152+ setFilterArray ( filterArray ) ;
153+ setFilterString ( `&${ filterArray . join ( '&' ) } ` ) ;
110154 }
111155 } ;
112156
113- const addDateToParams = ( timeFilterString : CreatedFilterOptions ) => {
114- searchParams . set ( TIME_QUERY_KEY , timeFilterString ) ;
115- setSearchParams ( searchParams ) ;
116- setDateFilter ( getCreatedTimeFilter ( timeFilterString ) ) ;
117- } ;
118-
119157 return (
120158 < RootDiv >
121159 < FilterContext . Provider
@@ -125,20 +163,21 @@ export const AppWrapper: React.FC = () => {
125163 filterString,
126164 filterArray,
127165 addFilterToParams,
166+ removeFilter,
128167 clearAllFilters,
129168 } }
130169 >
131170 < DateFilterContext . Provider
132171 value = { {
133172 searchParams,
134173 dateFilter,
135- addDateToParams ,
174+ setTimeSearchParam ,
136175 } }
137176 >
138177 < SlideContext . Provider
139178 value = { {
140- slideQuery ,
141- addSlideToParams ,
179+ slideID ,
180+ setSlideSearchParam ,
142181 } }
143182 >
144183 < Main >
0 commit comments