Skip to content

Commit 9413d82

Browse files
committed
1 parent d1c8d3d commit 9413d82

File tree

1 file changed

+35
-40
lines changed

1 file changed

+35
-40
lines changed

src/Header/Header.tsx

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 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
2222
import { typeGuard } from "tsafe/typeGuard";
2323
import { SearchButton } from "../SearchBar/SearchButton";
2424
import { useTranslation as useSearchBarTranslation } from "../SearchBar/SearchBar";
25-
import { generateValidHtmlId } from "../tools/generateValidHtmlId";
2625

2726
export 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

483486
export type HeaderQuickAccessItemProps = {
484-
id?: string;
485487
className?: string;
486488
quickAccessItem: HeaderProps.QuickAccessItem;
487489
};
488490

489491
export 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

Comments
 (0)