[Global] Code cleanup pass

This commit is contained in:
Beef 2023-02-26 22:56:36 +00:00
parent 69c2544b99
commit 7d36903b2c
19 changed files with 47 additions and 73 deletions

8
src/def.d.ts vendored
View file

@ -46,7 +46,7 @@ interface Asset {
id: number; id: number;
} }
declare enum ButtonColors { export enum ButtonColors {
BRAND = "brand", BRAND = "brand",
RED = "red", RED = "red",
GREEN = "green", GREEN = "green",
@ -121,7 +121,7 @@ interface ApplicationCommand {
type: ApplicationCommandType; type: ApplicationCommandType;
} }
declare enum ApplicationCommandInputType { export enum ApplicationCommandInputType {
BUILT_IN, BUILT_IN,
BUILT_IN_TEXT, BUILT_IN_TEXT,
BUILT_IN_INTEGRATION, BUILT_IN_INTEGRATION,
@ -138,7 +138,7 @@ interface ApplicationCommandOption {
displayDescription: string; displayDescription: string;
} }
declare enum ApplicationCommandOptionType { export enum ApplicationCommandOptionType {
SUB_COMMAND = 1, SUB_COMMAND = 1,
SUB_COMMAND_GROUP, SUB_COMMAND_GROUP,
STRING, STRING,
@ -152,7 +152,7 @@ declare enum ApplicationCommandOptionType {
ATTACHMENT, ATTACHMENT,
} }
declare enum ApplicationCommandType { export enum ApplicationCommandType {
CHAT = 1, CHAT = 1,
USER, USER,
MESSAGE, MESSAGE,

View file

@ -7,11 +7,9 @@ import logger from "@lib/logger";
export let socket: WebSocket; export let socket: WebSocket;
export function connectToDebugger(url: string) { export function connectToDebugger(url: string) {
if (socket !== undefined && socket.readyState !== WebSocket.CLOSED) { if (socket !== undefined && socket.readyState !== WebSocket.CLOSED) socket.close();
socket.close();
}
if (url === "") { if (!url) {
showToast("Invalid debugger URL!", getAssetIDByName("Small")); showToast("Invalid debugger URL!", getAssetIDByName("Small"));
return; return;
} }
@ -19,7 +17,6 @@ export function connectToDebugger(url: string) {
socket = new WebSocket(`ws://${url}`); socket = new WebSocket(`ws://${url}`);
socket.addEventListener("open", () => showToast("Connected to debugger.", getAssetIDByName("Check"))); socket.addEventListener("open", () => showToast("Connected to debugger.", getAssetIDByName("Check")));
socket.addEventListener("message", (message: any) => { socket.addEventListener("message", (message: any) => {
try { try {
(0, eval)(message.data); (0, eval)(message.data);

View file

@ -1,10 +1,10 @@
import { Emitter, EmitterEvent, EmitterListener, EmitterListenerData, EmitterListeners } from "@types"; import { Emitter, EmitterEvent, EmitterListener, EmitterListenerData, EmitterListeners } from "@types";
export const Events = Object.freeze({ export enum Events {
GET: "GET", GET = "GET",
SET: "SET", SET = "SET",
DEL: "DEL", DEL = "DEL",
}); };
export default function createEmitter(): Emitter { export default function createEmitter(): Emitter {
return { return {

View file

@ -5,10 +5,10 @@
const basicFind = (prop: string) => Object.values(window.modules).find(m => m?.publicModule.exports?.[prop])?.publicModule?.exports; const basicFind = (prop: string) => Object.values(window.modules).find(m => m?.publicModule.exports?.[prop])?.publicModule?.exports;
// Hoist React on window // Hoist React on window
window.React = basicFind("createElement") as typeof import("react");; window.React = basicFind("createElement") as typeof import("react");
// Export ReactNative // Export ReactNative
export const ReactNative = basicFind("Text") as typeof import("react-native"); export const ReactNative = basicFind("AppRegistry") as typeof import("react-native");
// Export Discord's constants // Export Discord's constants
export const constants = basicFind("AbortCodes"); export const constants = basicFind("AbortCodes");

View file

@ -1,5 +1,5 @@
import { createFileBackend, createMMKVBackend, createStorage, wrapSync } from "@lib/storage";
import { LoaderConfig, Settings } from "@types"; import { LoaderConfig, Settings } from "@types";
import { createFileBackend, createMMKVBackend, createStorage, wrapSync } from "@lib/storage";
export default wrapSync(createStorage<Settings>(createMMKVBackend("VENDETTA_SETTINGS"))); export default wrapSync(createStorage<Settings>(createMMKVBackend("VENDETTA_SETTINGS")));
export const loaderConfig = wrapSync(createStorage<LoaderConfig>(createFileBackend("vendetta_loader.json"))); export const loaderConfig = wrapSync(createStorage<LoaderConfig>(createFileBackend("vendetta_loader.json")));

View file

@ -1,5 +1,7 @@
import { clipboard } from "@metro/common"; import { clipboard } from "@metro/common";
// TODO: Remove/deprecate this, the clipboard module works the same way.
export default function copyText(content: string) { export default function copyText(content: string) {
try { try {
clipboard.setString(content); clipboard.setString(content);

View file

@ -1,8 +1,6 @@
// https://stackoverflow.com/a/68339174 // https://stackoverflow.com/a/68339174
export default function unfreeze(obj: object) { export default function unfreeze(obj: object) {
if (Object.isFrozen(obj)) { if (Object.isFrozen(obj)) return Object.assign({}, obj);
return Object.assign({}, obj);
}
return obj; return obj;
} }

View file

@ -4,7 +4,7 @@ import InputAlert from "@ui/components/InputAlert";
const Alerts = findByProps("openLazy", "close"); const Alerts = findByProps("openLazy", "close");
interface InternalConfirmationAlertOptions extends Omit<ConfirmationAlertOptions, 'content'> { interface InternalConfirmationAlertOptions extends Omit<ConfirmationAlertOptions, "content"> {
content: string | JSX.Element | JSX.Element[] | undefined; content: string | JSX.Element | JSX.Element[] | undefined;
body: string | undefined; body: string | undefined;
children: JSX.Element | JSX.Element[]; children: JSX.Element | JSX.Element[];
@ -20,18 +20,11 @@ export function showConfirmationAlert(options: ConfirmationAlertOptions) {
}; };
delete internalOptions.content; delete internalOptions.content;
return Alerts.show(internalOptions); return Alerts.show(internalOptions);
}; };
export function showCustomAlert(component: React.ComponentType, props: any) { export const showCustomAlert = (component: React.ComponentType, props: any) => Alerts.openLazy({
Alerts.openLazy({ importer: async () => () => React.createElement(component, props),
importer: async function () {
return () => React.createElement(component, props);
}
}); });
};
export function showInputAlert(options: InputAlertProps) { export const showInputAlert = (options: InputAlertProps) => showCustomAlert(InputAlert as React.ComponentType, options);
showCustomAlert(InputAlert as React.ComponentType, options);
};

View file

@ -1,6 +1,6 @@
import { Asset, Indexable } from "@types"; import { Asset, Indexable } from "@types";
import { after } from "@lib/patcher";
import { assets } from "@metro/common"; import { assets } from "@metro/common";
import { after } from "@lib/patcher";
export const all: Indexable<Asset> = {}; export const all: Indexable<Asset> = {};

View file

@ -5,13 +5,13 @@ import { constants } from "@metro/hoist";
//* In 167.1, most if not all traces of the old color modules were removed. //* In 167.1, most if not all traces of the old color modules were removed.
//* In 168.6, Discord restructured EVERYTHING again. SemanticColor on this module no longer works when passed to a stylesheet. We must now use what you see below. //* In 168.6, Discord restructured EVERYTHING again. SemanticColor on this module no longer works when passed to a stylesheet. We must now use what you see below.
//? However, this is not all bad. The changes made in 168.6 do allow for better native-less theming. //? However, this is not all bad. The changes made in 168.6 do allow for better native-less theming.
const colorModule = findByProps("SemanticColor"); const colorModule = findByProps("colors", "meta");
//* For both below, SemanticColor and RawColor are seemingly not used. Once again, what are Discord doing? //* For both below, SemanticColor and RawColor are seemingly not used. Once again, what are Discord doing?
//? SemanticColor and default.colors are effectively ThemeColorMap //? SemanticColor and default.colors are effectively ThemeColorMap
export const semanticColors = (constants.ThemeColorMap ?? colorModule?.default?.colors ?? colorModule?.SemanticColor); export const semanticColors = (constants.ThemeColorMap ?? colorModule?.colors);
//? RawColor and default.unsafe_rawColors are effectively Colors //? RawColor and default.unsafe_rawColors are effectively Colors
//* Note that constants.Colors does still appear to exist on newer versions despite Discord not internally using it - what the fuck? //* Note that constants.Colors does still appear to exist on newer versions despite Discord not internally using it - what the fuck?
export const rawColors = (constants.Colors ?? colorModule?.default?.unsafe_rawColors ?? colorModule?.RawColor); export const rawColors = (constants.Colors ?? colorModule?.unsafe_rawColors);

View file

@ -3,7 +3,6 @@ import { Forms, Alert } from "@ui/components";
import { InputAlertProps } from "@types"; import { InputAlertProps } from "@types";
const { FormInput } = Forms; const { FormInput } = Forms;
const Alerts = findByProps("openLazy", "close"); const Alerts = findByProps("openLazy", "close");
export default function InputAlert({ title, confirmText, confirmColor, onConfirm, cancelText, placeholder, initialValue = "" }: InputAlertProps) { export default function InputAlert({ title, confirmText, confirmColor, onConfirm, cancelText, placeholder, initialValue = "" }: InputAlertProps) {

View file

@ -1,8 +1,8 @@
// Based on https://github.com/Aliucord/AliucordRN/blob/main/src/ui/patchTheme.ts // Based on https://github.com/Aliucord/AliucordRN/blob/main/src/ui/patchTheme.ts
// Literally could not figure this out, many thanks // Literally could not figure this out, many thanks
import { findByProps, findByStoreName } from "@metro/filters";
import { FluxDispatcher } from "@metro/common"; import { FluxDispatcher } from "@metro/common";
import { findByProps, findByStoreName } from "@metro/filters";
import logger from "@lib/logger"; import logger from "@lib/logger";
// TODO: Move these to common modules? // TODO: Move these to common modules?

View file

@ -1,9 +1,9 @@
import { HTTP_REGEX } from "@/lib/constants";
import { semanticColors } from "@ui/color";
import { installPlugin } from "@lib/plugins";
import { clipboard, stylesheet } from "@metro/common"; import { clipboard, stylesheet } from "@metro/common";
import { HTTP_REGEX } from "@lib/constants";
import { installPlugin } from "@lib/plugins";
import { showInputAlert } from "@ui/alerts"; import { showInputAlert } from "@ui/alerts";
import { getAssetIDByName } from "@ui/assets"; import { getAssetIDByName } from "@ui/assets";
import { semanticColors } from "@ui/color";
import { General } from "@ui/components"; import { General } from "@ui/components";
const { TouchableOpacity, Image } = General; const { TouchableOpacity, Image } = General;

View file

@ -1,16 +1,13 @@
import { ButtonColors, Plugin } from "@types";
import { ReactNative as RN, stylesheet, NavigationNative } from "@metro/common"; import { ReactNative as RN, stylesheet, NavigationNative } from "@metro/common";
import { findByProps } from "@metro/filters";
import { Forms, General } from "@ui/components"; import { Forms, General } from "@ui/components";
import { Plugin } from "@types";
import { getAssetIDByName } from "@ui/assets"; import { getAssetIDByName } from "@ui/assets";
import { showToast } from "@ui/toasts"; import { showToast } from "@ui/toasts";
import { showConfirmationAlert } from "@ui/alerts";
import { semanticColors } from "@ui/color"; import { semanticColors } from "@ui/color";
import { removePlugin, startPlugin, stopPlugin, getSettings } from "@lib/plugins"; import { removePlugin, startPlugin, stopPlugin, getSettings } from "@lib/plugins";
import copyText from "@utils/copyText"; import copyText from "@utils/copyText";
// TODO: Replace with our eventual dialog API
const Dialog = findByProps("show", "openLazy", "close");
const { FormRow, FormSwitch } = Forms; const { FormRow, FormSwitch } = Forms;
const { TouchableOpacity, Image } = General; const { TouchableOpacity, Image } = General;
@ -79,12 +76,12 @@ export default function PluginCard({ plugin, index }: PluginCardProps) {
trailing={ trailing={
<RN.View style={styles.actions}> <RN.View style={styles.actions}>
<TouchableOpacity <TouchableOpacity
onPress={() => Dialog.show({ onPress={() => showConfirmationAlert({
title: "Wait!", title: "Wait!",
body: `Are you sure you wish to delete ${plugin.manifest.name}?`, content: `Are you sure you wish to delete ${plugin.manifest.name}?`,
confirmText: "Delete", confirmText: "Delete",
cancelText: "Cancel", cancelText: "Cancel",
confirmColor: "red", confirmColor: ButtonColors.RED,
onConfirm: () => { onConfirm: () => {
try { try {
removePlugin(plugin.id); removePlugin(plugin.id);

View file

@ -4,11 +4,11 @@ import { after } from "@lib/patcher";
import findInReactTree from "@utils/findInReactTree"; import findInReactTree from "@utils/findInReactTree";
import ErrorBoundary from "@ui/components/ErrorBoundary"; import ErrorBoundary from "@ui/components/ErrorBoundary";
import SettingsSection from "@ui/settings/components/SettingsSection"; import SettingsSection from "@ui/settings/components/SettingsSection";
import InstallPluginButton from "@ui/settings/components/InstallPluginButton";
import General from "@ui/settings/pages/General"; import General from "@ui/settings/pages/General";
import Plugins from "@ui/settings/pages/Plugins"; import Plugins from "@ui/settings/pages/Plugins";
import Developer from "@ui/settings/pages/Developer"; import Developer from "@ui/settings/pages/Developer";
import AssetBrowser from "@ui/settings/pages/AssetBrowser"; import AssetBrowser from "@ui/settings/pages/AssetBrowser";
import InstallPluginButton from "@ui/settings/components/InstallPluginButton";
const screensModule = findByDisplayName("getScreens", false); const screensModule = findByDisplayName("getScreens", false);
const settingsModule = findByDisplayName("UserSettingsOverviewWrapper", false); const settingsModule = findByDisplayName("UserSettingsOverviewWrapper", false);

View file

@ -1,6 +1,6 @@
import { ReactNative as RN, stylesheet } from "@metro/common"; import { ReactNative as RN, stylesheet } from "@metro/common";
import { Forms, Search } from "@ui/components";
import { all } from "@ui/assets"; import { all } from "@ui/assets";
import { Forms, Search } from "@ui/components";
import ErrorBoundary from "@ui/components/ErrorBoundary"; import ErrorBoundary from "@ui/components/ErrorBoundary";
import AssetDisplay from "@ui/settings/components/AssetDisplay"; import AssetDisplay from "@ui/settings/components/AssetDisplay";

View file

@ -1,11 +1,9 @@
import { ReactNative as RN, NavigationNative } from "@metro/common"; import { ReactNative as RN, NavigationNative } from "@metro/common";
import { Forms } from "@ui/components"; import { Forms } from "@ui/components";
import { getAssetIDByName } from "@ui/assets"; import { getAssetIDByName } from "@ui/assets";
import { showToast } from "@ui/toasts";
import { connectToDebugger } from "@lib/debug"; import { connectToDebugger } from "@lib/debug";
import { useProxy } from "@lib/storage"; import { useProxy } from "@lib/storage";
import settings, { loaderConfig } from "@lib/settings"; import settings, { loaderConfig } from "@lib/settings";
import logger from "@lib/logger";
import ErrorBoundary from "@ui/components/ErrorBoundary"; import ErrorBoundary from "@ui/components/ErrorBoundary";
const { FormSection, FormRow, FormSwitchRow, FormInput, FormDivider } = Forms; const { FormSection, FormRow, FormSwitchRow, FormInput, FormDivider } = Forms;
@ -37,18 +35,10 @@ export default function Developer() {
<FormRow <FormRow
label="Connect to React DevTools" label="Connect to React DevTools"
leading={<FormRow.Icon source={getAssetIDByName("ic_badge_staff")} />} leading={<FormRow.Icon source={getAssetIDByName("ic_badge_staff")} />}
onPress={() => { onPress={() => window.__vendetta_rdc?.connectToDevTools({
try {
window.__vendetta_rdc?.connectToDevTools({
host: settings.debuggerUrl.split(":")?.[0], host: settings.debuggerUrl.split(":")?.[0],
resolveRNStyle: RN.StyleSheet.flatten, resolveRNStyle: RN.StyleSheet.flatten,
}); })}
} catch (e) {
// TODO: Check if this ever actually catches anything
logger.error("Failed to connect to React DevTools!", e);
showToast("Failed to connect to React DevTools!", getAssetIDByName("Small"));
}
}}
/> />
</>} </>}
</FormSection> </FormSection>

View file

@ -1,7 +1,7 @@
import { ReactNative as RN, url, invites } from "@metro/common"; import { ReactNative as RN, url, invites } from "@metro/common";
import { DISCORD_SERVER, GITHUB } from "@lib/constants";
import { getAssetIDByName } from "@ui/assets"; import { getAssetIDByName } from "@ui/assets";
import { Forms, Summary } from "@ui/components"; import { Forms, Summary } from "@ui/components";
import { DISCORD_SERVER, GITHUB } from "@lib/constants";
import { getDebugInfo } from "@lib/debug"; import { getDebugInfo } from "@lib/debug";
import { useProxy } from "@lib/storage"; import { useProxy } from "@lib/storage";
import settings from "@lib/settings"; import settings from "@lib/settings";

View file

@ -1,8 +1,6 @@
import { toasts } from "@metro/common"; import { toasts } from "@metro/common";
export function showToast(content: string, asset: number) { export const showToast = (content: string, asset: number) => toasts.open({
return toasts.open({
content: content, content: content,
source: asset, source: asset,
}); });
}