fix(MessageClickActions): single clicks no longer trigger double click actions (#667)
* fix(MessageClickActions): single clicks no longer trigger double click actions a somewhat hacky fix but it works * feat(MessageClickActions): add DELETE modifier key
This commit is contained in:
parent
4b95f90db6
commit
76d9f76fae
1 changed files with 54 additions and 28 deletions
|
|
@ -15,7 +15,7 @@ import type { Message } from "@vencord/discord-types";
|
||||||
import { ApplicationIntegrationType, MessageFlags } from "@vencord/discord-types/enums";
|
import { ApplicationIntegrationType, MessageFlags } from "@vencord/discord-types/enums";
|
||||||
import { AuthenticationStore, Constants, EditMessageStore, FluxDispatcher, MessageActions, MessageTypeSets, PermissionsBits, PermissionStore, PinActions, RestAPI, showToast, Toasts, WindowStore } from "@webpack/common";
|
import { AuthenticationStore, Constants, EditMessageStore, FluxDispatcher, MessageActions, MessageTypeSets, PermissionsBits, PermissionStore, PinActions, RestAPI, showToast, Toasts, WindowStore } from "@webpack/common";
|
||||||
|
|
||||||
type Modifier = "NONE" | "SHIFT" | "CTRL" | "ALT" | "BACKSPACE";
|
type Modifier = "NONE" | "SHIFT" | "CTRL" | "ALT" | "BACKSPACE" | "DELETE";
|
||||||
type ClickAction = "NONE" | "DELETE" | "COPY_LINK" | "COPY_ID" | "COPY_CONTENT" | "COPY_USER_ID" | "EDIT" | "REPLY" | "REACT" | "OPEN_THREAD" | "OPEN_TAB" | "EDIT_REPLY" | "QUOTE" | "PIN";
|
type ClickAction = "NONE" | "DELETE" | "COPY_LINK" | "COPY_ID" | "COPY_CONTENT" | "COPY_USER_ID" | "EDIT" | "REPLY" | "REACT" | "OPEN_THREAD" | "OPEN_TAB" | "EDIT_REPLY" | "QUOTE" | "PIN";
|
||||||
|
|
||||||
const actions: { label: string; value: ClickAction; }[] = [
|
const actions: { label: string; value: ClickAction; }[] = [
|
||||||
|
|
@ -65,6 +65,7 @@ const modifiers: { label: string; value: Modifier; }[] = [
|
||||||
|
|
||||||
const singleClickModifiers: { label: string; value: Modifier; }[] = [
|
const singleClickModifiers: { label: string; value: Modifier; }[] = [
|
||||||
{ label: "Backspace", value: "BACKSPACE" },
|
{ label: "Backspace", value: "BACKSPACE" },
|
||||||
|
{ label: "Delete", value: "DELETE" },
|
||||||
...modifiers
|
...modifiers
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
@ -73,11 +74,13 @@ const keydown = (e: KeyboardEvent) => {
|
||||||
const mod = modifierFromKey(e);
|
const mod = modifierFromKey(e);
|
||||||
if (mod) pressedModifiers.add(mod);
|
if (mod) pressedModifiers.add(mod);
|
||||||
if (e.key === "Backspace") pressedModifiers.add("BACKSPACE");
|
if (e.key === "Backspace") pressedModifiers.add("BACKSPACE");
|
||||||
|
if (e.key === "Delete") pressedModifiers.add("DELETE");
|
||||||
};
|
};
|
||||||
const keyup = (e: KeyboardEvent) => {
|
const keyup = (e: KeyboardEvent) => {
|
||||||
const mod = modifierFromKey(e);
|
const mod = modifierFromKey(e);
|
||||||
if (mod) pressedModifiers.delete(mod);
|
if (mod) pressedModifiers.delete(mod);
|
||||||
if (e.key === "Backspace") pressedModifiers.delete("BACKSPACE");
|
if (e.key === "Backspace") pressedModifiers.delete("BACKSPACE");
|
||||||
|
if (e.key === "Delete") pressedModifiers.delete("DELETE");
|
||||||
};
|
};
|
||||||
const focusChanged = () => {
|
const focusChanged = () => {
|
||||||
if (!WindowStore.isFocused()) {
|
if (!WindowStore.isFocused()) {
|
||||||
|
|
@ -97,6 +100,7 @@ function isModifierPressed(modifier: Modifier): boolean {
|
||||||
}
|
}
|
||||||
|
|
||||||
let doubleClickTimeout: ReturnType<typeof setTimeout> | null = null;
|
let doubleClickTimeout: ReturnType<typeof setTimeout> | null = null;
|
||||||
|
let singleClickTimeout: ReturnType<typeof setTimeout> | null = null;
|
||||||
let pendingDoubleClickAction: (() => void) | null = null;
|
let pendingDoubleClickAction: (() => void) | null = null;
|
||||||
|
|
||||||
const settings = definePluginSettings({
|
const settings = definePluginSettings({
|
||||||
|
|
@ -461,6 +465,10 @@ export default definePlugin({
|
||||||
clearTimeout(doubleClickTimeout);
|
clearTimeout(doubleClickTimeout);
|
||||||
doubleClickTimeout = null;
|
doubleClickTimeout = null;
|
||||||
}
|
}
|
||||||
|
if (singleClickTimeout) {
|
||||||
|
clearTimeout(singleClickTimeout);
|
||||||
|
singleClickTimeout = null;
|
||||||
|
}
|
||||||
pendingDoubleClickAction = null;
|
pendingDoubleClickAction = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -486,6 +494,11 @@ export default definePlugin({
|
||||||
const isDoubleClick = event.detail === 2;
|
const isDoubleClick = event.detail === 2;
|
||||||
const isTripleClick = event.detail === 3;
|
const isTripleClick = event.detail === 3;
|
||||||
|
|
||||||
|
if (singleClickTimeout) {
|
||||||
|
clearTimeout(singleClickTimeout);
|
||||||
|
singleClickTimeout = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (isTripleClick) {
|
if (isTripleClick) {
|
||||||
if (doubleClickTimeout) {
|
if (doubleClickTimeout) {
|
||||||
clearTimeout(doubleClickTimeout);
|
clearTimeout(doubleClickTimeout);
|
||||||
|
|
@ -499,37 +512,50 @@ export default definePlugin({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isDoubleClick) {
|
const canDoubleClick = (isModifierPressed(doubleClickModifier) || doubleClickModifier === "NONE") && doubleClickAction !== "NONE";
|
||||||
if (isSingleClick && isModifierPressed(singleClickModifier) && singleClickAction !== "NONE") {
|
|
||||||
executeAction(singleClickAction, msg, channel, event);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const executeDoubleClick = () => {
|
|
||||||
if (channel.guild_id && !PermissionStore.can(PermissionsBits.SEND_MESSAGES, channel)) return;
|
|
||||||
if (msg.deleted === true) return;
|
|
||||||
if (doubleClickAction !== "NONE") {
|
|
||||||
executeAction(doubleClickAction, msg, channel, event);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const canTripleClick = isModifierPressed(tripleClickModifier) && tripleClickAction !== "NONE";
|
const canTripleClick = isModifierPressed(tripleClickModifier) && tripleClickAction !== "NONE";
|
||||||
|
|
||||||
if (canTripleClick) {
|
if (isDoubleClick) {
|
||||||
if (doubleClickTimeout) {
|
const executeDoubleClick = () => {
|
||||||
clearTimeout(doubleClickTimeout);
|
if (channel.guild_id && !PermissionStore.can(PermissionsBits.SEND_MESSAGES, channel)) return;
|
||||||
|
if (msg.deleted === true) return;
|
||||||
|
if (canDoubleClick) {
|
||||||
|
executeAction(doubleClickAction, msg, channel, event);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (canTripleClick) {
|
||||||
|
if (doubleClickTimeout) {
|
||||||
|
clearTimeout(doubleClickTimeout);
|
||||||
|
}
|
||||||
|
pendingDoubleClickAction = executeDoubleClick;
|
||||||
|
doubleClickTimeout = setTimeout(() => {
|
||||||
|
pendingDoubleClickAction?.();
|
||||||
|
pendingDoubleClickAction = null;
|
||||||
|
doubleClickTimeout = null;
|
||||||
|
}, settings.store.clickTimeout);
|
||||||
|
} else {
|
||||||
|
executeDoubleClick();
|
||||||
}
|
}
|
||||||
pendingDoubleClickAction = executeDoubleClick;
|
|
||||||
doubleClickTimeout = setTimeout(() => {
|
|
||||||
pendingDoubleClickAction?.();
|
|
||||||
pendingDoubleClickAction = null;
|
|
||||||
doubleClickTimeout = null;
|
|
||||||
}, settings.store.clickTimeout);
|
|
||||||
event.preventDefault();
|
|
||||||
} else if (isDoubleClick && (isModifierPressed(doubleClickModifier) || doubleClickModifier === "NONE")) {
|
|
||||||
executeDoubleClick();
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSingleClick) {
|
||||||
|
const executeSingleClick = () => {
|
||||||
|
if (isModifierPressed(singleClickModifier) && singleClickAction !== "NONE") {
|
||||||
|
executeAction(singleClickAction, msg, channel, event);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (canDoubleClick) {
|
||||||
|
singleClickTimeout = setTimeout(() => {
|
||||||
|
executeSingleClick();
|
||||||
|
singleClickTimeout = null;
|
||||||
|
}, settings.store.clickTimeout);
|
||||||
|
} else {
|
||||||
|
executeSingleClick();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue