Merge branch 'main' of github.com:hydralauncher/hydra into feature/adding-flame-animation

This commit is contained in:
Chubby Granny Chaser 2024-09-17 16:31:44 +01:00
commit 705b12019f
No known key found for this signature in database
21 changed files with 169 additions and 146 deletions

View file

@ -43,7 +43,7 @@ export function App() {
isFriendsModalVisible,
friendRequetsModalTab,
friendModalUserId,
fetchFriendRequests,
syncFriendRequests,
hideFriendsModal,
} = useUserDetails();
@ -105,22 +105,22 @@ export function App() {
fetchUserDetails().then((response) => {
if (response) {
updateUserDetails(response);
fetchFriendRequests();
syncFriendRequests();
}
});
}, [fetchUserDetails, fetchFriendRequests, updateUserDetails, dispatch]);
}, [fetchUserDetails, syncFriendRequests, updateUserDetails, dispatch]);
const onSignIn = useCallback(() => {
fetchUserDetails().then((response) => {
if (response) {
updateUserDetails(response);
fetchFriendRequests();
syncFriendRequests();
showSuccessToast(t("successfully_signed_in"));
}
});
}, [
fetchUserDetails,
fetchFriendRequests,
syncFriendRequests,
t,
showSuccessToast,
updateUserDetails,

View file

@ -15,15 +15,15 @@ export function SidebarProfile() {
const { t } = useTranslation("sidebar");
const { userDetails, friendRequests, showFriendsModal, fetchFriendRequests } =
useUserDetails();
const {
userDetails,
friendRequestCount,
showFriendsModal,
syncFriendRequests,
} = useUserDetails();
const { gameRunning } = useAppSelector((state) => state.gameRunning);
const receivedRequests = useMemo(() => {
return friendRequests.filter((request) => request.type === "RECEIVED");
}, [friendRequests]);
const handleProfileClick = () => {
if (userDetails === null) {
window.electron.openAuthWindow();
@ -35,7 +35,7 @@ export function SidebarProfile() {
useEffect(() => {
pollingInterval.current = setInterval(() => {
fetchFriendRequests();
syncFriendRequests();
}, LONG_POLLING_INTERVAL);
return () => {
@ -43,7 +43,7 @@ export function SidebarProfile() {
clearInterval(pollingInterval.current);
}
};
}, [fetchFriendRequests]);
}, [syncFriendRequests]);
const friendsButton = useMemo(() => {
if (!userDetails) return null;
@ -57,16 +57,16 @@ export function SidebarProfile() {
}
title={t("friends")}
>
{receivedRequests.length > 0 && (
{friendRequestCount > 0 && (
<small className={styles.friendsButtonBadge}>
{receivedRequests.length > 99 ? "99+" : receivedRequests.length}
{friendRequestCount > 99 ? "99+" : friendRequestCount}
</small>
)}
<PeopleIcon size={16} />
</button>
);
}, [userDetails, t, receivedRequests, showFriendsModal]);
}, [userDetails, t, friendRequestCount, showFriendsModal]);
return (
<div className={styles.profileContainer}>
@ -100,6 +100,7 @@ export function SidebarProfile() {
textOverflow: "ellipsis",
whiteSpace: "nowrap",
width: "100%",
textAlign: "left",
}}
>
<small>{gameRunning.title}</small>

View file

@ -26,7 +26,7 @@ export const sidebar = recipe({
paddingTop: `${SPACING_UNIT * 6}px`,
},
false: {
paddingTop: `${SPACING_UNIT * 2}px`,
paddingTop: `${SPACING_UNIT}px`,
},
},
},

View file

@ -23,6 +23,8 @@ import type {
GameStats,
TrendingGame,
UserStats,
UserDetails,
FriendRequestSync,
} from "@types";
import type { DiskSpace } from "check-disk-space";
@ -153,7 +155,7 @@ declare global {
) => Promise<void>;
/* Profile */
getMe: () => Promise<UserProfile | null>;
getMe: () => Promise<UserDetails | null>;
undoFriendship: (userId: string) => Promise<void>;
updateProfile: (
updateProfile: UpdateProfileRequest
@ -163,6 +165,7 @@ declare global {
path: string
) => Promise<{ imagePath: string; mimeType: string }>;
getFriendRequests: () => Promise<FriendRequest[]>;
syncFriendRequests: () => Promise<FriendRequestSync>;
updateFriendRequest: (
userId: string,
action: FriendRequestAction

View file

@ -1,11 +1,12 @@
import { PayloadAction, createSlice } from "@reduxjs/toolkit";
import { UserFriendModalTab } from "@renderer/pages/shared-modals/user-friend-modal";
import type { FriendRequest, UserProfile } from "@types";
import type { FriendRequest, UserDetails } from "@types";
export interface UserDetailsState {
userDetails: UserProfile | null;
userDetails: UserDetails | null;
profileBackground: null | string;
friendRequests: FriendRequest[];
friendRequestCount: number;
isFriendsModalVisible: boolean;
friendRequetsModalTab: UserFriendModalTab | null;
friendModalUserId: string;
@ -15,6 +16,7 @@ const initialState: UserDetailsState = {
userDetails: null,
profileBackground: null,
friendRequests: [],
friendRequestCount: 0,
isFriendsModalVisible: false,
friendRequetsModalTab: null,
friendModalUserId: "",
@ -24,7 +26,7 @@ export const userDetailsSlice = createSlice({
name: "user-details",
initialState,
reducers: {
setUserDetails: (state, action: PayloadAction<UserProfile | null>) => {
setUserDetails: (state, action: PayloadAction<UserDetails | null>) => {
state.userDetails = action.payload;
},
setProfileBackground: (state, action: PayloadAction<string | null>) => {
@ -33,6 +35,9 @@ export const userDetailsSlice = createSlice({
setFriendRequests: (state, action: PayloadAction<FriendRequest[]>) => {
state.friendRequests = action.payload;
},
setFriendRequestCount: (state, action: PayloadAction<number>) => {
state.friendRequestCount = action.payload;
},
setFriendsModalVisible: (
state,
action: PayloadAction<{ initialTab: UserFriendModalTab; userId: string }>
@ -52,6 +57,7 @@ export const {
setUserDetails,
setProfileBackground,
setFriendRequests,
setFriendRequestCount,
setFriendsModalVisible,
setFriendsModalHidden,
} = userDetailsSlice.actions;

View file

@ -6,11 +6,12 @@ import {
setFriendRequests,
setFriendsModalVisible,
setFriendsModalHidden,
setFriendRequestCount,
} from "@renderer/features";
import type {
FriendRequestAction,
UpdateProfileRequest,
UserProfile,
UserDetails,
} from "@types";
import { UserFriendModalTab } from "@renderer/pages/shared-modals/user-friend-modal";
@ -21,6 +22,7 @@ export function useUserDetails() {
userDetails,
profileBackground,
friendRequests,
friendRequestCount,
isFriendsModalVisible,
friendModalUserId,
friendRequetsModalTab,
@ -40,7 +42,7 @@ export function useUserDetails() {
}, [clearUserDetails]);
const updateUserDetails = useCallback(
async (userDetails: UserProfile) => {
async (userDetails: UserDetails) => {
dispatch(setUserDetails(userDetails));
if (userDetails.profileImageUrl) {
@ -83,7 +85,10 @@ export function useUserDetails() {
const patchUser = useCallback(
async (values: UpdateProfileRequest) => {
const response = await window.electron.updateProfile(values);
return updateUserDetails(response);
return updateUserDetails({
...response,
username: userDetails?.username || "",
});
},
[updateUserDetails]
);
@ -92,11 +97,21 @@ export function useUserDetails() {
return window.electron
.getFriendRequests()
.then((friendRequests) => {
syncFriendRequests();
dispatch(setFriendRequests(friendRequests));
})
.catch(() => {});
}, [dispatch]);
const syncFriendRequests = useCallback(async () => {
return window.electron
.syncFriendRequests()
.then((sync) => {
dispatch(setFriendRequestCount(sync.friendRequestCount));
})
.catch(() => {});
}, [dispatch]);
const showFriendsModal = useCallback(
(initialTab: UserFriendModalTab, userId: string) => {
dispatch(setFriendsModalVisible({ initialTab, userId }));
@ -140,6 +155,7 @@ export function useUserDetails() {
userDetails,
profileBackground,
friendRequests,
friendRequestCount,
friendRequetsModalTab,
isFriendsModalVisible,
friendModalUserId,
@ -152,6 +168,7 @@ export function useUserDetails() {
patchUser,
sendFriendRequest,
fetchFriendRequests,
syncFriendRequests,
updateFriendRequestState,
blockUser,
unblockUser,

View file

@ -160,12 +160,15 @@ export function DownloadSettingsModal({
))}
</div>
{selectedDownloader && selectedDownloader !== Downloader.Torrent && (
<p style={{ marginTop: `${SPACING_UNIT}px` }}>
<span style={{ color: vars.color.warning }}>{t("warning")}</span>{" "}
{t("hydra_needs_to_remain_open")}
</p>
)}
{selectedDownloader != null &&
selectedDownloader !== Downloader.Torrent && (
<p style={{ marginTop: `${SPACING_UNIT}px` }}>
<span style={{ color: vars.color.warning }}>
{t("warning")}
</span>{" "}
{t("hydra_needs_to_remain_open")}
</p>
)}
</div>
<div

View file

@ -1,4 +1,4 @@
import { useContext, useEffect, useState } from "react";
import { useContext, useState } from "react";
import type { HowLongToBeatCategory, SteamAppDetails } from "@types";
import { useTranslation } from "react-i18next";
import { Button } from "@renderer/components";
@ -9,7 +9,7 @@ import { useFormat } from "@renderer/hooks";
import { DownloadIcon, PeopleIcon } from "@primer/octicons-react";
export function Sidebar() {
const [_howLongToBeat, setHowLongToBeat] = useState<{
const [_howLongToBeat, _setHowLongToBeat] = useState<{
isLoading: boolean;
data: HowLongToBeatCategory[] | null;
}>({ isLoading: true, data: null });
@ -17,27 +17,26 @@ export function Sidebar() {
const [activeRequirement, setActiveRequirement] =
useState<keyof SteamAppDetails["pc_requirements"]>("minimum");
const { gameTitle, shopDetails, objectID, stats } =
useContext(gameDetailsContext);
const { gameTitle, shopDetails, stats } = useContext(gameDetailsContext);
const { t } = useTranslation("game_details");
const { numberFormatter } = useFormat();
useEffect(() => {
if (objectID) {
setHowLongToBeat({ isLoading: true, data: null });
// useEffect(() => {
// if (objectID) {
// setHowLongToBeat({ isLoading: true, data: null });
window.electron
.getHowLongToBeat(objectID, "steam", gameTitle)
.then((howLongToBeat) => {
setHowLongToBeat({ isLoading: false, data: howLongToBeat });
})
.catch(() => {
setHowLongToBeat({ isLoading: false, data: null });
});
}
}, [objectID, gameTitle]);
// window.electron
// .getHowLongToBeat(objectID, "steam", gameTitle)
// .then((howLongToBeat) => {
// setHowLongToBeat({ isLoading: false, data: howLongToBeat });
// })
// .catch(() => {
// setHowLongToBeat({ isLoading: false, data: null });
// });
// }
// }, [objectID, gameTitle]);
return (
<aside className={styles.contentSidebar}>