feat(registration): add watcher capacity limits and update pricing

Add 70-person capacity limit for watchers with real-time availability checks.
Update drink card pricing to €5 per person (was €5 base + €2 per guest).
Add feature flag to bypass registration countdown.
Show under-review notice for performer registrations.
Update FAQ performance duration from 5-7 to 5 minutes.
This commit is contained in:
2026-03-14 19:36:16 +01:00
parent 3a2e403ee9
commit 0d99f7c5f5
11 changed files with 162 additions and 39 deletions

View File

@@ -3,3 +3,10 @@
* Change this date to reschedule — all gating logic imports from here.
*/
export const REGISTRATION_OPENS_AT = new Date("2026-03-16T19:00:00+01:00");
/**
* Feature flag for the registration countdown gate.
* Set to `false` to bypass the countdown and always show the registration form.
* Set to `true` to enforce the countdown until REGISTRATION_OPENS_AT.
*/
export const COUNTDOWN_ENABLED = true;

View File

@@ -6,8 +6,9 @@
// ---------------------------------------------------------------------------
export const DRINK_CARD_BASE = 5; // €5 for primary registrant
export const DRINK_CARD_PER_GUEST = 2; // €2 per additional guest
export const DRINK_CARD_PER_GUEST = 5; // €5 per additional guest (same as primary)
export const MAX_GUESTS = 9;
export const MAX_WATCHERS = 70; // max total watcher spots (people, not registrations)
/** Returns drink card value in euros for a given number of extra guests. */
export function calculateDrinkCard(guestCount: number): number {

View File

@@ -1,5 +1,5 @@
import { useEffect, useState } from "react";
import { REGISTRATION_OPENS_AT } from "./opening";
import { COUNTDOWN_ENABLED, REGISTRATION_OPENS_AT } from "./opening";
interface RegistrationOpenState {
isOpen: boolean;
@@ -10,6 +10,9 @@ interface RegistrationOpenState {
}
function compute(): RegistrationOpenState {
if (!COUNTDOWN_ENABLED) {
return { isOpen: true, days: 0, hours: 0, minutes: 0, seconds: 0 };
}
const diff = REGISTRATION_OPENS_AT.getTime() - Date.now();
if (diff <= 0) {
return { isOpen: true, days: 0, hours: 0, minutes: 0, seconds: 0 };