1- import { useMemo , useCallback } from 'react' ;
1+ import { useMemo , useCallback , useState } from 'react' ;
22import { isDefined , isNotDefined } from '@togglecorp/fujs' ;
33import Papa from 'papaparse' ;
44import { saveAs } from 'file-saver' ;
@@ -13,6 +13,8 @@ import {
1313 createDateColumn ,
1414 createLinkColumn ,
1515} from '#components/Table/ColumnShortcuts' ;
16+ import NumberOutput from '#components/NumberOutput' ;
17+ import EventSearchSelectInput from '#components/domain/EventSearchSelectInput' ;
1618import useTranslation from '#hooks/useTranslation' ;
1719import useFilterState from '#hooks/useFilterState' ;
1820import { useRequest , type GoApiResponse } from '#utils/restRequest' ;
@@ -21,15 +23,20 @@ import useAlert from '#hooks/useAlert';
2123import useRecursiveCsvExport from '#hooks/useRecursiveCsvRequest' ;
2224import { numericIdSelector } from '#utils/selectors' ;
2325import { getDuration } from '#utils/common' ;
26+ import CountrySelectInput from '#components/domain/CountrySelectInput' ;
27+ import useUrlSearchState from '#hooks/useUrlSearchState' ;
2428
2529import i18n from './i18n.json' ;
2630import styles from './styles.module.css' ;
2731
2832type SurgeResponse = GoApiResponse < '/api/v2/surge_alert/' > ;
2933type SurgeListItem = NonNullable < SurgeResponse [ 'results' ] > [ number ] ;
3034
35+ type GetEventResponse = GoApiResponse < '/api/v2/event/mini/' > ;
36+ export type EventItem = Pick < NonNullable < GetEventResponse [ 'results' ] > [ number ] , 'id' | 'name' | 'dtype' > ;
37+
3138type TableKey = number ;
32- const today = new Date ( ) . getTime ( ) ;
39+ const nowTimestamp = new Date ( ) . getTime ( ) ;
3340
3441function getPositionString ( alert : SurgeListItem ) {
3542 if ( isNotDefined ( alert . molnix_id ) ) {
@@ -60,6 +67,68 @@ export function Component() {
6067 pageSize : 15 ,
6168 } ) ;
6269
70+ const [ countryFilter , setCountryFilter ] = useUrlSearchState < number | undefined > (
71+ 'country' ,
72+ ( searchValue ) => {
73+ const potentialValue = isDefined ( searchValue ) ? Number ( searchValue ) : undefined ;
74+ return potentialValue ;
75+ } ,
76+ ( country ) => country ,
77+ ) ;
78+
79+ const [ eventFilter , setEventFilter ] = useUrlSearchState < number | undefined > (
80+ 'event' ,
81+ ( searchValue ) => {
82+ const potentialValue = isDefined ( searchValue ) ? Number ( searchValue ) : undefined ;
83+ return potentialValue ;
84+ } ,
85+ ( country ) => country ,
86+ ) ;
87+
88+ const [ eventOptions , setEventOptions ] = useState <
89+ EventItem [ ] | undefined | null
90+ > ( [ ] ) ;
91+
92+ useRequest ( {
93+ skip : isNotDefined ( eventFilter )
94+ || ( ! ! eventOptions ?. find ( ( event ) => event . id === eventFilter ) ) ,
95+ url : '/api/v2/event/{id}/' ,
96+ pathVariables : isDefined ( eventFilter ) ? {
97+ id : eventFilter ,
98+ } : undefined ,
99+ onSuccess : ( response ) => {
100+ if ( isNotDefined ( response ) ) {
101+ return ;
102+ }
103+
104+ const {
105+ id,
106+ dtype,
107+ name,
108+ } = response ;
109+
110+ if ( isNotDefined ( id ) || isNotDefined ( dtype ) || isNotDefined ( name ) ) {
111+ return ;
112+ }
113+
114+ const newOption = {
115+ id,
116+ dtype : {
117+ id : dtype ,
118+ translation_module_original_language : 'en' as const ,
119+ name : undefined ,
120+ summary : undefined ,
121+ } ,
122+ name,
123+ } ;
124+
125+ setEventOptions ( ( prevOptions ) => ( [
126+ ...prevOptions ?? [ ] ,
127+ newOption ,
128+ ] ) ) ;
129+ } ,
130+ } ) ;
131+
63132 const {
64133 response : surgeResponse ,
65134 pending : surgeResponsePending ,
@@ -69,6 +138,8 @@ export function Component() {
69138 query : {
70139 limit,
71140 offset,
141+ event : eventFilter ,
142+ country : countryFilter ,
72143 } ,
73144 } ) ;
74145
@@ -78,8 +149,14 @@ export function Component() {
78149 if ( surgeAlert . is_stood_down ) {
79150 return strings . surgeAlertStoodDown ;
80151 }
81- const closed = isDefined ( surgeAlert . end )
82- ? new Date ( surgeAlert . end ) . getTime ( ) < today : undefined ;
152+ const endDate = isDefined ( surgeAlert . end )
153+ ? new Date ( surgeAlert . end )
154+ : undefined ;
155+
156+ const closed = isDefined ( endDate )
157+ ? endDate . getTime ( ) < nowTimestamp
158+ : false ;
159+
83160 return closed ? strings . surgeAlertClosed : strings . surgeAlertOpen ;
84161 } ,
85162 [
@@ -216,7 +293,7 @@ export function Component() {
216293
217294 const heading = resolveToComponent (
218295 strings . allSurgeAlertsHeading ,
219- { numSurgeAlerts : surgeResponse ?. count ?? '--' } ,
296+ { numSurgeAlerts : < NumberOutput value = { surgeResponse ?. count } invalidText = "--" /> } ,
220297 ) ;
221298
222299 return (
@@ -226,6 +303,29 @@ export function Component() {
226303 heading = { heading }
227304 >
228305 < Container
306+ withHeaderBorder
307+ withGridViewInFilter
308+ filters = { (
309+ < >
310+ < CountrySelectInput
311+ name = "country"
312+ label = { strings . countryFilterLabel }
313+ placeholder = { strings . defaultPlaceholder }
314+ value = { countryFilter }
315+ onChange = { setCountryFilter }
316+ />
317+ < EventSearchSelectInput
318+ name = "event"
319+ label = { strings . eventFilterLabel }
320+ placeholder = { strings . defaultPlaceholder }
321+ value = { eventFilter }
322+ onChange = { setEventFilter }
323+ options = { eventOptions }
324+ onOptionsChange = { setEventOptions }
325+ countryId = { countryFilter }
326+ />
327+ </ >
328+ ) }
229329 footerActions = { (
230330 < Pager
231331 activePage = { page }
0 commit comments