diff --git a/package.json b/package.json
index d4775027f54..e662ef919bc 100644
--- a/package.json
+++ b/package.json
@@ -3,12 +3,12 @@
"@datadog/browser-logs": "5.33.0",
"@datadog/browser-rum": "5.33.0",
"@emotion/react": "11.11.4",
- "@lexical/code": "0.20.2",
- "@lexical/history": "0.20.2",
- "@lexical/list": "0.20.2",
- "@lexical/markdown": "0.20.2",
- "@lexical/react": "0.20.2",
- "@lexical/rich-text": "0.20.2",
+ "@lexical/code": "0.21.0",
+ "@lexical/history": "0.21.0",
+ "@lexical/list": "0.21.0",
+ "@lexical/markdown": "0.21.0",
+ "@lexical/react": "0.21.0",
+ "@lexical/rich-text": "0.21.0",
"@mediapipe/tasks-vision": "0.10.20",
"@wireapp/avs": "10.0.4",
"@wireapp/avs-debugger": "0.0.7",
@@ -34,7 +34,7 @@
"kalium-backup": "./TEMP-crossplatform-backup",
"keyboardjs": "2.7.0",
"knockout": "3.5.1",
- "lexical": "0.20.2",
+ "lexical": "0.21.0",
"libsodium-wrappers": "0.7.15",
"linkify-it": "5.0.0",
"long": "5.2.3",
diff --git a/src/i18n/ar-SA.json b/src/i18n/ar-SA.json
index a5bd828b2ea..781713c9f5b 100644
--- a/src/i18n/ar-SA.json
+++ b/src/i18n/ar-SA.json
@@ -564,7 +564,7 @@
"conversationSomeone": "شخص ما",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "اليوم",
+ "conversationToday": "today",
"conversationTweetAuthor": " على تويتر",
"conversationUnableToDecrypt1": "رسالة من {user} لم تُستقبل.",
"conversationUnableToDecrypt2": "[highlight]{user}[/highlight]´s device identity changed. Undelivered message.",
diff --git a/src/i18n/cs-CZ.json b/src/i18n/cs-CZ.json
index 0a7b0508df5..e00e4a1307a 100644
--- a/src/i18n/cs-CZ.json
+++ b/src/i18n/cs-CZ.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Někdo",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "dnes",
+ "conversationToday": "today",
"conversationTweetAuthor": " na Twittru",
"conversationUnableToDecrypt1": "zpráva od uživatele {user} nebyla přijata.",
"conversationUnableToDecrypt2": "Identita uživatele {user} se změnila. Zpráva nedoručena.",
diff --git a/src/i18n/da-DK.json b/src/i18n/da-DK.json
index 7a2d2e43e15..973b6b72ea0 100644
--- a/src/i18n/da-DK.json
+++ b/src/i18n/da-DK.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Nogen",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "i dag",
+ "conversationToday": "today",
"conversationTweetAuthor": " på Twitter",
"conversationUnableToDecrypt1": "en besked fra {user} blev ikke modtaget.",
"conversationUnableToDecrypt2": "{user}’s enheds identitet er ændret. Uleveret besked.",
diff --git a/src/i18n/de-DE.json b/src/i18n/de-DE.json
index a18f91ea03e..be5fe54b9d8 100644
--- a/src/i18n/de-DE.json
+++ b/src/i18n/de-DE.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Jemand",
"conversationStartNewConversation": "Eine Gruppe erstellen",
"conversationTeamLeft": "[bold]{name}[/bold] wurde aus dem Team entfernt",
- "conversationToday": "Heute",
+ "conversationToday": "today",
"conversationTweetAuthor": " auf Twitter",
"conversationUnableToDecrypt1": "Eine Nachricht von [highlight]{user}[/highlight] wurde nicht empfangen.",
"conversationUnableToDecrypt2": "[highlight]{users}s[/highlight] Geräte-Identität hat sich geändert. Nachricht kann nicht entschlüsselt werden.",
diff --git a/src/i18n/el-GR.json b/src/i18n/el-GR.json
index 6196b9e20dd..e645ab603cb 100644
--- a/src/i18n/el-GR.json
+++ b/src/i18n/el-GR.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Κάποιος",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "σήμερα",
+ "conversationToday": "today",
"conversationTweetAuthor": " στο Twitter",
"conversationUnableToDecrypt1": "ένα μήνυμα από τον {user} δεν παρελήφθη.",
"conversationUnableToDecrypt2": "{user}´ς η ταυτότητα συσκευής άλλαξε. Ανεπίδοτο μήνυμα.",
diff --git a/src/i18n/es-ES.json b/src/i18n/es-ES.json
index 9c40195e504..60c7659fe4c 100644
--- a/src/i18n/es-ES.json
+++ b/src/i18n/es-ES.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Alguien",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] fue removido del equipo",
- "conversationToday": "hoy",
+ "conversationToday": "today",
"conversationTweetAuthor": " en Twitter",
"conversationUnableToDecrypt1": "un mensaje de {user} no se ha recibido.",
"conversationUnableToDecrypt2": "La identidad del dispositivo de {user} ha cambiado. Mensaje no entregado.",
diff --git a/src/i18n/et-EE.json b/src/i18n/et-EE.json
index e7b635a74b6..996c156c55b 100644
--- a/src/i18n/et-EE.json
+++ b/src/i18n/et-EE.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Keegi",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] eemaldati meeskonnast",
- "conversationToday": "täna",
+ "conversationToday": "today",
"conversationTweetAuthor": " Twitteris",
"conversationUnableToDecrypt1": "Sõnumit kasutajalt [highlight]{user}[/highlight] ei võetud vastu.",
"conversationUnableToDecrypt2": "[highlight]{user}[/highlight] seadme identiteet muutus. Sõnumit ei saadetud.",
diff --git a/src/i18n/fa-IR.json b/src/i18n/fa-IR.json
index 31a61674f35..ff9d9cd1eda 100644
--- a/src/i18n/fa-IR.json
+++ b/src/i18n/fa-IR.json
@@ -564,7 +564,7 @@
"conversationSomeone": "شخصی",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "امروز",
+ "conversationToday": "today",
"conversationTweetAuthor": " در توییتر",
"conversationUnableToDecrypt1": "یک پیام از {user} دریافت نشد.",
"conversationUnableToDecrypt2": "هویت دستگاه {user} تغییر یافته است. پیام تحویل داده نشده است.",
diff --git a/src/i18n/fi-FI.json b/src/i18n/fi-FI.json
index 70e7a25e8a4..6a9bbda4fe0 100644
--- a/src/i18n/fi-FI.json
+++ b/src/i18n/fi-FI.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Joku",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "tänään",
+ "conversationToday": "today",
"conversationTweetAuthor": " Twitterissä",
"conversationUnableToDecrypt1": "Käyttäjän {user} viesti ei tullut perille.",
"conversationUnableToDecrypt2": "Käyttäjän {user} laitteen identiteetti muuttui. Viestiä ei toimitettu.",
diff --git a/src/i18n/fr-FR.json b/src/i18n/fr-FR.json
index 5d877a73e0d..9fa45029329 100644
--- a/src/i18n/fr-FR.json
+++ b/src/i18n/fr-FR.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Quelqu’un",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] a été retiré de l’équipe",
- "conversationToday": "aujourd’hui",
+ "conversationToday": "today",
"conversationTweetAuthor": " via Twitter",
"conversationUnableToDecrypt1": "Un message de [highlight]{user}[/highlight] n’a pas été reçu.",
"conversationUnableToDecrypt2": "L’identité de l’appareil de {user} a changé. Message non délivré.",
diff --git a/src/i18n/hr-HR.json b/src/i18n/hr-HR.json
index bada937c301..78ac0286219 100644
--- a/src/i18n/hr-HR.json
+++ b/src/i18n/hr-HR.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Netko",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] je uklonjen iz tima",
- "conversationToday": "danas",
+ "conversationToday": "today",
"conversationTweetAuthor": " na Twitteru",
"conversationUnableToDecrypt1": "Poruka od [highlight]{user}[/highlight] nije zaprimljena.",
"conversationUnableToDecrypt2": "Identitet [highlight]{user}[/highlight] uređaja je promjenjen. Poruka nije dostavljena.",
diff --git a/src/i18n/hu-HU.json b/src/i18n/hu-HU.json
index 75e9db639b7..ad3d9b23e21 100644
--- a/src/i18n/hu-HU.json
+++ b/src/i18n/hu-HU.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Valaki",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] eltávolítottuk a csapatból",
- "conversationToday": "ma",
+ "conversationToday": "today",
"conversationTweetAuthor": " Twitteren",
"conversationUnableToDecrypt1": "Nem kaptál meg egy üzenetet tőle: {user}.",
"conversationUnableToDecrypt2": "{user} eszközének azonosítója megváltozott. Kézbesítetlen üzenet.",
diff --git a/src/i18n/id-ID.json b/src/i18n/id-ID.json
index bdf8b57684b..6781ee4bd37 100644
--- a/src/i18n/id-ID.json
+++ b/src/i18n/id-ID.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Seseorang",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "hari ini",
+ "conversationToday": "today",
"conversationTweetAuthor": " di Twitter",
"conversationUnableToDecrypt1": "pesan dari {user} tidak diterima",
"conversationUnableToDecrypt2": "Identitas perangkat {user} berubah. Pesan tidak terkirim",
diff --git a/src/i18n/it-IT.json b/src/i18n/it-IT.json
index 7eff56cba81..8f6dd80636d 100644
--- a/src/i18n/it-IT.json
+++ b/src/i18n/it-IT.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Qualcuno",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "oggi",
+ "conversationToday": "today",
"conversationTweetAuthor": " su Twitter",
"conversationUnableToDecrypt1": "un messaggio da {user} non è stato ricevuto.",
"conversationUnableToDecrypt2": "L’identità dei dispositivi {user}´s è cambiata. Messaggi non consegnati.",
diff --git a/src/i18n/ja-JP.json b/src/i18n/ja-JP.json
index 0f0b2e0f01a..254967da660 100644
--- a/src/i18n/ja-JP.json
+++ b/src/i18n/ja-JP.json
@@ -564,7 +564,7 @@
"conversationSomeone": "誰か",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] はチームから削除されました",
- "conversationToday": "今日",
+ "conversationToday": "today",
"conversationTweetAuthor": " はツイッターにいます",
"conversationUnableToDecrypt1": "{user} からのメッセージが受信されませんでした",
"conversationUnableToDecrypt2": "{user} のデバイスIDが変更されました。メッセージは配信されません。",
diff --git a/src/i18n/lt-LT.json b/src/i18n/lt-LT.json
index 7a3fa54b702..0738478ef5a 100644
--- a/src/i18n/lt-LT.json
+++ b/src/i18n/lt-LT.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Kažkas",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] buvo pašalintas (-a) iš komandos",
- "conversationToday": "šiandien",
+ "conversationToday": "today",
"conversationTweetAuthor": " socialiniame tinkle Twitter",
"conversationUnableToDecrypt1": "žinutė nuo {user} nebuvo gauta.",
"conversationUnableToDecrypt2": "Pasikeitė {user} įrenginio tapatybė. Žinutė nepristatyta.",
diff --git a/src/i18n/nl-NL.json b/src/i18n/nl-NL.json
index 2e9501d61ea..cd9b54e7006 100644
--- a/src/i18n/nl-NL.json
+++ b/src/i18n/nl-NL.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Iemand",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "vandaag",
+ "conversationToday": "today",
"conversationTweetAuthor": " op Twitter",
"conversationUnableToDecrypt1": "een bericht van {user} is niet ontvangen.",
"conversationUnableToDecrypt2": "{user}’s apparaatidentiteit is veranderd. Het bericht is niet afgeleverd.",
diff --git a/src/i18n/no-NO.json b/src/i18n/no-NO.json
index 20ea8248491..fbae2702fd0 100644
--- a/src/i18n/no-NO.json
+++ b/src/i18n/no-NO.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Noen",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "i dag",
+ "conversationToday": "today",
"conversationTweetAuthor": " på Twitter",
"conversationUnableToDecrypt1": "A message from [highlight]{user}[/highlight] was not received.",
"conversationUnableToDecrypt2": "[highlight]{user}[/highlight]´s device identity changed. Undelivered message.",
diff --git a/src/i18n/pl-PL.json b/src/i18n/pl-PL.json
index f267d942bc3..38aa0f058a6 100644
--- a/src/i18n/pl-PL.json
+++ b/src/i18n/pl-PL.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Ktoś",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "dzisiaj",
+ "conversationToday": "today",
"conversationTweetAuthor": " na Twitterze",
"conversationUnableToDecrypt1": "wiadomość od {user} nie została dostarczona.",
"conversationUnableToDecrypt2": "Użytkownik {user} zmienił urządzenie. Wiadomość nie została dostarczona.",
diff --git a/src/i18n/pt-BR.json b/src/i18n/pt-BR.json
index ee687c28fdf..c64a27f4872 100644
--- a/src/i18n/pt-BR.json
+++ b/src/i18n/pt-BR.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Alguém",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] foi removido da equipe",
- "conversationToday": "hoje",
+ "conversationToday": "today",
"conversationTweetAuthor": " no Twitter",
"conversationUnableToDecrypt1": "Uma mensagem de [highlight]{user}[/highlight] não foi recebida.",
"conversationUnableToDecrypt2": "A identidade do dispositivo de [highlight]{user}[/highlight] foi alterada. Mensagem não entregue.",
diff --git a/src/i18n/pt-PT.json b/src/i18n/pt-PT.json
index edde67f54d6..3872bb2c161 100644
--- a/src/i18n/pt-PT.json
+++ b/src/i18n/pt-PT.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Alguém",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "hoje",
+ "conversationToday": "today",
"conversationTweetAuthor": " no Twitter",
"conversationUnableToDecrypt1": "não foi recebida uma mensagem de {user}.",
"conversationUnableToDecrypt2": "A identidade do dispositivo de {user} foi alterada. A mensagem não foi entregue.",
diff --git a/src/i18n/ro-RO.json b/src/i18n/ro-RO.json
index 5ff2e7d4077..dbf46dd3ffd 100644
--- a/src/i18n/ro-RO.json
+++ b/src/i18n/ro-RO.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Cineva",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "azi",
+ "conversationToday": "today",
"conversationTweetAuthor": " pe Twitter",
"conversationUnableToDecrypt1": "ai primit un mesaj de la {user}.",
"conversationUnableToDecrypt2": "identitatea dispozitivului lui {user} s-a schimbat. Mesajul nu a fost livrat.",
diff --git a/src/i18n/ru-RU.json b/src/i18n/ru-RU.json
index bc757037ccb..fecd409665a 100644
--- a/src/i18n/ru-RU.json
+++ b/src/i18n/ru-RU.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Кто-то",
"conversationStartNewConversation": "Создать группу",
"conversationTeamLeft": "[bold]{name}[/bold] был удален из команды",
- "conversationToday": "сегодня",
+ "conversationToday": "today",
"conversationTweetAuthor": " в Twitter",
"conversationUnableToDecrypt1": "Сообщение от [highlight]{user}[/highlight] не было получено.",
"conversationUnableToDecrypt2": "Идентификатор устройства [highlight]{user}[/highlight] изменился. Сообщение не доставлено.",
diff --git a/src/i18n/si-LK.json b/src/i18n/si-LK.json
index b8d64a79849..2f6ffa2c88d 100644
--- a/src/i18n/si-LK.json
+++ b/src/i18n/si-LK.json
@@ -564,7 +564,7 @@
"conversationSomeone": "යමෙක්",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] කණ්ඩායමෙන් ඉවත් කර ඇත",
- "conversationToday": "අද",
+ "conversationToday": "today",
"conversationTweetAuthor": "ට්විටර් හි",
"conversationUnableToDecrypt1": "[highlight]{user}[/highlight] වෙතින් පණිවිඩයක් ලැබී නැත.",
"conversationUnableToDecrypt2": "[highlight]{user}[/highlight]ගේ උපාංගයේ අනන්යතාවය වෙනස් විය. බාර නොදුන් පණිවිඩයකි.",
diff --git a/src/i18n/sk-SK.json b/src/i18n/sk-SK.json
index f2069f4812b..8584e746739 100644
--- a/src/i18n/sk-SK.json
+++ b/src/i18n/sk-SK.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Niekto",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "dnes",
+ "conversationToday": "today",
"conversationTweetAuthor": " na Twitteri",
"conversationUnableToDecrypt1": "správa od {user} nebola prijatá.",
"conversationUnableToDecrypt2": "{user}´s zariadenie sa zmenilo. Nedoručená správa.",
diff --git a/src/i18n/sl-SI.json b/src/i18n/sl-SI.json
index b5242683389..4f346b1d8fe 100644
--- a/src/i18n/sl-SI.json
+++ b/src/i18n/sl-SI.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Nekdo",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "danes",
+ "conversationToday": "today",
"conversationTweetAuthor": " na Twitterju",
"conversationUnableToDecrypt1": "sporočilo od {user} ni bilo prejeto.",
"conversationUnableToDecrypt2": "Identita naprave od {user} je bila spremenjena. Sporočilo ni dostavljeno.",
diff --git a/src/i18n/sr-SP.json b/src/i18n/sr-SP.json
index c2aa9d324ee..64fe4cbc4ce 100644
--- a/src/i18n/sr-SP.json
+++ b/src/i18n/sr-SP.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Неко",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] је уклоњен из тима",
- "conversationToday": "данас",
+ "conversationToday": "today",
"conversationTweetAuthor": " на Твитеру",
"conversationUnableToDecrypt1": "Порука од [highlight]{user}[/highlight] није примљена.",
"conversationUnableToDecrypt2": "[highlight]{user}[/highlight]´s промењен је идентитет уређаја Неиспоручена порука.",
diff --git a/src/i18n/sv-SE.json b/src/i18n/sv-SE.json
index 3668e973f36..7c933a60c19 100644
--- a/src/i18n/sv-SE.json
+++ b/src/i18n/sv-SE.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Någon",
"conversationStartNewConversation": "Skapa en grupp",
"conversationTeamLeft": "[bold]{name}[/bold] togs bort från teamet",
- "conversationToday": "idag",
+ "conversationToday": "today",
"conversationTweetAuthor": " på Twitter",
"conversationUnableToDecrypt1": "Ett meddelande från {user} tog inte emot.",
"conversationUnableToDecrypt2": "{user}\"s enhetsidentitet ändrades. Icke levererat meddelande.",
diff --git a/src/i18n/tr-TR.json b/src/i18n/tr-TR.json
index 00cff908056..edd6ca1147e 100644
--- a/src/i18n/tr-TR.json
+++ b/src/i18n/tr-TR.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Birisi",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] ekipten çıkarıldı",
- "conversationToday": "bugün",
+ "conversationToday": "today",
"conversationTweetAuthor": " Twitter’da",
"conversationUnableToDecrypt1": "{user}’den gelen bir mesaj alınamadı.",
"conversationUnableToDecrypt2": "{user}’nin cihaz kimliği değişti. Teslim edilmemiş mesaj.",
diff --git a/src/i18n/uk-UA.json b/src/i18n/uk-UA.json
index 70d753d486a..ae8eb286494 100644
--- a/src/i18n/uk-UA.json
+++ b/src/i18n/uk-UA.json
@@ -564,7 +564,7 @@
"conversationSomeone": "Хтось",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] був(-ла) видалений(-а) з команди",
- "conversationToday": "сьогодні",
+ "conversationToday": "today",
"conversationTweetAuthor": " в Twitter",
"conversationUnableToDecrypt1": "Повідомлення від [highlight]{user}[/highlight] не отримане.",
"conversationUnableToDecrypt2": "Ідентифікатор пристрою [highlight]{user}[/highlight] змінився. Повідомлення не доставлене.",
diff --git a/src/i18n/zh-CN.json b/src/i18n/zh-CN.json
index 957da0ffa22..aa0ac75c0f0 100644
--- a/src/i18n/zh-CN.json
+++ b/src/i18n/zh-CN.json
@@ -564,7 +564,7 @@
"conversationSomeone": "某人",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] 已从团队删除",
- "conversationToday": "今天",
+ "conversationToday": "today",
"conversationTweetAuthor": " 在 Twitter 上",
"conversationUnableToDecrypt1": "一条来自 {user} 的消息未被接收。",
"conversationUnableToDecrypt2": "{user} 的设备指纹已改变。该消息未送达。",
diff --git a/src/i18n/zh-TW.json b/src/i18n/zh-TW.json
index c367cd1143e..8c3af5e3a8c 100644
--- a/src/i18n/zh-TW.json
+++ b/src/i18n/zh-TW.json
@@ -564,7 +564,7 @@
"conversationSomeone": "有人",
"conversationStartNewConversation": "Create a Group",
"conversationTeamLeft": "[bold]{name}[/bold] was removed from the team",
- "conversationToday": "今天",
+ "conversationToday": "today",
"conversationTweetAuthor": " 在推特上",
"conversationUnableToDecrypt1": "有一個來自 {user} 的訊息未被接收。",
"conversationUnableToDecrypt2": "{user} 的設備識別碼改變了,訊息無法送達。",
diff --git a/src/script/Config.ts b/src/script/Config.ts
index 7a2d9b25c8b..bb1bf7c232e 100644
--- a/src/script/Config.ts
+++ b/src/script/Config.ts
@@ -78,7 +78,7 @@ const config = {
MIN_TEAM_CREATION_SUPPORTED_API_VERSION: 7,
/** Image MIME types */
- ALLOWED_IMAGE_TYPES: ['image/bmp', 'image/gif', 'image/jpeg', 'image/jpg', 'image/png'],
+ ALLOWED_IMAGE_TYPES: ['image/bmp', 'image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'],
/** Which min and max version of the backend api do we support */
SUPPORTED_API_RANGE: [1, env.ENABLE_DEV_BACKEND_API ? Infinity : 7],
diff --git a/src/script/client/ClientEntity.ts b/src/script/client/ClientEntity.ts
index b95b4fb2865..f36eb02425d 100644
--- a/src/script/client/ClientEntity.ts
+++ b/src/script/client/ClientEntity.ts
@@ -30,9 +30,9 @@ import {ClientRecord} from '../storage';
export const MLSPublicKeys = {
ed25519: 'ED25519',
ed448: 'ED448',
- ecdsa_secp521r1_sha512: 'EDCSA_SECP521R1_SHA512',
- ecdsa_secp384r1_sha384: 'EDCSA_SECP384R1_SHA384',
- ecdsa_secp256r1_sha256: 'EDCSA_SECP256R1_SHA256',
+ ecdsa_secp521r1_sha512: 'P521',
+ ecdsa_secp384r1_sha384: 'P384',
+ ecdsa_secp256r1_sha256: 'P256',
} as const;
export const isKnownSignature = (signature: unknown): signature is keyof typeof MLSPublicKeys =>
diff --git a/src/script/components/InputBar/InputBar.tsx b/src/script/components/InputBar/InputBar.tsx
index ecd73797558..f56988e9294 100644
--- a/src/script/components/InputBar/InputBar.tsx
+++ b/src/script/components/InputBar/InputBar.tsx
@@ -562,7 +562,7 @@ export const InputBar = ({
const enableSending = textValue.length > 0;
- const showAvatar = messageFormatButtonsEnabled || !!textValue.length;
+ const showAvatar = !!textValue.length;
return (
@@ -627,14 +627,20 @@ export const InputBar = ({
onSend={handleSendMessage}
onBlur={() => isTypingRef.current && conversationRepository.sendTypingStop(conversation)}
>
-
+
)}
>
diff --git a/src/script/components/InputBar/hooks/useEmojiPicker/useEmojiPicker.ts b/src/script/components/InputBar/hooks/useEmojiPicker/useEmojiPicker.ts
index c6c002634e0..94e79612730 100644
--- a/src/script/components/InputBar/hooks/useEmojiPicker/useEmojiPicker.ts
+++ b/src/script/components/InputBar/hooks/useEmojiPicker/useEmojiPicker.ts
@@ -26,6 +26,10 @@ interface EmojiPickerParams {
onEmojiPicked: (emoji: string) => void;
}
+const TRIGGER_WIDTH = 40;
+const TRIGGER_HEIGHT = 32;
+const Y_OFFSET = 8;
+
export const useEmojiPicker = ({wrapperRef, onEmojiPicked}: EmojiPickerParams) => {
const [open, setOpen] = useState(false);
@@ -43,7 +47,7 @@ export const useEmojiPicker = ({wrapperRef, onEmojiPicked}: EmojiPickerParams) =
const handleToggle = (event: MouseEvent
) => {
const rect = event.currentTarget.getBoundingClientRect();
// eslint-disable-next-line id-length
- emojiPickerPosition.current = {x: rect.x, y: rect.y};
+ emojiPickerPosition.current = {x: rect.x + TRIGGER_WIDTH, y: rect.y - TRIGGER_HEIGHT - Y_OFFSET};
setOpen(prev => !prev);
};
diff --git a/src/script/components/RichTextEditor/RichTextEditor.tsx b/src/script/components/RichTextEditor/RichTextEditor.tsx
index 297168534cf..a6ce1cf8909 100644
--- a/src/script/components/RichTextEditor/RichTextEditor.tsx
+++ b/src/script/components/RichTextEditor/RichTextEditor.tsx
@@ -22,7 +22,7 @@ import {ReactElement, useRef} from 'react';
import {CodeHighlightNode, CodeNode} from '@lexical/code';
import {LinkNode} from '@lexical/link';
import {ListItemNode, ListNode} from '@lexical/list';
-import {$convertToMarkdownString, TRANSFORMERS} from '@lexical/markdown';
+import {$convertToMarkdownString} from '@lexical/markdown';
import {ClearEditorPlugin} from '@lexical/react/LexicalClearEditorPlugin';
import {InitialConfigType, LexicalComposer} from '@lexical/react/LexicalComposer';
import {ContentEditable} from '@lexical/react/LexicalContentEditable';
@@ -53,9 +53,12 @@ import {EmojiPickerPlugin} from './plugins/EmojiPickerPlugin';
import {GlobalEventsPlugin} from './plugins/GlobalEventsPlugin';
import {HistoryPlugin} from './plugins/HistoryPlugin';
import {findAndTransformEmoji, ReplaceEmojiPlugin} from './plugins/InlineEmojiReplacementPlugin';
+import {ListItemTabIndentationPlugin} from './plugins/ListIndentationPlugin/ListIndentationPlugin';
+import {ListMaxIndentLevelPlugin} from './plugins/ListMaxIndentLevelPlugin/ListMaxIndentLevelPlugin';
import {MentionsPlugin} from './plugins/MentionsPlugin';
import {ReplaceCarriageReturnPlugin} from './plugins/ReplaceCarriageReturnPlugin/ReplaceCarriageReturnPlugin';
import {SendPlugin} from './plugins/SendPlugin';
+import {markdownTransformers} from './utils/markdownTransformers';
import {MentionEntity} from '../../message/MentionEntity';
@@ -76,8 +79,13 @@ const theme = {
code: 'editor-inline-code',
},
list: {
- ul: 'editor-list editor-list--unordered',
- ol: 'editor-list editor-list--ordered',
+ ul: 'editor-list editor-list-unordered',
+ ol: 'editor-list editor-list-ordered',
+ listitem: 'editor-list__item',
+ nested: {
+ listitem: 'editor-list__item--nested',
+ },
+ olDepth: ['editor-list-ordered--1', 'editor-list-ordered--2', 'editor-list-ordered--3'],
},
heading: {
h1: 'editor-heading editor-heading--1',
@@ -221,7 +229,7 @@ export const RichTextEditor = ({
return;
}
- const markdown = $convertToMarkdownString(TRANSFORMERS);
+ const markdown = $convertToMarkdownString(markdownTransformers);
onUpdate({
text: replaceEmojis ? findAndTransformEmoji(markdown) : markdown,
@@ -244,14 +252,15 @@ export const RichTextEditor = ({
/>
-
+
+
{replaceEmojis && }
-
+
}
@@ -276,7 +285,11 @@ export const RichTextEditor = ({
/>
- {showFormatToolbar && }
+ {showFormatToolbar && (
+
+
+
+ )}
{children}
);
diff --git a/src/script/components/RichTextEditor/components/FormatToolbar/FormatToolbar.styles.ts b/src/script/components/RichTextEditor/components/FormatToolbar/FormatToolbar.styles.ts
index d090a351563..686272aaec4 100644
--- a/src/script/components/RichTextEditor/components/FormatToolbar/FormatToolbar.styles.ts
+++ b/src/script/components/RichTextEditor/components/FormatToolbar/FormatToolbar.styles.ts
@@ -22,6 +22,4 @@ import {CSSObject} from '@emotion/react';
export const wrapperStyles: CSSObject = {
display: 'flex',
alignItems: 'center',
- margin: '8px 0 8px auto',
- gridArea: 'toolbar',
};
diff --git a/src/script/components/RichTextEditor/components/FormatToolbar/FormatToolbar.tsx b/src/script/components/RichTextEditor/components/FormatToolbar/FormatToolbar.tsx
index 78cc63660d5..d1b9f1b90ae 100644
--- a/src/script/components/RichTextEditor/components/FormatToolbar/FormatToolbar.tsx
+++ b/src/script/components/RichTextEditor/components/FormatToolbar/FormatToolbar.tsx
@@ -77,18 +77,18 @@ export const FormatToolbar = () => {
active={activeFormats.includes('strikethrough')}
onClick={() => formatText('strikethrough')}
/>
- toggleList('unordered')}
- />
toggleList('ordered')}
/>
+ toggleList('unordered')}
+ />
{
const anchorNode = selection.anchor.getNode();
const isHeading = isNodeHeading(anchorNode);
- if (!isHeading) {
- editor.dispatchCommand(INSERT_HEADING_COMMAND, {});
+ if (isHeading) {
+ $setBlocksType(selection, () => $createParagraphNode());
return;
}
- const paragraphNode = $createParagraphNode();
- const headingNode = anchorNode.getParent();
-
- if (!headingNode) {
- return;
- }
-
- headingNode.replace(paragraphNode);
- paragraphNode.append(...headingNode.getChildren());
+ $setBlocksType(selection, () => $createHeadingNode('h1'));
});
};
diff --git a/src/script/components/RichTextEditor/components/SendMessageButton/SendMessageButton.tsx b/src/script/components/RichTextEditor/components/SendMessageButton/SendMessageButton.tsx
index c4b3776e5ec..62293db3082 100644
--- a/src/script/components/RichTextEditor/components/SendMessageButton/SendMessageButton.tsx
+++ b/src/script/components/RichTextEditor/components/SendMessageButton/SendMessageButton.tsx
@@ -25,13 +25,14 @@ import {t} from 'Util/LocalizerUtil';
interface SendMessageButtonProps {
disabled?: boolean;
onSend: () => void;
+ className?: string;
}
-export const SendMessageButton = ({disabled, onSend}: SendMessageButtonProps) => {
+export const SendMessageButton = ({disabled, onSend, className}: SendMessageButtonProps) => {
return (