From eded39cad26d6da26bc313b330f0d3edd74c6b1c Mon Sep 17 00:00:00 2001 From: morethanwords Date: Sat, 7 Nov 2020 20:04:57 +0200 Subject: [PATCH] RTL support in message input --- src/components/chat/input.ts | 15 +++++++++++++++ src/helpers/string.ts | 11 ++++++++++- src/scss/partials/_chatBubble.scss | 4 +++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/components/chat/input.ts b/src/components/chat/input.ts index 7d722bee..92e4a1c5 100644 --- a/src/components/chat/input.ts +++ b/src/components/chat/input.ts @@ -21,6 +21,7 @@ import { ripple } from '../ripple'; import Scrollable from "../scrollable"; import { toast } from "../toast"; import { wrapReply } from "../wrappers"; +import { checkRTL } from '../../helpers/string'; const RECORD_MIN_TIME = 500; const POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\'t allowed in this group.'; @@ -182,6 +183,7 @@ export class ChatInput { this.messageInput.addEventListener('input', (e) => { //console.log('messageInput input', this.messageInput.innerText, this.serializeNodes(Array.from(this.messageInput.childNodes))); + this.setDirection(); const value = this.messageInput.innerText; @@ -585,6 +587,17 @@ export class ChatInput { } this.updateSendBtn(); + this.setDirection(); + } + + public setDirection() { + const char = this.messageInput.innerText[0]; + let direction = 'ltr'; + if(char && checkRTL(char)) { + direction = 'rtl'; + } + + this.messageInput.style.direction = direction; } public sendMessage() { @@ -695,6 +708,7 @@ export class ChatInput { this.editMsgID = 0; this.helperType = this.helperFunc = undefined; this.chatInput.parentElement.classList.remove('is-helper-active'); + this.setDirection(); } public setTopInfo(type: ChatInputHelperType, callerFunc: () => void, title = '', subtitle = '', input?: string, message?: any) { @@ -721,6 +735,7 @@ export class ChatInput { setTimeout(() => { this.updateSendBtn(); + this.setDirection(); }, 0); } diff --git a/src/helpers/string.ts b/src/helpers/string.ts index 0a3dc926..3287ac16 100644 --- a/src/helpers/string.ts +++ b/src/helpers/string.ts @@ -74,4 +74,13 @@ export function splitStringByLength(str: string, maxLength: number) { } while(true); return out; -} \ No newline at end of file +} + +// https://stackoverflow.com/a/14824756 +export const checkRTL = (s: string) => { + const ltrChars = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF'+'\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF', + rtlChars = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC', + rtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'); + + return rtlDirCheck.test(s); +}; diff --git a/src/scss/partials/_chatBubble.scss b/src/scss/partials/_chatBubble.scss index a2569b60..6d5e0663 100644 --- a/src/scss/partials/_chatBubble.scss +++ b/src/scss/partials/_chatBubble.scss @@ -62,6 +62,7 @@ $bubble-margin: .25rem; position: relative; z-index: 1; margin: 0 auto; + user-select: none; &.is-highlighted, &.is-selected, /* #bubbles.is-selecting */ & { &:after { @@ -238,6 +239,7 @@ $bubble-margin: .25rem; height: fit-content; z-index: 2; transition: .2s transform; + user-select: text; @include respond-to(not-handhelds) { max-width: 85%; @@ -1037,7 +1039,7 @@ $bubble-margin: .25rem; line-height: 1; vertical-align: middle; pointer-events: none; // do not show title - display: inline-block; + display: inline-flex; /* display: inline-flex; align-items: center; */