fix(plugins/settings): refactor into two plugins, move components up to src, fix splicing logic

This commit is contained in:
PalmDevs 2025-05-05 21:16:44 +07:00
parent 8bb1ccca2a
commit e05cdecbf9
No known key found for this signature in database
GPG key ID: 6FAE8F8677ACA8BA
33 changed files with 167 additions and 96 deletions

View file

@ -1,3 +1,4 @@
import './logging'
import './staff-settings'
import './settings'
import './developer-settings'

View file

@ -0,0 +1,16 @@
export const MobileSetting = {
// MAIN SETTINGS
REVENGE_DEVELOPER: 'REVENGE_DEVELOPER',
// SUBSETTINGS
REACT_DEVTOOLS_VERSION: 'REACT_DEVTOOLS_VERSION',
REACT_DEVTOOLS_CONNECT: 'REACT_DEVTOOLS_CONNECT',
REACT_DEVTOOLS_DISCONNECT: 'REACT_DEVTOOLS_DISCONNECT',
EVALUATE_JAVASCRIPT: 'EVALUATE_JAVASCRIPT',
} as const
export const UserSettingsSections = {
[MobileSetting.REVENGE_DEVELOPER]: 'Revenge Developer',
} as const

View file

@ -6,8 +6,9 @@ import { Components } from '@revenge-mod/discord/ui'
import { getErrorStack } from '@revenge-mod/utils/errors'
import AssetIcon from '~components/icons/AssetIcon'
import { pluginApi } from '..'
import AssetIcon from '../components/icons/AssetIcon'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,8 +1,9 @@
import { React } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import { connectToDevTools, DevToolsContext, useIsDevToolsOpen } from '../devtools'
import { MobileSetting } from '../SettingsConstants'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting } from '../constants'
import { DevToolsContext, connectToDevTools, useIsDevToolsOpen } from '../devtools'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,8 +1,9 @@
import { React } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting } from '../constants'
import { disconnectFromDevTools, useIsDevToolsOpen } from '../devtools'
import { MobileSetting } from '../SettingsConstants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,10 +1,11 @@
import { React } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import { MobileSetting } from '../SettingsConstants'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting } from '../constants'
import { DevToolsContext } from '../devtools'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'
import { DevToolsContext } from '../devtools'
const ReactDevToolsVersionSetting: SettingsItem = {
parent: MobileSetting.REVENGE_DEVELOPER,

View file

@ -1,5 +1,6 @@
import { MobileSetting, UserSettingsSections } from '../SettingsConstants'
import AssetIcon from '../components/icons/AssetIcon'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting, UserSettingsSections } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -0,0 +1,29 @@
import { type PluginApi, PluginFlags } from '@revenge-mod/plugins'
import { InternalPluginFlags, registerPlugin } from '@revenge-mod/plugins/_'
import { _data } from '@revenge-mod/discord/_/ui/settings'
import { onceSettingsModulesLoaded } from '@revenge-mod/discord/ui/settings'
registerPlugin(
{
id: 'revenge.settings.developer',
name: 'Developer Settings',
description: 'Developer settings menus for Revenge',
author: 'Revenge',
icon: 'WrenchIcon',
},
{
start(api) {
pluginApi = api
onceSettingsModulesLoaded(() => {
require('./register')
})
},
},
PluginFlags.Enabled,
InternalPluginFlags.Internal,
)
// Expose to EvaluateJavaScriptSetting
export let pluginApi: PluginApi

View file

@ -0,0 +1,19 @@
import { addSettingsItemToSection, registerSettingsItems } from '@revenge-mod/discord/ui/settings'
import { MobileSetting } from './constants'
import EvaluateJavaScriptSetting from './definitions/EvaluateJavaScriptSetting'
import ReactDevToolsConnectSetting from './definitions/ReactDevToolsConnectSetting'
import ReactDevToolsDisconnectSetting from './definitions/ReactDevToolsDisconnectSetting'
import ReactDevToolsVersionSetting from './definitions/ReactDevToolsVersionSetting'
import RevengeDeveloperSetting from './definitions/RevengeDeveloperSetting'
registerSettingsItems({
[MobileSetting.REVENGE_DEVELOPER]: RevengeDeveloperSetting,
[MobileSetting.REACT_DEVTOOLS_VERSION]: ReactDevToolsVersionSetting,
[MobileSetting.REACT_DEVTOOLS_CONNECT]: ReactDevToolsConnectSetting,
[MobileSetting.REACT_DEVTOOLS_DISCONNECT]: ReactDevToolsDisconnectSetting,
[MobileSetting.EVALUATE_JAVASCRIPT]: EvaluateJavaScriptSetting,
})
addSettingsItemToSection('REVENGE', MobileSetting.REVENGE_DEVELOPER)

