@@ -165,73 +165,146 @@ export function MultipleAlertModal({
165165 showCloseIcon = true ,
166166 skipAlertNavigation = false ,
167167} : MultipleAlertModalProps ) {
168- const { isAlertConfirmed, fieldAlerts, alerts } = useAlerts ( ownerId ) ;
168+ const {
169+ alerts : alertsFromHook ,
170+ fieldAlerts : fieldAlertsFromHook ,
171+ isAlertConfirmed,
172+ navigableAlerts : navigableAlertsFromHook ,
173+ navigableFieldAlerts : navigableFieldAlertsFromHook ,
174+ } = useAlerts ( ownerId ) ;
175+
176+ const alerts = alertsFromHook ?? [ ] ;
177+ const fieldAlerts = fieldAlertsFromHook ?? [ ] ;
178+ const navigableAlerts = navigableAlertsFromHook ?? alerts ;
179+ const navigableFieldAlerts = navigableFieldAlertsFromHook ?? fieldAlerts ;
180+
169181 const alertsToDisplay = displayAllAlerts ? alerts : fieldAlerts ;
182+ const navigableAlertsToDisplay = displayAllAlerts
183+ ? navigableAlerts
184+ : navigableFieldAlerts ;
170185
171- const initialAlertIndex = alertsToDisplay . findIndex (
172- ( alert : Alert ) => alert . key === alertKey ,
173- ) ;
186+ const initialAlertKey =
187+ alertsToDisplay . find ( ( alert ) => alert . key === alertKey ) ?. key ??
188+ navigableAlertsToDisplay [ 0 ] ?. key ??
189+ alertsToDisplay [ 0 ] ?. key ;
174190
175- const [ selectedIndex , setSelectedIndex ] = useState (
176- initialAlertIndex === - 1 ? 0 : initialAlertIndex ,
191+ const [ currentAlertKey , setCurrentAlertKey ] = useState < string | undefined > (
192+ initialAlertKey ,
177193 ) ;
178194
179- // If the selected alert is not found, default to the first alert
180- const selectedAlert = alertsToDisplay [ selectedIndex ] ?? alertsToDisplay [ 0 ] ;
195+ const selectedAlert =
196+ alertsToDisplay . find ( ( alert ) => alert . key === currentAlertKey ) ??
197+ alertsToDisplay [ 0 ] ;
198+
199+ const currentNavigableIndex = navigableAlertsToDisplay . findIndex (
200+ ( alert ) => alert . key === ( selectedAlert ?. key ?? currentAlertKey ) ,
201+ ) ;
181202
182203 const hasUnconfirmedAlerts = alerts . some (
183204 ( alert : Alert ) =>
184205 ! isAlertConfirmed ( alert . key ) && alert . severity === Severity . Danger ,
185206 ) ;
186207
187208 const handleBackButtonClick = useCallback ( ( ) => {
188- setSelectedIndex ( ( prevIndex : number ) =>
189- prevIndex > 0 ? prevIndex - 1 : prevIndex ,
209+ const activeAlertKey = selectedAlert ?. key ?? currentAlertKey ;
210+ const newIndex = navigableAlertsToDisplay . findIndex (
211+ ( alert ) => alert . key === activeAlertKey ,
190212 ) ;
191- } , [ ] ) ;
213+
214+ if ( newIndex > 0 ) {
215+ setCurrentAlertKey ( navigableAlertsToDisplay [ newIndex - 1 ] ?. key ) ;
216+ }
217+ } , [ currentAlertKey , navigableAlertsToDisplay , selectedAlert ] ) ;
192218
193219 const handleNextButtonClick = useCallback ( ( ) => {
194- setSelectedIndex ( ( prevIndex : number ) => prevIndex + 1 ) ;
195- } , [ ] ) ;
220+ const activeAlertKey = selectedAlert ?. key ?? currentAlertKey ;
221+ const newIndex = navigableAlertsToDisplay . findIndex (
222+ ( alert ) => alert . key === activeAlertKey ,
223+ ) ;
224+
225+ if (
226+ newIndex !== - 1 &&
227+ newIndex + 1 < navigableAlertsToDisplay . length &&
228+ navigableAlertsToDisplay [ newIndex + 1 ] ?. key
229+ ) {
230+ setCurrentAlertKey ( navigableAlertsToDisplay [ newIndex + 1 ] ?. key ) ;
231+ }
232+ } , [ currentAlertKey , navigableAlertsToDisplay , selectedAlert ] ) ;
196233
197234 const handleAcknowledgeClick = useCallback ( ( ) => {
198- if ( skipAlertNavigation ) {
235+ const activeAlertKey = selectedAlert ?. key ?? currentAlertKey ;
236+ const activeAlertHidesNavigation =
237+ selectedAlert ?. hideFromAlertNavigation === true ;
238+
239+ if ( skipAlertNavigation || ! activeAlertKey ) {
240+ onFinalAcknowledgeClick ( ) ;
241+ return ;
242+ }
243+
244+ if ( activeAlertHidesNavigation ) {
199245 onFinalAcknowledgeClick ( ) ;
200246 return ;
201247 }
202248
203- if ( selectedIndex + 1 === alertsToDisplay . length ) {
249+ const navigableIndex = navigableAlertsToDisplay . findIndex (
250+ ( alert ) => alert . key === activeAlertKey ,
251+ ) ;
252+
253+ if ( navigableIndex === - 1 ) {
254+ onFinalAcknowledgeClick ( ) ;
255+ return ;
256+ }
257+
258+ const isLastNavigableAlert =
259+ navigableIndex === navigableAlertsToDisplay . length - 1 ;
260+
261+ if ( isLastNavigableAlert ) {
204262 if ( ! hasUnconfirmedAlerts ) {
205263 onFinalAcknowledgeClick ( ) ;
206264 return ;
207265 }
208266
209- setSelectedIndex ( 0 ) ;
267+ const firstNavigableKey = navigableAlertsToDisplay [ 0 ] ?. key ;
268+ if ( firstNavigableKey ) {
269+ setCurrentAlertKey ( firstNavigableKey ) ;
270+ }
210271 return ;
211272 }
212- handleNextButtonClick ( ) ;
273+
274+ const nextAlertKey = navigableAlertsToDisplay [ navigableIndex + 1 ] ?. key ;
275+ if ( nextAlertKey ) {
276+ setCurrentAlertKey ( nextAlertKey ) ;
277+ }
213278 } , [
279+ currentAlertKey ,
214280 onFinalAcknowledgeClick ,
215- handleNextButtonClick ,
216- selectedIndex ,
217- alertsToDisplay . length ,
218281 hasUnconfirmedAlerts ,
282+ navigableAlertsToDisplay ,
283+ selectedAlert ,
219284 skipAlertNavigation ,
220285 ] ) ;
221286
287+ const showNavigationButtons =
288+ ! skipAlertNavigation &&
289+ selectedAlert ?. hideFromAlertNavigation !== true &&
290+ currentNavigableIndex !== - 1 &&
291+ navigableAlertsToDisplay . length > 1 ;
292+
222293 return (
223294 < AlertModal
224295 ownerId = { ownerId }
225296 onAcknowledgeClick = { handleAcknowledgeClick }
226297 alertKey = { selectedAlert ?. key }
227298 onClose = { onClose }
228299 headerStartAccessory = {
229- < PageNavigation
230- alerts = { alertsToDisplay }
231- onBackButtonClick = { handleBackButtonClick }
232- onNextButtonClick = { handleNextButtonClick }
233- selectedIndex = { selectedIndex }
234- />
300+ showNavigationButtons ? (
301+ < PageNavigation
302+ alerts = { navigableAlertsToDisplay }
303+ onBackButtonClick = { handleBackButtonClick }
304+ onNextButtonClick = { handleNextButtonClick }
305+ selectedIndex = { currentNavigableIndex }
306+ />
307+ ) : null
235308 }
236309 showCloseIcon = { showCloseIcon }
237310 />
0 commit comments