Refactor + remove fields when adding tournament

This commit is contained in:
Kalle 2024-01-13 11:17:21 +02:00
parent 5d628eaed9
commit 235448527d
13 changed files with 51 additions and 79 deletions

View File

@ -110,7 +110,11 @@ const newCalendarEventActionSchema = z.object({
.min(1)
.max(CALENDAR_EVENT.MAX_AMOUNT_OF_DATES),
),
bracketUrl: z.string().url().max(CALENDAR_EVENT.BRACKET_URL_MAX_LENGTH),
bracketUrl: z
.string()
.url()
.max(CALENDAR_EVENT.BRACKET_URL_MAX_LENGTH)
.default("https://sendou.ink"),
discordInviteCode: z.preprocess(
falsyToNull,
z.string().max(CALENDAR_EVENT.DISCORD_INVITE_CODE_MAX_LENGTH).nullable(),
@ -245,8 +249,12 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
};
export default function CalendarNewEventPage() {
const user = useUser();
const { t } = useTranslation();
const { eventToEdit } = useLoaderData<typeof loader>();
const [isTournament, setIsTournament] = React.useState(
Boolean(eventToEdit?.tournamentId),
);
return (
<Main className="calendar-new__container">
@ -260,12 +268,22 @@ export default function CalendarNewEventPage() {
)}
<NameInput />
<DescriptionTextarea />
<DatesInput />
<BracketUrlInput />
{canEnableTOTools(user) && !eventToEdit && (
<TournamentEnabler
checked={isTournament}
setChecked={setIsTournament}
/>
)}
<DatesInput allowMultiDate={!isTournament} />
{!isTournament ? <BracketUrlInput /> : null}
<DiscordLinkInput />
<TagsAdder />
<BadgesAdder />
<TOToolsAndMapPool />
{isTournament && !eventToEdit ? (
<TournamentMapPickingStyleSelect />
) : null}
{/* TODO: this will be selectable depending on the tournament map picking style in future */}
{!isTournament ? <MapPoolSection /> : null}
<SubmitButton className="mt-4">{t("actions.submit")}</SubmitButton>
</Form>
</Main>
@ -329,7 +347,7 @@ function AddButton({ onAdd, id }: { onAdd: () => void; id?: string }) {
);
}
function DatesInput() {
function DatesInput({ allowMultiDate }: { allowMultiDate?: boolean }) {
const { t } = useTranslation(["common", "calendar"]);
const { eventToEdit } = useLoaderData<typeof loader>();
@ -341,7 +359,7 @@ function DatesInput() {
// React hook that keeps track of child DateInput's dates
// (necessary for determining additional Date's defaultValues)
const [datesInputState, setDatesInputState] = React.useState<
const [_datesInputState, setDatesInputState] = React.useState<
Array<{
key: number;
date: Date | null;
@ -359,6 +377,10 @@ function DatesInput() {
return [{ key: getKey(), date: getDateAtNextFullHour(new Date()) }];
});
const datesInputState = allowMultiDate
? _datesInputState
: _datesInputState.filter((_, i) => i === 0);
const datesCount = datesInputState.length;
const isMounted = useIsMounted();
@ -440,9 +462,8 @@ function DatesInput() {
);
})}
</div>
{datesCount < CALENDAR_EVENT.MAX_AMOUNT_OF_DATES && (
<AddButton onAdd={addDate} />
)}
{datesCount < CALENDAR_EVENT.MAX_AMOUNT_OF_DATES &&
allowMultiDate && <AddButton onAdd={addDate} />}
<FormMessage type="info" className={clsx({ invisible: !isMounted })}>
{t("calendar:inYourTimeZone")} {usersTimeZone}
</FormMessage>
@ -452,7 +473,6 @@ function DatesInput() {
);
}
// TODO: when full tournament this doesn't really make sense
function BracketUrlInput() {
const { t } = useTranslation("calendar");
const { eventToEdit } = useLoaderData<typeof loader>();
@ -621,62 +641,49 @@ const mapPickingStyleToShort: Record<
AUTO_RM: "RM",
AUTO_CB: "CB",
};
function TOToolsAndMapPool() {
const user = useUser();
function TournamentMapPickingStyleSelect() {
const id = React.useId();
const { eventToEdit } = useLoaderData<typeof loader>();
const [checked, setChecked] = React.useState(
Boolean(eventToEdit?.tournamentId),
);
const [mode, setMode] = React.useState<"ALL" | RankedModeShort>(
eventToEdit?.mapPickingStyle
? mapPickingStyleToShort[eventToEdit.mapPickingStyle]
: "ALL",
);
// currently not possible to edit "tournament" data after submitting it
if (eventToEdit?.tournamentId) return null;
return (
<>
{canEnableTOTools(user) && !eventToEdit && (
<TOToolsEnabler checked={checked} setChecked={setChecked} />
)}
{checked ? (
<>
<select
className="calendar-new__select"
onChange={(e) => setMode(e.target.value as RankedModeShort)}
name="toToolsMode"
defaultValue={mode}
>
<option value="ALL">All modes</option>
<option value="SZ">SZ only</option>
<option value="TC">TC only</option>
<option value="RM">RM only</option>
<option value="CB">CB only</option>
</select>
{mode === "ALL" ? <CounterPickMapPoolSection /> : null}
</>
) : (
<MapPoolSection />
)}
<div>
<label htmlFor={id}>Map picking style</label>
<select
onChange={(e) => setMode(e.target.value as RankedModeShort)}
name="toToolsMode"
defaultValue={mode}
id={id}
>
<option value="ALL">Prepicked by teams - All modes</option>
<option value="SZ">Prepicked by teams - SZ only</option>
<option value="TC">Prepicked by teams - TC only</option>
<option value="RM">Prepicked by teams - RM only</option>
<option value="CB">Prepicked by teams - CB only</option>
</select>
</div>
{mode === "ALL" ? <CounterPickMapPoolSection /> : null}
</>
);
}
function TOToolsEnabler({
function TournamentEnabler({
checked,
setChecked,
}: {
checked: boolean;
setChecked: (checked: boolean) => void;
}) {
const { t } = useTranslation(["calendar"]);
const id = React.useId();
return (
<div>
<label htmlFor={id}>{t("calendar:forms.toTools.header")}</label>
<label htmlFor={id}>Host on sendou.ink</label>
<Toggle
name="toToolsEnabled"
id={id}
@ -685,7 +692,7 @@ function TOToolsEnabler({
setChecked={setChecked}
/>
<FormMessage type="info">
{t("calendar:forms.toTools.explanation")}
Host the full event including bracket and sign ups on sendou.ink
</FormMessage>
</div>
);

View File

@ -47,9 +47,6 @@
"forms.errors.duplicatePlayer": "Man kan ikke have den samme spiller på samme hold 2 gange.",
"forms.errors.emptyTeam": "Alle hold skal have mindst en spiller.",
"forms.toTools.header": "Aktiver TO-redskaber",
"forms.toTools.explanation": "Ved brug af TO-redskaberne vil din turnering bruge en forudbestemt baneliste og seedningsværktøjet vil være til rådighed.",
"week.this": "Denne Uge",
"week.next": "Næste Uge",
"week.last": "Sidste Uge",

View File

@ -40,9 +40,6 @@
"forms.errors.duplicatePlayer": "Ein Spieler kann nicht doppelt in einem Team sein.",
"forms.errors.emptyTeam": "Jedes Team brauch mindestens einen gelisteten Spieler.",
"forms.toTools.header": "TO-Tools aktivieren",
"forms.toTools.explanation": "Mit TO-Tools verwendet dein Turnier vorausgewählte Arenen und das Seed-Creator-Tool ist verfügbar.",
"week.this": "Diese Woche",
"week.next": "Nächste Woche",
"week.last": "Letzte Woche",

View File

@ -47,9 +47,6 @@
"forms.errors.duplicatePlayer": "Can't have the same player twice in the same team.",
"forms.errors.emptyTeam": "Each team must have at least one player.",
"forms.toTools.header": "Enable TO Tools",
"forms.toTools.explanation": "With TO Tools your tournament will use prepicked maps and the seed creator tool is available.",
"week.this": "This Week",
"week.next": "Next Week",
"week.last": "Last Week",

View File

@ -47,9 +47,6 @@
"forms.errors.duplicatePlayer": "Impossible d'avoir le même joueur plusieurs fois dans la même équipe.",
"forms.errors.emptyTeam": "Chaque équipe doit au moins avoir un joueur.",
"forms.toTools.header": "Activer les outils de TO",
"forms.toTools.explanation": "En activant les outils de TO, votre tournoi aura accès à des stages présélectionnés et l'outil de création de seed sera disponible",
"week.this": "Cette Sem.",
"week.next": "Sem. Suiv.",
"week.last": "Sem. Préc.",

View File

@ -47,9 +47,6 @@
"forms.errors.duplicatePlayer": "לא יכול להיות אותו שחקן פעמיים באותה קבוצה.",
"forms.errors.emptyTeam": "בכל קבוצה חייב להיות שחקן אחד לפחות.",
"forms.toTools.header": "אפשר כלים של TO",
"forms.toTools.explanation": "עם כלים של TO, הטורניר שלך ישתמש במפות שנבחרו מראש והכלי ליצירת סיד זמין.",
"week.this": "השבוע",
"week.next": "שבוע הבא",
"week.last": "שבוע שעבר",

View File

@ -35,8 +35,6 @@
"forms.errors.uniqueTeamName": "Tutte le squadre devono avere un nome unico.",
"forms.errors.duplicatePlayer": "Non puoi avere lo stesso giocatore due volte nella stessa squadra.",
"forms.errors.emptyTeam": "Tutte le squadre devono avere almeno un giocatore.",
"forms.toTools.header": "Abilita TO Tools",
"forms.toTools.explanation": "Con i TO Tools, il tuo torneo utilizzerà scenari preselezionati e il creatore di seme è disponibile.",
"week.this": "Questa Settimana",
"week.next": "Prossima Settimana",
"week.last": "Settimana Scorsa",

View File

@ -47,9 +47,6 @@
"forms.errors.duplicatePlayer": "ひとつのチームに同一の名前のプレイヤーは設定できません。",
"forms.errors.emptyTeam": "それぞれのチームには最低1プレイヤーが必要です。",
"forms.toTools.header": "トーナメントツールを有効にする",
"forms.toTools.explanation": "トーナメントツールを使うことで、作成したトーナメントは事前に選択されたマップが使用されます。また、シードクリエイターも使用できます。",
"week.this": "今週",
"week.next": "次週",
"week.last": "先週",

View File

@ -40,9 +40,6 @@
"forms.errors.duplicatePlayer": "Je kunt niet een speler twee keer in hetzelfde team neerzetten.",
"forms.errors.emptyTeam": "Elk team moet tenminste één speler hebben",
"forms.toTools.header": "Activeer TO gereedschappen",
"forms.toTools.explanation": "Met TO-gereedschappen zal je toernooi voorbestemde levels gebruiken en de plaatsen-gereedschap zal beschikbaar zijn.",
"week.this": "Deze week",
"week.next": "Volgende week",
"week.last": "Vorige week",

View File

@ -40,9 +40,6 @@
"forms.errors.duplicatePlayer": "Nie można mieć takiej samej nazwy członka dwa razy w jednej drużynie.",
"forms.errors.emptyTeam": "Każda drużyna musi mieć przynajmniej jednego członka.",
"forms.toTools.header": "Włącz narzędzia organizatora",
"forms.toTools.explanation": "Z narzędziami organizatora twój turniej użyje automatycznie wybrane mapy i Seed-Creator-Tool jest dostępny.",
"week.this": "W tym tygodniu",
"week.next": "W następnym tygodniu",
"week.last": "W poprzednim tygodniu",

View File

@ -47,9 +47,6 @@
"forms.errors.duplicatePlayer": "Não é possível ter o mesmo jogador duas vezes no mesmo time.",
"forms.errors.emptyTeam": "Cada time deve ter pelo menos um jogador.",
"forms.toTools.header": "Habilitar ferramentas de OT (Organizador de Torneios)",
"forms.toTools.explanation": "Com Ferramentas de OT seu torneio irá usar mapas pré-escolhidos e a ferramenta de criação de semente (seed) está disponível.",
"week.this": "Essa semana",
"week.next": "Próxima semana",
"week.last": "Semana anterior",

View File

@ -47,9 +47,6 @@
"forms.errors.duplicatePlayer": "Нельзя иметь одного и того же участника дважды в одной команде.",
"forms.errors.emptyTeam": "Каждая команда должна иметь как минимум одного игрока.",
"forms.toTools.header": "Включить ТО инструменты",
"forms.toTools.explanation": "С TO инструментами ваш турнир будет использовать предустановленные карты и будет доступен инструмент для сидинга.",
"week.this": "Эта неделя",
"week.next": "Следующая неделя",
"week.last": "Прошлая неделя",

View File

@ -47,9 +47,6 @@
"forms.errors.duplicatePlayer": "同一队伍内选手不得重复。",
"forms.errors.emptyTeam": "每队至少要有一名选手。",
"forms.toTools.header": "启用比赛主办工具",
"forms.toTools.explanation": "启用比赛主办工具后,您的比赛便可以使用参加者赛前选择的地图并设定种子了。",
"week.this": "本周",
"week.next": "下周",
"week.last": "上周",