From f689aa6d89ac4e36877e9c8f695f9b61fe7e2ca7 Mon Sep 17 00:00:00 2001
From: thororen1234 <78185467+thororen1234@users.noreply.github.com>
Date: Wed, 20 Aug 2025 12:32:06 -0400
Subject: [PATCH] HideMedia is back for now
---
src/plugins/hideAttachments/index.tsx | 105 +++++++++++++++++++++++++
src/plugins/hideAttachments/styles.css | 10 +++
2 files changed, 115 insertions(+)
create mode 100644 src/plugins/hideAttachments/index.tsx
create mode 100644 src/plugins/hideAttachments/styles.css
diff --git a/src/plugins/hideAttachments/index.tsx b/src/plugins/hideAttachments/index.tsx
new file mode 100644
index 000000000..94f3a86dd
--- /dev/null
+++ b/src/plugins/hideAttachments/index.tsx
@@ -0,0 +1,105 @@
+/*
+ * 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 "./styles.css";
+
+import { get, set } from "@api/DataStore";
+import { updateMessage } from "@api/MessageUpdater";
+import { migratePluginSettings } from "@api/Settings";
+import { ImageInvisible, ImageVisible } from "@components/Icons";
+import { Devs } from "@utils/constants";
+import { classes } from "@utils/misc";
+import definePlugin from "@utils/types";
+import { Message } from "@vencord/discord-types";
+import { ChannelStore } from "@webpack/common";
+
+const KEY = "HideMedia_HiddenIds";
+
+let hiddenMessages = new Set();
+
+async function getHiddenMessages() {
+ const stored = await get(KEY);
+ hiddenMessages = new Set(stored ?? []);
+ return hiddenMessages;
+}
+
+const saveHiddenMessages = (ids: Set) => set(KEY, [...ids]);
+
+migratePluginSettings("HideMedia", "HideAttachments");
+
+const hasMedia = (msg: Message) => msg.attachments.length > 0 || msg.embeds.length > 0 || msg.stickerItems.length > 0;
+
+export default definePlugin({
+ name: "HideMedia",
+ description: "Hide attachments and embeds for individual messages via hover button",
+ authors: [Devs.Ven],
+ dependencies: ["MessageUpdaterAPI"],
+
+ patches: [{
+ find: "this.renderAttachments(",
+ replacement: {
+ match: /(?<=\i=)this\.render(?:Attachments|Embeds|StickersAccessories)\((\i)\)/g,
+ replace: "$self.shouldHide($1?.id)?null:$&"
+ }
+ }],
+
+ renderMessagePopoverButton(msg) {
+ if (!hasMedia(msg) && !msg.messageSnapshots.some(s => hasMedia(s.message))) return null;
+
+ const isHidden = hiddenMessages.has(msg.id);
+
+ return {
+ label: isHidden ? "Show Media" : "Hide Media",
+ icon: isHidden ? ImageVisible : ImageInvisible,
+ message: msg,
+ channel: ChannelStore.getChannel(msg.channel_id),
+ onClick: () => this.toggleHide(msg.channel_id, msg.id)
+ };
+ },
+
+ renderMessageAccessory({ message }) {
+ if (!this.shouldHide(message.id)) return null;
+
+ return (
+
+ Media Hidden
+
+ );
+ },
+
+ async start() {
+ await getHiddenMessages();
+ },
+
+ stop() {
+ hiddenMessages.clear();
+ },
+
+ shouldHide(messageId: string) {
+ return hiddenMessages.has(messageId);
+ },
+
+ async toggleHide(channelId: string, messageId: string) {
+ const ids = await getHiddenMessages();
+ if (!ids.delete(messageId))
+ ids.add(messageId);
+
+ await saveHiddenMessages(ids);
+ updateMessage(channelId, messageId);
+ }
+});
diff --git a/src/plugins/hideAttachments/styles.css b/src/plugins/hideAttachments/styles.css
new file mode 100644
index 000000000..0c7498216
--- /dev/null
+++ b/src/plugins/hideAttachments/styles.css
@@ -0,0 +1,10 @@
+.vc-hideAttachments-accessory {
+ color: var(--text-muted);
+ margin-top: 0.5em;
+ font-style: italic;
+ font-weight: 400;
+}
+
+.vc-hideAttachments-no-content {
+ margin-top: 0;
+}
\ No newline at end of file