add today's event to front page

This commit is contained in:
2025-07-29 17:53:37 +02:00
parent 3db4e7d926
commit 219885b884
6 changed files with 79 additions and 38 deletions

View File

@@ -1,16 +1,10 @@
--- ---
import { translations, type Lang } from '@data/i18n'; import { translations, type Lang } from '@data/i18n';
import ProgramCard from './ProgramCard.astro';
const { lang = 'no', data } = Astro.props as { lang?: Lang, data: any }; const { lang = 'no', data } = Astro.props as { lang?: Lang, data: any };
const t = translations[lang].program; const t = translations[lang].program;
type ProgramItem = {
time: string;
event: string;
price?: string | null;
cost?: string | null;
url?: string;
};
const convertDate = (date: string | Date) => { const convertDate = (date: string | Date) => {
let d = date; let d = date;
if (!(d instanceof Date)) { if (!(d instanceof Date)) {
@@ -30,27 +24,8 @@ const convertDate = (date: string | Date) => {
<p class="font-bold text-2xl text-center w-full">{convertDate(new Date())}</p> <p class="font-bold text-2xl text-center w-full">{convertDate(new Date())}</p>
</div> </div>
<div class="flex gap-12 flex-wrap justify-center items-stretch"> <div class="flex gap-12 flex-wrap justify-center items-stretch">
{Object.entries(data).map(([date, items]) => ( {Object.entries(data).map(([date, items], idx) => (
<div id="program-list" class="w-125 p-6 rounded-2xl even:bg-slottsblaa even:text-white bg-gyllen-beige flex flex-col gap-2"> <ProgramCard date={date} items={items} lang={lang} even={idx % 2 === 1} />
<h2 class="font-bold text-xl">{convertDate(date)}</h2>
<ul>
{(items as ProgramItem[]).map((item) => {
const price = item.price || item.cost;
return (
<li class="flex justify-between">
<p>
{item.time} - {item.event}
</p>
{item.url ? (
<a href={item.url} target="_blank" rel="noopener noreferrer" class="text-right">{price}</a>
) : (
price
)}
</li>
);
})}
</ul>
</div>
))} ))}
</div> </div>
<div class="flex justify-center"> <div class="flex justify-center">
@@ -59,9 +34,5 @@ const convertDate = (date: string | Date) => {
</p> </p>
</div> </div>
) : ( ) : (
<div>No program data available.</div> <div>{t.noProgram}</div>
)} )}
<style>
</style>

View File

@@ -0,0 +1,46 @@
---
import { translations, type Lang } from '@data/i18n';
const { date, items, lang = 'no', even = false } = Astro.props as { date: string | Date, items: ProgramItem[], lang?: Lang, even?: boolean };
const t = translations[lang].program;
type ProgramItem = {
time: string;
event: string;
price?: string | null;
cost?: string | null;
url?: string;
};
const convertDate = (date: string | Date) => {
let d = date;
if (!(d instanceof Date)) {
d = new Date(d);
}
return d.toLocaleDateString(lang === 'en' ? 'en-GB' : 'nb-NO', {
weekday: 'long',
month: 'long',
day: 'numeric'
});
};
---
<div id="program-list" class:list={["w-125 p-6 rounded-2xl flex flex-col gap-2", even ? "bg-slottsblaa text-white" : "bg-gyllen-beige"]}>
<h3 class="font-bold text-xl">{convertDate(date)}</h3>
<ul>
{items.map((item) => {
const price = item.price || item.cost;
return (
<li class="flex justify-between">
<p>
{item.time} - {item.event}
</p>
{item.url ? (
<a href={item.url} target="_blank" rel="noopener noreferrer" class="text-right">{price}</a>
) : (
price
)}
</li>
);
})}
</ul>
</div>

View File

@@ -0,0 +1,22 @@
---
import ProgramCard from './ProgramCard.astro';
import programData from '@data/program.json';
import { translations, type Lang } from '@data/i18n';
const { lang = 'no' } = Astro.props as { lang?: Lang };
const t = translations[lang].program;
const typedProgramData = programData as Record<string, any>;
const todayStr = new Date().toISOString().slice(0, 10);
const items = typedProgramData[todayStr];
---
<section class="flex flex-col gap-6 max-w-prose">
<h2 class="font-bold text-2xl">{t.today}</h2>
{items ? (
<ProgramCard date={todayStr} items={items} lang={lang} />
) : (
<p>{t.noProgram}</p>
)}
</section>

View File

@@ -36,6 +36,7 @@ export const translations = {
program: { program: {
today: "Hva skjer i dag?", today: "Hva skjer i dag?",
programMore: "For arrangementer etter Studio trykk her", programMore: "For arrangementer etter Studio trykk her",
noProgram: "Ingenting på programmet i dag :(",
}, },
vors: { vors: {
text: "Sett på låta for litt stemning før dere kommer 🔥", text: "Sett på låta for litt stemning før dere kommer 🔥",
@@ -83,6 +84,7 @@ export const translations = {
program: { program: {
today: "What's happening today?", today: "What's happening today?",
programMore: "For events after Studio click here", programMore: "For events after Studio click here",
noProgram: "No events today :(",
}, },
vors: { vors: {
text: "Play the song to get in the mood before you arrive 🔥", text: "Play the song to get in the mood before you arrive 🔥",

View File

@@ -1,16 +1,16 @@
--- ---
import Layout from '@layouts/Layout.astro'; import Layout from '@layouts/Layout.astro';
import Program from '@components/Program.astro';
import Links from '@components/Links.astro'; import Links from '@components/Links.astro';
import FAQ from '@components/FAQ.astro'; import FAQ from '@components/FAQ.astro';
import Hero from '@components/Hero.astro'; import Hero from '@components/Hero.astro';
import TodayProgram from '@components/TodayProgram.astro';
import Vors from '@components/Vors.astro'; import Vors from '@components/Vors.astro';
--- ---
<Layout lang="en"> <Layout lang="en">
<Hero lang="en" /> <Hero lang="en" />
<Links lang="en" class="text-5xl text-black" /> <Links lang="en" class="text-5xl text-black" />
<Program lang="en" /> <TodayProgram lang="en" />
<FAQ lang="en" /> <FAQ lang="en" />
<Vors lang="en" /> <Vors lang="en" />
</Layout> </Layout>

View File

@@ -1,16 +1,16 @@
--- ---
import Layout from '@layouts/Layout.astro'; import Layout from '@layouts/Layout.astro';
import Program from '@components/Program.astro';
import Links from '@components/Links.astro'; import Links from '@components/Links.astro';
import FAQ from '@components/FAQ.astro'; import FAQ from '@components/FAQ.astro';
import Hero from '@components/Hero.astro'; import Hero from '@components/Hero.astro';
import TodayProgram from '@components/TodayProgram.astro';
import Vors from '@components/Vors.astro'; import Vors from '@components/Vors.astro';
--- ---
<Layout lang="no"> <Layout lang="no">
<Hero lang="no" /> <Hero lang="no" />
<Links lang="no" class="text-5xl text-black" /> <Links lang="no" class="text-5xl text-black" />
<Program lang="no" /> <TodayProgram lang="no" />
<FAQ lang="no" /> <FAQ lang="no" />
<Vors lang="no" /> <Vors lang="no" />
</Layout> </Layout>