View file

@ -1,8 +1,8 @@
import { React, ReactNative } from '@revenge-mod/react'
import { Components } from '@revenge-mod/discord/ui'
import { SettingListRenderer } from '@revenge-mod/discord/ui/settings'
import { React, ReactNative } from '@revenge-mod/react'
import { MobileSetting } from '../SettingsConstants'
import { MobileSetting } from '../constants'
import { DevToolsContext } from '../devtools'
// TODO(plugins/settings): debug bridge

View file

@ -5,7 +5,6 @@ export const MobileSetting = {
REVENGE_PLUGINS: 'REVENGE_PLUGINS',
REVENGE_THEMES: 'REVENGE_THEMES',
REVENGE_FONTS: 'REVENGE_FONTS',
REVENGE_DEVELOPER: 'REVENGE_DEVELOPER',
// SUBSETTINGS
@ -18,11 +17,6 @@ export const MobileSetting = {
REACT_NATIVE_VERSION: 'REACT_NATIVE_VERSION',
HERMES_VERSION: 'HERMES_VERSION',
REACT_DEVTOOLS_VERSION: 'REACT_DEVTOOLS_VERSION',
REACT_DEVTOOLS_CONNECT: 'REACT_DEVTOOLS_CONNECT',
REACT_DEVTOOLS_DISCONNECT: 'REACT_DEVTOOLS_DISCONNECT',
EVALUATE_JAVASCRIPT: 'EVALUATE_JAVASCRIPT',
REVENGE_NOT_IMPLEMENTED: 'REVENGE_NOT_IMPLEMENTED',
} as const
@ -31,5 +25,4 @@ export const UserSettingsSections = {
[MobileSetting.REVENGE_PLUGINS]: 'Revenge Plugins',
[MobileSetting.REVENGE_THEMES]: 'Revenge Themes',
[MobileSetting.REVENGE_FONTS]: 'Revenge Fonts',
[MobileSetting.REVENGE_DEVELOPER]: 'Revenge Developer',
} as const

View file

@ -1,7 +1,8 @@
import { React } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import { MobileSetting } from '../SettingsConstants'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,7 +1,8 @@
import { React, ReactNative } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import { MobileSetting } from '../SettingsConstants'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -2,7 +2,7 @@ import { getAssetByName } from '@revenge-mod/assets'
import { Components } from '@revenge-mod/discord/ui'
import { React } from '@revenge-mod/react'
import { MobileSetting } from '../SettingsConstants'
import { MobileSetting } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,8 +1,9 @@
import { BundleUpdaterManager } from '@revenge-mod/discord/native'
import { React } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import { MobileSetting } from '../SettingsConstants'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,10 +1,11 @@
import { React, ReactNative } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import { MobileSetting } from '../SettingsConstants'
import { DiscordServerURL } from '~/constants'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'
import { DiscordServerURL } from '../../../constants'
const RevengeDiscordServerSetting: SettingsItem = {
parent: MobileSetting.REVENGE,

View file

@ -1,5 +1,6 @@
import { MobileSetting, UserSettingsSections } from '../SettingsConstants'
import AssetIcon from '../components/icons/AssetIcon'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting, UserSettingsSections } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,9 +1,9 @@
import { React, ReactNative } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import { MobileSetting } from '../SettingsConstants'
import { GitHubOrganizationURL } from '~/constants'
import AssetIcon from '~components/icons/AssetIcon'
import { GitHubOrganizationURL } from '../../../constants'
import { MobileSetting } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,6 +1,6 @@
import { React } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
import AssetIcon from '~components/icons/AssetIcon'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,7 +1,8 @@
import { getEnabledPluginsCount } from '@revenge-mod/plugins/_'
import { MobileSetting, UserSettingsSections } from '../SettingsConstants'
import AssetIcon from '../components/icons/AssetIcon'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting, UserSettingsSections } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,5 +1,6 @@
import RevengeIcon from '../components/icons/RevengeIcon'
import { MobileSetting, UserSettingsSections } from '../SettingsConstants'
import RevengeIcon from '~components/icons/RevengeIcon'
import { MobileSetting, UserSettingsSections } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,5 +1,6 @@
import { MobileSetting, UserSettingsSections } from '../SettingsConstants'
import AssetIcon from '../components/icons/AssetIcon'
import AssetIcon from '~components/icons/AssetIcon'
import { MobileSetting, UserSettingsSections } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,5 +1,6 @@
import RevengeIcon from '../components/icons/RevengeIcon'
import { MobileSetting } from '../SettingsConstants'
import RevengeIcon from '~components/icons/RevengeIcon'
import { MobileSetting } from '../constants'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'

