diff --git a/src/main/events/index.ts b/src/main/events/index.ts index 1b500be9..64f95108 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -43,6 +43,7 @@ import "./auth/sign-out"; import "./auth/open-auth-window"; import "./auth/get-session-hash"; import "./user/get-user"; +import "./profile/get-friend-requests"; import "./profile/get-me"; import "./profile/update-profile"; diff --git a/src/main/events/profile/get-friend-requests.ts b/src/main/events/profile/get-friend-requests.ts new file mode 100644 index 00000000..ba2cf1b5 --- /dev/null +++ b/src/main/events/profile/get-friend-requests.ts @@ -0,0 +1,16 @@ +import { registerEvent } from "../register-event"; +import { HydraApi } from "@main/services"; +import { PendingFriendRequest } from "@types"; + +const getFriendRequests = async ( + _event: Electron.IpcMainInvokeEvent +): Promise => { + try { + const response = await HydraApi.get(`/profile/friend-requests`); + return response.data; + } catch (err) { + return null; + } +}; + +registerEvent("getFriendRequests", getFriendRequests); diff --git a/src/preload/index.ts b/src/preload/index.ts index 0cadbc03..759b0224 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -136,6 +136,7 @@ contextBridge.exposeInMainWorld("electron", { getMe: () => ipcRenderer.invoke("getMe"), updateProfile: (displayName: string, newProfileImagePath: string | null) => ipcRenderer.invoke("updateProfile", displayName, newProfileImagePath), + getFriendRequests: () => ipcRenderer.invoke("getFriendRequests"), /* User */ getUser: (userId: string) => ipcRenderer.invoke("getUser", userId), diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index 48fa7aae..0ff9e876 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -14,6 +14,7 @@ import type { RealDebridUser, DownloadSource, UserProfile, + PendingFriendRequest, } from "@types"; import type { DiskSpace } from "check-disk-space"; @@ -132,6 +133,7 @@ declare global { displayName: string, newProfileImagePath: string | null ) => Promise; + getFriendRequests: () => Promise; } interface Window { diff --git a/src/renderer/src/hooks/use-user-details.ts b/src/renderer/src/hooks/use-user-details.ts index 6495ba27..d39c2578 100644 --- a/src/renderer/src/hooks/use-user-details.ts +++ b/src/renderer/src/hooks/use-user-details.ts @@ -82,6 +82,10 @@ export function useUserDetails() { console.log("sending friend request to", userId); }, []); + const fetchPendingRequests = useCallback(async () => { + return window.electron.getFriendRequests(); + }, []); + return { userDetails, fetchUserDetails, @@ -90,6 +94,7 @@ export function useUserDetails() { updateUserDetails, patchUser, sendFriendRequest, + fetchPendingRequests, profileBackground, }; } diff --git a/src/renderer/src/pages/user/user-add-friends-modal.tsx b/src/renderer/src/pages/user/user-add-friends-modal.tsx index cb990e1c..3037eadb 100644 --- a/src/renderer/src/pages/user/user-add-friends-modal.tsx +++ b/src/renderer/src/pages/user/user-add-friends-modal.tsx @@ -1,7 +1,7 @@ import { Button, Modal, TextField } from "@renderer/components"; import { PendingFriendRequest } from "@types"; import { SPACING_UNIT } from "@renderer/theme.css"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import { useToast, useUserDetails } from "@renderer/hooks"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -10,19 +10,18 @@ import { UserFriendPendingRequest } from "./user-friend-pending-request"; export interface UserAddFriendsModalProps { visible: boolean; onClose: () => void; + pendingRequests: PendingFriendRequest[]; } export const UserAddFriendsModal = ({ visible, onClose, + pendingRequests, }: UserAddFriendsModalProps) => { const { t } = useTranslation("user_profile"); const [friendCode, setFriendCode] = useState(""); const [isAddingFriend, setIsAddingFriend] = useState(false); - const [pendingRequests, setPendingRequests] = useState< - PendingFriendRequest[] - >([]); const navigate = useNavigate(); @@ -37,7 +36,7 @@ export const UserAddFriendsModal = ({ showSuccessToast(t("friend_request_sent")); }) .catch(() => { - showErrorToast("falhaaaa"); + showErrorToast("Não foi possível enviar o pedido de amizade"); }) .finally(() => { setIsAddingFriend(false); @@ -45,29 +44,12 @@ export const UserAddFriendsModal = ({ }; const handleClickFriend = (userId: string) => { - navigate(userId); + navigate(`/user/${userId}`); }; - useEffect(() => { - setPendingRequests([ - { - userId: "abcd1234", - displayName: "Punheta Master 123", - profileImageUrl: - "https://cdn.discordapp.com/avatars/1239959140785455295/4aff4b901c7a9f5f814b4379b6cfd58a.webp", - type: "RECEIVED", - }, - { - userId: "12345678", - displayName: "Deyvis0n", - profileImageUrl: null, - type: "SENT", - }, - ]); - }, []); - const handleClickSeeProfile = () => { - // navigate(`profile/${friendCode}`); + onClose(); + navigate(`/user/${friendCode}`); }; const handleClickCancelFriendRequest = (userId: string) => { diff --git a/src/renderer/src/pages/user/user-content.tsx b/src/renderer/src/pages/user/user-content.tsx index 5d0de1c5..7944f0e5 100644 --- a/src/renderer/src/pages/user/user-content.tsx +++ b/src/renderer/src/pages/user/user-content.tsx @@ -1,9 +1,8 @@ -import { UserGame, UserProfile } from "@types"; +import { PendingFriendRequest, UserGame, UserProfile } from "@types"; import cn from "classnames"; - import * as styles from "./user.css"; import { SPACING_UNIT, vars } from "@renderer/theme.css"; -import { useMemo, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import SteamLogo from "@renderer/assets/steam-logo.svg?react"; import { @@ -90,8 +89,18 @@ export function UserContent({ navigate("/"); }; + const [pendingRequests, setPendingRequests] = useState< + PendingFriendRequest[] + >([]); + const isMe = userDetails?.id == userProfile.id; + useEffect(() => { + window.electron.getFriendRequests().then((friendsRequests) => { + setPendingRequests(friendsRequests ?? []); + }); + }, [isMe]); + const profileContentBoxBackground = useMemo(() => { if (profileBackground) return profileBackground; /* TODO: Render background colors for other users */ @@ -114,6 +123,7 @@ export function UserContent({ /> setShowAddFriendsModal(false)} /> @@ -231,9 +241,11 @@ export function UserContent({

{t("no_recent_activity_title")}

-

- {t("no_recent_activity_description")} -

+ {isMe && ( +

+ {t("no_recent_activity_description")} +

+ )} ) : (
{ const [userProfile, setUserProfile] = useState(); const navigate = useNavigate(); + const { showErrorToast } = useToast(); + const dispatch = useAppDispatch(); const getUserProfile = useCallback(() => { @@ -22,6 +24,7 @@ export const User = () => { dispatch(setHeaderTitle(userProfile.displayName)); setUserProfile(userProfile); } else { + showErrorToast("Usuário não encontrado"); navigate(-1); } });