From 734054ff68a103482bff903bb384bc24576c5499 Mon Sep 17 00:00:00 2001
From: Vendicated <vendicated@riseup.net>
Date: Thu, 1 Dec 2022 03:38:17 +0100
Subject: [PATCH] feat(Settings): Allow moving Vencord section to different
 places

---
 src/components/VencordSettings/VencordTab.tsx |  5 ++-
 src/plugins/settings.tsx                      | 38 ++++++++++++++++++-
 2 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/src/components/VencordSettings/VencordTab.tsx b/src/components/VencordSettings/VencordTab.tsx
index 89bbefd0..746fcf03 100644
--- a/src/components/VencordSettings/VencordTab.tsx
+++ b/src/components/VencordSettings/VencordTab.tsx
@@ -22,7 +22,7 @@ import DonateButton from "@components/DonateButton";
 import ErrorBoundary from "@components/ErrorBoundary";
 import IpcEvents from "@utils/IpcEvents";
 import { useAwaiter } from "@utils/misc";
-import { Button, Card, Forms, React, Switch } from "@webpack/common";
+import { Button, Card, Forms, Margins, React, Switch } from "@webpack/common";
 
 const st = (style: string) => `vcSettings${style}`;
 
@@ -81,6 +81,9 @@ function VencordSettings() {
             <Forms.FormDivider />
 
             <Forms.FormSection title="Settings">
+                <Forms.FormText className={Margins.marginBottom20}>
+                    Hint: You can change the position of this settings section in the settings of the "Settings" plugin!
+                </Forms.FormText>
                 <Switch
                     value={settings.useQuickCss}
                     onChange={(v: boolean) => settings.useQuickCss = v}
diff --git a/src/plugins/settings.tsx b/src/plugins/settings.tsx
index 975c3992..e5afbbcc 100644
--- a/src/plugins/settings.tsx
+++ b/src/plugins/settings.tsx
@@ -16,9 +16,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
+import { Settings } from "@api/settings";
 import { Devs } from "@utils/constants";
+import Logger from "@utils/Logger";
 import { LazyComponent } from "@utils/misc";
-import definePlugin from "@utils/types";
+import definePlugin, { OptionType } from "@utils/types";
 
 import gitHash from "~git-hash";
 
@@ -43,7 +45,23 @@ export default definePlugin({
     }, {
         find: "Messages.ACTIVITY_SETTINGS",
         replacement: {
-            match: /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.ACTIVITY_SETTINGS\}/,
+            get match() {
+                switch (Settings.plugins.Settings.settingsLocation) {
+                    case "top": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.USER_SETTINGS\}/;
+                    case "aboveNitro": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.BILLING_SETTINGS\}/;
+                    case "belowNitro": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.APP_SETTINGS\}/;
+                    case "aboveActivity": return /\{section:(.{1,2})\.ID\.HEADER,\s*label:(.{1,2})\..{1,2}\.Messages\.ACTIVITY_SETTINGS\}/;
+                    case "belowActivity": return /(?<=\{section:(.{1,2})\.ID\.DIVIDER},)\{section:"changelog"/;
+                    case "bottom": return /\{section:(.{1,2})\.ID\.CUSTOM,\s*element:.+?}/;
+                    default: {
+                        new Logger("Settings").error(
+                            new Error("No switch case matched????? Don't mess with the settings, silly")
+                        );
+                        // matches nothing
+                        return /(?!a)a/;
+                    }
+                }
+            },
             replace: (m, mod) => {
                 const updater = !IS_WEB ? '{section:"VencordUpdater",label:"Updater",element:Vencord.Plugins.plugins.Settings.tabs.updater},' : "";
                 const patchHelper = IS_DEV ? '{section:"VencordPatchHelper",label:"Patch Helper",element:Vencord.Components.PatchHelper},' : "";
@@ -61,6 +79,22 @@ export default definePlugin({
         }
     }],
 
+    options: {
+        settingsLocation: {
+            type: OptionType.SELECT,
+            description: "Where to put the Vencord settings section",
+            options: [
+                { label: "At the very top", value: "top" },
+                { label: "Above the Nitro section", value: "aboveNitro" },
+                { label: "Below the Nitro section", value: "belowNitro" },
+                { label: "Above Activity Settings", value: "aboveActivity", default: true },
+                { label: "Below Activity Settings", value: "belowActivity" },
+                { label: "At the very bottom", value: "bottom" },
+            ],
+            restartNeeded: true
+        },
+    },
+
     tabs: {
         vencord: () => <SettingsComponent tab="VencordSettings" />,
         plugins: () => <SettingsComponent tab="VencordPlugins" />,