From 3cf9fb60ae303c82bf07e9b35a7825ba549c8296 Mon Sep 17 00:00:00 2001 From: Alacris Date: Sun, 6 Sep 2026 02:46:34 +0300 Subject: [PATCH] add scheduled livestreams and ticket availability --- src/app/[locale]/kodukord/page.tsx | 4 +- src/app/[locale]/page.tsx | 35 +++++++++- src/app/[locale]/piletid/page.tsx | 41 +++++++++-- src/app/[locale]/turniirid/cs2/page.tsx | 7 -- src/app/[locale]/turniirid/lol/page.tsx | 12 ---- src/app/[locale]/turniirid/page.tsx | 1 + src/components/Header.tsx | 4 +- src/components/HeroSection.tsx | 7 +- src/components/Livestreams.tsx | 90 +++++++++++++++++++++++++ src/components/SoldOutOverlay.tsx | 17 +++++ src/components/Sponsors.tsx | 2 +- src/components/SwitchableTicketCard.tsx | 44 ++++++++---- src/components/TeaserCarousel.tsx | 2 + src/lib/loadRules.ts | 33 ++------- translations/en.json | 6 ++ translations/et.json | 6 ++ tsconfig.json | 2 +- 17 files changed, 235 insertions(+), 78 deletions(-) create mode 100644 src/components/Livestreams.tsx create mode 100644 src/components/SoldOutOverlay.tsx diff --git a/src/app/[locale]/kodukord/page.tsx b/src/app/[locale]/kodukord/page.tsx index a1e2456..5397bbf 100644 --- a/src/app/[locale]/kodukord/page.tsx +++ b/src/app/[locale]/kodukord/page.tsx @@ -4,7 +4,7 @@ import { vipnagorgialla } from "@/components/Vipnagorgialla"; import RulesLastChanged from "@/components/RulesLastChanged"; import RuleNav from "@/components/RuleNav"; import { getTranslations, setRequestLocale } from "next-intl/server"; -import { loadRulesBun } from "@/lib/loadRules"; +import { loadRules } from "@/lib/loadRules"; const sectionKeys = [ { id: "reminder", labelKey: "rules.reminder" }, @@ -19,7 +19,7 @@ export default async function Page({ const { locale } = await params; setRequestLocale(locale); const t = await getTranslations({ locale }); - const content = await loadRulesBun("kodukord", locale as "et" | "en"); + const content = await loadRules("kodukord", locale as "et" | "en"); const sections = sectionKeys.map((section) => ({ id: section.id, diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx index cf56c6f..2a0b3e8 100644 --- a/src/app/[locale]/page.tsx +++ b/src/app/[locale]/page.tsx @@ -2,6 +2,7 @@ import { vipnagorgialla } from "@/components/Vipnagorgialla"; import Sponsors from "@/components/Sponsors"; import HeroSection from "@/components/HeroSection"; import TeaserCarousel from "@/components/TeaserCarousel"; +import Livestreams from "@/components/Livestreams"; import { Link } from "@/i18n/routing"; import { getTranslations, setRequestLocale } from "next-intl/server"; @@ -21,8 +22,11 @@ export default async function Home({ - {/* Nav cards: Piletid + Turniirid */} -
+ {/* Livestreams — shown automatically when the event begins */} + + + {/* Nav cards: Piletid + Ajakava + Turniirid */} +
+ +
+ + calendar_month + +
+
+

+ {t("navigation.schedule")} +

+ + arrow_right_alt + +
+ + {backgroundImage && ( @@ -83,14 +98,19 @@ function TicketCard({ ))} - - - + + )}
+ + {soldOut && }
); } @@ -129,6 +149,9 @@ export default async function Tickets({ backgroundImageB="/images/landing/main_supporter.jpg" backgroundOpacityA={30} backgroundOpacityB={40} + soldOutA={ticketSoldOut.visitor} + soldOutB={ticketSoldOut.supporter} + soldOutText={t("tickets.soldOut")} className="border-b-[3px] lg:border-r-[3px]" /> @@ -142,6 +165,8 @@ export default async function Tickets({ buttonHref="https://fienta.com/et/tipilan" backgroundImage="/images/landing/explore_teaser.png" backgroundOpacity={100} + soldOut={ticketSoldOut.lan} + soldOutText={t("tickets.soldOut")} className="border-b-[3px]" /> @@ -154,6 +179,8 @@ export default async function Tickets({ buttonText={t("tickets.buyButton")} buttonHref="https://fienta.com/et/tipilan" backgroundImage="/images/landing/league_ticket.jpg" + soldOut={ticketSoldOut.lol} + soldOutText={t("tickets.soldOut")} className="border-b-[3px] lg:border-b-0 lg:border-r-[3px]" /> @@ -167,6 +194,8 @@ export default async function Tickets({ buttonHref="https://fienta.com/et/tipilan" backgroundImage="/images/landing/compete_teaser.jpg" backgroundOpacity={30} + soldOut={ticketSoldOut.cs2} + soldOutText={t("tickets.soldOut")} className="border-b-0" /> diff --git a/src/app/[locale]/turniirid/cs2/page.tsx b/src/app/[locale]/turniirid/cs2/page.tsx index 4ed6035..d7a7e2b 100644 --- a/src/app/[locale]/turniirid/cs2/page.tsx +++ b/src/app/[locale]/turniirid/cs2/page.tsx @@ -45,13 +45,6 @@ export default async function CS2Tournament({ {/* Buttons */}
- - {t("cs2page.buyTicket")} - - {/* Buttons */} -
- - {t("lolpage.buyTicket")} - -
- {/* SISSEJUHATUS */}

diff --git a/src/components/Header.tsx b/src/components/Header.tsx index d8bfdd3..9e619b4 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -89,8 +89,8 @@ const Header = ({ navItems }: HeaderProps) => { TipiLAN diff --git a/src/components/HeroSection.tsx b/src/components/HeroSection.tsx index b7fe1cf..b0f19af 100644 --- a/src/components/HeroSection.tsx +++ b/src/components/HeroSection.tsx @@ -14,6 +14,7 @@ export default function HeroSection() { src="/images/landing/main_teaser.jpg" alt="" fill + sizes="100vw" className="object-cover object-center" priority /> @@ -56,10 +57,10 @@ export default function HeroSection() {
TalTech student award

{ + let timeoutId: number | undefined; + + const revealWhenReady = () => { + const timeUntilStart = livestreamsStartAt - Date.now(); + + if (timeUntilStart <= 0) { + setTwitchParent(window.location.hostname); + setIsVisible(true); + return; + } + + timeoutId = window.setTimeout( + revealWhenReady, + Math.min(timeUntilStart, maximumTimeout), + ); + }; + + revealWhenReady(); + + return () => { + if (timeoutId !== undefined) { + window.clearTimeout(timeoutId); + } + }; + }, []); + + if (!isVisible || !twitchParent) { + return null; + } + + return ( +

+

+ {t("title")} +

+ +
+ {streams.map((stream) => { + const query = new URLSearchParams({ + channel: stream.channel, + parent: twitchParent, + muted: "true", + }); + + return ( +
+

+ {t(stream.translationKey)} +

+
+