diff options
Diffstat (limited to 'src/webpack')
-rw-r--r-- | src/webpack/common.tsx | 80 | ||||
-rw-r--r-- | src/webpack/webpack.ts | 22 |
2 files changed, 76 insertions, 26 deletions
diff --git a/src/webpack/common.tsx b/src/webpack/common.tsx index 6e93e27..82d812b 100644 --- a/src/webpack/common.tsx +++ b/src/webpack/common.tsx @@ -1,17 +1,43 @@ -import { startAll } from "../plugins"; -import { waitFor, filters, findByProps } from './webpack'; +import { waitFor, filters, _resolveReady } from './webpack'; import type Components from "discord-types/components"; import type Stores from "discord-types/stores"; import type Other from "discord-types/other"; +import { lazyWebpack } from '../utils/misc'; + +export const Margins = lazyWebpack(filters.byProps(["marginTop20"])); export let FluxDispatcher: Other.FluxDispatcher; export let React: typeof import("react"); export let UserStore: Stores.UserStore; -export const Forms: any = {}; +export const Forms = {} as { + FormTitle: Components.FormTitle; + FormSection: any; + FormDivider: any; + FormText: Components.FormText; +}; +export let Card: Components.Card; export let Button: any; export let Switch: any; export let Tooltip: Components.Tooltip; +export let Router: any; +export let Parser: any; +export let Alerts: { + show(alert: { + title: any; + body: React.ReactNode; + className?: string; + confirmColor?: string; + cancelText?: string; + confirmText?: string; + secondaryConfirmText?: string; + onCancel?(): void; + onConfirm?(): void; + onConfirmSecondary?(): void; + }): void; + /** This is a noop, it does nothing. */ + close(): void; +}; const ToastType = { MESSAGE: 0, SUCCESS: 1, @@ -27,28 +53,28 @@ export const Toasts = { Type: ToastType, Position: ToastPosition, // what's less likely than getting 0 from Math.random()? Getting it twice in a row - genId: () => (Math.random() || Math.random()).toString(36).slice(2) -} as { - Type: typeof ToastType, - Position: typeof ToastPosition; - genId(): string; - show(data: { - message: string, - id: string, - /** - * Toasts.Type - */ - type: number, - options?: { + genId: () => (Math.random() || Math.random()).toString(36).slice(2), + + // hack to merge with the following interface, dunno if there's a better way + ...{} as { + show(data: { + message: string, + id: string, /** - * Toasts.Position + * Toasts.Type */ - position?: number; - component?: React.ReactNode, - duration?: number; - }; - }): void; - pop(): void; + type: number, + options?: { + /** + * Toasts.Position + */ + position?: number; + component?: React.ReactNode, + duration?: number; + }; + }): void; + pop(): void; + } }; waitFor("useState", m => React = m); @@ -56,7 +82,7 @@ waitFor(["dispatch", "subscribe"], m => { FluxDispatcher = m; const cb = () => { m.unsubscribe("CONNECTION_OPEN", cb); - startAll(); + _resolveReady(); }; m.subscribe("CONNECTION_OPEN", cb); }); @@ -64,6 +90,7 @@ waitFor(["getCurrentUser", "initialize"], m => UserStore = m); waitFor(["Hovers", "Looks", "Sizes"], m => Button = m); waitFor(filters.byCode("helpdeskArticleId"), m => Switch = m); waitFor(["Positions", "Colors"], m => Tooltip = m); +waitFor(m => m.Types?.PRIMARY === "cardPrimary", m => Card = m); waitFor(m => m.Tags && filters.byCode("errorSeparator")(m), m => Forms.FormTitle = m); waitFor(m => m.Tags && filters.byCode("titleClassName", "sectionTitle")(m), m => Forms.FormSection = m); @@ -78,3 +105,8 @@ waitFor(m => { // This is the same module but this is easier waitFor(filters.byCode("currentToast?"), m => Toasts.show = m); waitFor(filters.byCode("currentToast:null"), m => Toasts.pop = m); + +waitFor(["show", "close"], m => Alerts = m); +waitFor("parseTopic", m => Parser = m); + +waitFor(["open", "saveAccountChanges"], m => Router = m); diff --git a/src/webpack/webpack.ts b/src/webpack/webpack.ts index 9e550a4..ea5a7e3 100644 --- a/src/webpack/webpack.ts +++ b/src/webpack/webpack.ts @@ -1,5 +1,12 @@ import type { WebpackInstance } from "discord-types/other"; +export let _resolveReady: () => void; +/** + * Fired once a gateway connection to Discord has been established. + * This indicates that the core webpack modules have been initialised + */ +export const onceReady = new Promise<void>(r => _resolveReady = r); + export let wreq: WebpackInstance; export let cache: WebpackInstance["c"]; @@ -68,8 +75,19 @@ export function findAll(filter: FilterFn, getDefault = true) { const ret = [] as any[]; for (const key in cache) { const mod = cache[key]; - if (mod?.exports && filter(mod.exports)) ret.push(mod.exports); - if (mod?.exports?.default && filter(mod.exports.default)) ret.push(getDefault ? mod.exports.default : mod.exports); + if (!mod?.exports) continue; + + if (filter(mod.exports)) + ret.push(mod.exports); + else if (typeof mod.exports !== "object") + continue; + + if (mod.exports.default && filter(mod.exports.default)) + ret.push(getDefault ? mod.exports.default : mod.exports); + else for (const nestedMod in mod.exports) if (nestedMod.length < 3) { + const nested = mod.exports[nestedMod]; + if (nested && filter(nested)) ret.push(nested); + } } return ret; |