Skip to content

Commit 5cdd854

Browse files
authored
Merge pull request #236 from codegouvfr/feat/footer-partners-link
feat: footer partners link
2 parents 04b4207 + 66a3ab6 commit 5cdd854

File tree

2 files changed

+88
-55
lines changed

2 files changed

+88
-55
lines changed

src/Footer.tsx

Lines changed: 84 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,12 @@ export namespace FooterProps {
136136

137137
export type Logo = {
138138
alt: string;
139-
href: string;
139+
/**
140+
* @deprecated use linkProps instead
141+
*/
142+
href?: string;
140143
imgUrl: string;
144+
linkProps?: RegisteredLinkProps & { title: string };
141145
};
142146
}
143147
}
@@ -371,29 +375,45 @@ export const Footer = memo(
371375
classes.partnersMain
372376
)}
373377
>
374-
{mainPartnersLogo !== undefined && (
375-
<a
376-
href={mainPartnersLogo.href}
377-
target="_blank"
378-
title={`${mainPartnersLogo.href} - ${t(
379-
"open new window"
380-
)}`}
381-
className={cx(
382-
fr.cx("fr-footer__partners-link", "fr-raw-link"),
383-
classes.partnersLink
384-
)}
385-
>
386-
<img
387-
alt={mainPartnersLogo.alt}
388-
style={{ height: "5.625rem" }}
389-
src={mainPartnersLogo.imgUrl}
390-
className={cx(
391-
fr.cx("fr-footer__logo"),
392-
classes.logo
393-
)}
394-
/>
395-
</a>
396-
)}
378+
{mainPartnersLogo !== undefined &&
379+
(() => {
380+
const children = (
381+
<img
382+
alt={mainPartnersLogo.alt}
383+
style={{ height: "5.625rem" }} // should not be hardcoded. Can conflict with ContentSecurityPolicy when "unsafe-inline" is not allowed
384+
src={mainPartnersLogo.imgUrl}
385+
className={cx(
386+
fr.cx("fr-footer__logo"),
387+
classes.logo
388+
)}
389+
/>
390+
);
391+
392+
const hasLinkProps =
393+
mainPartnersLogo.linkProps !== undefined ||
394+
mainPartnersLogo.href !== undefined;
395+
396+
return hasLinkProps ? (
397+
<Link
398+
{...mainPartnersLogo.linkProps}
399+
href={
400+
mainPartnersLogo.href ??
401+
mainPartnersLogo.linkProps?.href
402+
}
403+
className={cx(
404+
fr.cx(
405+
"fr-footer__partners-link",
406+
"fr-raw-link"
407+
),
408+
classes.partnersLink
409+
)}
410+
>
411+
{children}
412+
</Link>
413+
) : (
414+
children
415+
);
416+
})()}
397417
</div>
398418
{subPartnersLogos.length !== 0 && (
399419
<div
@@ -403,34 +423,48 @@ export const Footer = memo(
403423
)}
404424
>
405425
<ul>
406-
{subPartnersLogos.map((logo, i) => (
407-
<li key={i}>
408-
<a
409-
href={logo.href}
410-
target="_blank"
411-
title={`${logo.href} - ${t(
412-
"open new window"
413-
)}`}
426+
{subPartnersLogos.map((logo, i) => {
427+
const children = (
428+
<img
429+
alt={logo.alt}
430+
src={logo.imgUrl}
431+
style={{ "height": "5.625rem" }} // should not be hardcoded. Can conflict with ContentSecurityPolicy when "unsafe-inline" is not allowed
414432
className={cx(
415-
fr.cx(
416-
"fr-footer__partners-link",
417-
"fr-raw-link"
418-
),
419-
classes.partnersLink
433+
fr.cx("fr-footer__logo"),
434+
classes.logo
435+
)}
436+
/>
437+
);
438+
439+
const hasLinkProps =
440+
logo.linkProps !== undefined ||
441+
logo.href !== undefined;
442+
443+
return (
444+
<li key={i}>
445+
{hasLinkProps ? (
446+
<Link
447+
{...logo.linkProps}
448+
href={
449+
logo.href ??
450+
logo.linkProps?.href
451+
}
452+
className={cx(
453+
fr.cx(
454+
"fr-footer__partners-link",
455+
"fr-raw-link"
456+
),
457+
classes.partnersLink
458+
)}
459+
>
460+
{children}
461+
</Link>
462+
) : (
463+
children
420464
)}
421-
>
422-
<img
423-
alt={logo.alt}
424-
src={logo.imgUrl}
425-
style={{ "height": "5.625rem" }}
426-
className={cx(
427-
fr.cx("fr-footer__logo"),
428-
classes.logo
429-
)}
430-
/>
431-
</a>
432-
</li>
433-
))}
465+
</li>
466+
);
467+
})}
434468
</ul>
435469
</div>
436470
)}

stories/Footer.stories.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,18 +164,17 @@ export const WithPartners = getStory({
164164
`,
165165
"partnersLogos": {
166166
"main": {
167-
"href": "#",
168167
"imgUrl": placeholder_16x9ImgUrl,
169-
"alt": "[À MODIFIER - texte alternatif de l’image]"
168+
"alt": "[À MODIFIER - texte alternatif de l’image]",
169+
"linkProps": { "href": "#", "title": "Lien vers le site du partenaire" }
170170
},
171171
"sub": [
172172
{
173-
"href": "#",
174173
"imgUrl": placeholder_16x9ImgUrl,
175-
"alt": "[À MODIFIER - texte alternatif de l’image]"
174+
"alt": "[À MODIFIER - texte alternatif de l’image]",
175+
"linkProps": { "href": "#", "title": "Lien vers le site du partenaire" }
176176
},
177177
{
178-
"href": "#",
179178
"imgUrl": placeholder_16x9ImgUrl,
180179
"alt": "[À MODIFIER - texte alternatif de l’image]"
181180
}

0 commit comments

Comments
 (0)