-
-
-
+
+ {showNote && member.privateNote ? (
+
+
+ >
+ }
+ >
+ {member.privateNote.text}
+
+
+ {databaseTimestampToDate(
+ member.privateNote.updatedAt,
+ ).toLocaleString(i18n.language, {
+ hour: "numeric",
+ minute: "numeric",
+ day: "numeric",
+ month: "long",
+ year: "numeric",
+ })}
+
+
+
+
+ ) : (
+
+ )}
+
{member.inGameName ? (
<>
-
IGN:{" "}
+
+ {t("user:ign.short")}:
+ {" "}
{inGameNameWithoutDiscriminator(member.inGameName)}
>
) : (
member.discordName
)}
-
-
+
+
{showActions || displayOnly ? (
) : null}
+ {showAddNote ? (
+ }
+ className={clsx("q__group-member__add-note-button", {
+ "q__group-member__add-note-button__edit": member.privateNote,
+ })}
+ >
+ {member.privateNote
+ ? t("q:looking.groups.editNote")
+ : t("q:looking.groups.addNote")}
+
+ ) : null}
{member.weapons && member.weapons.length > 0 && !hideWeapons ? (
@@ -238,6 +320,7 @@ function MemberNote({
note?: string | null;
editable: boolean;
}) {
+ const { t } = useTranslation(["common", "q"]);
const fetcher = useFetcher();
const [editing, setEditing] = React.useState(false);
const [value, setValue] = React.useState(note ?? "");
@@ -253,7 +336,7 @@ function MemberNote({
stopEditing();
}, [stopEditing]);
- const newValueLegal = value.length <= SENDOUQ.NOTE_MAX_LENGTH;
+ const newValueLegal = value.length <= SENDOUQ.OWN_PUBLIC_NOTE_MAX_LENGTH;
if (editing) {
return (
@@ -271,7 +354,7 @@ function MemberNote({
size="miniscule"
onClick={stopEditing}
>
- Cancel
+ {t("common:actions.cancel")}
{newValueLegal ? (
- Save
+ {t("common:actions.save")}
) : (
- {value.length}/{SENDOUQ.NOTE_MAX_LENGTH}
+ {value.length}/{SENDOUQ.OWN_PUBLIC_NOTE_MAX_LENGTH}
)}
@@ -302,7 +385,7 @@ function MemberNote({
onClick={startEditing}
className="mt-2 ml-auto"
>
- Edit note
+ {t("q:looking.groups.editNote")}
) : null}
@@ -313,11 +396,35 @@ function MemberNote({
return (
);
}
+function DeletePrivateNoteForm({
+ targetId,
+ name,
+}: {
+ targetId: number;
+ name: string;
+}) {
+ const { t } = useTranslation(["q"]);
+
+ return (
+
+
+
+
+
+ );
+}
+
function GroupSkillDifference({
skillDifference,
}: {
@@ -325,10 +432,13 @@ function GroupSkillDifference({
ParsedMemento["groups"][number]["skillDifference"]
>;
}) {
+ const { t } = useTranslation(["q"]);
+
if (skillDifference.calculated) {
return (
- Team SP {skillDifference.oldSp} ➜ {skillDifference.newSp}
+ {t("q:looking.teamSP")} {skillDifference.oldSp} ➜{" "}
+ {skillDifference.newSp}
);
}
@@ -336,14 +446,14 @@ function GroupSkillDifference({
if (skillDifference.newSp) {
return (
- Team SP calculated: {skillDifference.newSp}
+ {t("q:looking.teamSP.calculated")}: {skillDifference.newSp}
);
}
return (
- Team SP calculating... ({skillDifference.matchesCount}/
+ {t("q:looking.teamSP.calculating")} ({skillDifference.matchesCount}/
{skillDifference.matchesCountNeeded})
);
@@ -356,6 +466,8 @@ function MemberSkillDifference({
ParsedMemento["users"][number]["skillDifference"]
>;
}) {
+ const { t } = useTranslation(["q"]);
+
if (skillDifference.calculated) {
if (skillDifference.spDiff === 0) return null;
@@ -376,7 +488,7 @@ function MemberSkillDifference({
if (skillDifference.matchesCount === skillDifference.matchesCountNeeded) {
return (
- Calculated:{" "}
+ {t("q:looking.sp.calculated")}:{" "}
{skillDifference.newSp ? <>{skillDifference.newSp}SP> : null}
);
@@ -384,7 +496,7 @@ function MemberSkillDifference({
return (
- Calculating... (
+ {t("q:looking.sp.calculating")} (
{skillDifference.matchesCount}/{skillDifference.matchesCountNeeded})
);
@@ -432,7 +544,7 @@ function MemberRoleManager({
_action="GIVE_MANAGER"
state={fetcher.state}
>
- Give manager
+ {t("q:looking.groups.actions.giveManager")}
) : null}
{member.role === "MANAGER" ? (
@@ -442,7 +554,7 @@ function MemberRoleManager({
_action="REMOVE_MANAGER"
state={fetcher.state}
>
- Remove manager
+ {t("q:looking.groups.actions.removeManager")}
) : null}
{enableKicking && member.id !== loggedInUser?.id ? (
@@ -452,7 +564,7 @@ function MemberRoleManager({
_action="KICK_FROM_GROUP"
state={fetcher.state}
>
- Kick
+ {t("q:looking.groups.actions.kick")}
) : null}
@@ -462,7 +574,30 @@ function MemberRoleManager({
);
}
-function TierInfo({ skill }: { skill: TieredSkill }) {
+function TierInfo({ skill }: { skill: TieredSkill | "CALCULATING" }) {
+ const { t } = useTranslation(["q"]);
+
+ if (skill === "CALCULATING") {
+ return (
+
+
+ }
+ >
+ {t("q:looking.rankCalculating", {
+ count: MATCHES_COUNT_NEEDED_FOR_LEADERBOARD,
+ })}
+
+
+ );
+ }
+
return (
}>
@@ -474,7 +609,7 @@ function TierInfo({ skill }: { skill: TieredSkill }) {
{skill.tier.isPlus ? "+" : ""}
- All tiers
+ {t("q:looking.allTiers")}
{!skill.approximate ? (
diff --git a/app/features/sendouq/components/GroupLeaver.tsx b/app/features/sendouq/components/GroupLeaver.tsx
index ccaf34aca..04d63d8ea 100644
--- a/app/features/sendouq/components/GroupLeaver.tsx
+++ b/app/features/sendouq/components/GroupLeaver.tsx
@@ -2,6 +2,7 @@ import { useFetcher } from "@remix-run/react";
import { Button } from "~/components/Button";
import { FormWithConfirm } from "~/components/FormWithConfirm";
import { SubmitButton } from "~/components/SubmitButton";
+import { useTranslation } from "~/hooks/useTranslation";
import { SENDOUQ_LOOKING_PAGE } from "~/utils/urls";
export function GroupLeaver({
@@ -9,6 +10,7 @@ export function GroupLeaver({
}: {
type: "LEAVE_GROUP" | "LEAVE_Q" | "GO_BACK";
}) {
+ const { t } = useTranslation(["q"]);
const fetcher = useFetcher();
if (type === "LEAVE_GROUP") {
@@ -20,7 +22,7 @@ export function GroupLeaver({
action={SENDOUQ_LOOKING_PAGE}
>