From fc975f87cc6bc1d49ac4c0550015cb70293128c0 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Wed, 7 Jul 2021 18:38:49 +0300 Subject: [PATCH] Dialogs: Support alert-style answers from bots (#1239) --- src/api/gramjs/methods/bots.ts | 10 ++-------- src/api/gramjs/methods/client.ts | 1 + src/api/types/updates.ts | 1 + .../left/settings/folders/SettingsFoldersMain.tsx | 2 ++ src/components/main/Dialogs.scss | 8 -------- src/components/main/Dialogs.tsx | 9 +++++++-- src/components/middle/composer/Composer.tsx | 11 ++++++----- src/modules/actions/apiUpdaters/initial.ts | 2 +- src/modules/actions/ui/misc.ts | 2 +- src/modules/helpers/payments.ts | 2 +- src/util/getReadableErrorText.ts | 2 +- src/util/setupServiceWorker.ts | 2 +- 12 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/api/gramjs/methods/bots.ts b/src/api/gramjs/methods/bots.ts index 21d87ff38..ce62eb518 100644 --- a/src/api/gramjs/methods/bots.ts +++ b/src/api/gramjs/methods/bots.ts @@ -5,22 +5,16 @@ import { buildInputPeer } from '../gramjsBuilders'; export function init() { } -export async function answerCallbackButton( +export function answerCallbackButton( { chatId, accessHash, messageId, data, }: { chatId: number; accessHash?: string; messageId: number; data: string; }, ) { - const result = await invokeRequest(new GramJs.messages.GetBotCallbackAnswer({ + return invokeRequest(new GramJs.messages.GetBotCallbackAnswer({ peer: buildInputPeer(chatId, accessHash), msgId: messageId, data: Buffer.from(data), })); - - if (!result) { - return undefined; - } - - return result; } diff --git a/src/api/gramjs/methods/client.ts b/src/api/gramjs/methods/client.ts index 47c30b022..764b6eff0 100644 --- a/src/api/gramjs/methods/client.ts +++ b/src/api/gramjs/methods/client.ts @@ -261,6 +261,7 @@ export function dispatchErrorUpdate(err: Error, req error: { message, isSlowMode, + hasErrorKey: true, }, }); } diff --git a/src/api/types/updates.ts b/src/api/types/updates.ts index a06889b2e..5e71eeb13 100644 --- a/src/api/types/updates.ts +++ b/src/api/types/updates.ts @@ -313,6 +313,7 @@ export type ApiNotification = { export type ApiError = { message: string; + hasErrorKey?: boolean; isSlowMode?: boolean; textParams?: Record; }; diff --git a/src/components/left/settings/folders/SettingsFoldersMain.tsx b/src/components/left/settings/folders/SettingsFoldersMain.tsx index 9917d39f4..6bb3bcc59 100644 --- a/src/components/left/settings/folders/SettingsFoldersMain.tsx +++ b/src/components/left/settings/folders/SettingsFoldersMain.tsx @@ -78,6 +78,7 @@ const SettingsFoldersMain: FC = ({ showDialog({ data: { message: 'DIALOG_FILTERS_TOO_MUCH', + hasErrorKey: true, }, }); @@ -114,6 +115,7 @@ const SettingsFoldersMain: FC = ({ showDialog({ data: { message: 'DIALOG_FILTERS_TOO_MUCH', + hasErrorKey: true, }, }); diff --git a/src/components/main/Dialogs.scss b/src/components/main/Dialogs.scss index b88b78894..03e4cb7f2 100644 --- a/src/components/main/Dialogs.scss +++ b/src/components/main/Dialogs.scss @@ -6,11 +6,3 @@ height: 100vh; z-index: var(--z-modal); } - -.buttons { - display: flex; - - button { - flex: 1; - } -} diff --git a/src/components/main/Dialogs.tsx b/src/components/main/Dialogs.tsx index 8fc0ac61b..80ff54c5d 100644 --- a/src/components/main/Dialogs.tsx +++ b/src/components/main/Dialogs.tsx @@ -7,6 +7,7 @@ import { ApiError, ApiInviteInfo } from '../../api/types'; import getReadableErrorText from '../../util/getReadableErrorText'; import { pick } from '../../util/iteratees'; import useLang from '../../hooks/useLang'; +import renderText from '../common/helpers/renderText'; import Modal from '../ui/Modal'; import Button from '../ui/Button'; @@ -66,8 +67,8 @@ const Dialogs: FC = ({ dialogs, dismissDialog, accep className="error" title={getErrorHeader(error)} > -

{getReadableErrorText(error)}

-
+ {error.hasErrorKey ? getReadableErrorText(error) : renderText(error.message!, ['emoji', 'br'])} +
@@ -94,6 +95,10 @@ function getErrorHeader(error: ApiError) { return 'Slowmode enabled'; } + if (!error.hasErrorKey) { + return 'Telegram'; + } + return 'Something went wrong'; } diff --git a/src/components/middle/composer/Composer.tsx b/src/components/middle/composer/Composer.tsx index 10c1c7437..127ad504a 100644 --- a/src/components/middle/composer/Composer.tsx +++ b/src/components/middle/composer/Composer.tsx @@ -40,7 +40,7 @@ import { isChatPrivate, isChatAdmin, } from '../../../modules/helpers'; -import { formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat'; +import { formatMediaDuration, formatVoiceRecordDuration, getDayStartAt } from '../../../util/dateFormat'; import focusEditableElement from '../../../util/focusEditableElement'; import parseMessageInput from './helpers/parseMessageInput'; import buildAttachment from './helpers/buildAttachment'; @@ -211,6 +211,7 @@ const Composer: FC = ({ const [ scheduledMessageArgs, setScheduledMessageArgs, ] = useState(); + const lang = useLang(); // Cache for frequently updated state const htmlRef = useRef(html); @@ -435,6 +436,7 @@ const Composer: FC = ({ '{EXTRA_CHARS_COUNT}': extraLength, '{PLURAL_S}': extraLength > 1 ? 's' : '', }, + hasErrorKey: true, }, }); return; @@ -456,8 +458,9 @@ const Composer: FC = ({ : slowMode.seconds - secondsSinceLastMessage!; showDialog({ data: { - message: `A wait of ${secondsRemaining} seconds is required before sending another message in this chat`, + message: lang('SlowModeHint', formatMediaDuration(secondsRemaining)), isSlowMode: true, + hasErrorKey: false, }, }); @@ -488,7 +491,7 @@ const Composer: FC = ({ requestAnimationFrame(resetComposer); }, [ connectionState, attachments, activeVoiceRecording, isForwarding, serverTimeOffset, clearDraft, chatId, - resetComposer, stopRecordingVoice, showDialog, slowMode, isAdmin, sendMessage, forwardMessages, + resetComposer, stopRecordingVoice, showDialog, slowMode, isAdmin, sendMessage, forwardMessages, lang, ]); const handleStickerSelect = useCallback((sticker: ApiSticker) => { @@ -635,8 +638,6 @@ const Composer: FC = ({ activeVoiceRecording, openCalendar, pauseRecordingVoice, handleSend, ]); - const lang = useLang(); - const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record && !allowedAttachmentOptions.canAttachMedia; diff --git a/src/modules/actions/apiUpdaters/initial.ts b/src/modules/actions/apiUpdaters/initial.ts index 2675c6135..6ab7baea4 100644 --- a/src/modules/actions/apiUpdaters/initial.ts +++ b/src/modules/actions/apiUpdaters/initial.ts @@ -59,7 +59,7 @@ addReducer('apiUpdate', (global, actions, update: ApiUpdate) => { actions.signOut(); } - actions.showDialog({ data: update.error }); + actions.showDialog({ data: { ...update.error, hasErrorKey: true } }); break; } diff --git a/src/modules/actions/ui/misc.ts b/src/modules/actions/ui/misc.ts index fa7b960e4..5516566f1 100644 --- a/src/modules/actions/ui/misc.ts +++ b/src/modules/actions/ui/misc.ts @@ -163,7 +163,7 @@ addReducer('showDialog', (global, actions, payload) => { const { data } = payload!; // Filter out errors that we don't want to show to the user - if ('message' in data && !getReadableErrorText(data)) { + if ('message' in data && data.hasErrorKey && !getReadableErrorText(data)) { return global; } diff --git a/src/modules/helpers/payments.ts b/src/modules/helpers/payments.ts index 16a0652e3..1e28de258 100644 --- a/src/modules/helpers/payments.ts +++ b/src/modules/helpers/payments.ts @@ -95,7 +95,7 @@ const SHIPPING_ERRORS: Record> = { export function getShippingErrors(dialogs: (ApiError | ApiInviteInfo)[]) { return Object.values(dialogs).reduce((acc, cur) => { - if (!('message' in cur)) return acc; + if (!('hasErrorKey' in cur) || !cur.hasErrorKey) return acc; const error = SHIPPING_ERRORS[cur.message]; if (error) { acc = { diff --git a/src/util/getReadableErrorText.ts b/src/util/getReadableErrorText.ts index aaf5ab449..4057c33e6 100644 --- a/src/util/getReadableErrorText.ts +++ b/src/util/getReadableErrorText.ts @@ -64,7 +64,7 @@ const READABLE_ERROR_MESSAGES: Record = { export default function getReadableErrorText(error: ApiError) { const { message, isSlowMode, textParams } = error; - // Currently Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs + // Currently, Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs if (isSlowMode) { const extraPartIndex = message.indexOf(' (caused by'); return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message; diff --git a/src/util/setupServiceWorker.ts b/src/util/setupServiceWorker.ts index e79d56659..58172ef24 100644 --- a/src/util/setupServiceWorker.ts +++ b/src/util/setupServiceWorker.ts @@ -52,7 +52,7 @@ if (IS_SERVICE_WORKER_SUPPORTED) { // eslint-disable-next-line no-console console.error('[SW] ServiceWorker not available'); } - getDispatch().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED' } }); + getDispatch().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } }); } } catch (err) { if (DEBUG) {