import { React } from "@vendetta/metro/common"; interface Intercept { replacement: React.ComponentType; extraProps?: Record; } const intercepts = new Map, Intercept>(); let origCreateElement: typeof React.createElement | null = null; let isPatched = false; export function registerIntercept( original: React.ComponentType, replacement: React.ComponentType, extraProps?: Record, ) { intercepts.set(original, { replacement, extraProps }); } export function patchCreateElement(cleanups: (() => void)[]) { if (isPatched) return; origCreateElement = React.createElement; if (!origCreateElement) { console.warn("[ServerDrawer] React.createElement is null, skipping patch"); return; } const patched = function (type: any, props: any, ...rest: any[]) { if (!origCreateElement) { return React.createElement(type, props, ...rest); } const entry = intercepts.get(type); if (entry) { const newProps = entry.extraProps ? { ...props, ...entry.extraProps } : props; return origCreateElement.call(React, entry.replacement, newProps, ...rest); } return origCreateElement.call(React, type, props, ...rest); }; Object.assign(patched, origCreateElement); React.createElement = patched as typeof React.createElement; isPatched = true; cleanups.push(() => { if (isPatched && origCreateElement) { React.createElement = origCreateElement; isPatched = false; } intercepts.clear(); }); }