Skip to content

Commit 91d2ca6

Browse files
authored
MEP lineup API Con 2025 (#602)
1 parent f170987 commit 91d2ca6

169 files changed

Lines changed: 3440 additions & 1516 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

pwa/api/con/conferences.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ export const getConferencesBySpeaker = async (
3333
locale: Locale
3434
) => {
3535
const conferences = await getAllConferences(edition, true, locale);
36-
3736
return conferences
3837
.filter((conference) =>
3938
conference.speakers.find((speaker: Speaker) => speaker.id === speakerId)

pwa/app/(con)/[locale]/con/2025/components/HomePage.tsx

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
4545
{t("buy_tickets")}
4646
</BuyButton>
4747
)}
48-
<Button empty to={`/${locale}/con/2025/call-for-papers`}>
49-
{t("2025.cfp.title")}
50-
</Button>
5148
</div>
5249
</div>
5350
</div>
@@ -59,7 +56,7 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
5956
>
6057
<div className="container text-center">
6158
<SectionTitle h1>
62-
<Translate translationKey="2025.our_speakers.title" />
59+
<Translate translationKey="speakers.title" />
6360
</SectionTitle>
6461
<SectionSubTitle>
6562
<Translate
@@ -68,30 +65,26 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
6865
edition: "2025",
6966
link: (
7067
<a
71-
href={`/${locale}/con/2025/call-for-papers`}
68+
href="https://conference-hall.io/public/event/GMijW4ZrZDo6hzKeF1gk"
7269
className="link"
70+
target="_blank"
71+
rel="noreferrer nooepener"
7372
>
7473
{t("2025.our_speakers.subtitle_link")}
7574
</a>
7675
),
7776
}}
7877
/>
7978
</SectionSubTitle>
80-
<SpeakerList speakers={speakers} max={6} />
81-
{speakers.length > 6 ? (
79+
<SpeakerList speakers={speakers} max={9} />
80+
{speakers.length > 9 ? (
8281
<Button
8382
className="mx-auto my-7"
8483
to={`/${locale}/con/2025/speakers`}
8584
>
8685
{t("speakers.see_all")}
8786
</Button>
8887
) : null}
89-
<Button
90-
className="mx-auto my-7"
91-
to={`/${locale}/con/2025/call-for-papers`}
92-
>
93-
{t("2025.our_speakers.cfp")}
94-
</Button>
9588
</div>
9689
</Section>
9790
{currentEdition === "2025" && (
@@ -203,12 +196,15 @@ const HomePage = ({ speakers, partners, images }: HomePageProps) => {
203196
</SectionTitle>
204197
<LookingSponsorCard />
205198
</div>
206-
<div className="bg-white text-center relative z-10 pt-40 pb-40">
199+
<div
200+
id="partners"
201+
className="bg-white text-center relative z-10 pt-40 pb-40"
202+
>
207203
<div className="container text-center">
208204
<div className="lined-center lined-blue font-bold uppercase text-2xl text-blue font-title">
209-
{t("sponsorship.they_trust_us", { year: "2024" })}
205+
<Translate translationKey="partners.title" />
210206
</div>
211-
<Partners data={partners} edition="2024" />
207+
<Partners data={partners} edition="2025" />
212208
</div>
213209
</div>
214210
</Section>

pwa/app/(con)/[locale]/con/2025/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { getAllSpeakers } from "api/con/speakers";
22
import { getAllEditionPictures } from "api/con/editions";
3-
import partners from "data/con/2024/partners";
3+
import partners from "data/con/2025/partners";
44
import HomePage from "./components/HomePage";
55
import { Locale, i18n } from "i18n/i18n-config";
66
import { Metadata } from "next";

pwa/app/(con)/[locale]/con/2025/tickets/RegisterPage.tsx

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,13 @@ export default function RegisterPage() {
2929
if (isActiveOffer(offer)) return false;
3030
if (offer.startDate && dayjs(offer.startDate).isBefore(dayjs(), "day"))
3131
return true;
32+
if (!offer.startDate) return true;
3233
return false;
3334
};
3435

3536
const expectations =
3637
getLocaleDictionary?.()[2025].tickets.expect.points || [];
3738

38-
const onIframeLoaded = () => {
39-
console.log("loaded !");
40-
const iframe = document.getElementById(
41-
"yurplan-widget-141690"
42-
) as HTMLIFrameElement | null;
43-
console.log("iframe ?", !!iframe);
44-
if (!iframe) return;
45-
const loader = document.getElementById("loader");
46-
loader?.classList.add("hidden");
47-
48-
const contenu = iframe.contentWindow?.document.body.scrollHeight;
49-
iframe.style.height = contenu + "px";
50-
};
51-
5239
useEffect(() => {
5340
const iframe = document.getElementById(
5441
"yurplan-widget-141690"

pwa/app/(con)/[locale]/con/[edition]/conferences/[slug]/components/ConferenceSpeaker.tsx

Lines changed: 56 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Link from "components/common/Link";
77
import SpeakerImage from "components/con/speakers/SpeakerImage";
88
import Button from "components/con/common/Button";
99
import { LanguageContext } from "contexts/con/LanguageContext";
10+
import SpeakerImage2025 from "components/con/speakers/SpeakerImage2025";
1011

1112
interface SpeakerProps {
1213
conference: Conference;
@@ -21,69 +22,71 @@ const ConferenceSpeaker = ({ conference }: SpeakerProps) => {
2122
{speakers.map((speaker: Speaker) => {
2223
const { name, job, company, image, placeholder, url } = speaker;
2324
return (
24-
<div
25-
key={speaker.name}
26-
className={classNames(
27-
"bg-blue-gradient bg-blue text-center px-5 py-5 border-b-2 border-dotted border-b-white/50 last:border-b-0 group hover:bg-blue-dark transition-colors",
28-
speakers.length === 1 && "md:hover:bg-blue md:pt-10 md:pb-5"
29-
)}
30-
>
31-
<Link
32-
href={url}
25+
<>
26+
<div
27+
key={speaker.name}
3328
className={classNames(
34-
"flex flex-row items-center",
35-
speakers.length === 1 && "md:flex-col"
29+
"bg-blue-gradient bg-blue text-center px-5 py-5 border-b-2 border-dotted border-b-white/50 last:border-b-0 group hover:bg-blue-dark transition-colors",
30+
speakers.length === 1 && "md:hover:bg-blue md:pt-10 md:pb-5"
3631
)}
3732
>
38-
<div
33+
<Link
34+
href={url}
3935
className={classNames(
40-
"w-20 h-20",
41-
speakers.length === 1 && "md:mx-auto md:w-60 md:h-60"
36+
"flex flex-row items-center",
37+
speakers.length === 1 && "md:flex-col"
4238
)}
4339
>
44-
<SpeakerImage
45-
image={image}
46-
placeholder={placeholder}
47-
hoverable={false}
48-
/>
49-
</div>
40+
<div
41+
className={classNames(
42+
"w-20 h-20 relative",
43+
speakers.length === 1 && "md:mx-auto md:w-60 md:h-60"
44+
)}
45+
>
46+
{conference.edition === "2025" ? (
47+
<SpeakerImage2025 speaker={speaker} image={image} />
48+
) : (
49+
<SpeakerImage image={image} placeholder={placeholder} />
50+
)}
51+
</div>
5052

51-
<div
52-
className={classNames(
53-
"text-inherit uppercase font-title ml-5 flex-1 transition-colors group-hover:text-white",
54-
speakers.length === 1 &&
55-
"md:mt-7 md:ml-0 md:group-hover:text-blue-black"
56-
)}
57-
>
58-
<span
53+
<div
5954
className={classNames(
60-
"inline-block leading-tight font-semibold text-lg",
61-
speakers.length === 1 && "md:text-xl"
55+
"text-inherit uppercase font-title ml-5 flex-1 transition-colors group-hover:text-white",
56+
speakers.length === 1 &&
57+
"md:mt-7 md:ml-0 md:group-hover:text-blue-black"
6258
)}
6359
>
64-
{name}
65-
</span>
66-
<Overline className="text-white lined-center lined-white/50">
67-
{job}
68-
<br />
69-
{company ? (
70-
<>
71-
@ <strong className="font-normal">{company}</strong>
72-
</>
73-
) : null}
74-
</Overline>
75-
</div>
76-
</Link>
77-
{speakers.length === 1 && (
78-
<Button
79-
className="mt-5 white square hidden md:inline-block"
80-
size="small"
81-
to={speaker.url}
82-
>
83-
{t("conferences.see_speaker_details")}
84-
</Button>
85-
)}
86-
</div>
60+
<span
61+
className={classNames(
62+
"inline-block leading-tight font-semibold text-lg",
63+
speakers.length === 1 && "md:text-xl"
64+
)}
65+
>
66+
{name}
67+
</span>
68+
<Overline className="text-white lined-center lined-white/50">
69+
{job}
70+
<br />
71+
{company ? (
72+
<>
73+
@ <strong className="font-normal">{company}</strong>
74+
</>
75+
) : null}
76+
</Overline>
77+
</div>
78+
</Link>
79+
{speakers.length === 1 && (
80+
<Button
81+
className="mt-5 white square hidden md:inline-block"
82+
size="small"
83+
to={speaker.url}
84+
>
85+
{t("conferences.see_speaker_details")}
86+
</Button>
87+
)}
88+
</div>
89+
</>
8790
);
8891
})}
8992
</div>

pwa/app/(con)/[locale]/con/[edition]/speakers/SpeakersPage.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@ import { Speaker } from "types/con";
66
import SectionSubTitle from "components/con/common/typography/SectionSubtitle";
77
import { LanguageContext } from "contexts/con/LanguageContext";
88

9-
interface Speakers {
9+
interface SpeakersProps {
1010
speakers: Speaker[];
11+
edition: string;
1112
}
1213

13-
export default function SpeakerPageListTemplate({ speakers }: Speakers) {
14+
export default function SpeakerPageListTemplate({
15+
speakers,
16+
edition,
17+
}: SpeakersProps) {
1418
const { t, Translate } = useContext(LanguageContext);
1519
return (
1620
<div className="container flex flex-col items-center pt-10 | sm:pt-20">
1721
<SectionTitle h1 dark>
1822
<Translate translationKey="speakers.title" />
1923
</SectionTitle>
20-
<SectionSubTitle dark>{t("speakers.subtitle")}</SectionSubTitle>
24+
<SectionSubTitle dark>
25+
{t(`${edition}.our_speakers.subtitle`)}
26+
</SectionSubTitle>
2127
<div className="pb-36 text-white">
2228
<SpeakerList speakers={speakers} />
2329
</div>

pwa/app/(con)/[locale]/con/[edition]/speakers/[slug]/SpeakerConferenceSlot.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,28 @@ export default function SpeakerConferenceSlot({
3030
</span>
3131
{<Overline>{getConferenceDate(date)}</Overline>}
3232
</>
33-
) : null}
33+
) : (
34+
<div className="text-white flex flex-col gap-4 items-center">
35+
<svg
36+
xmlns="http://www.w3.org/2000/svg"
37+
fill="none"
38+
viewBox="0 0 24 24"
39+
strokeWidth={1.5}
40+
stroke="currentColor"
41+
className="size-12 opacity-60"
42+
>
43+
<path
44+
strokeLinecap="round"
45+
strokeLinejoin="round"
46+
d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5m-9-6h.008v.008H12v-.008ZM12 15h.008v.008H12V15Zm0 2.25h.008v.008H12v-.008ZM9.75 15h.008v.008H9.75V15Zm0 2.25h.008v.008H9.75v-.008ZM7.5 15h.008v.008H7.5V15Zm0 2.25h.008v.008H7.5v-.008Zm6.75-4.5h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V15Zm0 2.25h.008v.008h-.008v-.008Zm2.25-4.5h.008v.008H16.5v-.008Zm0 2.25h.008v.008H16.5V15Z"
47+
/>
48+
</svg>
49+
50+
<span className="uppercase text-white font-bold font-title">
51+
{t("speakers.no_date")}
52+
</span>
53+
</div>
54+
)}
3455
</div>
3556
<div className="flex flex-col flex-1 items-start py-5 px-12">
3657
<div className="lined-left flex flex-col">

pwa/app/(con)/[locale]/con/[edition]/speakers/[slug]/SpeakerPage.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import SpeakerConferenceSlot from "./SpeakerConferenceSlot";
88
import { LanguageContext } from "contexts/con/LanguageContext";
99
import Button from "components/con/common/Button";
1010
import SpeakerList from "components/con/speakers/SpeakerList";
11+
import SpeakerImage2025 from "components/con/speakers/SpeakerImage2025";
1112

1213
interface SpeakerProps {
1314
speakerData: Speaker;
@@ -45,7 +46,11 @@ export default function SpeakerPageTemplate({
4546
</div>
4647
<div className="flex flex-col relative flex-wrap items-center bg-grey px-10 pb-10 pt-28 | lg:flex-row lg:items-start | sm:pb-20">
4748
<div className="w-72 h-72 | md:w-80 md:h-80 | lg:w-[400px] lg:h-[400px]">
48-
<SpeakerImage big image={image} placeholder={placeholder} />
49+
{edition === "2025" ? (
50+
<SpeakerImage2025 speaker={speakerData} big image={image} />
51+
) : (
52+
<SpeakerImage big image={image} placeholder={placeholder} />
53+
)}
4954
</div>
5055
<div className="flex-1 | sm:px-6">
5156
<SpeakerDescription speaker={speakerData} />

pwa/app/(con)/[locale]/con/[edition]/speakers/layout.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Locale, i18n } from "i18n/i18n-config";
22
import { Metadata } from "next";
3+
import { getRootUrl } from "utils";
34

45
type Props = {
56
params: { locale: Locale; edition: string };
@@ -20,6 +21,14 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
2021
openGraph: {
2122
title: `${dictionary.speakers.title} - API Platform Conference`,
2223
description: DESCRIPTION,
24+
images: [
25+
{
26+
url: `${getRootUrl()}/images/con/og-${edition}.png`,
27+
width: 1200,
28+
height: 630,
29+
alt: `API Platform Conference ${edition}`,
30+
},
31+
],
2332
},
2433
twitter: {
2534
title: `${dictionary.speakers.title} - API Platform Conference`,

pwa/app/(con)/[locale]/con/[edition]/speakers/page.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default async function Page({ params }: Props) {
1515
const speakers = await getSpeakers(params.edition, params.locale);
1616
// Fetch data directly in a Server Component
1717
// Forward fetched data to your Client Component
18-
return <SpeakersPage speakers={speakers} />;
18+
return <SpeakersPage speakers={speakers} edition={params.edition} />;
1919
}
2020

2121
export const generateStaticParams = async () => {
@@ -24,6 +24,7 @@ export const generateStaticParams = async () => {
2424
{ edition: "2022" },
2525
{ edition: "2023" },
2626
{ edition: "2024" },
27+
{ edition: "2025" },
2728
];
2829
};
2930

0 commit comments

Comments
 (0)