mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-04-25 07:32:19 -05:00
Refactor + remove fields when adding tournament
This commit is contained in:
parent
5d628eaed9
commit
235448527d
|
|
@ -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>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -47,9 +47,6 @@
|
|||
"forms.errors.duplicatePlayer": "לא יכול להיות אותו שחקן פעמיים באותה קבוצה.",
|
||||
"forms.errors.emptyTeam": "בכל קבוצה חייב להיות שחקן אחד לפחות.",
|
||||
|
||||
"forms.toTools.header": "אפשר כלים של TO",
|
||||
"forms.toTools.explanation": "עם כלים של TO, הטורניר שלך ישתמש במפות שנבחרו מראש והכלי ליצירת סיד זמין.",
|
||||
|
||||
"week.this": "השבוע",
|
||||
"week.next": "שבוע הבא",
|
||||
"week.last": "שבוע שעבר",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -47,9 +47,6 @@
|
|||
"forms.errors.duplicatePlayer": "ひとつのチームに同一の名前のプレイヤーは設定できません。",
|
||||
"forms.errors.emptyTeam": "それぞれのチームには最低1プレイヤーが必要です。",
|
||||
|
||||
"forms.toTools.header": "トーナメントツールを有効にする",
|
||||
"forms.toTools.explanation": "トーナメントツールを使うことで、作成したトーナメントは事前に選択されたマップが使用されます。また、シードクリエイターも使用できます。",
|
||||
|
||||
"week.this": "今週",
|
||||
"week.next": "次週",
|
||||
"week.last": "先週",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -47,9 +47,6 @@
|
|||
"forms.errors.duplicatePlayer": "Нельзя иметь одного и того же участника дважды в одной команде.",
|
||||
"forms.errors.emptyTeam": "Каждая команда должна иметь как минимум одного игрока.",
|
||||
|
||||
"forms.toTools.header": "Включить ТО инструменты",
|
||||
"forms.toTools.explanation": "С TO инструментами ваш турнир будет использовать предустановленные карты и будет доступен инструмент для сидинга.",
|
||||
|
||||
"week.this": "Эта неделя",
|
||||
"week.next": "Следующая неделя",
|
||||
"week.last": "Прошлая неделя",
|
||||
|
|
|
|||
|
|
@ -47,9 +47,6 @@
|
|||
"forms.errors.duplicatePlayer": "同一队伍内选手不得重复。",
|
||||
"forms.errors.emptyTeam": "每队至少要有一名选手。",
|
||||
|
||||
"forms.toTools.header": "启用比赛主办工具",
|
||||
"forms.toTools.explanation": "启用比赛主办工具后,您的比赛便可以使用参加者赛前选择的地图并设定种子了。",
|
||||
|
||||
"week.this": "本周",
|
||||
"week.next": "下周",
|
||||
"week.last": "上周",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user