From 6d7be2f40b094c1afdc0e41853ec3c58ea26799c Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:12:06 +0200 Subject: [PATCH 1/6] Fix emoji flags in q-chat --- core/font/TwemojiCountryFlags.woff2 | Bin 0 -> 78292 bytes core/font/material-icons.css | 7 ++++ .../plugins/core/components/ChatEmojiFlags.js | 20 +++++++++++ .../core/components/ChatTestEmojiFlags.js | 32 ++++++++++++++++++ plugins/plugins/core/q-chat/index.html | 2 +- plugins/plugins/core/q-chat/q-chat.src.js | 14 +++----- 6 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 core/font/TwemojiCountryFlags.woff2 create mode 100644 plugins/plugins/core/components/ChatEmojiFlags.js create mode 100644 plugins/plugins/core/components/ChatTestEmojiFlags.js diff --git a/core/font/TwemojiCountryFlags.woff2 b/core/font/TwemojiCountryFlags.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b9d6ea84b392bd43479c556d264fff6e5e57940e GIT binary patch literal 78292 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 K1)JR*5&!^7A{=4> literal 0 HcmV?d00001 diff --git a/core/font/material-icons.css b/core/font/material-icons.css index a1c525ae..62b28ab7 100644 --- a/core/font/material-icons.css +++ b/core/font/material-icons.css @@ -101,3 +101,10 @@ local('PaytoneOne'), url(PaytoneOne.ttf) format('truetype'); } + +@font-face { + font-family: 'Twemoji Country Flags'; + src: url('TwemojiCountryFlags.woff2') format('woff2'); + font-weight: normal; + font-style: normal; +} \ No newline at end of file diff --git a/plugins/plugins/core/components/ChatEmojiFlags.js b/plugins/plugins/core/components/ChatEmojiFlags.js new file mode 100644 index 00000000..4956b6a5 --- /dev/null +++ b/plugins/plugins/core/components/ChatEmojiFlags.js @@ -0,0 +1,20 @@ +import { supportsEmojiFlags } from './ChatTestEmojiFlags' + +export function supportCountryFlagEmojis(fontName = "Twemoji Country Flags", fontUrl = "/font/TwemojiCountryFlags.woff2") { + if (typeof window !== "undefined" && supportsEmojiFlags("😊") && !supportsEmojiFlags("🇨🇭")) { + const style = document.createElement("style") + + style.textContent = `@font-face { + font-family: "${fontName}"; + unicode-range: U+1F1E6-1F1FF, U+1F3F4, U+E0062-E0063, U+E0065, U+E0067, U+E006C, U+E006E, U+E0073-E0074, U+E0077, U+E007F; + src: url('${fontUrl}') format('woff2'); + font-display: swap; + }` + + document.head.appendChild(style) + + return true + } + + return false +} \ No newline at end of file diff --git a/plugins/plugins/core/components/ChatTestEmojiFlags.js b/plugins/plugins/core/components/ChatTestEmojiFlags.js new file mode 100644 index 00000000..07e48083 --- /dev/null +++ b/plugins/plugins/core/components/ChatTestEmojiFlags.js @@ -0,0 +1,32 @@ +const FONT_FAMILY = '"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif' + +function makeCtx() { + const canvas = document.createElement("canvas") + canvas.width = canvas.height = 1 + + const ctx = canvas.getContext("2d", { willReadFrequently: true }) + + ctx.textBaseline = "top" + ctx.font = `100px ${FONT_FAMILY}` + ctx.scale(0.01, 0.01) + + return ctx +} + +function getColor(ctx, text, color) { + ctx.clearRect(0, 0, 100, 100) + ctx.fillStyle = color + ctx.fillText(text, 0, 0) + + const bytes = ctx.getImageData(0, 0, 1, 1).data + + return bytes.join(",") +} + +export function supportsEmojiFlags(text) { + const ctx = makeCtx() + const white = getColor(ctx, text, "#fff") + const black = getColor(ctx, text, "#000") + + return black === white && !black.startsWith("0,0,0,") +} \ No newline at end of file diff --git a/plugins/plugins/core/q-chat/index.html b/plugins/plugins/core/q-chat/index.html index e6fab848..04e74a55 100644 --- a/plugins/plugins/core/q-chat/index.html +++ b/plugins/plugins/core/q-chat/index.html @@ -41,7 +41,7 @@ html, body { margin: 0; - font-family: "Roboto", sans-serif; + font-family: "Twemoji Country Flags", "Roboto", sans-serif; background: var(--plugback); overflow: hidden; } diff --git a/plugins/plugins/core/q-chat/q-chat.src.js b/plugins/plugins/core/q-chat/q-chat.src.js index 7a5b75d1..71b2f597 100644 --- a/plugins/plugins/core/q-chat/q-chat.src.js +++ b/plugins/plugins/core/q-chat/q-chat.src.js @@ -3,6 +3,7 @@ import { render } from 'lit/html.js' import { Epml } from '../../../epml' import { passiveSupport } from 'passive-events-support/src/utils' import { Editor, Extension } from '@tiptap/core' +import { supportCountryFlagEmojis } from '../components/ChatEmojiFlags' import { qchatStyles } from '../components/plugins-css' import isElectron from 'is-electron' import WebWorker from 'web-worker:./computePowWorker' @@ -24,7 +25,6 @@ import '@material/mwc-icon' import '@material/mwc-snackbar' import '@polymer/paper-spinner/paper-spinner-lite.js' import '@vaadin/grid' -import '@vaadin/scroller' import '@vaadin/tooltip' // Multi language support @@ -36,6 +36,7 @@ registerTranslateConfig({ const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) passiveSupport({ events: ['touchstart'] }) +supportCountryFlagEmojis() class Chat extends LitElement { static get properties() { @@ -150,14 +151,9 @@ class Chat extends LitElement { - -
    - ${this.isEmptyArray(this.chatHeads) ? this.renderLoadingText() : this.renderChatHead(this.chatHeads)} -
-
+
    + ${this.isEmptyArray(this.chatHeads) ? this.renderLoadingText() : this.renderChatHead(this.chatHeads)} +
