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

135 lines
5.5 KiB
TypeScript

// Metro module 15200 (f15201).
import { useMemo, useRef, useState, useEffect } from "react";
import ChannelRTCStore from "../calls/ChannelRTCStore";
import VoiceStateRecord from "../../records/VoiceStateRecord";
import AuthenticationStore from "../../stores/AuthenticationStore";
import ChannelStore from "../../stores/ChannelStore";
import GuildMemberStore from "../../stores/GuildMemberStore";
import RTCConnectionDesyncStore from "../../stores/RTCConnectionDesyncStore";
import RTCConnectionStore from "../../stores/RTCConnectionStore";
import UserStore from "../../stores/UserStore";
import VoiceStateStore from "../../stores/VoiceStateStore";
import { sortedIndexBy } from "../../_bundle/Module12";
import { useStateFromStores, useStateFromStoresArray } from "../../_bundle/Module589";
import { isNotNullish } from "../../utils/GlobalUtils";
import { sortKey } from "../calls/ChannelRTCParticipants";
function $mk95679($env) {
return () => {
const r3 = $env[0];
const r1 = $env.$parent;
return r3 === r1[10].getChannelId() ? r1[9].getDesyncedParticipants() : null;
};
}
let env10790 = {};
export function useEnsureSyncedChannelVoiceStates(c21755_0, a1) {
let stateFromStoresArray, stateFromStoresArray2, stateFromStores2, memo;
let c21755_1 = a1;
const stateFromStores = useStateFromStores([RTCConnectionDesyncStore, RTCConnectionStore], () => c21755_0 === RTCConnectionStore.getChannelId() ? RTCConnectionDesyncStore.getDesyncedVoiceStates() : null);
stateFromStoresArray = useStateFromStoresArray([ChannelRTCStore], () => c21755_0 == null ? [] : [...ChannelRTCStore.getGuildRingingUsers(c21755_0)]);
stateFromStoresArray2 = useStateFromStoresArray([UserStore], () => stateFromStoresArray.map((item) => UserStore.getUser(item)).filter(isNotNullish));
stateFromStores2 = useStateFromStores([ChannelStore], () => ChannelStore.getBasicChannel(c21755_0));
memo = useMemo(() => stateFromStoresArray2.map((item) => ({
voiceState: new VoiceStateRecord(item.id),
user: item,
member: stateFromStores2?.guild_id != null ? GuildMemberStore.getMember(stateFromStores2?.guild_id, item.id) : null,
nick: item.globalName,
comparator: item.globalName,
_isPlaceholder: false
})), [stateFromStoresArray2, stateFromStores2?.guild_id]);
return useMemo(() => (function syncChannelVoiceStates(a0, a1, a2) {
if (!(a0 != null && a0.length !== 0) && a2.length === 0) {
return a1;
}
const r26 = [];
let c30853_0 = r26;
const set = new Set();
let c30853_1 = set;
for (const item of a1) {
r26.push(item);
set.add(item.user.id);
}
if (a0 != null) {
a0.forEach((item) => {
c30853_0.splice(sortedIndexBy(c30853_0, item, (a0) => a0.comparator), 0, item);
});
}
if (a2.length > 0) {
a2.forEach((item) => {
if (!c30853_1.has(item.user.id)) {
c30853_0.splice(sortedIndexBy(c30853_0, item, (a0) => a0.comparator), 0, item);
}
});
}
return r26;
})(stateFromStores, c21755_1, memo), [stateFromStores, a1, memo]);
}
export function useDesyncedChannelParticipants(a0) {
let env21754;
const r1 = env21754 = {
$parent: env10790
};
env21754[0] = a0;
return useStateFromStores([RTCConnectionDesyncStore, RTCConnectionStore], $mk95679(r1));
}
export function useEnsureSyncedChannelParticipants(a0, a1) {
let env21757;
const r3 = env21757 = {
$parent: env10790
};
env21757[0] = a0;
const stateFromStores3 = useStateFromStores([RTCConnectionDesyncStore, RTCConnectionStore], $mk95679(r3));
return useMemo(() => {
let r10 = a1;
if (stateFromStores3 != null) {
const length = stateFromStores3.length;
r10 = a1;
if (length !== 0) {
const r12 = [...a1];
let c27962_0 = r12;
stateFromStores3.forEach((item) => {
c27962_0.splice(sortedIndexBy(c27962_0, item, (a0) => sortKey(a0)), 0, item);
});
r10 = r12;
}
}
return r10;
}, [stateFromStores3, a1]);
}
export function useIsRTCDisconnectedUIVisible(a0, c21758_1) {
let stateFromStores4, ref, stateFromStores5, stateFromStores6;
const stateFromStores7 = useStateFromStores([AuthenticationStore], () => AuthenticationStore.getId() === c21758_1);
stateFromStores4 = useStateFromStores([RTCConnectionStore], () => RTCConnectionStore.getChannelId());
ref = useRef(null);
const [state, setState] = useState(false);
const [state2, setState2] = useState(false);
stateFromStores5 = useStateFromStores([RTCConnectionStore, VoiceStateStore], () => c21758_1 != null && a0 != null && RTCConnectionStore.getChannelId() === a0 && VoiceStateStore.isInChannel(a0, c21758_1) != null && RTCConnectionStore.isUserConnected(c21758_1));
stateFromStores6 = useStateFromStores([RTCConnectionStore, VoiceStateStore], () => c21758_1 != null && a0 != null && RTCConnectionStore.getChannelId() === a0 && VoiceStateStore.isInChannel(a0, c21758_1) != null && !RTCConnectionStore.isUserConnected(c21758_1));
useEffect(() => {
if (stateFromStores5) {
setState2(true);
}
}, [stateFromStores5]);
useEffect(() => {
if (stateFromStores4 !== a0) {
setState2(false);
}
}, [a0, stateFromStores4]);
useEffect(() => {
if (stateFromStores6 && ref.current == null) {
ref.current = setTimeout(() => {
ref.current = null;
setState(true);
}, 250);
} else {
clearTimeout(ref.current);
ref.current = null;
setState(false);
}
return () => {
clearTimeout(ref.current);
ref.current = null;
};
}, [stateFromStores6]);
return (stateFromStores7 ? !stateFromStores7 : state2) && state;
}