Skip to content

Commit

Permalink
refactor(useTeamValues): Extract function to build team values
Browse files Browse the repository at this point in the history
  • Loading branch information
Baboo7 committed Aug 16, 2023
1 parent fab2129 commit 8c28351
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 128 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { useMemo } from "react";
import { TeamValues, usePersonaByUserId, usePlay } from "../../playContext";
import { mean } from "../../../../../lib/math";
import { buildStepToData } from "./utils";
import { buildTeamValues } from "./utils";

export { useTeamValues };

Expand All @@ -19,66 +18,12 @@ function useTeamValues(): {

const teamValues = useMemo(() => {
return teams.map((team) => {
const playersInTeam = players.filter((p) => p.teamId === team.id);
const playerRepresentingTeam = playersInTeam[0] || null;
const personaRepresentingTeam =
personaByUserId[playerRepresentingTeam?.userId || -1] || null;
const currentPersonaRepresentingTeam =
personaRepresentingTeam?.getPersonaAtStep?.(game.step) || null;

return {
id: team.id,
playerCount: playersInTeam.length,
points: mean(
playersInTeam.map(
({ userId }) => personaByUserId[userId].currentPersona.points
)
),
budget: mean(
playersInTeam.map(
({ userId }) => personaByUserId[userId].currentPersona.budget
)
),
budgetSpent: mean(
playersInTeam
.map(({ userId }) => personaByUserId[userId])
.map(
(persona) =>
persona.getPersonaAtStep(0).budget -
persona.currentPersona.budget
)
),
carbonFootprint: mean(
playersInTeam.map(
({ userId }) =>
personaByUserId[userId].currentPersona.carbonFootprint
)
),
carbonFootprintReduction: mean(
playersInTeam
.map(({ userId }) => personaByUserId[userId])
.map(
(persona) =>
(1 -
persona.currentPersona.carbonFootprint /
persona.getPersonaAtStep(0).carbonFootprint) *
100
)
),
stepToConsumption: buildStepToData(
"consumption",
game,
playersInTeam,
personaByUserId
),
stepToProduction: buildStepToData(
"production",
game,
playersInTeam,
personaByUserId
),
productionCurrent: currentPersonaRepresentingTeam?.production || [],
};
return buildTeamValues({
game,
personaByUserId,
players,
team,
});
});
// TODO: check `personaByUserId` in deps doesn't trigger infinite renders.
}, [game, personaByUserId, players, teams]);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { useMemo } from "react";
import { TeamValues, usePersonaByUserId, usePlay } from "../../playContext";
import { mean } from "../../../../../lib/math";
import { buildStepToData } from "./utils";
import { buildTeamValues } from "./utils";

export { useTeamValuesForTeam };

Expand All @@ -18,65 +17,7 @@ function useTeamValuesForTeam({ teamId }: { teamId?: number }): {

const teamValues = useMemo(() => {
const team = teams.find((t) => t.id === teamId);

const playersInTeam = players.filter((p) => p.teamId === team?.id);
const playerRepresentingTeam = playersInTeam[0] || null;
const personaRepresentingTeam =
personaByUserId[playerRepresentingTeam?.userId || -1] || null;
const currentPersonaRepresentingTeam =
personaRepresentingTeam?.getPersonaAtStep?.(game.step) || null;

return {
id: team?.id || 0,
playerCount: playersInTeam.length,
points: mean(
playersInTeam.map(
({ userId }) => personaByUserId[userId].currentPersona.points
)
),
budget: mean(
playersInTeam.map(
({ userId }) => personaByUserId[userId].currentPersona.budget
)
),
budgetSpent: mean(
playersInTeam
.map(({ userId }) => personaByUserId[userId])
.map(
(persona) =>
persona.getPersonaAtStep(0).budget - persona.currentPersona.budget
)
),
carbonFootprint: mean(
playersInTeam.map(
({ userId }) => personaByUserId[userId].currentPersona.carbonFootprint
)
),
carbonFootprintReduction: mean(
playersInTeam
.map(({ userId }) => personaByUserId[userId])
.map(
(persona) =>
(1 -
persona.currentPersona.carbonFootprint /
persona.getPersonaAtStep(0).carbonFootprint) *
100
)
),
stepToConsumption: buildStepToData(
"consumption",
game,
playersInTeam,
personaByUserId
),
stepToProduction: buildStepToData(
"production",
game,
playersInTeam,
personaByUserId
),
productionCurrent: currentPersonaRepresentingTeam?.production || [],
};
return buildTeamValues({ game, personaByUserId, players, team });
}, [game, personaByUserId, players, teamId, teams]);

return {
Expand Down
83 changes: 78 additions & 5 deletions packages/client/src/modules/play/context/hooks/shared/utils.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import range from "lodash/range";
import { IGame, Player } from "../../../../../utils/types";
import { IGame, ITeam, Player } from "../../../../../utils/types";
import { GameStepType, isStepOfType } from "../../../constants";
import { usePersonaByUserId } from "../../playContext";
import { TeamValues, usePersonaByUserId } from "../../playContext";
import { mean } from "../../../../../lib/math";
import { sumAllValues } from "../../../../persona";

export { buildStepToData };
export { buildStepToData, buildTeamValues };

type PersonaByUserId = ReturnType<typeof usePersonaByUserId>;

function buildStepToData(
dataType: GameStepType,
game: IGame,
players: Player[],
personaByUserId: ReturnType<typeof usePersonaByUserId>
personaByUserId: PersonaByUserId
) {
return Object.fromEntries(
range(0, game.lastFinishedStep + 1)
Expand All @@ -27,7 +29,7 @@ function buildStepData(
dataType: GameStepType,
step: number,
players: Player[],
personaByUserId: ReturnType<typeof usePersonaByUserId>
personaByUserId: PersonaByUserId
) {
return mean(
players
Expand All @@ -37,3 +39,74 @@ function buildStepData(
)
);
}

function buildTeamValues({
game,
personaByUserId,
players,
team,
}: {
game: IGame;
personaByUserId: PersonaByUserId;
players: Player[];
team?: ITeam;
}): TeamValues {
const playersInTeam = players.filter((p) => p.teamId === team?.id);
const playerRepresentingTeam = playersInTeam[0] || null;
const personaRepresentingTeam =
personaByUserId[playerRepresentingTeam?.userId || -1] || null;
const currentPersonaRepresentingTeam =
personaRepresentingTeam?.getPersonaAtStep?.(game.step) || null;

return {
id: team?.id || 0,
playerCount: playersInTeam.length,
points: mean(
playersInTeam.map(
({ userId }) => personaByUserId[userId].currentPersona.points
)
),
budget: mean(
playersInTeam.map(
({ userId }) => personaByUserId[userId].currentPersona.budget
)
),
budgetSpent: mean(
playersInTeam
.map(({ userId }) => personaByUserId[userId])
.map(
(persona) =>
persona.getPersonaAtStep(0).budget - persona.currentPersona.budget
)
),
carbonFootprint: mean(
playersInTeam.map(
({ userId }) => personaByUserId[userId].currentPersona.carbonFootprint
)
),
carbonFootprintReduction: mean(
playersInTeam
.map(({ userId }) => personaByUserId[userId])
.map(
(persona) =>
(1 -
persona.currentPersona.carbonFootprint /
persona.getPersonaAtStep(0).carbonFootprint) *
100
)
),
stepToConsumption: buildStepToData(
"consumption",
game,
playersInTeam,
personaByUserId
),
stepToProduction: buildStepToData(
"production",
game,
playersInTeam,
personaByUserId
),
productionCurrent: currentPersonaRepresentingTeam?.production || [],
};
}

0 comments on commit 8c28351

Please sign in to comment.