this.scrollToBottom()}> From 9691e3f6d0ab0661f888af5b24211dfbce59aa16 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:23:31 +0200 Subject: [PATCH 2/6] Add general chat settings - Change font size of chat messages - Change time format of chat messages --- core/language/de.json | 10 + core/language/es.json | 10 + core/language/et.json | 10 + core/language/fi.json | 10 + core/language/fr.json | 10 + core/language/hindi.json | 10 + core/language/hr.json | 10 + core/language/hu.json | 10 + core/language/it.json | 10 + core/language/jp.json | 10 + core/language/ko.json | 10 + core/language/nl.json | 10 + core/language/no.json | 10 + core/language/pl.json | 10 + core/language/pt.json | 10 + core/language/ro.json | 10 + core/language/rs.json | 10 + core/language/ru.json | 10 + core/language/us.json | 10 + core/language/zhc.json | 10 + core/language/zht.json | 10 + plugins/plugins/core/components/ChatPage.js | 43 ++- .../core/components/ChatRightPanelSettings.js | 271 +++++++++++++ .../plugins/core/components/ChatScroller.js | 359 ++++++++++++++++-- .../plugins/core/components/plugins-css.js | 172 +++++++++ 25 files changed, 1023 insertions(+), 32 deletions(-) create mode 100644 plugins/plugins/core/components/ChatRightPanelSettings.js diff --git a/core/language/de.json b/core/language/de.json index a3bd5663..ff51f8a5 100644 --- a/core/language/de.json +++ b/core/language/de.json @@ -1319,5 +1319,15 @@ "tour20": "Blocks dahinter. Möchten Sie eine Aktualisierung (Bootstrap) durchführen, um den Synchronisierungsprozess zu beschleunigen?", "tour21": "Verbleibende Blöcke.", "tour22": "Aktualisierung (Bootstrap) angefordert. Bitte warten." + }, + "chatsettings": { + "cs1": "Chat-Einstellungen", + "cs2": "Allgemeine Chat-Einstellungen", + "cs3": "Zeitstempel der Chat-Nachricht", + "cs4": "Vorherige Zeit", + "cs5": "Ortszeit", + "cs6": "Schriftgröße der Chat-Nachricht", + "cs7": "Standard", + "cs8": "px" } } diff --git a/core/language/es.json b/core/language/es.json index 3935defc..c17ef369 100644 --- a/core/language/es.json +++ b/core/language/es.json @@ -1319,5 +1319,15 @@ "tour20": "bloques detrás. ¿Le gustaría actualizar (arrancar) para acelerar el proceso de sincronización?", "tour21": "bloques restantes.", "tour22": "Se solicitó actualización (arranque). Espere." + }, + "chatsettings": { + "cs1": "Configuración de chat", + "cs2": "Configuración general del chat", + "cs3": "Marca de tiempo del mensaje de chat", + "cs4": "Hace tiempo", + "cs5": "Hora local", + "cs6": "Tamaño de fuente del mensaje de chat", + "cs7": "Estándar", + "cs8": "px" } } diff --git a/core/language/et.json b/core/language/et.json index f2a159bd..0d7145aa 100644 --- a/core/language/et.json +++ b/core/language/et.json @@ -1319,5 +1319,15 @@ "tour20": "blokeerib taga. Kas soovite sünkroonimisprotsessi kiirendamiseks värskendada (bootstrap)?", "tour21": "jäänud plokke.", "tour22": "Taotleb värskendamist (bootstrap). Palun oodake." + }, + "chatsettings": { + "cs1": "Vestluse seaded", + "cs2": "Üldised vestluse seaded", + "cs3": "Vestlussõnumi ajatempel", + "cs4": "Aeg tagasi", + "cs5": "Kohalik aeg", + "cs6": "Vestlussõnumi fondi suurus", + "cs7": "Standardne", + "cs8": "px" } } diff --git a/core/language/fi.json b/core/language/fi.json index b5fb6553..6b88c09a 100644 --- a/core/language/fi.json +++ b/core/language/fi.json @@ -1319,5 +1319,15 @@ "tour20": "blokkeja takana. Haluatko päivittää (bootstrap) nopeuttaaksesi synkronointiprosessia?", "tour21": "jäljellä olevat lohkot.", "tour22": "Pyydellään päivitystä (bootstrap). Odota." + }, + "chatsettings": { + "cs1": "Pikaviestiasetukset", + "cs2": "Yleiset chat-asetukset", + "cs3": "Pikaviestin aikaleima", + "cs4": "Aika sitten", + "cs5": "Paikallinen aika", + "cs6": "Chat-viestin kirjasinkoko", + "cs7": "Vakio", + "cs8": "px" } } diff --git a/core/language/fr.json b/core/language/fr.json index dab0a7c3..58ad4892 100644 --- a/core/language/fr.json +++ b/core/language/fr.json @@ -1319,5 +1319,15 @@ "tour20": "blocs derrière. Souhaitez-vous actualiser (bootstrap) pour accélérer le processus de synchronisation ?", "tour21": "blocs restants.", "tour22": "Actualisation (bootstrap) demandée. Veuillez patienter." + }, + "chatsettings": { + "cs1": "Paramètres de discussion", + "cs2": "Paramètres généraux de discussion", + "cs3": "Horodatage du message de discussion", + "cs4": "Il y a du temps", + "cs5": "Heure locale", + "cs6": "Taille de la police des messages de discussion", + "cs7": "Standard", + "cs8": "px" } } diff --git a/core/language/hindi.json b/core/language/hindi.json index 3263ec7f..28cc208b 100644 --- a/core/language/hindi.json +++ b/core/language/hindi.json @@ -1319,5 +1319,15 @@ "tour20": "पीछे ब्लॉक। क्या आप सिंकिंग प्रक्रिया को तेज करने के लिए रीफ्रेश (बूटस्ट्रैप) करना चाहेंगे?", "tour21": "ब्लॉक शेष हैं।", "tour22": "रिफ्रेश (बूटस्ट्रैप) का अनुरोध किया गया। कृपया प्रतीक्षा करें।" + }, + "chatsettings": { + "cs1": "चैट सेटिंग", + "cs2": "सामान्य चैट सेटिंग", + "cs3": "चैट संदेश टाइमस्टैम्प", + "cs4": "समय पहले", + "cs5": "स्थानीय समय", + "cs6": "चैट संदेश फ़ॉन्ट आकार", + "cs7": "मानक", + "cs8": "px" } } diff --git a/core/language/hr.json b/core/language/hr.json index f557b346..e712a866 100644 --- a/core/language/hr.json +++ b/core/language/hr.json @@ -1319,5 +1319,15 @@ "tour20": "blokovi iza. Želite li osvježiti (bootstrap) da ubrzate proces sinkronizacije?", "tour21": "preostali blokovi.", "tour22": "Zatraženo je osvježavanje (bootstrap). Molimo pričekajte." + }, + "chatsettings": { + "cs1": "Postavke chata", + "cs2": "Opće postavke chata", + "cs3": "Vremenska oznaka poruke chata", + "cs4": "Prije vremena", + "cs5": "Lokalno vrijeme", + "cs6": "Veličina fonta poruke chata", + "cs7": "Standardno", + "cs8": "px" } } diff --git a/core/language/hu.json b/core/language/hu.json index e5528c0b..de5ea88a 100644 --- a/core/language/hu.json +++ b/core/language/hu.json @@ -1319,5 +1319,15 @@ "tour20": "blokkok mögött. Szeretne frissíteni (bootstrap) a szinkronizálási folyamat felgyorsítása érdekében?", "tour21": "még blokkok.", "tour22": "Frissítés (bootstrap) kérve. Kérjük, várjon." + }, + "chatsettings": { + "cs1": "Csevegés beállításai", + "cs2": "Általános csevegési beállítások", + "cs3": "Csevegési üzenet időbélyege", + "cs4": "Idővel ezelőtt", + "cs5": "Helyi idő", + "cs6": "Csevegési üzenet betűmérete", + "cs7": "Normál", + "cs8": "px" } } diff --git a/core/language/it.json b/core/language/it.json index 5566f078..5d7dadaf 100644 --- a/core/language/it.json +++ b/core/language/it.json @@ -1319,5 +1319,15 @@ "tour20": "blocchi dietro. Vuoi aggiornare (bootstrap) per accelerare il processo di sincronizzazione?", "tour21": "blocchi rimanenti.", "tour22": "Aggiornamento (bootstrap) richiesto. Attendi prego." + }, + "chatsettings": { + "cs1": "Impostazioni chat", + "cs2": "Impostazioni generali della chat", + "cs3": "Timestamp del messaggio di chat", + "cs4": "Tempo fa", + "cs5": "Ora locale", + "cs6": "Dimensione carattere messaggio chat", + "cs7": "Standard", + "cs8": "px" } } diff --git a/core/language/jp.json b/core/language/jp.json index cad3bdcc..a2d09ffe 100644 --- a/core/language/jp.json +++ b/core/language/jp.json @@ -1319,5 +1319,15 @@ "tour20": "ブロックが遅れています。同期プロセスを高速化するために更新 (ブートストラップ) しますか?", "tour21": "残りのブロック。", "tour22": "更新 (ブートストラップ) が要求されました。お待ちください。" + }, + "chatsettings": { + "cs1": "チャット設定", + "cs2": "一般チャット設定", + "cs3": "チャットメッセージのタイムスタンプ", + "cs4": "過去時間", + "cs5": "現地時間", + "cs6": "チャットメッセージのフォントサイズ", + "cs7": "標準", + "cs8": "px" } } diff --git a/core/language/ko.json b/core/language/ko.json index a8936506..c172d6ce 100644 --- a/core/language/ko.json +++ b/core/language/ko.json @@ -1319,5 +1319,15 @@ "tour20": "뒤에 차단되어 있습니다. 동기화 프로세스 속도를 높이기 위해 새로 고치시겠습니까(부트스트랩)?", "tour21": "남은 블록입니다.", "tour22": "새로 고침(부트스트랩)이 요청되었습니다. 잠시 기다려 주십시오." + }, + "chatsettings": { + "cs1": "채팅 설정", + "cs2": "일반 채팅 설정", + "cs3": "채팅 메시지 타임스탬프", + "cs4": "옛날", + "cs5": "현지 시간", + "cs6": "채팅 메시지 글꼴 크기", + "cs7": "표준", + "cs8": "px" } } diff --git a/core/language/nl.json b/core/language/nl.json index a10b8ad3..d8b50f68 100644 --- a/core/language/nl.json +++ b/core/language/nl.json @@ -1319,5 +1319,15 @@ "tour20": "blokken achterstand. Wenst U te herladen ('bootstrap') om het synchronisatie-proces te versnellen?", "tour21": "blokken te gaan.", "tour22": "Herladen ('bootstrap') werd aangevraagd. Gelive te wachten." + }, + "chatsettings": { + "cs1": "Chatinstellingen", + "cs2": "Algemene chatinstellingen", + "cs3": "Tijdstempel van chatbericht", + "cs4": "Tijd geleden", + "cs5": "Lokale tijd", + "cs6": "Lettergrootte chatbericht", + "cs7": "Standaard", + "cs8": "px" } } diff --git a/core/language/no.json b/core/language/no.json index 6e934a0a..9b6548f4 100644 --- a/core/language/no.json +++ b/core/language/no.json @@ -1319,5 +1319,15 @@ "tour20": "blokker bak. Vil du oppdatere (bootstrap) for å fremskynde synkroniseringsprosessen?", "tour21": "blokker igjen.", "tour22": "Oppdater (bootstrap) forespurt. Vennligst vent." + }, + "chatsettings": { + "cs1": "Chatinnstillinger", + "cs2": "Generelle chatinnstillinger", + "cs3": "Tidsstempel for chatmelding", + "cs4": "For tid siden", + "cs5": "Lokal tid", + "cs6": "Skriftstørrelse for chatmelding", + "cs7": "Standard", + "cs8": "px" } } diff --git a/core/language/pl.json b/core/language/pl.json index 5b9d3097..ee5a2199 100644 --- a/core/language/pl.json +++ b/core/language/pl.json @@ -1319,5 +1319,15 @@ "tour20": "bloki za sobą. Czy chcesz odświeżyć (bootstrap), aby przyspieszyć proces synchronizacji?", "tour21": "pozostałe bloki.", "tour22": "Zażądano odświeżenia (bootstrap). Proszę czekać." + }, + "chatsettings": { + "cs1": "Ustawienia czatu", + "cs2": "Ogólne ustawienia czatu", + "cs3": "Sygnatura czasowa wiadomości czatu", + "cs4": "Czas temu", + "cs5": "Czas lokalny", + "cs6": "Rozmiar czcionki wiadomości czatu", + "cs7": "Standardowy", + "cs8": "px" } } diff --git a/core/language/pt.json b/core/language/pt.json index 5f42ae85..409327ef 100644 --- a/core/language/pt.json +++ b/core/language/pt.json @@ -1319,5 +1319,15 @@ "tour20": "blocos atrás. Gostaria de atualizar (inicializar) para acelerar o processo de sincronização?", "tour21": "blocos restantes.", "tour22": "Atualização (bootstrap) solicitada. Aguarde." + }, + "chatsettings": { + "cs1": "Configurações de bate-papo", + "cs2": "Configurações gerais de bate-papo", + "cs3": "Data e hora da mensagem de bate-papo", + "cs4": "Tempo atrás", + "cs5": "Hora Local", + "cs6": "Tamanho da fonte da mensagem de bate-papo", + "cs7": "Padrão", + "cs8": "px" } } diff --git a/core/language/ro.json b/core/language/ro.json index dc1ab009..3b8665be 100644 --- a/core/language/ro.json +++ b/core/language/ro.json @@ -1319,5 +1319,15 @@ "tour20": "se blochează în urmă. Doriți să reîmprospătați (bootstrap) pentru a accelera procesul de sincronizare?", "tour21": "blocuri rămase.", "tour22": "Reîmprospătare (bootstrap) solicitată. Vă rugăm să așteptați." + }, + "chatsettings": { + "cs1": "Setări chat", + "cs2": "Setări generale de chat", + "cs3": "Marca temporală a mesajului de chat", + "cs4": "Timp în urmă", + "cs5": "Ora locală", + "cs6": "Dimensiunea fontului mesajului de chat", + "cs7": "Standard", + "cs8": "px" } } diff --git a/core/language/rs.json b/core/language/rs.json index 12e97877..3860f90c 100644 --- a/core/language/rs.json +++ b/core/language/rs.json @@ -1319,5 +1319,15 @@ "tour20": "blokovi iza. Da li želite da osvežite (bootstrap) da biste ubrzali proces sinhronizacije?", "tour21": "preostali blokovi.", "tour22": "Zatraženo je osvežavanje (bootstrap). Molimo sačekajte." + }, + "chatsettings": { + "cs1": "Podešavanja ćaskanja", + "cs2": "Opšta podešavanja ćaskanja", + "cs3": "Vremenska oznaka poruke ćaskanja", + "cs4": "pre vremena", + "cs5": "Lokalno vreme", + "cs6": "Veličina fonta poruke ćaskanja", + "cs7": "Standard", + "cs8": "pk" } } diff --git a/core/language/ru.json b/core/language/ru.json index a6bdc1e0..a5d16c0e 100644 --- a/core/language/ru.json +++ b/core/language/ru.json @@ -1319,5 +1319,15 @@ "tour20": "блоки позади. Хотите обновить (загрузочную загрузку), чтобы ускорить процесс синхронизации?", "tour21": "осталось блоков.", "tour22": "Запрошено обновление (загрузочная загрузка). Пожалуйста, подождите." + }, + "chatsettings": { + "cs1": "Настройки чата", + "cs2": "Общие настройки чата", + "cs3": "Временная метка сообщения чата", + "cs4": "Время назад", + "cs5": "Местное время", + "cs6": "Размер шрифта сообщения чата", + "cs7": "Стандартный", + "cs8": "px" } } diff --git a/core/language/us.json b/core/language/us.json index ae3b1353..6f6e5fa4 100644 --- a/core/language/us.json +++ b/core/language/us.json @@ -1319,5 +1319,15 @@ "tour20": "blocks behind. Would you like to refresh (bootstrap) to speed up the syncing process?", "tour21": "blocks remaining.", "tour22": "Refresh (bootstrap) requested. Please wait." + }, + "chatsettings": { + "cs1": "Chat Settings", + "cs2": "General Chat Settings", + "cs3": "Chat Message Timestamp", + "cs4": "Time Ago", + "cs5": "Local Time", + "cs6": "Chat Message Font Size", + "cs7": "Standard", + "cs8": "px" } } diff --git a/core/language/zhc.json b/core/language/zhc.json index dea8a0b4..cf275e77 100644 --- a/core/language/zhc.json +++ b/core/language/zhc.json @@ -1319,5 +1319,15 @@ "tour20": "落后了。您想刷新(引导)以加快同步过程吗?", "tour21": "剩余块数。", "tour22": "已请求刷新(引导)。请稍候。" + }, + "chatsettings": { + "cs1": "聊天设置", + "cs2": "常规聊天设置", + "cs3": "聊天消息时间戳", + "cs4": "时间前", + "cs5": "当地时间", + "cs6": "聊天消息字体大小", + "cs7": "标准", + "cs8": "px" } } diff --git a/core/language/zht.json b/core/language/zht.json index 7150f4b4..d966121f 100644 --- a/core/language/zht.json +++ b/core/language/zht.json @@ -1319,5 +1319,15 @@ "tour20": "落後了。您想刷新(引導)以加快同步過程嗎?", "tour21": "剩餘塊數。", "tour22": "已要求刷新(引導)。請稍候。" + }, + "chatsettings": { + "cs1": "聊天設定", + "cs2": "常規聊天設定", + "cs3": "聊天訊息時間戳", + "cs4": "很久以前", + "cs5": "當地時間", + "cs6": "聊天訊息字體大小", + "cs7": "標準", + "cs8": "px" } } diff --git a/plugins/plugins/core/components/ChatPage.js b/plugins/plugins/core/components/ChatPage.js index e176d10e..02193e78 100644 --- a/plugins/plugins/core/components/ChatPage.js +++ b/plugins/plugins/core/components/ChatPage.js @@ -34,12 +34,14 @@ import './ChatLeaveGroup' import './ChatGroupSettings' import './ChatRightPanel' import './ChatRightPanelResources' +import './ChatRightPanelSettings' import './ChatSearchResults' import '@material/mwc-button' import '@material/mwc-dialog' import '@material/mwc-icon' import '@polymer/paper-dialog/paper-dialog.js' import '@polymer/paper-spinner/paper-spinner-lite.js' +import '@vaadin/tooltip' // Multi language support import { get, translate } from '../../../../core/translate' @@ -108,6 +110,7 @@ class ChatPage extends LitElement { groupMembers: { type: Array }, shifted: { type: Boolean }, shiftedResources: { type: Boolean }, + shiftedSettings: { type: Boolean }, groupInfo: { type: Object }, setActiveChatHeadUrl: { attribute: false }, userFound: { type: Array }, @@ -200,6 +203,7 @@ class ChatPage extends LitElement { this.groupMembers = [] this.shifted = false this.shiftedResources = false + this.shiftedSettings = false this.groupInfo = {} this.pageNumber = 1 this.userFoundModalOpen = false @@ -258,6 +262,8 @@ class ChatPage extends LitElement { }
+ settings + ${(!this.isReceipient && +this._chatId !== 0) ? html` link @@ -661,7 +667,12 @@ class ChatPage extends LitElement { }} > ${this.forwardActiveChatHeadUrl.selected ? - (html`

${translate("chatpage.cchange38")}

`) + (html` +
+

${translate("chatpage.cchange38")}

+ +
+ `) : (html``) }
@@ -695,7 +706,9 @@ class ChatPage extends LitElement { return html` {this.forwardActiveChatHeadUrl = {...this.forwardActiveChatHeadUrl, url: val}; this.userFound = [];}} + .setActiveChatHeadUrl=${ + (val) => {this.forwardActiveChatHeadUrl = {...this.forwardActiveChatHeadUrl, url: val}; this.userFound = [];} + } chatInfo=${JSON.stringify(item)} > @@ -780,6 +793,12 @@ class ChatPage extends LitElement { >
+
+ this._toggleSettings(val)} + > + +
` } @@ -787,6 +806,14 @@ class ChatPage extends LitElement { async firstUpdated() { this.changeTheme() + if (localStorage.getItem('timestampForChats') === null) { + localStorage.setItem('timestampForChats', 'ago') + } + + if (localStorage.getItem('fontsizeForChats') === null) { + localStorage.setItem('fontsizeForChats', 'font16') + } + window.addEventListener('storage', () => { const checkLanguage = localStorage.getItem('qortalLanguage') const checkTheme = localStorage.getItem('qortalTheme') @@ -838,6 +865,11 @@ class ChatPage extends LitElement { this.requestUpdate() } + _toggleSettings(value) { + this.shiftedSettings = value === (false || true) ? value : !this.shiftedSettings + this.requestUpdate() + } + setOpenTipUser(props) { this.openTipUser = props } @@ -1376,7 +1408,12 @@ class ChatPage extends LitElement { await this.getUpdateComplete() const marginElements = Array.from(this.shadowRoot.querySelector('chat-scroller').shadowRoot.querySelectorAll('message-template')) - const findMessage2 = marginElements.find((item) => item.messageObj.signature === message.signature) || marginElements.find((item) => item.messageObj.originalSignature === message.signature) || marginElements.find((item) => item.messageObj.signature === message.originalSignature) || marginElements.find((item) => item.messageObj.originalSignature === message.originalSignature) + const findMessage2 = marginElements.find((item) => + item.messageObj.signature === message.signature) || marginElements.find( + (item) => item.messageObj.originalSignature === message.signature + ) + || marginElements.find((item) => item.messageObj.signature === message.originalSignature) + || marginElements.find((item) => item.messageObj.originalSignature === message.originalSignature) if (findMessage2) { findMessage2.scrollIntoView({ block: 'center' }) } diff --git a/plugins/plugins/core/components/ChatRightPanelSettings.js b/plugins/plugins/core/components/ChatRightPanelSettings.js new file mode 100644 index 00000000..61170d28 --- /dev/null +++ b/plugins/plugins/core/components/ChatRightPanelSettings.js @@ -0,0 +1,271 @@ +import { html, LitElement } from 'lit' +import { Epml } from '../../../epml' +import { chatRightPanelSettingsStyles } from './plugins-css' +import './WrapperModal' +import '@material/mwc-button' +import '@material/mwc-icon' +import '@vaadin/button' + +// Multi language support +import { translate } from '../../../../core/translate' + +const parentEpml = new Epml({ type: 'WINDOW', source: window.parent }) + +class ChatRightPanelSettings extends LitElement { + static get properties() { + return { + toggle: { attribute: false }, + agoTime: { type: Boolean }, + isoTime: { type: Boolean }, + bothTime: { type: Boolean }, + currentFontSize16: { type: Boolean }, + currentFontSize18: { type: Boolean }, + currentFontSize20: { type: Boolean }, + currentFontSize22: { type: Boolean } } + } + + static get styles() { + return [chatRightPanelSettingsStyles] + } + + constructor() { + super() + this.agoTime = false + this.isoTime = false + this.bothTime = false + this.currentFontSize16 = false + this.currentFontSize18 = false + this.currentFontSize20 = false + this.currentFontSize22 = false + } + + render() { + return html` +
+
+ this.toggle(false)} style="margin: 0px 10px" icon="vaadin:close" slot="icon"> +
+
+
+

${translate("chatsettings.cs2")}

+
+
+
+

${translate("chatsettings.cs3")}

+
+ + this.setAgo(e)} + ?checked=${this.agoTime} + > +
+
+ + this.setIso(e)} + ?checked=${this.isoTime} + > +
+
+ + this.setBoth(e)} + ?checked=${this.bothTime} + > +
+
+

+
+

${translate("chatsettings.cs6")}

+
+ + this.setFont16(e)} + ?checked=${this.currentFontSize16} + > +
+
+ + this.setFont18(e)} + ?checked=${this.currentFontSize18} + > +   |   + + this.setFont20(e)} + ?checked=${this.currentFontSize20} + > +   |   + + this.setFont22(e)} + ?checked=${this.currentFontSize22} + > +
+
+
+
+ ` + } + + firstUpdated() { + this.setTimeFormat() + this.setFontFormat() + } + + setTimeFormat() { + if (localStorage.getItem('timestampForChats') === 'ago') { + this.agoTime = true + this.isoTime = false + this.bothTime = false + } else if (localStorage.getItem('timestampForChats') === 'iso') { + this.agoTime = false + this.isoTime = true + this.bothTime = false + } else if (localStorage.getItem('timestampForChats') === 'both') { + this.agoTime = false + this.isoTime = false + this.bothTime = true + } + } + + setAgo(e) { + if (!e.target.checked) { + window.localStorage.setItem('timestampForChats', 'ago') + window.dispatchEvent( new Event('storage') ) + this.setTimeFormat() + } else { + window.localStorage.setItem('timestampForChats', 'ago') + window.dispatchEvent( new Event('storage') ) + this.setTimeFormat() + } + } + + setIso(e) { + if (!e.target.checked) { + window.localStorage.setItem('timestampForChats', 'iso') + window.dispatchEvent( new Event('storage') ) + this.setTimeFormat() + } else { + window.localStorage.setItem('timestampForChats', 'ago') + window.dispatchEvent( new Event('storage') ) + this.setTimeFormat() + } + } + + setBoth(e) { + if (!e.target.checked) { + window.localStorage.setItem('timestampForChats', 'both') + window.dispatchEvent( new Event('storage') ) + this.setTimeFormat() + } else { + window.localStorage.setItem('timestampForChats', 'ago') + window.dispatchEvent( new Event('storage') ) + this.setTimeFormat() + } + } + + setFontFormat() { + if (localStorage.getItem('fontsizeForChats') === 'font16') { + this.currentFontSize16 = true + this.currentFontSize18 = false + this.currentFontSize20 = false + this.currentFontSize22 = false + } else if (localStorage.getItem('fontsizeForChats') === 'font18') { + this.currentFontSize16 = false + this.currentFontSize18 = true + this.currentFontSize20 = false + this.currentFontSize22 = false + } else if (localStorage.getItem('fontsizeForChats') === 'font20') { + this.currentFontSize16 = false + this.currentFontSize18 = false + this.currentFontSize20 = true + this.currentFontSize22 = false + } else if (localStorage.getItem('fontsizeForChats') === 'font22') { + this.currentFontSize16 = false + this.currentFontSize18 = false + this.currentFontSize20 = false + this.currentFontSize22 = true + } + } + + setFont16(e) { + if (!e.target.checked) { + window.localStorage.setItem('fontsizeForChats', 'font16') + window.dispatchEvent( new Event('storage') ) + this.setFontFormat() + } else { + window.localStorage.setItem('fontsizeForChats', 'font16') + window.dispatchEvent( new Event('storage') ) + this.setFontFormat() + } + } + + setFont18(e) { + if (!e.target.checked) { + window.localStorage.setItem('fontsizeForChats', 'font18') + window.dispatchEvent( new Event('storage') ) + this.setFontFormat() + } else { + window.localStorage.setItem('fontsizeForChats', 'font16') + window.dispatchEvent( new Event('storage') ) + this.setFontFormat() + } + } + + setFont20(e) { + if (!e.target.checked) { + window.localStorage.setItem('fontsizeForChats', 'font20') + window.dispatchEvent( new Event('storage') ) + this.setFontFormat() + } else { + window.localStorage.setItem('fontsizeForChats', 'font16') + window.dispatchEvent( new Event('storage') ) + this.setFontFormat() + } + } + + setFont22(e) { + if (!e.target.checked) { + window.localStorage.setItem('fontsizeForChats', 'font22') + window.dispatchEvent( new Event('storage') ) + this.setFontFormat() + } else { + window.localStorage.setItem('fontsizeForChats', 'font16') + window.dispatchEvent( new Event('storage') ) + this.setFontFormat() + } + } + + // Standard functions + getApiKey() { + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] + return myNode.apiKey + } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } + + round(number) { + return (Math.round(parseFloat(number) * 1e8) / 1e8).toFixed(8) + } +} + +window.customElements.define('chat-right-panel-settings', ChatRightPanelSettings) \ No newline at end of file diff --git a/plugins/plugins/core/components/ChatScroller.js b/plugins/plugins/core/components/ChatScroller.js index 68169191..9054ff9b 100644 --- a/plugins/plugins/core/components/ChatScroller.js +++ b/plugins/plugins/core/components/ChatScroller.js @@ -241,8 +241,7 @@ class ChatScroller extends LitElement { isLoadingAfter: { type: Boolean }, messageQueue: { type: Array }, loggedInUserName: { type: String }, - loggedInUserAddress: { type: String } - } + loggedInUserAddress: { type: String } } } static get styles() { @@ -384,6 +383,7 @@ class ChatScroller extends LitElement { async firstUpdated() { this.changeTheme() + window.addEventListener('storage', () => { const checkTheme = localStorage.getItem('qortalTheme') @@ -1015,7 +1015,14 @@ class MessageTemplate extends LitElement { addSeenMessage: { attribute: false }, chatId: { type: String }, isInProgress: { type: Boolean }, - id: { type: String } + id: { type: String }, + timeId: { type: String }, + isAgo: { type: Boolean }, + isIso: { type: Boolean }, + isBoth: { type: Boolean }, + fontSize: { type: String }, + messageFontSize: { type: String }, + replyFontSize: { type: String } } } @@ -1045,6 +1052,13 @@ class MessageTemplate extends LitElement { this.openDeleteGif = false this.openDeleteAttachment = false this.openDeleteFile = false + this.timeId = localStorage.getItem('timestampForChats') ? localStorage.getItem('timestampForChats') : 'ago' + this.isAgo = false + this.isIso = false + this.isBoth = false + this.fontSize = localStorage.getItem('fontsizeForChats') ? localStorage.getItem('fontsizeForChats') : 'font16' + this.messageFontSize = '' + this.replyFontSize = '' } render() { @@ -1067,6 +1081,7 @@ class MessageTemplate extends LitElement { let isForwarded = false let isEdited = false + try { const parsedMessageObj = JSON.parse(this.messageObj.decodedMessage) @@ -1182,11 +1197,54 @@ class MessageTemplate extends LitElement { } } - nameMenu = html`${this.messageObj.senderName ? this.messageObj.senderName : cropAddress(this.messageObj.sender)}` + nameMenu = html` +
+ + ${this.messageObj.senderName ? this.messageObj.senderName : cropAddress(this.messageObj.sender)} + +
+ ` - forwarded = html`${translate('blockpage.bcchange17')}` + forwarded = html` + + ${translate('blockpage.bcchange17')} + + ` - edited = html`${translate('chatpage.cchange68')} ` + if (this.timeId === 'ago') { + this.isAgo = true + this.isIso = false + this.isBoth = false + } else if (this.timeId === 'iso') { + this.isAgo = false + this.isIso = true + this.isBoth = false + } else if (this.timeId === 'both') { + this.isAgo = false + this.isIso = false + this.isBoth = true + } + + if (this.fontSize === 'font16') { + this.messageFontSize = "font-size: 16px" + this.replyFontSize = "font-size: 14px" + } else if (this.fontSize === 'font18') { + this.messageFontSize = "font-size: 18px" + this.replyFontSize = "font-size: 16px" + } else if (this.fontSize === 'font20') { + this.messageFontSize = "font-size: 20px" + this.replyFontSize = "font-size: 18px" + } else if (this.fontSize === 'font22') { + this.messageFontSize = "font-size: 22px" + this.replyFontSize = "font-size: 20px" + } + + edited = html` + + ${translate('chatpage.cchange68')} + + + ` if (repliedToData) { try { @@ -1212,7 +1270,16 @@ class MessageTemplate extends LitElement { } return hideit ? html`
  • ` : html` -
  • +
  • @@ -1238,20 +1305,46 @@ class MessageTemplate extends LitElement { message-subcontainer2 ${this.myAddress === this.messageObj.sender && 'message-myBg'} ${ - ((this.isFirstMessage === true && this.isSingleMessageInGroup === false) || (this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true)) && this.myAddress !== this.messageObj.sender ? 'message-triangle' - : ((this.isFirstMessage === true && this.isSingleMessageInGroup === false) || (this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true)) && this.myAddress === this.messageObj.sender ? 'message-myTriangle' + ( + (this.isFirstMessage === true && this.isSingleMessageInGroup === false) + || (this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true) + ) && this.myAddress !== this.messageObj.sender ? + 'message-triangle' + : ( + (this.isFirstMessage === true && this.isSingleMessageInGroup === false) + || (this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true) + ) && this.myAddress === this.messageObj.sender ? + 'message-myTriangle' : null } `}" - style="${ - this.isSingleMessageInGroup === true && this.isLastMessageInGroup === false ? 'margin-bottom: 0;' : null} + style=" + ${ + this.isSingleMessageInGroup === true + && this.isLastMessageInGroup === false ? + 'margin-bottom: 0;' + : null + } ${ - this.isFirstMessage === false && this.isSingleMessageInGroup === true && this.isLastMessageInGroup === false ? 'border-radius: 8px 25px 25px 8px;' - : this.isFirstMessage === true && this.isSingleMessageInGroup === true && this.isLastMessageInGroup === false ? 'border-radius: 27px 25px 25px 12px;' - : this.isFirstMessage === false && this.isSingleMessageInGroup === true && this.isLastMessageInGroup === true ? 'border-radius: 10px 25px 25px 0;' - : this.isFirstMessage === true && this.isSingleMessageInGroup === false && this.isLastMessageInGroup === true ? 'border-radius: 25px 25px 25px 0px;' + this.isFirstMessage === false + && this.isSingleMessageInGroup === true + && this.isLastMessageInGroup === false ? + 'border-radius: 8px 25px 25px 8px;' + : this.isFirstMessage === true + && this.isSingleMessageInGroup === true + && this.isLastMessageInGroup === false ? + 'border-radius: 27px 25px 25px 12px;' + : this.isFirstMessage === false + && this.isSingleMessageInGroup === true + && this.isLastMessageInGroup === true ? + 'border-radius: 10px 25px 25px 0;' + : this.isFirstMessage === true + && this.isSingleMessageInGroup === false + && this.isLastMessageInGroup === true ? + 'border-radius: 25px 25px 25px 0px;' : null - }" + } + " > ${repliedToData && html` -
    {this.goToRepliedMessage(repliedToData, this.messageObj);}}> -

    +

    {this.goToRepliedMessage(repliedToData, this.messageObj);}} + > +

    ${repliedToData.senderName ? repliedToData.senderName : cropAddress(repliedToData.sender)}

    ${version && version.toString() === '1' ? html` - ${repliedToData.decodedMessage.messageText} +

    + ${repliedToData.decodedMessage.messageText} +
    ` : '' } ${+version > 1 && repliedToMessageText ? html` - ${unsafeHTML(repliedToMessageText)} +
    + ${unsafeHTML(repliedToMessageText)} +
    ` : '' } @@ -1313,7 +1421,17 @@ class MessageTemplate extends LitElement { class=${[`image-container`, !this.isImageLoaded ? 'defaultSize' : '',].join(' ')} style=${this.isFirstMessage && 'margin-top: 10px;'} > -
    +
    ${translate('chatpage.cchange40')}
    @@ -1356,7 +1474,17 @@ class MessageTemplate extends LitElement { class=${[`image-container`, !this.isGifoaded ? 'defaultSize' : '', ].join(' ')} style=${this.isFirstMessage && 'margin-top: 10px;'} > -
    +
    ${translate('gifs.gchange25')}
    @@ -1365,7 +1493,12 @@ class MessageTemplate extends LitElement { } ${gif && !isGifDeleted && (this.viewImage || this.myAddress === this.messageObj.sender) ? html` -
    +
    ${gifHTML} ${this.myAddress === this.messageObj.sender ? html` @@ -1486,16 +1619,22 @@ class MessageTemplate extends LitElement {
    ${+version > 1 ? messageVersion2WithLink ? html` - ${messageVersion2WithLink} +
    + ${messageVersion2WithLink} +
    ` : html` - ${unsafeHTML(messageVersion2)} +
    + ${unsafeHTML(messageVersion2)} +
    ` : '' } ${version && version.toString() === '1' ? html` - ${unsafeHTML(this.emojiPicker.parse(replacedMessage))} +
    + ${unsafeHTML(this.emojiPicker.parse(replacedMessage))} +
    ` : '' } @@ -1508,12 +1647,40 @@ class MessageTemplate extends LitElement {
    ${isEdited ? html`${edited}` : ''} - ${this.isInProgress ? html`

    ${translate('chatpage.cchange91')}

    ` : html`${new Date(this.messageObj.timestamp).toLocaleString()}`} + ${this.isInProgress ? html` +

    ${translate('chatpage.cchange91')}

    + ` : this.isAgo ? html` +
    + + + +
    + ` : this.isIso ? html` +
    + + ${new Date(this.messageObj.timestamp).toLocaleString()} + +
    + ` : this.isBoth ? html` +
    + + ${new Date(this.messageObj.timestamp).toLocaleString()} + ( ) + +
    + ` : '' + }
    @@ -1719,6 +1886,140 @@ class MessageTemplate extends LitElement { } firstUpdated() { + window.addEventListener('storage', () => { + if (localStorage.getItem('timestampForChats') !== this.timeId) { + this.timeId = localStorage.getItem('timestampForChats') + + if (this.timeId === 'ago') { + this.isAgo = true + this.isIso = false + this.isBoth = false + const setTimeFormatAgo = this.shadowRoot.querySelectorAll('#timeformat') + setTimeFormatAgo.forEach((replaceToAgo) => { + replaceToAgo.innerHTML = ` + + + + ` + }) + } else if (this.timeId === 'iso') { + this.isAgo = false + this.isIso = true + this.isBoth = false + const setTimeFormatIso = this.shadowRoot.querySelectorAll('#timeformat') + setTimeFormatIso.forEach((replaceToIso) => { + replaceToIso.innerHTML = ` + + ${new Date(this.messageObj.timestamp).toLocaleString()} + + ` + }) + } else if (this.timeId === 'both') { + this.isAgo = false + this.isIso = false + this.isBoth = true + const setTimeFormatBoth = this.shadowRoot.querySelectorAll('#timeformat') + setTimeFormatBoth.forEach((replaceToBoth) => { + replaceToBoth.innerHTML = ` + + ${new Date(this.messageObj.timestamp).toLocaleString()} + ( ) + + ` + }) + } + } + + if (localStorage.getItem('fontsizeForChats') !== this.messageFontSize) { + this.messageFontSize = localStorage.getItem('fontsizeForChats') + if (this.messageFontSize === 'font16') { + const setFontSize16 = this.shadowRoot.querySelectorAll('#fontsize') + setFontSize16.forEach((replaceFontSizeTo16) => { + replaceFontSizeTo16.removeAttribute("style") + replaceFontSizeTo16.setAttribute("style", "font-size: 16px;") + }) + const setNameSize16 = this.shadowRoot.querySelectorAll('#namesize') + setNameSize16.forEach((replaceNameSizeTo16) => { + replaceNameSizeTo16.removeAttribute("style") + replaceNameSizeTo16.setAttribute("style", "font-size: 16px;") + }) + const setReplyFontSize16 = this.shadowRoot.querySelectorAll('#replyFontSize') + setReplyFontSize16.forEach((replaceReplayFontSizeTo16) => { + replaceReplayFontSizeTo16.removeAttribute("style") + replaceReplayFontSizeTo16.setAttribute("style", "font-size: 14px;") + }) + const setReplyNameSize16 = this.shadowRoot.querySelectorAll('#replyNameSize') + setReplyNameSize16.forEach((replaceReplayNameSizeTo16) => { + replaceReplayNameSizeTo16.removeAttribute("style") + replaceReplayNameSizeTo16.setAttribute("style", "font-size: 14px;") + }) + } else if (this.messageFontSize === 'font18') { + const setFontSize18 = this.shadowRoot.querySelectorAll('#fontsize') + setFontSize18.forEach((replaceFontSizeTo18) => { + replaceFontSizeTo18.removeAttribute("style") + replaceFontSizeTo18.setAttribute("style", "font-size: 18px;") + }) + const setNameSize18 = this.shadowRoot.querySelectorAll('#namesize') + setNameSize18.forEach((replaceNameSizeTo18) => { + replaceNameSizeTo18.removeAttribute("style") + replaceNameSizeTo18.setAttribute("style", "font-size: 18px;") + }) + const setReplyFontSize18 = this.shadowRoot.querySelectorAll('#replyFontSize') + setReplyFontSize18.forEach((replaceReplayFontSizeTo18) => { + replaceReplayFontSizeTo18.removeAttribute("style") + replaceReplayFontSizeTo18.setAttribute("style", "font-size: 16px;") + }) + const setReplyNameSize18 = this.shadowRoot.querySelectorAll('#replyNameSize') + setReplyNameSize18.forEach((replaceReplayNameSizeTo18) => { + replaceReplayNameSizeTo18.removeAttribute("style") + replaceReplayNameSizeTo18.setAttribute("style", "font-size: 16px;") + }) + } else if (this.messageFontSize === 'font20') { + const setFontSize20 = this.shadowRoot.querySelectorAll('#fontsize') + setFontSize20.forEach((replaceFontSizeTo20) => { + replaceFontSizeTo20.removeAttribute("style") + replaceFontSizeTo20.setAttribute("style", "font-size: 20px;") + }) + const setNameSize20 = this.shadowRoot.querySelectorAll('#namesize') + setNameSize20.forEach((replaceNameSizeTo20) => { + replaceNameSizeTo20.removeAttribute("style") + replaceNameSizeTo20.setAttribute("style", "font-size: 20px;") + }) + const setReplyFontSize20 = this.shadowRoot.querySelectorAll('#replyFontSize') + setReplyFontSize20.forEach((replaceReplayFontSizeTo20) => { + replaceReplayFontSizeTo20.removeAttribute("style") + replaceReplayFontSizeTo20.setAttribute("style", "font-size: 18px;") + }) + const setReplyNameSize20 = this.shadowRoot.querySelectorAll('#replyNameSize') + setReplyNameSize20.forEach((replaceReplayNameSizeTo20) => { + replaceReplayNameSizeTo20.removeAttribute("style") + replaceReplayNameSizeTo20.setAttribute("style", "font-size: 18px;") + }) + } else if (this.messageFontSize === 'font22') { + const setFontSize22 = this.shadowRoot.querySelectorAll('#fontsize') + setFontSize22.forEach((replaceFontSizeTo22) => { + replaceFontSizeTo22.removeAttribute("style") + replaceFontSizeTo22.setAttribute("style", "font-size: 22px;") + }) + const setNameSize22 = this.shadowRoot.querySelectorAll('#namesize') + setNameSize22.forEach((replaceNameSizeTo22) => { + replaceNameSizeTo22.removeAttribute("style") + replaceNameSizeTo22.setAttribute("style", "font-size: 22px;") + }) + const setReplyFontSize22 = this.shadowRoot.querySelectorAll('#replyFontSize') + setReplyFontSize22.forEach((replaceReplayFontSizeTo22) => { + replaceReplayFontSizeTo22.removeAttribute("style") + replaceReplayFontSizeTo22.setAttribute("style", "font-size: 20px;") + }) + const setReplyNameSize22 = this.shadowRoot.querySelectorAll('#replyNameSize') + setReplyNameSize22.forEach((replaceReplayNameSizeTo22) => { + replaceReplayNameSizeTo22.removeAttribute("style") + replaceReplayNameSizeTo22.setAttribute("style", "font-size: 20px;") + }) + } + } + }) + const autoSeeChatList = window.parent.reduxStore.getState().app.autoLoadImageChats if (autoSeeChatList.includes(this.chatId) || this.listSeenMessages.includes(this.messageObj.signature)) { diff --git a/plugins/plugins/core/components/plugins-css.js b/plugins/plugins/core/components/plugins-css.js index 9de78759..11d70271 100644 --- a/plugins/plugins/core/components/plugins-css.js +++ b/plugins/plugins/core/components/plugins-css.js @@ -2755,6 +2755,178 @@ export const levelFounderStyles = css` } ` +export const chatRightPanelSettingsStyles = css` + .top-bar-icon { + cursor: pointer; + height: 18px; + width: 18px; + color: var(--black); + transition: 0.2s all; + } + + .top-bar-icon:hover { + color: #F44336; + } + + .red { + color: #F44336; + } + + .green { + color: #198754; + } + + .modal-button { + font-family: Roboto, sans-serif; + font-size: 16px; + color: var(--mdc-theme-primary); + background-color: transparent; + padding: 8px 10px; + border-radius: 5px; + border: none; + transition: all 0.3s ease-in-out; + } + + .close-row { + width: 100%; + display: flex; + justify-content: flex-end; + height: 50px; + flex: 0; + align-items: center; + } + + .container-body { + width: 100%; + display: flex; + flex-direction: column; + flex-grow: 1; + overflow: auto; + margin-top: 5px; + padding: 0px 6px; + box-sizing: border-box; + } + + .container-body::-webkit-scrollbar-track { + background-color: whitesmoke; + border-radius: 7px; + } + + .container-body::-webkit-scrollbar { + width: 6px; + border-radius: 7px; + background-color: whitesmoke; + } + + .container-body::-webkit-scrollbar-thumb { + background-color: rgb(180, 176, 176); + border-radius: 7px; + transition: all 0.3s ease-in-out; + } + + .container-body::-webkit-scrollbar-thumb:hover { + background-color: rgb(148, 146, 146); + cursor: pointer; + } + + p { + color: var(--black); + margin: 0px; + padding: 0px; + word-break: break-all; + } + + .container { + display: flex; + width: 100%; + flex-direction: column; + height: 100%; + } + + .chat-right-panel-label { + font-family: Montserrat, sans-serif; + color: var(--group-header); + padding: 5px; + font-size: 13px; + user-select: none; + } + + .group-info { + display: flex; + flex-direction: column; + justify-content: flex-start; + gap: 10px; + } + + .group-name { + font-family: Raleway, sans-serif; + font-size: 20px; + color: var(--chat-bubble-msg-color); + text-align: center; + user-select: none; + } + + .group-description { + font-family: Roboto, sans-serif; + color: var(--chat-bubble-msg-color); + letter-spacing: 0.3px; + font-weight: 500; + font-size: 16px; + margin-top: 15px; + word-break: break-word; + user-select: none; + } + + .group-subheader { + font-family: Montserrat, sans-serif; + font-size: 14px; + color: var(--chat-bubble-msg-color); + } + + .group-data { + font-family: Roboto, sans-serif; + letter-spacing: 0.3px; + font-weight: 300; + font-size: 14px; + color: var(--chat-bubble-msg-color); + } + + .message-myBg { + background-color: var(--chat-bubble-myBg) !important; + margin-bottom: 15px; + border-radius: 5px; + padding: 5px; + } + + .message-data-name { + user-select: none; + color: #03a9f4; + margin-bottom: 5px; + } + + .message-user-info { + display: flex; + justify-content: space-between; + width: 100%; + gap: 10px; + } + + .hideImg { + visibility: hidden; + } + + .checkbox-row { + position: relative; + display: flex; + align-items: center; + align-content: center; + font-family: Montserrat, sans-serif; + font-weight: 600; + color: var(--black); + padding-left: 5px; + } +` + export const chatRightPanelResourcesStyles = css` .top-bar-icon { cursor: pointer; From dc0221f7271b9d118a16a78fc4a1252218b2df60 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:33:11 +0200 Subject: [PATCH 3/6] Update dependencies --- package-lock.json | 87 ++++++++++++++++++++++++++--------------------- package.json | 7 ++-- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index f21f0046..a11d7954 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,13 +47,13 @@ "prosemirror-state": "1.4.3", "prosemirror-transform": "1.9.0", "prosemirror-view": "1.33.8", - "sass": "1.77.5", + "sass": "1.77.6", "short-unique-id": "5.2.0", "xhr2": "0.2.1" }, "devDependencies": { "@babel/core": "7.24.7", - "@electron/packager": "18.3.2", + "@electron/packager": "18.3.3", "@material/mwc-button": "0.27.0", "@material/mwc-checkbox": "0.27.0", "@material/mwc-dialog": "0.27.0", @@ -101,13 +101,12 @@ "@vaadin/grid": "24.2.9", "@vaadin/icons": "24.2.9", "@vaadin/password-field": "24.2.9", - "@vaadin/scroller": "24.2.9", "@vaadin/tabs": "24.2.9", "@vaadin/tabsheet": "24.2.9", "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.45", "axios": "1.7.2", - "electron": "31.0.1", + "electron": "31.0.2", "electron-builder": "24.13.3", "epml": "0.3.3", "file-saver": "2.0.5", @@ -619,9 +618,9 @@ } }, "node_modules/@electron/packager": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.2.tgz", - "integrity": "sha512-orjylavppgIh24qkNpWm2B/LQUpCS/YLOoKoU+eMK/hJgIhShLDsusPIQzgUGVwNCichu8/zPAGfdQZXHG0gtw==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.3.3.tgz", + "integrity": "sha512-hGXzwbUdxv49XvlYwlVPC6W6j6WaXUAzKkYyyTeiwdhxvHFMfQSEJxVHsQpqMFzZZ7wrr7iqiokOFZ/qkgEzUQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2970,9 +2969,9 @@ } }, "node_modules/@rollup/plugin-commonjs/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "license": "ISC", "dependencies": { @@ -2980,6 +2979,7 @@ "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { @@ -3823,9 +3823,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "version": "20.14.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", + "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5279,9 +5279,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001634", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001634.tgz", - "integrity": "sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA==", + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", "dev": true, "funding": [ { @@ -5588,9 +5588,9 @@ } }, "node_modules/config-file-ts/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "license": "ISC", "dependencies": { @@ -5598,6 +5598,7 @@ "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { @@ -6031,9 +6032,9 @@ } }, "node_modules/electron": { - "version": "31.0.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-31.0.1.tgz", - "integrity": "sha512-2eBcp4iqLkTsml6mMq+iqrS5u3kJ/2mpOLP7Mj7lo0uNK3OyfNqRS9z1ArsHjBF2/HV250Te/O9nKrwQRTX/+g==", + "version": "31.0.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-31.0.2.tgz", + "integrity": "sha512-55efQ5yfLN+AQHcFC00AXQqtxC3iAGaxX2GQ3EDbFJ0ca9GHNOdSXkcrdBElLleiDrR2hpXNkQxN1bDn0oxe6w==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6344,9 +6345,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.802", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.802.tgz", - "integrity": "sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA==", + "version": "1.4.810", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", + "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", "dev": true, "license": "ISC" }, @@ -6848,9 +6849,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.0.tgz", - "integrity": "sha512-CrWQNaEl1/6WeZoarcM9LHupTo3RpZO2Pdk1vktwzPiQTsJnAKJmm3TACKeG5UZbWDfaH2AbvYxzP96y0MT7fA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "license": "ISC", "dependencies": { @@ -7581,13 +7582,16 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8659,6 +8663,13 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parse-author": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", @@ -9649,9 +9660,9 @@ } }, "node_modules/sass": { - "version": "1.77.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.5.tgz", - "integrity": "sha512-oDfX1mukIlxacPdQqNb6mV2tVCrnE+P3nVYioy72V5tlk56CPNcO4TCuFcaCRKKfJ1M3lH95CleRS+dVKL2qMg==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "license": "MIT", "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -10418,9 +10429,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index 106d0e5f..1293e775 100644 --- a/package.json +++ b/package.json @@ -68,13 +68,13 @@ "prosemirror-state": "1.4.3", "prosemirror-transform": "1.9.0", "prosemirror-view": "1.33.8", - "sass": "1.77.5", + "sass": "1.77.6", "short-unique-id": "5.2.0", "xhr2": "0.2.1" }, "devDependencies": { "@babel/core": "7.24.7", - "@electron/packager": "18.3.2", + "@electron/packager": "18.3.3", "@material/mwc-button": "0.27.0", "@material/mwc-checkbox": "0.27.0", "@material/mwc-dialog": "0.27.0", @@ -122,13 +122,12 @@ "@vaadin/grid": "24.2.9", "@vaadin/icons": "24.2.9", "@vaadin/password-field": "24.2.9", - "@vaadin/scroller": "24.2.9", "@vaadin/tabs": "24.2.9", "@vaadin/tabsheet": "24.2.9", "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.45", "axios": "1.7.2", - "electron": "31.0.1", + "electron": "31.0.2", "electron-builder": "24.13.3", "epml": "0.3.3", "file-saver": "2.0.5", From 8c548add2ea6f5fafe478b62dd7648433e04519f Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:10:17 +0200 Subject: [PATCH 4/6] Downgrade nodejs --- README.md | 2 +- electron.js | 8 +++---- package-lock.json | 54 +++++++++++++++++++++++------------------------ package.json | 6 +++--- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index c700bf96..c2fe56e7 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Easiest way to install the lastest required packages on Linux is via nvm. ``` source ~/.profile ``` (For Debian based distro)
    ``` source ~/.bashrc ``` (For Fedora / CentOS)
    ``` nvm ls-remote ``` (Fetch list of available versions)
    -``` nvm install v20.14.0 ``` (LTS: Iron supported by Electron V31)
    +``` nvm install v18.20.3 ``` (Latest LTS: Hydrogen supported by Electron V31)
    ``` npm --location=global install npm@10.8.1 ```
    Adding via binary package mirror will only work if you have set the package path. You can do a node or java build via ports instead by downloading ports with portsnap fetch method. diff --git a/electron.js b/electron.js index ad6c3d72..87a59cf1 100644 --- a/electron.js +++ b/electron.js @@ -38,16 +38,16 @@ crashReporter.start({ }) if (myMemory > 16000000000) { - app.commandLine.appendSwitch('js-flags', '--max-old-space-size=8192') + app.commandLine.appendSwitch('js-flags', '--max-executable-size=192', '--max-old-space-size=8192', '--max-semi-space-size=2') log.info("Memory Size Is 16GB Using JS Memory Heap Size 8GB") } else if (myMemory > 12000000000) { - app.commandLine.appendSwitch('js-flags', '--max-old-space-size=6144') + app.commandLine.appendSwitch('js-flags', '--max-executable-size=192', '--max-old-space-size=6144', '--max-semi-space-size=2') log.info("Memory Size Is 12GB Using JS Memory Heap Size 6GB") } else if (myMemory > 7000000000) { - app.commandLine.appendSwitch('js-flags', '--max-old-space-size=4096') + app.commandLine.appendSwitch('js-flags', '--max-executable-size=192', '--max-old-space-size=4096', '--max-semi-space-size=2') log.info("Memory Size Is 8GB Using JS Memory Heap Size 4GB") } else { - app.commandLine.appendSwitch('js-flags', '--max-old-space-size=2048') + app.commandLine.appendSwitch('js-flags', '--max-executable-size=192', '--max-old-space-size=2048', '--max-semi-space-size=2') log.info("Memory Size Is 4GB Using JS Memory Heap Size 2GB") } diff --git a/package-lock.json b/package-lock.json index a11d7954..06c9fbb4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "prosemirror-gapcursor": "1.3.2", "prosemirror-history": "1.4.0", "prosemirror-keymap": "1.2.2", - "prosemirror-model": "1.21.1", + "prosemirror-model": "1.21.3", "prosemirror-schema-list": "1.4.0", "prosemirror-state": "1.4.3", "prosemirror-transform": "1.9.0", @@ -106,7 +106,7 @@ "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.45", "axios": "1.7.2", - "electron": "31.0.2", + "electron": "31.1.0", "electron-builder": "24.13.3", "epml": "0.3.3", "file-saver": "2.0.5", @@ -125,7 +125,7 @@ "shelljs": "0.8.5" }, "engines": { - "node": ">=20.14.0" + "node": ">=18.20.3" } }, "node_modules/@ampproject/remapping": { @@ -697,9 +697,9 @@ } }, "node_modules/@electron/universal/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -2993,9 +2993,9 @@ } }, "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -3823,9 +3823,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.14.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", - "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5279,9 +5279,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001638", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz", + "integrity": "sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==", "dev": true, "funding": [ { @@ -5612,9 +5612,9 @@ } }, "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -6032,9 +6032,9 @@ } }, "node_modules/electron": { - "version": "31.0.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-31.0.2.tgz", - "integrity": "sha512-55efQ5yfLN+AQHcFC00AXQqtxC3iAGaxX2GQ3EDbFJ0ca9GHNOdSXkcrdBElLleiDrR2hpXNkQxN1bDn0oxe6w==", + "version": "31.1.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-31.1.0.tgz", + "integrity": "sha512-TBOwqLxSxnx6+pH6GMri7R3JPH2AkuGJHfWZS0p1HsmN+Qr1T9b0IRJnnehSd/3NZAmAre4ft9Ljec7zjyKFJA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6345,9 +6345,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", + "version": "1.4.812", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.812.tgz", + "integrity": "sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==", "dev": true, "license": "ISC" }, @@ -9027,9 +9027,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.1.tgz", - "integrity": "sha512-IVBAuMqOfltTr7yPypwpfdGT+6rGAteVOw2FO6GEvCGGa1ZwxLseqC1Eax/EChDvG/xGquB2d/hLdgh3THpsYg==", + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.3.tgz", + "integrity": "sha512-nt2Xs/RNGepD9hrrkzXvtCm1mpGJoQfFSPktGa0BF/aav6XsnmVGZ9sTXNWRLupAz5SCLa3EyKlFeK7zJWROKg==", "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" diff --git a/package.json b/package.json index 1293e775..ed88c3ac 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "prosemirror-gapcursor": "1.3.2", "prosemirror-history": "1.4.0", "prosemirror-keymap": "1.2.2", - "prosemirror-model": "1.21.1", + "prosemirror-model": "1.21.3", "prosemirror-schema-list": "1.4.0", "prosemirror-state": "1.4.3", "prosemirror-transform": "1.9.0", @@ -127,7 +127,7 @@ "@vaadin/tooltip": "24.2.9", "@zip.js/zip.js": "2.7.45", "axios": "1.7.2", - "electron": "31.0.2", + "electron": "31.1.0", "electron-builder": "24.13.3", "epml": "0.3.3", "file-saver": "2.0.5", @@ -146,6 +146,6 @@ "shelljs": "0.8.5" }, "engines": { - "node": ">=20.14.0" + "node": ">=18.20.3" } } From ced56e0a1cfe880524ebb7b0854e39f3052404cb Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Thu, 27 Jun 2024 19:55:20 +0200 Subject: [PATCH 5/6] Added name and avatar to login section --- .../components/login-view/login-section.js | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/core/src/components/login-view/login-section.js b/core/src/components/login-view/login-section.js index 4c98f03e..faa7e20c 100644 --- a/core/src/components/login-view/login-section.js +++ b/core/src/components/login-view/login-section.js @@ -48,6 +48,8 @@ class LoginSection extends connect(store)(LitElement) { backedUpWalletJSON: { type: Object }, backedUpSeedLoading: { type: Boolean }, nodeConfig: { type: Object }, + names: { type: Array }, + namesAvatar: { type: String }, theme: { type: String, reflect: true } } } @@ -66,6 +68,8 @@ class LoginSection extends connect(store)(LitElement) { this.selectedWallet = {} this.loginErrorMessage = '' this.saveInBrowser = false + this.names = [] + this.namesAvatar = '' this.theme = localStorage.getItem('qortalTheme') ? localStorage.getItem('qortalTheme') : 'light' this.loginOptions = [ @@ -311,7 +315,7 @@ class LoginSection extends connect(store)(LitElement) {
    - account_circle + ${this.namesAvatar}
    ${this.selectedWallet.address0}
    @@ -417,9 +421,38 @@ class LoginSection extends connect(store)(LitElement) { return html`${translate("login.lp8")}` } + renderLoginAvatar(renderAddress) { + const avatarNode = store.getState().app.nodeConfig.knownNodes[store.getState().app.nodeConfig.node] + const avatarUrl = avatarNode.protocol + '://' + avatarNode.domain + ':' + avatarNode.port + const namesUrl = `${avatarUrl}/names/address/${renderAddress}?limit=0&reverse=true` + + this.namesAvatar = '' + + if (this.isEmptyArray(this.names)) { + fetch(namesUrl).then(response => { + return response.json() + }).then(data => { + this.names = data + if (this.isEmptyArray(this.names)) { + this.namesAvatar = html`account_circle` + } else { + const url = `${avatarUrl}/arbitrary/THUMBNAIL/${this.names[0].name}/qortal_avatar?async=true` + this.namesAvatar = html` + +
    + ${this.names[0].name} +
    + ` + } + }) + } + } + selectWallet(wallet) { this.selectedWallet = wallet this.selectedPage = 'unlockStored' + this.names = [] + this.renderLoginAvatar(this.selectedWallet.address0) } toDeleteWallet(deleteAddress) { @@ -668,6 +701,11 @@ class LoginSection extends connect(store)(LitElement) { this.selectedPage = this.hasStoredWallets ? 'storedWallet' : 'loginOptions' this.shadowRoot.querySelector('#deleteWalletDialog').close() } + + isEmptyArray(arr) { + if (!arr) { return true } + return arr.length === 0 + } } window.customElements.define('login-section', LoginSection) \ No newline at end of file From ac79619eafb6bc3acae9feb7df37ac74d2013f4a Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Fri, 28 Jun 2024 08:53:20 +0200 Subject: [PATCH 6/6] Added border around qr code --- plugins/plugins/core/components/plugins-css.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/plugins/core/components/plugins-css.js b/plugins/plugins/core/components/plugins-css.js index 11d70271..116dedaf 100644 --- a/plugins/plugins/core/components/plugins-css.js +++ b/plugins/plugins/core/components/plugins-css.js @@ -14203,8 +14203,10 @@ export const multiWalletStyles = css` } .qrcode-pos { - margin-top: -175px; + margin-top: -190px; + margin-right: 20px; float: right; + border: 1px solid var(--black); } .send-pos {