diff --git a/src/api/ContextMenu.ts b/src/api/ContextMenu.ts index fdd4facf..fd8c7e10 100644 --- a/src/api/ContextMenu.ts +++ b/src/api/ContextMenu.ts @@ -90,19 +90,20 @@ export function removeGlobalContextMenuPatch(patch: GlobalContextMenuPatchCallba * A helper function for finding the children array of a group nested inside a context menu based on the id(s) of its children * @param id The id of the child. If an array is specified, all ids will be tried * @param children The context menu children + * @param matchSubstring Whether to check if the id is a substring of the child id */ -export function findGroupChildrenByChildId(id: string | string[], children: Array): Array | null { +export function findGroupChildrenByChildId(id: string | string[], children: Array, matchSubstring = false): Array | null { for (const child of children) { if (child == null) continue; if (Array.isArray(child)) { - const found = findGroupChildrenByChildId(id, child); + const found = findGroupChildrenByChildId(id, child, matchSubstring); if (found !== null) return found; } if ( - (Array.isArray(id) && id.some(id => child.props?.id === id)) - || child.props?.id === id + (Array.isArray(id) && id.some(id => matchSubstring ? child.props?.id?.includes(id) : child.props?.id === id)) + || matchSubstring ? child.props?.id?.includes(id) : child.props?.id === id ) return children; let nextChildren = child.props?.children; @@ -112,7 +113,7 @@ export function findGroupChildrenByChildId(id: string | string[], children: Arra child.props.children = nextChildren; } - const found = findGroupChildrenByChildId(id, nextChildren); + const found = findGroupChildrenByChildId(id, nextChildren, matchSubstring); if (found !== null) return found; } } diff --git a/src/plugins/fullSearchContext/index.tsx b/src/plugins/fullSearchContext/index.tsx index 158612c6..193e69f1 100644 --- a/src/plugins/fullSearchContext/index.tsx +++ b/src/plugins/fullSearchContext/index.tsx @@ -16,16 +16,25 @@ * along with this program. If not, see . */ +import { findGroupChildrenByChildId, NavContextMenuPatchCallback } from "@api/ContextMenu"; import { migratePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; +import { NoopComponent } from "@utils/react"; import definePlugin from "@utils/types"; -import { findByPropsLazy } from "@webpack"; +import { filters, findByPropsLazy, waitFor } from "@webpack"; import { ChannelStore, ContextMenuApi, i18n, UserStore } from "@webpack/common"; import { Message } from "discord-types/general"; -import type { MouseEvent } from "react"; const { useMessageMenu } = findByPropsLazy("useMessageMenu"); +interface CopyIdMenuItemProps { + id: string; + label: string; +} + +let CopyIdMenuItem: (props: CopyIdMenuItemProps) => React.ReactElement | null = NoopComponent; +waitFor(filters.componentByCode('"devmode-copy-id-".concat'), m => CopyIdMenuItem = m); + function MessageMenu({ message, channel, onHeightUpdate }) { const canReport = message.author && !(message.author.id === UserStore.getCurrentUser().id || message.author.system); @@ -48,9 +57,25 @@ function MessageMenu({ message, channel, onHeightUpdate }) { itemSrc: void 0, itemSafeSrc: void 0, itemTextContent: void 0, + + isFullSearchContextMenu: true }); } +interface MessageActionsProps { + message: Message; + isFullSearchContextMenu?: boolean; +} + +const contextMenuPatch: NavContextMenuPatchCallback = (children, props: MessageActionsProps) => { + if (props?.isFullSearchContextMenu == null) return; + + const group = findGroupChildrenByChildId("devmode-copy-id", children, true); + group?.push( + CopyIdMenuItem({ id: props.message.author.id, label: i18n.Messages.COPY_ID_AUTHOR }) + ); +}; + migratePluginSettings("FullSearchContext", "SearchReply"); export default definePlugin({ name: "FullSearchContext", @@ -65,7 +90,7 @@ export default definePlugin({ } }], - handleContextMenu(event: MouseEvent, message: Message) { + handleContextMenu(event: React.MouseEvent, message: Message) { const channel = ChannelStore.getChannel(message.channel_id); if (!channel) return; @@ -78,5 +103,9 @@ export default definePlugin({ onHeightUpdate={contextMenuProps.onHeightUpdate} /> ); + }, + + contextMenus: { + "message-actions": contextMenuPatch } });