sendou.ink/app/features/team/loaders/t.server.ts
Kalle fd48bced91
Migrate Prettier/Eslint/Stylelint setup to Biome (#1772)
* Initial

* CSS lint

* Test CI

* Add 1v1, 2v2, and 3v3 Tags (#1771)

* Initial

* CSS lint

* Test CI

* Rename step

---------

Co-authored-by: xi <104683822+ximk@users.noreply.github.com>
2024-06-24 13:07:17 +03:00

66 lines
1.7 KiB
TypeScript

import type { LoaderFunctionArgs } from "@remix-run/node";
import type { UserWithPlusTier } from "~/db/types";
import { getUserId } from "~/features/auth/core/user.server";
import { i18next } from "~/modules/i18n/i18next.server";
import { sumArray } from "~/utils/number";
import { makeTitle } from "~/utils/strings";
import { allTeams } from "../queries/allTeams.server";
export const loader = async ({ request }: LoaderFunctionArgs) => {
const user = await getUserId(request);
const t = await i18next.getFixedT(request);
const teams = allTeams().sort((teamA, teamB) => {
// show own team first always
if (user && teamA.members.some((m) => m.id === user.id)) {
return -1;
}
if (user && teamB.members.some((m) => m.id === user.id)) {
return 1;
}
// then full teams
if (teamA.members.length >= 4 && teamB.members.length < 4) {
return -1;
}
if (teamA.members.length < 4 && teamB.members.length >= 4) {
return 1;
}
const teamAPlusTierRating = membersToCommonPlusTierRating(teamA.members);
const teamBPlusTierRating = membersToCommonPlusTierRating(teamB.members);
// and as tiebreaker teams with a higher plus server tier member first (4 best considered)
if (teamAPlusTierRating > teamBPlusTierRating) {
return 1;
}
if (teamAPlusTierRating < teamBPlusTierRating) {
return -1;
}
return 0;
});
return {
title: makeTitle(t("pages.t")),
teams,
isMemberOfTeam: !user
? false
: teams.some((t) => t.members.some((m) => m.id === user.id)),
};
};
const membersToCommonPlusTierRating = (
members: Pick<UserWithPlusTier, "plusTier">[],
) => {
return sumArray(
members
.map((m) => m.plusTier ?? 100)
.sort((a, b) => a - b)
.slice(0, 4),
);
};