Files
discord-decomp/modules/icymi/useSharedICYMILogic.tsx
T
2026-11-01 12:12:55 +02:00

258 lines
8.6 KiB
TypeScript

// Metro module 15355 (f15356).
import { useState, useEffect, useCallback, useMemo } from "react";
import ICYMIStore from "./ICYMIStore";
import { SCROLL_EVENT_THROTTLE_MS } from "./ICYMIConstants";
import useICYMIItems from "./useICYMIItems";
import { useStateFromStores, useStateFromStoresObject } from "../../_bundle/Module589";
import { ICYMIAnalytics } from "./ICYMIAnalytics";
import { NON_ELIGIBLE_SCROLL_ITEMS } from "./ICYMIItemTypes";
import usePrevValue from "../../hooks/usePrevValue";
import ICYMIActionCreators from "./ICYMIActionCreators";
import { getViewableFeedItemsArray, itemToType, customStatusToContentInventoryEntry, isItemNSFW } from "./ICYMIUtils";
import { typeToString, ICYMIItemTypes } from "./ICYMITypes";
import { useICYMIReloadHandler } from "./useICYMIReloadHandler";
export function useSharedICYMILogic({ showDot, notificationItem }) {
let stateFromStores2, stateFromStores3, stateFromStores4, setState2, lastScrollEventTimestamp, c21892_11, c21892_12, callback, callback2, callback3;
stateFromStores2 = void 0;
stateFromStores3 = void 0;
stateFromStores4 = void 0;
setState2 = void 0;
lastScrollEventTimestamp = void 0;
c21892_11 = void 0;
c21892_12 = void 0;
callback = void 0;
callback2 = void 0;
callback3 = void 0;
const [endVisible, setState] = useState(false);
const iCYMIItems = useICYMIItems();
const { unreadItems, readItems, allUnreadItemsHydrated } = iCYMIItems;
const stateFromStores = useStateFromStores([ICYMIStore], () => ICYMIStore.getVersion(), []);
stateFromStores2 = useStateFromStores([ICYMIStore], () => !(ICYMIStore.isFirstPageHydrated() && stateFromStores > 0));
useEffect(() => {
if (ICYMIStore.getLoadId() != null) {
ICYMIAnalytics.trackFeedShown({
homeSessionId: "gravity"
});
}
}, [stateFromStores]);
stateFromStores3 = useStateFromStores([ICYMIStore], () => ICYMIStore.isRefreshing(), []);
stateFromStores4 = useStateFromStores([ICYMIStore], () => ICYMIStore.isHydrating(), []);
let visibleItemIds;
[visibleItemIds, setState2] = useState([]);
const stateFromStoresObject = useStateFromStoresObject([ICYMIStore], () => ({
loadId: ICYMIStore.getLoadId(),
lastScrollEventTimestamp: ICYMIStore.lastScrollEvent()
}));
const loadId = stateFromStoresObject.loadId;
lastScrollEventTimestamp = stateFromStoresObject.lastScrollEventTimestamp;
const r77 = visibleItemIds.filter((visibleItemId) => !NON_ELIGIBLE_SCROLL_ITEMS.has(visibleItemId.item.data.kind)).map((item) => item.item.id).pop();
c21892_11 = r77;
const prevValue = usePrevValue(r77);
c21892_12 = prevValue;
useEffect(() => {
if (!stateFromStores3 && !stateFromStores2) {
if (c21892_12 != null) {
if (c21892_11 != null && c21892_11 !== c21892_12) {
const r5 = Date.now();
if (r5 - lastScrollEventTimestamp > SCROLL_EVENT_THROTTLE_MS) {
ICYMIActionCreators.gravityScrollEvent(r5);
ICYMIAnalytics.trackFeedFirstScrollStarted();
}
}
}
}
}, [stateFromStores3, lastScrollEventTimestamp, prevValue, r77, loadId, stateFromStores2]);
callback = useCallback(({ viewableItems }) => {
if (viewableItems.some((viewableItem) => viewableItem.item.data.kind === "end")) {
setState(true);
}
if (viewableItems.length !== 0) {
setState2(viewableItems);
const r11 = [];
const viewableFeedItemsArray = getViewableFeedItemsArray(viewableItems);
let r34 = Date.now();
let r0 = viewableFeedItemsArray.length - 1;
while (0 <= r0) {
const r18 = viewableFeedItemsArray[r0];
const r1 = r0;
const r13 = r34;
let r37 = r13;
if (r18 != null) {
const r14 = {
id: r18.id,
type: typeToString(r18),
timestamp: null
};
const timestamp = +r13;
r37 = timestamp + 1;
r14.timestamp = timestamp;
r11.push(r14);
}
r0 = r1 - 1;
r34 = r37;
}
if (r11.length > 0) {
ICYMIActionCreators.ackGravityItems(r11, true);
}
ICYMIAnalytics.trackItemShortImpression(viewableItems, viewableFeedItemsArray.map((item) => ({
id: item.id,
type: typeToString(item)
})), stateFromStores);
}
}, [stateFromStores, setState]);
callback2 = useCallback(({ viewableItems }) => {
if (viewableItems.length !== 0) {
ICYMIAnalytics.trackItemLongImpression(viewableItems, getViewableFeedItemsArray(viewableItems).map((item) => ({
id: item.id,
type: typeToString(item)
})), stateFromStores);
ICYMIActionCreators.triggerItemsLongImpression(viewableItems.filter((viewableItem) => !NON_ELIGIBLE_SCROLL_ITEMS.has(viewableItem.item.data.kind)).map(({ item, index }) => {
const r6 = {
itemId: item.id,
itemType: itemToType(item),
triggerType: "list",
itemFeedIndex: index,
itemScore: null,
itemChannelType: null,
isInitiallyVisible: false
};
let score = item.score;
if (score == null) {
score = null;
}
r6.itemScore = score;
let channelType = item.channelType;
if (channelType == null) {
channelType = null;
}
r6.itemChannelType = channelType;
return r6;
}));
}
}, [stateFromStores]);
callback3 = useCallback((a0) => {
ICYMIActionCreators.startItemsDwell(a0.viewableItems.filter((viewableItem) => !NON_ELIGIBLE_SCROLL_ITEMS.has(viewableItem.item.data.kind)).map(({ item, index }) => {
const r6 = {
itemId: item.id,
itemType: itemToType(item),
triggerType: "list",
itemFeedIndex: index,
itemScore: null,
itemChannelType: null,
isInitiallyVisible: false
};
let score = item.score;
if (score == null) {
score = null;
}
r6.itemScore = score;
let channelType = item.channelType;
if (channelType == null) {
channelType = null;
}
r6.itemChannelType = channelType;
return r6;
}));
}, []);
const memo = useMemo(() => [{
viewabilityConfig: {
waitForInteraction: false,
viewAreaCoveragePercentThreshold: 100,
minimumViewTime: 50
},
onViewableItemsChanged: callback
}, {
viewabilityConfig: {
waitForInteraction: false,
viewAreaCoveragePercentThreshold: 50,
minimumViewTime: 1000
},
onViewableItemsChanged: callback2
}, {
viewabilityConfig: {
waitForInteraction: false,
viewAreaCoveragePercentThreshold: 50,
minimumViewTime: 50
},
onViewableItemsChanged: callback3
}], [callback, callback2, callback3]);
useEffect(() => {
ICYMIActionCreators.openICYMITab();
}, []);
const iCYMIReloadHandler = useICYMIReloadHandler(showDot);
const memo2 = useMemo(() => {
const data = [];
let c28006_0 = data;
if ((stateFromStores2 ? notificationItem != null : stateFromStores2) && notificationItem.type === ICYMIItemTypes.CUSTOM_STATUS) {
data.push({
id: notificationItem.id,
timestamp: Date.now(),
data: {
kind: "contentInventory",
content: customStatusToContentInventoryEntry(notificationItem).activity
},
score: notificationItem.score,
unread: true
});
}
if (stateFromStores2) {
data.push({
id: "loading",
timestamp: 0,
unread: false,
data: {
kind: "loading"
}
});
} else {
unreadItems.forEach((unreadItem) => {
if (!isItemNSFW(unreadItem)) {
c28006_0.push(unreadItem);
}
});
if (allUnreadItemsHydrated) {
data.push({
id: "end",
timestamp: 0,
unread: false,
data: {
kind: "end"
}
});
}
if (readItems.length > 0) {
readItems.forEach((readItem) => {
if (!isItemNSFW(readItem)) {
c28006_0.push(readItem);
}
});
}
if (stateFromStores4) {
data.push({
id: "bottomLoading",
timestamp: 0,
unread: false,
data: {
kind: "bottomLoading"
}
});
}
}
return {
data,
stickyHeaderIndices: []
};
}, [stateFromStores2, notificationItem, unreadItems, allUnreadItemsHydrated, readItems, stateFromStores4]);
return {
data: memo2.data,
loading: stateFromStores2,
version: stateFromStores,
visibleItemIds,
endVisible,
isRefreshing: stateFromStores3,
handleOnRefresh: iCYMIReloadHandler,
stickyHeaderIndices: memo2.stickyHeaderIndices,
viewabilityConfigCallbackPairs: memo
};
}