mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-08-23 19:46:28 -05:00
Seasons: Show current SP, not today's peak
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user