@@ -6,6 +6,7 @@ import {NavigationProvider} from "@/context/NavigationProvider"
66import { PatientDetailsProvider } from "./context/PatientDetailsProvider"
77import { PrescriptionInformationProvider } from "./context/PrescriptionInformationProvider"
88import Layout from "@/Layout"
9+ import { useEffect } from "react"
910
1011import LoginPage from "@/pages/LoginPage"
1112import LogoutPage from "@/pages/LogoutPage"
@@ -33,6 +34,34 @@ import {HEADER_STRINGS} from "@/constants/ui-strings/HeaderStrings"
3334function AppContent ( ) {
3435 const location = useLocation ( )
3536
37+ // this useEffect ensures that focus starts with skip link when using tab navigation
38+ useEffect ( ( ) => {
39+ let hasTabbed = false
40+
41+ const activeElement = document . activeElement as HTMLElement
42+ if ( activeElement && activeElement !== document . body ) {
43+ activeElement . blur ( )
44+ }
45+
46+ const handleKeyDown = ( e : KeyboardEvent ) => {
47+ if ( e . key === "Tab" && ! hasTabbed && ! e . shiftKey ) {
48+ hasTabbed = true
49+ e . preventDefault ( )
50+ const skipLink = document . querySelector ( ".nhsuk-skip-link" ) as HTMLElement
51+ if ( skipLink ) {
52+ skipLink . focus ( )
53+ }
54+ document . removeEventListener ( "keydown" , handleKeyDown )
55+ }
56+ }
57+
58+ document . addEventListener ( "keydown" , handleKeyDown )
59+
60+ return ( ) => {
61+ document . removeEventListener ( "keydown" , handleKeyDown )
62+ }
63+ } , [ location . pathname ] )
64+
3665 // Check if we're on a prescription list or prescription details page
3766 const isPrescriptionPage =
3867 location . pathname === FRONTEND_PATHS . PRESCRIPTION_LIST_CURRENT ||
@@ -43,51 +72,53 @@ function AppContent() {
4372 const skipTarget = isPrescriptionPage ? "#patient-details-banner" : "#main-content"
4473
4574 return (
46- < PatientDetailsProvider >
47- < EPSCookieBanner />
75+ < >
4876 < a
4977 href = { skipTarget }
5078 className = "nhsuk-skip-link"
5179 data-testid = "eps_header_skipLink"
5280 >
5381 { HEADER_STRINGS . SKIP_TO_MAIN_CONTENT }
5482 </ a >
55- < PrescriptionInformationProvider >
56- < SearchProvider >
57- < NavigationProvider >
58- < Routes >
59- < Route path = "/" element = { < Layout /> } >
60- { /* Public cookie routes */ }
61- < Route path = "cookies" element = { < CookiePolicyPage /> } />
62- < Route path = "cookies-selected" element = { < CookieSettingsPage /> } />
83+ < PatientDetailsProvider >
84+ < EPSCookieBanner />
85+ < PrescriptionInformationProvider >
86+ < SearchProvider >
87+ < NavigationProvider >
88+ < Routes >
89+ < Route path = "/" element = { < Layout /> } >
90+ { /* Public cookie routes */ }
91+ < Route path = "cookies" element = { < CookiePolicyPage /> } />
92+ < Route path = "cookies-selected" element = { < CookieSettingsPage /> } />
6393
64- { /* Your existing routes */ }
65- < Route path = "*" element = { < NotFoundPage /> } />
66- < Route path = { FRONTEND_PATHS . SESSION_SELECTION } element = { < SessionSelectionPage /> } />
67- < Route path = { FRONTEND_PATHS . LOGIN } element = { < LoginPage /> } />
68- < Route path = { FRONTEND_PATHS . LOGOUT } element = { < LogoutPage /> } />
69- < Route path = { FRONTEND_PATHS . SESSION_LOGGED_OUT } element = { < SessionLoggedOutPage /> } />
70- < Route path = { FRONTEND_PATHS . SELECT_YOUR_ROLE } element = { < SelectYourRolePage /> } />
71- < Route path = { FRONTEND_PATHS . YOUR_SELECTED_ROLE } element = { < YourSelectedRolePage /> } />
72- < Route path = { FRONTEND_PATHS . CHANGE_YOUR_ROLE } element = { < ChangeRolePage /> } />
73- < Route path = { FRONTEND_PATHS . SEARCH_BY_PRESCRIPTION_ID } element = { < SearchPrescriptionPage /> } />
74- < Route path = { FRONTEND_PATHS . SEARCH_BY_NHS_NUMBER } element = { < SearchPrescriptionPage /> } />
75- < Route path = { FRONTEND_PATHS . SEARCH_BY_BASIC_DETAILS } element = { < SearchPrescriptionPage /> } />
76- < Route path = { FRONTEND_PATHS . PRESCRIPTION_LIST_CURRENT } element = { < PrescriptionListPage /> } />
77- < Route path = { FRONTEND_PATHS . PRESCRIPTION_LIST_FUTURE } element = { < PrescriptionListPage /> } />
78- < Route path = { FRONTEND_PATHS . PRESCRIPTION_LIST_PAST } element = { < PrescriptionListPage /> } />
79- < Route path = { FRONTEND_PATHS . PRESCRIPTION_DETAILS_PAGE } element = { < PrescriptionDetailsPage /> } />
80- < Route path = { FRONTEND_PATHS . PATIENT_SEARCH_RESULTS } element = { < SearchResultsPage /> } />
81- < Route path = { FRONTEND_PATHS . TOO_MANY_SEARCH_RESULTS } element = { < TooManySearchResultsPage /> } />
82- < Route path = { FRONTEND_PATHS . NO_PATIENT_FOUND } element = { < NoPatientsFoundPage /> } />
83- < Route path = { FRONTEND_PATHS . NO_PRESCRIPTIONS_FOUND } element = { < NoPrescriptionsFoundPage /> } />
84- < Route path = { FRONTEND_PATHS . PRIVACY_NOTICE } element = { < PrivacyNoticePage /> } />
85- </ Route >
86- </ Routes >
87- </ NavigationProvider >
88- </ SearchProvider >
89- </ PrescriptionInformationProvider >
90- </ PatientDetailsProvider >
94+ { /* Your existing routes */ }
95+ < Route path = "*" element = { < NotFoundPage /> } />
96+ < Route path = { FRONTEND_PATHS . SESSION_SELECTION } element = { < SessionSelectionPage /> } />
97+ < Route path = { FRONTEND_PATHS . LOGIN } element = { < LoginPage /> } />
98+ < Route path = { FRONTEND_PATHS . LOGOUT } element = { < LogoutPage /> } />
99+ < Route path = { FRONTEND_PATHS . SESSION_LOGGED_OUT } element = { < SessionLoggedOutPage /> } />
100+ < Route path = { FRONTEND_PATHS . SELECT_YOUR_ROLE } element = { < SelectYourRolePage /> } />
101+ < Route path = { FRONTEND_PATHS . YOUR_SELECTED_ROLE } element = { < YourSelectedRolePage /> } />
102+ < Route path = { FRONTEND_PATHS . CHANGE_YOUR_ROLE } element = { < ChangeRolePage /> } />
103+ < Route path = { FRONTEND_PATHS . SEARCH_BY_PRESCRIPTION_ID } element = { < SearchPrescriptionPage /> } />
104+ < Route path = { FRONTEND_PATHS . SEARCH_BY_NHS_NUMBER } element = { < SearchPrescriptionPage /> } />
105+ < Route path = { FRONTEND_PATHS . SEARCH_BY_BASIC_DETAILS } element = { < SearchPrescriptionPage /> } />
106+ < Route path = { FRONTEND_PATHS . PRESCRIPTION_LIST_CURRENT } element = { < PrescriptionListPage /> } />
107+ < Route path = { FRONTEND_PATHS . PRESCRIPTION_LIST_FUTURE } element = { < PrescriptionListPage /> } />
108+ < Route path = { FRONTEND_PATHS . PRESCRIPTION_LIST_PAST } element = { < PrescriptionListPage /> } />
109+ < Route path = { FRONTEND_PATHS . PRESCRIPTION_DETAILS_PAGE } element = { < PrescriptionDetailsPage /> } />
110+ < Route path = { FRONTEND_PATHS . PATIENT_SEARCH_RESULTS } element = { < SearchResultsPage /> } />
111+ < Route path = { FRONTEND_PATHS . TOO_MANY_SEARCH_RESULTS } element = { < TooManySearchResultsPage /> } />
112+ < Route path = { FRONTEND_PATHS . NO_PATIENT_FOUND } element = { < NoPatientsFoundPage /> } />
113+ < Route path = { FRONTEND_PATHS . NO_PRESCRIPTIONS_FOUND } element = { < NoPrescriptionsFoundPage /> } />
114+ < Route path = { FRONTEND_PATHS . PRIVACY_NOTICE } element = { < PrivacyNoticePage /> } />
115+ </ Route >
116+ </ Routes >
117+ </ NavigationProvider >
118+ </ SearchProvider >
119+ </ PrescriptionInformationProvider >
120+ </ PatientDetailsProvider >
121+ </ >
91122 )
92123}
93124
0 commit comments