+ {
+ Object.entries(data)
+ .sort(([a,], [b,]) => parseInt(b) - parseInt(a))
+ .map(([cdfrYear, data]) => (
+ <>
+
+ {cdfrYear == `${currentCDFRYear}` ?
+ "Les newsletters de cette année :" :
+ `Coupe de France de Robotique ${cdfrYear}`}
+
+
+ {Object.entries(data)
+ .filter(([date, _]) => new Date(date) <= new Date())
+ .sort(([a,], [b,]) => new Date(b).getTime() - new Date(a).getTime())
+ .map(([date, data]) => (
+
+ ))}
+
+ >
+ ))
+ }
{
);
},
img({src, title, alt}) {
- const newSrc = src?.startsWith('http') ? src : `/newsletters/${id}/${src}`;
+ const newSrc = src?.startsWith('http') ? src : `/newsletters/${folder}/${src}`;
const w = title?.split('=')[1]?.split('x')[0];
return (
<>
@@ -140,7 +169,7 @@ const Newsletters: React.FC = () => {
);
},
a({href, children}) {
- const newSrc = href?.startsWith('http') || href?.startsWith('/newsletters') ? href : `/newsletters/${id}/${href}`;
+ const newSrc = href?.startsWith('http') || href?.startsWith('/newsletters') ? href : `/newsletters/${folder}/${href}`;
const SIZE_TOKEN = /^\d+x\d+$/;
if (newSrc.endsWith('mp4') && !href?.startsWith("/newsletters") && children) {
const words = children.toString().split(" ");
@@ -187,7 +216,7 @@ const Newsletters: React.FC = () => {
)
}
- }, [id, data, md, loadError])
+ }, [id, data, md, loadError, folder, currentCDFRYear])
}
export default Newsletters
\ No newline at end of file
From 50b9ecc4d596b44c25a632a66e74157ca9d68e56 Mon Sep 17 00:00:00 2001
From: Seb-sti1 <65665540+seb-sti1@users.noreply.github.com>
Date: Sat, 11 Jul 2026 16:33:10 +0200
Subject: [PATCH 7/7] feat(markdown): add shortcut at the bottom of the
newsletters
---
src/pages/Newsletters.tsx | 46 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/src/pages/Newsletters.tsx b/src/pages/Newsletters.tsx
index 3b9e1f7..a199edd 100644
--- a/src/pages/Newsletters.tsx
+++ b/src/pages/Newsletters.tsx
@@ -69,6 +69,31 @@ const Newsletters: React.FC = () => {
}
}, [id, folder, data]);
+ useEffect(() => {
+ window.scrollTo({top: 0, left: 0, behavior: "instant" as ScrollBehavior});
+ }, [id]);
+
+ const navigation = useMemo(() => {
+ if (!id) return undefined;
+ const year = parseInt(id.split("-")[0]);
+ const date = id.split("-").slice(1).join("-");
+ const yearData = data[year];
+ if (!yearData) return undefined;
+
+ const sorted = Object.entries(yearData)
+ .filter(([d]) => new Date(d) <= new Date())
+ .sort(([a], [b]) => new Date(a).getTime() - new Date(b).getTime());
+ const index = sorted.findIndex(([d]) => d === date);
+ if (index === -1) return undefined;
+
+ const prev = index > 0 ? sorted[index - 1] : undefined;
+ const next = index < sorted.length - 1 ? sorted[index + 1] : undefined;
+ return {
+ prev: prev ? {folder: `${year}-${prev[0]}`, title: prev[1].title} : undefined,
+ next: next ? {folder: `${year}-${next[0]}`, title: next[1].title} : undefined,
+ };
+ }, [id, data]);
+
return useMemo(() => {
if (loadError) {
return (
@@ -213,10 +238,29 @@ const Newsletters: React.FC = () => {
{md}