From 8e848fc3e705a31da9fc2a93d09609b7829b7818 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sat, 5 Mar 2022 10:00:41 +0200 Subject: [PATCH] Refactor to use resolveRedirect function --- app/core/play/utils.ts | 41 +++++++++++++++++++++++++++++++++ app/routes/play/add-players.tsx | 13 ++++++----- app/routes/play/index.tsx | 16 ++++++------- app/routes/play/looking.tsx | 12 ++++++---- app/utils/urls.ts | 3 +++ 5 files changed, 66 insertions(+), 19 deletions(-) diff --git a/app/core/play/utils.ts b/app/core/play/utils.ts index d3a3c1e9e..825d6c63c 100644 --- a/app/core/play/utils.ts +++ b/app/core/play/utils.ts @@ -1,3 +1,5 @@ +import { LfgGroupStatus } from "@prisma/client"; +import { redirect } from "remix"; import invariant from "tiny-invariant"; import { BIT_HIGHER_MMR_LIMIT, @@ -13,6 +15,12 @@ import { LookingLoaderDataGroup, } from "~/routes/play/looking"; import { Unpacked } from "~/utils"; +import { + sendouQAddPlayersPage, + sendouQFrontPage, + sendouQLookingPage, + sendouQMatchPage, +} from "~/utils/urls"; import { skillArrayToMMR, teamSkillToExactMMR } from "../mmr/utils"; import { canUniteWithGroup } from "./validators"; @@ -300,3 +308,36 @@ export function calculateDifference({ throw new Error("Unexpected calculateMMRRelation scenario"); } + +export function resolveRedirect({ + currentStatus = "INACTIVE", + currentPage, + matchId, +}: { + currentStatus: LfgGroupStatus; + currentPage: LfgGroupStatus; + matchId: string | null; +}) { + if (currentStatus === currentPage) return; + switch (currentStatus) { + case "INACTIVE": { + return redirect(sendouQFrontPage()); + } + case "LOOKING": { + return redirect(sendouQLookingPage()); + } + case "MATCH": { + invariant(matchId, "Unexpected no match id for redirect"); + return redirect(sendouQMatchPage(matchId)); + } + case "PRE_ADD": { + return redirect(sendouQAddPlayersPage()); + } + default: { + const exhaustive: never = currentStatus; + throw new Response(`Unknown status: ${JSON.stringify(exhaustive)}`, { + status: 500, + }); + } + } +} diff --git a/app/routes/play/add-players.tsx b/app/routes/play/add-players.tsx index 53a651b78..151e493d2 100644 --- a/app/routes/play/add-players.tsx +++ b/app/routes/play/add-players.tsx @@ -8,12 +8,12 @@ import { redirect, useLoaderData, } from "remix"; -import invariant from "tiny-invariant"; import { z } from "zod"; import { AddPlayers } from "~/components/AddPlayers"; import { Alert } from "~/components/Alert"; import { Button } from "~/components/Button"; import { GroupCard } from "~/components/play/GroupCard"; +import { resolveRedirect } from "~/core/play/utils"; import { canPreAddToGroup, isGroupAdmin, @@ -134,11 +134,12 @@ export const loader: LoaderFunction = async ({ context }) => { User.findTrusters(user.id), ]); if (!ownGroup) return redirect("/play"); - if (ownGroup.status === "MATCH") { - invariant(ownGroup.matchId, "Unexpected no matchId but status is MATCH"); - return redirect(`/play/match/${ownGroup.matchId}`); - } - if (ownGroup.status === "LOOKING") return redirect("/play/looking"); + const redirectRes = resolveRedirect({ + currentStatus: ownGroup.status, + currentPage: "PRE_ADD", + matchId: ownGroup.matchId, + }); + if (redirectRes) return redirectRes; return json({ inviteCode: ownGroup.inviteCode, diff --git a/app/routes/play/index.tsx b/app/routes/play/index.tsx index 234cfc715..ae13caf79 100644 --- a/app/routes/play/index.tsx +++ b/app/routes/play/index.tsx @@ -25,8 +25,7 @@ import * as LFGGroup from "~/models/LFGGroup.server"; import * as Skill from "~/models/Skill.server"; import { Button } from "~/components/Button"; import { useUser } from "~/hooks/common"; -import { countGroups } from "~/core/play/utils"; -import invariant from "tiny-invariant"; +import { countGroups, resolveRedirect } from "~/core/play/utils"; import { resolveOwnMMR } from "~/core/mmr/utils"; export const links: LinksFunction = () => { @@ -116,13 +115,14 @@ export const loader: LoaderFunction = async ({ context }) => { if (!ownGroup) { return json({ counts: countGroups(groups), ownMMR }); } - if (ownGroup.status === "MATCH") { - invariant(ownGroup.matchId, "Unexpected no matchId but status is MATCH"); - return redirect(`/play/match/${ownGroup.matchId}`); - } - if (ownGroup.status === "LOOKING") return redirect("/play/looking"); + const redirectRes = resolveRedirect({ + currentStatus: ownGroup.status, + currentPage: "INACTIVE", + matchId: ownGroup.matchId, + }); + if (redirectRes) return redirectRes; - return redirect("/play/add-players"); + throw new Error(`Unexpected state - group status: ${ownGroup.status}`); }; export default function PlayPage() { diff --git a/app/routes/play/looking.tsx b/app/routes/play/looking.tsx index 8e0b6f84f..15580d84a 100644 --- a/app/routes/play/looking.tsx +++ b/app/routes/play/looking.tsx @@ -21,6 +21,7 @@ import { addInfoFromOldSendouInk } from "~/core/play/playerInfos/playerInfos.ser import { groupExpirationStatus, otherGroupsForResponse, + resolveRedirect, uniteGroupInfo, } from "~/core/play/utils"; import { canUniteWithGroup, isGroupAdmin } from "~/core/play/validators"; @@ -236,11 +237,12 @@ export const loader: LoaderFunction = async ({ context }) => { ]); if (!ownGroup) return redirect("/play"); - if (ownGroup.status === "MATCH") { - invariant(ownGroup.matchId, "Unexpected no matchId but status is MATCH"); - return redirect(`/play/match/${ownGroup.matchId}`); - } - if (ownGroup.status === "PRE_ADD") return redirect("/play/add-players"); + const redirectRes = resolveRedirect({ + currentStatus: ownGroup.status, + currentPage: "LOOKING", + matchId: ownGroup.matchId, + }); + if (redirectRes) return redirectRes; const lookingForMatch = ownGroup.type === "VERSUS" && diff --git a/app/utils/urls.ts b/app/utils/urls.ts index 8f46f3e49..933694a37 100644 --- a/app/utils/urls.ts +++ b/app/utils/urls.ts @@ -5,6 +5,9 @@ export function oldSendouInkUserProfile({ discordId }: { discordId: string }) { export function sendouQFrontPage() { return "/play"; } +export function sendouQLookingPage() { + return "/play/looking"; +} export function sendouQAddPlayersPage() { return "/play/add-players"; }