View file

@ -1,14 +1,14 @@
import { PluginFlags, type PluginApi } from '@revenge-mod/plugins'
import { type PluginApi, PluginFlags } from '@revenge-mod/plugins'
import { InternalPluginFlags, registerPlugin } from '@revenge-mod/plugins/_'
import { waitForModules } from '@revenge-mod/modules/finders'
import { byName, byProps } from '@revenge-mod/modules/finders/filters'
import { _suiData } from '@revenge-mod/discord/_/ui/settings'
import { _subs, _data } from '@revenge-mod/discord/_/ui/settings'
import { after } from '@revenge-mod/patcher'
import type { SettingsItem } from '@revenge-mod/discord/ui/settings'
import { onceSettingsModulesLoaded, type SettingsItem } from '@revenge-mod/discord/ui/settings'
import type { FC } from 'react'
registerPlugin(
@ -23,27 +23,34 @@ registerPlugin(
start(api) {
pluginApi = api
const unsubForRendererConfig = waitForModules(byProps('SETTING_RENDERER_CONFIG'), (_, exports) => {
unsubForRendererConfig()
onceSettingsModulesLoaded(() => {
require('./register')
const SettingRendererConfig = exports as {
SETTING_RENDERER_CONFIG: Record<string, SettingsItem>
}
let ORIGINAL_RENDERER_CONFIG = SettingRendererConfig.SETTING_RENDERER_CONFIG
Object.defineProperty(SettingRendererConfig, 'SETTING_RENDERER_CONFIG', {
get: () =>
({
...ORIGINAL_RENDERER_CONFIG,
..._suiData.config,
}) as Record<string, SettingsItem>,
set: v => (ORIGINAL_RENDERER_CONFIG = v),
})
})
const unsubForRendererConfig = waitForModules(
byProps<{
SETTING_RENDERER_CONFIG: Record<string, SettingsItem>
}>('SETTING_RENDERER_CONFIG'),
(_, SettingRendererConfig) => {
unsubForRendererConfig()
for (const sub of _subs) sub()
// We don't ever need to call this again
_subs.clear()
let ORIGINAL_RENDERER_CONFIG = SettingRendererConfig.SETTING_RENDERER_CONFIG
Object.defineProperty(SettingRendererConfig, 'SETTING_RENDERER_CONFIG', {
get: () =>
({
...ORIGINAL_RENDERER_CONFIG,
..._data[1],
}) as Record<string, SettingsItem>,
set: v => (ORIGINAL_RENDERER_CONFIG = v),
})
},
)
const unsubForSettingsOverviewScreen = waitForModules(
byName('SettingsOverviewScreen'),
(_, exports) => {
@ -55,21 +62,22 @@ registerPlugin(
settings: string[]
}>
const FirstCustomRow = Object.keys(
_suiData.sections[Object.keys(_suiData.sections)[0]].settings,
)[0]
const customSections = _data[0]
// Check if we even have custom sections
const firstCustomSection = customSections[Object.keys(customSections)[0]]
if (!firstCustomSection) return tree
// Check if sections are already spliced
const firstCustomItem = firstCustomSection.settings[0]
if (
// No custom rows
!FirstCustomRow ||
// Section already added
sections.findIndex(section =>
section.settings.some(setting => setting === FirstCustomRow),
section.settings.some(setting => setting === firstCustomItem),
) !== -1
)
return tree
for (const section of Object.values(_suiData.sections))
for (const section of Object.values(customSections))
if (!section.index) sections.unshift(section)
else sections.splice(section.index, 0, section)

View file

@ -1,31 +1,25 @@
import { registerSettingsItems, registerSettingsSection } from '@revenge-mod/discord/ui/settings'
import { MobileSetting } from './SettingsConstants'
import { MobileSetting } from './constants'
import RevengeSetting from './definitions/RevengeSetting'
import HermesVersionSetting from './definitions/HermesVersionSetting'
import ReactNativeVersionSetting from './definitions/ReactNativeVersionSetting'
// import RevengePluginsSetting from './definitions/RevengePluginsSetting'
// import RevengeThemesSetting from './definitions/RevengeThemesSetting'
// import RevengeFontsSetting from './definitions/RevengeFontsSetting'
import RevengeDeveloperSetting from './definitions/RevengeDeveloperSetting'
import ReactVersionSetting from './definitions/ReactVersionSetting'
import ReactNativeVersionSetting from './definitions/ReactNativeVersionSetting'
import RevengeVersionSetting from './definitions/RevengeVersionSetting'
import HermesVersionSetting from './definitions/HermesVersionSetting'
import RevengeNotImplementedSetting from './definitions/RevengeNotImplementedSetting'
import EvaluateJavaScriptSetting from './definitions/EvaluateJavaScriptSetting'
import ReactDevToolsVersionSetting from './definitions/ReactDevToolsVersionSetting'
import ReactDevToolsConnectSetting from './definitions/ReactDevToolsConnectSetting'
import ReactDevToolsDisconnectSetting from './definitions/ReactDevToolsDisconnectSetting'
import ReloadAppSetting from './definitions/ReloadAppSetting'
import RevengeDiscordServerSetting from './definitions/RevengeDiscordServerSetting'
import RevengeGitHubOrganizationSetting from './definitions/RevengeGitHubOrganizationSetting'
import RevengeNotImplementedSetting from './definitions/RevengeNotImplementedSetting'
import RevengeSetting from './definitions/RevengeSetting'
import RevengeVersionSetting from './definitions/RevengeVersionSetting'
registerSettingsItems({
[MobileSetting.REVENGE]: RevengeSetting,
// [MobileSetting.REVENGE_PLUGINS]: RevengePluginsSetting,
// [MobileSetting.REVENGE_THEMES]: RevengeThemesSetting,
// [MobileSetting.REVENGE_FONTS]: RevengeFontsSetting,
[MobileSetting.REVENGE_DEVELOPER]: RevengeDeveloperSetting,
[MobileSetting.REVENGE_GITHUB_ORGANIZATION]: RevengeGitHubOrganizationSetting,
[MobileSetting.REVENGE_DISCORD_SERVER]: RevengeDiscordServerSetting,
[MobileSetting.RELOAD_APP]: ReloadAppSetting,
@ -33,10 +27,6 @@ registerSettingsItems({
[MobileSetting.REACT_VERSION]: ReactVersionSetting,
[MobileSetting.REACT_NATIVE_VERSION]: ReactNativeVersionSetting,
[MobileSetting.HERMES_VERSION]: HermesVersionSetting,
[MobileSetting.REACT_DEVTOOLS_VERSION]: ReactDevToolsVersionSetting,
[MobileSetting.REACT_DEVTOOLS_CONNECT]: ReactDevToolsConnectSetting,
[MobileSetting.REACT_DEVTOOLS_DISCONNECT]: ReactDevToolsDisconnectSetting,
[MobileSetting.EVALUATE_JAVASCRIPT]: EvaluateJavaScriptSetting,
[MobileSetting.REVENGE_NOT_IMPLEMENTED]: RevengeNotImplementedSetting,
})
@ -47,6 +37,5 @@ registerSettingsSection('REVENGE', {
// MobileSetting.REVENGE_PLUGINS,
// MobileSetting.REVENGE_THEMES,
// MobileSetting.REVENGE_FONTS,
MobileSetting.REVENGE_DEVELOPER,
],
})

View file

@ -1,6 +1,6 @@
import { SettingListRenderer } from '@revenge-mod/discord/ui/settings'
import { MobileSetting } from '../SettingsConstants'
import { MobileSetting } from '../constants'
export default function RevengeFontsSettingScreen() {
return (

View file

@ -1,6 +1,6 @@
import { SettingListRenderer } from '@revenge-mod/discord/ui/settings'
import { MobileSetting } from '../SettingsConstants'
import { MobileSetting } from '../constants'
export default function RevengePluginsSettingScreen() {
return (

View file

@ -1,6 +1,6 @@
import { SettingListRenderer } from '@revenge-mod/discord/ui/settings'
import { MobileSetting } from '../SettingsConstants'
import { Components } from '../../../../lib/discord/src/ui/common'
import { MobileSetting } from '../constants'
export default function RevengeSettingScreen() {
return (

View file

@ -1,6 +1,6 @@
import { SettingListRenderer } from '@revenge-mod/discord/ui/settings'
import { MobileSetting } from '../SettingsConstants'
import { MobileSetting } from '../constants'
export default function RevengeThemesSettingScreen() {
return (

View file

@ -3,8 +3,10 @@
"compilerOptions": {
"types": ["@revenge-mod/types", "./types", "./types.modules", "node/util"],
"paths": {
"~plugins/*": ["./src/plugins/*"],
"~assets/*": ["./src/assets/*"]
"~/*": ["./src/*"],
"~assets/*": ["./src/assets/*"],
"~components/*": ["./src/components/*"],
"~plugins/*": ["./src/plugins/*"]
}
},
"include": ["lib", "src", "shims"]