/* * 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 ErrorBoundary from "@components/ErrorBoundary"; import { LazyComponent } from "@utils/misc"; import { proxyLazy } from "@utils/proxyLazy"; import { formatDuration } from "@utils/text"; import { find, findByCode, findByPropsLazy, findLazy } from "@webpack"; import { moment, Parser, SnowflakeUtils, Text, Timestamp, Tooltip } from "@webpack/common"; import { Channel } from "discord-types/general"; enum SortOrderTypesTyping { LATEST_ACTIVITY = 0, CREATION_DATE = 1 } enum ForumLayoutTypesTyping { DEFAULT = 0, LIST = 1, GRID = 2 } interface DefaultReaction { emojiId: string | null; emojiName: string | null; } interface Tag { id: string; name: string; emojiId: string | null; emojiName: string | null; moderated: boolean; } interface ExtendedChannel extends Channel { defaultThreadRateLimitPerUser?: number; defaultSortOrder?: SortOrderTypesTyping | null; defaultForumLayout?: ForumLayoutTypesTyping; defaultReactionEmoji?: DefaultReaction | null; availableTags?: Array; } const ChatClasses = findByPropsLazy("chat", "chatContent"); const TagClasses = findLazy(m => typeof m.tags === "string" && Object.entries(m).length === 1); // Object exported with a single key called tags const ChannelTypes = findByPropsLazy("GUILD_TEXT", "GUILD_FORUM"); const SortOrderTypes = findLazy(m => typeof m.LATEST_ACTIVITY === "number"); const ForumLayoutTypes = findLazy(m => typeof m.LIST === "number"); const ChannelFlags = findLazy(m => typeof m.REQUIRE_TAG === "number"); const TagComponent = LazyComponent(() => find(m => { if (typeof m !== "function") return false; const code = Function.prototype.toString.call(m); // Get the component which doesn't include increasedActivity logic return code.includes(".Messages.FORUM_TAG_A11Y_FILTER_BY_TAG") && !code.includes("increasedActivityPill"); })); const EmojiComponent = LazyComponent(() => findByCode('.jumboable?"jumbo":"default"')); const ChannelTypesToChannelNames = proxyLazy(() => ({ [ChannelTypes.GUILD_TEXT]: "text", [ChannelTypes.GUILD_ANNOUNCEMENT]: "announcement", [ChannelTypes.GUILD_FORUM]: "forum" })); const SortOrderTypesToNames = proxyLazy(() => ({ [SortOrderTypes.LATEST_ACTIVITY]: "Latest activity", [SortOrderTypes.CREATION_DATE]: "Creation date" })); const ForumLayoutTypesToNames = proxyLazy(() => ({ [ForumLayoutTypes.DEFAULT]: "Not set", [ForumLayoutTypes.LIST]: "List view", [ForumLayoutTypes.GRID]: "Gallery view" })); // 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: ExtendedChannel; }) { const { type, topic, lastMessageId, defaultForumLayout, lastPinTimestamp, defaultAutoArchiveDuration, availableTags, id: channelId, rateLimitPerUser, defaultThreadRateLimitPerUser, defaultSortOrder, defaultReactionEmoji } = channel; return (
This is a hidden {ChannelTypesToChannelNames[type]} channel. {channel.isNSFW() && {({ onMouseLeave, onMouseEnter }) => ( )} }
You can not see the {channel.isForumChannel() ? "posts" : "messages"} of this channel. {channel.isForumChannel() && topic && topic.length > 0 && "However you may see its guidelines:"} {channel.isForumChannel() && topic && topic.length > 0 && (
{Parser.parseTopic(topic, false, { channelId })}
)} {lastMessageId && Last {channel.isForumChannel() ? "post" : "message"} created: } {lastPinTimestamp && Last message pin: } {(rateLimitPerUser ?? 0) > 0 && Slowmode: {formatDuration(rateLimitPerUser! * 1000)} } {(defaultThreadRateLimitPerUser ?? 0) > 0 && Default thread slowmode: {formatDuration(defaultThreadRateLimitPerUser! * 1000)} } {(defaultAutoArchiveDuration ?? 0) > 0 && Default inactivity duration before archiving {channel.isForumChannel() ? "posts" : "threads"}: {formatDuration(defaultAutoArchiveDuration! * 1000 * 60)} } {defaultForumLayout != null && Default layout: {ForumLayoutTypesToNames[defaultForumLayout]} } {defaultSortOrder != null && Default sort order: {SortOrderTypesToNames[defaultSortOrder]} } {defaultReactionEmoji != null &&
Default reaction emoji:
} {channel.hasFlag(ChannelFlags.REQUIRE_TAG) && Posts on this forum require a tag to be set. } {availableTags && availableTags.length > 0 &&
Available tags:
{availableTags.map(tag => )}
}
); } export default ErrorBoundary.wrap(HiddenChannelLockScreen);