diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f624dbe2..dedf1e48 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -31,6 +31,7 @@ Before starting your plugin:
- No FakeDeafen or FakeMute
- No StereoMic
- No plugins that simply hide or redesign ui elements. This can be done with CSS
+- No plugins that interact with specific Discord bots (official Discord apps like Youtube WatchTogether are okay)
- No selfbots or API spam (animated status, message pruner, auto reply, nitro snipers, etc)
- No untrusted third party APIs. Popular services like Google or GitHub are fine, but absolutely no self hosted ones
- No plugins that require the user to enter their own API key
diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md
new file mode 100644
index 00000000..5d2fc624
--- /dev/null
+++ b/PRIVACY_POLICY.md
@@ -0,0 +1 @@
+Equicord is designed with user privacy in mind and doesn’t collect or share any personal data. Since it’s an extension for Discord, it operates entirely within the Discord platform. This means all interactions and data management follow Discord’s privacy policies, which you can check out at [discord.com/privacy](https://discord.com/privacy/). So, while Equicord doesn’t handle your data, it’s a good idea to review Discord’s policy to understand how your information is managed. This setup ensures transparency and follows standard practices for third-party tools working within larger platforms.
diff --git a/package.json b/package.json
index 2602feda..34cd4c05 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "equicord",
"private": "true",
- "version": "1.10.7",
+ "version": "1.10.8",
"description": "The other cutest Discord client mod",
"homepage": "https://github.com/Equicord/Equicord#readme",
"bugs": {
diff --git a/src/plugins/_api/badges/fixDiscordBadgePadding.css b/src/plugins/_api/badges/fixDiscordBadgePadding.css
new file mode 100644
index 00000000..eb1d60d5
--- /dev/null
+++ b/src/plugins/_api/badges/fixDiscordBadgePadding.css
@@ -0,0 +1,5 @@
+/* the profile popout badge container(s) */
+[class*="biteSize_"] [class*="tags_"] [class*="container_"] {
+ /* Discord has padding set to 2px instead of 1px, which causes the 12th badge to wrap to a new line. */
+ padding: 0 1px;
+}
diff --git a/src/plugins/_api/badges/index.tsx b/src/plugins/_api/badges/index.tsx
index 2fd3d922..e7d6bf51 100644
--- a/src/plugins/_api/badges/index.tsx
+++ b/src/plugins/_api/badges/index.tsx
@@ -16,6 +16,8 @@
* along with this program. If not, see .
*/
+import "./fixDiscordBadgePadding.css";
+
import { _getBadges, BadgePosition, BadgeUserArgs, ProfileBadge } from "@api/Badges";
import DonateButton from "@components/DonateButton";
import ErrorBoundary from "@components/ErrorBoundary";
diff --git a/src/plugins/imageZoom/components/Magnifier.tsx b/src/plugins/imageZoom/components/Magnifier.tsx
index 585026d6..31fa7a11 100644
--- a/src/plugins/imageZoom/components/Magnifier.tsx
+++ b/src/plugins/imageZoom/components/Magnifier.tsx
@@ -18,7 +18,7 @@
import { classNameFactory } from "@api/Styles";
import ErrorBoundary from "@components/ErrorBoundary";
-import { FluxDispatcher, React, useRef, useState } from "@webpack/common";
+import { FluxDispatcher, useLayoutEffect, useRef, useState } from "@webpack/common";
import { ELEMENT_ID } from "../constants";
import { settings } from "../index";
@@ -55,7 +55,7 @@ export const Magnifier = ErrorBoundary.wrap(({ instance, size: i
const imageRef = useRef(null);
// since we accessing document im gonna use useLayoutEffect
- React.useLayoutEffect(() => {
+ useLayoutEffect(() => {
const onKeyDown = (e: KeyboardEvent) => {
if (e.key === "Shift") {
isShiftDown.current = true;
@@ -135,12 +135,14 @@ export const Magnifier = ErrorBoundary.wrap(({ instance, size: i
setReady(true);
});
+
document.addEventListener("keydown", onKeyDown);
document.addEventListener("keyup", onKeyUp);
document.addEventListener("mousemove", updateMousePosition);
document.addEventListener("mousedown", onMouseDown);
document.addEventListener("mouseup", onMouseUp);
document.addEventListener("wheel", onWheel);
+
return () => {
document.removeEventListener("keydown", onKeyDown);
document.removeEventListener("keyup", onKeyUp);
@@ -148,14 +150,16 @@ export const Magnifier = ErrorBoundary.wrap(({ instance, size: i
document.removeEventListener("mousedown", onMouseDown);
document.removeEventListener("mouseup", onMouseUp);
document.removeEventListener("wheel", onWheel);
-
- if (settings.store.saveZoomValues) {
- settings.store.zoom = zoom.current;
- settings.store.size = size.current;
- }
};
}, []);
+ useLayoutEffect(() => () => {
+ if (settings.store.saveZoomValues) {
+ settings.store.zoom = zoom.current;
+ settings.store.size = size.current;
+ }
+ });
+
if (!ready) return null;
const box = element.current?.getBoundingClientRect();
diff --git a/src/webpack/common/react.ts b/src/webpack/common/react.ts
index a98374b3..1bb874e8 100644
--- a/src/webpack/common/react.ts
+++ b/src/webpack/common/react.ts
@@ -21,6 +21,7 @@ import { findByPropsLazy, waitFor } from "@webpack";
export let React: typeof import("react");
export let useState: typeof React.useState;
export let useEffect: typeof React.useEffect;
+export let useLayoutEffect: typeof React.useLayoutEffect;
export let useMemo: typeof React.useMemo;
export let useRef: typeof React.useRef;
export let useReducer: typeof React.useReducer;
@@ -30,5 +31,5 @@ export const ReactDOM: typeof import("react-dom") & typeof import("react-dom/cli
waitFor("useState", m => {
React = m;
- ({ useEffect, useState, useMemo, useRef, useReducer, useCallback } = React);
+ ({ useEffect, useState, useLayoutEffect, useMemo, useRef, useReducer, useCallback } = React);
});