Browse Source

Support forwarding with replies

Fix resetting formatting on empty message input
Copy monospace text by click
Use different color for monospace in text
Replace sending messageEntityPre to messageEntityCode
Layer 140
master
Eduard Kuzmenko 3 years ago
parent
commit
59c4fe510d
  1. 16
      src/components/chat/bubbles.ts
  2. 20
      src/components/chat/input.ts
  3. 16
      src/helpers/dom/copyFromElement.ts
  4. 8
      src/helpers/dom/getRichElementValue.ts
  5. 40
      src/helpers/selectionSaver.ts
  6. 1
      src/lang.ts
  7. 397
      src/layer.d.ts
  8. 4
      src/lib/appManagers/appChatsManager.ts
  9. 24
      src/lib/appManagers/appMessagesManager.ts
  10. 2
      src/lib/mediaPlayer.ts
  11. 2
      src/lib/mtproto/schema.ts
  12. 7
      src/lib/storages/dialogs.ts
  13. 4
      src/scripts/in/schema.json
  14. 2
      src/scripts/out/schema.json
  15. 11
      src/scss/partials/_chatBubble.scss
  16. 2
      src/scss/style.scss

16
src/components/chat/bubbles.ts

@ -54,7 +54,7 @@ import serverTimeManager from "../../lib/mtproto/serverTimeManager";
import PeerTitle from "../peerTitle"; import PeerTitle from "../peerTitle";
import findUpClassName from "../../helpers/dom/findUpClassName"; import findUpClassName from "../../helpers/dom/findUpClassName";
import findUpTag from "../../helpers/dom/findUpTag"; import findUpTag from "../../helpers/dom/findUpTag";
import { toast } from "../toast"; import { toast, toastNew } from "../toast";
import { getElementByPoint } from "../../helpers/dom/getElementByPoint"; import { getElementByPoint } from "../../helpers/dom/getElementByPoint";
import { getMiddleware } from "../../helpers/middleware"; import { getMiddleware } from "../../helpers/middleware";
import cancelEvent from "../../helpers/dom/cancelEvent"; import cancelEvent from "../../helpers/dom/cancelEvent";
@ -98,6 +98,10 @@ import findAndSplice from "../../helpers/array/findAndSplice";
import getViewportSlice from "../../helpers/dom/getViewportSlice"; import getViewportSlice from "../../helpers/dom/getViewportSlice";
import SuperIntersectionObserver from "../../helpers/dom/superIntersectionObserver"; import SuperIntersectionObserver from "../../helpers/dom/superIntersectionObserver";
import generateFakeIcon from "../generateFakeIcon"; import generateFakeIcon from "../generateFakeIcon";
import selectElementContents from "../../helpers/dom/selectElementContents";
import cancelSelection from "../../helpers/dom/cancelSelection";
import SelectionSaver from "../../helpers/selectionSaver";
import copyFromElement from "../../helpers/dom/copyFromElement";
const USE_MEDIA_TAILS = false; const USE_MEDIA_TAILS = false;
const IGNORE_ACTIONS: Set<Message.messageService['action']['_']> = new Set([ const IGNORE_ACTIONS: Set<Message.messageService['action']['_']> = new Set([
@ -632,6 +636,16 @@ export default class ChatBubbles {
attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter}); attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});
// this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */); // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);
this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {
const code: HTMLElement = findUpTag(e.target, 'CODE');
if(code) {
cancelEvent(e);
copyFromElement(code);
toastNew({langPackKey: 'TextCopied'});
return;
}
});
if(DEBUG) { if(DEBUG) {
this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => { this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {
const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble'); const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');

20
src/components/chat/input.ts

@ -1711,14 +1711,16 @@ export default class ChatInput {
}; };
public applyMarkdown(type: MarkdownType, href?: string) { public applyMarkdown(type: MarkdownType, href?: string) {
const MONOSPACE_FONT = 'var(--font-monospace)';
const SPOILER_FONT = 'spoiler';
const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = { const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {
bold: 'Bold', bold: 'Bold',
italic: 'Italic', italic: 'Italic',
underline: 'Underline', underline: 'Underline',
strikethrough: 'Strikethrough', strikethrough: 'Strikethrough',
monospace: () => document.execCommand('fontName', false, 'monospace'), monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),
link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null), link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),
spoiler: () => document.execCommand('fontName', false, 'spoiler') spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)
}; };
if(!commandsMap[type]) { if(!commandsMap[type]) {
@ -1787,7 +1789,7 @@ export default class ChatInput {
//executed.push(document.execCommand('removeFormat', false, null)); //executed.push(document.execCommand('removeFormat', false, null));
if(haveThisType) { if(haveThisType) {
executed.push(document.execCommand('fontName', false, 'Roboto')); executed.push(this.resetCurrentFormatting());
} else { } else {
executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null)); executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));
} }
@ -1806,6 +1808,10 @@ export default class ChatInput {
return true; return true;
} }
private resetCurrentFormatting() {
return document.execCommand('fontName', false, 'Roboto');
}
private handleMarkdownShortcut = (e: KeyboardEvent) => { private handleMarkdownShortcut = (e: KeyboardEvent) => {
// console.log('handleMarkdownShortcut', e); // console.log('handleMarkdownShortcut', e);
const formatKeys: {[key: string]: MarkdownType} = { const formatKeys: {[key: string]: MarkdownType} = {
@ -1956,6 +1962,14 @@ export default class ChatInput {
if(this.appImManager.markupTooltip) { if(this.appImManager.markupTooltip) {
this.appImManager.markupTooltip.hide(); this.appImManager.markupTooltip.hide();
} }
// * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared
// * so have to reset formatting
if(document.activeElement === this.messageInput) {
// document.execCommand('styleWithCSS', false, 'true');
this.resetCurrentFormatting();
// document.execCommand('styleWithCSS', false, 'false');
}
} else { } else {
const time = Date.now(); const time = Date.now();
if(time - this.lastTimeType >= 6000) { if(time - this.lastTimeType >= 6000) {

16
src/helpers/dom/copyFromElement.ts

@ -0,0 +1,16 @@
/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
import SelectionSaver from "../selectionSaver";
import selectElementContents from "./selectElementContents";
export default function copyFromElement(element: HTMLElement) {
const saver = new SelectionSaver();
saver.save();
selectElementContents(element);
document.execCommand('copy');
saver.restore();
}

8
src/helpers/dom/getRichElementValue.ts

@ -14,7 +14,7 @@ import { MessageEntity } from "../../layer";
export type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'; export type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';
export type MarkdownTag = { export type MarkdownTag = {
match: string, match: string,
entityName: Extract<MessageEntity['_'], 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityPre' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName' | 'messageEntitySpoiler'>; entityName: Extract<MessageEntity['_'], 'messageEntityBold' | 'messageEntityUnderline' | 'messageEntityItalic' | 'messageEntityCode' | 'messageEntityStrike' | 'messageEntityTextUrl' | 'messageEntityMentionName' | 'messageEntitySpoiler'>;
}; };
// https://core.telegram.org/bots/api#html-style // https://core.telegram.org/bots/api#html-style
@ -32,8 +32,8 @@ export const markdownTags: {[type in MarkdownType]: MarkdownTag} = {
entityName: 'messageEntityItalic' entityName: 'messageEntityItalic'
}, },
monospace: { monospace: {
match: '[style*="monospace"], [face="monospace"], pre', match: '[style*="monospace"], [face*="monospace"], pre',
entityName: 'messageEntityPre' entityName: 'messageEntityCode'
}, },
strikethrough: { strikethrough: {
match: '[style*="line-through"], strike, del, s', match: '[style*="line-through"], strike, del, s',
@ -135,7 +135,7 @@ export default function getRichElementValue(node: HTMLElement, lines: string[],
}); });
} else { } else {
entities.push({ entities.push({
_: tag.entityName as any, _: tag.entityName,
offset: offset.offset, offset: offset.offset,
length: nodeValue.length length: nodeValue.length
}); });

40
src/helpers/selectionSaver.ts

@ -0,0 +1,40 @@
/*
* https://github.com/morethanwords/tweb
* Copyright (C) 2019-2021 Eduard Kuzmenko
* https://github.com/morethanwords/tweb/blob/master/LICENSE
*/
import cancelSelection from "./dom/cancelSelection";
export default class SelectionSaver {
private input: HTMLElement;
private range: Range;
public save() {
const input = document.activeElement as HTMLElement;
if(input.isContentEditable || input.tagName === 'INPUT') {
this.input = input;
}
const selection = document.getSelection();
if(!selection.rangeCount || selection.isCollapsed) {
return;
}
this.range = selection.getRangeAt(0);
}
public restore() {
if(!this.range) {
cancelSelection();
return;
}
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(this.range);
if(this.input) {
this.input.focus();
}
}
}

1
src/lang.ts

@ -692,6 +692,7 @@ const lang = {
"TelegramFeaturesUrl": "https://t.me/TelegramTips", "TelegramFeaturesUrl": "https://t.me/TelegramTips",
"ScamMessage": "SCAM", "ScamMessage": "SCAM",
"FakeMessage": "FAKE", "FakeMessage": "FAKE",
"TextCopied": "Text copied to clipboard",
// * macos // * macos
"AccountSettings.Filters": "Chat Folders", "AccountSettings.Filters": "Chat Folders",

397
src/layer.d.ts vendored

@ -497,6 +497,7 @@ export namespace User {
scam?: true, scam?: true,
apply_min_photo?: true, apply_min_photo?: true,
fake?: true, fake?: true,
bot_attach_menu?: true,
}>, }>,
id: string | number, id: string | number,
access_hash?: string | number, access_hash?: string | number,
@ -586,7 +587,6 @@ export namespace Chat {
flags?: number, flags?: number,
pFlags?: Partial<{ pFlags?: Partial<{
creator?: true, creator?: true,
kicked?: true,
left?: true, left?: true,
deactivated?: true, deactivated?: true,
call_active?: true, call_active?: true,
@ -633,6 +633,8 @@ export namespace Chat {
fake?: true, fake?: true,
gigagroup?: true, gigagroup?: true,
noforwards?: true, noforwards?: true,
join_to_send?: true,
join_request?: true,
}>, }>,
id: string | number, id: string | number,
access_hash?: string | number, access_hash?: string | number,
@ -706,7 +708,9 @@ export namespace ChatFull {
has_scheduled?: true, has_scheduled?: true,
can_view_stats?: true, can_view_stats?: true,
blocked?: true, blocked?: true,
can_delete_channel?: true,
}>, }>,
flags2: number,
id: string | number, id: string | number,
about: string, about: string,
participants_count?: number, participants_count?: number,
@ -1034,7 +1038,7 @@ export namespace MessageMedia {
/** /**
* @link https://core.telegram.org/type/MessageAction * @link https://core.telegram.org/type/MessageAction
*/ */
export type MessageAction = MessageAction.messageActionEmpty | MessageAction.messageActionChatCreate | MessageAction.messageActionChatEditTitle | MessageAction.messageActionChatEditPhoto | MessageAction.messageActionChatDeletePhoto | MessageAction.messageActionChatAddUser | MessageAction.messageActionChatDeleteUser | MessageAction.messageActionChatJoinedByLink | MessageAction.messageActionChannelCreate | MessageAction.messageActionChatMigrateTo | MessageAction.messageActionChannelMigrateFrom | MessageAction.messageActionPinMessage | MessageAction.messageActionHistoryClear | MessageAction.messageActionGameScore | MessageAction.messageActionPaymentSentMe | MessageAction.messageActionPaymentSent | MessageAction.messageActionPhoneCall | MessageAction.messageActionScreenshotTaken | MessageAction.messageActionCustomAction | MessageAction.messageActionBotAllowed | MessageAction.messageActionSecureValuesSentMe | MessageAction.messageActionSecureValuesSent | MessageAction.messageActionContactSignUp | MessageAction.messageActionGeoProximityReached | MessageAction.messageActionGroupCall | MessageAction.messageActionInviteToGroupCall | MessageAction.messageActionSetMessagesTTL | MessageAction.messageActionGroupCallScheduled | MessageAction.messageActionSetChatTheme | MessageAction.messageActionChatJoinedByRequest | MessageAction.messageActionDiscussionStarted | MessageAction.messageActionChatLeave | MessageAction.messageActionChannelDeletePhoto | MessageAction.messageActionChannelEditTitle | MessageAction.messageActionChannelEditPhoto | MessageAction.messageActionChannelEditVideo | MessageAction.messageActionChatEditVideo | MessageAction.messageActionChatAddUsers | MessageAction.messageActionChatJoined | MessageAction.messageActionChatReturn | MessageAction.messageActionChatJoinedYou | MessageAction.messageActionChatReturnYou; export type MessageAction = MessageAction.messageActionEmpty | MessageAction.messageActionChatCreate | MessageAction.messageActionChatEditTitle | MessageAction.messageActionChatEditPhoto | MessageAction.messageActionChatDeletePhoto | MessageAction.messageActionChatAddUser | MessageAction.messageActionChatDeleteUser | MessageAction.messageActionChatJoinedByLink | MessageAction.messageActionChannelCreate | MessageAction.messageActionChatMigrateTo | MessageAction.messageActionChannelMigrateFrom | MessageAction.messageActionPinMessage | MessageAction.messageActionHistoryClear | MessageAction.messageActionGameScore | MessageAction.messageActionPaymentSentMe | MessageAction.messageActionPaymentSent | MessageAction.messageActionPhoneCall | MessageAction.messageActionScreenshotTaken | MessageAction.messageActionCustomAction | MessageAction.messageActionBotAllowed | MessageAction.messageActionSecureValuesSentMe | MessageAction.messageActionSecureValuesSent | MessageAction.messageActionContactSignUp | MessageAction.messageActionGeoProximityReached | MessageAction.messageActionGroupCall | MessageAction.messageActionInviteToGroupCall | MessageAction.messageActionSetMessagesTTL | MessageAction.messageActionGroupCallScheduled | MessageAction.messageActionSetChatTheme | MessageAction.messageActionChatJoinedByRequest | MessageAction.messageActionWebViewDataSentMe | MessageAction.messageActionWebViewDataSent | MessageAction.messageActionDiscussionStarted | MessageAction.messageActionChatLeave | MessageAction.messageActionChannelDeletePhoto | MessageAction.messageActionChannelEditTitle | MessageAction.messageActionChannelEditPhoto | MessageAction.messageActionChannelEditVideo | MessageAction.messageActionChatEditVideo | MessageAction.messageActionChatAddUsers | MessageAction.messageActionChatJoined | MessageAction.messageActionChatReturn | MessageAction.messageActionChatJoinedYou | MessageAction.messageActionChatReturnYou;
export namespace MessageAction { export namespace MessageAction {
export type messageActionEmpty = { export type messageActionEmpty = {
@ -1203,6 +1207,17 @@ export namespace MessageAction {
_: 'messageActionChatJoinedByRequest' _: 'messageActionChatJoinedByRequest'
}; };
export type messageActionWebViewDataSentMe = {
_: 'messageActionWebViewDataSentMe',
text: string,
data: string
};
export type messageActionWebViewDataSent = {
_: 'messageActionWebViewDataSent',
text: string
};
export type messageActionDiscussionStarted = { export type messageActionDiscussionStarted = {
_: 'messageActionDiscussionStarted' _: 'messageActionDiscussionStarted'
}; };
@ -1508,7 +1523,7 @@ export namespace InputPeerNotifySettings {
show_previews?: boolean, show_previews?: boolean,
silent?: boolean, silent?: boolean,
mute_until?: number, mute_until?: number,
sound?: string sound?: NotificationSound
}; };
} }
@ -1524,7 +1539,9 @@ export namespace PeerNotifySettings {
show_previews?: boolean, show_previews?: boolean,
silent?: boolean, silent?: boolean,
mute_until?: number, mute_until?: number,
sound?: string ios_sound?: NotificationSound,
android_sound?: NotificationSound,
other_sound?: NotificationSound
}; };
} }
@ -1663,7 +1680,9 @@ export namespace UserFull {
folder_id?: number, folder_id?: number,
ttl_period?: number, ttl_period?: number,
theme_emoticon?: string, theme_emoticon?: string,
private_forward_name?: string private_forward_name?: string,
bot_group_admin_rights?: ChatAdminRights,
bot_broadcast_admin_rights?: ChatAdminRights
}; };
} }
@ -1965,7 +1984,7 @@ export namespace MessagesFilter {
/** /**
* @link https://core.telegram.org/type/Update * @link https://core.telegram.org/type/Update
*/ */
export type Update = Update.updateNewMessage | Update.updateMessageID | Update.updateDeleteMessages | Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChatParticipants | Update.updateUserStatus | Update.updateUserName | Update.updateUserPhoto | Update.updateNewEncryptedMessage | Update.updateEncryptedChatTyping | Update.updateEncryption | Update.updateEncryptedMessagesRead | Update.updateChatParticipantAdd | Update.updateChatParticipantDelete | Update.updateDcOptions | Update.updateNotifySettings | Update.updateServiceNotification | Update.updatePrivacy | Update.updateUserPhone | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox | Update.updateWebPage | Update.updateReadMessagesContents | Update.updateChannelTooLong | Update.updateChannel | Update.updateNewChannelMessage | Update.updateReadChannelInbox | Update.updateDeleteChannelMessages | Update.updateChannelMessageViews | Update.updateChatParticipantAdmin | Update.updateNewStickerSet | Update.updateStickerSetsOrder | Update.updateStickerSets | Update.updateSavedGifs | Update.updateBotInlineQuery | Update.updateBotInlineSend | Update.updateEditChannelMessage | Update.updateBotCallbackQuery | Update.updateEditMessage | Update.updateInlineBotCallbackQuery | Update.updateReadChannelOutbox | Update.updateDraftMessage | Update.updateReadFeaturedStickers | Update.updateRecentStickers | Update.updateConfig | Update.updatePtsChanged | Update.updateChannelWebPage | Update.updateDialogPinned | Update.updatePinnedDialogs | Update.updateBotWebhookJSON | Update.updateBotWebhookJSONQuery | Update.updateBotShippingQuery | Update.updateBotPrecheckoutQuery | Update.updatePhoneCall | Update.updateLangPackTooLong | Update.updateLangPack | Update.updateFavedStickers | Update.updateChannelReadMessagesContents | Update.updateContactsReset | Update.updateChannelAvailableMessages | Update.updateDialogUnreadMark | Update.updateMessagePoll | Update.updateChatDefaultBannedRights | Update.updateFolderPeers | Update.updatePeerSettings | Update.updatePeerLocated | Update.updateNewScheduledMessage | Update.updateDeleteScheduledMessages | Update.updateTheme | Update.updateGeoLiveViewed | Update.updateLoginToken | Update.updateMessagePollVote | Update.updateDialogFilter | Update.updateDialogFilterOrder | Update.updateDialogFilters | Update.updatePhoneCallSignalingData | Update.updateChannelMessageForwards | Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox | Update.updatePeerBlocked | Update.updateChannelUserTyping | Update.updatePinnedMessages | Update.updatePinnedChannelMessages | Update.updateChat | Update.updateGroupCallParticipants | Update.updateGroupCall | Update.updatePeerHistoryTTL | Update.updateChatParticipant | Update.updateChannelParticipant | Update.updateBotStopped | Update.updateGroupCallConnection | Update.updateBotCommands | Update.updatePendingJoinRequests | Update.updateBotChatInviteRequester | Update.updateMessageReactions | Update.updateNewDiscussionMessage | Update.updateDeleteDiscussionMessages | Update.updateChannelReload; export type Update = Update.updateNewMessage | Update.updateMessageID | Update.updateDeleteMessages | Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChatParticipants | Update.updateUserStatus | Update.updateUserName | Update.updateUserPhoto | Update.updateNewEncryptedMessage | Update.updateEncryptedChatTyping | Update.updateEncryption | Update.updateEncryptedMessagesRead | Update.updateChatParticipantAdd | Update.updateChatParticipantDelete | Update.updateDcOptions | Update.updateNotifySettings | Update.updateServiceNotification | Update.updatePrivacy | Update.updateUserPhone | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox | Update.updateWebPage | Update.updateReadMessagesContents | Update.updateChannelTooLong | Update.updateChannel | Update.updateNewChannelMessage | Update.updateReadChannelInbox | Update.updateDeleteChannelMessages | Update.updateChannelMessageViews | Update.updateChatParticipantAdmin | Update.updateNewStickerSet | Update.updateStickerSetsOrder | Update.updateStickerSets | Update.updateSavedGifs | Update.updateBotInlineQuery | Update.updateBotInlineSend | Update.updateEditChannelMessage | Update.updateBotCallbackQuery | Update.updateEditMessage | Update.updateInlineBotCallbackQuery | Update.updateReadChannelOutbox | Update.updateDraftMessage | Update.updateReadFeaturedStickers | Update.updateRecentStickers | Update.updateConfig | Update.updatePtsChanged | Update.updateChannelWebPage | Update.updateDialogPinned | Update.updatePinnedDialogs | Update.updateBotWebhookJSON | Update.updateBotWebhookJSONQuery | Update.updateBotShippingQuery | Update.updateBotPrecheckoutQuery | Update.updatePhoneCall | Update.updateLangPackTooLong | Update.updateLangPack | Update.updateFavedStickers | Update.updateChannelReadMessagesContents | Update.updateContactsReset | Update.updateChannelAvailableMessages | Update.updateDialogUnreadMark | Update.updateMessagePoll | Update.updateChatDefaultBannedRights | Update.updateFolderPeers | Update.updatePeerSettings | Update.updatePeerLocated | Update.updateNewScheduledMessage | Update.updateDeleteScheduledMessages | Update.updateTheme | Update.updateGeoLiveViewed | Update.updateLoginToken | Update.updateMessagePollVote | Update.updateDialogFilter | Update.updateDialogFilterOrder | Update.updateDialogFilters | Update.updatePhoneCallSignalingData | Update.updateChannelMessageForwards | Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox | Update.updatePeerBlocked | Update.updateChannelUserTyping | Update.updatePinnedMessages | Update.updatePinnedChannelMessages | Update.updateChat | Update.updateGroupCallParticipants | Update.updateGroupCall | Update.updatePeerHistoryTTL | Update.updateChatParticipant | Update.updateChannelParticipant | Update.updateBotStopped | Update.updateGroupCallConnection | Update.updateBotCommands | Update.updatePendingJoinRequests | Update.updateBotChatInviteRequester | Update.updateMessageReactions | Update.updateAttachMenuBots | Update.updateWebViewResultSent | Update.updateBotMenuButton | Update.updateSavedRingtones | Update.updateNewDiscussionMessage | Update.updateDeleteDiscussionMessages | Update.updateChannelReload;
export namespace Update { export namespace Update {
export type updateNewMessage = { export type updateNewMessage = {
@ -2654,6 +2673,25 @@ export namespace Update {
local?: boolean local?: boolean
}; };
export type updateAttachMenuBots = {
_: 'updateAttachMenuBots'
};
export type updateWebViewResultSent = {
_: 'updateWebViewResultSent',
query_id: string | number
};
export type updateBotMenuButton = {
_: 'updateBotMenuButton',
bot_id: string | number,
button: BotMenuButton
};
export type updateSavedRingtones = {
_: 'updateSavedRingtones'
};
export type updateNewDiscussionMessage = { export type updateNewDiscussionMessage = {
_: 'updateNewDiscussionMessage', _: 'updateNewDiscussionMessage',
message?: Message message?: Message
@ -4055,14 +4093,15 @@ export namespace BotInfo {
_: 'botInfo', _: 'botInfo',
user_id: string | number, user_id: string | number,
description: string, description: string,
commands: Array<BotCommand> commands: Array<BotCommand>,
menu_button: BotMenuButton
}; };
} }
/** /**
* @link https://core.telegram.org/type/KeyboardButton * @link https://core.telegram.org/type/KeyboardButton
*/ */
export type KeyboardButton = KeyboardButton.keyboardButton | KeyboardButton.keyboardButtonUrl | KeyboardButton.keyboardButtonCallback | KeyboardButton.keyboardButtonRequestPhone | KeyboardButton.keyboardButtonRequestGeoLocation | KeyboardButton.keyboardButtonSwitchInline | KeyboardButton.keyboardButtonGame | KeyboardButton.keyboardButtonBuy | KeyboardButton.keyboardButtonUrlAuth | KeyboardButton.inputKeyboardButtonUrlAuth | KeyboardButton.keyboardButtonRequestPoll | KeyboardButton.inputKeyboardButtonUserProfile | KeyboardButton.keyboardButtonUserProfile; export type KeyboardButton = KeyboardButton.keyboardButton | KeyboardButton.keyboardButtonUrl | KeyboardButton.keyboardButtonCallback | KeyboardButton.keyboardButtonRequestPhone | KeyboardButton.keyboardButtonRequestGeoLocation | KeyboardButton.keyboardButtonSwitchInline | KeyboardButton.keyboardButtonGame | KeyboardButton.keyboardButtonBuy | KeyboardButton.keyboardButtonUrlAuth | KeyboardButton.inputKeyboardButtonUrlAuth | KeyboardButton.keyboardButtonRequestPoll | KeyboardButton.inputKeyboardButtonUserProfile | KeyboardButton.keyboardButtonUserProfile | KeyboardButton.keyboardButtonWebView | KeyboardButton.keyboardButtonSimpleWebView;
export namespace KeyboardButton { export namespace KeyboardButton {
export type keyboardButton = { export type keyboardButton = {
@ -4155,6 +4194,18 @@ export namespace KeyboardButton {
text: string, text: string,
user_id: string | number user_id: string | number
}; };
export type keyboardButtonWebView = {
_: 'keyboardButtonWebView',
text: string,
url: string
};
export type keyboardButtonSimpleWebView = {
_: 'keyboardButtonSimpleWebView',
text: string,
url: string
};
} }
/** /**
@ -8661,6 +8712,9 @@ export namespace MessageReplyHeader {
export type messageReplyHeader = { export type messageReplyHeader = {
_: 'messageReplyHeader', _: 'messageReplyHeader',
flags?: number, flags?: number,
pFlags?: Partial<{
reply_to_scheduled?: true,
}>,
reply_to_msg_id: number, reply_to_msg_id: number,
reply_to_peer_id?: Peer, reply_to_peer_id?: Peer,
reply_to_top_id?: number reply_to_top_id?: number
@ -9457,6 +9511,201 @@ export namespace PhoneGroupCallStreamRtmpUrl {
}; };
} }
/**
* @link https://core.telegram.org/type/AttachMenuBotIconColor
*/
export type AttachMenuBotIconColor = AttachMenuBotIconColor.attachMenuBotIconColor;
export namespace AttachMenuBotIconColor {
export type attachMenuBotIconColor = {
_: 'attachMenuBotIconColor',
name: string,
color: number
};
}
/**
* @link https://core.telegram.org/type/AttachMenuBotIcon
*/
export type AttachMenuBotIcon = AttachMenuBotIcon.attachMenuBotIcon;
export namespace AttachMenuBotIcon {
export type attachMenuBotIcon = {
_: 'attachMenuBotIcon',
flags?: number,
name: string,
icon: Document,
colors?: Array<AttachMenuBotIconColor>
};
}
/**
* @link https://core.telegram.org/type/AttachMenuBot
*/
export type AttachMenuBot = AttachMenuBot.attachMenuBot;
export namespace AttachMenuBot {
export type attachMenuBot = {
_: 'attachMenuBot',
flags?: number,
pFlags?: Partial<{
inactive?: true,
}>,
bot_id: string | number,
short_name: string,
icons: Array<AttachMenuBotIcon>
};
}
/**
* @link https://core.telegram.org/type/AttachMenuBots
*/
export type AttachMenuBots = AttachMenuBots.attachMenuBotsNotModified | AttachMenuBots.attachMenuBots;
export namespace AttachMenuBots {
export type attachMenuBotsNotModified = {
_: 'attachMenuBotsNotModified'
};
export type attachMenuBots = {
_: 'attachMenuBots',
hash: string | number,
bots: Array<AttachMenuBot>,
users: Array<User>
};
}
/**
* @link https://core.telegram.org/type/AttachMenuBotsBot
*/
export type AttachMenuBotsBot = AttachMenuBotsBot.attachMenuBotsBot;
export namespace AttachMenuBotsBot {
export type attachMenuBotsBot = {
_: 'attachMenuBotsBot',
bot: AttachMenuBot,
users: Array<User>
};
}
/**
* @link https://core.telegram.org/type/WebViewResult
*/
export type WebViewResult = WebViewResult.webViewResultUrl;
export namespace WebViewResult {
export type webViewResultUrl = {
_: 'webViewResultUrl',
query_id: string | number,
url: string
};
}
/**
* @link https://core.telegram.org/type/SimpleWebViewResult
*/
export type SimpleWebViewResult = SimpleWebViewResult.simpleWebViewResultUrl;
export namespace SimpleWebViewResult {
export type simpleWebViewResultUrl = {
_: 'simpleWebViewResultUrl',
url: string
};
}
/**
* @link https://core.telegram.org/type/WebViewMessageSent
*/
export type WebViewMessageSent = WebViewMessageSent.webViewMessageSent;
export namespace WebViewMessageSent {
export type webViewMessageSent = {
_: 'webViewMessageSent',
flags?: number,
msg_id?: InputBotInlineMessageID
};
}
/**
* @link https://core.telegram.org/type/BotMenuButton
*/
export type BotMenuButton = BotMenuButton.botMenuButtonDefault | BotMenuButton.botMenuButtonCommands | BotMenuButton.botMenuButton;
export namespace BotMenuButton {
export type botMenuButtonDefault = {
_: 'botMenuButtonDefault'
};
export type botMenuButtonCommands = {
_: 'botMenuButtonCommands'
};
export type botMenuButton = {
_: 'botMenuButton',
text: string,
url: string
};
}
/**
* @link https://core.telegram.org/type/account.SavedRingtones
*/
export type AccountSavedRingtones = AccountSavedRingtones.accountSavedRingtonesNotModified | AccountSavedRingtones.accountSavedRingtones;
export namespace AccountSavedRingtones {
export type accountSavedRingtonesNotModified = {
_: 'account.savedRingtonesNotModified'
};
export type accountSavedRingtones = {
_: 'account.savedRingtones',
hash: string | number,
ringtones: Array<Document>
};
}
/**
* @link https://core.telegram.org/type/NotificationSound
*/
export type NotificationSound = NotificationSound.notificationSoundDefault | NotificationSound.notificationSoundNone | NotificationSound.notificationSoundLocal | NotificationSound.notificationSoundRingtone;
export namespace NotificationSound {
export type notificationSoundDefault = {
_: 'notificationSoundDefault'
};
export type notificationSoundNone = {
_: 'notificationSoundNone'
};
export type notificationSoundLocal = {
_: 'notificationSoundLocal',
title: string,
data: string
};
export type notificationSoundRingtone = {
_: 'notificationSoundRingtone',
id: string | number
};
}
/**
* @link https://core.telegram.org/type/account.SavedRingtone
*/
export type AccountSavedRingtone = AccountSavedRingtone.accountSavedRingtone | AccountSavedRingtone.accountSavedRingtoneConverted;
export namespace AccountSavedRingtone {
export type accountSavedRingtone = {
_: 'account.savedRingtone'
};
export type accountSavedRingtoneConverted = {
_: 'account.savedRingtoneConverted',
document: Document
};
}
export interface ConstructorDeclMap { export interface ConstructorDeclMap {
'error': Error.error, 'error': Error.error,
'inputPeerEmpty': InputPeer.inputPeerEmpty, 'inputPeerEmpty': InputPeer.inputPeerEmpty,
@ -10412,6 +10661,34 @@ export interface ConstructorDeclMap {
'inputReportReasonIllegalDrugs': ReportReason.inputReportReasonIllegalDrugs, 'inputReportReasonIllegalDrugs': ReportReason.inputReportReasonIllegalDrugs,
'inputReportReasonPersonalDetails': ReportReason.inputReportReasonPersonalDetails, 'inputReportReasonPersonalDetails': ReportReason.inputReportReasonPersonalDetails,
'phone.groupCallStreamRtmpUrl': PhoneGroupCallStreamRtmpUrl.phoneGroupCallStreamRtmpUrl, 'phone.groupCallStreamRtmpUrl': PhoneGroupCallStreamRtmpUrl.phoneGroupCallStreamRtmpUrl,
'attachMenuBotIconColor': AttachMenuBotIconColor.attachMenuBotIconColor,
'attachMenuBotIcon': AttachMenuBotIcon.attachMenuBotIcon,
'attachMenuBot': AttachMenuBot.attachMenuBot,
'attachMenuBotsNotModified': AttachMenuBots.attachMenuBotsNotModified,
'attachMenuBots': AttachMenuBots.attachMenuBots,
'attachMenuBotsBot': AttachMenuBotsBot.attachMenuBotsBot,
'updateAttachMenuBots': Update.updateAttachMenuBots,
'webViewResultUrl': WebViewResult.webViewResultUrl,
'simpleWebViewResultUrl': SimpleWebViewResult.simpleWebViewResultUrl,
'webViewMessageSent': WebViewMessageSent.webViewMessageSent,
'updateWebViewResultSent': Update.updateWebViewResultSent,
'keyboardButtonWebView': KeyboardButton.keyboardButtonWebView,
'keyboardButtonSimpleWebView': KeyboardButton.keyboardButtonSimpleWebView,
'messageActionWebViewDataSentMe': MessageAction.messageActionWebViewDataSentMe,
'messageActionWebViewDataSent': MessageAction.messageActionWebViewDataSent,
'updateBotMenuButton': Update.updateBotMenuButton,
'botMenuButtonDefault': BotMenuButton.botMenuButtonDefault,
'botMenuButtonCommands': BotMenuButton.botMenuButtonCommands,
'botMenuButton': BotMenuButton.botMenuButton,
'account.savedRingtonesNotModified': AccountSavedRingtones.accountSavedRingtonesNotModified,
'account.savedRingtones': AccountSavedRingtones.accountSavedRingtones,
'updateSavedRingtones': Update.updateSavedRingtones,
'notificationSoundDefault': NotificationSound.notificationSoundDefault,
'notificationSoundNone': NotificationSound.notificationSoundNone,
'notificationSoundLocal': NotificationSound.notificationSoundLocal,
'notificationSoundRingtone': NotificationSound.notificationSoundRingtone,
'account.savedRingtone': AccountSavedRingtone.accountSavedRingtone,
'account.savedRingtoneConverted': AccountSavedRingtone.accountSavedRingtoneConverted,
'messageEntityEmoji': MessageEntity.messageEntityEmoji, 'messageEntityEmoji': MessageEntity.messageEntityEmoji,
'messageEntityHighlight': MessageEntity.messageEntityHighlight, 'messageEntityHighlight': MessageEntity.messageEntityHighlight,
'messageEntityLinebreak': MessageEntity.messageEntityLinebreak, 'messageEntityLinebreak': MessageEntity.messageEntityLinebreak,
@ -11760,6 +12037,8 @@ export type MessagesGetUnreadMentions = {
}; };
export type ChannelsDeleteHistory = { export type ChannelsDeleteHistory = {
flags?: number,
for_everyone?: boolean,
channel: InputChannel, channel: InputChannel,
max_id: number max_id: number
}; };
@ -12836,6 +13115,91 @@ export type MessagesSearchSentMedia = {
limit: number limit: number
}; };
export type MessagesGetAttachMenuBots = {
hash: string | number
};
export type MessagesGetAttachMenuBot = {
bot: InputUser
};
export type MessagesToggleBotInAttachMenu = {
bot: InputUser,
enabled: boolean
};
export type MessagesRequestWebView = {
flags?: number,
from_bot_menu?: boolean,
silent?: boolean,
peer: InputPeer,
bot: InputUser,
url?: string,
start_param?: string,
theme_params?: DataJSON,
reply_to_msg_id?: number
};
export type MessagesProlongWebView = {
flags?: number,
silent?: boolean,
peer: InputPeer,
bot: InputUser,
query_id: string | number,
reply_to_msg_id?: number
};
export type MessagesRequestSimpleWebView = {
flags?: number,
bot: InputUser,
url: string,
theme_params?: DataJSON
};
export type MessagesSendWebViewResultMessage = {
bot_query_id: string,
result: InputBotInlineResult
};
export type MessagesSendWebViewData = {
bot: InputUser,
random_id: string | number,
button_text: string,
data: string
};
export type BotsSetBotMenuButton = {
user_id: InputUser,
button: BotMenuButton
};
export type BotsGetBotMenuButton = {
user_id: InputUser
};
export type AccountGetSavedRingtones = {
hash: string | number
};
export type AccountSaveRingtone = {
id: InputDocument,
unsave: boolean
};
export type AccountUploadRingtone = {
file: InputFile,
file_name: string,
mime_type: string
};
export type BotsSetBotBroadcastDefaultAdminRights = {
admin_rights: ChatAdminRights
};
export type BotsSetBotGroupDefaultAdminRights = {
admin_rights: ChatAdminRights
};
export interface MethodDeclMap { export interface MethodDeclMap {
'invokeAfterMsg': {req: InvokeAfterMsg, res: any}, 'invokeAfterMsg': {req: InvokeAfterMsg, res: any},
'invokeAfterMsgs': {req: InvokeAfterMsgs, res: any}, 'invokeAfterMsgs': {req: InvokeAfterMsgs, res: any},
@ -13059,7 +13423,7 @@ export interface MethodDeclMap {
'channels.readMessageContents': {req: ChannelsReadMessageContents, res: boolean}, 'channels.readMessageContents': {req: ChannelsReadMessageContents, res: boolean},
'contacts.resetSaved': {req: ContactsResetSaved, res: boolean}, 'contacts.resetSaved': {req: ContactsResetSaved, res: boolean},
'messages.getUnreadMentions': {req: MessagesGetUnreadMentions, res: MessagesMessages}, 'messages.getUnreadMentions': {req: MessagesGetUnreadMentions, res: MessagesMessages},
'channels.deleteHistory': {req: ChannelsDeleteHistory, res: boolean}, 'channels.deleteHistory': {req: ChannelsDeleteHistory, res: Updates},
'help.getRecentMeUrls': {req: HelpGetRecentMeUrls, res: HelpRecentMeUrls}, 'help.getRecentMeUrls': {req: HelpGetRecentMeUrls, res: HelpRecentMeUrls},
'channels.togglePreHistoryHidden': {req: ChannelsTogglePreHistoryHidden, res: Updates}, 'channels.togglePreHistoryHidden': {req: ChannelsTogglePreHistoryHidden, res: Updates},
'messages.readMentions': {req: MessagesReadMentions, res: MessagesAffectedHistory}, 'messages.readMentions': {req: MessagesReadMentions, res: MessagesAffectedHistory},
@ -13256,5 +13620,20 @@ export interface MethodDeclMap {
'phone.getGroupCallStreamChannels': {req: PhoneGetGroupCallStreamChannels, res: PhoneGroupCallStreamChannels}, 'phone.getGroupCallStreamChannels': {req: PhoneGetGroupCallStreamChannels, res: PhoneGroupCallStreamChannels},
'phone.getGroupCallStreamRtmpUrl': {req: PhoneGetGroupCallStreamRtmpUrl, res: PhoneGroupCallStreamRtmpUrl}, 'phone.getGroupCallStreamRtmpUrl': {req: PhoneGetGroupCallStreamRtmpUrl, res: PhoneGroupCallStreamRtmpUrl},
'messages.searchSentMedia': {req: MessagesSearchSentMedia, res: MessagesMessages}, 'messages.searchSentMedia': {req: MessagesSearchSentMedia, res: MessagesMessages},
'messages.getAttachMenuBots': {req: MessagesGetAttachMenuBots, res: AttachMenuBots},
'messages.getAttachMenuBot': {req: MessagesGetAttachMenuBot, res: AttachMenuBotsBot},
'messages.toggleBotInAttachMenu': {req: MessagesToggleBotInAttachMenu, res: boolean},
'messages.requestWebView': {req: MessagesRequestWebView, res: WebViewResult},
'messages.prolongWebView': {req: MessagesProlongWebView, res: boolean},
'messages.requestSimpleWebView': {req: MessagesRequestSimpleWebView, res: SimpleWebViewResult},
'messages.sendWebViewResultMessage': {req: MessagesSendWebViewResultMessage, res: WebViewMessageSent},
'messages.sendWebViewData': {req: MessagesSendWebViewData, res: Updates},
'bots.setBotMenuButton': {req: BotsSetBotMenuButton, res: boolean},
'bots.getBotMenuButton': {req: BotsGetBotMenuButton, res: BotMenuButton},
'account.getSavedRingtones': {req: AccountGetSavedRingtones, res: AccountSavedRingtones},
'account.saveRingtone': {req: AccountSaveRingtone, res: AccountSavedRingtone},
'account.uploadRingtone': {req: AccountUploadRingtone, res: Document},
'bots.setBotBroadcastDefaultAdminRights': {req: BotsSetBotBroadcastDefaultAdminRights, res: boolean},
'bots.setBotGroupDefaultAdminRights': {req: BotsSetBotGroupDefaultAdminRights, res: boolean},
} }

4
src/lib/appManagers/appChatsManager.ts

@ -238,7 +238,7 @@ export class AppChatsManager {
if(chat._ === 'chatForbidden' || if(chat._ === 'chatForbidden' ||
chat._ === 'channelForbidden' || chat._ === 'channelForbidden' ||
(chat as Chat.chat).pFlags.kicked || // (chat as Chat.chat).pFlags.kicked ||
(chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) { (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {
return false; return false;
} }
@ -377,7 +377,7 @@ export class AppChatsManager {
|| chat._ === 'chatForbidden' || chat._ === 'chatForbidden'
|| chat._ === 'chatEmpty' || chat._ === 'chatEmpty'
|| (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.left
|| (chat as Chat.chat).pFlags.kicked // || (chat as Chat.chat).pFlags.kicked
|| (chat as Chat.chat).pFlags.deactivated) { || (chat as Chat.chat).pFlags.deactivated) {
good = false; good = false;
} }

24
src/lib/appManagers/appMessagesManager.ts

@ -178,7 +178,7 @@ export class AppMessagesManager {
[tempId: string]: { [tempId: string]: {
[callbackName: string]: Partial<{ [callbackName: string]: Partial<{
deferred: CancellablePromise<void>, deferred: CancellablePromise<void>,
callback: (message: any) => Promise<any> callback: (message: MyMessage) => Promise<any>
}> }>
} }
} = {}; } = {};
@ -414,7 +414,7 @@ export class AppMessagesManager {
return sendEntites; return sendEntites;
} }
public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: any) => Promise<any>) { public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise<any>) {
const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {}); const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});
const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise<void>()}); const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise<void>()});
@ -2026,9 +2026,11 @@ export class AppMessagesManager {
} }
} = {}; } = {};
const newMessages = mids.map(mid => { const newMids: number[] = [];
const newMessages = mids.map((mid) => {
const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid); const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);
const message: Message.message = this.generateOutgoingMessage(peerId, options); const message: Message.message = this.generateOutgoingMessage(peerId, options);
newMids.push(message.id);
const keys: Array<keyof Message.message> = [ const keys: Array<keyof Message.message> = [
'entities', 'entities',
@ -2049,6 +2051,20 @@ export class AppMessagesManager {
keys.push('message'); keys.push('message');
} }
const replyToMid = originalMessage.reply_to?.reply_to_msg_id;
const replyToMessageIdx = mids.indexOf(replyToMid);
if(replyToMid && replyToMessageIdx !== -1) {
const newReplyToMid = newMids[replyToMessageIdx];
message.reply_to = {
_: 'messageReplyHeader',
reply_to_msg_id: newReplyToMid
};
/* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {
message.reply_to.reply_to_msg_id = originalMessage.mid;
}); */
}
keys.forEach(key => { keys.forEach(key => {
// @ts-ignore // @ts-ignore
message[key] = originalMessage[key]; message[key] = originalMessage[key];
@ -6338,7 +6354,7 @@ export class AppMessagesManager {
} }
public canForward(message: Message.message | Message.messageService) { public canForward(message: Message.message | Message.messageService) {
return !(message as Message.message).pFlags.noforwards && !appPeersManager.noForwards(message.peerId); return message._ === 'message' && !(message as Message.message).pFlags.noforwards && !appPeersManager.noForwards(message.peerId);
} }
private pushBatchUpdate<E extends keyof BatchUpdates, C extends BatchUpdates[E]>( private pushBatchUpdate<E extends keyof BatchUpdates, C extends BatchUpdates[E]>(

2
src/lib/mediaPlayer.ts

@ -152,7 +152,7 @@ export default class VideoPlayer extends ControlsHover {
}); });
listenerSetter.add(document)('keydown', (e: KeyboardEvent) => { listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {
if(rootScope.overlaysActive > 1) { // forward popup is active, etc if(rootScope.overlaysActive > 1 || document.pictureInPictureElement) { // forward popup is active, etc
return; return;
} }

2
src/lib/mtproto/schema.ts

File diff suppressed because one or more lines are too long

7
src/lib/storages/dialogs.ts

@ -762,7 +762,12 @@ export default class DialogsStorage {
if(peerId.isAnyChat()) { if(peerId.isAnyChat()) {
const chat: Chat = this.appChatsManager.getChat(peerId.toChatId()); const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());
// ! chatForbidden stays for chat where you're kicked // ! chatForbidden stays for chat where you're kicked
if(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) { if(
chat._ === 'channelForbidden'
// || chat._ === 'chatForbidden'
|| (chat as Chat.chat).pFlags.left
// || (chat as Chat.chat).pFlags.kicked
) {
return; return;
} }
} }

4
src/scripts/in/schema.json

File diff suppressed because one or more lines are too long

2
src/scripts/out/schema.json

File diff suppressed because one or more lines are too long

11
src/scss/partials/_chatBubble.scss

@ -1923,7 +1923,7 @@ $bubble-beside-button-width: 38px;
padding-top: 6px; padding-top: 6px;
} }
&:not(.sticker):not(.emoji-big) { &:not(.sticker):not(.emoji-big):not(.forwarded) {
&.hide-name, &.hide-name,
&:not(.is-group-first)/* , &.is-out */ { &:not(.is-group-first)/* , &.is-out */ {
.reply { .reply {
@ -2108,6 +2108,10 @@ $bubble-beside-button-width: 38px;
} }
} }
} }
code {
cursor: pointer;
}
} }
// * fix scroll with only 1 bubble // * fix scroll with only 1 bubble
@ -2343,6 +2347,11 @@ $bubble-beside-button-width: 38px;
} }
} }
} */ } */
pre,
code {
color: var(--monospace-text-color);
}
} }
.bubble.is-out { .bubble.is-out {

2
src/scss/style.scss

@ -203,6 +203,7 @@ $chat-input-inner-padding-handhelds: .25rem;
--poll-circle-color: var(--border-color); --poll-circle-color: var(--border-color);
--spoiler-background-color: #e3e5e8; --spoiler-background-color: #e3e5e8;
--spoiler-draft-background-color: #d9d9d9; --spoiler-draft-background-color: #d9d9d9;
--monospace-text-color: var(--danger-color);
--message-background-color: var(--surface-color); --message-background-color: var(--surface-color);
--message-checkbox-color: #61c642; --message-checkbox-color: #61c642;
@ -275,6 +276,7 @@ $chat-input-inner-padding-handhelds: .25rem;
--poll-circle-color: #fff; --poll-circle-color: #fff;
--spoiler-background-color: #373e4e; --spoiler-background-color: #373e4e;
--spoiler-draft-background-color: #484848; --spoiler-draft-background-color: #484848;
--monospace-text-color: var(--primary-text-color);
--message-background-color: var(--surface-color); --message-background-color: var(--surface-color);
--message-checkbox-color: var(--primary-color); --message-checkbox-color: var(--primary-color);

Loading…
Cancel
Save