From beaf7bb2e41adf1ead72c7c254324420ce2d79c6 Mon Sep 17 00:00:00 2001
From: Kalle <38327916+Sendouc@users.noreply.github.com>
Date: Tue, 19 May 2026 22:04:35 +0300
Subject: [PATCH] Fix can rejoin SQ via vote in off-season
Closes #3079
---
.../sendouq-match/actions/q.match.$id.server.ts | 2 ++
.../sendouq-match/components/RejoinSections.tsx | 9 +++++++++
.../components/SendouQMatchActionTab.tsx | 12 +++++++++---
.../sendouq-match/loaders/q.match.$id.server.ts | 2 ++
locales/da/q.json | 1 +
locales/de/q.json | 1 +
locales/en/q.json | 1 +
locales/es-ES/q.json | 1 +
locales/es-US/q.json | 1 +
locales/fr-CA/q.json | 1 +
locales/fr-EU/q.json | 1 +
locales/he/q.json | 1 +
locales/it/q.json | 1 +
locales/ja/q.json | 1 +
locales/ko/q.json | 1 +
locales/nl/q.json | 1 +
locales/pl/q.json | 1 +
locales/pt-BR/q.json | 1 +
locales/ru/q.json | 1 +
locales/zh/q.json | 1 +
20 files changed, 38 insertions(+), 3 deletions(-)
diff --git a/app/features/sendouq-match/actions/q.match.$id.server.ts b/app/features/sendouq-match/actions/q.match.$id.server.ts
index 1af5e95f1..46c2cc85f 100644
--- a/app/features/sendouq-match/actions/q.match.$id.server.ts
+++ b/app/features/sendouq-match/actions/q.match.$id.server.ts
@@ -162,6 +162,8 @@ export const action = async ({ request, params }: ActionFunctionArgs) => {
break;
}
case "CAST_CONTINUE_VOTE": {
+ errorToastIfFalsy(Seasons.current(), "Season is not active");
+
const viewerSide = SendouQMatch.resolveGroupMemberOf({
groupAlpha: match.groupAlpha,
groupBravo: match.groupBravo,
diff --git a/app/features/sendouq-match/components/RejoinSections.tsx b/app/features/sendouq-match/components/RejoinSections.tsx
index 7c664cc0b..bbc2f05da 100644
--- a/app/features/sendouq-match/components/RejoinSections.tsx
+++ b/app/features/sendouq-match/components/RejoinSections.tsx
@@ -106,3 +106,12 @@ function DeclinedSection() {
);
}
+
+export function OffSeasonRejoinSection() {
+ const { t } = useTranslation(["q"]);
+ return (
+
+ {t("q:match.rematch.offSeason")}
+
+ );
+}
diff --git a/app/features/sendouq-match/components/SendouQMatchActionTab.tsx b/app/features/sendouq-match/components/SendouQMatchActionTab.tsx
index 24bce62bc..f50e19354 100644
--- a/app/features/sendouq-match/components/SendouQMatchActionTab.tsx
+++ b/app/features/sendouq-match/components/SendouQMatchActionTab.tsx
@@ -19,7 +19,11 @@ import {
} from "../core/match-timeline";
import * as SendouQMatch from "../core/SendouQMatch";
import type { SendouQMatchLoaderData } from "../loaders/q.match.$id.server";
-import { MatchmadeRejoinSection, TrustedRejoinSection } from "./RejoinSections";
+import {
+ MatchmadeRejoinSection,
+ OffSeasonRejoinSection,
+ TrustedRejoinSection,
+} from "./RejoinSections";
import styles from "./SendouQMatchActionTab.module.css";
export function SendouQMatchActionTab({
@@ -222,7 +226,8 @@ function RequeueTab({
) : (
- {viewerGroup.matchmade ? (
+ {data.isOffSeason ? : null}
+ {!data.isOffSeason && viewerGroup.matchmade ? (
) : null}
- {!viewerGroup.matchmade &&
+ {!data.isOffSeason &&
+ !viewerGroup.matchmade &&
(!awaitingConfirmation || isOnReporterTeam) ? (
{
roomLinks,
anyUserPrefersNoSplatnet,
reportedWeapons,
+ isOffSeason: Seasons.current() === null,
chatCode: (() => {
const isStaff = user?.roles.includes("STAFF") ?? false;
const isParticipant = user && matchUsers.includes(user.id);
diff --git a/locales/da/q.json b/locales/da/q.json
index d751dcf8c..09c57a825 100644
--- a/locales/da/q.json
+++ b/locales/da/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/de/q.json b/locales/de/q.json
index 1728323c7..75631dd93 100644
--- a/locales/de/q.json
+++ b/locales/de/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/en/q.json b/locales/en/q.json
index 2d222e191..96682db6a 100644
--- a/locales/en/q.json
+++ b/locales/en/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "Waiting for the captain to choose whether to re-queue",
"match.rematch.rejoinQueue": "Rejoin queue",
"match.rematch.backToQueue": "Back to queue",
+ "match.rematch.offSeason": "Season has ended. The queue will reopen when the next season starts.",
"match.banner.final": "Final",
"match.banner.bestOf": "Best of {{count}}",
"match.banner.playAll": "Play all {{count}}",
diff --git a/locales/es-ES/q.json b/locales/es-ES/q.json
index 64048b510..25e4b178c 100644
--- a/locales/es-ES/q.json
+++ b/locales/es-ES/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/es-US/q.json b/locales/es-US/q.json
index 1f9b722f7..d7a98cfd9 100644
--- a/locales/es-US/q.json
+++ b/locales/es-US/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/fr-CA/q.json b/locales/fr-CA/q.json
index 96ab0754c..440d316ba 100644
--- a/locales/fr-CA/q.json
+++ b/locales/fr-CA/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/fr-EU/q.json b/locales/fr-EU/q.json
index a8687553a..7dcfdc846 100644
--- a/locales/fr-EU/q.json
+++ b/locales/fr-EU/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/he/q.json b/locales/he/q.json
index 792e4abdf..3faca72b3 100644
--- a/locales/he/q.json
+++ b/locales/he/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/it/q.json b/locales/it/q.json
index 17fe9aabe..501946cb4 100644
--- a/locales/it/q.json
+++ b/locales/it/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/ja/q.json b/locales/ja/q.json
index cab48fd67..ef6fcd2be 100644
--- a/locales/ja/q.json
+++ b/locales/ja/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/ko/q.json b/locales/ko/q.json
index 1728323c7..75631dd93 100644
--- a/locales/ko/q.json
+++ b/locales/ko/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/nl/q.json b/locales/nl/q.json
index 1728323c7..75631dd93 100644
--- a/locales/nl/q.json
+++ b/locales/nl/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/pl/q.json b/locales/pl/q.json
index 1728323c7..75631dd93 100644
--- a/locales/pl/q.json
+++ b/locales/pl/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/pt-BR/q.json b/locales/pt-BR/q.json
index 6e6ec0ffc..cbea4df20 100644
--- a/locales/pt-BR/q.json
+++ b/locales/pt-BR/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/ru/q.json b/locales/ru/q.json
index 98205424b..7bfc27c49 100644
--- a/locales/ru/q.json
+++ b/locales/ru/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",
diff --git a/locales/zh/q.json b/locales/zh/q.json
index afbe00b40..5e66fff87 100644
--- a/locales/zh/q.json
+++ b/locales/zh/q.json
@@ -219,6 +219,7 @@
"match.rematch.waitingCaptain": "",
"match.rematch.rejoinQueue": "",
"match.rematch.backToQueue": "",
+ "match.rematch.offSeason": "",
"match.banner.final": "",
"match.banner.bestOf": "",
"match.banner.playAll": "",