diff --git a/src/plugins/settings/SettingsConstants.ts b/src/plugins/settings/SettingsConstants.ts
index a18e8c3..a9f4d7e 100644
--- a/src/plugins/settings/SettingsConstants.ts
+++ b/src/plugins/settings/SettingsConstants.ts
@@ -15,7 +15,9 @@ export const MobileSetting = {
HERMES_VERSION: 'HERMES_VERSION',
CALL_GARBAGE_COLLECTOR: 'CALL_GARBAGE_COLLECTOR',
- TRIGGER_ERROR_BOUNDARY: 'TRIGGER_ERROR_BOUNDARY',
+ EVALUATE_JAVASCRIPT: 'EVALUATE_JAVASCRIPT',
+ EVALUATE_JAVASCRIPT_INSPECT_DEPTH: 'EVALUATE_JAVASCRIPT_INSPECT_DEPTH',
+ EVALUATE_JAVASCRIPT_AWAIT_RESULT: 'EVALUATE_JAVASCRIPT_AWAIT_RESULT',
REVENGE_NOT_IMPLEMENTED: 'REVENGE_NOT_IMPLEMENTED',
} as const
@@ -26,7 +28,6 @@ export const UserSettingsSections = {
[MobileSetting.REVENGE_THEMES]: 'Revenge Themes',
[MobileSetting.REVENGE_FONTS]: 'Revenge Fonts',
[MobileSetting.REVENGE_DEVELOPER]: 'Revenge Developer',
- [MobileSetting.TRIGGER_ERROR_BOUNDARY]: 'Trigger Error Boundary',
} as const
export const AlwaysHidden = () => false
diff --git a/src/plugins/settings/definitions/CallGarbageCollectorSetting.tsx b/src/plugins/settings/definitions/CallGarbageCollectorSetting.tsx
index ffa2e92..84e06fe 100644
--- a/src/plugins/settings/definitions/CallGarbageCollectorSetting.tsx
+++ b/src/plugins/settings/definitions/CallGarbageCollectorSetting.tsx
@@ -2,9 +2,9 @@ import { React } from '@revenge-mod/react'
import AssetIcon from '../components/icons/AssetIcon'
-import type { SettingsRowConfig } from '@revenge-mod/discord/ui/settings'
+import type { SettingsItem } from '@revenge-mod/discord/ui/settings'
-const CallGarbageCollectorSetting: SettingsRowConfig = {
+const CallGarbageCollectorSetting: SettingsItem = {
parent: null,
IconComponent: () => ,
title: () => 'Call Garbage Collector',
diff --git a/src/plugins/settings/definitions/EvaluateJavaScriptSetting.tsx b/src/plugins/settings/definitions/EvaluateJavaScriptSetting.tsx
new file mode 100644
index 0000000..52cd181
--- /dev/null
+++ b/src/plugins/settings/definitions/EvaluateJavaScriptSetting.tsx
@@ -0,0 +1,121 @@
+import { React } from '@revenge-mod/react'
+
+import { AlertActionCreators } from '@revenge-mod/discord/actions'
+import { nodeUtils } from '@revenge-mod/discord/polyfills'
+import { Components } from '@revenge-mod/discord/ui'
+
+import { getErrorStack } from '@revenge-mod/utils/errors'
+
+import AssetIcon from '../components/icons/AssetIcon'
+
+import type { SettingsItem } from '@revenge-mod/discord/ui/settings'
+
+const ALERT_KEY = 'evaluate-javascript'
+
+const EvaluateJavaScriptSetting: SettingsItem = {
+ parent: null,
+ IconComponent: () => ,
+ title: () => 'Evaluate JavaScript',
+ useDescription: () => 'Runs a JavaScript code snippet.',
+ onPress: () => AlertActionCreators.openAlert(ALERT_KEY, ),
+ type: 'pressable',
+}
+
+const {
+ AlertActionButton,
+ AlertModal,
+ Button,
+ Slider,
+ Stack,
+ TableRow,
+ TableRowGroup,
+ TableSwitchRow,
+ Text,
+ TextArea,
+} = Components
+
+function EvaluateJavaScriptAlert() {
+ const code = React.useRef('')
+ const [awaitResult, setAwaitResult] = React.useState(true)
+ const [showHidden, setShowHidden] = React.useState(true)
+ const [inspectDepth, setInspectDepth] = React.useState(3)
+ const [loading, setLoading] = React.useState(false)
+
+ return (
+
+