1- import React , { memo , forwardRef , type CSSProperties } from "react" ;
1+ import React , { memo , forwardRef , type CSSProperties , ReactNode } from "react" ;
22import { symToStr } from "tsafe/symToStr" ;
33import { assert } from "tsafe/assert" ;
44import type { Equals } from "tsafe" ;
@@ -8,6 +8,18 @@ import { createComponentI18nApi } from "./i18n";
88import { RegisteredLinkProps , getLink } from "./link" ;
99import { useAnalyticsId } from "./tools/useAnalyticsId" ;
1010
11+ const DynamicLink = ( {
12+ useReactLinkComponent,
13+ children,
14+ ...rest
15+ } : {
16+ useReactLinkComponent : boolean ;
17+ children : ReactNode ;
18+ } ) => {
19+ const { Link } = getLink ( ) ;
20+ return useReactLinkComponent ? < Link { ...rest } > { children } </ Link > : < a { ...rest } > { children } </ a > ;
21+ } ;
22+
1123export type PaginationProps = {
1224 id ?: string ;
1325 className ?: string ;
@@ -100,36 +112,43 @@ export const Pagination = memo(
100112 < ul className = { cx ( fr . cx ( "fr-pagination__list" ) , classes . list ) } >
101113 { showFirstLast && (
102114 < li >
103- < Link
115+ < DynamicLink
116+ useReactLinkComponent = { defaultPage > 1 }
104117 { ...( count > 0 && defaultPage > 1 && getPageLinkProps ( 1 ) ) }
105- className = { cx (
106- fr . cx ( "fr-pagination__link" , "fr-pagination__link--first" ) ,
107- classes . link ,
108- getPageLinkProps ( 1 ) . className
109- ) }
110- aria-disabled = { count > 0 && defaultPage > 1 ? true : undefined }
111- role = "link"
118+ { ...{
119+ className : cx (
120+ fr . cx ( "fr-pagination__link" , "fr-pagination__link--first" ) ,
121+ classes . link ,
122+ getPageLinkProps ( 1 ) . className
123+ ) ,
124+ "aria-disabled" :
125+ count > 0 && defaultPage > 1 ? true : undefined ,
126+ role : "link"
127+ } }
112128 >
113129 { t ( "first page" ) }
114- </ Link >
130+ </ DynamicLink >
115131 </ li >
116132 ) }
117133 < li >
118- < Link
119- className = { cx (
120- fr . cx (
121- "fr-pagination__link" ,
122- "fr-pagination__link--prev" ,
123- "fr-pagination__link--lg-label"
124- ) ,
125- classes . link
126- ) }
134+ < DynamicLink
135+ useReactLinkComponent = { defaultPage > 1 }
127136 { ...( defaultPage > 1 && getPageLinkProps ( defaultPage - 1 ) ) }
128- aria-disabled = { defaultPage <= 1 ? true : undefined }
129- role = "link"
137+ { ...{
138+ className : cx (
139+ fr . cx (
140+ "fr-pagination__link" ,
141+ "fr-pagination__link--prev" ,
142+ "fr-pagination__link--lg-label"
143+ ) ,
144+ classes . link
145+ ) ,
146+ "aria-disabled" : defaultPage <= 1 ? true : undefined ,
147+ role : "link"
148+ } }
130149 >
131150 { t ( "previous page" ) }
132- </ Link >
151+ </ DynamicLink >
133152 </ li >
134153 { parts . map ( part => (
135154 < li key = { part . number } >
@@ -150,34 +169,40 @@ export const Pagination = memo(
150169 </ li >
151170 ) ) }
152171 < li >
153- < Link
154- className = { cx (
155- fr . cx (
156- "fr-pagination__link" ,
157- "fr-pagination__link--next" ,
158- "fr-pagination__link--lg-label"
159- ) ,
160- classes . link
161- ) }
172+ < DynamicLink
173+ useReactLinkComponent = { defaultPage < count }
162174 { ...( defaultPage < count && getPageLinkProps ( defaultPage + 1 ) ) }
163- aria-disabled = { defaultPage < count ? true : undefined }
164- role = "link"
175+ { ...{
176+ className : cx (
177+ fr . cx (
178+ "fr-pagination__link" ,
179+ "fr-pagination__link--next" ,
180+ "fr-pagination__link--lg-label"
181+ ) ,
182+ classes . link
183+ ) ,
184+ "aria-disabled" : defaultPage < count ? true : undefined ,
185+ role : "link"
186+ } }
165187 >
166188 { t ( "next page" ) }
167- </ Link >
189+ </ DynamicLink >
168190 </ li >
169191 { showFirstLast && (
170192 < li >
171- < Link
172- className = { cx (
173- fr . cx ( "fr-pagination__link" , "fr-pagination__link--last" ) ,
174- classes . link
175- ) }
193+ < DynamicLink
194+ useReactLinkComponent = { defaultPage < count }
176195 { ...( defaultPage < count && getPageLinkProps ( count ) ) }
177- aria-disabled = { defaultPage < count ? true : undefined }
196+ { ...{
197+ className : cx (
198+ fr . cx ( "fr-pagination__link" , "fr-pagination__link--last" ) ,
199+ classes . link
200+ ) ,
201+ "aria-disabled" : defaultPage < count ? true : undefined
202+ } }
178203 >
179204 { t ( "last page" ) }
180- </ Link >
205+ </ DynamicLink >
181206 </ li >
182207 ) }
183208 </ ul >
0 commit comments