From 34bc869a07004c6b120b2fb8a3e8a03c984cb68d Mon Sep 17 00:00:00 2001
From: amsyarasyiq <82711525+amsyarasyiq@users.noreply.github.com>
Date: Fri, 23 Feb 2024 02:26:42 +0800
Subject: [PATCH] Fix ContextMenu quirks
+ revert to old-ish overflow icon for Card component
---
src/ui/components/ContextMenu.tsx | 60 ++++++++++++++++++++++++-----
src/ui/settings/components/Card.tsx | 23 ++++++-----
2 files changed, 64 insertions(+), 19 deletions(-)
diff --git a/src/ui/components/ContextMenu.tsx b/src/ui/components/ContextMenu.tsx
index bb076b3..70cbd82 100644
--- a/src/ui/components/ContextMenu.tsx
+++ b/src/ui/components/ContextMenu.tsx
@@ -1,17 +1,57 @@
-import { findByProps } from "@/lib/metro/filters";
+import { findByProps } from "@lib/metro/filters";
+import { ReactNative } from "@lib/preinit";
+import { instead } from "@lib/patcher";
-const { ContextMenu } = findByProps("ContextMenu");
+const { ContextMenu: _ContextMenu } = findByProps("ContextMenu");
+const { AccessibilityInfo } = ReactNative
-export default ContextMenu as (props: {
+type ContextMenuItem = {
+ label: string,
+ iconSource: import("react-native").ImageSourcePropType,
+ action: () => unknown,
+ [key: string]: any;
+}
+
+type ContextMenuProps = {
triggerOnLongPress: boolean;
- items: Array<{
- label: string,
- iconSource: number,
- action: () => unknown,
- [key: string]: any;
- }>;
+ items: ContextMenuItem[] | ContextMenuItem[][];
align: "left" | "right" | "above" | "below" | "auto" | null;
title: string;
children: React.FC;
[key: string]: any;
-}) => JSX.Element;
\ No newline at end of file
+}
+
+export default function ContextMenu(props: ContextMenuProps) {
+ const ref = React.useRef(null);
+
+ React.useEffect(() => {
+ // hacky discord fix for android where pressing back with context menu open crashes the client
+ if (ReactNative.Platform.OS !== "android") return;
+
+ // @ts-ignore
+ const ctxMenuReactTag = ref.current?._children?.[0]?._nativeTag;
+
+ return () => {
+ if (!ctxMenuReactTag) return;
+
+ const unpatch = instead("setAccessibilityFocus", AccessibilityInfo, ([tag], orig) => {
+ if (tag !== ctxMenuReactTag) {
+ return orig.apply(AccessibilityInfo, [tag]);
+ } else {
+ unpatch(); // and skip this call
+ }
+ });
+ }
+ }, []);
+
+ return
+ <_ContextMenu
+ {...props}
+ title={props.title}
+ children={props.children}
+ triggerOnLongPress={props.triggerOnLongPress}
+ items={props.items}
+ align={props.align}
+ />
+
+}
\ No newline at end of file
diff --git a/src/ui/settings/components/Card.tsx b/src/ui/settings/components/Card.tsx
index a27fa45..cbf0923 100644
--- a/src/ui/settings/components/Card.tsx
+++ b/src/ui/settings/components/Card.tsx
@@ -29,6 +29,12 @@ const styles = stylesheet.createThemedStyleSheet({
marginLeft: 5,
tintColor: semanticColors?.INTERACTIVE_NORMAL,
},
+ icon: {
+ width: 22,
+ height: 22,
+ marginLeft: 5,
+ tintColor: semanticColors?.INTERACTIVE_NORMAL,
+ }
})
interface Action {
@@ -58,6 +64,7 @@ interface CardProps {
actions?: Action[];
overflowTitle?: string;
overflowActions?: OverflowAction[];
+ overflowIcon?: string;
}
export default function Card(props: CardProps) {
@@ -77,14 +84,15 @@ export default function Card(props: CardProps) {
{...headerProps}
value={props.toggleValue}
onValueChange={props.onToggleChange}
- /> : : props.toggleType === "radio" ?
+ {
pressableState = !pressableState;
props.onToggleChange?.(pressableState)
}}
checked={props.toggleValue}
- />)}
+ /> : undefined) || }
}
+ children={(props) =>
+
+ }
/>
}