/* * Vencord, a modification for Discord's desktop app * Copyright (c) 2022 Vendicated and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { isPluginEnabled } from "@api/PluginManager"; import { Settings } from "@api/Settings"; import { BaseText } from "@components/BaseText"; import ErrorBoundary from "@components/ErrorBoundary"; import PermissionsViewerPlugin from "@plugins/permissionsViewer"; import openRolesAndUsersPermissionsModal from "@plugins/permissionsViewer/components/RolesAndUsersPermissions"; import { sortPermissionOverwrites } from "@plugins/permissionsViewer/utils"; import { classes } from "@utils/misc"; import { formatDuration } from "@utils/text"; import { t } from "@utils/translation"; import type { Channel, RoleOrUserPermission } from "@vencord/discord-types"; import { findByPropsLazy, findComponentByCodeLazy, findCssClassesLazy } from "@webpack"; import { EmojiStore, FluxDispatcher, GuildMemberStore, GuildStore, Parser, PermissionsBits, PermissionStore, SnowflakeUtils, Timestamp, Tooltip, useEffect, useState } from "@webpack/common"; import { ComponentType } from "react"; import { cl, settings } from ".."; const enum SortOrderTypes { LATEST_ACTIVITY = 0, CREATION_DATE = 1 } const enum ForumLayoutTypes { DEFAULT = 0, LIST = 1, GRID = 2 } interface DefaultReaction { emojiId: string | null; emojiName: string | null; } const enum ChannelTypes { GUILD_TEXT = 0, GUILD_VOICE = 2, GUILD_ANNOUNCEMENT = 5, GUILD_STAGE_VOICE = 13, GUILD_FORUM = 15 } const enum VideoQualityModes { AUTO = 1, FULL = 2 } const enum ChannelFlags { PINNED = 1 << 1, REQUIRE_TAG = 1 << 4 } const ChatScrollClasses = findCssClassesLazy("auto", "managedReactiveScroller", "customTheme"); const TagComponent = findComponentByCodeLazy("#{intl::FORUM_TAG_A11Y_FILTER_BY_TAG}"); let ChannelBeginHeader: ComponentType = () => null; export const setChannelBeginHeader = v => ChannelBeginHeader = v; const EmojiParser = findByPropsLazy("convertSurrogateToName"); const EmojiUtils = findByPropsLazy("getURL", "getEmojiColors"); const getChannelTypeName = (type: number) => { switch (type) { case ChannelTypes.GUILD_TEXT: return t("vencord.showHiddenChannels.channelTypes.text"); case ChannelTypes.GUILD_ANNOUNCEMENT: return t("vencord.showHiddenChannels.channelTypes.announcement"); case ChannelTypes.GUILD_FORUM: return t("vencord.showHiddenChannels.channelTypes.forum"); case ChannelTypes.GUILD_VOICE: return t("vencord.showHiddenChannels.channelTypes.voice"); case ChannelTypes.GUILD_STAGE_VOICE: return t("vencord.showHiddenChannels.channelTypes.stage"); default: return t("vencord.showHiddenChannels.channelTypes.text"); } }; const getSortOrderName = (order: number) => { switch (order) { case SortOrderTypes.LATEST_ACTIVITY: return t("vencord.showHiddenChannels.sortOrders.latestActivity"); case SortOrderTypes.CREATION_DATE: return t("vencord.showHiddenChannels.sortOrders.creationDate"); default: return t("vencord.showHiddenChannels.sortOrders.latestActivity"); } }; const getForumLayoutName = (layout: number) => { switch (layout) { case ForumLayoutTypes.DEFAULT: return t("vencord.showHiddenChannels.forumLayouts.notSet"); case ForumLayoutTypes.LIST: return t("vencord.showHiddenChannels.forumLayouts.listView"); case ForumLayoutTypes.GRID: return t("vencord.showHiddenChannels.forumLayouts.galleryView"); default: return t("vencord.showHiddenChannels.forumLayouts.notSet"); } }; const getVideoQualityModeName = (mode: number) => { switch (mode) { case VideoQualityModes.AUTO: return t("vencord.showHiddenChannels.videoQuality.automatic"); case VideoQualityModes.FULL: return t("vencord.showHiddenChannels.videoQuality.720p"); default: return t("vencord.showHiddenChannels.videoQuality.automatic"); } }; // Icon from the modal when clicking a message link you don't have access to view const HiddenChannelLogo = "/assets/433e3ec4319a9d11b0cbe39342614982.svg"; function HiddenChannelLockScreen({ channel }: { channel: Channel; }) { const { defaultAllowedUsersAndRolesDropdownState } = settings.use(["defaultAllowedUsersAndRolesDropdownState"]); const [permissions, setPermissions] = useState([]); const { type, topic, lastMessageId, defaultForumLayout, lastPinTimestamp, defaultAutoArchiveDuration, availableTags, id: channelId, rateLimitPerUser, defaultThreadRateLimitPerUser, defaultSortOrder, defaultReactionEmoji, bitrate, rtcRegion, videoQualityMode, permissionOverwrites, guild_id } = channel; useEffect(() => { const membersToFetch: Array = []; const guildOwnerId = GuildStore.getGuild(guild_id)?.ownerId; if (!GuildMemberStore.getMember(guild_id, guildOwnerId)) membersToFetch.push(guildOwnerId); Object.values(permissionOverwrites).forEach(({ type, id: userId }) => { if (type === 1 && !GuildMemberStore.getMember(guild_id, userId)) { membersToFetch.push(userId); } }); if (membersToFetch.length > 0) { FluxDispatcher.dispatch({ type: "GUILD_MEMBERS_REQUEST", guildIds: [guild_id], userIds: membersToFetch }); } if (Settings.plugins.PermissionsViewer.enabled) { setPermissions(sortPermissionOverwrites(Object.values(permissionOverwrites).map(overwrite => ({ type: overwrite.type, id: overwrite.id, overwriteAllow: overwrite.allow, overwriteDeny: overwrite.deny })), guild_id)); } }, [channelId]); return (
{!PermissionStore.can(PermissionsBits.VIEW_CHANNEL, channel) ? t("showHiddenChannels.hiddenChannel", { type: getChannelTypeName(type) }) : t("showHiddenChannels.lockedChannel", { type: getChannelTypeName(type) })} {channel.isNSFW() && {({ onMouseLeave, onMouseEnter }) => ( )} }
{(!channel.isGuildVoice() && !channel.isGuildStageVoice()) && ( {t("showHiddenChannels.cannotSeeMessages", { type: channel.isForumChannel() ? t("vencord.showHiddenChannels.channelTypes.posts") : t("vencord.showHiddenChannels.channelTypes.messages") })} {channel.isForumChannel() && topic && topic.length > 0 && ` ${t("vencord.showHiddenChannels.seeGuidelines")}`} )} {channel.isForumChannel() && topic && topic.length > 0 && (
{Parser.parseTopic(topic, false, { channelId })}
)} {lastMessageId && {t("showHiddenChannels.lastMessageCreated", { type: channel.isForumChannel() ? t("vencord.showHiddenChannels.channelTypes.post") : t("vencord.showHiddenChannels.channelTypes.message") })} } {lastPinTimestamp && {t("vencord.showHiddenChannels.lastMessagePin")} } {(rateLimitPerUser ?? 0) > 0 && {t("showHiddenChannels.slowmode", { duration: formatDuration(rateLimitPerUser!, "seconds") })} } {(defaultThreadRateLimitPerUser ?? 0) > 0 && {t("showHiddenChannels.threadSlowmode", { duration: formatDuration(defaultThreadRateLimitPerUser!, "seconds") })} } {((channel.isGuildVoice() || channel.isGuildStageVoice()) && bitrate != null) && {t("showHiddenChannels.bitrate", { bitrate })} } {rtcRegion !== undefined && {t("showHiddenChannels.region", { region: rtcRegion ?? t("vencord.showHiddenChannels.regionAutomatic") })} } {(channel.isGuildVoice() || channel.isGuildStageVoice()) && {t("showHiddenChannels.videoQualityMode", { mode: getVideoQualityModeName(videoQualityMode ?? VideoQualityModes.AUTO) })} } {(defaultAutoArchiveDuration ?? 0) > 0 && {t("showHiddenChannels.archiveDuration", { type: channel.isForumChannel() ? t("vencord.showHiddenChannels.channelTypes.posts") : t("vencord.showHiddenChannels.channelTypes.threads"), duration: formatDuration(defaultAutoArchiveDuration!, "minutes") })} } {defaultForumLayout != null && {t("showHiddenChannels.defaultLayout", { layout: getForumLayoutName(defaultForumLayout) })} } {defaultSortOrder != null && {t("showHiddenChannels.defaultSortOrder", { order: getSortOrderName(defaultSortOrder) })} } {defaultReactionEmoji != null &&
{t("vencord.showHiddenChannels.defaultReactionEmoji")} {Parser.defaultRules[defaultReactionEmoji.emojiName ? "emoji" : "customEmoji"].react({ name: defaultReactionEmoji.emojiName ? EmojiParser.convertSurrogateToName(defaultReactionEmoji.emojiName) : EmojiStore.getCustomEmojiById(defaultReactionEmoji.emojiId)?.name ?? "", emojiId: defaultReactionEmoji.emojiId ?? void 0, surrogate: defaultReactionEmoji.emojiName ?? void 0, src: defaultReactionEmoji.emojiName ? EmojiUtils.getURL(defaultReactionEmoji.emojiName) : void 0 }, void 0, { key: 0 })}
} {channel.hasFlag(ChannelFlags.REQUIRE_TAG) && {t("vencord.showHiddenChannels.requireTag")} } {availableTags && availableTags.length > 0 &&
{t("vencord.showHiddenChannels.availableTags")}
{availableTags.map(tag => )}
}
{isPluginEnabled(PermissionsViewerPlugin.name) && ( {({ onMouseLeave, onMouseEnter }) => ( )} )} {t("vencord.showHiddenChannels.allowedUsersAndRoles")} {({ onMouseLeave, onMouseEnter }) => ( )}
{defaultAllowedUsersAndRolesDropdownState && }
); } export default ErrorBoundary.wrap(HiddenChannelLockScreen);