Seasons: Show current SP, not today's peak

This commit is contained in:
Kalle
2023-08-19 12:03:14 +03:00
parent 66e2a8e844
commit 1638e8f3cb
2 changed files with 42 additions and 12 deletions

View File

@@ -1,7 +1,7 @@
import { sql } from "~/db/sql";
import { MATCHES_COUNT_NEEDED_FOR_LEADERBOARD } from "~/features/leaderboards/leaderboards-constants";
const stm = sql.prepare(/* sql */ `
const groupedSkillsStm = sql.prepare(/* sql */ `
select
max("Skill"."ordinal") as "ordinal",
date(
@@ -23,6 +23,22 @@ const stm = sql.prepare(/* sql */ `
order by "date" asc
`);
const mostRecentStm = sql.prepare(/* sql */ `
select
"Skill"."ordinal"
from
"Skill"
where
"Skill"."id" = (
select max("id")
from "Skill"
where "userId" = @userId
and "season" = @season
and "matchesCount" >= ${MATCHES_COUNT_NEEDED_FOR_LEADERBOARD}
group by "userId"
)
`);
export function seasonAllMMRByUserId({
userId,
season,
@@ -30,9 +46,22 @@ export function seasonAllMMRByUserId({
userId: number;
season: number;
}) {
return stm.all({ userId, season }) as Array<{
return groupedSkillsStm.all({ userId, season }) as Array<{
ordinal: number;
date: string;
isMostRecent: number;
}>;
}
export function currentMMRByUserId({
userId,
season,
}: {
userId: number;
season: number;
}) {
return (
mostRecentStm.get({ userId, season }) as {
ordinal: number;
} | null
)?.ordinal;
}

View File

@@ -14,7 +14,10 @@ import {
} from "~/components/Image";
import { db } from "~/db";
import { ordinalToSp } from "~/features/mmr";
import { seasonAllMMRByUserId } from "~/features/mmr/queries/seasonAllMMRByUserId.server";
import {
currentMMRByUserId,
seasonAllMMRByUserId,
} from "~/features/mmr/queries/seasonAllMMRByUserId.server";
import { currentSeason, seasonObject } from "~/features/mmr/season";
import { userSkills } from "~/features/mmr/tiered.server";
import { useIsMounted } from "~/hooks/useIsMounted";
@@ -68,6 +71,7 @@ export const loader = async ({ params, request }: LoaderArgs) => {
};
return {
currentOrdinal: currentMMRByUserId({ season: 0, userId: user.id }),
skills: seasonAllMMRByUserId({ season: 0, userId: user.id }),
tier,
matches: {
@@ -114,9 +118,9 @@ export default function UserSeasonsPage() {
return (
<div className="stack lg half-width">
<SeasonHeader />
{data.skills.length > 0 ? (
{data.currentOrdinal ? (
<div className="stack md">
<Rank />
<Rank currentOrdinal={data.currentOrdinal} />
{data.skills.length >= 3 ? <PowerChart /> : null}
</div>
) : null}
@@ -199,13 +203,12 @@ function SeasonHeader() {
);
}
function Rank() {
function Rank({ currentOrdinal }: { currentOrdinal: number }) {
const data = useLoaderData<typeof loader>();
const maxOrdinal = Math.max(...data.skills.map((s) => s.ordinal));
const peakAndCurrentSame =
data.skills[data.skills.length - 1].ordinal === maxOrdinal;
const peakAndCurrentSame = currentOrdinal === maxOrdinal;
return (
<div className="stack horizontal items-center justify-center sm">
@@ -215,9 +218,7 @@ function Rank() {
{data.tier.name}
{data.tier.isPlus ? "+" : ""}
</div>
<div className="text-lg font-bold">
{ordinalToSp(data.skills[data.skills.length - 1].ordinal)}SP
</div>
<div className="text-lg font-bold">{ordinalToSp(currentOrdinal)}SP</div>
{!peakAndCurrentSame ? (
<div className="text-lighter text-sm">
Peak {ordinalToSp(maxOrdinal)}SP