diff --git a/src/plugins/HideAttachments.tsx b/src/plugins/HideAttachments.tsx
new file mode 100644
index 00000000..067b4f01
--- /dev/null
+++ b/src/plugins/HideAttachments.tsx
@@ -0,0 +1,124 @@
+/*
+ * 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 { Message } from "discord-types/general";
+
+import { get, set } from "../api/DataStore";
+import { Devs } from "../utils/constants";
+import Logger from "../utils/Logger";
+import definePlugin from "../utils/types";
+import { ChannelStore, FluxDispatcher } from "../webpack/common";
+
+let style: HTMLStyleElement;
+
+const KEY = "HideAttachments_HiddenIds";
+
+const ImageVisible = () => (
+
+);
+const ImageInvisible = () => (
+
+);
+
+let hiddenMessages: Set = new Set();
+const getHiddenMessages = () => get(KEY).then(set => {
+ hiddenMessages = set ?? new Set();
+ return hiddenMessages;
+});
+const saveHiddenMessages = (ids: Set) => set(KEY, ids);
+
+export default definePlugin({
+ name: "HideAttachments",
+ description: "Hide attachments and Embeds for individual messages via hover button",
+ authors: [Devs.Ven],
+ patches: [{
+ find: "Messages.MESSAGE_UTILITIES_A11Y_LABEL",
+ replacement: {
+ match: /(message:(.).{0,100}Fragment,\{children:\[)(.{0,40}renderPopout:.{0,200}message_reaction_emoji_picker.+?return (.{1,3})\(.{0,30}"add-reaction")/,
+ replace: "$1Vencord.Plugins.plugins.HideAttachments.renderButton($2, $4),$3"
+ }
+ }],
+
+ async start() {
+ style = document.createElement("style");
+ style.id = "VencordHideAttachments";
+ document.head.appendChild(style);
+
+ await getHiddenMessages();
+ await this.buildCss();
+ },
+
+ stop() {
+ style.remove();
+ hiddenMessages.clear();
+ },
+
+ async buildCss() {
+ const elements = [...hiddenMessages].map(id => `#message-accessories-${id}`).join(",");
+ style.textContent = `
+ :is(${elements}) [class*="embedWrapper"] {
+ /* important is not necessary, but add it to make sure bad themes won't break it */
+ display: none !important;
+ }
+ :is(${elements})::after {
+ content: "Attachments hidden";
+ color: var(--text-muted);
+ font-size: 80%;
+ }
+ `;
+ },
+
+ renderButton(msg: Message, makeItem: (data: any) => React.ComponentType) {
+ try {
+ if (!msg.attachments.length && !msg.embeds.length) return null;
+
+ const isHidden = hiddenMessages.has(msg.id);
+
+ return makeItem({
+ key: "HideAttachments",
+ label: isHidden ? "Show Attachments" : "Hide Attachments",
+ icon: isHidden ? ImageVisible : ImageInvisible,
+ message: msg,
+ channel: ChannelStore.getChannel(msg.channel_id),
+ onClick: () => this.toggleHide(msg)
+ });
+ } catch (err) {
+ new Logger("HideAttachments").error(err);
+ return null;
+ }
+ },
+
+ async toggleHide(message: Message) {
+ const ids = await getHiddenMessages();
+ if (!ids.delete(message.id))
+ ids.add(message.id);
+
+ await saveHiddenMessages(ids);
+ await this.buildCss();
+
+ // update is necessary to rerender the PopOver
+ FluxDispatcher.dispatch({
+ type: "MESSAGE_UPDATE",
+ message
+ });
+ }
+});
diff --git a/src/utils/quickCss.ts b/src/utils/quickCss.ts
index 02a5c165..0ce1f588 100644
--- a/src/utils/quickCss.ts
+++ b/src/utils/quickCss.ts
@@ -28,7 +28,7 @@ export async function toggle(isEnabled: boolean) {
style.id = "vencord-custom-css";
document.head.appendChild(style);
VencordNative.ipc.on(IpcEvents.QUICK_CSS_UPDATE, (_, css: string) => style.innerText = css);
- style.innerText = await VencordNative.ipc.invoke(IpcEvents.GET_QUICK_CSS);
+ style.textContent = await VencordNative.ipc.invoke(IpcEvents.GET_QUICK_CSS);
}
} else // @ts-ignore yes typescript, property 'disabled' does exist on type 'HTMLStyleElement' u should try reading the docs some time
style.disabled = !isEnabled;