diff --git a/plugins/server-drawer/src/lib/createElementIntercept.ts b/plugins/server-drawer/src/lib/createElementIntercept.ts
index 160bcbf..6572445 100644
--- a/plugins/server-drawer/src/lib/createElementIntercept.ts
+++ b/plugins/server-drawer/src/lib/createElementIntercept.ts
@@ -182,25 +182,22 @@ interface TypeDetector { justFired?: boolean }
* Returns the collapse depth a parent element should inherit from its children, or 0 for "leave
* this element alone."
*
- * Only collapses a parent that has this element as its *only* child. That guard is the whole
- * safety story here: a wrapper whose sole content is the server rail is, by definition, only there
- * to size and position the rail, so zeroing it is correct. A container that also holds the channel
- * list or the rest of the guilds screen has other children, propagation stops there, and the rest
- * of the UI is untouched.
+ * Returns the *maximum* collapse budget among real children. Previously this guarded against parents
+ * with multiple children, but the live GuildsBar rail has sibling wrappers (avatar/dm tile) inside
+ * the same outer container - the rail itself needs to be zeroed out too, and the replaced GuildsBar
+ * child is the only collapsed one.
*/
function inheritedCollapseDepth(props: any): number {
const children = props?.children;
if (children == null) return 0;
if (Array.isArray(children)) {
- let only: any = null;
+ let deepest = 0;
for (const child of children) {
- if (child == null || child === false) continue;
- if (only) return 0; // more than one real child - not a rail-only wrapper
- only = child;
+ if (child == null || child === false || typeof child !== "object") continue;
+ deepest = Math.max(deepest, collapseMarks.get(child) ?? 0);
}
- if (!only) return 0;
- return (typeof only === "object" ? collapseMarks.get(only) : 0) ?? 0;
+ return deepest;
}
if (typeof children !== "object") return 0;
@@ -215,7 +212,7 @@ function resolveReplacement(type: any, props: any): { type: any; props: any; col
if (effectiveProps) {
for (const { predicate, transform } of propsTransforms) {
try {
- if (predicate(effectiveProps)) {
+ if (predicate(effectiveProps, type)) {
effectiveProps = transform(effectiveProps);
}
} catch {
@@ -227,7 +224,7 @@ function resolveReplacement(type: any, props: any): { type: any; props: any; col
if (effectiveProps) {
for (const { predicate, replacement } of propsIntercepts) {
try {
- if (predicate(effectiveProps)) {
+ if (predicate(effectiveProps, type)) {
return replacement ? { type: replacement, props: effectiveProps } : null;
}
} catch {
diff --git a/plugins/server-drawer/src/patches/contentPatch.tsx b/plugins/server-drawer/src/patches/contentPatch.tsx
index c9802eb..b880f58 100644
--- a/plugins/server-drawer/src/patches/contentPatch.tsx
+++ b/plugins/server-drawer/src/patches/contentPatch.tsx
@@ -1,7 +1,7 @@
import { React } from "@vendetta/metro/common";
import { rawFind } from "../lib/rawFind";
import ServerDrawerSheet from "../components/ServerDrawerSheet";
-import { registerIntercept, registerTypeDetector } from "../lib/createElementIntercept";
+import { registerIntercept, registerPropsTransform, registerTypeDetector } from "../lib/createElementIntercept";
const TAG = "[ServerDrawer]";
@@ -24,6 +24,19 @@ function isNamed(name: string) {
type?.type?.name === name || type?.type?.displayName === name;
}
+const QUEST_DOCK_NAMES = [
+ "QuestDock",
+ "QuestDockBase",
+ "QuestDockWithQuestContext",
+ "QuestDockMain",
+ "QuestDockContent",
+ "QuestDockExpanded",
+];
+
+function isQuestDock(type: any): boolean {
+ return QUEST_DOCK_NAMES.some((name) => isNamed(name)(type));
+}
+
function ServerDrawerSheetWrapper() {
return ;
}
@@ -45,6 +58,20 @@ function ServerDrawerSheetWrapper() {
* when the race is won, and still shows correctly even when it's lost.
*/
export function patchExpanded(cleanups: (() => void)[]): boolean {
+ const questDockTypes = new Set();
+
+ // Make the quest dock's wrapper(s) transparent - the ServerDrawerSheet content still renders on
+ // top, but the panel/drawer background that used to be behind the quest menu is removed.
+ registerPropsTransform(
+ (_props: any, type: any) => questDockTypes.has(type),
+ (props: any) => ({ ...props, style: [props?.style, { backgroundColor: "transparent" }] }),
+ );
+
+ registerTypeDetector("ServerDrawer.QuestDockBg", isQuestDock, (real) => {
+ questDockTypes.add(real);
+ console.log(TAG, "PATCH: QuestDock wrapper set transparent", real?.name ?? real?.displayName);
+ }, { persistent: true });
+
registerTypeDetector("ServerDrawer.Expanded", isNamed("QuestDockContentExpanded"), (real) => {
registerIntercept(real, ServerDrawerSheetWrapper);
console.log(TAG, "PATCH: QuestDockContentExpanded replaced (type detector)");
diff --git a/plugins/server-drawer/src/patches/hideGuildsBar.tsx b/plugins/server-drawer/src/patches/hideGuildsBar.tsx
index a3dd5d2..e3c2289 100644
--- a/plugins/server-drawer/src/patches/hideGuildsBar.tsx
+++ b/plugins/server-drawer/src/patches/hideGuildsBar.tsx
@@ -69,7 +69,7 @@ export function patchHideGuildsBar(cleanups: (() => void)[]): boolean {
registerTypeDetector("ServerDrawer.HideGuildsBar", isGuildsBar, (realGuildsBar) => {
// Ask createElementIntercept to collapse a few ancestor levels as well so wrapper
// containers around the rail don't leave a leftover gap.
- registerIntercept(realGuildsBar, Nothing, undefined, { collapseAncestors: 3 });
+ registerIntercept(realGuildsBar, Nothing, undefined, { collapseAncestors: 6 });
console.log(TAG, "PATCH: found a real GuildsBar reference, now rendering nothing");
}, { persistent: true });
cleanups.push(() => {