mirror of
https://github.com/hydralauncher/hydra.git
synced 2025-01-24 05:54:55 +03:00
feat: add friends button on user profile
This commit is contained in:
parent
27610aa8cf
commit
6b8f2e6978
@ -250,6 +250,13 @@
|
|||||||
"friend_request_sent": "Friend request sent",
|
"friend_request_sent": "Friend request sent",
|
||||||
"friends": "Friends",
|
"friends": "Friends",
|
||||||
"friends_list": "Friends list",
|
"friends_list": "Friends list",
|
||||||
"user_not_found": "User not found"
|
"user_not_found": "User not found",
|
||||||
|
"block_user": "Block user",
|
||||||
|
"add_friend": "Add friend",
|
||||||
|
"request_sent": "Request sent",
|
||||||
|
"request_received": "Request received",
|
||||||
|
"accept_request": "Accept request",
|
||||||
|
"ignore_request": "Ignore request",
|
||||||
|
"cancel_request": "Cancel request"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -250,6 +250,13 @@
|
|||||||
"add": "Adicionar",
|
"add": "Adicionar",
|
||||||
"sending": "Enviando",
|
"sending": "Enviando",
|
||||||
"friends_list": "Lista de amigos",
|
"friends_list": "Lista de amigos",
|
||||||
"user_not_found": "Usuário não encontrado"
|
"user_not_found": "Usuário não encontrado",
|
||||||
|
"block_user": "Bloquear",
|
||||||
|
"add_friend": "Adicionar amigo",
|
||||||
|
"request_sent": "Pedido enviado",
|
||||||
|
"request_received": "Pedido recebido",
|
||||||
|
"accept_request": "Aceitar pedido",
|
||||||
|
"ignore_request": "Ignorar pedido",
|
||||||
|
"cancel_request": "Cancelar pedido"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import {
|
|||||||
import * as styles from "./user-friend-modal.css";
|
import * as styles from "./user-friend-modal.css";
|
||||||
import cn from "classnames";
|
import cn from "classnames";
|
||||||
import { SPACING_UNIT } from "@renderer/theme.css";
|
import { SPACING_UNIT } from "@renderer/theme.css";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
|
||||||
export interface UserFriendRequestProps {
|
export interface UserFriendRequestProps {
|
||||||
userId: string;
|
userId: string;
|
||||||
@ -28,6 +29,8 @@ export const UserFriendRequest = ({
|
|||||||
onClickRefuseRequest,
|
onClickRefuseRequest,
|
||||||
onClickRequest,
|
onClickRequest,
|
||||||
}: UserFriendRequestProps) => {
|
}: UserFriendRequestProps) => {
|
||||||
|
const { t } = useTranslation("user_profile");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={cn(styles.friendListContainer, styles.profileContentBox)}>
|
<div className={cn(styles.friendListContainer, styles.profileContentBox)}>
|
||||||
<button
|
<button
|
||||||
@ -56,7 +59,9 @@ export const UserFriendRequest = ({
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<p className={styles.friendListDisplayName}>{displayName}</p>
|
<p className={styles.friendListDisplayName}>{displayName}</p>
|
||||||
<small>{isRequestSent ? "Pedido enviado" : "Pedido recebido"}</small>
|
<small>
|
||||||
|
{isRequestSent ? t("request_sent") : t("request_received")}
|
||||||
|
</small>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
@ -72,6 +77,7 @@ export const UserFriendRequest = ({
|
|||||||
<button
|
<button
|
||||||
className={styles.cancelRequestButton}
|
className={styles.cancelRequestButton}
|
||||||
onClick={() => onClickCancelRequest(userId)}
|
onClick={() => onClickCancelRequest(userId)}
|
||||||
|
title={t("cancel_request")}
|
||||||
>
|
>
|
||||||
<XCircleIcon size={28} />
|
<XCircleIcon size={28} />
|
||||||
</button>
|
</button>
|
||||||
@ -80,12 +86,14 @@ export const UserFriendRequest = ({
|
|||||||
<button
|
<button
|
||||||
className={styles.acceptRequestButton}
|
className={styles.acceptRequestButton}
|
||||||
onClick={() => onClickAcceptRequest(userId)}
|
onClick={() => onClickAcceptRequest(userId)}
|
||||||
|
title={t("accept_request")}
|
||||||
>
|
>
|
||||||
<CheckCircleIcon size={28} />
|
<CheckCircleIcon size={28} />
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className={styles.cancelRequestButton}
|
className={styles.cancelRequestButton}
|
||||||
onClick={() => onClickRefuseRequest(userId)}
|
onClick={() => onClickRefuseRequest(userId)}
|
||||||
|
title={t("ignore_request")}
|
||||||
>
|
>
|
||||||
<XCircleIcon size={28} />
|
<XCircleIcon size={28} />
|
||||||
</button>
|
</button>
|
||||||
|
@ -17,7 +17,13 @@ import {
|
|||||||
profileBackgroundFromProfileImage,
|
profileBackgroundFromProfileImage,
|
||||||
steamUrlBuilder,
|
steamUrlBuilder,
|
||||||
} from "@renderer/helpers";
|
} from "@renderer/helpers";
|
||||||
import { PersonIcon, PlusIcon, TelescopeIcon } from "@primer/octicons-react";
|
import {
|
||||||
|
CheckCircleIcon,
|
||||||
|
PersonIcon,
|
||||||
|
PlusIcon,
|
||||||
|
TelescopeIcon,
|
||||||
|
XCircleIcon,
|
||||||
|
} from "@primer/octicons-react";
|
||||||
import { Button, Link } from "@renderer/components";
|
import { Button, Link } from "@renderer/components";
|
||||||
import { UserEditProfileModal } from "./user-edit-modal";
|
import { UserEditProfileModal } from "./user-edit-modal";
|
||||||
import { UserSignOutModal } from "./user-signout-modal";
|
import { UserSignOutModal } from "./user-signout-modal";
|
||||||
@ -39,6 +45,7 @@ export function UserContent({
|
|||||||
const {
|
const {
|
||||||
userDetails,
|
userDetails,
|
||||||
profileBackground,
|
profileBackground,
|
||||||
|
friendRequests,
|
||||||
signOut,
|
signOut,
|
||||||
updateFriendRequests,
|
updateFriendRequests,
|
||||||
showFriendsModal,
|
showFriendsModal,
|
||||||
@ -116,6 +123,71 @@ export function UserContent({
|
|||||||
}
|
}
|
||||||
}, [profileBackground, isMe]);
|
}, [profileBackground, isMe]);
|
||||||
|
|
||||||
|
const getProfileActions = () => {
|
||||||
|
if (isMe) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Button theme="outline" onClick={handleEditProfile}>
|
||||||
|
{t("edit_profile")}
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button theme="danger" onClick={() => setShowSignOutModal(true)}>
|
||||||
|
{t("sign_out")}
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const friendRequest = friendRequests.find(
|
||||||
|
(request) => request.id == userProfile.id
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!friendRequest) {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Button theme="outline" onClick={() => {}}>
|
||||||
|
{t("add_friend")}
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<Button theme="danger" onClick={() => {}}>
|
||||||
|
{t("block_user")}
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (friendRequest.type === "RECEIVED") {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Button
|
||||||
|
theme="outline"
|
||||||
|
className={styles.acceptRequestButton}
|
||||||
|
onClick={() => {}}
|
||||||
|
>
|
||||||
|
<CheckCircleIcon size={28} /> {t("accept_request")}
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
theme="outline"
|
||||||
|
className={styles.cancelRequestButton}
|
||||||
|
onClick={() => {}}
|
||||||
|
>
|
||||||
|
<XCircleIcon size={28} /> {t("ignore_request")}
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Button
|
||||||
|
theme="outline"
|
||||||
|
className={styles.cancelRequestButton}
|
||||||
|
onClick={() => {}}
|
||||||
|
>
|
||||||
|
<XCircleIcon size={28} /> {t("cancel_request")}
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<UserEditProfileModal
|
<UserEditProfileModal
|
||||||
@ -201,7 +273,6 @@ export function UserContent({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{isMe && (
|
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
flex: 1,
|
flex: 1,
|
||||||
@ -217,21 +288,9 @@ export function UserContent({
|
|||||||
gap: `${SPACING_UNIT}px`,
|
gap: `${SPACING_UNIT}px`,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<>
|
{getProfileActions()}
|
||||||
<Button theme="outline" onClick={handleEditProfile}>
|
|
||||||
{t("edit_profile")}
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
theme="danger"
|
|
||||||
onClick={() => setShowSignOutModal(true)}
|
|
||||||
>
|
|
||||||
{t("sign_out")}
|
|
||||||
</Button>
|
|
||||||
</>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<div className={styles.profileContent}>
|
<div className={styles.profileContent}>
|
||||||
|
@ -279,3 +279,16 @@ export const profileBackground = style({
|
|||||||
top: "0",
|
top: "0",
|
||||||
borderRadius: "4px",
|
borderRadius: "4px",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const cancelRequestButton = style({
|
||||||
|
cursor: "pointer",
|
||||||
|
color: vars.color.body,
|
||||||
|
":hover": {
|
||||||
|
color: vars.color.danger,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export const acceptRequestButton = style({
|
||||||
|
cursor: "pointer",
|
||||||
|
color: vars.color.success,
|
||||||
|
});
|
||||||
|
@ -293,6 +293,7 @@ export interface UserProfile {
|
|||||||
id: string;
|
id: string;
|
||||||
displayName: string;
|
displayName: string;
|
||||||
profileImageUrl: string | null;
|
profileImageUrl: string | null;
|
||||||
|
profileVisibility: "PUBLIC" | "PRIVATE" | "FRIEND";
|
||||||
totalPlayTimeInSeconds: number;
|
totalPlayTimeInSeconds: number;
|
||||||
libraryGames: UserGame[];
|
libraryGames: UserGame[];
|
||||||
recentGames: UserGame[];
|
recentGames: UserGame[];
|
||||||
|
Loading…
Reference in New Issue
Block a user