mirror of
https://github.com/Vendicated/Vencord.git
synced 2025-01-10 09:56:24 +00:00
Merge branch 'dev' into patch-donor-and-contrib-cards
This commit is contained in:
commit
bbbeb37f6f
8 changed files with 114 additions and 28 deletions
|
@ -27,7 +27,7 @@ interface Props<T = any> {
|
||||||
/** Render nothing if an error occurs */
|
/** Render nothing if an error occurs */
|
||||||
noop?: boolean;
|
noop?: boolean;
|
||||||
/** Fallback component to render if an error occurs */
|
/** Fallback component to render if an error occurs */
|
||||||
fallback?: React.ComponentType<React.PropsWithChildren<{ error: any; message: string; stack: string; }>>;
|
fallback?: React.ComponentType<React.PropsWithChildren<{ error: any; message: string; stack: string; wrappedProps: T; }>>;
|
||||||
/** called when an error occurs. The props property is only available if using .wrap */
|
/** called when an error occurs. The props property is only available if using .wrap */
|
||||||
onError?(data: { error: Error, errorInfo: React.ErrorInfo, props: T; }): void;
|
onError?(data: { error: Error, errorInfo: React.ErrorInfo, props: T; }): void;
|
||||||
/** Custom error message */
|
/** Custom error message */
|
||||||
|
@ -81,6 +81,7 @@ const ErrorBoundary = LazyComponent(() => {
|
||||||
|
|
||||||
if (this.props.fallback)
|
if (this.props.fallback)
|
||||||
return <this.props.fallback
|
return <this.props.fallback
|
||||||
|
wrappedProps={this.props.wrappedProps}
|
||||||
children={this.props.children}
|
children={this.props.children}
|
||||||
{...this.state}
|
{...this.state}
|
||||||
/>;
|
/>;
|
||||||
|
|
|
@ -85,7 +85,7 @@ export default definePlugin({
|
||||||
replace: "$&onRequestClose:$self.onPopoutClose,"
|
replace: "$&onRequestClose:$self.onPopoutClose,"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
match: /(?<=.avatarWrapper,)/,
|
match: /(?<=\.avatarWrapper,)/,
|
||||||
replace: "ref:$self.accountPanelRef,onContextMenu:$self.openAccountPanelContextMenu,"
|
replace: "ref:$self.accountPanelRef,onContextMenu:$self.openAccountPanelContextMenu,"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
9
src/plugins/fullUserInChatbox/README.md
Normal file
9
src/plugins/fullUserInChatbox/README.md
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# Full User In Chatbox
|
||||||
|
|
||||||
|
Adds the full user mention to the textbox
|
||||||
|
|
||||||
|
Adds the avatar if you have mentioned avatars enabled
|
||||||
|
|
||||||
|
Provides the full context menu to make it easy to access the users profile, and other common actions
|
||||||
|
|
||||||
|
https://github.com/user-attachments/assets/cd9edb33-99c8-4c8d-b669-8cddd05f4b45
|
47
src/plugins/fullUserInChatbox/index.tsx
Normal file
47
src/plugins/fullUserInChatbox/index.tsx
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Vencord, a Discord client mod
|
||||||
|
* Copyright (c) 2024 Vendicated and contributors
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
import ErrorBoundary from "@components/ErrorBoundary";
|
||||||
|
import { Devs } from "@utils/constants";
|
||||||
|
import definePlugin from "@utils/types";
|
||||||
|
import { findComponentByCodeLazy } from "@webpack";
|
||||||
|
import { ReactNode } from "react";
|
||||||
|
|
||||||
|
const UserMentionComponent = findComponentByCodeLazy(".USER_MENTION)");
|
||||||
|
|
||||||
|
interface UserMentionComponentProps {
|
||||||
|
id: string;
|
||||||
|
channelId: string;
|
||||||
|
guildId: string;
|
||||||
|
OriginalComponent: ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default definePlugin({
|
||||||
|
name: "FullUserInChatbox",
|
||||||
|
description: "Makes the user mention in the chatbox have more functionalities, like left/right clicking",
|
||||||
|
authors: [Devs.sadan],
|
||||||
|
|
||||||
|
patches: [
|
||||||
|
{
|
||||||
|
find: ':"text":',
|
||||||
|
replacement: {
|
||||||
|
match: /(hidePersonalInformation\).+?)(if\(null!=\i\){.+?return \i)(?=})/,
|
||||||
|
replace: "$1return $self.UserMentionComponent({...arguments[0],OriginalComponent:(()=>{$2})()});"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
UserMentionComponent: ErrorBoundary.wrap((props: UserMentionComponentProps) => (
|
||||||
|
<UserMentionComponent
|
||||||
|
// This seems to be constant
|
||||||
|
className="mention"
|
||||||
|
userId={props.id}
|
||||||
|
channelId={props.channelId}
|
||||||
|
/>
|
||||||
|
), {
|
||||||
|
fallback: ({ wrappedProps }) => wrappedProps.OriginalComponent
|
||||||
|
})
|
||||||
|
});
|
5
src/plugins/noUnblockToJump/README.md
Normal file
5
src/plugins/noUnblockToJump/README.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# No Unblock To Jump
|
||||||
|
|
||||||
|
Removes the popup preventing you to jump to a message from a blocked/ignored user (eg: in search results)
|
||||||
|
|
||||||
|
![A modal popup telling you to unblock a user to jump their message](https://github.com/user-attachments/assets/0e4b859d-f3b3-4101-9a83-829afb473d1e)
|
|
@ -26,25 +26,46 @@ export default definePlugin({
|
||||||
authors: [Devs.dzshn],
|
authors: [Devs.dzshn],
|
||||||
patches: [
|
patches: [
|
||||||
{
|
{
|
||||||
|
// Clicking on search results to jump
|
||||||
find: '.id,"Search Results"',
|
find: '.id,"Search Results"',
|
||||||
replacement: {
|
replacement: [
|
||||||
|
{
|
||||||
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
||||||
replace: "if(false)$1"
|
replace: "if(false)$1"
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}#{intl::UNIGNORE_TO_JUMP_TITLE})/,
|
||||||
|
replace: "if(false)$1"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Jump buttton in top right corner of messages
|
||||||
find: "renderJumpButton()",
|
find: "renderJumpButton()",
|
||||||
replacement: {
|
replacement: [
|
||||||
|
{
|
||||||
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
||||||
replace: "if(false)$1"
|
replace: "if(false)$1"
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}#{intl::UNIGNORE_TO_JUMP_TITLE})/,
|
||||||
|
replace: "if(false)$1"
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Clicking on replied messages to jump
|
||||||
find: "flash:!0,returnMessageId",
|
find: "flash:!0,returnMessageId",
|
||||||
replacement: {
|
replacement: [
|
||||||
|
{
|
||||||
match: /.\?(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
match: /.\?(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
||||||
replace: "false?$1"
|
replace: "false?$1"
|
||||||
}
|
},
|
||||||
|
{
|
||||||
|
match: /.\?(.{1,10}\.show\({.{1,50}#{intl::UNIGNORE_TO_JUMP_TITLE})/,
|
||||||
|
replace: "false?$1"
|
||||||
|
},
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
|
@ -57,7 +57,7 @@ const UrlReplacementRules: Record<string, URLReplacementRule> = {
|
||||||
description: "Open Tidal links in the Tidal app",
|
description: "Open Tidal links in the Tidal app",
|
||||||
},
|
},
|
||||||
itunes: {
|
itunes: {
|
||||||
match: /^https:\/\/music\.apple\.com\/([a-z]{2}\/)?(album|artist|playlist|song|curator)\/([^/?#]+)\/?([^/?#]+)?(?:\?.*)?(?:#.*)?$/,
|
match: /^https:\/\/(?:geo\.)?music\.apple\.com\/([a-z]{2}\/)?(album|artist|playlist|song|curator)\/([^/?#]+)\/?([^/?#]+)?(?:\?.*)?(?:#.*)?$/,
|
||||||
replace: (_, lang, type, name, id) => id ? `itunes://music.apple.com/us/${type}/${name}/${id}` : `itunes://music.apple.com/us/${type}/${name}`,
|
replace: (_, lang, type, name, id) => id ? `itunes://music.apple.com/us/${type}/${name}/${id}` : `itunes://music.apple.com/us/${type}/${name}`,
|
||||||
description: "Open Apple Music links in the iTunes app"
|
description: "Open Apple Music links in the iTunes app"
|
||||||
},
|
},
|
||||||
|
|
|
@ -20,7 +20,7 @@ import { definePluginSettings, Settings } from "@api/Settings";
|
||||||
import { Devs } from "@utils/constants";
|
import { Devs } from "@utils/constants";
|
||||||
import definePlugin, { OptionType } from "@utils/types";
|
import definePlugin, { OptionType } from "@utils/types";
|
||||||
import { findByPropsLazy } from "@webpack";
|
import { findByPropsLazy } from "@webpack";
|
||||||
import { ChannelStore, FluxDispatcher as Dispatcher, MessageStore, PermissionsBits, PermissionStore, SelectedChannelStore, UserStore } from "@webpack/common";
|
import { ChannelStore, ComponentDispatch, FluxDispatcher as Dispatcher, MessageStore, PermissionsBits, PermissionStore, SelectedChannelStore, UserStore } from "@webpack/common";
|
||||||
import { Message } from "discord-types/general";
|
import { Message } from "discord-types/general";
|
||||||
|
|
||||||
const Kangaroo = findByPropsLazy("jumpToMessage");
|
const Kangaroo = findByPropsLazy("jumpToMessage");
|
||||||
|
@ -60,24 +60,24 @@ export default definePlugin({
|
||||||
settings,
|
settings,
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
Dispatcher.subscribe("DELETE_PENDING_REPLY", onDeletePendingReply);
|
|
||||||
Dispatcher.subscribe("MESSAGE_END_EDIT", onEndEdit);
|
|
||||||
Dispatcher.subscribe("MESSAGE_START_EDIT", onStartEdit);
|
|
||||||
Dispatcher.subscribe("CREATE_PENDING_REPLY", onCreatePendingReply);
|
|
||||||
document.addEventListener("keydown", onKeydown);
|
document.addEventListener("keydown", onKeydown);
|
||||||
},
|
},
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
Dispatcher.unsubscribe("DELETE_PENDING_REPLY", onDeletePendingReply);
|
|
||||||
Dispatcher.unsubscribe("MESSAGE_END_EDIT", onEndEdit);
|
|
||||||
Dispatcher.unsubscribe("MESSAGE_START_EDIT", onStartEdit);
|
|
||||||
Dispatcher.unsubscribe("CREATE_PENDING_REPLY", onCreatePendingReply);
|
|
||||||
document.removeEventListener("keydown", onKeydown);
|
document.removeEventListener("keydown", onKeydown);
|
||||||
},
|
},
|
||||||
});
|
|
||||||
|
|
||||||
const onDeletePendingReply = () => replyIdx = -1;
|
flux: {
|
||||||
const onEndEdit = () => editIdx = -1;
|
DELETE_PENDING_REPLY() {
|
||||||
|
replyIdx = -1;
|
||||||
|
},
|
||||||
|
MESSAGE_END_EDIT() {
|
||||||
|
editIdx = -1;
|
||||||
|
},
|
||||||
|
MESSAGE_START_EDIT: onStartEdit,
|
||||||
|
CREATE_PENDING_REPLY: onCreatePendingReply
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
function calculateIdx(messages: Message[], id: string) {
|
function calculateIdx(messages: Message[], id: string) {
|
||||||
const idx = messages.findIndex(m => m.id === id);
|
const idx = messages.findIndex(m => m.id === id);
|
||||||
|
@ -109,6 +109,8 @@ function onKeydown(e: KeyboardEvent) {
|
||||||
if (!isUp && e.key !== "ArrowDown") return;
|
if (!isUp && e.key !== "ArrowDown") return;
|
||||||
if (!isCtrl(e) || isAltOrMeta(e)) return;
|
if (!isCtrl(e) || isAltOrMeta(e)) return;
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
if (e.shiftKey)
|
if (e.shiftKey)
|
||||||
nextEdit(isUp);
|
nextEdit(isUp);
|
||||||
else
|
else
|
||||||
|
@ -194,9 +196,10 @@ function nextReply(isUp: boolean) {
|
||||||
channel,
|
channel,
|
||||||
message,
|
message,
|
||||||
shouldMention: shouldMention(message),
|
shouldMention: shouldMention(message),
|
||||||
showMentionToggle: channel.guild_id !== null && message.author.id !== meId,
|
showMentionToggle: channel.isPrivate() && message.author.id !== meId,
|
||||||
_isQuickReply: true
|
_isQuickReply: true
|
||||||
});
|
});
|
||||||
|
ComponentDispatch.dispatchToLastSubscribed("TEXTAREA_FOCUS");
|
||||||
jumpIfOffScreen(channel.id, message.id);
|
jumpIfOffScreen(channel.id, message.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue