From 4593917e7a3d4b6976abd223981ba3c39c85f4dd Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 7 May 2026 00:19:36 +0000 Subject: [PATCH] Fix standings page team icons to use selected team avatar The full standings page was not passing avatar data (logoUrl, flagConfig, avatarType, ownerAvatarData) to StandingsPreview entries, so all teams showed the default initials fallback instead of their chosen avatar. Fetches the avatar columns from the teams table in the loader, resolves owner avatar data for teams using the owner avatar type, and threads all avatar fields through formattedStandings into previewEntries. https://claude.ai/code/session_01CVt5Vo2PDGY4G3wSWbsmRG --- .../leagues/$leagueId.standings.$seasonId.tsx | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/app/routes/leagues/$leagueId.standings.$seasonId.tsx b/app/routes/leagues/$leagueId.standings.$seasonId.tsx index c21bede..00e345a 100644 --- a/app/routes/leagues/$leagueId.standings.$seasonId.tsx +++ b/app/routes/leagues/$leagueId.standings.$seasonId.tsx @@ -10,6 +10,7 @@ import { isSeasonComplete, getSeasonCompletionPercentage } from "~/lib/season-he import { getRecentTeamScoreEvents } from "~/models/team-score-events"; import { PointProgressionChart } from "~/components/standings/PointProgressionChart"; import { findUsersByIds, getUserDisplayName } from "~/models/user"; +import { resolveUserAvatarData } from "~/lib/avatar-data"; import { StandingsPreview } from "~/components/league/StandingsPreview"; import { buildTiedRankChecker, getDisplayRank } from "~/lib/standings-display"; import { RecentScoresCard } from "~/components/standings/RecentScoresCard"; @@ -59,7 +60,7 @@ export async function loader(args: Route.LoaderArgs) { getSevenDayStandingsChange(seasonId, db), db.query.teams.findMany({ where: eq(schema.teams.seasonId, seasonId), - columns: { id: true, ownerId: true }, + columns: { id: true, ownerId: true, logoUrl: true, flagConfig: true, avatarType: true }, }), getSeasonPointProgression(seasonId, db), isSeasonComplete(seasonId, db), @@ -80,12 +81,23 @@ export async function loader(args: Route.LoaderArgs) { }) ); + const ownerAvatarDataByUserId = new Map(userRows.map((u) => [u.id, resolveUserAvatarData(u)])); + const teamById = new Map(teams.map((t) => [t.id, t])); + // Map to format expected by component (use sevenDayRankChange instead of previousRank) - const formattedStandings = standingsWithComparison.map((standing) => ({ - ...standing, - rankChange: standing.sevenDayRankChange, - ownerName: ownerNameByTeamId.get(standing.teamId) ?? null, - })); + const formattedStandings = standingsWithComparison.map((standing) => { + const team = teamById.get(standing.teamId); + const ownerAvatarData = team?.ownerId ? (ownerAvatarDataByUserId.get(team.ownerId) ?? null) : null; + return { + ...standing, + rankChange: standing.sevenDayRankChange, + ownerName: ownerNameByTeamId.get(standing.teamId) ?? null, + logoUrl: team?.logoUrl ?? null, + flagConfig: team?.flagConfig ?? null, + avatarType: team?.avatarType ?? null, + ownerAvatarData, + }; + }); // Enrich recentScoreEvents with owner names const enrichedScoreEvents = recentScoreEvents.map((event) => ({ @@ -119,6 +131,10 @@ export default function LeagueStandings() { teamId: s.teamId, teamName: s.teamName, ownerName: s.ownerName, + logoUrl: s.logoUrl, + flagConfig: s.flagConfig, + avatarType: s.avatarType, + ownerAvatarData: s.ownerAvatarData, displayRank: getDisplayRank(s, standings.length, isTied(s.currentRank)), currentRank: s.currentRank, points: s.totalPoints,