11import React , {
22 memo ,
33 forwardRef ,
4- useId ,
4+ cloneElement ,
55 type ReactNode ,
66 type CSSProperties ,
77 type ComponentProps
@@ -22,7 +22,6 @@ import { setBrandTopAndHomeLinkProps } from "../zz_internal/brandTopAndHomeLinkP
2222import { typeGuard } from "tsafe/typeGuard" ;
2323import { SearchButton } from "../SearchBar/SearchButton" ;
2424import { useTranslation as useSearchBarTranslation } from "../SearchBar/SearchBar" ;
25- import { generateValidHtmlId } from "../tools/generateValidHtmlId" ;
2625
2726export type HeaderProps = {
2827 className ?: string ;
@@ -33,7 +32,7 @@ export type HeaderProps = {
3332 serviceTagline ?: ReactNode ;
3433 navigation ?: MainNavigationProps . Item [ ] | ReactNode ;
3534 /** There should be at most three of them */
36- quickAccessItems ?: ( HeaderProps . QuickAccessItem | ReactNode ) [ ] ;
35+ quickAccessItems ?: ( HeaderProps . QuickAccessItem | JSX . Element | null ) [ ] ;
3736 operatorLogo ?: {
3837 orientation : "horizontal" | "vertical" ;
3938 /**
@@ -155,24 +154,28 @@ export const Header = memo(
155154
156155 const { Link } = getLink ( ) ;
157156
158- const getQuickAccessNode = ( suffix : string | null = null ) => (
157+ const getQuickAccessNode = ( usecase : "mobile" | "desktop" ) => (
159158 < ul className = { fr . cx ( "fr-btns-group" ) } >
160159 { quickAccessItems . map ( ( quickAccessItem , i ) => (
161160 < li key = { i } >
162- { ! typeGuard < HeaderProps . QuickAccessItem > (
163- quickAccessItem ,
164- quickAccessItem instanceof Object && "text" in quickAccessItem
165- ) ? (
166- quickAccessItem
167- ) : (
168- < HeaderQuickAccessItem
169- id = { `${ id } -quick-access-item-${ generateValidHtmlId ( {
170- "fallback" : "" ,
171- "text" : `${ quickAccessItem . text } ${ suffix ? `-${ suffix } ` : "" } `
172- } ) } -${ i } `}
173- quickAccessItem = { quickAccessItem }
174- />
175- ) }
161+ { ( ( ) => {
162+ const node = ! typeGuard < HeaderProps . QuickAccessItem > (
163+ quickAccessItem ,
164+ quickAccessItem instanceof Object && "text" in quickAccessItem
165+ ) ? (
166+ quickAccessItem
167+ ) : (
168+ < HeaderQuickAccessItem quickAccessItem = { quickAccessItem } />
169+ ) ;
170+
171+ if ( node === null ) {
172+ return null ;
173+ }
174+
175+ return cloneElement ( node , {
176+ "id" : `${ id } -quick-access-item-${ i } -${ usecase } `
177+ } ) ;
178+ } ) ( ) }
176179 </ li >
177180 ) ) }
178181 </ ul >
@@ -346,7 +349,7 @@ export const Header = memo(
346349 classes . toolsLinks
347350 ) }
348351 >
349- { getQuickAccessNode ( ) }
352+ { getQuickAccessNode ( "desktop" ) }
350353 </ div >
351354 ) }
352355
@@ -481,35 +484,23 @@ addHeaderTranslations({
481484} ) ;
482485
483486export type HeaderQuickAccessItemProps = {
484- id ?: string ;
485487 className ?: string ;
486488 quickAccessItem : HeaderProps . QuickAccessItem ;
487489} ;
488490
489491export function HeaderQuickAccessItem ( props : HeaderQuickAccessItemProps ) : JSX . Element {
490- const { id : id_props , className, quickAccessItem } = props ;
492+ const { className, quickAccessItem } = props ;
491493
492494 const { Link } = getLink ( ) ;
493495
494- const id = ( function useClosure ( ) {
495- const id = useId ( ) ;
496-
497- return (
498- id_props ??
499- ( quickAccessItem . linkProps !== undefined
500- ? quickAccessItem . linkProps . id
501- : quickAccessItem . buttonProps . id ) ??
502- `fr-header-quick-access-item${ generateValidHtmlId ( {
503- "text" : quickAccessItem . text ,
504- "fallback" : id
505- } ) } `
506- ) ;
507- } ) ( ) ;
508-
509496 return quickAccessItem . linkProps !== undefined ? (
510497 < Link
511- { ...quickAccessItem . linkProps }
512- id = { id }
498+ { ...( ( ) => {
499+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
500+ const { id, ...rest } = quickAccessItem . linkProps ;
501+
502+ return rest ;
503+ } ) ( ) }
513504 className = { cx (
514505 fr . cx ( "fr-btn" , quickAccessItem . iconId ) ,
515506 quickAccessItem . linkProps . className ,
@@ -520,8 +511,12 @@ export function HeaderQuickAccessItem(props: HeaderQuickAccessItemProps): JSX.El
520511 </ Link >
521512 ) : (
522513 < button
523- { ...quickAccessItem . buttonProps }
524- id = { id }
514+ { ...( ( ) => {
515+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
516+ const { id, ...rest } = quickAccessItem . buttonProps ;
517+
518+ return rest ;
519+ } ) ( ) }
525520 className = { cx (
526521 fr . cx ( "fr-btn" , quickAccessItem . iconId ) ,
527522 quickAccessItem . buttonProps . className ,
0 commit comments