Skip to content

Commit fb4a2f0

Browse files
authored
Merge pull request #273 from DavidFrancois/main
fix(Pagination): Allow usage of Pagination component with Next.js
2 parents ad5f39f + 6f13fc2 commit fb4a2f0

File tree

1 file changed

+66
-41
lines changed

1 file changed

+66
-41
lines changed

src/Pagination.tsx

Lines changed: 66 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { memo, forwardRef, type CSSProperties } from "react";
1+
import React, { memo, forwardRef, type CSSProperties, ReactNode } from "react";
22
import { symToStr } from "tsafe/symToStr";
33
import { assert } from "tsafe/assert";
44
import type { Equals } from "tsafe";
@@ -8,6 +8,18 @@ import { createComponentI18nApi } from "./i18n";
88
import { RegisteredLinkProps, getLink } from "./link";
99
import { 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+
1123
export 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

Comments
 (0)