Composer: Preserve suggested bot command parameters (#1417)
This commit is contained in:
parent
d2b2ee6903
commit
9ec67df99d
12
src/components/middle/composer/helpers/prepareForRegExp.ts
Normal file
12
src/components/middle/composer/helpers/prepareForRegExp.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const RE_BR = /(<br>|<br\s?\/>)/g;
|
||||||
|
const RE_SPACE = /( |\u00A0)/g;
|
||||||
|
const RE_CLEAN_HTML = /(<div>|<\/div>)/gi;
|
||||||
|
const RE_EXTRA_NEW_LINE = /\n$/i;
|
||||||
|
|
||||||
|
export function prepareForRegExp(html: string) {
|
||||||
|
return html
|
||||||
|
.replace(RE_SPACE, ' ')
|
||||||
|
.replace(RE_BR, '\n')
|
||||||
|
.replace(RE_CLEAN_HTML, '')
|
||||||
|
.replace(RE_EXTRA_NEW_LINE, '');
|
||||||
|
}
|
||||||
@ -4,11 +4,12 @@ import {
|
|||||||
|
|
||||||
import { ApiBotCommand } from '../../../../api/types';
|
import { ApiBotCommand } from '../../../../api/types';
|
||||||
|
|
||||||
|
import { prepareForRegExp } from '../helpers/prepareForRegExp';
|
||||||
import { throttle } from '../../../../util/schedulers';
|
import { throttle } from '../../../../util/schedulers';
|
||||||
import useFlag from '../../../../hooks/useFlag';
|
import useFlag from '../../../../hooks/useFlag';
|
||||||
|
|
||||||
const runThrottled = throttle((cb) => cb(), 500, true);
|
const runThrottled = throttle((cb) => cb(), 500, true);
|
||||||
const RE_COMMAND = /[\w\d_-]*/i;
|
const RE_COMMAND = /^[\w@]{1,32}\s?/i;
|
||||||
|
|
||||||
export default function useBotCommandTooltip(
|
export default function useBotCommandTooltip(
|
||||||
isAllowed: boolean,
|
isAllowed: boolean,
|
||||||
@ -44,7 +45,7 @@ export default function useBotCommandTooltip(
|
|||||||
const shouldShowCommands = html.startsWith('/');
|
const shouldShowCommands = html.startsWith('/');
|
||||||
|
|
||||||
if (shouldShowCommands) {
|
if (shouldShowCommands) {
|
||||||
const filter = html.substr(1).match(RE_COMMAND);
|
const filter = prepareForRegExp(html.substr(1)).match(RE_COMMAND);
|
||||||
getFilteredCommands(filter ? filter[0] : '');
|
getFilteredCommands(filter ? filter[0] : '');
|
||||||
} else {
|
} else {
|
||||||
unmarkIsOpen();
|
unmarkIsOpen();
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import {
|
|||||||
|
|
||||||
import { EDITABLE_INPUT_ID } from '../../../../config';
|
import { EDITABLE_INPUT_ID } from '../../../../config';
|
||||||
import { MEMO_EMPTY_ARRAY } from '../../../../util/memo';
|
import { MEMO_EMPTY_ARRAY } from '../../../../util/memo';
|
||||||
|
import { prepareForRegExp } from '../helpers/prepareForRegExp';
|
||||||
import {
|
import {
|
||||||
EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,
|
EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,
|
||||||
} from '../../../../util/emoji';
|
} from '../../../../util/emoji';
|
||||||
@ -20,9 +21,6 @@ let emojiData: EmojiData;
|
|||||||
let RE_EMOJI_SEARCH: RegExp;
|
let RE_EMOJI_SEARCH: RegExp;
|
||||||
const EMOJIS_LIMIT = 36;
|
const EMOJIS_LIMIT = 36;
|
||||||
const FILTER_MIN_LENGTH = 2;
|
const FILTER_MIN_LENGTH = 2;
|
||||||
const RE_BR = /(<br>|<br\s?\/>)/g;
|
|
||||||
const RE_SPACE = / /g;
|
|
||||||
const RE_CLEAN_HTML = /(<div>|<\/div>)/gi;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
RE_EMOJI_SEARCH = new RegExp('(^|\\s):[-+_:\\p{L}\\p{N}]*$', 'gui');
|
RE_EMOJI_SEARCH = new RegExp('(^|\\s):[-+_:\\p{L}\\p{N}]*$', 'gui');
|
||||||
@ -188,12 +186,7 @@ export default function useEmojiTooltip(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getEmojiCode(html: string) {
|
function getEmojiCode(html: string) {
|
||||||
const emojis = html
|
const emojis = prepareForRegExp(html).match(RE_EMOJI_SEARCH);
|
||||||
.replace(RE_SPACE, ' ')
|
|
||||||
.replace(RE_BR, '\n')
|
|
||||||
.replace(/\n$/i, '')
|
|
||||||
.replace(RE_CLEAN_HTML, '')
|
|
||||||
.match(RE_EMOJI_SEARCH);
|
|
||||||
|
|
||||||
return emojis ? emojis[0].trim() : undefined;
|
return emojis ? emojis[0].trim() : undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,15 +6,13 @@ import { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/t
|
|||||||
import { EDITABLE_INPUT_ID } from '../../../../config';
|
import { EDITABLE_INPUT_ID } from '../../../../config';
|
||||||
import { getUserFirstOrLastName } from '../../../../modules/helpers';
|
import { getUserFirstOrLastName } from '../../../../modules/helpers';
|
||||||
import searchUserName from '../helpers/searchUserName';
|
import searchUserName from '../helpers/searchUserName';
|
||||||
|
import { prepareForRegExp } from '../helpers/prepareForRegExp';
|
||||||
import focusEditableElement from '../../../../util/focusEditableElement';
|
import focusEditableElement from '../../../../util/focusEditableElement';
|
||||||
import useFlag from '../../../../hooks/useFlag';
|
import useFlag from '../../../../hooks/useFlag';
|
||||||
import { unique } from '../../../../util/iteratees';
|
import { unique } from '../../../../util/iteratees';
|
||||||
import { throttle } from '../../../../util/schedulers';
|
import { throttle } from '../../../../util/schedulers';
|
||||||
|
|
||||||
const runThrottled = throttle((cb) => cb(), 500, true);
|
const runThrottled = throttle((cb) => cb(), 500, true);
|
||||||
const RE_BR = /(<br>|<br\s?\/>)/g;
|
|
||||||
const RE_SPACE = / /g;
|
|
||||||
const RE_CLEAN_HTML = /(<div>|<\/div>)/gi;
|
|
||||||
let RE_USERNAME_SEARCH: RegExp;
|
let RE_USERNAME_SEARCH: RegExp;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -126,12 +124,7 @@ export default function useMentionTooltip(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getUsernameFilter(html: string) {
|
function getUsernameFilter(html: string) {
|
||||||
const username = html
|
const username = prepareForRegExp(html).match(RE_USERNAME_SEARCH);
|
||||||
.replace(RE_SPACE, ' ')
|
|
||||||
.replace(RE_BR, '\n')
|
|
||||||
.replace(RE_CLEAN_HTML, '')
|
|
||||||
.replace(/\n$/i, '')
|
|
||||||
.match(RE_USERNAME_SEARCH);
|
|
||||||
|
|
||||||
return username ? username[0].trim() : undefined;
|
return username ? username[0].trim() : undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -69,11 +69,17 @@ addReducer('sendBotCommand', (global, actions, payload) => {
|
|||||||
const { command, chatId } = payload;
|
const { command, chatId } = payload;
|
||||||
const { currentUserId } = global;
|
const { currentUserId } = global;
|
||||||
const chat = chatId ? selectChat(global, chatId) : selectCurrentChat(global);
|
const chat = chatId ? selectChat(global, chatId) : selectCurrentChat(global);
|
||||||
if (!currentUserId || !chat) {
|
const currentMessageList = selectCurrentMessageList(global);
|
||||||
|
|
||||||
|
if (!currentUserId || !chat || !currentMessageList) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendBotCommand(chat, currentUserId, command);
|
const { threadId } = currentMessageList;
|
||||||
|
actions.setReplyingToId({ messageId: undefined });
|
||||||
|
actions.clearWebPagePreview({ chatId: chat.id, threadId, value: false });
|
||||||
|
|
||||||
|
void sendBotCommand(chat, currentUserId, command, selectReplyingToId(global, chat.id, threadId));
|
||||||
});
|
});
|
||||||
|
|
||||||
addReducer('restartBot', (global, actions, payload) => {
|
addReducer('restartBot', (global, actions, payload) => {
|
||||||
@ -298,10 +304,11 @@ async function searchInlineBot({
|
|||||||
setGlobal(global);
|
setGlobal(global);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sendBotCommand(chat: ApiChat, currentUserId: number, command: string) {
|
async function sendBotCommand(chat: ApiChat, currentUserId: number, command: string, replyingTo?: number) {
|
||||||
await callApi('sendMessage', {
|
await callApi('sendMessage', {
|
||||||
chat,
|
chat,
|
||||||
text: command,
|
text: command,
|
||||||
|
replyingTo,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user