diff --git a/public/img/nebula-thumbnail.png b/public/img/nebula-thumbnail.png deleted file mode 100644 index 107c40f..0000000 Binary files a/public/img/nebula-thumbnail.png and /dev/null differ diff --git a/public/img/nebula-thumbnail.webp b/public/img/nebula-thumbnail.webp new file mode 100644 index 0000000..b4992ed Binary files /dev/null and b/public/img/nebula-thumbnail.webp differ diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2a2c907..20de41d 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -12,7 +12,10 @@ const raleway = Raleway({ subsets: ['latin'], variable: '--font-raleway' }); const recharge = localFont({ src: '../../public/recharge.otf', variable: '--font-recharge' }); export const metadata: Metadata = { - title: 'Simonyi Konferencia - 2024. 03. 19.', + title: { + default: 'Simonyi Konferencia - 2024. 03. 19.', + template: 'Simonyi Konferencia - %s', + }, description: 'Magyarország legnagyobb egyetemi hallgatók által szervezett éves technológiai konferenciája.', keywords: 'Simonyi Konferencia 2024, technológiai konferencia, egyetemi rendezvény, hallgatók, hallgatók szervezése, Simonyi Károly Szakkollégium, BME-VIK, innováció, digitalizáció, műszaki fejlesztések, tudományos esemény, inspiráló előadások, szakmai workshopok, Magyarország eseményei, fiatal tehetségek, digitális megoldások, jövő technológiái, iparági trendek, tudásátadás, innovatív gondolkodás, egyetemi közösség, kreatív technológia, networking lehetőségek, szakmai előadók, technológiai innovációk, informatikai fejlődés, egyetemi tapasztalatok, mérnöki világ, vezető szakemberek, digitális társadalom, tudományos találkozó', diff --git a/src/app/page.tsx b/src/app/page.tsx index ceb9b08..20cba0d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,6 +3,7 @@ import { redirect } from 'next/navigation'; import { metadata } from '@/app/layout'; import { ImageCarouselSection } from '@/components/image-carousel/image-carousel-section'; +import Presentation from '@/components/presentation/Presentation'; import { SponsorSection } from '@/components/sponsors/sponsor-section'; import CountdownTile from '@/components/tiles/countdown-tile/countdown-tile'; import { GiveawayTile } from '@/components/tiles/giveaway-tile'; @@ -10,7 +11,9 @@ import { NewsletterTile } from '@/components/tiles/newsletter-tile'; import { PromoVideoTile } from '@/components/tiles/promo-video-tile'; import { RegisterTile } from '@/components/tiles/register-tile'; import { StatTile } from '@/components/tiles/stat-tile'; +import { Tile } from '@/components/tiles/tile'; import { getIndexData } from '@/models/get-index-data'; +import { kotlinPresentation, tresoritPresentation } from '@/models/staticPresentationData'; import konfLogo from '../../public/img/konf.svg'; import redPlanet from '../../public/img/red-planet.png'; @@ -25,7 +28,7 @@ export default async function Landing() { <>
-
@@ -44,7 +47,20 @@ export default async function Landing() { + + + + + + {data.promoVideo.youtubeUrl && } + + + + + + + {data.giveaway.pictureUrl && } diff --git a/src/app/presentations/[slug]/page.tsx b/src/app/presentations/[slug]/page.tsx new file mode 100644 index 0000000..e3aa752 --- /dev/null +++ b/src/app/presentations/[slug]/page.tsx @@ -0,0 +1,47 @@ +import { Metadata, ResolvingMetadata } from 'next'; +import { notFound } from 'next/navigation'; + +import Presentation from '@/components/presentation/Presentation'; +import { getIndexData } from '@/models/get-index-data'; +import slugify from '@/utils/slugify'; + +export async function generateStaticParams() { + const data = await getIndexData(); + + return ( + data?.presentations?.map((p) => ({ + slug: slugify(p.title), + })) ?? [] + ); +} + +type Props = { + params: { slug: string }; +}; + +export async function generateMetadata({ params: { slug } }: Props, parent: ResolvingMetadata): Promise { + const data = await getIndexData(); + const presentation = data?.presentations.find((p) => slugify(p.title) === slug); + + return { + title: presentation?.title, + description: `${presentation?.presenter.name} "${presentation?.title}" című előadása a XXI. Simonyi Konferencián`, + keywords: `${(await parent).keywords}, ${presentation?.presenter.name}${presentation?.title + .split(' ') + .reduce((prev, curr) => `${prev}, ${curr}`, '')}`, + }; +} + +const getPresentationBySlug = async (slug: string) => { + const data = await getIndexData(); + return data?.presentations.find((p) => slugify(p.title) === slug); +}; + +export default async function PresentationBySlug({ params }: { params: { slug: string } }) { + const presentation = await getPresentationBySlug(params.slug); + if (!presentation) { + notFound(); + } + + return ; +} diff --git a/src/app/presentations/page.tsx b/src/app/presentations/page.tsx new file mode 100644 index 0000000..db6ffad --- /dev/null +++ b/src/app/presentations/page.tsx @@ -0,0 +1,63 @@ +import clsx from 'clsx'; +import { Metadata } from 'next'; +import Link from 'next/link'; +import { notFound } from 'next/navigation'; + +import { Tile } from '@/components/tiles/tile'; +import { getIndexData } from '@/models/get-index-data'; +import slugify from '@/utils/slugify'; + +export const metadata: Metadata = { + title: 'Előadások', + description: + 'Az előadások listája a XXI. Simonyi Konferencián, Magyarország legnagyobb egyetemi hallgatók által szervezett éves technológiai konferenciáján.', +}; + +export default async function Presentations() { + const data = await getIndexData(); + if (!data || !data.presentations) { + notFound(); + } + const presentations = data.presentations.sort((p1, p2) => p1.presenter.name.localeCompare(p2.presenter.name)); + + return ( +
+

Előadások

+ +
+ {presentations.map((presentation) => ( + + +
+ +
+ Presentation Image +
+ {presentation.presenter.name.split(',').map((pName) => ( +

+ {pName} +

+ ))} +
+
+
1 && 'mt-6' + )} + > +

{presentation.title}

+
+ +
+
+
+ ))} +
+
+ ); +} diff --git a/src/components/footer/footer.tsx b/src/components/footer/footer.tsx index e864f84..df2a4d2 100644 --- a/src/components/footer/footer.tsx +++ b/src/components/footer/footer.tsx @@ -6,7 +6,7 @@ import { SocialButtons } from './social-buttons'; export function Footer() { return ( -