@@ -23,7 +23,7 @@ import {
2323 getDashboardSummary ,
2424} from "../../../../../../functions/server/dashboard" ;
2525import { getExposureStatus } from "../../../../../../components/server/StatusPill" ;
26- import { TabList } from "../../../../../../components/client/TabList" ;
26+ import { TabList , TabPanel } from "../../../../../../components/client/TabList" ;
2727import { filterExposures } from "./filterExposures" ;
2828import { SubscriberBreach } from "../../../../../../../utils/subscriberBreaches" ;
2929import { getLocale } from "../../../../../../functions/universal/getLocale" ;
@@ -35,6 +35,7 @@ import { getNextGuidedStep } from "../../../../../../functions/server/getRelevan
3535import { useTelemetry } from "../../../../../../hooks/useTelemetry" ;
3636import { UserAnnouncementWithDetails } from "../../../../../../../db/tables/user_announcements" ;
3737import { PlusShutdownBanner } from "../../../../../../components/client/PlusShutdownBanner" ;
38+ import { Item , useTabListState } from "react-stately" ;
3839
3940export type TabType = "action-needed" | "fixed" ;
4041
@@ -89,16 +90,6 @@ export const View = (props: Props) => {
8990 const [ activeExposureCardKey , setActiveExposureCardKey ] = useState <
9091 string | null
9192 > ( null ) ;
92- const tabsData : TabData [ ] = [
93- {
94- name : l10n . getString ( "dashboard-tab-label-action-needed" ) ,
95- key : "action-needed" ,
96- } ,
97- {
98- name : l10n . getString ( "dashboard-tab-label-fixed" ) ,
99- key : "fixed" ,
100- } ,
101- ] ;
10293
10394 const breachesDataArray = props . userBreaches . flat ( ) ;
10495
@@ -124,6 +115,33 @@ export const View = (props: Props) => {
124115 } ) ;
125116
126117 const tabSpecificExposures = getTabSpecificExposures ( activeTab ) ;
118+ const tabsData : TabData [ ] = [
119+ {
120+ name : l10n . getString ( "dashboard-tab-label-action-needed" ) ,
121+ key : "action-needed" ,
122+ } ,
123+ {
124+ name : l10n . getString ( "dashboard-tab-label-fixed" ) ,
125+ key : "fixed" ,
126+ } ,
127+ ] ;
128+
129+ const tabListState = useTabListState ( {
130+ selectedKey : activeTab ,
131+ onSelectionChange : ( key ) => {
132+ setActiveTab ( key as TabType ) ;
133+ recordTelemetry ( "dashboard" , "view" , {
134+ dashboard_tab : key as TabType ,
135+ breach_count : breachesDataArray . length ,
136+ } ) ;
137+ } ,
138+ children : tabsData . map ( ( t ) => (
139+ < Item key = { t . key } title = { t . name } >
140+ < > </ >
141+ </ Item >
142+ ) ) ,
143+ } ) ;
144+
127145 const filteredExposures = filterExposures ( tabSpecificExposures , filters ) ;
128146 const exposureCardElems = filteredExposures . map (
129147 ( exposure : SubscriberBreach ) => {
@@ -187,21 +205,15 @@ export const View = (props: Props) => {
187205 enabledFeatureFlags = { props . enabledFeatureFlags }
188206 announcements = { announcements }
189207 >
190- < TabList
191- tabs = { tabsData }
192- onSelectionChange = { ( selectedKey ) => {
193- setActiveTab ( selectedKey as TabType ) ;
194- recordTelemetry ( "dashboard" , "view" , {
195- dashboard_tab : selectedKey as TabType ,
196- breach_count : breachesDataArray . length ,
197- } ) ;
198- } }
199- selectedKey = { activeTab }
200- />
208+ < TabList tabs = { tabsData } state = { tabListState } />
201209 </ Toolbar >
202210 < PlusShutdownBanner countryCode = { props . countryCode } />
203211
204- < div className = { styles . dashboardContent } >
212+ < TabPanel
213+ className = { styles . dashboardContent }
214+ state = { tabListState }
215+ id = { activeTab }
216+ >
205217 < DashboardTopBanner
206218 tabType = { activeTab }
207219 hasExposures = { hasExposures }
@@ -252,7 +264,7 @@ export const View = (props: Props) => {
252264 ) : (
253265 < ul className = { styles . exposureList } > { exposureCardElems } </ ul >
254266 ) }
255- </ div >
267+ </ TabPanel >
256268 </ div >
257269 ) ;
258270} ;
0 commit comments