diff --git a/client/src/components/ChatMessage.tsx b/client/src/components/ChatMessage.tsx
index 47f6823d2..c05f5462b 100644
--- a/client/src/components/ChatMessage.tsx
+++ b/client/src/components/ChatMessage.tsx
@@ -10,7 +10,7 @@ import DOMPurify from "dompurify";
import GraveComponent from "./grave";
import { RoleOutline, translateRoleOutline } from "../game/roleListState.d";
import { CopyButton } from "./ClipboardButtons";
-import { useGameState, useLobbyOrGameState, usePlayerState } from "./useHooks";
+import { useGameState, useLobbyOrGameState, usePlayerNames, usePlayerState, useSpectator } from "./useHooks";
import { KiraResult, KiraResultDisplay } from "../menu/game/gameScreenContent/AbilityMenu/AbilitySelectionTypes/KiraSelectionMenu";
import { AuditorResult } from "../menu/game/gameScreenContent/AbilityMenu/RoleSpecificMenus/AuditorMenu";
import { ControllerID, AbilitySelection, translateControllerID, controllerIdToLink } from "../game/abilityInput";
@@ -37,7 +37,8 @@ const ChatElement = React.memo((
const [mouseHovering, setMouseHovering] = React.useState(false);
const message = props.message;
- const playerNames = props.playerNames ?? GAME_MANAGER.getPlayerNames();
+ const realPlayerNames = usePlayerNames();
+ const playerNames = props.playerNames ?? realPlayerNames;
const chatMessageStyles = require("../resources/styling/chatMessage.json");
if(message.variant === undefined){
console.error("ChatElement message with undefined variant:");
@@ -132,33 +133,13 @@ const ChatElement = React.memo((
/>
case "playerDied":
-
- let graveRoleString: string;
- switch (message.variant.grave.information.type) {
- case "obscured":
- graveRoleString = translate("obscured");
- break;
- case "normal":
- graveRoleString = translate("role."+message.variant.grave.information.role+".name");
- break;
- }
-
- return
-
- {(chatGroupIcon??"")} {translate("chatMessage.playerDied",
- playerNames[message.variant.grave.player], graveRoleString
- )}
-
- }
- defaultOpen={GAME_MANAGER.getMySpectator()}
- >
-
-
-
;
+ return
}
return ;
});
+function PlayerDiedChatMessage(props: Readonly<{
+ playerKeywordData?: KeywordDataMap,
+ style: string,
+ chatGroupIcon: string | null,
+ playerNames: string[],
+ message: ChatMessage & { variant: { type: "playerDied" } }
+}>): ReactElement {
+ let graveRoleString: string;
+ switch (props.message.variant.grave.information.type) {
+ case "obscured":
+ graveRoleString = translate("obscured");
+ break;
+ case "normal":
+ graveRoleString = translate("role."+props.message.variant.grave.information.role+".name");
+ break;
+ }
+
+ const spectator = useSpectator();
+
+ return
+
+ {(props.chatGroupIcon ?? "")} {translate("chatMessage.playerDied",
+ props.playerNames[props.message.variant.grave.player], graveRoleString
+ )}
+
+ }
+ defaultOpen={spectator}
+ >
+
+
+
;
+}
+
function LobbyChatMessage(props: Readonly<{
message: ChatMessage & { variant: { type: "lobbyMessage" } }
playerNames: string[],
@@ -326,14 +344,9 @@ export function sanitizePlayerMessage(text: string): string {
export function translateChatMessage(
message: ChatMessageVariant,
- playerNames?: string[],
+ playerNames: string[],
roleList?: RoleOutline[]
): string {
-
- if (playerNames === undefined) {
- playerNames = GAME_MANAGER.getPlayerNames();
- }
-
switch (message.type) {
case "lobbyMessage":
return sanitizePlayerMessage(replaceMentions(message.text, playerNames));
@@ -522,7 +535,7 @@ export function translateChatMessage(
out = translate("chatMessage.abilityUsed.selection.twoRoleOutlineOption", first, second);
break;
case "string":
- out = translate("chatMessage.abilityUsed.selection.string", sanitizePlayerMessage(replaceMentions(message.selection.selection)));
+ out = translate("chatMessage.abilityUsed.selection.string", sanitizePlayerMessage(replaceMentions(message.selection.selection, playerNames)));
break;
case "integer":
let text = translateChecked("controllerId."+controllerIdToLink(message.abilityId).replace(/\//g, ".") + ".integer." + message.selection.selection);
diff --git a/client/src/components/TextAreaDropdown.tsx b/client/src/components/TextAreaDropdown.tsx
index 5207ef69f..37f3b5652 100644
--- a/client/src/components/TextAreaDropdown.tsx
+++ b/client/src/components/TextAreaDropdown.tsx
@@ -7,6 +7,7 @@ import Icon from "./Icon";
import translate from "../game/lang";
import "./textAreaDropdown.css";
import DetailsSummary from "./DetailsSummary";
+import { usePlayerNames } from "./useHooks";
export function TextDropdownArea(props: Readonly<{
titleString: string,
@@ -82,6 +83,8 @@ function TextDropdownLabel(
return props.savedText !== props.field
}, [props.field, props.savedText]);
+ const playerNames = usePlayerNames();
+
function save(field: string) {
props.onSave(field);
}
@@ -92,7 +95,7 @@ function TextDropdownLabel(
}
return
-
{replaceMentions(props.titleString)}
+
{replaceMentions(props.titleString, playerNames)}
{props.onSubtract ?