{channelGroups.map((group) => {
const isCollapsed = group.category ? collapsedCategories.has(group.category.id) : false;
const isNullSpace = !group.category;
const selectedTextChannels = group.textChannels.filter((ch) =>
location.pathname.startsWith(`/channels/${guild.id}/${ch.id}`),
);
const selectedVoiceChannels = group.voiceChannels.filter((ch) =>
location.pathname.startsWith(`/channels/${guild.id}/${ch.id}`),
);
const unreadTextChannels = group.textChannels.filter((ch) => {
const unreadCount = ReadStateStore.getUnreadCount(ch.id);
const mentionCount = ReadStateStore.getMentionCount(ch.id);
return unreadCount > 0 || mentionCount > 0;
});
const unreadVoiceChannels = group.voiceChannels.filter((ch) => {
const unreadCount = ReadStateStore.getUnreadCount(ch.id);
const mentionCount = ReadStateStore.getMentionCount(ch.id);
return unreadCount > 0 || mentionCount > 0;
});
const selectedTextIds = new Set(selectedTextChannels.map((ch) => ch.id));
const selectedVoiceIds = new Set(selectedVoiceChannels.map((ch) => ch.id));
const filteredTextChannels = hideMutedChannels
? group.textChannels.filter(
(ch) =>
selectedTextIds.has(ch.id) || !UserGuildSettingsStore.isGuildOrChannelMuted(guild.id, ch.id),
)
: group.textChannels;
const filteredVoiceChannels = hideMutedChannels
? group.voiceChannels.filter(
(ch) =>
selectedVoiceIds.has(ch.id) ||
ch.id === connectedChannelId ||
!UserGuildSettingsStore.isGuildOrChannelMuted(guild.id, ch.id),
)
: group.voiceChannels;
const visibleTextChannels = isCollapsed
? hideMutedChannels
? mergeUniqueById(filteredTextChannels.filter((ch) => selectedTextIds.has(ch.id)))
: mergeUniqueById([...selectedTextChannels, ...unreadTextChannels])
: filteredTextChannels;
let visibleVoiceChannels: typeof filteredVoiceChannels = filteredVoiceChannels;
if (isCollapsed) {
if (hideMutedChannels) {
const collapsedVoiceChannels: typeof filteredVoiceChannels = [];
if (connectedChannelId) {
const connected = filteredVoiceChannels.find((ch) => ch.id === connectedChannelId);
if (connected) collapsedVoiceChannels.push(connected);
}
for (const ch of filteredVoiceChannels) {
if (selectedVoiceIds.has(ch.id)) {
collapsedVoiceChannels.push(ch);
}
}
visibleVoiceChannels = mergeUniqueById(collapsedVoiceChannels);
} else {
visibleVoiceChannels = mergeUniqueById([...selectedVoiceChannels, ...unreadVoiceChannels]);
}
}
if (isNullSpace && filteredTextChannels.length === 0 && filteredVoiceChannels.length === 0) {
return null;
}
if (
hideMutedChannels &&
group.category &&
filteredTextChannels.length === 0 &&
filteredVoiceChannels.length === 0
) {
return null;
}
const connectedChannelInGroup =
isCollapsed && connectedChannelId
? filteredVoiceChannels.some((vc) => vc.id === connectedChannelId)
: false;
if (isCollapsed && connectedChannelInGroup && connectedChannelId) {
const hasIt = visibleVoiceChannels.some((c) => c.id === connectedChannelId);
if (!hasIt) {
const connected = filteredVoiceChannels.find((c) => c.id === connectedChannelId);
if (connected) visibleVoiceChannels = [connected, ...visibleVoiceChannels];
} else {
visibleVoiceChannels = [
...visibleVoiceChannels.filter((c) => c.id === connectedChannelId),
...visibleVoiceChannels.filter((c) => c.id !== connectedChannelId),
];
}
}
const showTextChannels = !isCollapsed || visibleTextChannels.length > 0;
const showVoiceChannels = !isCollapsed || visibleVoiceChannels.length > 0;
return (
{group.category && (
toggleCategory(group.category!.id)}
isDraggingAnything={isDraggingAnything}
activeDragItem={activeDragItem}
onChannelDrop={handleChannelDrop}
onDragStateChange={setActiveDragItem}
/>
)}
{isCollapsed && group.category && !connectedChannelInGroup && (
)}
{showTextChannels &&
visibleTextChannels.map((ch) => (
))}
{showVoiceChannels &&
visibleVoiceChannels.map((ch) => {
const channelRow = (
);
if (isCollapsed && connectedChannelId && ch.id === connectedChannelId) {
return (
{channelRow}
);
}
return (
{channelRow}
{!isCollapsed && }
);
})}
);
})}