feat(plugin): SearchReply (#551)
Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Co-authored-by: Vendicated <vendicated@riseup.net>
This commit is contained in:
		
							parent
							
								
									b90392576e
								
							
						
					
					
						commit
						0b4ae729a3
					
				
					 6 changed files with 141 additions and 4 deletions
				
			
		|  | @ -25,13 +25,12 @@ import ErrorBoundary from "@components/ErrorBoundary"; | |||
| import { Devs } from "@utils/constants"; | ||||
| import Logger from "@utils/Logger"; | ||||
| import definePlugin, { OptionType } from "@utils/types"; | ||||
| import { findByPropsLazy, findLazy } from "@webpack"; | ||||
| import { FluxDispatcher, Menu, moment, Parser, Timestamp, UserStore } from "@webpack/common"; | ||||
| import { findByPropsLazy } from "@webpack"; | ||||
| import { FluxDispatcher, i18n, Menu, moment, Parser, Timestamp, UserStore } from "@webpack/common"; | ||||
| 
 | ||||
| import overlayStyle from "./deleteStyleOverlay.css?managed"; | ||||
| import textStyle from "./deleteStyleText.css?managed"; | ||||
| 
 | ||||
| const i18n = findLazy(m => m.Messages?.["en-US"]); | ||||
| const styles = findByPropsLazy("edited", "communicationDisabled", "isSystemMessage"); | ||||
| 
 | ||||
| function addDeleteStyle() { | ||||
|  |  | |||
							
								
								
									
										80
									
								
								src/plugins/searchReply.tsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								src/plugins/searchReply.tsx
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,80 @@ | |||
| /* | ||||
|  * Vencord, a modification for Discord's desktop app | ||||
|  * Copyright (c) 2023 Vendicated and contributors | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | ||||
| */ | ||||
| 
 | ||||
| import { addContextMenuPatch, findGroupChildrenByChildId, NavContextMenuPatchCallback, removeContextMenuPatch } from "@api/ContextMenu"; | ||||
| import { Devs } from "@utils/constants"; | ||||
| import { LazyComponent } from "@utils/misc"; | ||||
| import definePlugin from "@utils/types"; | ||||
| import { findByCode, findByCodeLazy } from "@webpack"; | ||||
| import { ChannelStore, i18n, Menu, SelectedChannelStore } from "@webpack/common"; | ||||
| import { Message } from "discord-types/general"; | ||||
| 
 | ||||
| const ReplyIcon = LazyComponent(() => findByCode("M10 8.26667V4L3 11.4667L10 18.9333V14.56C15 14.56 18.5 16.2667 21 20C20 14.6667 17 9.33333 10 8.26667Z")); | ||||
| 
 | ||||
| const replyFn = findByCodeLazy("showMentionToggle", "TEXTAREA_FOCUS", "shiftKey"); | ||||
| 
 | ||||
| const messageContextMenuPatch: NavContextMenuPatchCallback = (children, { message }: { message: Message; }) => { | ||||
|     // make sure the message is in the selected channel
 | ||||
|     if (SelectedChannelStore.getChannelId() !== message.channel_id) return; | ||||
| 
 | ||||
|     const channel = ChannelStore.getChannel(message?.channel_id); | ||||
|     if (!channel) return; | ||||
| 
 | ||||
|     // dms and group chats
 | ||||
|     const dmGroup = findGroupChildrenByChildId("pin", children); | ||||
|     if (dmGroup && !dmGroup.some(child => child?.props?.id === "reply")) { | ||||
|         const pinIndex = dmGroup.findIndex(c => c.props.id === "pin"); | ||||
|         return dmGroup.splice(pinIndex + 1, 0, ( | ||||
|             <Menu.MenuItem | ||||
|                 id="reply" | ||||
|                 label={i18n.Messages.MESSAGE_ACTION_REPLY} | ||||
|                 icon={ReplyIcon} | ||||
|                 action={(e: React.MouseEvent) => replyFn(channel, message, e)} | ||||
|             /> | ||||
|         )); | ||||
|     } | ||||
| 
 | ||||
|     // servers
 | ||||
|     const serverGroup = findGroupChildrenByChildId("mark-unread", children); | ||||
|     if (serverGroup && !serverGroup.some(child => child?.props?.id === "reply")) { | ||||
|         return serverGroup.unshift(( | ||||
|             <Menu.MenuItem | ||||
|                 id="reply" | ||||
|                 label={i18n.Messages.MESSAGE_ACTION_REPLY} | ||||
|                 icon={ReplyIcon} | ||||
|                 action={(e: React.MouseEvent) => replyFn(channel, message, e)} | ||||
|             /> | ||||
|         )); | ||||
|     } | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| export default definePlugin({ | ||||
|     name: "SearchReply", | ||||
|     description: "Adds a reply button to search results", | ||||
|     authors: [Devs.Aria], | ||||
| 
 | ||||
|     start() { | ||||
|         addContextMenuPatch("message", messageContextMenuPatch); | ||||
|     }, | ||||
| 
 | ||||
|     stop() { | ||||
|         removeContextMenuPatch("message", messageContextMenuPatch); | ||||
|     } | ||||
| }); | ||||
|  | @ -206,6 +206,10 @@ export const Devs = /* #__PURE__*/ Object.freeze({ | |||
|         name: "cloudburst", | ||||
|         id: 892128204150685769n | ||||
|     }, | ||||
|     Aria: { | ||||
|         name: "Syncxv", | ||||
|         id: 549244932213309442n, | ||||
|     }, | ||||
|     TheKodeToad: { | ||||
|         name: "TheKodeToad", | ||||
|         id: 706152404072267788n | ||||
|  |  | |||
							
								
								
									
										24
									
								
								src/webpack/common/types/i18nMessages.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/webpack/common/types/i18nMessages.ts
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										28
									
								
								src/webpack/common/types/utils.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								src/webpack/common/types/utils.d.ts
									
										
									
									
										vendored
									
									
								
							|  | @ -19,6 +19,7 @@ | |||
| import type { ReactNode } from "react"; | ||||
| 
 | ||||
| import type { FluxEvents } from "./fluxEvents"; | ||||
| import { i18nMessages } from "./i18nMessages"; | ||||
| 
 | ||||
| export { FluxEvents }; | ||||
| 
 | ||||
|  | @ -82,3 +83,30 @@ export type RestAPI = Record<"delete" | "get" | "patch" | "post" | "put", (data: | |||
|     V8APIError: Error; | ||||
|     getAPIBaseURL(withVersion?: boolean): string; | ||||
| }; | ||||
| 
 | ||||
| export interface Locale { | ||||
|     name: string; | ||||
|     value: string; | ||||
|     localizedName: string; | ||||
| } | ||||
| 
 | ||||
| export interface LocaleInfo { | ||||
|     code: string; | ||||
|     enabled: boolean; | ||||
|     name: string; | ||||
|     englishName: string; | ||||
|     postgresLang: string; | ||||
| } | ||||
| 
 | ||||
| export interface i18n { | ||||
|     getAvailableLocales(): Locale[]; | ||||
|     getLanguages(): LocaleInfo[]; | ||||
|     getDefaultLocale(): string; | ||||
|     getLocale(): string; | ||||
|     getLocaleInfo(): LocaleInfo; | ||||
|     setLocale(locale: string): void; | ||||
| 
 | ||||
|     loadPromise: Promise<void>; | ||||
| 
 | ||||
|     Messages: Record<i18nMessages, string>; | ||||
| } | ||||
|  |  | |||
|  | @ -19,7 +19,7 @@ | |||
| import type { User } from "discord-types/general"; | ||||
| 
 | ||||
| // eslint-disable-next-line path-alias/no-relative
 | ||||
| import { _resolveReady,filters, findByCodeLazy, findByPropsLazy, mapMangledModuleLazy, waitFor } from "../webpack"; | ||||
| import { _resolveReady, filters, findByCodeLazy, findByPropsLazy, findLazy, mapMangledModuleLazy, waitFor } from "../webpack"; | ||||
| import type * as t from "./types/utils"; | ||||
| 
 | ||||
| export let FluxDispatcher: t.FluxDispatcher; | ||||
|  | @ -29,6 +29,8 @@ export const moment: typeof import("moment") = findByPropsLazy("parseTwoDigitYea | |||
| 
 | ||||
| export const hljs: typeof import("highlight.js") = findByPropsLazy("highlight"); | ||||
| 
 | ||||
| export const i18n: t.i18n = findLazy(m => m.Messages?.["en-US"]); | ||||
| 
 | ||||
| export let SnowflakeUtils: t.SnowflakeUtils; | ||||
| waitFor(["fromTimestamp", "extractTimestamp"], m => SnowflakeUtils = m); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue