Files
discord-decomp/modules/wishlists/hooks/useWishlistRecommendations.tsx
T
2026-11-01 12:12:55 +02:00

281 lines
11 KiB
TypeScript

// Metro module 9749 (f9750).
import _slicedToArray from "../../../_bundle/_slicedToArray";
import { useMemo, useEffect } from "react";
import UserProfileStore from "../../user_profile/UserProfileStore";
import AuthenticationStore from "../../../stores/AuthenticationStore";
import WishlistRecommendationsStore from "../WishlistRecommendationsStore";
import WishlistRecommendationRecord, { WishlistRecommendationReason } from "../records/WishlistRecommendationRecord";
import Durations from "../../../utils/Durations";
import { useStateFromStores, useStateFromStoresObject, useStateFromStoresArray } from "../../../_bundle/Module589";
import { WishlistFetchSource, useFetchWishlists } from "./useWishlistHooks";
import { isNotNullish } from "../../../utils/GlobalUtils";
import WishlistActionCreators from "../WishlistActionCreators";
import { uniq } from "../../../_bundle/Module12";
import { useGetOrFetchStorefrontPricesForSkuIds } from "../../storefront/hooks/useGetOrFetchStorefrontPrices";
import maybeFetchUserProfile from "../../user_profile/maybeFetchUserProfile";
import { useWishlistApplicationIds } from "./useWishlistApplicationIds.native";
import { useWishlistSkuFilter } from "./useWishlistSkuFilter.native";
function $mk83234($env) {
return () => {
const r1 = $env.$parent;
(0, r1[1])(r1[2][13])($env[0]);
};
}
function $mk83235($env) {
return () => ({
defaultWishlistId: $env.$parent[5].getFirstWishlistId($env[0])
});
}
function $mk83236($env) {
return () => {
const r0 = $env;
return [{
userId: r0[0],
wishlistId: r0[1]
}];
};
}
let c6459_9, c6459_10;
let env6459 = {};
const useWishlistRecommendationsWithWishlists = function useWishlistRecommendationsWithWishlists({ userIdsAndWishlistIds, numItems: numItems4, applicationIds: applicationIds3, source = WishlistFetchSource.USER_PROFILE, filterByApplicationIds = false }) {
let c17452_1, memo, memo2, memo3, isFetching, errors, filteredRecommendations, skusToUserAndReasonRecommendations, combinedSkus;
let numItems, applicationIds;
c17452_1 = void 0;
memo = void 0;
memo2 = void 0;
memo3 = void 0;
isFetching = void 0;
errors = void 0;
filteredRecommendations = void 0;
skusToUserAndReasonRecommendations = void 0;
combinedSkus = void 0;
const memo4 = useMemo(() => userIdsAndWishlistIds.map((userIdsAndWishlistId) => userIdsAndWishlistId.userId), [userIdsAndWishlistIds]);
numItems = numItems4;
applicationIds = applicationIds3;
const stateFromStores2 = useStateFromStores([WishlistRecommendationsStore], () => WishlistRecommendationsStore.getRecommendations(memo4, applicationIds));
useEffect(() => {
if (memo4.length !== 0 && applicationIds.length !== 0) {
const recommendations2 = WishlistRecommendationsStore.getRecommendations(memo4, applicationIds);
if (recommendations2 != null) {
if (recommendations2.state === "loading") {
return void 0;
}
const r2 = recommendations2.fetchedAt < Date.now() - c6459_9;
const r24 = recommendations2.state === "success" && recommendations2.data.skus.length >= numItems;
if (!r2 && r24) {
return void 0;
}
}
WishlistActionCreators.fetchWishlistRecommendations(applicationIds, memo4, numItems);
}
}, [memo4, applicationIds, numItems]);
const r37 = memo4.length !== 0 ? applicationIds.length === 0 ? c6459_10 : stateFromStores2 : c6459_10;
c17452_1 = r37;
const r38 = filterByApplicationIds ? applicationIds : void 0;
let wishlists, memo5, memo6;
const applicationIds2 = r38;
const stateFromStores = useStateFromStores([AuthenticationStore], () => AuthenticationStore.getId());
const fetchWishlists = useFetchWishlists({
wishlistIdsAndUsers: userIdsAndWishlistIds,
source
});
wishlists = fetchWishlists.wishlists;
const { isFetching: isFetching2, errors: errors2 } = fetchWishlists;
memo5 = useMemo(() => {
const r32 = wishlists.filter(isNotNullish);
const r33 = {};
for (const item of r32) {
for (const item2 of item.items) {
if (!(item2.sku == null || item2.isOwned || applicationIds2 != null && !applicationIds2.includes(item2.sku.applicationId))) {
const skuId = item2.skuId;
const r60 = {
...r33[item2.skuId] != null ? r33[item2.skuId] : {}
};
r60[item.userId] = WishlistRecommendationReason.WISHLIST;
r33[skuId] = r60;
}
}
}
return r33;
}, [wishlists, applicationIds2]);
memo6 = useMemo(() => Object.fromEntries(wishlists.filter(isNotNullish).flatMap((item) => item.items).filter((item) => item != null && item.sku != null && !item.isOwned && (applicationIds2 == null || applicationIds2.includes(item.sku.applicationId))).map((item) => [item.skuId, item.sku])), [wishlists, applicationIds2]);
memo = useMemo(() => Object.keys(memo6).sort((a, b) => {
let r5 = memo5[b];
if (r5 == null) {
r5 = {};
}
let r6 = memo5[a];
if (r6 == null) {
r6 = {};
}
const r17 = Object.keys(r5).length - Object.keys(r6).length;
const r18 = r6;
if (r17 !== 0) {
return r17;
}
const r23 = Boolean(r5[stateFromStores]);
return Number(Boolean(r18[stateFromStores])) - Number(r23);
}).map((item) => memo6[item]), [stateFromStores, memo6, memo5]);
memo2 = memo6;
memo3 = memo5;
isFetching = isFetching2;
errors = errors2;
const memo8 = useMemo(() => c17452_1 != null && c17452_1.state === "success" ? {
filteredRecommendations: c17452_1.data.skus.filter((sku) => !(sku.id in memo2)),
skusToUserAndReasonRecommendations: c17452_1.data.skusToUserAndReason
} : {
filteredRecommendations: [],
skusToUserAndReasonRecommendations: {}
}, [r37, memo6]);
filteredRecommendations = memo8.filteredRecommendations;
skusToUserAndReasonRecommendations = memo8.skusToUserAndReasonRecommendations;
const memo9 = useMemo(() => {
const combinedSkusToUserAndReason = {
...skusToUserAndReasonRecommendations
};
for (const item of Object.entries(memo3)) {
const r33 = _slicedToArray(item, 2);
const r34 = r33[0];
combinedSkusToUserAndReason[r34] = {
...combinedSkusToUserAndReason[r34],
...r33[1]
};
}
return {
combinedSkus: [...memo, ...filteredRecommendations],
combinedSkusToUserAndReason
};
}, [memo, filteredRecommendations, memo5, skusToUserAndReasonRecommendations]);
combinedSkus = memo9.combinedSkus;
const combinedSkusToUserAndReason = memo9.combinedSkusToUserAndReason;
const memo10 = useMemo(() => {
let r3;
L8: {
r3 = "loading";
if (!isFetching) {
const r2 = c17452_1 == null;
r3 = "loading";
if (!r2) {
if (c17452_1 != null) {
const state = c17452_1.state;
r3 = "loading";
if (state === "loading") {
break L8;
}
}
r3 = errors.filter(isNotNullish).length > 0 ? "error" : c17452_1.state === "error" ? "error" : "success";
}
}
}
return r3;
}, [isFetching, r37, errors]);
useGetOrFetchStorefrontPricesForSkuIds({
skuIds: useMemo(() => uniq([...filteredRecommendations.map((filteredRecommendation) => filteredRecommendation.id), ...combinedSkus.map((combinedSku) => combinedSku.id)]), [filteredRecommendations, combinedSkus])
});
return {
recommendations: filteredRecommendations,
wishlistAndRecommendations: combinedSkus,
skusToUserAndReason: combinedSkusToUserAndReason,
status: memo10
};
};
c6459_9 = 30 * Durations.Millis.MINUTE;
c6459_10 = {
state: "success",
data: new WishlistRecommendationRecord({
skus: [],
skus_to_user_and_reason: {},
applications: []
}),
fetchedAt: 0
};
export function useWishlistRecommendationsForSingleUser({ userId, numItems: numItems4, source = WishlistFetchSource.USER_PROFILE }) {
let env17455;
const r6 = env17455 = {
$parent: env6459
};
env17455[0] = userId;
useEffect($mk83234(r6), [userId]);
const defaultWishlistId = useStateFromStoresObject([UserProfileStore], $mk83235(r6)).defaultWishlistId;
env17455[1] = defaultWishlistId;
const wishlistRecommendationsWithWishlists = useWishlistRecommendationsWithWishlists({
userIdsAndWishlistIds: useMemo($mk83236(r6), [userId, defaultWishlistId]),
applicationIds: useWishlistApplicationIds(userId),
numItems: numItems4,
source
});
const { wishlistAndRecommendations: wishlistAndRecommendations2, skusToUserAndReason, status } = wishlistRecommendationsWithWishlists;
const wishlistSkuFilter = useWishlistSkuFilter({
wishlistAndRecommendations: wishlistAndRecommendations2,
skusToUserAndReason,
userId,
numItems: numItems4
});
return {
wishlistAndRecommendations: wishlistSkuFilter.slicedWishlistAndRecommendations,
skusToUserAndReason,
status,
defaultWishlistId,
totalUnownedWishlistItemCount: wishlistSkuFilter.totalUnownedWishlistItemCount
};
}
export function useRecommendationsForApplicationIds({ applicationIds: applicationIds3, userIds, numItems: numItems2, source = WishlistFetchSource.USER_PROFILE }) {
let wishlistAndRecommendations;
let stateFromStoresArray;
wishlistAndRecommendations = void 0;
const memo7 = useMemo(() => userIds == null ? void 0 : userIds.slice(0, 5), [userIds]);
stateFromStoresArray = void 0;
useEffect(() => {
memo7.forEach((item) => {
maybeFetchUserProfile(item);
});
}, [memo7]);
stateFromStoresArray = useStateFromStoresArray([UserProfileStore], () => memo7.map((item) => {
let r5 = UserProfileStore.getFirstWishlistId(item);
if (r5 == null) {
r5 = null;
}
return r5;
}));
const r39 = useWishlistRecommendationsWithWishlists({
userIdsAndWishlistIds: useMemo(() => memo7.map((item, index) => ({
userId: item,
wishlistId: stateFromStoresArray[index]
})), [memo7, stateFromStoresArray]),
applicationIds: applicationIds3,
numItems: numItems2,
source,
filterByApplicationIds: true
});
wishlistAndRecommendations = r39.wishlistAndRecommendations;
const { skusToUserAndReason, status } = r39;
return {
recommendations: useMemo(() => wishlistAndRecommendations.slice(0, numItems2), [wishlistAndRecommendations, numItems2]),
skusToUserAndReason,
status
};
}
export function useRecommendationsForSingleUser({ userId, numItems: numItems3, source = WishlistFetchSource.USER_PROFILE }) {
let env17459;
const r11 = env17459 = {
$parent: env6459
};
env17459[0] = userId;
env17459[1] = void 0;
useEffect($mk83234(r11), [userId]);
const defaultWishlistId = useStateFromStoresObject([UserProfileStore], $mk83235(r11)).defaultWishlistId;
env17459[1] = defaultWishlistId;
const r39 = useWishlistRecommendationsWithWishlists({
userIdsAndWishlistIds: useMemo($mk83236(r11), [userId, defaultWishlistId]),
applicationIds: useWishlistApplicationIds(userId),
numItems: numItems3,
source
});
const { recommendations, skusToUserAndReason, status } = r39;
return {
recommendations: useMemo(() => recommendations.slice(0, numItems3), [recommendations, numItems3]),
skusToUserAndReason,
status
};
}