diff --git a/_locales/ar/messages.json b/_locales/ar/messages.json index a38d3d4c1a..4f9c0f86cd 100644 --- a/_locales/ar/messages.json +++ b/_locales/ar/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "حذف المحادثة بصفة نهائية ؟", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/bg/messages.json b/_locales/bg/messages.json index 6823d514c1..7aedf22820 100644 --- a/_locales/bg/messages.json +++ b/_locales/bg/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Создать Аккаунт", "signIn": "Войти", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Познакомьтесь со своим Session ID", "allUsersAreRandomly...": "Ваш Session ID - это уникальный адрес, который другие пользователи могут использовать для связи с вами при помощи Session. Поскольку ваш Session ID никак не связан с вашей настоящей личностью, он по определению является полностью анонимным и конфиденциальным.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Восстановите свой аккаунт", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "Новый Диалог", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/ca/messages.json b/_locales/ca/messages.json index 3403b5e2e3..1ffd8f29ca 100644 --- a/_locales/ca/messages.json +++ b/_locales/ca/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Només el creador del grup pot eliminar usuaris", "createAccount": "Create Account", "signIn": "Iniciar sessió", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Saluda al teu Session ID", "allUsersAreRandomly...": "El teu Session ID és l'adreça única que els usuaris poden utilitzar per contactar-te a Session. Sense connexió amb la teva identitat real, el teu Session ID és totalment anònim i privat per disseny.", "getStarted": "Comencem!", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restableix el teu compte", "or": "o bé", "ByUsingThisService...": "En utilitzar aquest servei, accepteu les nostres Condicions del servei i Política de privadesa ", - "beginYourSession": "Comenceu
la vostra
sessió.", + "beginYourSession": "Comenceu la vostra sessió.", "welcomeToYourSession": "Benvingut a Session", "newSession": "Nova sessió", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/cs/messages.json b/_locales/cs/messages.json index 35c45956b1..88fa121f81 100644 --- a/_locales/cs/messages.json +++ b/_locales/cs/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Trvale smazat tuto konverzaci?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/da/messages.json b/_locales/da/messages.json index 4a9fd09561..218e4592fc 100644 --- a/_locales/da/messages.json +++ b/_locales/da/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Slet samtale permanent?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Miniatur af billede fra citeret besked", "imageAttachmentAlt": "Billede vedhæftet til beskeden", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/de/messages.json b/_locales/de/messages.json index 0b91c4b87c..3a53e52986 100644 --- a/_locales/de/messages.json +++ b/_locales/de/messages.json @@ -103,7 +103,7 @@ "photo": "Foto", "cannotUpdate": "Kann nicht aktualisiert werden", "cannotUpdateDetail": "Session Desktop konnte nicht aktualisiert werden, aber es ist eine neue Version verfügbar. Bitte gehen Sie auf https://getsession.org/ und installieren Sie die neue Version manuell; anschließend wenden Sie sich bitte entweder an den Support oder melden Sie das Problem.", - "ok": "Ok", + "ok": "OK", "cancel": "Abbrechen", "close": "Schließen", "continue": "Weiter", @@ -138,7 +138,7 @@ "videoAttachmentAlt": "Vorschaubild für Videoanhang", "lightboxImageAlt": "In Unterhaltung gesendetes Bild", "imageCaptionIconAlt": "Symbol, das auf eine Beschriftung des Bildes hinweist", - "addACaption": "Beschriftung hinzufügen …", + "addACaption": "Beschriftung hinzufügen...", "copy": "Kopieren", "copySessionID": "Session-ID kopieren", "copyOpenGroupURL": "Gruppen-URL kopieren", @@ -159,10 +159,10 @@ "notifications": "Benachrichtigungen", "readReceiptSettingDescription": "Lesebestätigungen aktivieren", "readReceiptSettingTitle": "Lesebestätigungen", - "typingIndicatorsSettingDescription": "sehen und teilen, wann Nachrichten eingetippt werden", + "typingIndicatorsSettingDescription": "Sehen und teilen, wann Nachrichten eingetippt werden.", "typingIndicatorsSettingTitle": "Tipp-Indikatoren", "zoomFactorSettingTitle": "Zoomstufe", - "notificationSettingsDialog": "Beim Eingang von Nachrichten Benachrichtigungen mit folgendem Inhalt anzeigen:", + "notificationSettingsDialog": "Beim Eingang von Nachrichten Benachrichtigungen mit folgendem Inhalt anzeigen...", "disableNotifications": "Stummschalten", "nameAndMessage": "Kontaktname und Nachricht", "noNameOrMessage": "Weder Name noch Nachricht", @@ -183,9 +183,9 @@ "messageBodyMissing": "Bitte geben Sie einen Nachrichtentext ein.", "unblockToSend": "Gib die Blockierung dieses Kontakts frei, um eine Nachricht zu senden.", "unblockGroupToSend": "Gib die Blockierung dieser Gruppe frei, um eine Nachricht zu senden.", - "youChangedTheTimer": "Du hast die Zeit für verschwindende Nachrichten auf $time$ festgelegt.", + "youChangedTheTimer": "Du hast die Zeit für verschwindende Nachrichten auf $time$ festgelegt", "timerSetOnSync": "Zeitbegrenzung für verschwindende Nachrichten wurde auf $time$ aktualisiert", - "theyChangedTheTimer": "$name$ hat die Zeit für verschwindende Nachrichten auf $time$ festgelegt.", + "theyChangedTheTimer": "$name$ hat die Zeit für verschwindende Nachrichten auf $time$ festgelegt", "timerOption_0_seconds": "Aus", "timerOption_5_seconds": "5 Sekunden", "timerOption_10_seconds": "10 Sekunden", @@ -222,10 +222,10 @@ "noteToSelf": "Notiz an mich", "hideMenuBarTitle": "Menüleiste ausblenden", "hideMenuBarDescription": "Sichtbarkeit des Menüleiste umschalten", - "startConversation": "Neue Unterhaltung beginnen …", + "startConversation": "Neue Unterhaltung Beginnen", "invalidNumberError": "Ungültige Rufnummer", "failedResolveOns": "Fehler beim Auflösen des ONS-Namens", - "successUnlinked": "Ihr Gerät wurde erfolgreich getrennt.", + "successUnlinked": "Ihr Gerät wurde erfolgreich getrennt", "autoUpdateSettingTitle": "Automatische Aktualisierung", "autoUpdateSettingDescription": "Automatically check for updates on launch", "autoUpdateNewVersionTitle": "Aktualisierung für Session verfügbar", @@ -265,14 +265,14 @@ "leaveGroupConfirmationAdmin": "Da du Admin dieser Gruppe bist wird sie für alle derzeitigen Mitglieder gelöscht. Bist du dir sicher das du die Gruppe verlassen möchtest?", "cannotRemoveCreatorFromGroup": "Dieser Nutzer kann nicht entfernt werden", "cannotRemoveCreatorFromGroupDesc": "Du kannst diesen Nutzer nicht entfernen da er der Ersteller der Gruppe ist.", - "noContactsForGroup": "Sie haben noch keine Kontakte.", + "noContactsForGroup": "Sie haben noch keine Kontakte", "failedToAddAsModerator": "Benutzer als Moderator hinzufügen fehlgeschlagen", "failedToRemoveFromModerator": "Benutzer von Moderatorenliste entfernen fehlgeschlagen", "copyMessage": "Nachrichtentext kopieren", "selectMessage": "Nachricht auswählen", "editGroup": "Gruppe bearbeiten", "editGroupName": "Gruppe bearbeiten", - "updateGroupDialogTitle": "$name$ wird aktualisiert …", + "updateGroupDialogTitle": "$name$ wird aktualisiert...", "showRecoveryPhrase": "Wiederherstellungssatz", "yourSessionID": "Ihre Session ID", "setAccountPasswordTitle": "Accountpasswort festlegen", @@ -315,7 +315,7 @@ "connectToServerSuccess": "Erfolgreich zu offener Gruppe verbunden", "setPasswordFail": "Passwort setzen fehlgeschlagen", "passwordLengthError": "Das Passwort muss zwischen 6 und 64 Zeichen lang sein", - "passwordTypeError": "Password must be a string", + "passwordTypeError": "Das Passwort muss eine Zeichenkette sein", "passwordCharacterError": "Das Passwort darf nur Buchstaben, Zahlen und Symbole enthalten", "remove": "Entfernen", "invalidSessionId": "Ungültige Session ID", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Nur der Ersteller der Gruppe kann Benutzer entfernen", "createAccount": "Konto Erstellen", "signIn": "Einloggen", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Das ist Ihre Session ID.", "allUsersAreRandomly...": "Ihre Session ID ist die eindeutige Adresse, unter der Personen Sie über Session kontaktieren können. Ihre Session ID ist nicht mit Ihrer realen Identität verbunden, völlig anonym und von Natur aus privat.", "getStarted": "Loslegen", @@ -345,24 +347,24 @@ "enterRecoveryPhrase": "Ihr Wiederherstellungssatz", "displayName": "Anzeigename", "anonymous": "Anonym", - "removeResidueMembers": "Clicking ok will also remove those members as they left the group.", + "removeResidueMembers": "Wenn du auf Ok klickst, werden diese Mitglieder auch gelöscht, da sie die Gruppe verlassen haben.", "enterDisplayName": "Geben Sie einen Anzeigenamen ein", - "enterOptionalPassword": "Enter password (optional)", + "enterOptionalPassword": "Passwort eingeben (optional)", "continueYourSession": "Ihre Session fortsetzen", "linkDevice": "Gerät verbinden", "restoreUsingRecoveryPhrase": "Ihr Konto wiederherstellen", "or": "oder", - "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Beginnen
Sie
Ihre
Session.", + "ByUsingThisService...": "Durch die Nutzung dieses Dienstes stimmst du unseren Nutzungsbedingungen und Datenschutzerklärung zu", + "beginYourSession": "Beginnen Sie Ihre Session.", "welcomeToYourSession": "Willkommen bei Session", "newSession": "Neue Session", - "searchFor...": "Search for conversations or contacts", + "searchFor...": "Nach Unterhaltungen oder Kontakten suchen", "enterSessionID": "Session ID eingeben", "enterSessionIDOfRecipient": "Geben Sie eine Session ID ein.", "usersCanShareTheir...": "Benutzer können ihre Session ID freigeben, indem sie in ihren Einstellungen auf \"Session ID freigeben\" tippen oder ihren QR-Code freigeben.", - "message": "Message", + "message": "Nachricht", "appearanceSettingsTitle": "Darstellung", - "permissionSettingsTitle": "Permissions", + "permissionSettingsTitle": "Berechtigungen", "privacySettingsTitle": "Datenschutz", "notificationsSettingsTitle": "Benachrichtigungen", "recoveryPhraseEmpty": "Ihr Wiederherstellungssatz", @@ -380,32 +382,32 @@ "invalidGroupNameTooLong": "Bitte geben Sie einen kürzeren Gruppennamen ein.", "pickClosedGroupMember": "Bitte wählen Sie mindestens zwei Gruppenmitglieder aus.", "closedGroupMaxSize": "Eine geschlossene Gruppe kann maximal einhundert Mitglieder haben.", - "noBlockedContacts": "No blocked contacts", - "userAddedToModerators": "User added to moderator list", - "userRemovedFromModerators": "User removed from moderator list", - "orJoinOneOfThese": "Or join one of these...", - "helpUsTranslateSession": "Help us Translate Session", - "translation": "Translation", - "closedGroupInviteFailTitle": "Group Invitation Failed", - "closedGroupInviteFailTitlePlural": "Group Invitations Failed", - "closedGroupInviteFailMessage": "Unable to successfully invite a group member", - "closedGroupInviteFailMessagePlural": "Unable to successfully invite all group members", - "closedGroupInviteOkText": "Retry invitations", - "closedGroupInviteSuccessTitlePlural": "Group Invitations Completed", - "closedGroupInviteSuccessTitle": "Group Invitation Succeeded", - "closedGroupInviteSuccessMessage": "Successfully invited closed group members", - "notificationForConvo": "Notifications", - "notificationForConvo_all": "All", - "notificationForConvo_disabled": "Disabled", - "notificationForConvo_mentions_only": "Mentions only", - "onionPathIndicatorTitle": "Path", - "onionPathIndicatorDescription": "Session hides your IP by bouncing your messages through several Service Nodes in Session's decentralized network. These are the countries your connection is currently being bounced through:", - "unknownCountry": "Unknown Country", - "device": "Device", - "destination": "Destination", - "learnMore": "Learn more", - "linkVisitWarningTitle": "Open this link in your browser?", - "linkVisitWarningMessage": "Are you sure you want to open $url$ in your browser?", + "noBlockedContacts": "Keine blockierten Kontakte", + "userAddedToModerators": "Benutzer zur Moderatorenliste hinzugefügt", + "userRemovedFromModerators": "Benutzer von der Moderatorenliste entfernt", + "orJoinOneOfThese": "Oder tritt einer von diesen bei...", + "helpUsTranslateSession": "Hilf uns, Session zu übersetzen", + "translation": "Übersetzung", + "closedGroupInviteFailTitle": "Einladung in die Gruppe fehlgeschlagen", + "closedGroupInviteFailTitlePlural": "Einladungen in die Gruppe fehlgeschlagen", + "closedGroupInviteFailMessage": "Gruppenmitglied konnte nicht eingeladen werden", + "closedGroupInviteFailMessagePlural": "Keiner der Gruppenmitglieder konnten nicht eingeladen werden", + "closedGroupInviteOkText": "Einladungen erneut senden", + "closedGroupInviteSuccessTitlePlural": "Gruppeneinladungen abgeschlossen", + "closedGroupInviteSuccessTitle": "Gruppeneinladung erfolgreich", + "closedGroupInviteSuccessMessage": "Gruppenmitglieder der geschlossenen Gruppe wurden erfolgreich eingeladen", + "notificationForConvo": "Benachrichtigungen", + "notificationForConvo_all": "Alle", + "notificationForConvo_disabled": "Deaktiviert", + "notificationForConvo_mentions_only": "Nur Erwähnungen", + "onionPathIndicatorTitle": "Pfad", + "onionPathIndicatorDescription": "Session verbirgt deine IP-Adresse, indem deine Nachrichten über mehrere Dienstknoten im dezentralen Session-Netzwerk weitergeleitet werden. Dies sind die Länder, durch die deine Verbindung derzeit weitergeleitet wird:", + "unknownCountry": "Unbekanntes Land", + "device": "Gerät", + "destination": "Zielort", + "learnMore": "Mehr erfahren", + "linkVisitWarningTitle": "Diesen Link in deinem Browser öffnen?", + "linkVisitWarningMessage": "Bist du sicher, dass du $url$ in deinem Browser öffnen willst?", "open": "Öffnen", "audioMessageAutoplayTitle": "Audionachricht automatische Wiedergabe", "audioMessageAutoplayDescription": "Automatisch in Folge gesendete Audionachrichten abspielen", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "Erste ungelesene Nachricht ist oben", "sendRecoveryPhraseTitle": "Wiederherstellungsphrase zusenden", "sendRecoveryPhraseMessage": "Mit der Wiederherstellungsphrase kann auf deinen Account zugegriffen werden. Bist du dir sicher das du sie dir zusenden lassen möchtest?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Benachrichtigungen - $setting$" } diff --git a/_locales/el/messages.json b/_locales/el/messages.json index f216ee9272..1fd89dc4dc 100644 --- a/_locales/el/messages.json +++ b/_locales/el/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Οριστική διαγραφή αυτής της συνομιλίας;", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Μικρογραφία της εικόνας από το αναφερόμενο μήνυμα", "imageAttachmentAlt": "Εικόνα επισυνημμένη στο μήνυμα", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 30ab8ce203..82f78073cd 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete for Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages and contacts.", + "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -150,7 +150,7 @@ "savedTheFile": "Media saved by $name$", "linkPreviewsTitle": "Send Link Previews", "linkPreviewDescription": "Previews are supported for most urls", - "linkPreviewsConfirmMessage": "You will not have full metadata protection when sending or receiving link previews.", + "linkPreviewsConfirmMessage": "You will not have full metadata protection when sending link previews.", "mediaPermissionsTitle": "Microphone and Camera", "mediaPermissionsDescription": "Allow access to camera and microphone", "spellCheckTitle": "Spell Check", @@ -355,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", diff --git a/_locales/eo/messages.json b/_locales/eo/messages.json index 5720324be8..4aa57a0427 100644 --- a/_locales/eo/messages.json +++ b/_locales/eo/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Ĉu porĉiame forigi tiun ĉi tutan interparolon?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Bildominiaturo el citita mesaĝo", "imageAttachmentAlt": "Bildo kunsendita kun la mesaĝo", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/es/messages.json b/_locales/es/messages.json index 38ee42f8a0..264ed4554a 100644 --- a/_locales/es/messages.json +++ b/_locales/es/messages.json @@ -277,35 +277,35 @@ "yourSessionID": "Tu ID de Session", "setAccountPasswordTitle": "Establecer contraseña de la cuenta", "setAccountPasswordDescription": "Require password to unlock Session’s screen. You can still receive message notifications while Screen Lock is enabled. Session’s notification settings allow you to customize information that is displayed", - "changeAccountPasswordTitle": "Change Account Password", + "changeAccountPasswordTitle": "Cambiar la Contraseña de la Cuenta", "changeAccountPasswordDescription": "Change your password", "removeAccountPasswordTitle": "Remove Account Password", "removeAccountPasswordDescription": "Remove the password associated with your account", - "enterPassword": "Please enter your password", - "confirmPassword": "Confirm password", + "enterPassword": "Por favor, introduce tu contraseña", + "confirmPassword": "Confirmar contraseña", "pasteLongPasswordToastTitle": "El contenido del portapapeles excede la longitud máxima de la contraseña de $max_pwd_len$ caracteres.", "showRecoveryPhrasePasswordRequest": "Please enter your password", "recoveryPhraseSavePromptMain": "Tu frase de recuperación es la llave maestra de tu ID de Session, puedes usarla para recuperar tu ID de Session en caso de pérdida de acceso a tu dispositivo. Guarda tu frase de recuperación en un lugar seguro y no se la digas a nadie.", - "invalidOpenGroupUrl": "Invalid URL", + "invalidOpenGroupUrl": "URL no válida", "copiedToClipboard": "Copiado en el portapapeles", - "passwordViewTitle": "Type In Your Password", + "passwordViewTitle": "Escribe Tu Contraseña", "unlock": "Desbloquear", "password": "Contraseña", "setPassword": "Set Password", "changePassword": "Cambiar Contraseña", - "removePassword": "Remove Password", + "removePassword": "Eliminar Contraseña", "maxPasswordAttempts": "Invalid Password. Would you like to reset the database?", "typeInOldPassword": "Please type in your old password", "invalidOldPassword": "Old password is invalid", - "invalidPassword": "Invalid password", - "noGivenPassword": "Please enter your password", + "invalidPassword": "Contraseña inválida", + "noGivenPassword": "Por favor, introduce tu contraseña", "passwordsDoNotMatch": "Passwords do not match", "setPasswordInvalid": "Passwords do not match", "changePasswordInvalid": "The old password you entered is incorrect", - "removePasswordInvalid": "Incorrect password", + "removePasswordInvalid": "Contraseña incorrecta", "setPasswordTitle": "Set Password", - "changePasswordTitle": "Changed Password", - "removePasswordTitle": "Removed Password", + "changePasswordTitle": "Contraseña Cambiada", + "removePasswordTitle": "Contraseña Eliminada", "setPasswordToastDescription": "Your password has been set. Please keep it safe.", "changePasswordToastDescription": "Your password has been changed. Please keep it safe.", "removePasswordToastDescription": "You have removed your password.", @@ -331,12 +331,14 @@ "add": "Añadir", "addingContacts": "Añadiendo contactos a", "noContactsToAdd": "No hay contactos para añadir", - "noMembersInThisGroup": "No other members in this group", - "noModeratorsToRemove": "no moderators to remove", + "noMembersInThisGroup": "No hay otros miembros en este grupo", + "noModeratorsToRemove": "no hay moderadores para eliminar", "onlyAdminCanRemoveMembers": "Tu no eres el creador", "onlyAdminCanRemoveMembersDesc": "Sólo el creador del grupo puede eliminar usuarios", "createAccount": "Create Account", "signIn": "Iniciar sesión", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Saluda a tu ID de Session", "allUsersAreRandomly...": "Tu ID de Session es la dirección única que las personas pueden usar para contactarte en Session. Por diseño, tu ID de Session es totalmente anónima y privada, sin vínculo con tu identidad real.", "getStarted": "Comenzar", @@ -353,10 +355,10 @@ "restoreUsingRecoveryPhrase": "Restaura tu cuenta", "or": "o", "ByUsingThisService...": "Al usar este servicio, aceptas nuestros Términos y condiciones y Políticas de privacidad", - "beginYourSession": "Comienza
tu
Session.", + "beginYourSession": "Comienza tu Session.", "welcomeToYourSession": "Bienvenido a tu Session", "newSession": "Nueva Session", - "searchFor...": "Search for conversations or contacts", + "searchFor...": "Buscar conversaciones o contactos", "enterSessionID": "Session ID", "enterSessionIDOfRecipient": "Ingresa la ID de Session del destinatario", "usersCanShareTheir...": "Los usuarios pueden compartir su ID de Session yendo a los ajustes de su cuenta y pulsando en Compartir ID de Session o compartiendo su código QR", @@ -417,7 +419,17 @@ "pinConversationLimitTitle": "Límite de conversaciones ancladas", "pinConversationLimitToastDescription": "Solo puedes anclar $number$ conversaciones", "latestUnreadIsAbove": "El primer mensaje no leído está arriba", - "sendRecoveryPhraseTitle": "Sending Recovery Phrase", + "sendRecoveryPhraseTitle": "Enviando Frase de Recuperación", "sendRecoveryPhraseMessage": "Estás intentando enviar tu frase de recuperación, que puede utilizarse para acceder a tu cuenta. ¿Estás seguro de que deseas enviar este mensaje?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notificaciones - $setting$" } diff --git a/_locales/es_419/messages.json b/_locales/es_419/messages.json index b859ac2608..4213bafb99 100644 --- a/_locales/es_419/messages.json +++ b/_locales/es_419/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/et/messages.json b/_locales/et/messages.json index 0746b145ad..549b38a8fa 100644 --- a/_locales/et/messages.json +++ b/_locales/et/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Kas kustutada see vestlus jäädavalt?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Tsiteeritud sõnumist pärit pildi pisipilt", "imageAttachmentAlt": "Pilt lisatud sõnumile", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/fa/messages.json b/_locales/fa/messages.json index 9b57badb69..4a91d12f5c 100644 --- a/_locales/fa/messages.json +++ b/_locales/fa/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "آیا می‌خواهید این گفتگو را برای همیشه حذف کنید؟", "clearAllData": "پاک‌سازی همه داده‌ها", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "آیا مطمئن هستید که می‌خواهید این مکالمه را حذف کنید؟", "quoteThumbnailAlt": "پیش‌نمایش تصویر از پیام نقل قول شده", "imageAttachmentAlt": "تصویر پیوست شده به پیام", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/fi/messages.json b/_locales/fi/messages.json index 057b7d223d..5764ce00c8 100644 --- a/_locales/fi/messages.json +++ b/_locales/fi/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Poistetaanko tämä keskustelu pysyvästi?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Lainatun kuvaviestin pikkukuva", "imageAttachmentAlt": "Viestiin liitetty kuva", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/fil/messages.json b/_locales/fil/messages.json index 6ea4eb44c4..efa8babcbc 100644 --- a/_locales/fil/messages.json +++ b/_locales/fil/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/fr/messages.json b/_locales/fr/messages.json index cac7267c83..ba797a0765 100644 --- a/_locales/fr/messages.json +++ b/_locales/fr/messages.json @@ -150,7 +150,7 @@ "savedTheFile": "$name$ a enregistré le média", "linkPreviewsTitle": "Envoyer des aperçus de liens", "linkPreviewDescription": "Les aperçus sont pris en charge pour la plupart des URLs", - "linkPreviewsConfirmMessage": "Vous n'aurez pas une protection complète des métadonnées en envoyant ou recevant des aperçu de liens.", + "linkPreviewsConfirmMessage": "Vous n'aurez pas une protection complète des métadonnées en envoyant des aperçu de liens.", "mediaPermissionsTitle": "Microphone et caméra", "mediaPermissionsDescription": "Autoriser l’accès à la caméra et au micro", "spellCheckTitle": "Vérification orthographique", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Seul le créateur du groupe peut supprimer des utilisateurs", "createAccount": "Créer un compte", "signIn": "Connexion", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Dites bonjour à votre Session ID", "allUsersAreRandomly...": "Votre Session ID est l'identifiant unique que les gens utilisent pour vous contacter dans Session. Sans lien avec votre identité réelle, votre Session ID est complètement anonyme et privé.", "getStarted": "Commencer", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restaurez votre compte", "or": "ou", "ByUsingThisService...": "En utilisant ce service, vous acceptez nos Conditions d'utilisation et notre Politique de confidentialité", - "beginYourSession": "Commencez
votre
Session.", + "beginYourSession": "Commencez votre Session.", "welcomeToYourSession": "Bienvenue sur Session", "newSession": "Nouvelle Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "Le premier message non lu se situe au-dessus", "sendRecoveryPhraseTitle": "Envoyer la phrase de récupération", "sendRecoveryPhraseMessage": "Vous essayer actuellement d’envoyer votre phrase de récupération, qui peut être utilisée pour accéder a votre compte. Êtes-vous sûre de vouloir envoyer ce message ?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/he/messages.json b/_locales/he/messages.json index 6ff76557d5..74ead85841 100644 --- a/_locales/he/messages.json +++ b/_locales/he/messages.json @@ -1,7 +1,7 @@ { - "privacyPolicy": "Terms & Privacy Policy", + "privacyPolicy": "תנאי שימוש ומדיניות פרטיות", "copyErrorAndQuit": "העתק שגיאה וצא", - "unknown": "Unknown", + "unknown": "לא ידוע", "databaseError": "שגיאת מסד נתונים", "mainMenuFile": "&קובץ", "mainMenuEdit": "&עריכה", @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "האם למחוק לצמיתות שיחה זו?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "תמונה ממוזערת מהודעה מצוטטת", "imageAttachmentAlt": "תמונה צורפה אל הודעה", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/hi/messages.json b/_locales/hi/messages.json index 664e9c135f..469a4716d7 100644 --- a/_locales/hi/messages.json +++ b/_locales/hi/messages.json @@ -11,50 +11,50 @@ "appMenuHide": "छिपाएँ", "appMenuHideOthers": "बाकियों को छुपाएं", "appMenuUnhide": "सभी को दिखाएं", - "appMenuQuit": "Quit Session", - "editMenuUndo": "Undo", - "editMenuRedo": "Redo", - "editMenuCut": "Cut", - "editMenuCopy": "Copy", - "editMenuPaste": "Paste", + "appMenuQuit": "क्विट सेशन", + "editMenuUndo": "वापस लाएं", + "editMenuRedo": "फिर से करें", + "editMenuCut": "कट", + "editMenuCopy": "कॉपी करें", + "editMenuPaste": "पेस्ट करें", "editMenuPasteAndMatchStyle": "Paste and Match Style", "editMenuDelete": "हटाना", "editMenuSelectAll": "Select All", - "windowMenuClose": "Close Window", - "windowMenuMinimize": "Minimize", - "windowMenuZoom": "Zoom", - "windowMenuBringAllToFront": "Bring All to Front", - "viewMenuResetZoom": "Actual Size", - "viewMenuZoomIn": "Zoom In", - "viewMenuZoomOut": "Zoom Out", - "viewMenuToggleFullScreen": "Toggle Full Screen", - "viewMenuToggleDevTools": "Toggle Developer Tools", - "contextMenuNoSuggestions": "No Suggestions", - "openGroupInvitation": "Open group invitation", - "joinOpenGroupAfterInvitationConfirmationTitle": "Join $roomName$?", - "joinOpenGroupAfterInvitationConfirmationDesc": "Are you sure you want to join the $roomName$ open group?", - "enterSessionIDOrONSName": "Enter Session ID or ONS name", + "windowMenuClose": "विंडो बंद करें", + "windowMenuMinimize": "छोटा करें", + "windowMenuZoom": "ज़ूम", + "windowMenuBringAllToFront": "सभी को सामने लाओ", + "viewMenuResetZoom": "वास्तविक आकार", + "viewMenuZoomIn": "बड़ा करें", + "viewMenuZoomOut": "छोटा करें", + "viewMenuToggleFullScreen": "पूर्णस्क्रीन में जाएं", + "viewMenuToggleDevTools": "डेवलपर टूल टॉगल करें", + "contextMenuNoSuggestions": "कोई सुझाव नहीं हैं", + "openGroupInvitation": "ग्रुप आमंत्रण खोलें", + "joinOpenGroupAfterInvitationConfirmationTitle": "$roomName$ से जुड़ें?", + "joinOpenGroupAfterInvitationConfirmationDesc": "क्या आप $roomName$ open ग्रुप से जुड़ना चाहते हैं?", + "enterSessionIDOrONSName": "Session आईडी या ओएनएस नाम दर्ज करें", "loading": "लोड हो रहा है", "optimizingApplication": "Optimizing application...", - "done": "Done", + "done": "पूरा हुआ", "me": "मुझे", "view": "राय", "youLeftTheGroup": "आपने समूह छोड़ दिया", - "youGotKickedFromGroup": "You were removed from the group.", - "unreadMessage": "Unread Message", - "unreadMessages": "Unread Messages", + "youGotKickedFromGroup": "इस समूह से आप हटा दिए गए", + "unreadMessage": "अपठित मेसेजस", + "unreadMessages": "अपठित मेसेजस", "debugLogExplanation": "यह अभिलेख ऑनलाइन भेजा जाएगा अन्या सहयोगियो के जाँच पड़ताल के लिए. भेजने से पहेले ठीक से सनपदान कर ले", "debugLogError": "Something went wrong with the upload! Please consider manually adding your log to the bug you file.", "reportIssue": "मामले की रिपोर्ट करें", "gotIt": "समझ गया!", "submit": "जमा करें", - "markAllAsRead": "Mark All as Read", + "markAllAsRead": "सभी को पढ़ा हुआ मार्क करें", "incomingError": "Error handling incoming message", - "media": "Media", + "media": "मीडिया", "mediaEmptyState": "You don’t have any media in this conversation", - "documents": "Documents", + "documents": "दस्तावेज़", "documentsEmptyState": "You don’t have any documents in this conversation", - "today": "Today", + "today": "आज", "yesterday": "कल", "thisWeek": "This Week", "thisMonth": "इस महीने", @@ -74,8 +74,8 @@ "submitDebugLog": "डीबग लॉग", "debugLog": "लॉग को डीबग करें", "goToReleaseNotes": "Go to Release Notes", - "goToSupportPage": "Go to Support Page", - "menuReportIssue": "Report an Issue", + "goToSupportPage": "सहायता पेज पर जाएँ", + "menuReportIssue": "समस्या की रिपोर्ट करें…", "about": "हमारे बारे में", "speech": "भाषण", "show": "दिखाना", @@ -88,19 +88,19 @@ "settingsHeader": "सेटिंग्स", "typingAlt": "Typing animation for this conversation", "contactAvatarAlt": "Avatar for contact $name$", - "downloadAttachment": "Download Attachment", + "downloadAttachment": "अनुलग्नक डाउनलोड करें", "replyToMessage": "Reply to Message", "replyingToMessage": "को जवाब दे रहे हैं", "originalMessageNotFound": "Original message not found", - "originalMessageNotAvailable": "Original message no longer available", + "originalMessageNotAvailable": "मूल संदेश अब उपलब्ध नहीं है", "messageFoundButNotLoaded": "Original message found, but not loaded. Scroll up to load it.", - "recording": "Recording", - "you": "You", + "recording": "रिकॉर्डिंग", + "you": "आप", "audioPermissionNeededTitle": "Microphone access required", "audioPermissionNeeded": "To send audio messages, allow Session Desktop to access your microphone.", - "audio": "Audio", - "video": "Video", - "photo": "Photo", + "audio": "ऑडियो", + "video": "वीडियो", + "photo": "फ़ोटो", "cannotUpdate": "Cannot Update", "cannotUpdateDetail": "Session Desktop failed to update, but there is a new version available. Please go to https://getsession.org/ and install the new version manually, then either contact support or file a bug about this problem.", "ok": "ठीक", @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "इस वार्तालाप को स्थायी रूप से हटाएं?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/hr/messages.json b/_locales/hr/messages.json index 0753c9020c..97d94c6293 100644 --- a/_locales/hr/messages.json +++ b/_locales/hr/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Trajno obrisati ovaj razgovor?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/hu/messages.json b/_locales/hu/messages.json index 761274df61..60ed224529 100644 --- a/_locales/hu/messages.json +++ b/_locales/hu/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "vagy", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/id/messages.json b/_locales/id/messages.json index 6edeee4d55..800bf79805 100644 --- a/_locales/id/messages.json +++ b/_locales/id/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Ucapkan halo pada Session ID anda", "allUsersAreRandomly...": "Session ID adalah alamat unik yang bisa digunakan untuk mengontak anda. Tanpa koneksi dengan identitas asli, Session ID anda didesain bersifat anonim dan rahasia.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Kembalikan akun", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "Session baru", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/it/messages.json b/_locales/it/messages.json index 46db6fd777..93be1a489a 100644 --- a/_locales/it/messages.json +++ b/_locales/it/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Solo il creatore del gruppo può rimuovere gli utenti", "createAccount": "Create Account", "signIn": "Accedi", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Ecco la tua Sessione ID", "allUsersAreRandomly...": "La Sessione ID è l'indirizzo univoco che le persone possono utilizzare per contattarti su una Sessione. Senza alcuna connessione con la tua vera identità, la Sessione ID è totalmente anonimo e privato fin dal incezione.", "getStarted": "Inizia qui", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Ripristina il tuo account", "or": "o", "ByUsingThisService...": "Utilizzando questo servizio, accetti i nostri Termini di Servizio e Informativa sulla privacy", - "beginYourSession": "Inizia
la tua
Session.", + "beginYourSession": "Inizia la tua Session.", "welcomeToYourSession": "Benvenuto su Session", "newSession": "Nuova sessione", "searchFor...": "Ricerca conversazioni o contatti", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "Il primo messaggio non letto è sopra", "sendRecoveryPhraseTitle": "Invio Frase Di Recupero", "sendRecoveryPhraseMessage": "Stai tentando di inviare la frase di recupero che può essere utilizzata per accedere al tuo account. Sei sicuro di voler inviare questo messaggio?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifiche - $setting$" } diff --git a/_locales/ja/messages.json b/_locales/ja/messages.json index 152d400826..b6b89ebe37 100644 --- a/_locales/ja/messages.json +++ b/_locales/ja/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "アカウントを作成", "signIn": "ログイン", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Session ID をご紹介します", "allUsersAreRandomly...": "Session ID は、Session で連絡を取るために使用できる一意のアドレスです。本当のアイデンティティに関係なく、あなたの Session ID は設計上完全に匿名でプライベートです。", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "アカウントを復元する", "or": "or", "ByUsingThisService...": "本サービスを利用する場合、利用規約およびプライバシーポリシーに同意するものとします", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "新しいセッション", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/ka/messages.json b/_locales/ka/messages.json index 9c1cffd017..3db2620db9 100644 --- a/_locales/ka/messages.json +++ b/_locales/ka/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete for Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/km/messages.json b/_locales/km/messages.json index 323751c5e1..bcebaa3a03 100644 --- a/_locales/km/messages.json +++ b/_locales/km/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "លុបការសន្ទនានេះចោលរហូត?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "រូបភាពតូចៗនៃរូបភាពពីសារដែលបានដកស្រង់", "imageAttachmentAlt": "រូបភាពបានភ្ជាប់ទៅសារ", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/kn/messages.json b/_locales/kn/messages.json index 6ea4eb44c4..efa8babcbc 100644 --- a/_locales/kn/messages.json +++ b/_locales/kn/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/ko/messages.json b/_locales/ko/messages.json index 7de4a9a74b..e3e695a56a 100644 --- a/_locales/ko/messages.json +++ b/_locales/ko/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Permanently delete this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/lt/messages.json b/_locales/lt/messages.json index 5d6ed9989a..fa8173c3d5 100644 --- a/_locales/lt/messages.json +++ b/_locales/lt/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Ar ištrinti šį pokalbį visiems laikams?", "clearAllData": "Išvalyti visus duomenis", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Paveikslo iš cituotos žinutės miniatiūra", "imageAttachmentAlt": "Prie žinutės pridėtas paveikslas", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/mk/messages.json b/_locales/mk/messages.json index f92f59a6aa..9d6beddd45 100644 --- a/_locales/mk/messages.json +++ b/_locales/mk/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Permanently delete this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/nb/messages.json b/_locales/nb/messages.json index 6ea4eb44c4..efa8babcbc 100644 --- a/_locales/nb/messages.json +++ b/_locales/nb/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/nl/messages.json b/_locales/nl/messages.json index 7e20d2b3cd..148d221825 100644 --- a/_locales/nl/messages.json +++ b/_locales/nl/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Dit gesprek voorgoed wissen?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Miniatuur van afbeelding uit aangehaald bericht", "imageAttachmentAlt": "Afbeelding toegevoegd aan bericht", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/no/messages.json b/_locales/no/messages.json index 6ea4eb44c4..efa8babcbc 100644 --- a/_locales/no/messages.json +++ b/_locales/no/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/pa/messages.json b/_locales/pa/messages.json index 6ea4eb44c4..efa8babcbc 100644 --- a/_locales/pa/messages.json +++ b/_locales/pa/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/pl/messages.json b/_locales/pl/messages.json index bd5297bc7a..8e71a9ee4b 100644 --- a/_locales/pl/messages.json +++ b/_locales/pl/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Tylko twórca grupy może usunąć użytkowników", "createAccount": "Create Account", "signIn": "Zaloguj się", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Przywitaj się z identyfikatorem Session", "allUsersAreRandomly...": "Twój identyfikator Session to unikalny adres, za pomocą którego można się z Tobą kontaktować w Sesji. Bez połączenia z twoją prawdziwą tożsamością, identyfikator Session jest z założenia całkowicie anonimowy i prywatny.", "getStarted": "Rozpocznij", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Przywróć swoje konto", "or": "lub", "ByUsingThisService...": "Korzystając z tej usługi, akceptujesz nasze Warunki korzystania z usługi i Politykę prywatności", - "beginYourSession": "Rozpocznij
swój
Session.", + "beginYourSession": "Rozpocznij swój Session.", "welcomeToYourSession": "Witamy w twoim Session", "newSession": "Nowa Session", "searchFor...": "Szukaj konwersacji lub kontaktów", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "Pierwsza nieprzeczytana wiadomość jest powyżej", "sendRecoveryPhraseTitle": "Wysyłanie frazy odzyskiwania", "sendRecoveryPhraseMessage": "Próbujesz wysłać frazę odzyskiwania, która może być użyta do uzyskania dostępu do twojego konta. Czy na pewno chcesz wysłać tę wiadomość?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Powiadomienia - $setting$" } diff --git a/_locales/pt_BR/messages.json b/_locales/pt_BR/messages.json index afee99fd7d..d3d7cad67a 100644 --- a/_locales/pt_BR/messages.json +++ b/_locales/pt_BR/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Somente o criador do grupo pode remover usuários", "createAccount": "Create Account", "signIn": "Iniciar sessão", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Diga olá ao seu ID Session", "allUsersAreRandomly...": "Seu ID Session é o endereço exclusivo que as pessoas podem usar para entrar em contato com você no Session. Sem conexão com sua identidade real, seu ID Session é totalmente anônimo e privado por definição.", "getStarted": "Começar", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restaurar sua conta", "or": "ou", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Inicie
seu
Session.", + "beginYourSession": "Inicie seu Session.", "welcomeToYourSession": "Bem-vindo(a) ao seu Session", "newSession": "Nova Sessão", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Enviando frase de recuperação", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/pt_PT/messages.json b/_locales/pt_PT/messages.json index a4e9a3e172..17aff9d2ca 100644 --- a/_locales/pt_PT/messages.json +++ b/_locales/pt_PT/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Deseja eliminar definitivamente esta conversa?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Miniatura da imagem da mensagem", "imageAttachmentAlt": "Imagem anexada à mensagem", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/ro/messages.json b/_locales/ro/messages.json index a1f3e0e656..d9b546dd8b 100644 --- a/_locales/ro/messages.json +++ b/_locales/ro/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Şterg permanent acestă conversație?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Imagine atașată la mesaj", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/ru/messages.json b/_locales/ru/messages.json index 9a86f86670..0f4bb88189 100644 --- a/_locales/ru/messages.json +++ b/_locales/ru/messages.json @@ -1,7 +1,7 @@ { "privacyPolicy": "Условия и политика конфиденциальности", "copyErrorAndQuit": "Скопировать ошибку и выйти", - "unknown": "Неизвестен", + "unknown": "Неизвестно", "databaseError": "Ошибка базы данных", "mainMenuFile": "&Файл", "mainMenuEdit": "&Изменить", @@ -9,32 +9,32 @@ "mainMenuWindow": "&Окно", "mainMenuHelp": "&Помощь", "appMenuHide": "Скрыть", - "appMenuHideOthers": "Скрыть другие", - "appMenuUnhide": "Показать все", + "appMenuHideOthers": "Скрыть других", + "appMenuUnhide": "Показать всех", "appMenuQuit": "Выйти из Session", "editMenuUndo": "Отменить", "editMenuRedo": "Вернуть", "editMenuCut": "Вырезать", "editMenuCopy": "Копировать", "editMenuPaste": "Вставить", - "editMenuPasteAndMatchStyle": "Вставить текст из буфера обмена", + "editMenuPasteAndMatchStyle": "Вставить с соответствием стилю", "editMenuDelete": "Удалить", "editMenuSelectAll": "Выбрать всё", "windowMenuClose": "Закрыть окно", - "windowMenuMinimize": "Минимизировать", + "windowMenuMinimize": "Свернуть", "windowMenuZoom": "Увеличить", "windowMenuBringAllToFront": "Вынести всё на передний план", "viewMenuResetZoom": "Фактический размер", "viewMenuZoomIn": "Увеличить", "viewMenuZoomOut": "Уменьшить", - "viewMenuToggleFullScreen": "Переключить полный экран", + "viewMenuToggleFullScreen": "Полноэкранный режим", "viewMenuToggleDevTools": "Переключить инструменты разработчика", "contextMenuNoSuggestions": "Нет предложений", "openGroupInvitation": "Приглашение в открытую группу", "joinOpenGroupAfterInvitationConfirmationTitle": "Присоединиться к $roomName$?", "joinOpenGroupAfterInvitationConfirmationDesc": "Вы уверен, что хотите присоединиться к открытой группе $roomName$?", "enterSessionIDOrONSName": "Введите Session ID или ONS имя", - "loading": "Загрузка...", + "loading": "Загружается...", "optimizingApplication": "Оптимизация приложения...", "done": "Готово", "me": "Я", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Только создатель группы может удалять пользователей", "createAccount": "Создать аккаунт", "signIn": "Войти", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Познакомьтесь со своим Session ID", "allUsersAreRandomly...": "Ваш Session ID - это уникальный адрес, который другие пользователи могут использовать для связи с вами при помощи Session. Поскольку ваш Session ID никак не связан с вашей настоящей личностью, он по определению является полностью анонимным и конфиденциальным.", "getStarted": "Начать", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Восстановите свой аккаунт", "or": "или", "ByUsingThisService...": "Используя этот сервис, вы соглашаетесь с Условиями обслуживания и Политикой конфиденциальности", - "beginYourSession": "Начать
свою
сессию.", + "beginYourSession": "Начать свою сессию.", "welcomeToYourSession": "Добро пожаловать в вашу сессию", "newSession": "Новый диалог", "searchFor...": "Поиск по беседам или контактам", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "Первое непрочитанное сообщение находится выше", "sendRecoveryPhraseTitle": "Отправка секретной фразы", "sendRecoveryPhraseMessage": "Вы пытаетесь отправить вашу секретную фразу, которая может быть использована для доступа к вашей учетной записи. Вы уверены, что хотите отправить это сообщение?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Уведомления - $setting$" } diff --git a/_locales/si/messages.json b/_locales/si/messages.json index 4b1cadd913..2698e86635 100644 --- a/_locales/si/messages.json +++ b/_locales/si/messages.json @@ -22,7 +22,7 @@ "editMenuSelectAll": "Select all", "windowMenuClose": "කවුළුව වසන්න", "windowMenuMinimize": "Minimize", - "windowMenuZoom": "Zoom", + "windowMenuZoom": "විශාලනය", "windowMenuBringAllToFront": "Bring All to Front", "viewMenuResetZoom": "සැබෑ ප්‍රමාණය", "viewMenuZoomIn": "විශාලනය කරන්න", @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete for Everyone", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "ගිණුම සාදන්න", "signIn": "පිවිසෙන්න", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "ගිණුම ප්‍රත්‍යර්පණය කරන්න", "or": "හෝ", "ByUsingThisService...": "මෙම සේවාව භාවිතා කිරීමෙන්, ඔබ අපගේ සේවාවේ කොන්දේසි සහ රහස්‍යතා ප්‍රතිපත්තිය ට එකඟ වේ", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "සම්භාෂණ හෝ සබඳතා සඳහා සොයන්න", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "නොකියවූ පළමු පණිවිඩය ඉහත ඇත", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "දැනුම්දීම් - $setting$" } diff --git a/_locales/sk/messages.json b/_locales/sk/messages.json index ba059d4db3..d0fdb8efe5 100644 --- a/_locales/sk/messages.json +++ b/_locales/sk/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Natrvalo zmazať túto konverzáciu?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Náhľad obrázku z citovanej správy.", "imageAttachmentAlt": "Obrázok pripojený k správe", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/sl/messages.json b/_locales/sl/messages.json index 479709699e..ecc7552b53 100644 --- a/_locales/sl/messages.json +++ b/_locales/sl/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Ali res želite nepovratno izbrisati ta pogovor?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Predogled slike citiranega sporočila", "imageAttachmentAlt": "Slika je priložena sporočilu", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/sq/messages.json b/_locales/sq/messages.json index cc09fff169..c0751dfc65 100644 --- a/_locales/sq/messages.json +++ b/_locales/sq/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Të fshihet përgjithmonë kjo bisedë?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Miniaturë e figurës nga mesazhi i cituar", "imageAttachmentAlt": "Figurë bashkëngjitur mesazhit", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/sr/messages.json b/_locales/sr/messages.json index 207dd687ad..9652317cd1 100644 --- a/_locales/sr/messages.json +++ b/_locales/sr/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Неопозиво уклонити преписку?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/sv/messages.json b/_locales/sv/messages.json index a841261127..77f39fffb6 100644 --- a/_locales/sv/messages.json +++ b/_locales/sv/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Vill du radera denna konversation för alltid?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Miniatyr av bild för citerat meddelande", "imageAttachmentAlt": "Bild bifogat till meddelande", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/ta/messages.json b/_locales/ta/messages.json index 5e2c8e1ffe..b6e2a2b936 100644 --- a/_locales/ta/messages.json +++ b/_locales/ta/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "எல்லோருக்கும் தகவலைகளை நீக்கு", "deleteConversationConfirmation": "Permanently delete the messages in this conversation?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "கணக்கை உருவாக்கு", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/th/messages.json b/_locales/th/messages.json index bdfa42b68b..28b7196bbb 100644 --- a/_locales/th/messages.json +++ b/_locales/th/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "ลบการสนทนานี้โดยถาวรหรือไม่", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "รูปย่อจากข้อความที่อ้างถึง", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/tr/messages.json b/_locales/tr/messages.json index 315a1d0e4e..bce331d529 100644 --- a/_locales/tr/messages.json +++ b/_locales/tr/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Bu sohbeti kalıcı olarak sil?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Alıntılanmış iletideki görüntünün önizlemesi", "imageAttachmentAlt": "İletiye görüntü eklenmiş", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/uk/messages.json b/_locales/uk/messages.json index 58942d1470..afa97e6ae5 100644 --- a/_locales/uk/messages.json +++ b/_locales/uk/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "Видалити цю розмову без можливості відновлення?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "Thumbnail of image from quoted message", "imageAttachmentAlt": "Image attached to message", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/vi/messages.json b/_locales/vi/messages.json index f499c7e28e..e0adb31e5d 100644 --- a/_locales/vi/messages.json +++ b/_locales/vi/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Bắt đầu với Session ID của bạn", "allUsersAreRandomly...": "Session ID của bạn là địa chỉ duy nhất mà mọi người có thể dùng để liên lạc với bạn trên ứng dụng Session. Session ID của bạn được thiết kế đảm bảo tuyệt đối ẩn danh và riêng tư vì nó không liên kết với danh tính thật của bạn.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Khôi phục lại tài khoản của bạn", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "Session mới", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/zh_CN/messages.json b/_locales/zh_CN/messages.json index 1827c96f5a..e590004961 100644 --- a/_locales/zh_CN/messages.json +++ b/_locales/zh_CN/messages.json @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "只有群组的创建者可以移除用户", "createAccount": "Create Account", "signIn": "登录", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "向您的Session ID打个招呼吧", "allUsersAreRandomly...": "您的Session ID是其他用户在与您聊天时使用的独一无二的地址。Session ID与您的真实身份无关,它在设计上完全是匿名且私密的。", "getStarted": "开始使用", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "恢复您的帐号", "or": "或者", "ByUsingThisService...": "通过使用此服务,您同意我们的 服务条款隐私政策", - "beginYourSession": "开始
您的
会话。", + "beginYourSession": "开始<您的会话。", "welcomeToYourSession": "欢迎来到 Session 。", "newSession": "新建私人聊天", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/_locales/zh_TW/messages.json b/_locales/zh_TW/messages.json index 4bb1733c6d..616dcb5f86 100644 --- a/_locales/zh_TW/messages.json +++ b/_locales/zh_TW/messages.json @@ -131,7 +131,7 @@ "deleteForEveryone": "Delete For Everyone", "deleteConversationConfirmation": "永久刪除對話?", "clearAllData": "Clear All Data", - "deleteAccountWarning": "This will permanently delete your messages, sessions, and contacts.", + "deleteAccountWarning": "This will permanently delete your messages and contacts.", "deleteContactConfirmation": "Are you sure you want to delete this conversation?", "quoteThumbnailAlt": "引用訊息的縮圖", "imageAttachmentAlt": "訊息裏插入的圖片", @@ -337,6 +337,8 @@ "onlyAdminCanRemoveMembersDesc": "Only the creator of the group can remove users", "createAccount": "Create Account", "signIn": "Sign In", + "startInTrayTitle": "Start in Tray", + "startInTrayDescription": "Start Session as a minified app ", "yourUniqueSessionID": "Say hello to your Session ID", "allUsersAreRandomly...": "Your Session ID is the unique address people can use to contact you on Session. With no connection to your real identity, your Session ID is totally anonymous and private by design.", "getStarted": "Get started", @@ -353,7 +355,7 @@ "restoreUsingRecoveryPhrase": "Restore your account", "or": "or", "ByUsingThisService...": "By using this service, you agree to our Terms of Service and Privacy Policy", - "beginYourSession": "Begin
your
Session.", + "beginYourSession": "Begin your Session.", "welcomeToYourSession": "Welcome to your Session", "newSession": "New Session", "searchFor...": "Search for conversations or contacts", @@ -419,5 +421,15 @@ "latestUnreadIsAbove": "First unread message is above", "sendRecoveryPhraseTitle": "Sending Recovery Phrase", "sendRecoveryPhraseMessage": "You are attempting to send your recovery phrase which can be used to access your account. Are you sure you want to send this message?", + "dialogClearAllDataDeletionFailedTitle": "Data not deleted", + "dialogClearAllDataDeletionFailedDesc": "Data not deleted with an unknown error. Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedTitleQuestion": "Do you want to delete data from just this device?", + "dialogClearAllDataDeletionFailedMultiple": "Data not deleted by those Service Nodes: $snodes$", + "dialogClearAllDataDeletionQuestion": "Would you like to clear only this device, or delete your entire account?", + "deviceOnly": "Device Only", + "entireAccount": "Entire Account", + "recoveryPhraseSecureTitle": "You're almost finished!", + "recoveryPhraseRevealMessage": "Secure your account by saving your recovery phrase. Reveal your recovery phrase then store it safely to secure it.", + "recoveryPhraseRevealButtonText": "Reveal Recovery Phrase", "notificationSubtitle": "Notifications - $setting$" } diff --git a/background.d.ts b/background.d.ts deleted file mode 100644 index 186854e5c1..0000000000 --- a/background.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface ConfirmationDialogParams { - title?: string; - message: string; - messageSub?: string; - resolve?: any; - reject?: any; - okText?: string; - okTheme?: string; - closeTheme?: string; - cancelText?: string; - hideCancel?: boolean; - sessionIcon?: SessionIconType; - iconSize?: SessionIconSize; -} diff --git a/js/background.js b/js/background.js index 29770e5a85..3eb7fc6000 100644 --- a/js/background.js +++ b/js/background.js @@ -311,10 +311,6 @@ } window.setTheme = newTheme => { - $(document.body) - .removeClass('dark-theme') - .removeClass('light-theme') - .addClass(`${newTheme}-theme`); window.Events.setThemeSetting(newTheme); }; diff --git a/js/debug_log_start.js b/js/debug_log_start.js index 1a80b67cfe..0c55b64155 100644 --- a/js/debug_log_start.js +++ b/js/debug_log_start.js @@ -10,7 +10,6 @@ $(document).on('keyup', e => { }); const $body = $(document.body); -$body.addClass(`${window.theme}-theme`); // got.js appears to need this to successfully submit debug logs to the cloud window.setImmediate = window.nodeSetImmediate; diff --git a/js/expiring_messages.js b/js/expiring_messages.js index 2327f60ec2..7fe327d648 100644 --- a/js/expiring_messages.js +++ b/js/expiring_messages.js @@ -56,7 +56,6 @@ async function checkExpiringMessages() { // Look up the next expiring message and set a timer to destroy it const messages = await window.Signal.Data.getNextExpiringMessage(); - const next = messages.at(0); if (!next) { return; @@ -65,6 +64,7 @@ const expiresAt = next.get('expires_at'); Whisper.ExpiringMessagesListener.nextExpiration = expiresAt; window.log.info('next message expires', new Date(expiresAt).toISOString()); + window.log.info('next message expires in ', (expiresAt - Date.now()) / 1000); let wait = expiresAt - Date.now(); diff --git a/js/views/app_view.js b/js/views/app_view.js index 126e920e94..f9e22b20f0 100644 --- a/js/views/app_view.js +++ b/js/views/app_view.js @@ -12,7 +12,6 @@ initialize() { this.inboxView = null; - this.applyTheme(); this.applyRtl(); this.applyHideMenu(); }, @@ -27,13 +26,6 @@ this.$el.addClass('rtl'); } }, - applyTheme() { - const theme = storage.get('theme-setting') || 'light'; - this.$el - .removeClass('light-theme') - .removeClass('dark-theme') - .addClass(`${theme}-theme`); - }, applyHideMenu() { const hideMenuBar = storage.get('hide-menu-bar', true); window.setAutoHideMenuBar(hideMenuBar); diff --git a/package.json b/package.json index a8831920fe..296d704aa9 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "session-desktop", "productName": "Session", "description": "Private messaging from your desktop", - "version": "1.6.11", + "version": "1.7.0", "license": "GPL-3.0", "author": { "name": "Loki Project", diff --git a/stylesheets/_avatar.scss b/stylesheets/_avatar.scss index f9b48aa912..04a2f9978e 100644 --- a/stylesheets/_avatar.scss +++ b/stylesheets/_avatar.scss @@ -1,4 +1,7 @@ // Module: Avatar +$borderAvatarColor: unquote( + '#00000059' +); // search for references on ts TODO: make this exposed on ts .module-avatar { position: relative; diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index 9024e51310..ce6881a595 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -5,41 +5,6 @@ z-index: 2; } -.message-container { - list-style: none; - - li { - margin-bottom: 2px; - - &::after { - visibility: hidden; - display: block; - font-size: 0; - content: ' '; - clear: both; - height: 0; - } - } -} - -.module-message__check-box { - color: rgb(97, 97, 97); - font-size: 20px; - padding: 4px; - user-select: none; - display: inline; -} - -.check-box-container { - align-items: center; - flex-direction: row; - display: inline-flex; -} - -.check-box-selected { - opacity: 1; -} - .public-chat-message-wrapper { padding-inline-start: 10px; padding-inline-end: 10px; @@ -51,14 +16,13 @@ } .group-invitation { - @include themify($themes) { - background: themed('receivedMessageBackground'); - } + background: var(--color-received-message-background); + &.invitation-outgoing { - @include themify($themes) { - background: themed('sentMessageBackground'); - } + background: var(--color-sent-message-background); + align-self: flex-end; } + display: inline-block; margin: 4px 16px; padding: 4px; @@ -91,150 +55,27 @@ flex-direction: column; padding: 0px 12px; - + color: var(--color-text-opposite); .group-name { font-weight: bold; font-size: 18px; } .group-address { - color: grey; + color: var(--color-text); } } .session-icon-button { - @include themify($themes) { - background-color: themed('accent'); - box-shadow: none; - } + background-color: var(--color-accent); + box-shadow: none; + filter: brightness(1.05); svg path { transition: $session-transition-duration; opacity: 0.6; - @include themify($themes) { - fill: themed('textColorOpposite'); - } + fill: var(--color-text-opposite); } } } } - -.dark-theme { - .group-invitation { - background-color: #242424; - border-color: #303030; - box-shadow: none; - - .title { - color: lightgrey; - } - } -} - -.invitation-outgoing { - align-self: flex-end; -} - -.typing-bubble-wrapper { - margin-bottom: 20px; -} - -.contact-detail-pane { - overflow-y: scroll; - padding-top: 40px; - padding-bottom: 40px; -} - -// We need to use the wrapper because the conversation view calculates the height of all -// things in the composition area. A margin on an inner div won't be included in that -// height calculation. -.bottom-bar .quote-wrapper { - margin-inline-start: 37px; - margin-inline-end: 73px; - margin-top: 3px; - margin-bottom: -5px; -} - -.bottom-bar .preview-wrapper { - margin-top: 3px; - margin-inline-start: 37px; - margin-inline-end: 73px; - margin-bottom: 2px; -} - -.bottom-bar { - box-sizing: content-box; - $button-width: 36px; - @include themify($themes) { - border-top: themed('sessionBorder'); - } - - form.send { - margin-bottom: 0px; - background: $color-white; - - &.video-attachment { - .image-container { - position: relative; - } - - .outer { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - - text-align: center; - display: flex; - align-items: center; - justify-content: center; - - .play.icon { - height: 30px; - width: 30px; - - @include color-svg('../images/play.svg', white); - } - } - } - } - - .attachment-previews { - padding: 0 36px; - margin-bottom: 3px; - - .attachment-preview { - padding: 13px 10px 0; - } - img { - border: 2px solid #ddd; - border-radius: $border-radius; - max-height: 100px; - } - - .close { - position: absolute; - top: 5px; - right: 2px; - background: #999; - - &:hover { - background: $grey; - } - } - } - - .flex { - display: flex; - flex-direction: row; - align-items: center; - margin-bottom: 7px; - padding: 0px 15px; - } - - .choose-file { - float: left; - height: 36px; - } -} diff --git a/stylesheets/_global.scss b/stylesheets/_global.scss index c92b3d80bb..12eb31a0f0 100644 --- a/stylesheets/_global.scss +++ b/stylesheets/_global.scss @@ -1,5 +1,3 @@ -@import 'themes.scss'; - * { box-sizing: border-box; } @@ -24,18 +22,15 @@ body { } ::-webkit-scrollbar-thumb { - @include themify($themes) { - background: themed('scrollBarThumb'); - border: solid 2px themed('textColorOpposite'); - } + background: var(--color-scroll-bar-thumb); + border: solid 2px var(--color-text-opposite); + &:hover { background: $color-light-45; } } ::-webkit-scrollbar-track { - @include themify($themes) { - background: themed('scrollBarTrack'); - } + background: var(--color-scroll-bar-track); } audio { diff --git a/stylesheets/_index.scss b/stylesheets/_index.scss index 09094cb462..2f249cc30b 100644 --- a/stylesheets/_index.scss +++ b/stylesheets/_index.scss @@ -1,10 +1,12 @@ .inbox { height: 100%; overflow: hidden; + transition: none; } .inbox.index { display: flex; + background-color: var(--color-inbox-background); } .edit-profile-dialog, diff --git a/stylesheets/_mentions.scss b/stylesheets/_mentions.scss index 8a8874b334..7eb0d2c306 100644 --- a/stylesheets/_mentions.scss +++ b/stylesheets/_mentions.scss @@ -38,10 +38,9 @@ } .member-item { - @include themify($themes) { - background-color: themed('cellBackground'); - color: themed('textColor'); - } + background-color: var(--color-cell-background); + color: var(--color-text); + padding: 4px; white-space: nowrap; @@ -77,9 +76,8 @@ } .at-symbol { - @include themify($themes) { - background-color: themed('accent'); - } + background-color: var(--color-accent); + color: $color-black; text-align: center; margin-top: 0px; diff --git a/stylesheets/_modal.scss b/stylesheets/_modal.scss index 22b7b2d547..6d15be954b 100644 --- a/stylesheets/_modal.scss +++ b/stylesheets/_modal.scss @@ -187,11 +187,9 @@ } input { - @include themify($themes) { - background-color: themed('inputBackground'); - color: themed('textColor'); - border: themed('sessionBorder'); - } + background-color: var(--color-input-background); + color: var(--color-text); + border: var(--border-session); } } @@ -218,9 +216,7 @@ position: relative; .module-avatar { - @include themify($themes) { - box-shadow: 0px 0px 13px 0.5px themed('sessionShadowColor'); - } + box-shadow: 0px 0px 13px 0.5px var(--color-session-shadow); } .qr-view-button { @@ -264,9 +260,8 @@ padding: 0px $session-margin-lg; font-family: $session-font-default; font-weight: 100; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-size: $session-font-md; padding: 0px $session-margin-sm; } @@ -286,11 +281,9 @@ border-radius: 5px; text-align: center; font-size: $session-font-md; - @include themify($themes) { - background: themed('inputBackground'); - color: themed('textColor'); - border: themed('sessionBorder'); - } + background: var(--color-input-background); + color: var(--color-text); + border: var(--border-session); } &-uneditable { diff --git a/stylesheets/_modules.scss b/stylesheets/_modules.scss index 677e429abd..fb064e875c 100644 --- a/stylesheets/_modules.scss +++ b/stylesheets/_modules.scss @@ -41,28 +41,6 @@ // Module: Message -.module-message--expired { - animation: module-message__shake 0.2s linear infinite; -} - -@keyframes module-message__shake { - 0% { - transform: translateX(0px); - } - 25% { - transform: translateX(-5px); - } - 50% { - transform: translateX(0px); - } - 75% { - transform: translateX(5px); - } - 100% { - transform: translateX(0px); - } -} - .module-message__error-container { width: 28px; position: relative; @@ -184,9 +162,7 @@ .module-message__generic-attachment__file-size--incoming, .module-message__generic-attachment__file-size--outgoing, .module-message__generic-attachment__file-name--incoming { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); } .module-message__generic-attachment__file-size { @@ -386,10 +362,9 @@ .module-group-notification__change, .module-timer-notification__message { - @include themify($themes) { - background: themed('fakeChatBubbleBackground'); - color: themed('textColor'); - } + background: var(--color-fake-chat-bubble-background); + color: var(--color-text); + width: 90%; max-width: 700px; margin: 10px auto; @@ -558,9 +533,7 @@ font-size: 16px; line-height: 24px; font-weight: 300; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); // width of avatar (28px) and our 6px left margin max-width: calc(100% - 34px); @@ -633,12 +606,6 @@ padding-inline-end: 5px; } -.module-message-detail__unix-timestamp { - @include themify($themes) { - color: subtle(themed('textColor')); - } -} - .module-message-detail__delete-button-container { text-align: center; margin-top: 10px; @@ -889,9 +856,7 @@ } &--is-blocked { - @include themify($themes) { - border-left: 4px solid themed('destructive') !important; - } + border-left: 4px solid var(--color-destructive) !important; } } @@ -961,7 +926,6 @@ display: flex; flex-direction: row; align-items: center; - margin-top: 5px; } .module-conversation-list-item__message__text { @@ -977,6 +941,9 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; + .text-selectable { + user-select: none; + } } .module-conversation-list-item__message__text--has-unread { @@ -1437,19 +1404,18 @@ display: flex; input::placeholder { - color: rgba($black, 0.6); + color: rgba(black, 0.6); } .session-input-with-label-container { - @include themify($themes) { - background-color: #fcfcfc; - color: $black; - } + background-color: #fcfcfc; + color: black; + width: 30vw; border-radius: 100px; #session-input-floating-label { padding: $session-margin-sm; - color: $black; + color: black; } label.session-input-with-label-container.filled { @@ -1524,9 +1490,8 @@ align-items: center; } .module-staged-link-preview__loading { - @include themify($themes) { - color: themed('sentMessageText'); - } + color: var(--color-sent-message-text); + font-size: 14px; text-align: center; flex-grow: 1; @@ -1597,9 +1562,7 @@ top: 0; left: 0; - @include themify($themes) { - @include color-svg('../images/spinner-56.svg', themed('textColor')); - } + @include color-svg('../images/spinner-56.svg', var(--color-text)); z-index: 3; height: 56px; @@ -1658,15 +1621,11 @@ } .module-spinner__circle--incoming { - @include themify($themes) { - background-color: rgba(themed('receivedMessageText'), 0.2); - } + background-color: rgba(var(--color-received-message-text), 0.2); } .module-spinner__circle--outgoing { - @include themify($themes) { - background-color: rgba(themed('sentMessageText'), 0.2); - } + background-color: rgba(var(--color-sent-message-text), 0.2); } // Module: Highlighted Message Body diff --git a/stylesheets/_quote.scss b/stylesheets/_quote.scss index deb769f76b..369d765688 100644 --- a/stylesheets/_quote.scss +++ b/stylesheets/_quote.scss @@ -11,49 +11,7 @@ border-left-style: solid; &__primary__type-label { - @include themify($themes) { - border-color: themed('textColor'); - } - } -} - -// This is related to the bottomBar quote&mention logic -.bottom-bar .module-quote { - margin: 0; - border-left-style: none; - @include themify($themes) { - background: themed('quoteBottomBarBackground'); - } - - .module-quote__primary__author { - @include themify($themes) { - color: themed('textColor'); - } - } - .module-quote__primary__text { - @include themify($themes) { - color: themed('textColor'); - } - a { - @include themify($themes) { - color: themed('textColor'); - } - } - } - - // close button when quoting a message - &__close { - &-container { - @include themify($themes) { - background: themed('backgroundPrimary'); - } - } - - &-button { - @include themify($themes) { - @include color-svg('../images/x.svg', themed('foregroundPrimary')); - } - } + border-color: var(--color-text); } } @@ -61,38 +19,28 @@ .module-quote { &--outgoing { .module-quote__primary__author { - @include themify($themes) { - color: themed('sentMessageText'); - font-weight: bold; - } + color: var(--color-sent-message-text); + font-weight: bold; } .module-quote__primary__text { - @include themify($themes) { - color: themed('sentMessageText'); - } + color: var(--color-sent-message-text); + a { - @include themify($themes) { - color: themed('sentMessageText'); - } + color: var(--color-sent-message-text); } } } &--incoming { .module-quote__primary__author { - @include themify($themes) { - color: themed('receivedMessageText'); - font-weight: bold; - } + color: var(--color-received-message-text); + font-weight: bold; } .module-quote__primary__text { - @include themify($themes) { - color: themed('receivedMessageText'); - } + color: var(--color-received-message-text); + a { - @include themify($themes) { - color: themed('receivedMessageText'); - } + color: var(--color-received-message-text); } } } @@ -322,18 +270,6 @@ } } -.bottom-bar .member-item { - @include themify($themes) { - border-bottom: themed('sessionBorder'); - } - - &:hover { - @include themify($themes) { - background: themed('clickableHovered'); - } - } -} - // animate when user is scrolling to a quoted message @keyframes blinker { 0% { diff --git a/stylesheets/_session.scss b/stylesheets/_session.scss index 0a7ca425f5..7e93905a3c 100644 --- a/stylesheets/_session.scss +++ b/stylesheets/_session.scss @@ -1,3 +1,5 @@ +$onionPathLineColor: rgba(#7a7a7a, 0.6); + .subtle { opacity: $session-subtle-factor; } @@ -24,9 +26,7 @@ input, textarea { - @include themify($themes) { - caret-color: themed('textColor') !important; - } + caret-color: var(--color-text) !important; } * { @@ -38,9 +38,7 @@ textarea { user-select: text; &::selection { - @include themify($themes) { - background: themed('textHighlight'); - } + background: var(--color-text-highlight); } } } @@ -98,14 +96,10 @@ textarea { &.default, &.square, &.brand { - @include themify($themes) { - color: themed('foregroundPrimary'); - } + color: var(--color-foreground-primary); &:not(.disabled):hover { - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); } &.green, @@ -121,25 +115,19 @@ textarea { } &.green { - @include themify($themes) { - background-color: themed('accentButton'); - } + background-color: var(--color-accent-button); + color: var(--color-text-opposite); } &.white { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); } &.primary { - @include themify($themes) { - background-color: themed('backgroundPrimary'); - } + background-color: var(--color-background-primary); + color: white; .session-icon { - @include themify($themes) { - fill: themed('foregroundPrimary'); - } + fill: var(--color-foreground-primary); } } &.secondary { @@ -165,12 +153,10 @@ textarea { border: none; &.green { - @include themify($themes) { - @include transparent-background(themed('buttonGreen')); - } + @include transparent-background(var(--color-button-green)); } &.white { - @include transparent-background($session-color-white); + @include transparent-background(var(--color-text)); } &.primary { @include transparent-background($session-color-primary); @@ -210,10 +196,8 @@ textarea { border-radius: 500px; &:not(.disabled):hover { - @include themify($themes) { - color: themed('textColor'); - border-color: themed('textColor'); - } + color: var(--color-text); + border-color: var(--color-text); } } @@ -292,9 +276,7 @@ textarea { font-size: $session-font-md; &-text { - @include themify($themes) { - @include session-color-subtle(themed('textColor')); - } + @include session-color-subtle(var(--color-text)); font-family: $session-font-default; font-weight: 300; @@ -354,16 +336,19 @@ label { // Entirely to ensure that images are centered if they aren't full width of bubble text-align: center; position: relative; - - border-radius: $session_message-container-border-radius; overflow: hidden; - // no background by default for the attachment container -} -.module-message__attachment-container { border-top-left-radius: $session_message-container-border-radius; - border-top-right-radius: $session_message-container-border-radius; border-bottom-left-radius: $session_message-container-border-radius; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} + +.module-message__container--outgoing--first-of-series { + border-top-right-radius: $session_message-container-border-radius; +} + +.module-message__container--outgoing--last-of-series { border-bottom-right-radius: $session_message-container-border-radius; } @@ -386,12 +371,6 @@ label { position: relative; } -.module-left-pane-overlay { - h3 { - margin-bottom: 6px; - } -} - .hidden { display: none; visibility: hidden; @@ -402,14 +381,11 @@ label { } .Toastify__toast { - @include themify($themes) { - background: rgba(themed('cellBackground'), 0.99); - color: themed('textColor'); - } + background: var(--color-cell-background); + color: var(--color-text); + .Toastify__close-button { - @include themify($themes) { - color: subtle(themed('textColor')); - } + color: subtle(var(--color-text)); } @mixin set-toast-theme($color) { border-left: 4px solid $color; @@ -428,9 +404,7 @@ label { } .Toastify__progress-bar { - @include themify($themes) { - background-color: rgba(themed('textColor'), 0.1); - } + background-color: rgba(var(--color-text), 0.1); } } @@ -442,12 +416,11 @@ label { max-height: 70vh; max-width: calc(min(70vw, 800px)); font-family: $session-font-default; - @include themify($themes) { - background-color: themed('modalBackground'); - color: themed('textColor'); - border: themed('sessionBorder'); - box-shadow: themed('sessionShadow'); - } + background-color: var(--color-modal-background); + color: var(--color-text); + border: var(--border-session); + box-shadow: var(--color-session-shadow); + overflow: hidden; display: flex; flex-direction: column; @@ -539,6 +512,10 @@ label { &__center { display: flex; justify-content: center; + + .session-button { + margin: $session-margin-xs; + } } } @@ -553,18 +530,6 @@ label { } } -.device-pairing-dialog { - &__desc { - font-weight: 300; - font-size: $session-font-sm; - margin-bottom: $session-margin-lg; - } - - &__secret-words { - margin-bottom: $session-margin-md; - } -} - .session-modal__body { display: flex; flex-direction: column; @@ -627,27 +592,20 @@ label { z-index: 30; min-width: 200px; box-shadow: 0 10px 16px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) !important; - @include themify($themes) { - background: themed('cellBackground'); - } + background: var(--color-cell-background); + .react-contexify__item { - @include themify($themes) { - background: themed('cellBackground'); - } + background: var(--color-cell-background); } .react-contexify__item:not(.react-contexify__item--disabled):hover > .react-contexify__item__content { - @include themify($themes) { - background: themed('accent'); - color: themed('textColorOpposite'); - } + background: var(--color-accent); + color: var(--color-text-opposite); } .react-contexify__item__content { transition: $session-transition-duration; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); } &.react-contexify__submenu { @@ -672,15 +630,11 @@ label { padding: 0px $session-margin-md; font-size: $session-font-sm; - @include themify($themes) { - color: themed('textColor'); - background: themed('cellBackground'); - } + color: var(--color-text); + background: var(--color-cell-background); &:hover { - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); } } @@ -705,29 +659,22 @@ label { justify-content: center; height: 35px; padding: 0 $session-margin-md; - @include themify($themes) { - background: themed('cellBackground'); - color: themed('textColor'); - } + background: var(--color-cell-background); + color: var(--color-text); + font-size: 0.8rem; width: -webkit-fill-available; transition: $session-transition-duration; &:first-child { - @include themify($themes) { - border-top: themed('sessionBorder'); - } + border-top: var(--border-session); } &:last-child { - @include themify($themes) { - border-top: themed('sessionBorder'); - } + border-top: var(--border-session); } &:hover { - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); } .session-icon { @@ -739,9 +686,7 @@ label { &.active, &:hover { - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); } &.danger { @@ -750,9 +695,8 @@ label { } &:hover { - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); + .session-icon { opacity: 1; } @@ -880,9 +824,8 @@ label { justify-content: center; align-items: center; height: $main-view-header-height; - @include themify($themes) { - background: themed('cellBackground'); - } + background: var(--color-cell-background); + &-title { line-height: $main-view-header-height; font-weight: bold; @@ -902,11 +845,10 @@ label { padding: $session-margin-lg; margin-bottom: 20px; - @include themify($themes) { - background: themed('cellBackground'); - color: themed('textColor'); - border-bottom: themed('sessionBorder'); - } + background: var(--color-cell-background); + color: var(--color-text); + border-bottom: var(--border-session); + &.inline { display: flex; align-items: center; @@ -928,16 +870,12 @@ label { font-size: $session-font-sm; font-weight: 100; max-width: 700px; - @include themify($themes) { - @include session-color-subtle(themed('textColor')); - } + @include session-color-subtle(var(--color-text)); } &__content { label { - @include themify($themes) { - @include session-color-subtle(themed('textColor')); - } + @include session-color-subtle(var(--color-text)); } } &__selection { @@ -988,10 +926,9 @@ label { max-width: 90%; width: 600px; - @include themify($themes) { - background: themed('composeViewBackground'); - color: themed('textColor'); - } + background: var(--color-cell-background); + color: var(--color-text); + border: 1px solid $session-shade-8; border-radius: 5px; @@ -1002,10 +939,9 @@ label { input { width: 100%; - @include themify($themes) { - background: themed('inputBackground'); - color: themed('textColor'); - } + background: var(--color-input-background); + color: var(--color-text); + padding: $session-margin-xs $session-margin-md; margin-bottom: $session-margin-lg; outline: none; @@ -1039,50 +975,6 @@ label { transition: $session-transition-duration !important; } -.bottom-bar { - .compose { - max-height: 200px; - } - - .send-message-container { - display: flex; - flex-grow: 1; - height: 48px; - margin-bottom: -5px; - } - - textarea.send-message { - @include themify($themes) { - background: themed('composeViewBackground'); - color: themed('textColor'); - } - border: none; - margin: 0px; - padding: 0px $session-margin-lg; - font-size: $session-font-md; - line-height: 1.3em; - align-self: center; - } -} - -.bottom-bar form { - &.send { - @include themify($themes) { - background: themed('composeViewBackground'); - } - } - - &.active textarea { - border: none; - } -} - -.dark-theme .bottom-bar .send-message[disabled='disabled'] { - @include themify($themes) { - background: themed('composeViewBackground'); - } -} - .session-radio-group fieldset { border: none; margin-inline-start: $session-margin-sm; @@ -1111,24 +1003,19 @@ label { vertical-align: 0px; border: 2px solid rgba($session-color-white, 0.6); padding: 0.2em; - @include themify($themes) { - background: none; - border-color: themed('accent'); - } + background: none; + border-color: var(--color-accent); + background-clip: content-box; transition: $session-transition-duration; } input:hover + label:before { - @include themify($themes) { - background: themed('accent'); - } + background: var(--color-accent); } input:checked + label:before { - @include themify($themes) { - background: themed('accent'); - } + background: var(--color-accent); } } @@ -1163,9 +1050,8 @@ input { .dark-theme .invite-friends-dialog .member-item { height: 64px; background-color: $session-shade-4; - @include themify($themes) { - border: themed('sessionBorder'); - } + border: var(--border-session); + display: flex; align-items: center; transition: $session-transition-duration; @@ -1273,16 +1159,13 @@ input { width: 40px; border-radius: 50%; opacity: 1; - @include themify($themes) { - background-color: themed('cellBackground'); - box-shadow: themed('sessionShadow'); - } + background-color: var(--color-cell-background); + box-shadow: var(--color-session-shadow); + svg path { transition: $session-transition-duration; opacity: 0.6; - @include themify($themes) { - fill: themed('textColor'); - } + fill: var(--color-text); } &:hover svg path { @@ -1297,9 +1180,7 @@ input { width: 100%; max-height: 400px; overflow-y: auto; - @include themify($themes) { - border: themed('sessionBorder'); - } + border: var(--border-session); } &__selection { @@ -1310,9 +1191,8 @@ input { &__no-contacts { font-family: $session-font-mono; - @include themify($themes) { - background: themed('cellBackground'); - } + background: var(--color-cell-background); + text-align: center; padding: 20px; } @@ -1344,26 +1224,18 @@ input { display: flex; justify-content: space-between; transition: $session-transition-duration; - @include themify($themes) { - background: themed('cellBackground'); - } + background: var(--color-cell-background); &:not(:last-child) { - @include themify($themes) { - border-bottom: themed('sessionBorder'); - } + border-bottom: var(--border-session); } &:hover { - @include themify($themes) { - background-color: themed('clickableHovered'); - } + background-color: var(--color-clickable-hovered); } &.selected { - @include themify($themes) { - background-color: themed('conversationItemSelected') !important; - } + background-color: var(--color-conversation-item-selected) !important; } &.zombie { @@ -1377,9 +1249,7 @@ input { &.selected { opacity: 1; svg { - @include themify($themes) { - fill: themed('accent') !important; - } + fill: var(--color-accent) !important; } } } @@ -1393,6 +1263,7 @@ input { &__name { font-weight: bold; margin-inline-start: $session-margin-md; + margin-inline-end: $session-margin-md; } &__pubkey { margin-inline-start: 5px; @@ -1424,17 +1295,14 @@ input { opacity: 0.6; transition: none; &:hover { - @include themify($themes) { - opacity: 1; - } + opacity: 1; } + .session-button { transition: none; &:hover { - @include themify($themes) { - color: themed('textColorOpposite'); - } + color: var(--color-text-opposite); } } } diff --git a/stylesheets/_session_constants.scss b/stylesheets/_session_constants.scss index e8ed120d12..c9c4f479ad 100644 --- a/stylesheets/_session_constants.scss +++ b/stylesheets/_session_constants.scss @@ -187,7 +187,6 @@ $session-subtle-factor: 0.6; // Default Components $session-search-input-height: 34px; $main-view-header-height: 63px; -$session-conversation-header-height: 60px; $session-left-pane-width: 300px; // Various Components @@ -205,7 +204,6 @@ $session-margin-lg: 20px; // Animations $session-transition-duration: 0.25s; -$session-fadein-duration: 0.1s; @keyframes fadein { from { diff --git a/stylesheets/_session_conversation.scss b/stylesheets/_session_conversation.scss index 1d740139ef..f92a039a62 100644 --- a/stylesheets/_session_conversation.scss +++ b/stylesheets/_session_conversation.scss @@ -63,9 +63,7 @@ align-items: center; justify-content: space-between; height: $main-view-header-height; - @include themify($themes) { - background: themed('cellBackground'); - } + background: var(--color-cell-background); .close-button { float: left; @@ -115,10 +113,8 @@ outline: none; position: relative; - @include themify($themes) { - border-left: themed('sessionBorder'); - border-top: themed('sessionBorder'); - } + border-left: var(--border-session); + border-top: var(--border-session); &__blocking-overlay { background-color: rgba(0, 0, 0, 0.8); @@ -144,9 +140,7 @@ &.show { display: flex; - @include themify($themes) { - background: themed('inboxBackground'); - } + background: var(--color-inbox-background); } } } @@ -168,10 +162,8 @@ align-items: center; padding: 0px $session-margin-md; min-height: min-content; - @include themify($themes) { - background: themed('composeViewBackground'); - border-top: themed('sessionBorder'); - } + background: var(--color-cell-background); + border-top: var(--border-session); .session-icon-button { // & > .session-icon-button { @@ -210,9 +202,8 @@ min-height: $composition-container-height / 3; max-height: 3 * $composition-container-height; margin-right: $session-margin-md; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + background: transparent; resize: none; display: flex; @@ -507,9 +498,7 @@ $rhap_font-family: inherit !default; } .rhap_volume-button { - @include themify($themes) { - color: subtle(themed('textColor')); - } + color: subtle(var(--color-text)); } .rhap_volume-container div[role='progressbar'] { @@ -517,9 +506,8 @@ $rhap_font-family: inherit !default; } .rhap_time { - @include themify($themes) { - color: subtle(themed('textColor')); - } + color: subtle(var(--color-text)); + font-size: 12px; } @@ -529,35 +517,23 @@ $rhap_font-family: inherit !default; z-index: 0; width: 100%; height: 5px; - @include themify($themes) { - background-color: rgba(themed('textColor'), 0.3); - } + background-color: var(--color-text); + border-radius: 2px; } .rhap_progress-filled { - @include themify($themes) { - background-color: rgba(themed('accent'), 0.6); - } - padding-left: 5px; -} + background-color: rgba(var(--color-accent), 0.6); -// special case for light theme, outgoing message (accent color on accent color background is not readable) -.light-theme .module-message--outgoing { - .rhap_progress-filled { - @include themify($themes) { - background-color: rgba(themed('textColor'), 0.6); - } - } + padding-left: 5px; } .rhap_download-progress { height: 100%; position: absolute; z-index: 1; - @include themify($themes) { - background-color: subtle(themed('textColor')); - } + background-color: subtle(var(--color-text)); + border-radius: 2px; } diff --git a/stylesheets/_session_group_panel.scss b/stylesheets/_session_group_panel.scss index dbb1dff784..8f41638067 100644 --- a/stylesheets/_session_group_panel.scss +++ b/stylesheets/_session_group_panel.scss @@ -3,11 +3,9 @@ flex-direction: column; height: 100vh; width: -webkit-fill-available; + background: var(--color-cell-background); + border-left: var(--border-session); - @include themify($themes) { - background: themed('leftpaneOverlayBackground'); - border-left: themed('sessionBorder'); - } align-items: center; &-header { @@ -32,11 +30,10 @@ margin: $session-margin-md 0; min-height: 4rem; width: inherit; - @include themify($themes) { - color: themed('textColor'); - background: themed('cellBackground'); - border: themed('sessionBorder'); - } + color: var(--color-text); + background: var(--color-cell-background); + border: var(--border-session); + text-align: center; display: none; } @@ -46,21 +43,18 @@ align-items: center; min-height: 3rem; font-size: 0.8rem; - @include themify($themes) { - color: themed('textColor'); - background: themed('cellBackground'); - border-top: themed('sessionBorder'); - border-bottom: themed('sessionBorder'); - } + color: var(--color-text); + background: var(--color-cell-background); + border-top: var(--border-session); + border-bottom: var(--border-session); + width: -webkit-fill-available; padding: 0 $session-margin-md; transition: $session-transition-duration; cursor: pointer; &:hover { - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); } } @@ -77,10 +71,8 @@ height: $composition-container-height; flex-shrink: 0; align-items: center; - @include themify($themes) { - border: none; - border-top: themed('sessionBorder'); - } + border: none; + border-top: var(--border-session); } .module-empty-state { @@ -106,9 +98,8 @@ } &__tab { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-weight: bold; font-size: 0.9rem; padding: 0.6rem; @@ -124,9 +115,7 @@ margin: 0 auto; width: 70%; padding-top: 0.5rem; - @include themify($themes) { - border-bottom: themed('sessionUnreadBorder'); - } + border-bottom: var(--border-unread); } } } diff --git a/stylesheets/_session_left_pane.scss b/stylesheets/_session_left_pane.scss index 1ec1780ed6..ade13d4d47 100644 --- a/stylesheets/_session_left_pane.scss +++ b/stylesheets/_session_left_pane.scss @@ -2,11 +2,8 @@ $session-compose-margin: 20px; .gutter { width: 380px !important; - transition: $session-transition-duration; - - @include themify($themes) { - background: themed('cellBackground'); - } + transition: none; + background: var(--color-cell-background); } .module-conversation { @@ -17,9 +14,7 @@ $session-compose-margin: 20px; font-weight: bold; font-size: 15px; - @include themify($themes) { - color: themed('textColorSubtle'); - } + color: var(--color-text-subtle); } } @@ -27,37 +22,27 @@ $session-compose-margin: 20px; transition: $session-transition-duration; &:hover { - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); } &--is-selected { - @include themify($themes) { - background: themed('conversationItemSelected'); - } + background: var(--color-conversation-item-selected); .module-conversation__user__profile-number, .module-conversation__user__profile-name, .module-conversation-list-item__message__text { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); } } &--has-unread { - @include themify($themes) { - border-left: themed('sessionUnreadBorder'); - background: themed('conversationItemHasUnread'); - } + border-left: var(--border-unread); + background: var(--color-conversation-item-has-unread); } &__unread-count { - @include themify($themes) { - color: themed('textColor'); - background: themed('clickableHovered'); - } + color: var(--color-text); + background: var(--color-clickable-hovered); position: static !important; font-weight: 700 !important; @@ -75,9 +60,7 @@ $session-compose-margin: 20px; &__message__text { color: $session-shade-17; &--has-unread { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); } } @@ -88,9 +71,7 @@ $session-compose-margin: 20px; &__header__name--with-unread .module-conversation__user__profile-number, &__header__name--with-unread .module-conversation__user__profile-name { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); } } } @@ -114,9 +95,7 @@ $session-compose-margin: 20px; display: inline-flex; flex-direction: column; - @include themify($themes) { - border-right: themed('sessionBorder'); - } + border-right: var(--border-session); .module-avatar, .session-icon-button { @@ -162,7 +141,6 @@ $session-compose-margin: 20px; } &__title { - cursor: pointer; padding-inline-end: $session-margin-sm; padding-inline-start: $session-margin-sm; transition: $session-transition-duration; @@ -180,9 +158,8 @@ $session-compose-margin: 20px; } &-overlay { - @include themify($themes) { - background: themed('leftpaneOverlayBackground'); - } + background: var(--color-left-pane-overlay-background); + display: flex; flex-direction: column; flex-grow: 1; @@ -197,7 +174,6 @@ $session-compose-margin: 20px; h2 { margin-top: 0px; } - h3, h2 { text-align: center; @@ -206,13 +182,13 @@ $session-compose-margin: 20px; h3 { padding-top: 22px; position: relative; + margin-bottom: 6px; .green-border { position: absolute; - @include themify($themes) { - color: themed('accent'); - background-color: themed('accent'); - } + color: var(--color-accent); + background-color: var(--color-accent); + height: 5px; left: -10px; right: -10px; @@ -284,11 +260,9 @@ $session-compose-margin: 20px; display: flex; flex-direction: column; flex-grow: 1; - transition: $session-transition-duration; + transition: none; - @include themify($themes) { - background: themed('conversationList'); - } + background: var(--color-conversation-list); .left-pane-contact-bottom-buttons .session-button { vertical-align: middle; @@ -332,9 +306,8 @@ $session-compose-margin: 20px; font-family: $session-font-default; text-overflow: ellipsis; background: none; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + &:focus { outline: none !important; } @@ -364,9 +337,8 @@ $session-compose-margin: 20px; .session-text-logo { margin-top: 10px; width: 250px; - @include themify($themes) { - filter: themed('filterSessionText'); - } + filter: var(--filter-session-text); + transition: 0s; .path { fill: red; @@ -386,47 +358,7 @@ $session-compose-margin: 20px; flex-grow: 1; height: $composition-container-height; - @include themify($themes) { - border: themed('sessionBorder'); - } - } -} - -.contacts-dropdown { - width: -webkit-fill-available; - - &-row { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - padding: 8px 20px; - margin: 0px $session-compose-margin; - - // FIXME themify once this component is enabled back - // @at-root .light-theme #{&} { - // background: $session-shade-15; - // color: $session-color-black; - // } - // @at-root .dark-theme #{&} { - // background: $session-shade-4; - // color: $session-color-light-grey; - // } - - &-selected, - &:hover { - font-weight: bold; - - // FIXME themify once this component is enabled back - - // @at-root .light-theme #{&} { - // color: $session-color-black; - // background: $session-color-white; - // } - // @at-root .dark-theme #{&} { - // color: $session-color-white; - // background: $session-shade-8; - // } - } + border: var(--border-session); } } @@ -503,15 +435,11 @@ $session-compose-margin: 20px; } &.active { - @include themify($themes) { - background: themed('conversationItemSelected'); - } + background: var(--color-conversation-item-selected); } &:hover { - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); } &__buttons { @@ -568,9 +496,8 @@ $session-compose-margin: 20px; margin: 50px 0 50px; .panel-text-divider-line { - @include themify($themes) { - border-bottom: 1px solid themed('pillDividerColor'); - } + border-bottom: 1px solid var(--color-pill-divider); + line-height: 0.1em; flex-grow: 1; height: 1px; @@ -580,10 +507,9 @@ $session-compose-margin: 20px; span { padding: 5px 10px; border-radius: 50px; - @include themify($themes) { - color: themed('pillDividerTextColor'); - border: 1px solid themed('pillDividerColor'); - } + color: var(--color-pill-divider-text); + border: 1px solid var(--color-pill-divider); + font-family: $session-font-default; font-size: $session-font-sm; } diff --git a/stylesheets/_session_signin.scss b/stylesheets/_session_signin.scss index 12fe807b16..c24fc27eac 100644 --- a/stylesheets/_session_signin.scss +++ b/stylesheets/_session_signin.scss @@ -1,33 +1,17 @@ .session { - &-fullscreen { - @include themify($themes) { - background: themed('cellBackground'); - } - overflow-y: auto; - height: 100%; - } - &-content { - width: 100%; - height: 100%; - display: flex; - align-items: center; - flex-direction: column; + background-color: #f9f9f9; + .session-button.brand-outline.brand.green:hover { + background-color: var(--color-accent); + } &-accent { - flex-grow: 1; - padding-inline-start: 20px; - &-text { - @include themify($themes) { - color: themed('textColor'); - } font-family: $session-font-accent; - .title { - font-size: 100px; + font-size: 90px; font-weight: 700; - line-height: 120px; + line-height: 100px; } } } @@ -52,17 +36,6 @@ width: 100%; padding-bottom: 20px; } - - &-close-button { - display: flex; - align-items: center; - } - - &-session-button { - img { - width: 30px; - } - } } &-registration { @@ -79,75 +52,11 @@ &__content { width: 100%; padding-top: 20px; - - &__secret-words { - display: flex; - flex-direction: column; - align-items: center; - @include themify($themes) { - background: themed('inputBackground'); - } - padding: $session-margin-sm $session-margin-lg; - border-radius: 8px; - - label { - margin-bottom: 5px; - } - } - - & .or { - text-align: center; - } - } - - &__sections { - display: flex; - flex-grow: 1; - flex-direction: column; - } - - &__tab-container { - display: flex; - flex-grow: 0; - flex-shrink: 0; - cursor: pointer; - width: 289px; - height: 30px; - left: 0; - right: 0; - - margin-inline-start: auto; - margin-inline-end: auto; - @include themify($themes) { - background: themed('cellBackground'); - } - } - - &__tab { - @include fontAccentBold(); - width: 100%; - padding-bottom: 10px; - background-color: transparent; - text-align: center; - @include themify($themes) { - border-bottom: themed('sessionBorder'); - color: themed('textColor'); - } - transition: border-color $session-transition-duration linear; - line-height: 17px; - font-size: 15px; - - &--active { - @include themify($themes) { - border-bottom: 4px solid themed('accent'); - } - } } @mixin registration-label-mixin { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-weight: bold; padding: 20px; } @@ -163,7 +72,6 @@ &__unique-session-id { @include registration-label-mixin; - padding-top: 1em; text-align: center; } @@ -181,9 +89,8 @@ height: 46.5px; width: 280px; font-family: $session-font-default; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + padding: 2px 0 2px 0; transition: opacity $session-transition-duration; opacity: 1; @@ -192,9 +99,8 @@ label { line-height: 14px; opacity: 0; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-size: 10px; line-height: 11px; position: absolute; @@ -206,9 +112,7 @@ } &.error { - @include themify($themes) { - color: themed('destructive'); - } + color: var(--color-destructive); } input { @@ -217,9 +121,8 @@ height: 14px; width: 280px; background: transparent; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-family: $session-font-default; font-size: 12px; line-height: 14px; @@ -229,9 +132,8 @@ } hr { - @include themify($themes) { - border: themed('sessionBorder'); - } + border: var(--border-session); + width: 100%; position: absolute; bottom: 0px; @@ -247,9 +149,8 @@ &-terms-conditions-agreement { padding-top: $session-margin-md; - @include themify($themes) { - @include session-color-subtle(themed('textColor')); - } + @include session-color-subtle(var(--color-text)); + text-align: center; font-size: 12px; @@ -257,32 +158,25 @@ white-space: nowrap; font-weight: bold; text-decoration: none; - @include themify($themes) { - @include session-color-subtle(themed('textColor')); - } + @include session-color-subtle(var(--color-text)); + transition: $session-transition-duration; &:visited &:link { - @include themify($themes) { - @include session-color-subtle(themed('textColor')); - } + @include session-color-subtle(var(--color-text)); } &:hover { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); } } } - &-description-long, - &-signin-device-pairing-header { + &-description-long { padding-top: 0; padding-bottom: 20px; - @include themify($themes) { - @include session-color-subtle(themed('textColor')); - } + @include session-color-subtle(var(--color-text)); + text-align: center; font-size: 12px; line-height: 20px; @@ -308,9 +202,8 @@ outline: 0; border: none; background: transparent; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-size: 15px; line-height: 18px; text-align: center; @@ -327,12 +220,7 @@ [contenteditable='true']:empty::before { content: attr(placeholder); - @include themify($themes) { - @include session-color-subtle(themed('textColor')); - } - font-size: 13px; -} + @include session-color-subtle(var(--color-text)); -.registration-content-centered { - text-align: center; + font-size: 13px; } diff --git a/stylesheets/_session_slider.scss b/stylesheets/_session_slider.scss index bac8d767c5..16874e28ee 100644 --- a/stylesheets/_session_slider.scss +++ b/stylesheets/_session_slider.scss @@ -34,9 +34,8 @@ .rc-slider-rail { position: absolute; width: 100%; - @include themify($themes) { - background: themed('inputBackground'); - } + background: var(--color-clickable-hovered); + height: 8px; border-radius: 6px; margin: 0px 0px 0px -1px; @@ -106,9 +105,8 @@ margin-left: -4px; width: 3px; height: 6px; - @include themify($themes) { - background: themed('clickableHovered'); - } + background: var(--color-clickable-hovered); + cursor: pointer; border-radius: 2px; vertical-align: middle; diff --git a/stylesheets/_session_theme.scss b/stylesheets/_session_theme.scss index 1bd823702c..8cfdf4accf 100644 --- a/stylesheets/_session_theme.scss +++ b/stylesheets/_session_theme.scss @@ -1,22 +1,9 @@ // Messages -@import 'themes.scss'; - -// body.dark-theme { -// @include themify($themes) { -// background-color: themed('cellBackground'); -// } -// color: red; - -// background-color: blue -// } - .conversation { background: none !important; } .module-conversation-header { - @include themify($themes) { - background: themed('cellBackground'); - } + background: var(--color-cell-background); } .module-message { @@ -45,9 +32,7 @@ &__container--incoming { &--opaque { - @include themify($themes) { - background: themed('receivedMessageBackground'); - } + background: var(--color-received-message-background); } &--transparent { @@ -68,14 +53,11 @@ } .module-message__text { - @include themify($themes) { - color: themed('receivedMessageText'); - } + color: var(--color-received-message-text); + a { text-decoration: underline; - @include themify($themes) { - color: themed('receivedMessageText'); - } + color: var(--color-received-message-text); } } } @@ -87,9 +69,7 @@ border-top-right-radius: 5px; border-bottom-right-radius: 5px; &--opaque { - @include themify($themes) { - background: themed('sentMessageBackground'); - } + background: var(--color-sent-message-background); } &--transparent { @@ -105,14 +85,11 @@ } .module-message__text { - @include themify($themes) { - color: themed('sentMessageText'); - } + color: var(--color-sent-message-text); + a { text-decoration: underline; - @include themify($themes) { - color: themed('sentMessageText'); - } + color: var(--color-sent-message-text); } } } @@ -130,9 +107,7 @@ &.message-selected { .module-message { &__container { - @include themify($themes) { - box-shadow: themed('sessionShadow'); - } + box-shadow: var(--color-session-shadow); } } } @@ -143,10 +118,8 @@ } .inbox { - @include themify($themes) { - background: themed('inboxBackground'); - color: themed('textColor'); - } + background: var(--color-inbox-background); + color: var(--color-text); } .conversation { @@ -164,35 +137,30 @@ h1 { margin: 0; &.active { - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); } } h2 { @include session-h-title; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-size: 22px; text-align: center; } h3 { @include session-h-title; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-size: 18px; padding-top: 22px; } h4 { @include session-h-title; - @include themify($themes) { - color: themed('textColor'); - } + color: var(--color-text); + font-size: 17px; text-align: center; } diff --git a/stylesheets/manifest.scss b/stylesheets/manifest.scss index 451fa708a9..f9baf5c709 100644 --- a/stylesheets/manifest.scss +++ b/stylesheets/manifest.scss @@ -9,7 +9,6 @@ @import 'node_modules/sanitize.css/typography.css'; // Global Settings, Variables, and Mixins -@import 'themes.scss'; @import 'session_constants'; @import 'variables'; @import 'mixins'; diff --git a/stylesheets/themes.scss b/stylesheets/themes.scss deleted file mode 100644 index cef63de6bf..0000000000 --- a/stylesheets/themes.scss +++ /dev/null @@ -1,147 +0,0 @@ -// 13592 lines for manifest.css on date 25 august - -$white: #ffffff; -$black: #000000; -$destructive: #ff453a; -$warning: #e7b100; -$accentLightTheme: #00e97b; -$accentDarkTheme: #00f782; - -$borderLightTheme: #f1f1f1; // search for references on ts TODO: make this exposed on ts -$borderDarkTheme: rgba($white, 0.06); -$inputBackgroundColor: #8e8e93; - -$onionPathLineColor: rgba(#7a7a7a, 0.6); - -$borderAvatarColor: unquote( - '#00000059' -); // search for references on ts TODO: make this exposed on ts - -$themes: ( - light: ( - accent: $accentLightTheme, - accentButton: $black, - cellBackground: #fcfcfc, - warning: $warning, - destructive: $destructive, - modalBackground: #fcfcfc, - fakeChatBubbleBackground: #f5f5f5, - // input - inputBackground: rgba($inputBackgroundColor, 0.12), - // text - textColor: $black, - textColorSubtle: rgba($black, 0.6), - textColorOpposite: $white, - textHighlight: rgba($black, 0.2), - // inbox - inboxBackground: $white, - // buttons - backgroundPrimary: #272726, - foregroundPrimary: $white, - buttonGreen: #272726, - // conversation view - composeViewBackground: #fcfcfc, - composeViewTextFieldBackground: #ededed, - receivedMessageBackground: #f5f5f5, - sentMessageBackground: $accentLightTheme, - receivedMessageText: $black, - sentMessageText: $white, - sessionShadow: 0 0 4px 0 rgba($black, 0.37), - sessionShadowColor: rgba($black, 0.37), - // left pane - conversationList: $white, - conversationItemHasUnread: #fcfcfc, - conversationItemSelected: #f0f0f0, - clickableHovered: #dfdfdf, - sessionBorder: 1px solid $borderLightTheme, - sessionUnreadBorder: 4px solid $accentLightTheme, - leftpaneOverlayBackground: $white, - // scrollbars - scrollBarTrack: #fcfcfc, - scrollBarThumb: #474646, - // pill divider: - pillDividerColor: rgba($black, 0.1), - pillDividerTextColor: #555555, - // context menu - contextMenuBackground: #f5f5f5, - filterSessionText: brightness(0) saturate(100%), - lastSeenIndicatorColor: #62656a, - lastSeenIndicatorTextColor: #070c14, - quoteBottomBarBackground: #f0f0f0, - ), - dark: ( - accent: $accentDarkTheme, - accentButton: $accentDarkTheme, - warning: $warning, - destructive: $destructive, - cellBackground: #1b1b1b, - modalBackground: #101011, - fakeChatBubbleBackground: #212121, - // input - inputBackground: rgba($inputBackgroundColor, 0.12), - // text - textColor: $white, - textColorSubtle: rgba($white, 0.6), - textColorOpposite: $black, - textHighlight: rgba($accentDarkTheme, 0.6), - // inbox - // buttons - inboxBackground: linear-gradient(180deg, #171717 0%, #121212 100%), - backgroundPrimary: #474646, - foregroundPrimary: $white, - buttonGreen: $accentDarkTheme, - // conversation view - composeViewBackground: #1b1b1b, - composeViewTextFieldBackground: #141414, - receivedMessageBackground: #222325, - sentMessageBackground: $accentDarkTheme, - receivedMessageText: $white, - sentMessageText: $black, - sessionShadow: 0 0 4px 0 rgba($white, 0.2), - sessionShadowColor: rgba($white, 0.2), - // left pane - conversationList: #1b1b1b, - conversationItemHasUnread: #2c2c2c, - conversationItemSelected: #404040, - clickableHovered: #414347, - sessionBorder: 1px solid $borderDarkTheme, - sessionUnreadBorder: 4px solid $accentDarkTheme, - leftpaneOverlayBackground: linear-gradient(180deg, #171717 0%, #121212 100%), - // scrollbars - scrollBarTrack: #1b1b1b, - scrollBarThumb: #474646, - // pill divider: - pillDividerColor: #353535, - pillDividerTextColor: #a0a0a0, - // context menu - contextMenuBackground: #212121, - filterSessionText: none, - lastSeenIndicatorColor: #353535, - lastSeenIndicatorTextColor: #a8a9aa, - quoteBottomBarBackground: #404040, - ), -); - -@mixin themify($themes: $themes) { - @each $theme, $map in $themes { - .#{$theme}-theme & { - $theme-map: () !global; - @each $key, $submap in $map { - $value: map-get(map-get($themes, $theme), '#{$key}'); - $theme-map: map-merge( - $theme-map, - ( - $key: $value, - ) - ) !global; - } - - @content; - $theme-map: null !global; - } - } -} - -@function themed($key) { - @return map-get($theme-map, $key); -} diff --git a/ts/components/CaptionEditor.tsx b/ts/components/CaptionEditor.tsx index 3324cb7ce6..68d6eae5a6 100644 --- a/ts/components/CaptionEditor.tsx +++ b/ts/components/CaptionEditor.tsx @@ -7,7 +7,6 @@ import { AttachmentType } from '../types/Attachment'; import { SessionInput } from './session/SessionInput'; import { SessionButton, SessionButtonColor, SessionButtonType } from './session/SessionButton'; -import { darkTheme } from '../state/ducks/SessionTheme'; import autoBind from 'auto-bind'; interface Props { @@ -97,7 +96,6 @@ export class CaptionEditor extends React.Component { onValueChanged={this.onChange} onEnterPressed={this.onSave} value={caption} - theme={darkTheme} /> + ) : null; const NotificationSettingIcon = () => { @@ -102,19 +97,11 @@ const HeaderItem = (props: { return null; case 'disabled': return ( - + ); case 'mentions_only': return ( - + ); default: return null; diff --git a/ts/components/LeftPane.tsx b/ts/components/LeftPane.tsx index 934cf0346a..3d9bf780da 100644 --- a/ts/components/LeftPane.tsx +++ b/ts/components/LeftPane.tsx @@ -11,7 +11,6 @@ import { useSelector } from 'react-redux'; import { getLeftPaneLists } from '../state/selectors/conversations'; import { getQuery, getSearchResults, isSearching } from '../state/selectors/search'; import { SectionType } from '../state/ducks/section'; -import { getTheme } from '../state/selectors/theme'; // from https://github.com/bvaughn/react-virtualized/blob/fb3484ed5dcc41bffae8eab029126c0fb8f7abc0/source/List/types.js#L5 export type RowRendererParamsType = { @@ -63,10 +62,8 @@ const LeftPaneSection = () => { }; export const LeftPane = () => { - const theme = useSelector(getTheme); - return ( - +
diff --git a/ts/components/Lightbox.tsx b/ts/components/Lightbox.tsx index 241a11402c..702c03a22e 100644 --- a/ts/components/Lightbox.tsx +++ b/ts/components/Lightbox.tsx @@ -6,14 +6,12 @@ import is from '@sindresorhus/is'; import * as GoogleChrome from '../util/GoogleChrome'; import * as MIME from '../types/MIME'; -import { SessionIconButton, SessionIconSize, SessionIconType } from './session/icon'; +import { SessionIconButton, SessionIconType } from './session/icon'; import { Flex } from './basic/Flex'; -import { DefaultTheme } from 'styled-components'; // useCss has some issues on our setup. so import it directly // tslint:disable-next-line: no-submodule-imports import useUnmount from 'react-use/lib/useUnmount'; import { useEncryptedFileFetch } from '../hooks/useEncryptedFileFetch'; -import { darkTheme } from '../state/ducks/SessionTheme'; import { useDispatch } from 'react-redux'; import { showLightBox } from '../state/ducks/conversations'; @@ -132,10 +130,9 @@ interface IconButtonProps { onClick?: () => void; style?: React.CSSProperties; type: 'save' | 'close' | 'previous' | 'next'; - theme: DefaultTheme; } -const IconButton = ({ onClick, type, theme }: IconButtonProps) => { +const IconButton = ({ onClick, type }: IconButtonProps) => { const clickHandler = (_event: React.MouseEvent): void => { if (!onClick) { return; @@ -143,7 +140,7 @@ const IconButton = ({ onClick, type, theme }: IconButtonProps) => { onClick(); }; let iconRotation = 0; - let iconType = SessionIconType.Chevron; + let iconType: SessionIconType = 'chevron'; switch (type) { case 'next': iconRotation = 270; @@ -152,10 +149,10 @@ const IconButton = ({ onClick, type, theme }: IconButtonProps) => { iconRotation = 90; break; case 'close': - iconType = SessionIconType.Exit; + iconType = 'exit'; break; case 'save': - iconType = SessionIconType.Upload; + iconType = 'upload'; iconRotation = 180; break; @@ -166,12 +163,11 @@ const IconButton = ({ onClick, type, theme }: IconButtonProps) => { return ( ); }; @@ -274,8 +270,6 @@ export const LightboxObject = ({ export const Lightbox = (props: Props) => { const videoRef = useRef(null); const containerRef = useRef(null); - // there is no theme in use on the lightbox - const theme = darkTheme; const dispatch = useDispatch(); const { caption, contentType, objectURL, onNext, onPrevious, onSave } = props; @@ -320,26 +314,19 @@ export const Lightbox = (props: Props) => { onClick={() => { dispatch(showLightBox(undefined)); }} - theme={theme} /> - {onSave ? ( - - ) : null} + {onSave ? : null}
{onPrevious ? ( - - ) : ( - - )} - {onNext ? ( - + ) : ( )} + {onNext ? : }
); diff --git a/ts/components/basic/PillContainer.tsx b/ts/components/basic/PillContainer.tsx index 2e8ec5442b..c4276f3558 100644 --- a/ts/components/basic/PillContainer.tsx +++ b/ts/components/basic/PillContainer.tsx @@ -10,27 +10,6 @@ type PillContainerProps = { onMouseLeave?: () => void; }; -const StyledPillContainer = styled.div` - display: flex; - background: none; - flex-direction: 'row'; - flex-grow: 1; - flex: 1 1 40%; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - align-items: center; - padding: ${props => props.padding || ''}; - margin: ${props => props.margin || ''}; - border-radius: 300px; - cursor: pointer; - border: 1px solid ${props => props.theme.colors.pillDividerColor}; - transition: ${props => props.theme.common.animations.defaultDuration}; - &:hover { - background: ${props => props.theme.colors.clickableHovered}; - } -`; - const StyledPillContainerHoverable = styled.div` background: none; @@ -63,17 +42,13 @@ const StyledPillInner = styled.div` margin: ${props => props.margin || ''}; border-radius: 300px; cursor: pointer; - border: 1px solid ${props => props.theme.colors.pillDividerColor}; - transition: ${props => props.theme.common.animations.defaultDuration}; + border: 1px solid var(--color-pill-divider); + transition: var(--default-duration); &:hover { - background: ${props => props.theme.colors.clickableHovered}; + background: var(--color-clickable-hovered); } `; -export const PillContainer = (props: PillContainerProps) => { - return {props.children}; -}; - export const PillTooltipWrapper = (props: PillContainerProps) => { return {props.children}; }; diff --git a/ts/components/basic/Text.tsx b/ts/components/basic/Text.tsx index b84083f652..dbe082dc8a 100644 --- a/ts/components/basic/Text.tsx +++ b/ts/components/basic/Text.tsx @@ -1,28 +1,21 @@ import React from 'react'; -import styled, { DefaultTheme } from 'styled-components'; +import styled from 'styled-components'; type TextProps = { text: string; subtle?: boolean; - opposite?: boolean; maxWidth?: string; padding?: string; textAlign?: 'center'; - theme?: DefaultTheme; }; const StyledDefaultText = styled.div` - transition: ${props => props.theme.common.animations.defaultDuration}; + transition: var(--default-duration); max-width: ${props => (props.maxWidth ? props.maxWidth : '')}; padding: ${props => (props.padding ? props.padding : '')}; text-align: ${props => (props.textAlign ? props.textAlign : '')}; - font-family: ${props => props.theme.common.fonts.sessionFontDefault}; - color: ${props => - props.opposite - ? props.theme.colors.textColorOpposite - : props.subtle - ? props.theme.colors.textColorSubtle - : props.theme.colors.textColor}; + font-family: var(--font-default); + color: ${props => (props.subtle ? 'var(--color-text-subtle)' : 'var(--color-text)')}; `; export const Text = (props: TextProps) => { @@ -31,18 +24,17 @@ export const Text = (props: TextProps) => { type SpacerProps = { size: 'lg' | 'md' | 'sm' | 'xs'; - theme?: DefaultTheme; }; const SpacerStyled = styled.div` height: ${props => props.size === 'lg' - ? props.theme.common.margins.lg + ? 'var(--margins-lg)' : props.size === 'md' - ? props.theme.common.margins.md + ? 'var(--margins-nd)' : props.size === 'sm' - ? props.theme.common.margins.sm - : props.theme.common.margins.xs}; + ? 'var(--margins-sm)' + : 'var(--margins-xs)'}; `; const Spacer = (props: SpacerProps) => { @@ -66,15 +58,12 @@ export const SpacerXS = () => { type H3Props = { text: string; - opposite?: boolean; }; const StyledH3 = styled.div` - transition: ${props => props.theme.common.animations.defaultDuration}; - font-family: ${props => props.theme.common.fonts.sessionFontDefault}; - color: ${props => - props.opposite ? props.theme.colors.textColorOpposite : props.theme.colors.textColor}; - font-size: ${props => props.theme.common.fonts.md}; + transition: var(--default-duration); + font-family: var(--font-default); + font-size: var(--font-size-md); font-weight: 700; `; diff --git a/ts/components/conversation/ConversationHeader.tsx b/ts/components/conversation/ConversationHeader.tsx index cd67be6619..4a0b622c55 100644 --- a/ts/components/conversation/ConversationHeader.tsx +++ b/ts/components/conversation/ConversationHeader.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Avatar, AvatarSize } from '../Avatar'; -import { SessionIconButton, SessionIconSize, SessionIconType } from '../session/icon'; +import { SessionIconButton } from '../session/icon'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../session/SessionButton'; import { ConversationAvatar } from '../session/usingClosedConversationDetails'; @@ -84,11 +84,7 @@ const SelectionOverlay = (props: { return (
- +
@@ -118,7 +114,7 @@ const TripleDotsMenu = (props: { triggerId: string; showBackButton: boolean }) = }); }} > - +
); }; @@ -176,12 +172,7 @@ const BackButton = (props: { onGoBack: () => void; showBackButton: boolean }) => } return ( - + ); }; diff --git a/ts/components/conversation/DataExtractionNotification.tsx b/ts/components/conversation/DataExtractionNotification.tsx index 9e39722b48..f1813cef21 100644 --- a/ts/components/conversation/DataExtractionNotification.tsx +++ b/ts/components/conversation/DataExtractionNotification.tsx @@ -1,14 +1,12 @@ import React from 'react'; -import { useTheme } from 'styled-components'; import { PropsForDataExtractionNotification } from '../../models/messageType'; import { SignalService } from '../../protobuf'; import { Flex } from '../basic/Flex'; -import { SessionIcon, SessionIconSize, SessionIconType } from '../session/icon'; +import { SessionIcon } from '../session/icon'; import { SpacerXS, Text } from '../basic/Text'; import { ReadableMessage } from './ReadableMessage'; export const DataExtractionNotification = (props: PropsForDataExtractionNotification) => { - const theme = useTheme(); const { name, type, source, messageId, isUnread, receivedAt } = props; let contentText: string; @@ -29,15 +27,10 @@ export const DataExtractionNotification = (props: PropsForDataExtractionNotifica container={true} flexDirection="column" alignItems="center" - margin={theme.common.margins.sm} + margin={'var(--margins-sm)'} id={`msg-${messageId}`} > - + diff --git a/ts/components/conversation/ExpireTimer.tsx b/ts/components/conversation/ExpireTimer.tsx index 6262f49093..08e02a5232 100644 --- a/ts/components/conversation/ExpireTimer.tsx +++ b/ts/components/conversation/ExpireTimer.tsx @@ -2,8 +2,8 @@ import React, { useCallback, useState } from 'react'; import { getTimerBucketIcon } from '../../util/timer'; import { useInterval } from '../../hooks/useInterval'; -import styled, { useTheme } from 'styled-components'; -import { SessionIcon, SessionIconSize } from '../session/icon'; +import styled from 'styled-components'; +import { SessionIcon } from '../session/icon'; type Props = { expirationLength: number; @@ -30,7 +30,7 @@ const ExpireTimerBucket = styled.div` letter-spacing: 0.3px; text-transform: uppercase; user-select: none; - color: ${props => props.theme.colors.textColor}; + color: var(--color-text); `; export const ExpireTimer = (props: Props) => { @@ -38,7 +38,6 @@ export const ExpireTimer = (props: Props) => { const initialTimeLeft = Math.max(Math.round(((expirationTimestamp || 0) - Date.now()) / 1000), 0); const [timeLeft, setTimeLeft] = useState(initialTimeLeft); - const theme = useTheme(); const update = useCallback(() => { if (expirationTimestamp) { @@ -50,14 +49,13 @@ export const ExpireTimer = (props: Props) => { }, [expirationTimestamp, timeLeft, setTimeLeft]); const updateFrequency = 500; + useInterval(update, updateFrequency); if (!(isCorrectSide && expirationLength && expirationTimestamp)) { return null; } - useInterval(update, updateFrequency); - - const expireTimerColor = theme.colors.textColor; + const expireTimerColor = 'var(--color-text)'; if (timeLeft <= 60) { return {timeLeft}; @@ -66,12 +64,7 @@ export const ExpireTimer = (props: Props) => { return ( - + ); }; diff --git a/ts/components/conversation/GroupInvitation.tsx b/ts/components/conversation/GroupInvitation.tsx index 85a34c509d..faaad377d7 100644 --- a/ts/components/conversation/GroupInvitation.tsx +++ b/ts/components/conversation/GroupInvitation.tsx @@ -1,14 +1,12 @@ import React from 'react'; import classNames from 'classnames'; -import { SessionIconButton, SessionIconSize, SessionIconType } from '../session/icon'; -import { useTheme } from 'styled-components'; +import { SessionIconButton } from '../session/icon'; import { PropsForGroupInvitation } from '../../state/ducks/conversations'; import { acceptOpenGroupInvitation } from '../../interactions/messageInteractions'; import { ReadableMessage } from './ReadableMessage'; export const GroupInvitation = (props: PropsForGroupInvitation) => { const { messageId, receivedAt, isUnread } = props; - const theme = useTheme(); const classes = ['group-invitation']; if (props.direction === 'outgoing') { @@ -27,10 +25,9 @@ export const GroupInvitation = (props: PropsForGroupInvitation) => {
{ acceptOpenGroupInvitation(props.acceptUrl, props.serverName); }} diff --git a/ts/components/conversation/H5AudioPlayer.tsx b/ts/components/conversation/H5AudioPlayer.tsx index 463bd801cb..4f2c232487 100644 --- a/ts/components/conversation/H5AudioPlayer.tsx +++ b/ts/components/conversation/H5AudioPlayer.tsx @@ -2,7 +2,6 @@ import React, { useEffect, useRef, useState } from 'react'; import H5AudioPlayer, { RHAP_UI } from 'react-h5-audio-player'; import { useDispatch, useSelector } from 'react-redux'; -import { useTheme } from 'styled-components'; import { useEncryptedFileFetch } from '../../hooks/useEncryptedFileFetch'; import { setNextMessageToPlayId } from '../../state/ducks/conversations'; import { @@ -10,7 +9,7 @@ import { getSortedMessagesOfSelectedConversation, } from '../../state/selectors/conversations'; import { getAudioAutoplay } from '../../state/selectors/userConfig'; -import { SessionIcon, SessionIconSize, SessionIconType } from '../session/icon'; +import { SessionIcon } from '../session/icon'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../session/SessionButton'; export const AudioPlayerWithEncryptedFile = (props: { @@ -18,8 +17,6 @@ export const AudioPlayerWithEncryptedFile = (props: { contentType: string; messageId: string; }) => { - const theme = useTheme(); - const dispatch = useDispatch(); const [playbackSpeed, setPlaybackSpeed] = useState(1.0); const { urlToLoad } = useEncryptedFileFetch(props.src, props.contentType); @@ -97,7 +94,6 @@ export const AudioPlayerWithEncryptedFile = (props: {
{ setPlaybackSpeed(playbackSpeed === 1 ? 1.5 : 1); }} @@ -108,20 +104,10 @@ export const AudioPlayerWithEncryptedFile = (props: { ]} customIcons={{ play: ( - + ), pause: ( - + ), }} /> diff --git a/ts/components/conversation/Message.tsx b/ts/components/conversation/Message.tsx index f555728339..b2bfff8489 100644 --- a/ts/components/conversation/Message.tsx +++ b/ts/components/conversation/Message.tsx @@ -1,118 +1,36 @@ import React from 'react'; -// import { getIncrement } from '../../util/timer'; import _ from 'lodash'; import uuid from 'uuid'; import { QuoteClickOptions } from '../../models/messageType'; import autoBind from 'auto-bind'; -// import { messageExpired } from '../../state/ducks/conversations'; -// import { getConversationController } from '../../session/conversations'; import { GenericReadableMessage } from './message/GenericReadableMessage'; // Same as MIN_WIDTH in ImageGrid.tsx export const MINIMUM_LINK_PREVIEW_IMAGE_WIDTH = 200; -interface State { - expiring: boolean; - expired: boolean; -} - -// const EXPIRATION_CHECK_MINIMUM = 2000; -// const EXPIRED_DELAY = 600; - type Props = { messageId: string; isDetailView?: boolean; // when the detail is shown for a message, we disble click and some other stuff onQuoteClick?: (options: QuoteClickOptions) => Promise; }; -export class Message extends React.PureComponent { - public expirationCheckInterval: any; - public expiredTimeout: any; +export class Message extends React.PureComponent { public ctxMenuID: string; public constructor(props: Props) { super(props); autoBind(this); - this.state = { - expiring: false, - expired: false, - }; this.ctxMenuID = `ctx-menu-message-${uuid()}`; } - public componentDidMount() { - // const { expirationLength } = this.props; - // if (!expirationLength) { - // return; - // } - // const increment = getIncrement(expirationLength); - // const checkFrequency = Math.max(EXPIRATION_CHECK_MINIMUM, increment); - // this.checkExpired(); - // this.expirationCheckInterval = setInterval(() => { - // this.checkExpired(); - // }, checkFrequency); - } - - public componentWillUnmount() { - // if (this.expirationCheckInterval) { - // clearInterval(this.expirationCheckInterval); - // } - // if (this.expiredTimeout) { - // global.clearTimeout(this.expiredTimeout); - // } - } - - // public componentDidUpdate() { - // this.checkExpired(); - // } - - // public checkExpired() { - // const now = Date.now(); - // const { isExpired, expirationTimestamp, expirationLength, convoId, id } = this.props; - - // if (!expirationTimestamp || !expirationLength) { - // return; - // } - // if (this.expiredTimeout) { - // return; - // } - - // if (isExpired || now >= expirationTimestamp) { - // this.setState({ - // expiring: true, - // }); - - // const setExpired = async () => { - // this.setState({ - // expired: true, - // }); - // await window.Signal.Data.removeMessage(id); - // window.inboxStore?.dispatch( - // messageExpired({ - // conversationKey: convoId, - // messageId: id, - // }) - // ); - // const convo = getConversationController().get(convoId); - // convo?.updateLastMessage(); - // }; - // // as 'checkExpired' is potentially called more than once (componentDidUpdate & componentDidMount), - // // we need to clear the timeout call to 'setExpired' first to avoid multiple calls to 'setExpired'. - // global.clearTimeout(this.expiredTimeout); - // this.expiredTimeout = setTimeout(setExpired, EXPIRED_DELAY); - // } - // } - // tslint:disable-next-line: cyclomatic-complexity cyclomatic-complexity public render() { return ( diff --git a/ts/components/conversation/MessageDetail.tsx b/ts/components/conversation/MessageDetail.tsx index d53085ae6e..90179e062f 100644 --- a/ts/components/conversation/MessageDetail.tsx +++ b/ts/components/conversation/MessageDetail.tsx @@ -124,16 +124,14 @@ export const MessageDetail = () => { {i18n('sent')} - {moment(sentAt).format('LLLL')}{' '} - ({sentAt}) + {moment(sentAt).format('LLLL')} ({sentAt}) {receivedAt ? ( {i18n('received')} - {moment(receivedAt).format('LLLL')}{' '} - ({receivedAt}) + {moment(receivedAt).format('LLLL')} ({receivedAt}) ) : null} diff --git a/ts/components/conversation/TimerNotification.tsx b/ts/components/conversation/TimerNotification.tsx index db5458f09f..d9f67c2131 100644 --- a/ts/components/conversation/TimerNotification.tsx +++ b/ts/components/conversation/TimerNotification.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { Intl } from '../Intl'; import { missingCaseError } from '../../util/missingCaseError'; -import { SessionIcon, SessionIconSize, SessionIconType } from '../session/icon'; +import { SessionIcon } from '../session/icon'; import { PropsForExpirationTimer } from '../../state/ducks/conversations'; import { ReadableMessage } from './ReadableMessage'; @@ -46,11 +46,7 @@ export const TimerNotification = (props: PropsForExpirationTimer) => {
- +
diff --git a/ts/components/conversation/Timestamp.tsx b/ts/components/conversation/Timestamp.tsx index e55ffd7648..e5d61204e1 100644 --- a/ts/components/conversation/Timestamp.tsx +++ b/ts/components/conversation/Timestamp.tsx @@ -25,7 +25,7 @@ const TimestampContainerListItem = styled.div` white-space: nowrap; text-overflow: ellipsis; text-transform: uppercase; - color: ${props => props.theme.colors.textColor}; + color: var(--color-text); `; const TimestampContainerNotListItem = styled.div` @@ -34,7 +34,7 @@ const TimestampContainerNotListItem = styled.div` letter-spacing: 0.3px; text-transform: uppercase; user-select: none; - color: ${props => props.theme.colors.textColor}; + color: var(--color-text); `; export const Timestamp = (props: Props) => { diff --git a/ts/components/conversation/TypingBubble.tsx b/ts/components/conversation/TypingBubble.tsx index 244190fa2a..9831c97468 100644 --- a/ts/components/conversation/TypingBubble.tsx +++ b/ts/components/conversation/TypingBubble.tsx @@ -17,7 +17,7 @@ const TypingBubbleContainer = styled.div` display: flow-root; padding-bottom: ${props => (props.isTyping ? '4px' : '0px')}; padding-top: ${props => (props.isTyping ? '4px' : '0px')}; - transition: ${props => props.theme.common.animations.defaultDuration}; + transition: var(--default-duration); padding-inline-end: 16px; padding-inline-start: 4px; overflow: hidden; diff --git a/ts/components/conversation/message/ClickToTrustSender.tsx b/ts/components/conversation/message/ClickToTrustSender.tsx index 0f72623312..df5781ff17 100644 --- a/ts/components/conversation/message/ClickToTrustSender.tsx +++ b/ts/components/conversation/message/ClickToTrustSender.tsx @@ -4,18 +4,18 @@ import { getMessageById, getMessagesByConversation } from '../../../data/data'; import { getConversationController } from '../../../session/conversations'; import { AttachmentDownloads } from '../../../session/utils'; import { updateConfirmModal } from '../../../state/ducks/modalDialog'; -import { SessionIcon, SessionIconSize, SessionIconType } from '../../session/icon'; +import { SessionIcon } from '../../session/icon'; import { SessionButtonColor } from '../../session/SessionButton'; const StyledTrustSenderUI = styled.div` - padding: '${props => props.theme.common.margins.md}px'; + padding: 'var(--margins-md)'; display: flex; align-items: center; `; const ClickToDownload = styled.div` cursor: pointer; - padding: ${props => props.theme.common.margins.xs} ${props => props.theme.common.margins.md}; + padding: var(--margins-xs) var(--margins-md); `; export const ClickToTrustSender = (props: { messageId: string }) => { @@ -83,7 +83,7 @@ export const ClickToTrustSender = (props: { messageId: string }) => { return ( - + {window.i18n('clickToTrustContact')} ); diff --git a/ts/components/conversation/message/DateBreak.tsx b/ts/components/conversation/message/DateBreak.tsx index 3ee73c9ddb..08706e614f 100644 --- a/ts/components/conversation/message/DateBreak.tsx +++ b/ts/components/conversation/message/DateBreak.tsx @@ -12,7 +12,7 @@ const DateBreakText = styled.div` font-weight: bold; text-align: center; - color: ${props => props.theme.colors.lastSeenIndicatorTextColor}; + color: var(--color-last-seen-indicator-text); `; export const MessageDateBreak = (props: { timestamp: number; messageId: string }) => { diff --git a/ts/components/conversation/message/GenericReadableMessage.tsx b/ts/components/conversation/message/GenericReadableMessage.tsx index f08719408b..1b555c3456 100644 --- a/ts/components/conversation/message/GenericReadableMessage.tsx +++ b/ts/components/conversation/message/GenericReadableMessage.tsx @@ -1,15 +1,21 @@ import classNames from 'classnames'; -import React, { useCallback } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { contextMenu } from 'react-contexify'; -import { useSelector } from 'react-redux'; -import _ from 'underscore'; +import { useDispatch, useSelector } from 'react-redux'; +// tslint:disable-next-line: no-submodule-imports +import useInterval from 'react-use/lib/useInterval'; +import _ from 'lodash'; +import { removeMessage } from '../../../data/data'; import { MessageRenderingProps, QuoteClickOptions } from '../../../models/messageType'; +import { getConversationController } from '../../../session/conversations'; +import { messageExpired } from '../../../state/ducks/conversations'; import { getGenericReadableMessageSelectorProps, getIsMessageSelected, getQuotedMessageToAnimate, isMessageSelectionMode, } from '../../../state/selectors/conversations'; +import { getIncrement } from '../../../util/timer'; import { ExpireTimer } from '../ExpireTimer'; import { ReadableMessage } from '../ReadableMessage'; import { MessageAvatar } from './MessageAvatar'; @@ -24,12 +30,66 @@ export type GenericReadableMessageSelectorProps = Pick< | 'expirationLength' | 'expirationTimestamp' | 'isKickedFromGroup' + | 'isExpired' + | 'convoId' >; +type ExpiringProps = { + isExpired?: boolean; + expirationTimestamp?: number | null; + expirationLength?: number | null; + convoId?: string; + messageId: string; +}; +const EXPIRATION_CHECK_MINIMUM = 2000; + +function useIsExpired(props: ExpiringProps) { + const { + convoId, + messageId, + expirationLength, + expirationTimestamp, + isExpired: isExpiredProps, + } = props; + + const dispatch = useDispatch(); + + const [isExpired] = useState(isExpiredProps); + async function checkExpired() { + const now = Date.now(); + + if (!expirationTimestamp || !expirationLength) { + return; + } + + if (isExpired || now >= expirationTimestamp) { + await removeMessage(messageId); + if (convoId) { + dispatch( + messageExpired({ + conversationKey: convoId, + messageId, + }) + ); + const convo = getConversationController().get(convoId); + convo?.updateLastMessage(); + } + } + } + + const increment = getIncrement(expirationLength || EXPIRATION_CHECK_MINIMUM); + const checkFrequency = Math.max(EXPIRATION_CHECK_MINIMUM, increment); + + useEffect(() => { + void checkExpired(); + }, []); // check on mount + useInterval(checkExpired, checkFrequency); // check every 2sec or sooner if needed + + return { isExpired }; +} + type Props = { messageId: string; - expired: boolean; - expiring: boolean; onQuoteClick: (quote: QuoteClickOptions) => void; ctxMenuID: string; isDetailView?: boolean; @@ -40,6 +100,15 @@ export const GenericReadableMessage = (props: Props) => { getGenericReadableMessageSelectorProps(state as any, props.messageId) ); + const expiringProps: ExpiringProps = { + convoId: msgProps?.convoId, + expirationLength: msgProps?.expirationLength, + messageId: props.messageId, + expirationTimestamp: msgProps?.expirationTimestamp, + isExpired: msgProps?.isExpired, + }; + const { isExpired } = useIsExpired(expiringProps); + const quotedMessageToAnimate = useSelector(getQuotedMessageToAnimate); const isMessageSelected = useSelector(state => getIsMessageSelected(state as any, props.messageId) @@ -63,7 +132,7 @@ export const GenericReadableMessage = (props: Props) => { [props.ctxMenuID, multiSelectMode, msgProps?.isKickedFromGroup] ); - const { messageId, expired, isDetailView } = props; + const { messageId, isDetailView } = props; if (!msgProps) { return null; @@ -77,7 +146,7 @@ export const GenericReadableMessage = (props: Props) => { expirationTimestamp, } = msgProps; - if (expired) { + if (isExpired) { return null; } @@ -110,7 +179,6 @@ export const GenericReadableMessage = (props: Props) => { diff --git a/ts/components/conversation/message/MessageContent.tsx b/ts/components/conversation/message/MessageContent.tsx index ad4e824804..bddd72224d 100644 --- a/ts/components/conversation/message/MessageContent.tsx +++ b/ts/components/conversation/message/MessageContent.tsx @@ -177,7 +177,7 @@ export const MessageContent = (props: Props) => { handleImageError={handleImageError} /> {hasContentAfterAttachmentAndQuote ? ( - + diff --git a/ts/components/conversation/message/MessageContentWithStatus.tsx b/ts/components/conversation/message/MessageContentWithStatus.tsx index f966810e14..02c9a33d83 100644 --- a/ts/components/conversation/message/MessageContentWithStatus.tsx +++ b/ts/components/conversation/message/MessageContentWithStatus.tsx @@ -18,7 +18,6 @@ export type MessageContentWithStatusSelectorProps = Pick void; ctxMenuID: string; isDetailView?: boolean; @@ -58,7 +57,7 @@ export const MessageContentWithStatuses = (props: Props) => { [window.contextMenuShown, props?.messageId, multiSelectMode, props?.isDetailView] ); - const { messageId, expiring, onQuoteClick, ctxMenuID, isDetailView } = props; + const { messageId, onQuoteClick, ctxMenuID, isDetailView } = props; if (!contentProps) { return null; } @@ -67,11 +66,7 @@ export const MessageContentWithStatuses = (props: Props) => { return (
diff --git a/ts/components/conversation/message/MessagePreview.tsx b/ts/components/conversation/message/MessagePreview.tsx index 0853402759..e4d49110ac 100644 --- a/ts/components/conversation/message/MessagePreview.tsx +++ b/ts/components/conversation/message/MessagePreview.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import React from 'react'; import { isImageAttachment } from '../../../types/Attachment'; -import { SessionIcon, SessionIconSize, SessionIconType } from '../../session/icon'; +import { SessionIcon } from '../../session/icon'; import { ImageGrid } from '../ImageGrid'; import { Image } from '../Image'; import { MINIMUM_LINK_PREVIEW_IMAGE_WIDTH } from '../Message'; @@ -63,7 +63,7 @@ export const MessagePreview = (props: Props) => {
- +
diff --git a/ts/components/conversation/message/OutgoingMessageStatus.tsx b/ts/components/conversation/message/OutgoingMessageStatus.tsx index 8285d834ce..f7de7dfb84 100644 --- a/ts/components/conversation/message/OutgoingMessageStatus.tsx +++ b/ts/components/conversation/message/OutgoingMessageStatus.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import styled, { useTheme } from 'styled-components'; +import styled from 'styled-components'; import { MessageDeliveryStatus } from '../../../models/messageType'; -import { SessionIcon, SessionIconSize, SessionIconType } from '../../session/icon'; +import { SessionIcon } from '../../session/icon'; const MessageStatusSendingContainer = styled.div` display: inline-block; @@ -10,56 +10,38 @@ const MessageStatusSendingContainer = styled.div` `; const MessageStatusSending = () => { - const iconColor = useTheme().colors.textColor; + const iconColor = 'var(--color-text)'; return ( - + ); }; const MessageStatusSent = () => { - const iconColor = useTheme().colors.textColor; + const iconColor = 'var(--color-text)'; return ( - + ); }; const MessageStatusRead = () => { - const iconColor = useTheme().colors.textColor; + const iconColor = 'var(--color-text)'; return ( - + ); }; const MessageStatusError = () => { - const theme = useTheme(); return ( - + ); }; diff --git a/ts/components/dialog/EditProfileDialog.tsx b/ts/components/dialog/EditProfileDialog.tsx index 5b9c63cce5..dfd7d09f1e 100644 --- a/ts/components/dialog/EditProfileDialog.tsx +++ b/ts/components/dialog/EditProfileDialog.tsx @@ -6,7 +6,7 @@ import { Avatar, AvatarSize } from '../Avatar'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../session/SessionButton'; -import { SessionIconButton, SessionIconSize, SessionIconType } from '../session/icon'; +import { SessionIconButton } from '../session/icon'; import { PillDivider } from '../session/PillDivider'; import { SyncUtils, ToastUtils, UserUtils } from '../../session/utils'; import { MAX_USERNAME_LENGTH } from '../session/registration/RegistrationStages'; @@ -72,7 +72,7 @@ export class EditProfileDialog extends React.Component<{}, State> { viewEdit || viewQR ? [ { - iconType: SessionIconType.Chevron, + iconType: 'chevron', iconRotation: 90, onClick: () => { this.setState({ mode: 'default' }); @@ -149,8 +149,8 @@ export class EditProfileDialog extends React.Component<{}, State> { />
{ this.setState(state => ({ ...state, mode: 'qr' })); @@ -184,8 +184,8 @@ export class EditProfileDialog extends React.Component<{}, State> {

{name}

{ this.setState({ mode: 'edit' }); }} diff --git a/ts/components/dialog/OnionStatusPathDialog.tsx b/ts/components/dialog/OnionStatusPathDialog.tsx index 3804736a2b..42b94ff9f8 100644 --- a/ts/components/dialog/OnionStatusPathDialog.tsx +++ b/ts/components/dialog/OnionStatusPathDialog.tsx @@ -7,7 +7,6 @@ import { useDispatch, useSelector } from 'react-redux'; import ip2country from 'ip2country'; import countryLookup from 'country-code-lookup'; -import { useTheme } from 'styled-components'; import { Snode } from '../../data/data'; import { onionPathModal } from '../../state/ducks/modalDialog'; import { @@ -16,9 +15,8 @@ import { getIsOnline, getOnionPathsCount, } from '../../state/selectors/onions'; -import { getTheme } from '../../state/selectors/theme'; import { Flex } from '../basic/Flex'; -import { SessionIcon, SessionIconButton, SessionIconSize, SessionIconType } from '../session/icon'; +import { SessionIcon, SessionIconButton } from '../session/icon'; import { SessionSpinner } from '../session/SessionSpinner'; import { SessionWrapperModal } from '../session/SessionWrapperModal'; @@ -98,13 +96,12 @@ export type OnionNodeStatusLightType = { */ export const OnionNodeStatusLight = (props: OnionNodeStatusLightType): JSX.Element => { const { glowStartDelay, glowDuration } = props; - const theme = useTheme(); return ( ); }; @@ -114,18 +111,16 @@ export const OnionNodeStatusLight = (props: OnionNodeStatusLightType): JSX.Eleme */ export const ModalStatusLight = (props: StatusLightType) => { const { glowStartDelay, glowDuration, color } = props; - const theme = useSelector(getTheme); return (
); @@ -140,15 +135,14 @@ export const ActionPanelOnionStatusLight = (props: { }) => { const { isSelected, handleClick } = props; - const theme = useTheme(); const onionPathsCount = useSelector(getOnionPathsCount); const firstPathLength = useSelector(getFirstOnionPathLength); const isOnline = useSelector(getIsOnline); // Set icon color based on result - const red = theme.colors.destructive; - const green = theme.colors.accent; - const orange = theme.colors.warning; + const red = 'var(--color-destructive)'; + const green = 'var(--color-accent)'; + const orange = 'var(--color-warning)'; // start with red let iconColor = red; @@ -159,15 +153,14 @@ export const ActionPanelOnionStatusLight = (props: { return ( ); }; diff --git a/ts/components/dialog/SessionConfirm.tsx b/ts/components/dialog/SessionConfirm.tsx index db536a595c..0a338bf5d9 100644 --- a/ts/components/dialog/SessionConfirm.tsx +++ b/ts/components/dialog/SessionConfirm.tsx @@ -2,7 +2,6 @@ import React, { useState } from 'react'; import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { SessionHtmlRenderer } from '../session/SessionHTMLRenderer'; import { SessionIcon, SessionIconSize, SessionIconType } from '../session/icon'; -import { DefaultTheme, useTheme, withTheme } from 'styled-components'; import { SessionWrapperModal } from '../session/SessionWrapperModal'; import { updateConfirmModal } from '../../state/ducks/modalDialog'; import { SpacerLG } from '../basic/Text'; @@ -24,12 +23,11 @@ export interface SessionConfirmDialogProps { closeTheme?: SessionButtonColor; sessionIcon?: SessionIconType; iconSize?: SessionIconSize; - theme?: DefaultTheme; shouldShowConfirm?: boolean | undefined; showExitIcon?: boolean | undefined; } -const SessionConfirmInner = (props: SessionConfirmDialogProps) => { +export const SessionConfirm = (props: SessionConfirmDialogProps) => { const { title = '', message = '', @@ -52,8 +50,6 @@ const SessionConfirmInner = (props: SessionConfirmDialogProps) => { const cancelText = props.cancelText || window.i18n('cancel'); const showHeader = !!props.title; - const theme = useTheme(); - const messageSubText = messageSub ? 'session-confirm-main-message' : 'subtle'; const onClickOkHandler = async () => { @@ -102,7 +98,7 @@ const SessionConfirmInner = (props: SessionConfirmDialogProps) => {
{sessionIcon && iconSize && ( <> - + )} @@ -130,5 +126,3 @@ const SessionConfirmInner = (props: SessionConfirmDialogProps) => { ); }; - -export const SessionConfirm = withTheme(SessionConfirmInner); diff --git a/ts/components/dialog/SessionModal.tsx b/ts/components/dialog/SessionModal.tsx index 0a42e6384e..3e94fc6252 100644 --- a/ts/components/dialog/SessionModal.tsx +++ b/ts/components/dialog/SessionModal.tsx @@ -1,8 +1,7 @@ import React from 'react'; import classNames from 'classnames'; -import { DefaultTheme } from 'styled-components'; -import { SessionIconButton, SessionIconSize, SessionIconType } from '../session/icon'; +import { SessionIconButton, SessionIconType } from '../session/icon'; import { SessionButtonColor, SessionButtonType } from '../session/SessionButton'; interface Props { @@ -23,7 +22,6 @@ interface Props { text: string; onClick?: any; }>; - theme: DefaultTheme; } interface State { @@ -81,12 +79,7 @@ export class SessionModal extends React.PureComponent {
{showExitIcon ? ( - + ) : null}
{title}
@@ -97,10 +90,9 @@ export class SessionModal extends React.PureComponent { ); }) diff --git a/ts/components/dialog/SessionNicknameDialog.tsx b/ts/components/dialog/SessionNicknameDialog.tsx index cb917f4007..47dd9bbf6f 100644 --- a/ts/components/dialog/SessionNicknameDialog.tsx +++ b/ts/components/dialog/SessionNicknameDialog.tsx @@ -5,7 +5,7 @@ import _ from 'lodash'; import { SpacerLG } from '../basic/Text'; import { useDispatch } from 'react-redux'; import { changeNickNameModal } from '../../state/ducks/modalDialog'; -import { SessionButton } from '../session/SessionButton'; +import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { SessionWrapperModal } from '../session/SessionWrapperModal'; type Props = { @@ -70,7 +70,11 @@ export const SessionNicknameDialog = (props: Props) => { />
- +
diff --git a/ts/components/dialog/SessionPasswordDialog.tsx b/ts/components/dialog/SessionPasswordDialog.tsx index 8e0f48314e..a9d4edc1cc 100644 --- a/ts/components/dialog/SessionPasswordDialog.tsx +++ b/ts/components/dialog/SessionPasswordDialog.tsx @@ -3,7 +3,6 @@ import React from 'react'; import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { missingCaseError, PasswordUtil } from '../../util'; import { ToastUtils } from '../../session/utils'; -import { SessionIconType } from '../session/icon'; import { getPasswordHash } from '../../data/data'; import { SessionWrapperModal } from '../session/SessionWrapperModal'; import { SpacerLG, SpacerSM } from '../basic/Text'; @@ -58,7 +57,7 @@ export class SessionPasswordDialog extends React.Component { : [window.i18n('enterPassword'), window.i18n('confirmPassword')]; const confirmButtonColor = - passwordAction === 'remove' ? SessionButtonColor.Danger : SessionButtonColor.Primary; + passwordAction === 'remove' ? SessionButtonColor.Danger : SessionButtonColor.Green; return ( { 'setPasswordSuccessToast', window.i18n('setPasswordTitle'), window.i18n('setPasswordToastDescription'), - SessionIconType.Lock + 'lock' ); this.props.onOk(); @@ -209,7 +208,7 @@ export class SessionPasswordDialog extends React.Component { 'setPasswordSuccessToast', window.i18n('changePasswordTitle'), window.i18n('changePasswordToastDescription'), - SessionIconType.Lock + 'lock' ); this.props.onOk(); diff --git a/ts/components/dialog/SessionSeedModal.tsx b/ts/components/dialog/SessionSeedModal.tsx index 3e61e716d3..538f9b184e 100644 --- a/ts/components/dialog/SessionSeedModal.tsx +++ b/ts/components/dialog/SessionSeedModal.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; -import { SessionButton } from '../session/SessionButton'; +import { SessionButton, SessionButtonColor } from '../session/SessionButton'; import { ToastUtils, UserUtils } from '../../session/utils'; import { PasswordUtil } from '../../util'; import { getPasswordHash } from '../../data/data'; @@ -111,18 +111,19 @@ const Seed = (props: SeedProps) => { {recoveryPhrase}
-
- -
-
{ copyRecoveryPhrase(recoveryPhrase); }} />
+ +
+ +
); }; @@ -190,7 +191,6 @@ const SessionSeedModalInner = (props: ModalInnerProps) => { )} )} - : ); }; diff --git a/ts/components/dialog/UserDetailsDialog.tsx b/ts/components/dialog/UserDetailsDialog.tsx index 5d08d067a7..10166436ce 100644 --- a/ts/components/dialog/UserDetailsDialog.tsx +++ b/ts/components/dialog/UserDetailsDialog.tsx @@ -1,13 +1,15 @@ import React, { useState } from 'react'; +// tslint:disable no-submodule-imports + +import useCopyToClipboard from 'react-use/lib/useCopyToClipboard'; -// tslint:disable-next-line: no-submodule-imports import useKey from 'react-use/lib/useKey'; import { ConversationTypeEnum } from '../../models/conversation'; import { getConversationController } from '../../session/conversations'; import { openConversationWithMessages } from '../../state/ducks/conversations'; import { updateUserDetailsModal } from '../../state/ducks/modalDialog'; import { Avatar, AvatarSize } from '../Avatar'; -import { SpacerMD } from '../basic/Text'; +import { SpacerLG } from '../basic/Text'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../session/SessionButton'; import { SessionIdEditable } from '../session/SessionIdEditable'; import { SessionWrapperModal } from '../session/SessionWrapperModal'; @@ -24,6 +26,8 @@ export const UserDetailsDialog = (props: Props) => { const size = isEnlargedImageShown ? AvatarSize.HUGE : AvatarSize.XL; const userName = props.userName || props.conversationId; + const [_, copyToClipboard] = useCopyToClipboard(); + function closeDialog() { window.inboxStore?.dispatch(updateUserDetailsModal(null)); } @@ -63,14 +67,22 @@ export const UserDetailsDialog = (props: Props) => {
- +
{ + copyToClipboard(props.conversationId); + }} + /> +
diff --git a/ts/components/session/AccentText.tsx b/ts/components/session/AccentText.tsx index d7a562afc5..6a099689dc 100644 --- a/ts/components/session/AccentText.tsx +++ b/ts/components/session/AccentText.tsx @@ -1,11 +1,7 @@ import React from 'react'; -import { SessionHtmlRenderer } from './SessionHTMLRenderer'; - export const AccentText: React.FC = () => (
-
- -
+
{window.i18n('beginYourSession')}
); diff --git a/ts/components/session/ActionsPanel.tsx b/ts/components/session/ActionsPanel.tsx index d12d6cb15c..cd2930b2cb 100644 --- a/ts/components/session/ActionsPanel.tsx +++ b/ts/components/session/ActionsPanel.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react'; -import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; +import { SessionIconButton, SessionIconType } from './icon'; import { Avatar, AvatarSize } from '../Avatar'; -import { darkTheme, lightTheme } from '../../state/ducks/SessionTheme'; import { SessionToastContainer } from './SessionToastContainer'; import { getConversationController } from '../../session/conversations'; import { syncConfigurationIfNeeded } from '../../session/utils/syncUtils'; @@ -23,7 +22,6 @@ import { getOurPrimaryConversation, getUnreadMessageCount, } from '../../state/selectors/conversations'; -import { getTheme } from '../../state/selectors/theme'; import { applyTheme } from '../../state/ducks/theme'; import { getFocusedSection } from '../../state/selectors/section'; import { useInterval } from '../../hooks/useInterval'; @@ -45,10 +43,10 @@ import { loadDefaultRooms } from '../../opengroup/opengroupV2/ApiUtil'; // tslint:disable-next-line: no-import-side-effect no-submodule-imports import { ActionPanelOnionStatusLight } from '../dialog/OnionStatusPathDialog'; +import { switchHtmlToDarkTheme, switchHtmlToLightTheme } from '../../state/ducks/SessionTheme'; const Section = (props: { type: SectionType; avatarPath?: string | null }) => { const ourNumber = useSelector(getOurNumber); const unreadMessageCount = useSelector(getUnreadMessageCount); - const theme = useSelector(getTheme); const dispatch = useDispatch(); const { type, avatarPath } = props; @@ -63,8 +61,13 @@ const Section = (props: { type: SectionType; avatarPath?: string | null }) => { const themeFromSettings = window.Events.getThemeSetting(); const updatedTheme = themeFromSettings === 'dark' ? 'light' : 'dark'; window.setTheme(updatedTheme); + if (updatedTheme === 'dark') { + switchHtmlToDarkTheme(); + } else { + switchHtmlToLightTheme(); + } - const newThemeObject = updatedTheme === 'dark' ? darkTheme : lightTheme; + const newThemeObject = updatedTheme === 'dark' ? 'dark' : 'light'; dispatch(applyTheme(newThemeObject)); } else if (type === SectionType.PathIndicator) { // Show Path Indicator Modal @@ -96,19 +99,19 @@ const Section = (props: { type: SectionType; avatarPath?: string | null }) => { let iconType: SessionIconType; switch (type) { case SectionType.Message: - iconType = SessionIconType.ChatBubble; + iconType = 'chatBubble'; break; case SectionType.Contact: - iconType = SessionIconType.Users; + iconType = 'users'; break; case SectionType.Settings: - iconType = SessionIconType.Gear; + iconType = 'gear'; break; case SectionType.Moon: - iconType = SessionIconType.Moon; + iconType = 'moon'; break; default: - iconType = SessionIconType.Moon; + iconType = 'moon'; } const iconColor = undefined; @@ -118,13 +121,12 @@ const Section = (props: { type: SectionType; avatarPath?: string | null }) => { ) : ( )} @@ -136,8 +138,12 @@ const cleanUpMediasInterval = DURATION.MINUTES * 30; const setupTheme = () => { const theme = window.Events.getThemeSetting(); window.setTheme(theme); - - const newThemeObject = theme === 'dark' ? darkTheme : lightTheme; + if (theme === 'dark') { + switchHtmlToDarkTheme(); + } else { + switchHtmlToLightTheme(); + } + const newThemeObject = theme === 'dark' ? 'dark' : 'light'; window?.inboxStore?.dispatch(applyTheme(newThemeObject)); }; diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 070fa6dad2..0aabe6e5d0 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -14,7 +14,6 @@ import { SessionSearchInput } from './SessionSearchInput'; import { cleanSearchTerm } from '../../util/cleanSearchTerm'; import { RowRendererParamsType } from '../LeftPane'; import { SessionClosableOverlay, SessionClosableOverlayType } from './SessionClosableOverlay'; -import { SessionIconType } from './icon'; import { ContactType } from './SessionMemberListItem'; import { SessionButton, SessionButtonColor, SessionButtonType } from './SessionButton'; import { PubKey } from '../../session/types'; @@ -133,7 +132,7 @@ export class LeftPaneMessageSection extends React.Component { return ( ); diff --git a/ts/components/session/LeftPaneSectionHeader.tsx b/ts/components/session/LeftPaneSectionHeader.tsx index 11ca371093..72c8162695 100644 --- a/ts/components/session/LeftPaneSectionHeader.tsx +++ b/ts/components/session/LeftPaneSectionHeader.tsx @@ -1,7 +1,7 @@ import React from 'react'; import classNames from 'classnames'; -import { SessionIcon, SessionIconSize, SessionIconType } from './icon'; -import styled, { useTheme } from 'styled-components'; +import { SessionIcon, SessionIconType } from './icon'; +import styled from 'styled-components'; import { SessionButton, SessionButtonType } from './SessionButton'; import { useDispatch, useSelector } from 'react-redux'; import { disableRecoveryPhrasePrompt } from '../../state/ducks/userConfig'; @@ -47,7 +47,6 @@ type Props = { export const LeftPaneSectionHeader = (props: Props) => { const { label, buttonIcon, buttonClicked } = props; - const theme = useTheme(); const showRecoveryPhrasePrompt = useSelector(getShowRecoveryPhrasePrompt); return ( @@ -56,12 +55,7 @@ export const LeftPaneSectionHeader = (props: Props) => { {label && } {buttonIcon && ( - + )}
@@ -102,8 +96,6 @@ export const LeftPaneBanner = () => { ); }; - const theme = useTheme(); - return ( @@ -112,11 +104,7 @@ export const LeftPaneBanner = () => { {window.i18n('recoveryPhraseSecureTitle')} 90% - + @@ -127,11 +115,11 @@ const StyledProgressBarContainer = styled.div` width: 100%; height: 5px; flex-direction: row; - background: ${p => p.theme.colors.sessionBorderColor}; + background: var(--color-session-border); `; const StyledProgressBarInner = styled.div` - background: ${p => p.theme.colors.accent}; + background: var(--color-accent); width: 90%; transition: width 0.5s ease-in; height: 100%; @@ -139,21 +127,20 @@ const StyledProgressBarInner = styled.div` export const StyledBannerTitle = styled.div` line-height: 1.3; - font-size: ${p => p.theme.common.fonts.md}; + font-size: var(--font-size-md); font-weight: bold; - margin: ${p => p.theme.common.margins.sm} ${p => p.theme.common.margins.sm} 0 - ${p => p.theme.common.margins.sm}; + margin: var(--margins-sm) var(--margins-sm) 0 var(--margins-sm); span { - color: ${p => p.theme.colors.textAccent}; + color: var(--color-text-accent); } `; export const StyledLeftPaneBanner = styled.div` - background: ${p => p.theme.colors.recoveryPhraseBannerBackground}; + background: var(--color-recovery-phrase-banner-background); display: flex; flex-direction: column; - border-bottom: ${p => p.theme.colors.sessionBorder}; + border-bottom: var(--session-border); `; const StyledBannerInner = styled.div` @@ -162,10 +149,10 @@ const StyledBannerInner = styled.div` } .left-pane-banner___phrase { - margin-top: ${props => props.theme.common.margins.md}; + margin-top: var(--margins-md); } .session-button { - margin-top: ${props => props.theme.common.margins.sm}; + margin-top: var(--margins-sm); } `; diff --git a/ts/components/session/LeftPaneSettingSection.tsx b/ts/components/session/LeftPaneSettingSection.tsx index 7c8b79e6f7..42c1d8a08e 100644 --- a/ts/components/session/LeftPaneSettingSection.tsx +++ b/ts/components/session/LeftPaneSettingSection.tsx @@ -1,13 +1,12 @@ import React from 'react'; import classNames from 'classnames'; import { SessionButton, SessionButtonColor, SessionButtonType } from './SessionButton'; -import { SessionIcon, SessionIconSize, SessionIconType } from './icon'; +import { SessionIcon } from './icon'; import { SessionSettingCategory } from './settings/SessionSettings'; import { LeftPaneSectionHeader } from './LeftPaneSectionHeader'; import { useDispatch, useSelector } from 'react-redux'; import { showSettingsSection } from '../../state/ducks/section'; import { getFocusedSettingsSection } from '../../state/selectors/section'; -import { getTheme } from '../../state/selectors/theme'; import { recoveryPhraseModal, updateDeleteAccountModal } from '../../state/ducks/modalDialog'; const getCategories = () => { @@ -39,7 +38,6 @@ const LeftPaneSettingsCategoryRow = (props: { item: any }) => { const { item } = props; const dispatch = useDispatch(); - const theme = useSelector(getTheme); const focusedSettingsSection = useSelector(getFocusedSettingsSection); return ( @@ -60,12 +58,7 @@ const LeftPaneSettingsCategoryRow = (props: { item: any }) => {
{item.id === focusedSettingsSection && ( - + )}
diff --git a/ts/components/session/SessionButton.tsx b/ts/components/session/SessionButton.tsx index 772fd68b54..313aaa5f08 100644 --- a/ts/components/session/SessionButton.tsx +++ b/ts/components/session/SessionButton.tsx @@ -1,6 +1,5 @@ import React, { ReactNode } from 'react'; import classNames from 'classnames'; -import { DefaultTheme } from 'styled-components'; export enum SessionButtonType { Brand = 'brand', @@ -16,10 +15,8 @@ export enum SessionButtonColor { Green = 'green', White = 'white', Primary = 'primary', - Secondary = 'secondary', Success = 'success', Danger = 'danger', - DangerAlt = 'danger-alt', Warning = 'warning', None = '', } @@ -31,7 +28,6 @@ type Props = { buttonColor: SessionButtonColor; onClick: any; children?: ReactNode; - theme: DefaultTheme; }; export const SessionButton = (props: Props) => { diff --git a/ts/components/session/SessionClosableOverlay.tsx b/ts/components/session/SessionClosableOverlay.tsx index 9d103a219d..cae8021dd1 100644 --- a/ts/components/session/SessionClosableOverlay.tsx +++ b/ts/components/session/SessionClosableOverlay.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; +import { SessionIconButton } from './icon'; import { SessionIdEditable } from './SessionIdEditable'; import { ContactType, SessionMemberListItem } from './SessionMemberListItem'; import { ReduxConversationType } from '../../state/ducks/conversations'; @@ -146,11 +146,7 @@ export class SessionClosableOverlay extends React.Component { return (
- +
diff --git a/ts/components/session/SessionDropdown.tsx b/ts/components/session/SessionDropdown.tsx index 4c6e0a93ff..f151bc3eee 100644 --- a/ts/components/session/SessionDropdown.tsx +++ b/ts/components/session/SessionDropdown.tsx @@ -1,7 +1,6 @@ -import React, { useContext, useState } from 'react'; -import { ThemeContext } from 'styled-components'; +import React, { useState } from 'react'; -import { SessionIcon, SessionIconSize, SessionIconType } from './icon/'; +import { SessionIcon, SessionIconType } from './icon/'; import { SessionDropdownItem, SessionDropDownItemType } from './SessionDropdownItem'; // THIS IS DROPDOWN ACCORDIAN STYLE OPTIONS SELECTOR ELEMENT, NOT A CONTEXTMENU @@ -23,7 +22,6 @@ type Props = { export const SessionDropdown = (props: Props) => { const { label, options } = props; const [expanded, setExpanded] = useState(!!props.expanded); - const theme = useContext(ThemeContext); const chevronOrientation = expanded ? 180 : 0; return ( @@ -36,12 +34,7 @@ export const SessionDropdown = (props: Props) => { role="button" > {label} - +
{expanded && ( diff --git a/ts/components/session/SessionDropdownItem.tsx b/ts/components/session/SessionDropdownItem.tsx index c9c72ba596..94d722c25b 100644 --- a/ts/components/session/SessionDropdownItem.tsx +++ b/ts/components/session/SessionDropdownItem.tsx @@ -1,8 +1,7 @@ -import React, { useContext } from 'react'; +import React from 'react'; import classNames from 'classnames'; -import { SessionIcon, SessionIconSize, SessionIconType } from './icon/'; -import { ThemeContext } from 'styled-components'; +import { SessionIcon, SessionIconType } from './icon/'; export enum SessionDropDownItemType { Default = 'default', @@ -26,7 +25,6 @@ export const SessionDropdownItem = (props: Props) => { }; const { content, type, icon, active } = props; - const theme = useContext(ThemeContext); return (
{ role="button" onClick={clickHandler} > - {icon ? : ''} + {icon ? : ''}
{content}
); diff --git a/ts/components/session/SessionInput.tsx b/ts/components/session/SessionInput.tsx index 9a9a35196f..c870e0928b 100644 --- a/ts/components/session/SessionInput.tsx +++ b/ts/components/session/SessionInput.tsx @@ -1,8 +1,7 @@ import React from 'react'; import classNames from 'classnames'; -import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; -import { DefaultTheme } from 'styled-components'; +import { SessionIconButton } from './icon'; interface Props { label?: string; @@ -16,7 +15,6 @@ interface Props { onEnterPressed?: any; autoFocus?: boolean; ref?: any; - theme: DefaultTheme; } interface State { @@ -109,14 +107,13 @@ export class SessionInput extends React.PureComponent { private renderShowHideButton() { return ( { this.setState({ forceShow: !this.state.forceShow, }); }} - theme={this.props.theme} /> ); } diff --git a/ts/components/session/SessionJoinableDefaultRooms.tsx b/ts/components/session/SessionJoinableDefaultRooms.tsx index 282f5bd23c..b047fac3f2 100644 --- a/ts/components/session/SessionJoinableDefaultRooms.tsx +++ b/ts/components/session/SessionJoinableDefaultRooms.tsx @@ -87,10 +87,10 @@ const StyledRoomName = styled(Flex)` `; const StyledToolTip = styled.div` - padding: ${props => props.theme.common.margins.sm}; - background: ${props => props.theme.colors.clickableHovered}; - font-size: ${props => props.theme.common.fonts.xs}; - border: 1px solid ${props => props.theme.colors.pillDividerColor}; + padding: var(--margins-sm); + background: var(--color-clickable-hovered); + font-size: var(--font-size-xs); + border: 1px solid var(--color-pill-divider); display: inline-block; position: absolute; white-space: normal; @@ -143,7 +143,7 @@ const SessionJoinableRoomRow = (props: JoinableRoomProps) => { - {showTooltip && {props.name}} + {showTooltip && false && {props.name}} ); }; diff --git a/ts/components/session/SessionMemberListItem.tsx b/ts/components/session/SessionMemberListItem.tsx index 64195f174a..9557c4ebcb 100644 --- a/ts/components/session/SessionMemberListItem.tsx +++ b/ts/components/session/SessionMemberListItem.tsx @@ -2,9 +2,8 @@ import React from 'react'; import classNames from 'classnames'; import { Avatar, AvatarSize } from '../Avatar'; -import { SessionIcon, SessionIconSize, SessionIconType } from './icon'; +import { SessionIcon } from './icon'; import { Constants } from '../../session'; -import { useTheme } from 'styled-components'; import { PubKey } from '../../session/types'; export interface ContactType { @@ -55,7 +54,6 @@ export const SessionMemberListItem = (props: Props) => { isSelected ? unselectMember() : selectMember(); }; - const theme = useTheme(); const name = member.authorProfileName || PubKey.shorten(member.authorPhoneNumber); return ( @@ -74,12 +72,7 @@ export const SessionMemberListItem = (props: Props) => { {name}
- +
); diff --git a/ts/components/session/SessionNotificationCount.tsx b/ts/components/session/SessionNotificationCount.tsx index 62111b2b81..534e110290 100644 --- a/ts/components/session/SessionNotificationCount.tsx +++ b/ts/components/session/SessionNotificationCount.tsx @@ -10,18 +10,18 @@ const StyledCountContainer = styled.div<{ shouldRender: boolean }>` width: 20px; height: 20px; font-size: 20px; - top: ${props => props.theme.common.margins.lg}; - right: ${props => props.theme.common.margins.lg}; + top: var(--margins-lg); + right: var(--margins-lg); padding: 3px; opacity: 1; display: flex; align-items: center; justify-content: center; - font-family: ${props => props.theme.common.fonts.sessionFontDefault}; + font-family: var(--font-default); border-radius: 50%; font-weight: 700; - background: ${props => props.theme.colors.destructive}; - transition: ${props => props.theme.common.animations.defaultDuration}; + background: var(--color-destructive); + transition: var(--default-duration); opacity: ${props => (props.shouldRender ? 1 : 0)}; text-align: center; color: white; diff --git a/ts/components/session/SessionPasswordPrompt.tsx b/ts/components/session/SessionPasswordPrompt.tsx index eecd566fab..a4c9bbeef6 100644 --- a/ts/components/session/SessionPasswordPrompt.tsx +++ b/ts/components/session/SessionPasswordPrompt.tsx @@ -1,10 +1,10 @@ import React from 'react'; import classNames from 'classnames'; -import { SessionIcon, SessionIconType } from './icon'; +import { SessionIcon } from './icon'; import { SessionButton, SessionButtonColor, SessionButtonType } from './SessionButton'; import { Constants } from '../../session'; -import { DefaultTheme, withTheme } from 'styled-components'; +import { withTheme } from 'styled-components'; import autoBind from 'auto-bind'; interface State { @@ -15,7 +15,7 @@ interface State { export const MAX_LOGIN_TRIES = 3; -class SessionPasswordPromptInner extends React.PureComponent<{ theme: DefaultTheme }, State> { +class SessionPasswordPromptInner extends React.PureComponent<{}, State> { private inputRef?: any; constructor(props: any) { @@ -31,7 +31,6 @@ class SessionPasswordPromptInner extends React.PureComponent<{ theme: DefaultThe } public componentDidMount() { - console.warn('this.inputRef', this.inputRef); setTimeout(() => { this.inputRef?.focus(); }, 100); @@ -68,19 +67,9 @@ class SessionPasswordPromptInner extends React.PureComponent<{ theme: DefaultThe /> ); const infoIcon = this.state.clearDataView ? ( - + ) : ( - + ); const errorSection = !this.state.clearDataView && (
diff --git a/ts/components/session/SessionRegistrationView.tsx b/ts/components/session/SessionRegistrationView.tsx index e78e3bb543..32058cbd10 100644 --- a/ts/components/session/SessionRegistrationView.tsx +++ b/ts/components/session/SessionRegistrationView.tsx @@ -2,44 +2,47 @@ import React, { useEffect } from 'react'; import { AccentText } from './AccentText'; import { RegistrationStages } from './registration/RegistrationStages'; -import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; +import { SessionIcon } from './icon'; import { SessionToastContainer } from './SessionToastContainer'; -import { lightTheme, SessionTheme } from '../../state/ducks/SessionTheme'; +import { SessionTheme } from '../../state/ducks/SessionTheme'; import { setSignInByLinking } from '../../session/utils/User'; +import { Flex } from '../basic/Flex'; +import { SpacerLG } from '../basic/Text'; export const SessionRegistrationView = () => { useEffect(() => { setSignInByLinking(false); }, []); return ( - -
- -
-
-
- { - window.close(); - }} - theme={lightTheme} - /> -
-
- brand -
-
-
-
- -
-
- -
-
-
+ + + + + + + + + + + + + + + + + + + + + + ); }; diff --git a/ts/components/session/SessionScrollButton.tsx b/ts/components/session/SessionScrollButton.tsx index 17d1cb6b07..20cf7d0f7e 100644 --- a/ts/components/session/SessionScrollButton.tsx +++ b/ts/components/session/SessionScrollButton.tsx @@ -1,9 +1,9 @@ -import React, { useContext } from 'react'; +import React from 'react'; import { useSelector } from 'react-redux'; -import styled, { ThemeContext } from 'styled-components'; +import styled from 'styled-components'; import { getShowScrollButton } from '../../state/selectors/conversations'; -import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; +import { SessionIconButton } from './icon'; type Props = { onClick?: () => any; @@ -13,22 +13,19 @@ const SessionScrollButtonDiv = styled.div` position: fixed; z-index: 2; right: 60px; - animation: fadein ${props => props.theme.common.animations.defaultDuration}; + animation: fadein var(--default-duration); `; export const SessionScrollButton = (props: Props) => { - const themeContext = useContext(ThemeContext); - const show = useSelector(getShowScrollButton); return ( - + ); diff --git a/ts/components/session/SessionSearchInput.tsx b/ts/components/session/SessionSearchInput.tsx index a7d3ebfe3d..5f85128591 100644 --- a/ts/components/session/SessionSearchInput.tsx +++ b/ts/components/session/SessionSearchInput.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useSelector } from 'react-redux'; import { getConversationsCount } from '../../state/selectors/conversations'; -import { SessionIconButton, SessionIconSize, SessionIconType } from './icon'; +import { SessionIconButton } from './icon'; type Props = { searchString: string; @@ -21,7 +21,7 @@ export const SessionSearchInput = (props: Props) => { return (
- + onChange(e.target.value)} diff --git a/ts/components/session/SessionToast.tsx b/ts/components/session/SessionToast.tsx index f5a9594ac8..2d0633ae58 100644 --- a/ts/components/session/SessionToast.tsx +++ b/ts/components/session/SessionToast.tsx @@ -1,8 +1,8 @@ -import React, { useContext } from 'react'; +import React from 'react'; -import { SessionIcon, SessionIconSize, SessionIconType } from './icon/'; +import { SessionIcon, SessionIconType } from './icon/'; import { Flex } from '../basic/Flex'; -import styled, { ThemeContext } from 'styled-components'; +import styled from 'styled-components'; import { noop } from 'lodash'; export enum SessionToastType { @@ -23,53 +23,51 @@ type Props = { }; const TitleDiv = styled.div` - font-size: ${props => props.theme.common.fonts.md}; - line-height: ${props => props.theme.common.fonts.md}; - font-family: ${props => props.theme.common.fonts.sessionFontDefault}; - color: ${props => props.theme.colors.textColor}; + font-size: var(--font-size-md); + line-height: var(--font-size-md); + font-family: var(--font-default); + color: var(--color-text); text-overflow: ellipsis; `; const DescriptionDiv = styled.div` - font-size: ${props => props.theme.common.fonts.sm}; - color: ${props => props.theme.colors.textColorSubtle}; + font-size: var(--font-size-sm); + color: var(--color-text-subtle); text-overflow: ellipsis; - font-family: ${props => props.theme.common.fonts.sessionFontDefault}; - padding-bottom: ${props => props.theme.common.fonts.xs}; - padding-top: ${props => props.theme.common.fonts.xs}; + font-family: var(--font-default); + padding-bottom: var(--font-size-xs); + padding-top: var(--font-size-xs); `; const IconDiv = styled.div` flex-shrink: 0; - padding-inline-end: ${props => props.theme.common.margins.xs}; + padding-inline-end: var(--margins-xs); `; export const SessionToast = (props: Props) => { const { title, description, type, icon } = props; - const theme = useContext(ThemeContext); - const toastDesc = description ? description : ''; - const toastIconSize = toastDesc ? SessionIconSize.Huge : SessionIconSize.Medium; + const toastIconSize = toastDesc ? 'huge' : 'medium'; // Set a custom icon or allow the theme to define the icon let toastIcon = icon || undefined; if (!toastIcon) { switch (type) { case SessionToastType.Info: - toastIcon = SessionIconType.Info; + toastIcon = 'info'; break; case SessionToastType.Success: - toastIcon = SessionIconType.Check; + toastIcon = 'check'; break; case SessionToastType.Error: - toastIcon = SessionIconType.Error; + toastIcon = 'error'; break; case SessionToastType.Warning: - toastIcon = SessionIconType.Warning; + toastIcon = 'warning'; break; default: - toastIcon = SessionIconType.Info; + toastIcon = 'info'; } } @@ -77,7 +75,7 @@ export const SessionToast = (props: Props) => { // tslint:disable-next-line: use-simple-attributes - + { additionalClassName, } = props; - const theme = useTheme(); - useKey( 'Esc', () => { @@ -84,12 +81,7 @@ export const SessionWrapperModal = (props: SessionWrapperModalType) => {
{showExitIcon ? ( - + ) : null}
{title}
@@ -100,10 +92,9 @@ export const SessionWrapperModal = (props: SessionWrapperModalType) => { ); }) diff --git a/ts/components/session/conversation/SessionCompositionBox.tsx b/ts/components/session/conversation/SessionCompositionBox.tsx index 653d89079a..dab9060fa0 100644 --- a/ts/components/session/conversation/SessionCompositionBox.tsx +++ b/ts/components/session/conversation/SessionCompositionBox.tsx @@ -4,7 +4,7 @@ import _, { debounce } from 'lodash'; import { AttachmentType } from '../../../types/Attachment'; import * as MIME from '../../../types/MIME'; -import { SessionIconButton, SessionIconSize, SessionIconType } from '../icon'; +import { SessionIconButton } from '../icon'; import { SessionEmojiPanel } from './SessionEmojiPanel'; import { SessionRecording } from './SessionRecording'; @@ -87,6 +87,61 @@ export type SendMessageType = { groupInvitation: { url: string | undefined; name: string } | undefined; }; +const AddStagedAttachmentButton = (props: { onClick: () => void }) => { + return ( + + ); +}; + +const StartRecordingButton = (props: { onClick: () => void }) => { + return ( + + ); +}; + +const ToggleEmojiButton = (props: { onClick: () => void }) => { + return ( + + ); +}; + +const SendMessageButton = (props: { onClick: () => void }) => { + return ( +
+ +
+ ); +}; + interface Props { sendMessage: (msg: SendMessageType) => void; draft: string; @@ -338,13 +393,7 @@ class SessionCompositionBoxInner extends React.Component { return ( <> - {typingEnabled && ( - - )} + {typingEnabled && } { onChange={this.onChoseAttachment} /> - {typingEnabled && ( - - )} + {typingEnabled && }
{ {this.renderTextArea()}
- {typingEnabled && ( - - )} -
- -
+ {typingEnabled && } + {typingEnabled && (
(this.emojiPanel = ref)} onKeyDown={this.onKeyDown} role="button"> diff --git a/ts/components/session/conversation/SessionConversation.tsx b/ts/components/session/conversation/SessionConversation.tsx index a952d277be..9a000e4151 100644 --- a/ts/components/session/conversation/SessionConversation.tsx +++ b/ts/components/session/conversation/SessionConversation.tsx @@ -14,7 +14,7 @@ import { AttachmentUtil, GoogleChrome } from '../../../util'; import { ConversationHeaderWithDetails } from '../../conversation/ConversationHeader'; import { SessionRightPanelWithDetails } from './SessionRightPanel'; import { SessionTheme } from '../../../state/ducks/SessionTheme'; -import styled, { DefaultTheme } from 'styled-components'; +import styled from 'styled-components'; import { SessionMessagesListContainer } from './SessionMessagesListContainer'; import { LightboxGallery, MediaItemType } from '../../LightboxGallery'; @@ -57,7 +57,6 @@ interface Props { ourNumber: string; selectedConversationKey: string; selectedConversation?: ReduxConversationType; - theme: DefaultTheme; messagesProps: Array; selectedMessages: Array; showMessageDetails: boolean; @@ -75,8 +74,8 @@ const SessionUnreadAboveIndicator = styled.div` margin: 1em; display: flex; justify-content: center; - background: ${props => props.theme.colors.sentMessageBackground}; - color: ${props => props.theme.colors.sentMessageText}; + background: var(--color-sent-message-background); + color: var(--color-sent-message-text); `; const UnreadAboveIndicator = () => { @@ -246,7 +245,7 @@ export class SessionConversation extends React.Component { const selectionMode = selectedMessages.length > 0; return ( - +
diff --git a/ts/components/session/conversation/SessionFileDropzone.tsx b/ts/components/session/conversation/SessionFileDropzone.tsx index fb7c97e446..1f8d44ae24 100644 --- a/ts/components/session/conversation/SessionFileDropzone.tsx +++ b/ts/components/session/conversation/SessionFileDropzone.tsx @@ -1,7 +1,7 @@ -import React, { useContext } from 'react'; -import styled, { ThemeContext } from 'styled-components'; +import React from 'react'; +import styled from 'styled-components'; import { Flex } from '../../basic/Flex'; -import { SessionIcon, SessionIconSize, SessionIconType } from '../icon'; +import { SessionIcon } from '../icon'; const DropZoneContainer = styled.div` display: inline-block; @@ -12,8 +12,8 @@ const DropZoneContainer = styled.div` `; const DropZoneWithBorder = styled.div` - border: dashed 4px ${props => props.theme.colors.accent}; - background-color: ${props => props.theme.colors.clickableHovered}; + border: dashed 4px var(--color-accent); + background-color: var(--color-clickable-hovered); position: absolute; top: 0; bottom: 0; @@ -25,17 +25,11 @@ const DropZoneWithBorder = styled.div` `; export const SessionFileDropzone = () => { - const themeContext = useContext(ThemeContext); - return ( - + diff --git a/ts/components/session/conversation/SessionLastSeenIndicator.tsx b/ts/components/session/conversation/SessionLastSeenIndicator.tsx index 33a5b516d5..486cb3c02f 100644 --- a/ts/components/session/conversation/SessionLastSeenIndicator.tsx +++ b/ts/components/session/conversation/SessionLastSeenIndicator.tsx @@ -12,7 +12,7 @@ const LastSeenBarContainer = styled.div` const LastSeenBar = styled.div` width: 100%; height: 2px; - background-color: ${props => props.theme.colors.lastSeenIndicatorColor}; + background-color: var(--color-last-seen-indicator); `; const LastSeenText = styled.div` @@ -23,7 +23,7 @@ const LastSeenText = styled.div` text-transform: uppercase; text-align: center; - color: ${props => props.theme.colors.lastSeenIndicatorTextColor}; + color: var(--color-last-seen-indicator-text); `; export const SessionLastSeenIndicator = () => { diff --git a/ts/components/session/conversation/SessionMessagesList.tsx b/ts/components/session/conversation/SessionMessagesList.tsx index b555301a4c..6f74cd5f67 100644 --- a/ts/components/session/conversation/SessionMessagesList.tsx +++ b/ts/components/session/conversation/SessionMessagesList.tsx @@ -19,7 +19,6 @@ export const SessionMessagesList = (props: { scrollToQuoteMessage: (options: QuoteClickOptions) => Promise; }) => { const messagesProps = useSelector(getSortedMessagesTypesOfSelectedConversation); - return ( <> {messagesProps.map(messageProps => { diff --git a/ts/components/session/conversation/SessionMessagesListContainer.tsx b/ts/components/session/conversation/SessionMessagesListContainer.tsx index 3278e3295e..505cb4c328 100644 --- a/ts/components/session/conversation/SessionMessagesListContainer.tsx +++ b/ts/components/session/conversation/SessionMessagesListContainer.tsx @@ -65,12 +65,36 @@ class SessionMessagesListContainerInner extends React.Component { } } - public componentDidUpdate(prevProps: Props) { + public componentDidUpdate( + prevProps: Props, + _prevState: any, + snapShot: { fakeScrollTop: number; realScrollTop: number; scrollHeight: number } + ) { + // this was hard to write, it should be hard to read + // just make sure you don't remove that as a bug in chrome makes the column-reverse do bad things + // https://bugs.chromium.org/p/chromium/issues/detail?id=1189195&q=column-reverse&can=2#makechanges + const currentRef = this.props.messageContainerRef.current; const isSameConvo = prevProps.conversationKey === this.props.conversationKey; - if ( - !isSameConvo || - (prevProps.messagesProps.length === 0 && this.props.messagesProps.length !== 0) - ) { + const prevMsgLength = prevProps.messagesProps.length; + const newMsgLength = this.props.messagesProps.length; + + const prevFirstMesssageId = prevProps.messagesProps[0]?.propsForMessage.id; + const newFirstMesssageId = this.props.messagesProps[0]?.propsForMessage.id; + const messageAddedWasMoreRecentOne = prevFirstMesssageId !== newFirstMesssageId; + + if (isSameConvo && snapShot?.realScrollTop && prevMsgLength !== newMsgLength) { + if (messageAddedWasMoreRecentOne) { + if (snapShot.scrollHeight - snapShot.realScrollTop < 50) { + // consider that we were scrolled to bottom + currentRef.scrollTop = 0; + } else { + currentRef.scrollTop = -(currentRef.scrollHeight - snapShot.realScrollTop); + } + } else { + currentRef.scrollTop = snapShot.fakeScrollTop; + } + } + if (!isSameConvo || (prevMsgLength === 0 && newMsgLength !== 0)) { this.setupTimeoutResetQuotedHighlightedMessage(this.props.animateQuotedMessageId); // displayed conversation changed. We have a bit of cleaning to do here @@ -78,6 +102,23 @@ class SessionMessagesListContainerInner extends React.Component { } } + public getSnapshotBeforeUpdate() { + const messageContainer = this.props.messageContainerRef.current; + + const scrollTop = messageContainer.scrollTop; + const scrollHeight = messageContainer.scrollHeight; + + // as we use column-reverse for displaying message list + // the top is < 0 + // tslint:disable-next-line: restrict-plus-operands + const realScrollTop = scrollHeight + scrollTop; + return { + realScrollTop, + fakeScrollTop: scrollTop, + scrollHeight: scrollHeight, + }; + } + public render() { const { conversationKey, conversation } = this.props; diff --git a/ts/components/session/conversation/SessionQuotedMessageComposition.tsx b/ts/components/session/conversation/SessionQuotedMessageComposition.tsx index 2b8b93354f..c814ee9dd3 100644 --- a/ts/components/session/conversation/SessionQuotedMessageComposition.tsx +++ b/ts/components/session/conversation/SessionQuotedMessageComposition.tsx @@ -1,7 +1,7 @@ import React, { useCallback } from 'react'; import { Flex } from '../../basic/Flex'; -import { SessionIcon, SessionIconButton, SessionIconSize, SessionIconType } from '../icon'; -import styled, { useTheme } from 'styled-components'; +import { SessionIcon, SessionIconButton } from '../icon'; +import styled from 'styled-components'; import { getAlt, isAudio } from '../../../types/Attachment'; import { Image } from '../../conversation/Image'; import { AUDIO_MP3 } from '../../../types/MIME'; @@ -11,16 +11,16 @@ import { quoteMessage } from '../../../state/ducks/conversations'; const QuotedMessageComposition = styled.div` width: 100%; - padding-inline-end: ${props => props.theme.common.margins.md}; - padding-inline-start: ${props => props.theme.common.margins.md}; + padding-inline-end: var(--margins-md); + padding-inline-start: var(--margins-md); `; const QuotedMessageCompositionReply = styled.div` - background: ${props => props.theme.colors.quoteBottomBarBackground}; - border-radius: ${props => props.theme.common.margins.sm}; - padding: ${props => props.theme.common.margins.xs}; - box-shadow: ${props => props.theme.colors.sessionShadow}; - margin: ${props => props.theme.common.margins.xs}; + background: var(--color-quote-bottom-bar-background); + border-radius: var(--margins-sm); + padding: var(--margins-xs); + box-shadow: --color-session-shadow; + margin: var(--margins-xs); `; const Subtle = styled.div` @@ -30,15 +30,14 @@ const Subtle = styled.div` -webkit-line-clamp: 3; -webkit-box-orient: vertical; display: -webkit-box; - color: ${props => props.theme.colors.textColor}; + color: var(--color-text); `; const ReplyingTo = styled.div` - color: ${props => props.theme.colors.textColor}; + color: var(--color-text); `; export const SessionQuotedMessageComposition = () => { - const theme = useTheme(); const quotedMessageProps = useSelector(getQuotedMessage); const dispatch = useDispatch(); @@ -68,23 +67,18 @@ export const SessionQuotedMessageComposition = () => { } return ( - + {window.i18n('replyingToMessage')} - + - + {(hasAttachments && window.i18n('mediaMessage')) || body} {hasImageAttachment && ( @@ -97,13 +91,7 @@ export const SessionQuotedMessageComposition = () => { /> )} - {hasAudioAttachment && ( - - )} + {hasAudioAttachment && } diff --git a/ts/components/session/conversation/SessionRecording.tsx b/ts/components/session/conversation/SessionRecording.tsx index 6f2f77909a..9cf77acc33 100644 --- a/ts/components/session/conversation/SessionRecording.tsx +++ b/ts/components/session/conversation/SessionRecording.tsx @@ -2,7 +2,7 @@ import React from 'react'; import classNames from 'classnames'; import moment from 'moment'; -import { SessionIconButton, SessionIconSize, SessionIconType } from '../icon'; +import { SessionIconButton } from '../icon'; import { Constants } from '../../../session'; import { ToastUtils } from '../../../session/utils'; import autoBind from 'auto-bind'; @@ -129,41 +129,28 @@ class SessionRecordingInner extends React.Component { {isRecording && ( )} {actionPauseAudio && ( - + )} {hasRecordingAndPaused && ( - + )} {hasRecording && ( )} - {actionDefault && ( - - )} + {actionDefault && }
{hasRecording && !isRecording ? ( @@ -187,8 +174,8 @@ class SessionRecordingInner extends React.Component { )} > diff --git a/ts/components/session/conversation/SessionRightPanel.tsx b/ts/components/session/conversation/SessionRightPanel.tsx index ec857e717e..2d4df68138 100644 --- a/ts/components/session/conversation/SessionRightPanel.tsx +++ b/ts/components/session/conversation/SessionRightPanel.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { SessionIconButton, SessionIconSize, SessionIconType } from '../icon'; +import { SessionIconButton } from '../icon'; import { Avatar, AvatarSize } from '../../Avatar'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../SessionButton'; import { SessionDropdown } from '../SessionDropdown'; @@ -7,7 +7,6 @@ import { MediaGallery } from '../../conversation/media-gallery/MediaGallery'; import _ from 'lodash'; import { Constants } from '../../../session'; import { AttachmentTypeWithPath } from '../../../types/Attachment'; -import { useTheme } from 'styled-components'; import { getMessagesWithFileAttachments, getMessagesWithVisualMediaAttachments, @@ -110,7 +109,6 @@ async function getMediaGalleryProps( const HeaderItem = () => { const selectedConversation = useSelector(getSelectedConversation); - const theme = useTheme(); const dispatch = useDispatch(); const memberDetails = useMembersAvatars(selectedConversation); @@ -135,13 +133,12 @@ const HeaderItem = () => { return (
{ dispatch(closeRightPanel()); }} - theme={theme} /> {
{showInviteContacts && ( { if (selectedConversation) { showInviteContactByConvoId(selectedConversation.id); } }} - theme={theme} /> )}
diff --git a/ts/components/session/icon/Icons.tsx b/ts/components/session/icon/Icons.tsx index 4e0aa2c0e2..de70a859c7 100644 --- a/ts/components/session/icon/Icons.tsx +++ b/ts/components/session/icon/Icons.tsx @@ -1,119 +1,118 @@ -export enum SessionIconType { - AddUser = 'addUser', - Arrow = 'arrow', - BellMention = 'bell', - Caret = 'caret', - ChatBubble = 'chatBubble', - Check = 'check', - Chevron = 'chevron', - Circle = 'circle', - CircleCheck = 'circleCheck', - DoubleCheckCircleFilled = 'doubleCheckCircleFilled', - CirclePlus = 'circlePlus', - CircleElipses = 'circleElipses', - Contacts = 'contacts', - Delete = 'delete', - Ellipses = 'ellipses', - Emoji = 'emoji', - Error = 'error', - Eye = 'eye', - Exit = 'exit', - File = 'file', - Gear = 'gear', - Globe = 'globe', - Info = 'info', - Link = 'link', - Lock = 'lock', - Microphone = 'microphone', - Moon = 'moon', - Mute = 'mute', - Oxen = 'oxen', - Pause = 'pause', - Pencil = 'pencil', - Pin = 'pin', - Play = 'play', - Plus = 'plus', - Reply = 'reply', - Search = 'search', - Send = 'send', - Shield = 'shield', - Star = 'star', - Stopwatch = 'stopwatch', - Sun = 'sun', - QR = 'qr', - Users = 'users', - Upload = 'upload', - Warning = 'warning', - Sending = 'sending', - DoubleCheckCircle = 'doubleCheckCircle', - Gallery = 'gallery', - Timer00 = 'timer00', - Timer05 = 'timer05', - Timer10 = 'timer10', - Timer15 = 'timer15', - Timer20 = 'timer20', - Timer25 = 'timer25', - Timer30 = 'timer30', - Timer35 = 'timer35', - Timer40 = 'timer40', - Timer45 = 'timer45', - Timer50 = 'timer50', - Timer55 = 'timer55', - Timer60 = 'timer60', -} +export type SessionIconType = + | 'addUser' + | 'arrow' + | 'bell' + | 'brand' + | 'caret' + | 'chatBubble' + | 'check' + | 'chevron' + | 'circle' + | 'circleCheck' + | 'doubleCheckCircleFilled' + | 'circlePlus' + | 'circleElipses' + | 'contacts' + | 'delete' + | 'ellipses' + | 'emoji' + | 'error' + | 'eye' + | 'exit' + | 'file' + | 'gear' + | 'globe' + | 'info' + | 'link' + | 'lock' + | 'microphone' + | 'moon' + | 'mute' + | 'oxen' + | 'pause' + | 'pencil' + | 'pin' + | 'play' + | 'plus' + | 'plusThin' + | 'reply' + | 'search' + | 'send' + | 'shield' + | 'star' + | 'stopwatch' + | 'qr' + | 'users' + | 'upload' + | 'warning' + | 'sending' + | 'doubleCheckCircle' + | 'gallery' + | 'timer00' + | 'timer05' + | 'timer10' + | 'timer15' + | 'timer20' + | 'timer25' + | 'timer30' + | 'timer35' + | 'timer40' + | 'timer45' + | 'timer50' + | 'timer55' + | 'timer60'; -export enum SessionIconSize { - Tiny = 'tiny', - Small = 'small', - Medium = 'medium', - Large = 'large', - Huge = 'huge', - Max = 'max', -} +export type SessionIconSize = 'tiny' | 'small' | 'medium' | 'large' | 'huge' | 'huge2' | 'max'; export const icons = { - [SessionIconType.AddUser]: { + addUser: { path: 'M8.85,2.17c-1.73,0-3.12,1.4-3.12,3.12s1.4,3.12,3.12,3.12c1.73,0,3.13-1.4,3.13-3.12S10.58,2.17,8.85,2.17z M8.85,0.08c2.88,0,5.21,2.33,5.21,5.21s-2.33,5.21-5.21,5.21s-5.2-2.33-5.2-5.21C3.65,2.42,5.98,0.08,8.85,0.08z M20.83,5.29 c0.54,0,0.98,0.41,1.04,0.93l0.01,0.11v2.08h2.08c0.54,0,0.98,0.41,1.04,0.93v0.12c0,0.54-0.41,0.98-0.93,1.04l-0.11,0.01h-2.08 v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08h-2.08c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11 c0-0.54,0.41-0.98,0.93-1.04l0.11-0.01h2.08V6.34C19.79,5.76,20.26,5.29,20.83,5.29z M12.5,12.58c2.8,0,5.09,2.21,5.2,4.99v0.22 v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08c0-1.67-1.3-3.03-2.95-3.12h-0.18H5.21 c-1.67,0-3.03,1.3-3.12,2.95v0.18v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93L0,19.88V17.8 c0-2.8,2.21-5.09,4.99-5.2h0.22h7.29V12.58z', viewBox: '0 0 25 21', ratio: 1, }, - [SessionIconType.Arrow]: { + arrow: { path: 'M33.187,12.438 L6.097,12.438 L16.113,2.608 C16.704,2.027 16.713,1.078 16.133,0.486 C15.551,-0.105 14.602,-0.113 14.011,0.466 L1.407,12.836 C1.121,13.117 0.959,13.5 0.957981241,13.9 C0.956,14.3 1.114,14.685 1.397,14.968 L14.022,27.593 C14.315,27.886 14.699,28.032 15.083,28.032 C15.466,28.032 15.85,27.886 16.143,27.593 C16.729,27.007 16.729,26.057 16.143,25.472 L6.109,15.438 L33.187,15.438 C34.015,15.438 34.687,14.766 34.687,13.938 C34.687,13.109 34.015,12.438 33.187,12.438', viewBox: '0 -4 37 37', ratio: 1, }, - [SessionIconType.BellMention]: { + bell: { path: 'M2.117 0a.396.396 0 00-.397.397v.18C.963.757.53 1.434.53 2.25v1.323l-.53.53v.264h4.233V4.1l-.529-.53v-.223h-.29c-.066 0-.132-.006-.197-.015v.546l-2.159-.042V2.249c0-.656.4-1.19 1.059-1.19l.064.003c.119-.181.278-.334.463-.448a1.608 1.608 0 00-.13-.036v-.18A.396.396 0 002.117 0zm-.53 4.63a.53.53 0 001.058 0z M3.355.578a1.267 1.267 0 000 2.534h.634v-.254h-.634c-.55 0-1.013-.464-1.013-1.013 0-.55.463-1.014 1.013-1.014.55 0 1.014.464 1.014 1.014v.18c0 .1-.09.2-.19.2s-.19-.1-.19-.2v-.18a.634.634 0 10-.185.447.47.47 0 00.375.186c.25 0 .443-.203.443-.452v-.181c0-.7-.567-1.267-1.267-1.267zm0 1.647a.38.38 0 110-.76.38.38 0 010 .76z', viewBox: '0 0 4.622 5.159', ratio: 1, }, - [SessionIconType.Caret]: { + brand: { + path: + 'm 216.456,315.282 c 36.104,0 66.415,-29.551 65.565,-65.646 -0.59,-25.135 -14.478,-48.161 -36.54,-60.386 l -83.435,-46.234 v 69.229 c 0,5.18855 -4.20645,9.39455 -9.395,9.394 H 67.847 c -26.603,0 -48.093,22.297 -46.765,49.183 1.242,25.15 22.941,44.46 48.123,44.46 h 147.251 m -75.437,-121.993 0.016,-69.217 c 0.002,-5.186 4.19,-9.391 9.376,-9.392 l 84.808,-0.014 c 26.602,0 48.092,-22.297 46.764,-49.181 C 280.74,40.334 259.041,21.023 233.858,21.023 H 86.608 c -36.103,0 -66.415,29.551 -65.565,65.646 0.591,25.136 14.479,48.161 36.541,60.386 z m 114.65,-22.427 c 29.233,16.2 47.395,47.023 47.395,80.448 0,46.865 -38.129,84.995 -84.995,84.995 H 67.847 C 30.437,336.305 0,305.867 0,268.459 0,231.051 30.437,200.616 67.847,200.616 h 43.026 L 47.396,165.445 C 18.162,149.243 0,118.42 0,84.995 0,38.131 38.13,0 84.995,0 h 150.224 c 37.408,0 67.845,30.438 67.845,67.846 0,37.409 -30.437,67.843 -67.845,67.843 h -43.028 l 63.478,35.173', + viewBox: '0 0 404.085 448.407', + ratio: 1, + }, + caret: { path: 'M127.5 191.25L255 63.75L0 63.75L127.5 191.25Z', viewBox: '-200 -200 640 640', ratio: 1, }, - [SessionIconType.ChatBubble]: { + chatBubble: { path: 'M6.29289322,16.2928932 C6.4804296,16.1053568 6.73478351,16 7,16 L19,16 C19.5522847,16 20,15.5522847 20,15 L20,5 C20,4.44771525 19.5522847,4 19,4 L5,4 C4.44771525,4 4,4.44771525 4,5 L4,18.5857864 L6.29289322,16.2928932 Z M7.41421356,18 L3.70710678,21.7071068 C3.07714192,22.3370716 2,21.8909049 2,21 L2,5 C2,3.34314575 3.34314575,2 5,2 L19,2 C20.6568542,2 22,3.34314575 22,5 L22,15 C22,16.6568542 20.6568542,18 19,18 L7.41421356,18 Z', viewBox: '0.5 2 23 20', ratio: 1, }, - [SessionIconType.Check]: { + check: { path: 'M0.77,2.61c-0.15-0.15-0.38-0.15-0.53,0c-0.15,0.15-0.15,0.38,0,0.53l1.87,1.87c0.15,0.15,0.38,0.15,0.53,0 l4.12-4.12c0.15-0.15,0.15-0.38,0-0.53c-0.15-0.15-0.38-0.15-0.53,0L2.38,4.22L0.77,2.61z', viewBox: '0 0 7 6', ratio: 1, }, - [SessionIconType.Chevron]: { + chevron: { path: 'M12,13.5857864 L6.70710678,8.29289322 C6.31658249,7.90236893 5.68341751,7.90236893 5.29289322,8.29289322 C4.90236893,8.68341751 4.90236893,9.31658249 5.29289322,9.70710678 L11.2928932,15.7071068 C11.6834175,16.0976311 12.3165825,16.0976311 12.7071068,15.7071068 L18.7071068,9.70710678 C19.0976311,9.31658249 19.0976311,8.68341751 18.7071068,8.29289322 C18.3165825,7.90236893 17.6834175,7.90236893 17.2928932,8.29289322 L12,13.5857864 Z', viewBox: '1.5 5.5 21 12', ratio: 1, }, - [SessionIconType.Circle]: { + circle: { path: '\ M 0, 50\ a 50,50 0 1,1 100,0\ @@ -122,307 +121,307 @@ export const icons = { viewBox: '0 0 100 100', ratio: 1, }, - [SessionIconType.CircleCheck]: { + circleCheck: { path: 'M4.77,7.61c-0.15-0.15-0.38-0.15-0.53,0c-0.15,0.15-0.15,0.38,0,0.53l1.88,1.88c0.15,0.15,0.38,0.15,0.53,0 l4.13-4.12c0.15-0.15,0.15-0.38,0-0.53c-0.15-0.15-0.38-0.15-0.53,0L6.38,9.22L4.77,7.61z', viewBox: '4 4 7 7', ratio: 1, }, - [SessionIconType.Delete]: { + delete: { path: 'M11.17 37.16h83.48a8.4 8.4 0 012 .16 5.93 5.93 0 012.88 1.56 5.43 5.43 0 011.64 3.34 7.65 7.65 0 01-.06 1.44L94 117.31V117.72a7.06 7.06 0 01-.2.9v.06a5.89 5.89 0 01-5.47 4.07H17.32a6.17 6.17 0 01-1.25-.19 6.17 6.17 0 01-1.16-.48 6.18 6.18 0 01-3.08-4.88l-7-73.49a7.69 7.69 0 01-.06-1.66 5.37 5.37 0 011.63-3.29 6 6 0 013-1.58 8.94 8.94 0 011.79-.13zM5.65 8.8h31.47V6a2.44 2.44 0 010-.27 6 6 0 011.76-4A6 6 0 0143.09 0h19.67a6 6 0 015.7 6v2.8h32.39a4.7 4.7 0 014.31 4.43v10.36a2.59 2.59 0 01-2.59 2.59H2.59A2.59 2.59 0 010 23.62V13.53a1.56 1.56 0 010-.31 4.72 4.72 0 013.88-4.34 10.4 10.4 0 011.77-.08zm42.1 52.7a4.77 4.77 0 019.49 0v37a4.77 4.77 0 01-9.49 0v-37zm23.73-.2a4.58 4.58 0 015-4.06 4.47 4.47 0 014.51 4.46l-2 37a4.57 4.57 0 01-5 4.06 4.47 4.47 0 01-4.51-4.46l2-37zM25 61.7a4.46 4.46 0 014.5-4.46 4.58 4.58 0 015 4.06l2 37a4.47 4.47 0 01-4.51 4.46 4.57 4.57 0 01-5-4.06l-2-37z', viewBox: '0 0 105.16 122.88', ratio: 1, }, - [SessionIconType.DoubleCheckCircleFilled]: { + doubleCheckCircleFilled: { path: 'M7.91731278,0.313257194 C6.15053376,1.58392424 5,3.65760134 5,6 C5,6.343797 5.0247846,6.68180525 5.07266453,7.01233547 L5,7.085 L3.205,5.295 L2.5,6 L5,8.5 L5.33970233,8.16029767 C5.80439817,9.59399486 6.71914823,10.8250231 7.91731278,11.6867428 C7.31518343,11.8898758 6.67037399,12 6,12 C2.688,12 0,9.312 0,6 C0,2.688 2.688,0 6,0 C6.67037399,0 7.31518343,0.110124239 7.91731278,0.313257194 Z M12,0 C15.312,0 18,2.688 18,6 C18,9.312 15.312,12 12,12 C8.688,12 6,9.312 6,6 C6,2.688 8.688,0 12,0 Z M11,8.5 L15.5,4 L14.795,3.29 L11,7.085 L9.205,5.295 L8.5,6 L11,8.5 Z', viewBox: '3 0 13 13', ratio: 1.6, }, - [SessionIconType.CircleElipses]: { + circleElipses: { path: 'M4.76,7.47c0-0.32,0.26-0.57,0.57-0.57c0.32,0,0.57,0.25,0.57,0.57c0,0.31-0.25,0.57-0.57,0.57 C5.02,8.04,4.76,7.78,4.76,7.47z M7.04,7.47c0-0.32,0.26-0.57,0.57-0.57c0.32,0,0.57,0.25,0.57,0.57c0,0.31-0.25,0.57-0.57,0.57 C7.3,8.04,7.04,7.78,7.04,7.47z M9.32,7.47c0-0.32,0.26-0.57,0.57-0.57c0.32,0,0.57,0.25,0.57,0.57c0,0.31-0.25,0.57-0.57,0.57 C9.58,8.04,9.32,7.78,9.32,7.47z', viewBox: '0 0 15 15', ratio: 1, }, - [SessionIconType.CirclePlus]: { + circlePlus: { path: 'M13.51,8.82c-0.35,0-0.63,0.28-0.62,0.62v3.43H9.46c-0.35,0-0.63,0.28-0.62,0.62 c0,0.35,0.28,0.63,0.62,0.62h3.43v3.43c-0.02,0.35,0.27,0.63,0.61,0.63c0.17,0,0.33-0.07,0.44-0.18 c0.11-0.11,0.18-0.27,0.18-0.44v-3.43h3.43c0.17,0,0.33-0.07,0.44-0.18c0.11-0.11,0.18-0.27,0.18-0.44 c0-0.35-0.28-0.63-0.62-0.62h-3.43V9.44C14.13,9.09,13.85,8.81,13.51,8.82z M21.46,5.54c4.39,4.39,4.39,11.53,0,15.92 c-4.39,4.39-11.53,4.39-15.92,0s-4.39-11.53,0-15.92C9.93,1.15,17.07,1.15,21.46,5.54z M22.34,22.34 c4.88-4.88,4.88-12.81,0-17.69s-12.81-4.88-17.69,0s-4.88,12.81,0,17.69S17.47,27.22,22.34,22.34z M13.51,8.82c-0.35,0-0.63,0.28-0.62,0.62v3.43H9.46c-0.35,0-0.63,0.28-0.62,0.62 c0,0.35,0.28,0.63,0.62,0.62h3.43v3.43c-0.02,0.35,0.27,0.63,0.61,0.63c0.17,0,0.33-0.07,0.44-0.18 c0.11-0.11,0.18-0.27,0.18-0.44v-3.43h3.43c0.17,0,0.33-0.07,0.44-0.18c0.11-0.11,0.18-0.27,0.18-0.44 c0-0.35-0.28-0.63-0.62-0.62h-3.43V9.44C14.13,9.09,13.85,8.81,13.51,8.82z M21.46,5.54c4.39,4.39,4.39,11.53,0,15.92 c-4.39,4.39-11.53,4.39-15.92,0c-4.39-4.39-4.39-11.53,0-15.92C9.93,1.15,17.07,1.15,21.46,5.54z M22.34,22.34 c4.88-4.88,4.88-12.81,0-17.69s-12.81-4.88-17.69,0s-4.88,12.81,0,17.69S17.47,27.22,22.34,22.34z', viewBox: '0 0 27 27', ratio: 1, }, - [SessionIconType.Contacts]: { + contacts: { path: 'M13,14 C15.6887547,14 17.8818181,16.1223067 17.9953805,18.7831104 L18,19 L18,21 C18,21.5522847 17.5522847,22 17,22 C16.4871642,22 16.0644928,21.6139598 16.0067277,21.1166211 L16,21 L16,19 C16,17.4023191 14.75108,16.0963391 13.1762728,16.0050927 L13,16 L5,16 C3.40231912,16 2.09633912,17.24892 2.00509269,18.8237272 L2,19 L2,21 C2,21.5522847 1.55228475,22 1,22 C0.487164161,22 0.0644928393,21.6139598 0.00672773133,21.1166211 L0,21 L0,19 C0,16.3112453 2.12230671,14.1181819 4.78311038,14.0046195 L5,14 L13,14 Z M20.2499997,14.1617541 C22.3827066,14.712416 23.8947586,16.5896121 23.994728,18.773074 L24,19 L24,21 C24,21.5522847 23.5522847,22 23,22 C22.4871642,22 22.0644928,21.6139598 22.0067277,21.1166211 L22,21 L22.0000003,19.0007459 C21.9989805,17.6335842 21.0737494,16.440036 19.7500003,16.0982459 C19.2152528,15.9601749 18.8936831,15.4147477 19.0317541,14.8800003 C19.1698251,14.3452528 19.7152523,14.0236831 20.2499997,14.1617541 Z M9,2 C11.7614237,2 14,4.23857625 14,7 C14,9.76142375 11.7614237,12 9,12 C6.23857625,12 4,9.76142375 4,7 C4,4.23857625 6.23857625,2 9,2 Z M16.2480392,2.16125 C18.4604327,2.72771223 20.0078433,4.72123893 20.0078433,7.005 C20.0078433,9.28876107 18.4604327,11.2822878 16.2480392,11.84875 C15.7130133,11.9857383 15.1682383,11.663065 15.03125,11.1280392 C14.8942617,10.5930133 15.216935,10.0482383 15.7519608,9.91125 C17.0793969,9.57137266 18.0078433,8.37525664 18.0078433,7.005 C18.0078433,5.63474336 17.0793969,4.43862734 15.7519608,4.09875 C15.216935,3.96176174 14.8942617,3.41698667 15.03125,2.88196081 C15.1682383,2.34693496 15.7130133,2.02426174 16.2480392,2.16125 Z M9,4 C7.34314575,4 6,5.34314575 6,7 C6,8.65685425 7.34314575,10 9,10 C10.6568542,10 12,8.65685425 12,7 C12,5.34314575 10.6568542,4 9,4', viewBox: '0 2.5 24 20', ratio: 1, }, - [SessionIconType.Ellipses]: { + ellipses: { path: 'M30,16c4.411,0,8-3.589,8-8s-3.589-8-8-8s-8,3.589-8,8S25.589,16,30,16z M30,22c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S34.411,22,30,22z M30,44c-4.411,0-8,3.589-8,8s3.589,8,8,8s8-3.589,8-8S34.411,44,30,44z', viewBox: '-5 -5 65 65', ratio: 1, }, - [SessionIconType.Emoji]: { + emoji: { path: 'M658.5,23 L658.5,23 C664.29899,23 669,18.2989899 669,12.5 C669,6.70101013 664.29899,2 658.5,2 C652.70101,2 648,6.70101013 648,12.5 C648,18.2989899 652.70101,23 658.5,23 L658.5,23 Z M658.5,0 C665.403559,0 671,5.59644063 671,12.5 C671,19.3005212 665.569371,24.8326509 658.808227,24.9962742 L658.5,25 C651.596441,25 646,19.4035594 646,12.5 C646,5.59644063 651.596441,0 658.5,0 Z M660.798501,17.7873294 C660.742971,17.8419887 660.574401,17.9669753 660.297777,18.1043071 C659.802509,18.3501864 659.201612,18.5 658.48738,18.5 C657.77446,18.5 657.180037,18.3508621 656.694112,18.1065603 C656.532157,18.0251362 656.396978,17.9401014 656.288844,17.8583962 C656.235083,17.8177752 656.208774,17.7945605 656.210408,17.7962096 C655.821715,17.4038623 655.188557,17.4008996 654.79621,17.7895923 C654.403862,18.1782849 654.4009,18.811443 654.789592,19.2037904 C654.985716,19.4017586 655.319663,19.6540855 655.795746,19.8934397 C656.552967,20.2741379 657.453192,20.5 658.48738,20.5 C659.520256,20.5 660.423471,20.2748136 661.187124,19.8956929 C661.665852,19.6580247 662.003047,19.4080113 662.201499,19.2126706 C662.595096,18.8252434 662.600098,18.1920982 662.212671,17.7985011 C661.825243,17.404904 661.192098,17.3999023 660.798501,17.7873294 Z M653,12 C652.171573,12 651.5,12.6715729 651.5,13.5 C651.5,14.3284271 652.171573,15 653,15 C653.828427,15 654.5,14.3284271 654.5,13.5 C654.5,12.6715729 653.828427,12 653,12 Z M664,12 C663.171573,12 662.5,12.6715729 662.5,13.5 C662.5,14.3284271 663.171573,15 664,15 C664.828427,15 665.5,14.3284271 665.5,13.5 C665.5,12.6715729 664.828427,12 664,12', viewBox: '645 0 26 26', ratio: 1, }, - [SessionIconType.Error]: { + error: { path: 'M164.666,0C73.871,0,0.004,73.871,0.004,164.672c0.009,90.792,73.876,164.656,164.662,164.656 c90.793,0,164.658-73.865,164.658-164.658C329.324,73.871,255.459,0,164.666,0z M164.666,30c31.734,0,60.933,11.042,83.975,29.477 L59.478,248.638c-18.431-23.04-29.471-52.237-29.474-83.967C30.004,90.413,90.413,30,164.666,30z M164.666,299.328 c-31.733,0-60.934-11.042-83.977-29.477L269.854,80.691c18.431,23.043,29.471,52.244,29.471,83.979 C299.324,238.921,238.917,299.328,164.666,299.328z', viewBox: '0 0 329.328 329.328', ratio: 1, }, - [SessionIconType.Eye]: { + eye: { path: 'M12,3 C15.3798024,3 18.3386923,4.63249094 20.8545372,7.31605887 C21.7188737,8.23801779 22.4694995,9.22244509 23.1056644,10.2074746 C23.4900327,10.8026256 23.7538591,11.2716502 23.8944272,11.5527864 C24.0351909,11.8343139 24.0351909,12.1656861 23.8944272,12.4472136 C23.7538591,12.7283498 23.4900327,13.1973744 23.1056644,13.7925254 C22.4694995,14.7775549 21.7188737,15.7619822 20.8545372,16.6839411 C18.3386923,19.3675091 15.3798024,21 12,21 C8.62019756,21 5.66130774,19.3675091 3.1454628,16.6839411 C2.28112631,15.7619822 1.5305005,14.7775549 0.894335622,13.7925254 C0.50996726,13.1973744 0.246140906,12.7283498 0.105572809,12.4472136 C-0.0351909363,12.1656861 -0.0351909363,11.8343139 0.105572809,11.5527864 C0.246140906,11.2716502 0.50996726,10.8026256 0.894335622,10.2074746 C1.5305005,9.22244509 2.28112631,8.23801779 3.1454628,7.31605887 C5.66130774,4.63249094 8.62019756,3 12,3 Z M12,5 C9.25480244,5 6.77619226,6.36750906 4.6045372,8.68394113 C3.82824869,9.51198221 3.149187,10.4025549 2.57441438,11.2925254 C2.41127724,11.5451249 2.26658862,11.7823697 2.14071218,12 C2.26658862,12.2176303 2.41127724,12.4548751 2.57441438,12.7074746 C3.149187,13.5974451 3.82824869,14.4880178 4.6045372,15.3160589 C6.77619226,17.6324909 9.25480244,19 12,19 C14.7451976,19 17.2238077,17.6324909 19.3954628,15.3160589 C20.1717513,14.4880178 20.850813,13.5974451 21.4255856,12.7074746 C21.5887228,12.4548751 21.7334114,12.2176303 21.8592878,12 C21.7334114,11.7823697 21.5887228,11.5451249 21.4255856,11.2925254 C20.850813,10.4025549 20.1717513,9.51198221 19.3954628,8.68394113 C17.2238077,6.36750906 14.7451976,5 12,5 Z M12,8 C14.209139,8 16,9.790861 16,12 C16,14.209139 14.209139,16 12,16 C9.790861,16 8,14.209139 8,12 C8,9.790861 9.790861,8 12,8 Z M12,10 C10.8954305,10 10,10.8954305 10,12 C10,13.1045695 10.8954305,14 12,14 C13.1045695,14 14,13.1045695 14,12 C14,10.8954305 13.1045695,10 12,10', viewBox: '0 3 24 18', ratio: 1, }, - [SessionIconType.Exit]: { + exit: { path: 'M28.228,23.986L47.092,5.122c1.172-1.171,1.172-3.071,0-4.242c-1.172-1.172-3.07-1.172-4.242,0L23.986,19.744L5.121,0.88 c-1.172-1.172-3.07-1.172-4.242,0c-1.172,1.171-1.172,3.071,0,4.242l18.865,18.864L0.879,42.85c-1.172,1.171-1.172,3.071,0,4.242 C1.465,47.677,2.233,47.97,3,47.97s1.535-0.293,2.121-0.879l18.865-18.864L42.85,47.091c0.586,0.586,1.354,0.879,2.121,0.879 s1.535-0.293,2.121-0.879c1.172-1.171,1.172-3.071,0-4.242L28.228,23.986z', viewBox: '0 0 47.971 47.971', ratio: 1, }, - [SessionIconType.File]: { + file: { path: 'M13,1 C13.0425909,1 13.0845598,1.00266262 13.1257495,1.00783047 L13,1 C13.0528361,1 13.1052411,1.00418141 13.1567725,1.01236099 C13.1883933,1.0172036 13.2193064,1.02361582 13.249662,1.03141743 C13.2598053,1.0342797 13.2698902,1.03704988 13.2799252,1.0399762 C13.3109399,1.04873224 13.3413507,1.05922617 13.3710585,1.07110396 C13.3800191,1.07496957 13.3890567,1.0787342 13.3980377,1.08263089 C13.4262995,1.09463815 13.4536613,1.10806791 13.4802859,1.12267436 C13.4906553,1.12855823 13.5012587,1.13461331 13.5117542,1.14086468 C13.5399066,1.15749759 13.5670269,1.17554946 13.5931738,1.19484452 C13.5995817,1.19963491 13.6064603,1.20483437 13.6132762,1.21012666 C13.6177282,1.21353888 13.6216003,1.21659988 13.625449,1.21968877 L13.7071068,1.29289322 L13.7071068,1.29289322 L20.7071068,8.29289322 C20.7364445,8.32223095 20.7639678,8.3533831 20.7894939,8.38616693 L20.7071068,8.29289322 C20.7429509,8.32873733 20.7757929,8.36702236 20.8054709,8.40735764 C20.8244505,8.43297305 20.8425024,8.46009338 20.8592238,8.48809993 C20.8653867,8.49874131 20.8714418,8.50934473 20.8772982,8.52005033 C20.8919321,8.54633874 20.9053618,8.57370048 20.9175449,8.60172936 C20.9212658,8.61094326 20.9250304,8.61998091 20.9286618,8.62907226 C20.9407738,8.65864932 20.9512678,8.68906007 20.9602981,8.72009403 C20.9629501,8.73010978 20.9657203,8.7401947 20.9683328,8.75032594 C20.9763842,8.78069364 20.9827964,8.81160666 20.9877474,8.84300527 C20.9892866,8.85360724 20.990772,8.86402246 20.9920936,8.8744695 C20.9973374,8.91544017 21,8.95740914 21,9 L21,9 L21,20 C21,21.6568542 19.6568542,23 18,23 L6,23 C4.34314575,23 3,21.6568542 3,20 L3,4 C3,2.34314575 4.34314575,1 6,1 Z M12,3 L6,3 C5.44771525,3 5,3.44771525 5,4 L5,20 C5,20.5522847 5.44771525,21 6,21 L18,21 C18.5522847,21 19,20.5522847 19,20 L19,10 L13,10 C12.4871642,10 12.0644928,9.61395981 12.0067277,9.11662113 L12,9 L12,3 Z M17.586,8 L14,4.415 L14,8 L17.586,8', viewBox: '0 0 24 24', ratio: 1, }, - [SessionIconType.Gear]: { + gear: { path: 'M12,0 C13.6568542,0 15,1.34314575 15,3 L15,3.08601169 C15.0010253,3.34508314 15.1558067,3.57880297 15.4037653,3.68513742 C15.6468614,3.79242541 15.9307827,3.74094519 16.1128932,3.56289322 L16.1725,3.50328666 C16.7352048,2.93995553 17.4987723,2.62342669 18.295,2.62342669 C19.0912277,2.62342669 19.8547952,2.93995553 20.4167133,3.5025 C20.9800445,4.06520477 21.2965733,4.82877226 21.2965733,5.625 C21.2965733,6.42122774 20.9800445,7.18479523 20.4171068,7.74710678 L20.3648626,7.79926496 C20.1790548,7.98921731 20.1275746,8.27313857 20.2348626,8.51623466 C20.26314,8.58030647 20.2845309,8.64699387 20.2987985,8.71517468 C20.4176633,8.89040605 20.6163373,8.99914118 20.83,9 L21,9 C22.6568542,9 24,10.3431458 24,12 C24,13.6568542 22.6568542,15 21,15 L20.9139883,15 C20.6549169,15.0010253 20.421197,15.1558067 20.3191398,15.3939314 C20.2075746,15.6468614 20.2590548,15.9307827 20.4371068,16.1128932 L20.4967133,16.1725 C21.0600445,16.7352048 21.3765733,17.4987723 21.3765733,18.295 C21.3765733,19.0912277 21.0600445,19.8547952 20.4975,20.4167133 C19.9347952,20.9800445 19.1712277,21.2965733 18.375,21.2965733 C17.5787723,21.2965733 16.8152048,20.9800445 16.2528932,20.4171068 L16.200735,20.3648626 C16.0107827,20.1790548 15.7268614,20.1275746 15.4739314,20.2391398 C15.2358067,20.341197 15.0810253,20.5749169 15.08,20.83 L15.08,21 C15.08,22.6568542 13.7368542,24 12.08,24 C10.4231458,24 9.08,22.6568542 9.08,21 C9.07403212,20.6665579 8.90531385,20.4306648 8.59623466,20.3148626 C8.35313857,20.2075746 8.06921731,20.2590548 7.88710678,20.4371068 L7.8275,20.4967133 C7.26479523,21.0600445 6.50122774,21.3765733 5.705,21.3765733 C4.90877226,21.3765733 4.14520477,21.0600445 3.58328666,20.4975 C3.01995553,19.9347952 2.70342669,19.1712277 2.70342669,18.375 C2.70342669,17.5787723 3.01995553,16.8152048 3.58289322,16.2528932 L3.63513742,16.200735 C3.82094519,16.0107827 3.87242541,15.7268614 3.76086017,15.4739314 C3.65880297,15.2358067 3.42508314,15.0810253 3.17,15.08 L3,15.08 C1.34314575,15.08 0,13.7368542 0,12.08 C0,10.4231458 1.34314575,9.08 3,9.08 C3.33344206,9.07403212 3.56933519,8.90531385 3.68513742,8.59623466 C3.79242541,8.35313857 3.74094519,8.06921731 3.56289322,7.88710678 L3.50328666,7.8275 C2.93995553,7.26479523 2.62342669,6.50122774 2.62342669,5.705 C2.62342669,4.90877226 2.93995553,4.14520477 3.5025,3.58328666 C4.06520477,3.01995553 4.82877226,2.70342669 5.625,2.70342669 C6.42122774,2.70342669 7.18479523,3.01995553 7.74710678,3.58289322 L7.79926496,3.63513742 C7.98921731,3.82094519 8.27313857,3.87242541 8.51623466,3.76513742 C8.58030647,3.73685997 8.64699387,3.71546911 8.71517468,3.70120146 C8.89040605,3.58233675 8.99914118,3.3836627 9,3.17 L9,3 C9,1.34314575 10.3431458,0 12,0 Z M12,2 C11.4477153,2 11,2.44771525 11,3 L11,3.17398831 C10.9957795,4.2302027 10.3647479,5.18306046 9.39393144,5.59913983 C9.30943133,5.63535548 9.22053528,5.65966354 9.12978593,5.67154209 C8.1847178,6.00283804 7.12462982,5.77295717 6.39289322,5.05710678 L6.3325,4.99671334 C6.14493174,4.8089363 5.89040925,4.70342669 5.625,4.70342669 C5.35959075,4.70342669 5.10506826,4.8089363 4.91671334,4.9975 C4.7289363,5.18506826 4.62342669,5.43959075 4.62342669,5.705 C4.62342669,5.97040925 4.7289363,6.22493174 4.91710678,6.41289322 L4.98486258,6.48073504 C5.74238657,7.25515616 5.9522675,8.41268129 5.5385361,9.34518109 C5.16293446,10.3664297 4.2012163,11.0542811 3.09,11.08 L3,11.08 C2.44771525,11.08 2,11.5277153 2,12.08 C2,12.6322847 2.44771525,13.08 3,13.08 L3.17398831,13.080008 C4.2302027,13.0842205 5.18306046,13.7152521 5.59486258,14.6762347 C6.0322675,15.6673187 5.82238657,16.8248438 5.05710678,17.6071068 L4.99671334,17.6675 C4.8089363,17.8550683 4.70342669,18.1095908 4.70342669,18.375 C4.70342669,18.6404092 4.8089363,18.8949317 4.9975,19.0832867 C5.18506826,19.2710637 5.43959075,19.3765733 5.705,19.3765733 C5.97040925,19.3765733 6.22493174,19.2710637 6.41289322,19.0828932 L6.48073504,19.0151374 C7.25515616,18.2576134 8.41268129,18.0477325 9.34518109,18.4614639 C10.3664297,18.8370655 11.0542811,19.7987837 11.08,20.91 L11.08,21 C11.08,21.5522847 11.5277153,22 12.08,22 C12.6322847,22 13.08,21.5522847 13.08,21 L13.080008,20.8260117 C13.0842205,19.7697973 13.7152521,18.8169395 14.6762347,18.4051374 C15.6673187,17.9677325 16.8248438,18.1776134 17.6071068,18.9428932 L17.6675,19.0032867 C17.8550683,19.1910637 18.1095908,19.2965733 18.375,19.2965733 C18.6404092,19.2965733 18.8949317,19.1910637 19.0832867,19.0025 C19.2710637,18.8149317 19.3765733,18.5604092 19.3765733,18.295 C19.3765733,18.0295908 19.2710637,17.7750683 19.0828932,17.5871068 L19.0151374,17.519265 C18.2576134,16.7448438 18.0477325,15.5873187 18.4851374,14.5962347 C18.8969395,13.6352521 19.8497973,13.0042205 20.91,13 L21,13 C21.5522847,13 22,12.5522847 22,12 C22,11.4477153 21.5522847,11 21,11 L20.8260117,11 C19.7697973,10.9957795 18.8169395,10.3647479 18.4008602,9.39393144 C18.3646445,9.30943133 18.3403365,9.22053528 18.3284579,9.12978593 C17.997162,8.1847178 18.2270428,7.12462982 18.9428932,6.39289322 L19.0032867,6.3325 C19.1910637,6.14493174 19.2965733,5.89040925 19.2965733,5.625 C19.2965733,5.35959075 19.1910637,5.10506826 19.0025,4.91671334 C18.8149317,4.7289363 18.5604092,4.62342669 18.295,4.62342669 C18.0295908,4.62342669 17.7750683,4.7289363 17.5871068,4.91710678 L17.519265,4.98486258 C16.7448438,5.74238657 15.5873187,5.9522675 14.6060686,5.51913983 C13.6352521,5.10306046 13.0042205,4.1502027 13,3.09 L13,3 C13,2.44771525 12.5522847,2 12,2 Z M12,8 C14.209139,8 16,9.790861 16,12 C16,14.209139 14.209139,16 12,16 C9.790861,16 8,14.209139 8,12 C8,9.790861 9.790861,8 12,8 Z M12,14 C13.1045695,14 14,13.1045695 14,12 C14,10.8954305 13.1045695,10 12,10 C10.8954305,10 10,10.8954305 10,12 C10,13.1045695 10.8954305,14 12,14', viewBox: '0 0 24 24', ratio: 1, }, - [SessionIconType.Globe]: { + globe: { path: 'M16,1.99999996 C8.26801348,1.99999996 1.99999996,8.26801348 1.99999996,16 C1.99999996,23.7319865 8.26801348,30 16,30 C23.7319865,30 30,23.7319865 30,16 C30,12.2869691 28.5250043,8.72601434 25.899495,6.10050503 C23.2739857,3.47499573 19.7130309,1.99999996 16,1.99999996 Z M24,15 C23.9541824,13.7847684 23.81713,12.5746962 23.59,11.38 C25.78,12.29 27.34,13.57 27.84,15 L24,15 Z M22,15 L17,15 L17,9.99999998 C18.4647569,10.0572205 19.9194297,10.2683827 21.34,10.63 C21.7186973,12.058241 21.9400138,13.5236242 22,15 Z M17,7.99999997 L17,4.18999996 C18.43,4.68999996 19.71,6.24999997 20.62,8.43999998 C19.426069,8.2027972 18.2159902,8.05571581 17,7.99999998 L17,7.99999997 Z M15,4.18999996 L15,7.99999997 C13.7847684,8.04581761 12.5746962,8.18286998 11.38,8.40999998 C12.29,6.24999997 13.57,4.68999996 15,4.18999996 Z M15,9.99999998 L15,15 L9.99999998,15 C10.0523471,13.5347995 10.2635844,12.0796099 10.63,10.66 C12.0592465,10.2861705 13.5241011,10.0649339 15,9.99999998 L15,9.99999998 Z M7.99999997,15 L4.18999996,15 C4.68999996,13.57 6.24999997,12.29 8.43999998,11.38 C8.2027972,12.573931 8.05571581,13.7840098 7.99999998,15 L7.99999997,15 Z M7.99999997,17 C8.04581761,18.2152316 8.18286998,19.4253038 8.40999998,20.62 C6.24999997,19.71 4.68999996,18.43 4.18999996,17 L7.99999997,17 Z M9.99999998,17 L15,17 L15,22 C13.5352431,21.9427795 12.0805703,21.7316173 10.66,21.37 C10.2813027,19.941759 10.0599862,18.4763758 9.99999998,17 L9.99999998,17 Z M15,24 L15,27.84 C13.57,27.34 12.29,25.78 11.38,23.59 C12.5746962,23.81713 13.7847684,23.9541824 15,24 Z M17,27.84 L17,24 C18.2152316,23.9541824 19.4253038,23.81713 20.62,23.59 C19.71,25.75 18.43,27.31 17,27.81 L17,27.84 Z M17,22 L17,17 L22,17 C21.9476529,18.4652005 21.7364156,19.9203901 21.37,21.34 C19.9407535,21.7138295 18.4758989,21.9350661 17,22 L17,22 Z M24,17 L27.84,17 C27.34,18.43 25.78,19.71 23.59,20.62 C23.81713,19.4253038 23.9541824,18.2152316 24,17 L24,17 Z M26.87,10.88 C25.6762805,10.0719416 24.3730724,9.43885859 23,8.99999998 C22.5705064,7.62858818 21.9475643,6.32546065 21.15,5.12999997 C23.6492047,6.33846833 25.6578129,8.36825686 26.84,10.88 L26.87,10.88 Z M10.87,5.15999997 C10.0679904,6.34500038 9.43836847,7.63791394 8.99999998,8.99999998 C7.62858818,9.42949358 6.32546065,10.0524357 5.12999997,10.85 C6.33846833,8.35079527 8.36825686,6.34218713 10.88,5.15999997 L10.87,5.15999997 Z M5.14999997,21.16 C6.33983272,21.9523657 7.63608858,22.571875 8.99999998,23 C9.42949358,24.3714118 10.0524357,25.6745393 10.85,26.87 C8.35079527,25.6615317 6.34218713,23.6317431 5.15999997,21.12 L5.14999997,21.16 Z M21.15,26.88 C21.9484187,25.681438 22.5713875,24.3748872 23,23 C24.3714118,22.5705064 25.6745393,21.9475643 26.87,21.15 C25.6615317,23.6492047 23.6317431,25.6578129 21.12,26.84 L21.15,26.88', viewBox: '0.5 0 30 30', ratio: 1, }, - [SessionIconType.Info]: { + info: { path: 'M17.5,2.4c-1.82-1.5-4.21-2.1-6.57-1.64c-3.09,0.6-5.57,3.09-6.15,6.19c-0.4,2.1,0.04,4.21,1.22,5.95 C7.23,14.7,8,16.41,8.36,18.12c0.17,0.81,0.89,1.41,1.72,1.41h4.85c0.83,0,1.55-0.59,1.72-1.42c0.37-1.82,1.13-3.55,2.19-4.99 c1-1.36,1.53-2.96,1.53-4.65C20.37,6.11,19.32,3.9,17.5,2.4z M17.47,12.11c-1.21,1.64-2.07,3.6-2.55,5.72l-4.91-0.05 c-0.4-1.93-1.25-3.84-2.62-5.84c-0.93-1.36-1.27-3.02-0.95-4.67c0.46-2.42,2.39-4.37,4.81-4.83c0.41-0.08,0.82-0.12,1.23-0.12 c1.44,0,2.82,0.49,3.94,1.4c1.43,1.18,2.25,2.91,2.25,4.76C18.67,9.79,18.25,11.04,17.47,12.11z M15.94,20.27H9.61c-0.47,0-0.85,0.38-0.85,0.85s0.38,0.85,0.85,0.85h6.33c0.47,0,0.85-0.38,0.85-0.85 S16.41,20.27,15.94,20.27z M15.94,22.7H9.61c-0.47,0-0.85,0.38-0.85,0.85s0.38,0.85,0.85,0.85h6.33c0.47,0,0.85-0.38,0.85-0.85 S16.41,22.7,15.94,22.7z M12.5,3.28c-2.89,0-5.23,2.35-5.23,5.23c0,0.47,0.38,0.85,0.85,0.85s0.85-0.38,0.85-0.85 c0-1.95,1.59-3.53,3.54-3.53c0.47,0,0.85-0.38,0.85-0.85S12.97,3.28,12.5,3.28z', viewBox: '0 0 25 25', ratio: 1, }, - [SessionIconType.Link]: { + link: { path: 'M265.117,22.764l-9.877-8.737c-23.003-20.398-58.227-18.283-78.618,4.726l-28.267,31.89 c-6.38,7.199-5.717,18.251,1.479,24.637l2.653,2.354c7.221,6.402,18.239,5.741,24.646-1.481l28.265-31.889 c6.305-7.107,17.227-7.761,24.338-1.466l9.865,8.752c7.113,6.303,7.783,17.223,1.469,24.334l-61.808,69.726 c-5.231,5.911-13.791,7.505-20.816,3.875c-7.682-3.967-17.051-2.224-22.787,4.245l-0.482,0.544 c-3.881,4.377-5.499,10.188-4.439,15.943c1.061,5.752,4.642,10.604,9.825,13.313c8.197,4.284,17.049,6.358,25.814,6.358 c15.532,0,30.795-6.512,41.67-18.775l61.804-69.718C290.219,78.417,288.099,43.148,265.117,22.764zM133.998,208.581l-2.659-2.356c-7.204-6.383-18.259-5.712-24.64,1.489l-28.254,31.886 c-6.308,7.105-17.222,7.764-24.327,1.473l-9.879-8.764c-7.115-6.301-7.783-17.212-1.467-24.325l61.806-69.721 c5.124-5.787,13.555-7.442,20.504-4.028c7.986,3.924,17.683,2.016,23.595-4.656l0.222-0.25c3.798-4.288,5.396-9.979,4.386-15.614 c-1.01-5.636-4.484-10.417-9.533-13.119c-22.828-12.22-50.769-7.22-67.947,12.165l-61.81,69.707v0.001 c-20.371,22.978-18.252,58.246,4.726,78.622l9.877,8.749c10.583,9.383,23.77,13.992,36.913,13.992 c15.394,0,30.724-6.327,41.718-18.724l28.258-31.886C141.88,226.003,141.224,214.987,133.998,208.581z', viewBox: '0 0 283.842 283.842', ratio: 1, }, - [SessionIconType.Lock]: { + lock: { path: 'M417.684,188.632H94.316c-9.923,0-17.965,8.042-17.965,17.965v239.532c0,7.952,5.234,14.965,12.863,17.222l161.684,47.906 c1.665,0.497,3.383,0.743,5.102,0.743c1.719,0,3.437-0.246,5.108-0.743l161.684-47.906c7.623-2.258,12.857-9.27,12.857-17.222 V206.596C435.649,196.674,427.607,188.632,417.684,188.632z M399.719,432.715L256,475.298l-143.719-42.583V224.561h287.439 V432.715z M256,0c-69.345,0-125.754,56.949-125.754,126.952v76.052h35.93v-76.052c0-50.188,40.295-91.022,89.825-91.022 s89.825,40.834,89.825,91.022v76.65h35.93v-76.65C381.754,56.949,325.339,0,256,0z M256,308.398c-9.923,0-17.965,8.042-17.965,17.965v47.906c0,9.923,8.042,17.965,17.965,17.965 c9.923,0,17.965-8.042,17.965-17.965v-47.906C273.965,316.44,265.923,308.398,256,308.398z', viewBox: '0 0 512 512', ratio: 1, }, - [SessionIconType.Microphone]: { + microphone: { path: 'M43.362728,18.444286 C46.0752408,18.444286 48.2861946,16.2442453 48.2861946,13.5451212 L48.2861946,6.8991648 C48.2861946,4.20004074 46.0752408,2 43.362728,2 C40.6502153,2 38.4392615,4.20004074 38.4392615,6.8991648 L38.4392615,13.5451212 C38.4392615,16.249338 40.6502153,18.444286 43.362728,18.444286 Z M51.0908304,12.9238134 C51.4388509,12.9238134 51.7203381,13.2039112 51.7203381,13.5502139 C51.7203381,17.9248319 48.3066664,21.5202689 43.9871178,21.8411082 L43.9871178,21.8411082 L43.9871178,25.747199 L47.2574869,25.747199 C47.6055074,25.747199 47.8869946,26.0272968 47.8869946,26.3735995 C47.8869946,26.7199022 47.6055074,27 47.2574869,27 L47.2574869,27 L39.4628512,27 C39.1148307,27 38.8333435,26.7199022 38.8333435,26.3735995 C38.8333435,26.0272968 39.1148307,25.747199 39.4628512,25.747199 L39.4628512,25.747199 L42.7332204,25.747199 L42.7332204,21.8411082 C38.4136717,21.5253616 35,17.9248319 35,13.5502139 C35,13.2039112 35.2814872,12.9238134 35.6295077,12.9238134 C35.9775282,12.9238134 36.2538974,13.2039112 36.2436615,13.5502139 C36.2436615,17.4512121 39.4321435,20.623956 43.3524921,20.623956 C47.2728408,20.623956 50.4613228,17.4512121 50.4613228,13.5502139 C50.4613228,13.2039112 50.7428099,12.9238134 51.0908304,12.9238134 Z M43.362728,3.24770829 C45.3843177,3.24770829 47.0322972,4.88755347 47.0322972,6.8991648 L47.0322972,13.5451212 C47.0322972,15.5567325 45.3843177,17.1965777 43.362728,17.1965777 C41.3411383,17.1965777 39.6931589,15.5567325 39.6931589,13.5451212 L39.6931589,6.8991648 C39.6931589,4.88755347 41.3411383,3.24770829 43.362728,3.24770829', viewBox: '28 0 30 30', ratio: 1, }, - [SessionIconType.Moon]: { + moon: { path: 'M11.1441877,12.8180303 C8.90278993,10.5766325 8.24397847,7.29260898 9.27752593,4.437982 C6.09633644,5.5873034 3.89540402,8.67837285 4.00385273,12.2078365 C4.13368986,16.4333868 7.52883112,19.8285281 11.7543814,19.9583652 C15.2838451,20.0668139 18.3749145,17.8658815 19.5242359,14.684692 C16.669609,15.7182395 13.3855854,15.059428 11.1441877,12.8180303 Z M21.9576498,12.8823459 C21.4713729,18.1443552 16.9748949,22.1197182 11.692957,21.9574217 C6.41101918,21.7951253 2.16709261,17.5511988 2.00479619,12.2692609 C1.84249977,6.98732307 5.81786273,2.49084501 11.0798721,2.00456809 C11.9400195,1.92507947 12.4895134,2.90008536 11.9760569,3.59473245 C10.2106529,5.98311963 10.4582768,9.30369233 12.5584012,11.4038167 C14.6585256,13.5039411 17.9790983,13.7515651 20.3674855,11.986161 C21.0621326,11.4727046 22.0371385,12.0221984 21.9576498,12.8823459', viewBox: '0.5 0.5 22 22', ratio: 1, }, - [SessionIconType.Mute]: { + mute: { path: 'M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zM12,6.5c2.49,0 4,2.02 4,4.5v0.1l2,2L18,11c0,-3.07 -1.63,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68c-0.24,0.06 -0.47,0.15 -0.69,0.23l1.64,1.64c0.18,-0.02 0.36,-0.05 0.55,-0.05zM5.41,3.35L4,4.76l2.81,2.81C6.29,8.57 6,9.74 6,11v5l-2,2v1h14.24l1.74,1.74 1.41,-1.41L5.41,3.35zM16,17L8,17v-6c0,-0.68 0.12,-1.32 0.34,-1.9L16,16.76L16,17z', viewBox: '0 0 24 24', ratio: 1, }, - [SessionIconType.Oxen]: { + oxen: { path: 'M1033.9 1319.4h1v122h-1c-1.7-1.9-1.6-4.3-1.6-6.6v-108.7c0-2.4-.2-4.8 1.6-6.7zM773.4 1441.4c-21 0-42-.1-63 .1-4.2 0-6.9-1.4-9.2-4.6-10.2-14.5-16.9-30.2-18.5-48.2-2.3-24.5 4.9-45.8 19-65.4 1.9-2.7 4.3-4.1 7.9-4.1 42.3.1 84.6.2 127 0 4.5 0 5.8 1.4 5.5 5.7-.4 5.1-.3 10.3 0 15.5.3 4-1.1 5.1-5.1 5-22.8-.2-45.7-.1-68.5-.1-15 0-30 .1-45-.1-3.1 0-4.8 1-6 3.9-1.7 4-2.9 8.1-4.1 12.3-1.1 3.8 0 5 4 5 23.3-.1 46.7-.1 70-.1 13.3 0 26.7.1 40-.1 3.8-.1 5 1.1 4.8 4.8-.3 5.5-.3 11 0 16.5.3 4.5-1 6-5.7 5.9-33.8-.2-67.6-.1-101.5-.1-2.8 0-5.7.3-8.5-.1-3.8-.4-4.1 1.4-3.4 4.3 0 .2 0 .3.1.5 3 16.2 4.4 17.3 20.6 17.3 34.3 0 68.6.1 103-.1 4 0 5.7.9 5.4 5.2-.4 5.5-.3 11 0 16.5.2 3.6-1.2 4.5-4.6 4.5-21.6-.1-42.9 0-64.2 0zM397.2 1319.3c20 0 40 .1 60-.1 3.6 0 5.8 1.3 7.8 4.1 13.9 19.4 20.7 40.9 18.8 64.7-1.5 18.8-8.7 35.7-19.9 50.8-1.4 1.9-3.2 2.6-5.6 2.6-40.8-.1-81.6-.1-122.4 0-2.2 0-3.7-.7-5-2.5-11.5-14.8-18.2-31.4-20-50.1-2.2-21.7 3.6-41.4 14.7-59.7.2-.3.3-.6.5-.9 3.6-6.3 8-9.6 16.2-9.2 18.2.9 36.6.3 54.9.3zM1033.9 1319.4v121.9c-5.7 0-11.4-.3-17 .2-6.6.6-12-1.9-17-5.8-32.5-25.1-64.9-50.2-97.4-75.2-1.6-1.2-3.2-2.3-5.6-4.1v5.8c0 24.5-.1 49 .1 73.5 0 4.7-1.4 6-5.9 5.7-6.3-.4-12.7-.2-19 0-2.8.1-4.2-.6-4.2-3.8.1-38.2.1-76.3 0-114.5 0-3.2 1.3-3.9 4.2-3.9 6 .2 12 .1 18 .1 7.3 0 12.1 5.2 17.3 9.1 21.4 16.3 42.7 32.7 64 49.2 11.3 8.7 22.5 17.4 33.9 26.2 1.3-1.8.7-3.5.7-5.1 0-24.8.1-49.7-.1-74.5 0-3.9 1-5.3 5-5.1 7.6.5 15.3.3 23 .3zM488.8 1319.4c14.1 0 27-.1 39.9.1 4.3.1 7.9 2.6 11 5.3 12.9 11.2 25.9 22.3 38.7 33.7 2.7 2.4 4.6 1.8 6.9-.2 10.5-9.1 21.1-18.3 31.6-27.5 2.9-2.5 5.7-5.1 8.7-7.5 2.8-2.2 6.1-3.8 9.6-3.9 12.6-.2 25.2-.1 37.9-.1.1 2.1-1.4 2.8-2.5 3.7-13.3 11.5-26.7 23-40 34.5-7.9 6.8-15.8 13.7-23.8 20.5-2.5 2.1-1.5 3.5.4 5.1 10.1 8.6 20.2 17.3 30.3 26 12.2 10.5 24.4 21 37.5 32.2-14.2 0-27.4.4-40.6-.2-7.3-.3-11.7-6.5-16.9-10.9-10.8-9.1-21.4-18.5-32-27.8-2.4-2.1-4.5-2.3-7-.2-12.5 10.9-25.2 21.7-37.6 32.7-4.8 4.3-10 6.7-16.7 6.5-11.3-.3-22.7-.1-34.6-.1 4.5-5.4 9.8-9.2 14.6-13.5 13.3-11.8 26.9-23.2 40.4-34.8 3.9-3.3 7.8-6.7 11.8-9.9 2.6-2.1 2.6-3.5-.1-5.8-14-11.8-27.7-23.8-41.6-35.7-8.3-7-16.7-14.3-25.9-22.2zM153.9 1273.4c5.4 1.3 10.9 2.3 16.3 3.9 41.5 12.6 67.5 40.1 76.6 82.4 6.7 31.3-.6 60.2-19.9 85.5-18.2 23.9-42.5 37.5-72.4 41.2-27.9 3.4-53.1-3.5-75.7-19.9-24.1-17.5-37.8-41.4-42.8-70.6-.2-1-.1-2-1.1-2.6v-26c1.6-19.6 9.1-36.9 20.8-52.5 15.4-20.4 35.8-33.4 60.5-39.7 4.2-1.1 8.5-.7 12.7-1.8 8.3.1 16.6.1 25 .1zM142.8 1379.4c2.3 6 8.1 8.5 12.4 12.5 10.7 9.7 21.8 18.9 32.8 28.3 4.8 4.1 9.4 8.3 14.8 12.9H80.9c6.2-5.5 12-10.5 17.8-15.6 13.2-11.4 26.4-22.7 39.6-34.1 1.2-1.1 2.7-2.1 2.6-4 .7-.5 1.3-.5 1.9 0zM142.8 1379.4h-1.9c-12.9-11-25.7-22-38.6-33-7-6-14-12.1-21.6-18.7h122.5c-20.6 17.6-40.5 34.6-60.4 51.7zM397.2 1415.4c-14.2 0-28.3-.2-42.5.1-5.1.1-8-1.1-10.1-6.3-7.9-20.1-7.8-39.8 1-59.5 1.4-3.1 3.1-4.4 6.8-4.4 30 .2 60 .1 90 0 3.6 0 5.2 1.3 6.6 4.5 4.1 9.3 6.4 19 6.7 28.9.3 11.9-2.5 23.4-7.6 34.2-1.2 2.6-3.2 2.4-5.4 2.4-15.2.1-30.4.1-45.5.1zM153.9 1273.4c292.2 0 584.3 0 876.5-.1 3.7 0 4.7.8 4.6 4.6-.3 13.8-.1 27.7-.1 41.5-.4.4-.9.7-1.4.9-6.8 1-13.6.3-20.4.5-5.2.2-5.7.5-5.7 5.8 0 23.3 0 46.6-.1 70 0 2.7 1.2 6.5-1.8 7.7-2.5 1.1-4.6-2-6.7-3.6-31.9-24.6-64-49-95.8-73.8-6.7-5.3-13.9-6.3-22-6.1-13.3.4-11.7-1.3-11.7 11.8-.1 33.5 0 67 0 100.4 0 6.8.1 7 7 7 4.5 0 9 .1 13.5 0 5.1-.1 5.7-.6 5.7-5.8 0-23 0-46 .1-69 0-2.9-1.2-6.9 1.6-8.4 2.9-1.5 5.3 2 7.6 3.7 31.8 24.5 63.7 48.8 95.4 73.5 5.2 4 10.7 6.4 17.4 6.1 5.3-.3 10.7-.6 15.9.4.5.3 1 .6 1.4.9 0 15-.1 30 .1 45 0 2.5-.6 3.5-3.1 3-.5-.1-1 0-1.5 0-330.3 0-660.7 0-991 .1-3.7 0-4.6-.8-4.6-4.6.2-30.5.1-61 .1-91.5 3.4 1 2.6 4.3 3.1 6.6 3.1 16 9.4 30.6 19.2 43.5 18.3 24.2 42.6 38.3 72.8 41.7 30.1 3.5 56.7-4.8 79.9-24.2 21.4-17.9 33.4-40.9 36.9-68.7 6.6-53-29.2-105-84.8-115.9-2.8-.4-6.5.7-8.1-3zM128.9 1273.4c-2.8 1.6-6 1.5-9 2.2-20.6 4.6-38.6 14.1-53.5 28.9-16.7 16.7-26.7 36.9-30.5 60.2-.2 1-.1 2-1 2.6 0-30.3 0-60.5-.1-90.8 0-2.8.6-3.3 3.3-3.3 30.3.2 60.5.2 90.8.2zM107.2 0C48 0 0 48 0 107.2s48 107.2 107.2 107.2 107.2-48 107.2-107.2S166.4 0 107.2 0zM45.3 160.3l61.7-53.4 61.7 53.4H45.3zm61.7-53.5L45.3 53.4h123.4L107 106.8zM426.9 46H297.7s-22.6 25.2-22.4 60.9c.2 35.7 22.4 60.9 22.4 60.9h129s21.7-25.8 22.4-60.4C449.7 73 426.9 46 426.9 46zm-6 61.4c-.4 19.9-9.1 34.9-9.1 34.9h-99.3s-8.8-14.6-8.9-35.2c-.1-20.6 8.9-35.2 8.9-35.2h99.4s9.3 15.5 9 35.5zM454.3 46l70.6 60.9-70.6 60.9h38.4s6.7-.1 12.8-5.6c6.1-5.5 41.5-35.9 41.5-35.9l45.5 39.1s3 2.3 9.8 2.5 37.7 0 37.7 0L569.4 107 640 46h-38.3s-5.2-.9-12.7 5.5c-7.5 6.4-41.8 36.3-41.8 36.3l-44.7-38s-2.7-3.8-12.2-3.8c-9.5-.1-36 0-36 0zM806.8 71.9V46h-137s-22.6 25.2-22.4 60.9 22.4 60.9 22.4 60.9h137v-25.6H684.6s-5.4-8.9-7.8-22.6h120V92.9H677c2.5-12.8 7.6-21.1 7.6-21.1h122.2zM833.1 167.9V46h20.4s5.9-.2 10.7 3.4c4.7 3.6 107.4 82.5 107.4 82.5V46h28.3v121.8h-21.6s-5.6.4-10.3-3.4c-4.7-3.7-106.5-82-106.5-82v85.4l-28.4.1z', viewBox: '0 0 1000 214.3', ratio: 4, }, - [SessionIconType.Pause]: { + pause: { path: 'M33,4.5v24c0,2.484-2.016,4.5-4.5,4.5h-24C2.016,33,0,30.984,0,28.5v-24C0,2.016,2.016,0,4.5,0h24 C30.984,0,33,2.016,33,4.5z', viewBox: '-1 -1 35 35', ratio: 1, }, - [SessionIconType.Pencil]: { + pencil: { path: 'M4,16.4142136 L4,20 L7.58578644,20 L19.5857864,8 L16,4.41421356 L4,16.4142136 Z M16.7071068,2.29289322 L21.7071068,7.29289322 C22.0976311,7.68341751 22.0976311,8.31658249 21.7071068,8.70710678 L8.70710678,21.7071068 C8.5195704,21.8946432 8.26521649,22 8,22 L3,22 C2.44771525,22 2,21.5522847 2,21 L2,16 C2,15.7347835 2.10535684,15.4804296 2.29289322,15.2928932 L15.2928932,2.29289322 C15.6834175,1.90236893 16.3165825,1.90236893 16.7071068,2.29289322 Z', viewBox: '1 1 21 21', ratio: 1, }, - [SessionIconType.Pin]: { + pin: { path: 'M83.88.451L122.427 39c.603.601.603 1.585 0 2.188l-13.128 13.125c-.602.604-1.586.604-2.187 0l-3.732-3.73-17.303 17.3c3.882 14.621.095 30.857-11.37 42.32-.266.268-.535.529-.808.787-1.004.955-.843.949-1.813-.021L47.597 86.48 0 122.867l36.399-47.584L11.874 50.76c-.978-.98-.896-.826.066-1.837.24-.251.485-.503.734-.753C24.137 36.707 40.376 32.917 54.996 36.8l17.301-17.3-3.733-3.732c-.601-.601-.601-1.585 0-2.188L81.691.451c.604-.601 1.588-.601 2.189 0z', viewBox: '0 0 122.879 122.867', ratio: 1, }, - [SessionIconType.Play]: { + play: { path: 'M29.462,15.707c0,1.061-0.562,2.043-1.474,2.583L6.479,30.999c-0.47,0.275-0.998,0.417-1.526,0.417 c-0.513,0-1.026-0.131-1.487-0.396c-0.936-0.534-1.513-1.527-1.513-2.604V2.998c0-1.077,0.578-2.07,1.513-2.605 C4.402-0.139,5.553-0.13,6.479,0.415l21.509,12.709C28.903,13.664,29.462,14.646,29.462,15.707z', viewBox: '1 1 31.417 31.417', ratio: 1, }, - [SessionIconType.Plus]: { + plus: { path: 'm405.332031 192h-170.664062v-170.667969c0-11.773437-9.558594-21.332031-21.335938-21.332031-11.773437 0-21.332031 9.558594-21.332031 21.332031v170.667969h-170.667969c-11.773437 0-21.332031 9.558594-21.332031 21.332031 0 11.777344 9.558594 21.335938 21.332031 21.335938h170.667969v170.664062c0 11.777344 9.558594 21.335938 21.332031 21.335938 11.777344 0 21.335938-9.558594 21.335938-21.335938v-170.664062h170.664062c11.777344 0 21.335938-9.558594 21.335938-21.335938 0-11.773437-9.558594-21.332031-21.335938-21.332031zm0 0', viewBox: '0 0 427 427', ratio: 1, }, - [SessionIconType.Reply]: { + plusThin: { + path: + 'M97.4,21.9H78.2V2.7c0-1.3-1.1-2.4-2.4-2.4c-1.3,0-2.4,1.1-2.4,2.4v19.2H54.2c-1.3,0-2.4,1.1-2.4,2.4c0,1.3,1.1,2.4,2.4,2.4h19.2v19.2c0,1.3,1.1,2.4,2.4,2.4c1.3,0,2.4-1.1,2.4-2.4V26.7h19.2c1.3,0,2.4-1.1,2.4-2.4C99.8,23,98.7,21.9,97.4,21.9zM46.3,22.5H25.5V1.7c0-0.8-0.7-1.5-1.5-1.5s-1.5,0.7-1.5,1.5v20.8H1.7c-0.8,0-1.5,0.7-1.5,1.5s0.7,1.5,1.5,1.5h20.8v20.8c0,0.8,0.7,1.5,1.5,1.5s1.5-0.7,1.5-1.5V25.5h20.8c0.8,0,1.5-0.7,1.5-1.5S47.1,22.5,46.3,22.5z', + viewBox: '0 0 48 48', + ratio: 1, + }, + reply: { path: 'M4,3 C4.55228475,3 5,3.44771525 5,4 L5,4 L5,11 C5,12.6568542 6.34314575,14 8,14 L8,14 L17.585,14 L14.2928932,10.7071068 C13.9324093,10.3466228 13.9046797,9.77939176 14.2097046,9.38710056 L14.2928932,9.29289322 C14.6834175,8.90236893 15.3165825,8.90236893 15.7071068,9.29289322 L15.7071068,9.29289322 L20.7071068,14.2928932 C20.7355731,14.3213595 20.7623312,14.3515341 20.787214,14.3832499 C20.788658,14.3849951 20.7902348,14.3870172 20.7918027,14.389044 C20.8140715,14.4179625 20.8348358,14.4480862 20.8539326,14.4793398 C20.8613931,14.4913869 20.8685012,14.5036056 20.8753288,14.5159379 C20.8862061,14.5357061 20.8966234,14.5561086 20.9063462,14.5769009 C20.914321,14.5939015 20.9218036,14.6112044 20.9287745,14.628664 C20.9366843,14.6484208 20.9438775,14.6682023 20.9504533,14.6882636 C20.9552713,14.7031487 20.9599023,14.7185367 20.9641549,14.734007 C20.9701664,14.7555635 20.9753602,14.7772539 20.9798348,14.7992059 C20.9832978,14.8166247 20.9863719,14.834051 20.9889822,14.8515331 C20.9962388,14.8996379 21,14.9493797 21,15 L20.9962979,14.9137692 C20.9978436,14.9317345 20.9989053,14.9497336 20.9994829,14.9677454 L21,15 C21,15.0112225 20.9998151,15.0224019 20.9994483,15.0335352 C20.9988772,15.050591 20.997855,15.0679231 20.996384,15.0852242 C20.994564,15.1070574 20.9920941,15.1281144 20.9889807,15.1489612 C20.9863719,15.165949 20.9832978,15.1833753 20.9797599,15.2007258 C20.9753602,15.2227461 20.9701664,15.2444365 20.964279,15.2658396 C20.9599023,15.2814633 20.9552713,15.2968513 20.9502619,15.3121425 C20.9438775,15.3317977 20.9366843,15.3515792 20.928896,15.3710585 C20.9218036,15.3887956 20.914321,15.4060985 20.9063266,15.4232215 C20.8974314,15.4421635 20.8879327,15.4609002 20.8778732,15.4792864 C20.8703855,15.4931447 20.862375,15.5070057 20.8540045,15.5207088 C20.8382813,15.546275 20.8215099,15.5711307 20.8036865,15.5951593 C20.774687,15.6343256 20.7425008,15.6717127 20.7071068,15.7071068 L20.787214,15.6167501 C20.7849289,15.6196628 20.7826279,15.6225624 20.7803112,15.625449 L20.7071068,15.7071068 L15.7071068,20.7071068 C15.3165825,21.0976311 14.6834175,21.0976311 14.2928932,20.7071068 C13.9023689,20.3165825 13.9023689,19.6834175 14.2928932,19.2928932 L14.2928932,19.2928932 L17.585,16 L8,16 C5.3112453,16 3.11818189,13.8776933 3.00461951,11.2168896 L3,11 L3,4 C3,3.44771525 3.44771525,3 4,3', viewBox: '-0.5 0.3 23 22', ratio: 1, }, - [SessionIconType.Search]: { + search: { path: 'M16.5260392,16.2168725 L13.3593725,12.879521 C13.2567964,12.7688667 13.1425871,12.670895 13.0189558,12.5875028 L12.2272892,12.0118096 L12.2272892,12.0118096 C13.8556873,9.88830358 13.8708099,6.85915463 12.2637039,4.71770761 C10.6565979,2.57626059 7.85617522,1.8940349 5.52036814,3.07492811 C3.18456106,4.25582133 1.93676065,6.98467116 2.51570128,9.64591861 C3.09464191,12.3071661 5.34581319,14.190565 7.93645584,14.1810881 C9.19365936,14.1814736 10.4136244,13.7313239 11.3960392,12.9045511 L11.3960392,12.9045511 L11.9897892,13.738889 C12.0602158,13.8463397 12.1397052,13.9468684 12.2272892,14.0392507 L15.3939558,17.3766021 C15.4682801,17.4555775 15.5694535,17.5 15.6749975,17.5 C15.7805415,17.5 15.8817149,17.4555775 15.9560392,17.3766021 L16.5102058,16.7925656 C16.6604889,16.6359051 16.6674599,16.3824439 16.5260392,16.2168725 Z M7.93645584,12.5124123 C5.7503287,12.5124123 3.9781225,10.6446834 3.9781225,8.340723 C3.9781225,6.03676259 5.7503287,4.16903366 7.93645584,4.16903366 C10.122583,4.16903366 11.8947892,6.03676259 11.8947892,8.340723 C11.8947892,9.44712381 11.4777517,10.5082093 10.7354202,11.2905528 C9.99308868,12.0728963 8.98627111,12.5124123 7.93645584,12.5124123', viewBox: '2.3 1.8 15 16', ratio: 1, }, - [SessionIconType.Send]: { + send: { path: 'M12.3266,4.71786207 L2.2646,4.71786207 L5.98482857,0.989241379 C6.20434286,0.768862069 6.20768571,0.408896552 5.99225714,0.184344828 C5.77608571,-0.0398275862 5.4236,-0.042862069 5.20408571,0.176758621 L0.5226,4.86882759 C0.416371429,4.97541379 0.3562,5.12068966 0.355821604,5.27241379 C0.355085714,5.42413793 0.413771429,5.57017241 0.518885714,5.67751724 L5.20817143,10.4663103 C5.317,10.5774483 5.45962857,10.6328276 5.60225714,10.6328276 C5.74451429,10.6328276 5.88714286,10.5774483 5.99597143,10.4663103 C6.21362857,10.2440345 6.21362857,9.88368966 5.99597143,9.6617931 L2.26905714,5.8557931 L12.3266,5.8557931 C12.6341429,5.8557931 12.8837429,5.60089655 12.8837429,5.28682759 C12.8837429,4.97237931 12.6341429,4.71786207 12.3266,4.71786207', viewBox: '-1 -2 15 15', ratio: 1, }, - [SessionIconType.Star]: { + star: { path: 'M9.80779568,8.70262392 C9.66225594,8.99747141 9.38107073,9.20193068 9.05571654,9.24948607 L4.1495,9.9666031 L7.69882113,13.4236419 C7.93469487,13.6533829 8.0423575,13.9845141 7.98669695,14.3090433 L7.14926913,19.1916734 L11.5356371,16.8849265 C11.8270199,16.7316912 12.1751567,16.7316912 12.4665396,16.8849265 L16.8529075,19.1916734 L16.0154797,14.3090433 C15.9598192,13.9845141 16.0674818,13.6533829 16.3033555,13.4236419 L19.8526767,9.9666031 L14.9464601,9.24948607 C14.6211059,9.20193068 14.3399207,8.99747141 14.194381,8.70262392 L12.0010883,4.25925434 L9.80779568,8.70262392 Z M8.24682697,7.3464661 L11.104381,1.55737608 C11.4712164,0.814207972 12.5309603,0.814207972 12.8977957,1.55737608 L15.7553497,7.3464661 L22.1457165,8.28051393 C22.9656312,8.40035674 23.2924147,9.40819801 22.6988211,9.98635811 L18.0756101,14.4893656 L19.166697,20.8509567 C19.3068155,21.6679189 18.4492666,22.2908819 17.7156371,21.9050735 L12.0010883,18.8998497 L6.28653961,21.9050735 C5.55291004,22.2908819 4.69536119,21.6679189 4.83547972,20.8509567 L5.92656655,14.4893656 L1.30335554,9.98635811 C0.709762006,9.40819801 1.03654545,8.40035674 1.85646012,8.28051393 L8.24682697,7.3464661', viewBox: '0 0 22 21', ratio: 1, }, - [SessionIconType.Shield]: { + shield: { path: 'M 349.875 62.773438 L 205.875 2.773438 C 197.015625 -0.898438 187.058594 -0.898438 178.199219 2.773438 L 34.199219 62.773438 C 20.773438 68.324219 12 81.449219 12 96 C 12 244.875 97.875 347.773438 178.125 381.226563 C 186.976563 384.898438 196.949219 384.898438 205.800781 381.226563 C 270.074219 354.449219 372 261.976563 372 96 C 372 81.449219 363.226563 68.324219 349.875 62.773438 Z M 192.074219 334.726563 L 192 48.976563 L 323.925781 103.949219 C 321.449219 217.5 262.351563 299.773438 192.074219 334.726563 Z M 192.074219 334.726563', viewBox: '0 0 384 384', ratio: 1, }, - [SessionIconType.Stopwatch]: { + stopwatch: { path: 'm282.523438 1.34375c-8.800782-.886719-17.640626-1.328125-26.484376-1.3242188h-.265624c-14.636719.2421878-26.339844 12.2421878-26.214844 26.8828128v105.53125c-.035156 3.554687.6875 7.074218 2.117187 10.328125 4.582031 10.90625 15.863281 17.429687 27.597657 15.964843 13.554687-2.03125 23.5-13.792968 23.25-27.492187v-76.484375c98.890624 12.980469 173.726562 95.839844 176.59375 195.539062 2.867187 99.699219-67.078126 186.726563-165.058594 205.367188-97.980469 18.644531-195-36.613281-228.945313-130.398438-33.945312-93.785156 5.226563-198.339843 92.441407-246.730468 11.59375-6.566406 16.445312-20.769532 11.289062-33.054688l-.03125-.074218c-2.890625-6.988282-8.625-12.40625-15.765625-14.902344-7.136719-2.492188-15-1.820313-21.613281 1.84375-110.347656 61.484375-159.351563 194.269531-115.402344 312.695312 43.945312 118.429688 167.710938 187.097656 291.453125 161.710938 123.742187-25.386719 210.472656-137.238282 204.238281-263.40625-6.230468-126.164063-103.558594-228.925782-229.199218-241.996094zm0 0 M159.300781 170.949219c10.652344 28.050781 45.503907 94.28125 71.574219 122.480469 16.027344 18.09375 43.394531 20.515624 62.351562 5.523437 9.484376-7.957031 15.191407-19.527344 15.738282-31.894531.542968-12.363282-4.132813-24.390625-12.878906-33.148438-27.265626-27.261718-96.464844-63.382812-125.480469-74.398437-3.25-1.222657-6.917969-.417969-9.363281 2.050781-2.441407 2.472656-3.203126 6.148438-1.941407 9.386719zm0 0', viewBox: '0 0 512 512', ratio: 1, }, - [SessionIconType.QR]: { + qr: { path: 'M0 0v170h170V0H0zm130 130H40V40h90v90z M65 65h40v40H65zM342 0v170h170V0H342zm130 130h-90V40h90v90z M407 65h40v40h-40zM0 342v170h170V342H0zm130 130H40v-90h90v90z M65 407h40v40H65zM40 197h40v40H40zM120 277v-40H80v40h39v40h40v-40zM280 77h40v40h-40zM200 40h40v77h-40zM240 0h40v40h-40zM240 117v40h-40v40h80v-80zM280 355v-39h-40v-79h-40v80h40v39h40v39h80v-40z M280 197h40v80h-40zM472 236v-39h-73v40h-39v40h40v39h112v-80h-40zm0 40h-72v-39h72v39zM472 355h40v80h-40zM320 277h40v40h-40zM360 395h40v40h-40zM400 355h40v40h-40zM400 435v77h40v-37h32v-40zM200 356h40v76h-40zM320 472v-40h-80v80h40v-40h39v40h40v-40zM120 197h80v40h-80zM0 237h40v80H0z', viewBox: '0 0 512 512', ratio: 1, }, - [SessionIconType.Users]: { + users: { path: 'M9.38,2.17c-1.73,0-3.12,1.4-3.12,3.12s1.4,3.12,3.12,3.12s3.12-1.4,3.12-3.12S11.1,2.17,9.38,2.17z M16.93,0.25c2.3,0.59,3.92,2.67,3.92,5.05s-1.61,4.46-3.92,5.05c-0.56,0.14-1.12-0.19-1.27-0.75c-0.14-0.56,0.19-1.12,0.75-1.27 c1.38-0.35,2.35-1.6,2.35-3.03s-0.97-2.67-2.35-3.03c-0.56-0.14-0.9-0.71-0.75-1.27C15.8,0.44,16.37,0.11,16.93,0.25z M9.38,0.08 c2.88,0,5.21,2.33,5.21,5.21s-2.33,5.21-5.21,5.21S4.17,8.17,4.17,5.29C4.17,2.42,6.5,0.08,9.38,0.08z M21.09,12.75 c2.22,0.57,3.8,2.53,3.9,4.81L25,17.79v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08 c0-1.42-0.96-2.67-2.34-3.02c-0.56-0.14-0.89-0.71-0.75-1.27C19.97,12.94,20.54,12.61,21.09,12.75z M13.54,12.58 c2.8,0,5.09,2.21,5.2,4.99v0.22v2.08c0,0.58-0.47,1.04-1.04,1.04c-0.54,0-0.98-0.41-1.04-0.93l-0.01-0.11v-2.08 c0-1.67-1.3-3.03-2.95-3.12h-0.18H5.21c-1.67,0-3.03,1.3-3.12,2.95v0.18v2.08c0,0.58-0.47,1.04-1.04,1.04 c-0.54,0-0.98-0.41-1.04-0.93L0,19.88V17.8c0-2.8,2.21-5.09,4.99-5.2h0.22h8.33V12.58z', viewBox: '0 0 25 21', ratio: 1, }, - [SessionIconType.Sun]: { - path: - 'M5.99997005,30 L2.00002995,30 C0.895437462,30 0,30.8955438 0,32 C0,33.1044562 0.895437462,34 2.00002995,34 L5.99997005,34 C7.10444275,34 8,33.1045759 8,32 C8,30.8954241 7.10444275,30 5.99997005,30 Z M61.9999701,30 L58.0000299,30 C56.8955573,30 56,30.8954241 56,32 C56,33.1045759 56.8954375,34 58.0000299,34 L61.9999701,34 C63.1044427,34 64,33.1045759 64,32 C64,30.8954241 63.1045625,30 61.9999701,30 Z M32,56 C30.8955438,56 30,56.8954375 30,58.0000299 L30,61.9999701 C30,63.1044427 30.8954241,64 32,64 C33.1045759,64 34,63.1045625 34,61.9999701 L34,58.0000299 C34,56.8955573 33.1044562,56 32,56 Z M32,0 C30.8955438,0 30,0.895437462 30,2.00002995 L30,5.99997005 C30,7.10444275 30.8954241,8 32,8 C33.1045759,8 34,7.10456254 34,5.99997005 L34,2.00002995 C34,0.895437462 33.1044562,0 32,0 Z M47.7317718,56.7845838 L45.7319182,53.0721056 C45.1797305,52.0469599 43.9566528,51.6955731 43.0002063,52.2875514 C42.0437597,52.8794013 41.7160405,54.1903297 42.2682282,55.2154754 L44.2680818,58.9279535 C44.8205091,59.9536127 46.0439461,60.3041008 46.9997937,59.7125077 C47.9562403,59.1206578 48.2839595,57.8097294 47.7317718,56.7845838 Z M21.7317718,8.78454964 L19.7319182,5.07209798 C19.1797305,4.0469596 17.9566528,3.69557529 17.0002063,4.28754937 C16.0437597,4.87939507 15.7160405,6.19031404 16.2682282,7.21545242 L18.2680818,10.9279041 C18.8205091,11.953556 20.0439461,12.30417 20.9997937,11.7124527 C21.9562403,11.120607 22.2839595,9.80968802 21.7317718,8.78454964 Z M58.9279441,44.2681449 L55.2154404,42.2683526 C54.1901593,41.7159423 52.8793503,42.0437712 52.2874963,43.0003082 C51.6956424,43.9567254 52.0469032,45.1797656 53.0720559,45.7319364 L56.7845596,47.7317287 C57.8091988,48.2837797 59.1203929,47.9566694 59.7125037,46.9997731 C60.3043576,46.0433559 59.9530968,44.8203157 58.9279441,44.2681449 Z M10.9279935,18.2681287 L7.21546334,16.2683276 C6.1901749,15.7159149 4.87922822,16.043865 4.28749839,17.0002864 C3.69564018,17.9567078 4.04690354,19.1797533 5.07206359,19.7319265 L8.78459372,21.7317275 C9.80924022,22.2837809 11.1204437,21.9566692 11.7125587,20.9997687 C12.3042885,20.0433474 11.9531535,18.8203018 10.9279935,18.2681287 Z M59.7125037,17.0002509 C59.1206497,16.0438126 57.8098407,15.7159764 56.7845596,16.2682791 L53.0720559,18.2681157 C52.0469032,18.8202986 51.6956424,20.0433659 52.2874963,20.9998042 C52.8796071,21.9567217 54.1909296,22.2837194 55.2154404,21.731776 L58.9279441,19.7319395 C59.9530968,19.1797565 60.3043576,17.9566893 59.7125037,17.0002509 Z M11.7124767,43.0002066 C11.1207531,42.0437597 9.80969199,41.7160405 8.78454285,42.2682283 L5.07205219,44.2680826 C4.04690304,44.8202704 3.69564342,46.0433485 4.28749534,46.9997953 C4.87960402,47.9567213 6.19092192,48.2837219 7.21542915,47.7317736 L10.9279198,45.7319194 C11.9531973,45.1797315 12.3043286,43.9566534 11.7124767,43.0002066 Z M46.9997937,4.28760336 C46.0432274,3.69550719 44.8202695,4.04701615 44.2680818,5.07214363 L42.2682282,8.78455581 C41.7160405,9.80968329 42.0437597,11.1205883 43.0002063,11.7124277 C43.9561737,12.3041388 45.1794909,11.9536568 45.7319182,10.9278875 L47.7317718,7.21547528 C48.2839595,6.19047618 47.9562403,4.87957115 46.9997937,4.28760336 Z M20.9997937,52.2876314 C20.0433472,51.6955352 18.8201497,52.0469158 18.2680818,53.0721716 L16.2682282,56.7845838 C15.7160405,57.8097113 16.0437597,59.1206163 17.0002063,59.7124557 C17.9561737,60.3041668 19.1794909,59.9535565 19.7319182,58.9279155 L21.7317718,55.2155033 C22.2839595,54.1903758 21.9562403,52.8794708 20.9997937,52.2876314 Z M31.5,12 C20.7477571,12 12,20.7477571 12,31.5 C12,42.2522429 20.7477571,51 31.5,51 C42.2522429,51 51,42.2522429 51,31.5 C51,20.7477571 42.252368,12 31.5,12 Z M31.5,47.6430057 C22.5988336,47.6430057 15.3569943,40.4012983 15.3569943,31.5 C15.3569943,22.5987017 22.5988336,15.3569943 31.5,15.3569943 C40.4011664,15.3569943 47.6430057,22.5988336 47.6430057,31.5 C47.6430057,40.4011664 40.4012983,47.6430057 31.5,47.6430057 Z', - viewBox: '0 0 64 64', - ratio: 1, - }, - [SessionIconType.Upload]: { + upload: { path: 'M380.032,133.472l-112-128C264.992,2.016,260.608,0,256,0c-4.608,0-8.992,2.016-12.032,5.472l-112,128 c-4.128,4.736-5.152,11.424-2.528,17.152C132.032,156.32,137.728,160,144,160h64v208c0,8.832,7.168,16,16,16h64 c8.832,0,16-7.168,16-16V160h64c6.272,0,11.968-3.648,14.56-9.376C385.152,144.896,384.192,138.176,380.032,133.472z M432,352v96H80v-96H16v128c0,17.696,14.336,32,32,32h416c17.696,0,32-14.304,32-32V352H432z', viewBox: '0 0 512 512', ratio: 1, }, - [SessionIconType.Warning]: { + warning: { path: 'M243.225,333.382c-13.6,0-25,11.4-25,25s11.4,25,25,25c13.1,0,25-11.4,24.4-24.4 C268.225,344.682,256.925,333.382,243.225,333.382z M474.625,421.982c15.7-27.1,15.8-59.4,0.2-86.4l-156.6-271.2c-15.5-27.3-43.5-43.5-74.9-43.5s-59.4,16.3-74.9,43.4 l-156.8,271.5c-15.6,27.3-15.5,59.8,0.3,86.9c15.6,26.8,43.5,42.9,74.7,42.9h312.8 C430.725,465.582,458.825,449.282,474.625,421.982z M440.625,402.382c-8.7,15-24.1,23.9-41.3,23.9h-312.8 c-17,0-32.3-8.7-40.8-23.4c-8.6-14.9-8.7-32.7-0.1-47.7l156.8-271.4c8.5-14.9,23.7-23.7,40.9-23.7c17.1,0,32.4,8.9,40.9,23.8 l156.7,271.4C449.325,369.882,449.225,387.482,440.625,402.382z M237.025,157.882c-11.9,3.4-19.3,14.2-19.3,27.3c0.6,7.9,1.1,15.9,1.7,23.8c1.7,30.1,3.4,59.6,5.1,89.7 c0.6,10.2,8.5,17.6,18.7,17.6c10.2,0,18.2-7.9,18.7-18.2c0-6.2,0-11.9,0.6-18.2c1.1-19.3,2.3-38.6,3.4-57.9 c0.6-12.5,1.7-25,2.3-37.5c0-4.5-0.6-8.5-2.3-12.5C260.825,160.782,248.925,155.082,237.025,157.882z', viewBox: '0 0 486.463 486.463', ratio: 1, }, - [SessionIconType.Sending]: { + sending: { path: 'M11.5,0 L12.5,0 L12.5,1 L11.5,1 L11.5,0 Z M11.5,11 L12.5,11 L12.5,12 L11.5,12 L11.5,11 Z M6,5.5 L7,5.5 L7,6.5 L6,6.5 L6,5.5 Z M17,5.5 L18,5.5 L18,6.5 L17,6.5 L17,5.5 Z M16.9461524,2.5669873 L17.4461524,3.4330127 L16.580127,3.9330127 L16.080127,3.0669873 L16.9461524,2.5669873 Z M7.41987298,8.0669873 L7.91987298,8.9330127 L7.05384758,9.4330127 L6.55384758,8.5669873 L7.41987298,8.0669873 Z M9.4330127,0.553847577 L9.9330127,1.41987298 L9.0669873,1.91987298 L8.5669873,1.05384758 L9.4330127,0.553847577 Z M14.9330127,10.080127 L15.4330127,10.9461524 L14.5669873,11.4461524 L14.0669873,10.580127 L14.9330127,10.080127 Z M14.5669873,0.553847577 L15.4330127,1.05384758 L14.9330127,1.91987298 L14.0669873,1.41987298 L14.5669873,0.553847577 Z M9.0669873,10.080127 L9.9330127,10.580127 L9.4330127,11.4461524 L8.5669873,10.9461524 L9.0669873,10.080127 Z M7.05384758,2.5669873 L7.91987298,3.0669873 L7.41987298,3.9330127 L6.55384758,3.4330127 L7.05384758,2.5669873 Z M16.580127,8.0669873 L17.4461524,8.5669873 L16.9461524,9.4330127 L16.080127,8.9330127 L16.580127,8.0669873 Z', viewBox: '6 0 12 12', ratio: 1, }, - [SessionIconType.DoubleCheckCircle]: { + doubleCheckCircle: { path: 'M7.91731278,0.313257194 C7.58941091,0.549084144 7.28273546,0.812570593 7.00070199,1.10030099 C6.67734551,1.03453102 6.34268082,1 6,1 C3.24,1 1,3.24 1,6 C1,8.76 3.24,11 6,11 C6.34268082,11 6.67734551,10.965469 7.00070199,10.899699 C7.28273546,11.1874294 7.58941091,11.4509159 7.91731278,11.6867428 C7.31518343,11.8898758 6.67037399,12 6,12 C2.688,12 0,9.312 0,6 C0,2.688 2.688,0 6,0 C6.67037399,0 7.31518343,0.110124239 7.91731278,0.313257194 Z M5.07266453,7.01233547 C5.12977459,7.4065842 5.21974274,7.79019382 5.33970233,8.16029767 L5,8.5 L2.5,6 L3.205,5.295 L5,7.085 L5.07266453,7.01233547 Z M12,0 C15.312,0 18,2.688 18,6 C18,9.312 15.312,12 12,12 C8.688,12 6,9.312 6,6 C6,2.688 8.688,0 12,0 Z M12,1 C9.24,1 7,3.24 7,6 C7,8.76 9.24,11 12,11 C14.76,11 17,8.76 17,6 C17,3.24 14.76,1 12,1 Z M11,8.5 L8.5,6 L9.205,5.295 L11,7.085 L14.795,3.29 L15.5,4 L11,8.5 Z', viewBox: '3 0 12 12', ratio: 1.6, }, - [SessionIconType.Gallery]: { + gallery: { path: 'M218.8,52.1H110.2v-0.9c0.1-0.5,0.1-1.1,0.1-1.6V38.2c0-7.8-6.4-14.2-14.2-14.2H85.9H33.4H23.3c-7.8,0-14.2,6.4-14.2,14.2v10.1v1.2V75v130.7c0,15.5,12.6,28,28.1,28.1h181.6c15.5,0,28.1-12.6,28.1-28.1V80.2C246.9,64.7,234.3,52.1,218.8,52.1zM218.8,215.1H37.2c-5.2-0.1-9.3-4.2-9.4-9.4V80.3c0.1-5.2,4.2-9.3,9.4-9.4h181.6c5.2,0.1,9.3,4.2,9.4,9.4v125.4h0C228.1,210.9,224,215,218.8,215.1z M170.2,108.3c0-11.2,9.1-20.4,20.4-20.4s20.4,9.1,20.4,20.4c0,11.2-9.1,20.4-20.4,20.4h-0.1c0,0,0,0,0,0C179.2,128.7,170.2,119.5,170.2,108.3z M158.8,149.9l54.7,52.5h-173l51-103.7l33.8,75.3L158.8,149.9z', viewBox: '0 0 256 256', ratio: 1, }, - [SessionIconType.Timer00]: { + timer00: { path: 'M11.428367,3.44328115 L10.5587469,3.94535651 C10.4906607,3.79477198 10.4145019,3.64614153 10.330127,3.5 C10.2457522,3.35385847 10.1551138,3.21358774 10.0587469,3.07933111 L10.928367,2.57725574 C11.0225793,2.71323387 11.1119641,2.85418158 11.1961524,3 C11.2803407,3.14581842 11.3577126,3.2937018 11.428367,3.44328115 Z M9.42274426,1.07163304 L8.92066889,1.94125309 C8.78641226,1.84488615 8.64614153,1.75424783 8.5,1.66987298 C8.35385847,1.58549813 8.20522802,1.50933927 8.05464349,1.44125309 L8.55671885,0.571633044 C8.7062982,0.642287382 8.85418158,0.719659271 9,0.803847577 C9.14581842,0.888035884 9.28676613,0.977420696 9.42274426,1.07163304 Z M11.9794631,6.5 L10.9753124,6.5 C10.9916403,6.33554688 11,6.1687497 11,6 C11,5.8312503 10.9916403,5.66445312 10.9753124,5.5 L11.9794631,5.5 C11.9930643,5.66486669 12,5.83162339 12,6 C12,6.16837661 11.9930643,6.33513331 11.9794631,6.5 Z M10.928367,9.42274426 L10.0587469,8.92066889 C10.1551138,8.78641226 10.2457522,8.64614153 10.330127,8.5 C10.4145019,8.35385847 10.4906607,8.20522802 10.5587469,8.05464349 L11.428367,8.55671885 C11.3577126,8.7062982 11.2803407,8.85418158 11.1961524,9 C11.1119641,9.14581842 11.0225793,9.28676613 10.928367,9.42274426 Z M8.55671885,11.428367 L8.05464349,10.5587469 C8.20522802,10.4906607 8.35385847,10.4145019 8.5,10.330127 C8.64614153,10.2457522 8.78641226,10.1551138 8.92066889,10.0587469 L9.42274426,10.928367 C9.28676613,11.0225793 9.14581842,11.1119641 9,11.1961524 C8.85418158,11.2803407 8.7062982,11.3577126 8.55671885,11.428367 Z M2.57725574,10.928367 L3.07933111,10.0587469 C3.21358774,10.1551138 3.35385847,10.2457522 3.5,10.330127 C3.64614153,10.4145019 3.79477198,10.4906607 3.94535651,10.5587469 L3.44328115,11.428367 C3.2937018,11.3577126 3.14581842,11.2803407 3,11.1961524 C2.85418158,11.1119641 2.71323387,11.0225793 2.57725574,10.928367 Z M5.5,11.9794631 L5.5,10.9753124 C5.66445312,10.9916403 5.8312503,11 6,11 C6.1687497,11 6.33554688,10.9916403 6.5,10.9753124 L6.5,11.9794631 C6.33513331,11.9930643 6.16837661,12 6,12 C5.83162339,12 5.66486669,11.9930643 5.5,11.9794631 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z M6.5,0.0205368885 L6.5,7 L5.5,7 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,5.01e-14 6,5.01e-14 C6.16837661,5.01e-14 6.33513331,0.00693566443 6.5,0.0205368885 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer05]: { + timer05: { path: 'M6.5,1.02370353 L6.5,1.02468762 C6.33554688,1.00835972 6.1687497,1 6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,4.42354486e-17 6,4.42354486e-17 L5.87059234,-7.37983893e-14 C7.16354589,-0.0289161279 8.40910326,0.364429763 9.43644004,1.08141215 L8.9316493,1.94944159 L8.92055711,1.94144648 L6.43301236,6.25000036 L5.56698696,5.75000036 L8.0545317,1.44144648 C7.56661533,1.2212014 7.04204534,1.07826289 6.5,1.02370353 Z M11.428367,3.44328115 L10.5587469,3.94535651 C10.4906607,3.79477198 10.4145019,3.64614153 10.330127,3.5 C10.2457522,3.35385847 10.1551138,3.21358774 10.0587469,3.07933111 L10.928367,2.57725574 C11.0225793,2.71323387 11.1119641,2.85418158 11.1961524,3 C11.2803407,3.14581842 11.3577126,3.2937018 11.428367,3.44328115 Z M11.9794631,6.5 L10.9753124,6.5 C10.9916403,6.33554688 11,6.1687497 11,6 C11,5.8312503 10.9916403,5.66445312 10.9753124,5.5 L11.9794631,5.5 C11.9930643,5.66486669 12,5.83162339 12,6 C12,6.16837661 11.9930643,6.33513331 11.9794631,6.5 Z M10.928367,9.42274426 L10.0587469,8.92066889 C10.1551138,8.78641226 10.2457522,8.64614153 10.330127,8.5 C10.4145019,8.35385847 10.4906607,8.20522802 10.5587469,8.05464349 L11.428367,8.55671885 C11.3577126,8.7062982 11.2803407,8.85418158 11.1961524,9 C11.1119641,9.14581842 11.0225793,9.28676613 10.928367,9.42274426 Z M8.55671885,11.428367 L8.05464349,10.5587469 C8.20522802,10.4906607 8.35385847,10.4145019 8.5,10.330127 C8.64614153,10.2457522 8.78641226,10.1551138 8.92066889,10.0587469 L9.42274426,10.928367 C9.28676613,11.0225793 9.14581842,11.1119641 9,11.1961524 C8.85418158,11.2803407 8.7062982,11.3577126 8.55671885,11.428367 Z M2.57725574,10.928367 L3.07933111,10.0587469 C3.21358774,10.1551138 3.35385847,10.2457522 3.5,10.330127 C3.64614153,10.4145019 3.79477198,10.4906607 3.94535651,10.5587469 L3.44328115,11.428367 C3.2937018,11.3577126 3.14581842,11.2803407 3,11.1961524 C2.85418158,11.1119641 2.71323387,11.0225793 2.57725574,10.928367 Z M5.5,11.9794631 L5.5,10.9753124 C5.66445312,10.9916403 5.8312503,11 6,11 C6.1687497,11 6.33554688,10.9916403 6.5,10.9753124 L6.5,11.9794631 C6.33513331,11.9930643 6.16837661,12 6,12 C5.83162339,12 5.66486669,11.9930643 5.5,11.9794631 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer10]: { + timer10: { path: 'M6.5,1.02430376 L6.5,1.02468762 C6.33554688,1.00835972 6.1687497,1 6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,1.62630326e-17 6,1.62630326e-17 L5.86308464,3.75931924e-14 C6.41989049,-0.0124561971 6.98779297,0.0530213558 7.5529141,0.204445108 C9.33301785,0.681422471 10.710634,1.91072271 11.4353383,3.45859809 L10.564162,3.95793826 L10.5585534,3.9454682 L6.24999954,6.43301294 L5.74999954,5.56698753 L10.0585534,3.07944279 C9.4085445,2.17504687 8.45381951,1.48111816 7.29409506,1.17037093 C7.02944452,1.09945804 6.764062,1.05116398 6.5,1.02430376 Z M11.9794631,6.5 L10.9753124,6.5 C10.9916403,6.33554688 11,6.1687497 11,6 C11,5.8312503 10.9916403,5.66445312 10.9753124,5.5 L11.9794631,5.5 C11.9930643,5.66486669 12,5.83162339 12,6 C12,6.16837661 11.9930643,6.33513331 11.9794631,6.5 Z M10.928367,9.42274426 L10.0587469,8.92066889 C10.1551138,8.78641226 10.2457522,8.64614153 10.330127,8.5 C10.4145019,8.35385847 10.4906607,8.20522802 10.5587469,8.05464349 L11.428367,8.55671885 C11.3577126,8.7062982 11.2803407,8.85418158 11.1961524,9 C11.1119641,9.14581842 11.0225793,9.28676613 10.928367,9.42274426 Z M8.55671885,11.428367 L8.05464349,10.5587469 C8.20522802,10.4906607 8.35385847,10.4145019 8.5,10.330127 C8.64614153,10.2457522 8.78641226,10.1551138 8.92066889,10.0587469 L9.42274426,10.928367 C9.28676613,11.0225793 9.14581842,11.1119641 9,11.1961524 C8.85418158,11.2803407 8.7062982,11.3577126 8.55671885,11.428367 Z M2.57725574,10.928367 L3.07933111,10.0587469 C3.21358774,10.1551138 3.35385847,10.2457522 3.5,10.330127 C3.64614153,10.4145019 3.79477198,10.4906607 3.94535651,10.5587469 L3.44328115,11.428367 C3.2937018,11.3577126 3.14581842,11.2803407 3,11.1961524 C2.85418158,11.1119641 2.71323387,11.0225793 2.57725574,10.928367 Z M5.5,11.9794631 L5.5,10.9753124 C5.66445312,10.9916403 5.8312503,11 6,11 C6.1687497,11 6.33554688,10.9916403 6.5,10.9753124 L6.5,11.9794631 C6.33513331,11.9930643 6.16837661,12 6,12 C5.83162339,12 5.66486669,11.9930643 5.5,11.9794631 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer15]: { + timer15: { path: 'M6.5,0.0207420606 C7.86488275,0.134195272 9.19834885,0.713067711 10.2426405,1.75735938 C11.5457669,3.06048577 12.1241674,4.8138991 11.977842,6.51675063 L10.9737111,6.51360374 L10.975089,6.50000007 L5.9999995,6.50000007 L5.9999995,5.50000007 L10.975089,5.50000007 C10.8643627,4.39176576 10.384511,3.31344338 9.53553374,2.46446616 C8.55922305,1.48815547 7.27961153,1.00000011 6,1.00000007 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,0 6,0 C6.16837661,0 6.33513331,0.00693566443 6.5,0.0205368885 L6.5,0.0207420606 Z M10.928367,9.42274426 L10.0587469,8.92066889 C10.1551138,8.78641226 10.2457522,8.64614153 10.330127,8.5 C10.4145019,8.35385847 10.4906607,8.20522802 10.5587469,8.05464349 L11.428367,8.55671885 C11.3577126,8.7062982 11.2803407,8.85418158 11.1961524,9 C11.1119641,9.14581842 11.0225793,9.28676613 10.928367,9.42274426 Z M8.55671885,11.428367 L8.05464349,10.5587469 C8.20522802,10.4906607 8.35385847,10.4145019 8.5,10.330127 C8.64614153,10.2457522 8.78641226,10.1551138 8.92066889,10.0587469 L9.42274426,10.928367 C9.28676613,11.0225793 9.14581842,11.1119641 9,11.1961524 C8.85418158,11.2803407 8.7062982,11.3577126 8.55671885,11.428367 Z M2.57725574,10.928367 L3.07933111,10.0587469 C3.21358774,10.1551138 3.35385847,10.2457522 3.5,10.330127 C3.64614153,10.4145019 3.79477198,10.4906607 3.94535651,10.5587469 L3.44328115,11.428367 C3.2937018,11.3577126 3.14581842,11.2803407 3,11.1961524 C2.85418158,11.1119641 2.71323387,11.0225793 2.57725574,10.928367 Z M5.5,11.9794631 L5.5,10.9753124 C5.66445312,10.9916403 5.8312503,11 6,11 C6.1687497,11 6.33554688,10.9916403 6.5,10.9753124 L6.5,11.9794631 C6.33513331,11.9930643 6.16837661,12 6,12 C5.83162339,12 5.66486669,11.9930643 5.5,11.9794631 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -1.13006288e-12,6.16837661 -1.13009381e-12,6 C-1.13012474e-12,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer20]: { + timer20: { path: 'M6.5,1.02370353 L6.5,1.02468762 C6.33554688,1.00835972 6.1687497,1 6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,-1.1492543e-17 6,-1.1492543e-17 L5.87059232,4.19252306e-14 C8.57132191,-0.0604002043 11.0652567,1.72157607 11.7955548,4.4470858 C12.2725322,6.22718955 11.896735,8.03489028 10.9185877,9.43644027 L10.0505583,8.93164953 L10.0585534,8.92055734 L5.74999954,6.4330126 L6.24999954,5.5669872 L10.5585534,8.05453194 C11.0167788,7.03940974 11.1403762,5.86562929 10.829629,4.70590484 C10.2763071,2.64087962 8.50807111,1.22582513 6.5,1.02370353 Z M8.55671885,11.428367 L8.05464349,10.5587469 C8.20522802,10.4906607 8.35385847,10.4145019 8.5,10.330127 C8.64614153,10.2457522 8.78641226,10.1551138 8.92066889,10.0587469 L9.42274426,10.928367 C9.28676613,11.0225793 9.14581842,11.1119641 9,11.1961524 C8.85418158,11.2803407 8.7062982,11.3577126 8.55671885,11.428367 Z M2.57725574,10.928367 L3.07933111,10.0587469 C3.21358774,10.1551138 3.35385847,10.2457522 3.5,10.330127 C3.64614153,10.4145019 3.79477198,10.4906607 3.94535651,10.5587469 L3.44328115,11.428367 C3.2937018,11.3577126 3.14581842,11.2803407 3,11.1961524 C2.85418158,11.1119641 2.71323387,11.0225793 2.57725574,10.928367 Z M5.5,11.9794631 L5.5,10.9753124 C5.66445312,10.9916403 5.8312503,11 6,11 C6.1687497,11 6.33554688,10.9916403 6.5,10.9753124 L6.5,11.9794631 C6.33513331,11.9930643 6.16837661,12 6,12 C5.83162339,12 5.66486669,11.9930643 5.5,11.9794631 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer25]: { + timer25: { path: 'M6.5,1.02430376 L6.5,1.02468762 C6.33554688,1.00835972 6.1687497,1 6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,4.81385765e-17 6,4.81385765e-17 L5.86308468,4.16843209e-14 C6.41989052,-0.012456193 6.98779298,0.0530213603 7.5529141,0.204445109 C10.7537107,1.06209598 12.6532057,4.35211772 11.7955548,7.55291434 C11.3185774,9.33301809 10.0892772,10.7106343 8.54140181,11.4353385 L8.04206164,10.5641622 L8.0545317,10.5585537 L5.56698696,6.24999978 L6.43301237,5.74999978 L8.92055711,10.0585537 C9.82495303,9.40854474 10.5188817,8.45381974 10.829629,7.29409529 C11.544338,4.62676478 9.96142558,1.88507999 7.29409506,1.17037094 C7.02944452,1.09945804 6.764062,1.05116398 6.5,1.02430376 Z M2.57725574,10.928367 L3.07933111,10.0587469 C3.21358774,10.1551138 3.35385847,10.2457522 3.5,10.330127 C3.64614153,10.4145019 3.79477198,10.4906607 3.94535651,10.5587469 L3.44328115,11.428367 C3.2937018,11.3577126 3.14581842,11.2803407 3,11.1961524 C2.85418158,11.1119641 2.71323387,11.0225793 2.57725574,10.928367 Z M5.5,11.9794631 L5.5,10.9753124 C5.66445312,10.9916403 5.8312503,11 6,11 C6.1687497,11 6.33554688,10.9916403 6.5,10.9753124 L6.5,11.9794631 C6.33513331,11.9930643 6.16837661,12 6,12 C5.83162339,12 5.66486669,11.9930643 5.5,11.9794631 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer30]: { + timer30: { path: 'M6.5,0.0207420321 C7.86488252,0.134195172 9.19834876,0.713067621 10.2426405,1.75735938 C12.5857863,4.10050513 12.5857863,7.899495 10.2426405,10.2426408 C8.93951413,11.5457671 7.1861008,12.1241676 5.48324927,11.9778423 L5.48639616,10.9737113 L5.49999983,10.9750892 L5.49999983,5.99999973 L6.49999983,5.99999973 L6.49999983,10.9750892 C7.60823414,10.8643629 8.68655652,10.3845112 9.53553374,9.53553397 C11.4881552,7.58291251 11.4881552,4.41708762 9.53553374,2.46446616 C8.60186739,1.53079981 7.39081733,1.04357578 6.16765141,1.00279407 C6.11199785,1.00092414 6.05610685,1 6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,0 6,0 C6.16837661,0 6.33513331,0.00693566443 6.5,0.0205368885 L6.5,0.0207420321 Z M2.57725574,10.928367 L3.07933111,10.0587469 C3.21358774,10.1551138 3.35385847,10.2457522 3.5,10.330127 C3.64614153,10.4145019 3.79477198,10.4906607 3.94535651,10.5587469 L3.44328115,11.428367 C3.2937018,11.3577126 3.14581842,11.2803407 3,11.1961524 C2.85418158,11.1119641 2.71323387,11.0225793 2.57725574,10.928367 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer35]: { + timer35: { path: 'M6.5,1.02370354 L6.5,1.02468762 C6.33554688,1.00835972 6.1687497,1 6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,4.09828421e-17 6,4.09828421e-17 L5.87059244,4.2745538e-14 C8.57132199,-0.0604001451 11.0652567,1.72157611 11.7955548,4.4470858 C12.6532057,7.64788242 10.7537107,10.9379042 7.5529141,11.795555 C5.77281035,12.2725324 3.96510962,11.8967353 2.56355963,10.918588 L3.06835037,10.0505585 L3.07944256,10.0585537 L5.5669873,5.74999978 L6.4330127,6.24999978 L3.94546796,10.5585537 C4.96059016,11.016779 6.13437061,11.1403764 7.29409506,10.8296292 C9.96142558,10.1149201 11.544338,7.37323536 10.829629,4.70590484 C10.2763071,2.64087963 8.50807111,1.22582514 6.5,1.02370354 Z M0.571633044,8.55671885 L1.44125309,8.05464349 C1.50933927,8.20522802 1.58549813,8.35385847 1.66987298,8.5 C1.75424783,8.64614153 1.84488615,8.78641226 1.94125309,8.92066889 L1.07163304,9.42274426 C0.977420696,9.28676613 0.888035884,9.14581842 0.803847577,9 C0.719659271,8.85418158 0.642287382,8.7062982 0.571633044,8.55671885 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer40]: { + timer40: { path: 'M6.5,1.02430376 L6.5,1.02468762 C6.33554688,1.00835972 6.1687497,1 6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,-9.97465999e-18 6,-9.97465999e-18 L5.86308481,-6.71970472e-11 C6.4198906,-0.0124561805 6.98779302,0.0530213744 7.5529141,0.204445112 C10.7537107,1.06209598 12.6532057,4.35211772 11.7955548,7.55291434 C10.9379039,10.753711 7.64788218,12.6532059 4.44708556,11.795555 C2.66698181,11.3185777 1.28936562,10.0892774 0.564661357,8.54140205 L1.43583768,8.04206188 L1.44144625,8.05453194 L5.75000012,5.5669872 L6.25000012,6.4330126 L1.94144625,8.92055734 C2.59145516,9.82495327 3.54618016,10.518882 4.70590461,10.8296292 C7.37323512,11.5443383 10.1149199,9.96142581 10.829629,7.29409529 C11.544338,4.62676478 9.96142558,1.88508 7.29409506,1.17037094 C7.02944452,1.09945804 6.764062,1.05116398 6.5,1.02430376 Z M0.0205368885,5.5 L1.02468762,5.5 C1.00835972,5.66445312 1,5.8312503 1,6 C1,6.1687497 1.00835972,6.33554688 1.02468762,6.5 L0.0205368885,6.5 C0.00693566443,6.33513331 -9.95062878e-13,6.16837661 -9.95093808e-13,6 C-9.95124738e-13,5.83162339 0.00693566443,5.66486669 0.0205368885,5.5 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer45]: { + timer45: { path: 'M6.5,0.0207420343 C7.86488252,0.134195174 9.19834876,0.713067624 10.2426405,1.75735938 C12.5857863,4.10050513 12.5857863,7.89949501 10.2426405,10.2426408 C7.89949477,12.5857865 4.1005049,12.5857865 1.75735914,10.2426408 C0.454232755,8.93951437 -0.124167745,7.18610104 0.0221576434,5.48324951 L1.02628856,5.4863964 L1.02491069,5.50000007 L6.00000017,5.50000007 L6.00000017,6.50000007 L1.02491069,6.50000007 C1.13563696,7.60823437 1.61548871,8.68655676 2.46446593,9.53553398 C4.41708738,11.4881554 7.58291228,11.4881554 9.53553374,9.53553398 C11.4881552,7.58291252 11.4881552,4.41708762 9.53553374,2.46446616 C8.60186704,1.53079946 7.39081643,1.04357542 6.16765005,1.00279403 C6.11199694,1.00092412 6.05610639,1 6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,0 6,0 C6.16837661,0 6.33513331,0.00693566443 6.5,0.0205368885 L6.5,0.0207420343 Z M1.07163304,2.57725574 L1.94125309,3.07933111 C1.84488615,3.21358774 1.75424783,3.35385847 1.66987298,3.5 C1.58549813,3.64614153 1.50933927,3.79477198 1.44125309,3.94535651 L0.571633044,3.44328115 C0.642287382,3.2937018 0.719659271,3.14581842 0.803847577,3 C0.888035884,2.85418158 0.977420696,2.71323387 1.07163304,2.57725574 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer50]: { + timer50: { path: [ 'M8.49999998,1.66987313 L8.99999998,0.80384773 C10.3298113,1.57161469 11.3667294,2.84668755 11.7955548,4.4470858 C12.6532057,7.64788242 10.7537107,10.9379042 7.5529141,11.795555 C4.35211748,12.6532059 1.06209574,10.753711 0.204444873,7.55291434 C-0.27253249,5.77281059 0.103264647,3.96510985 1.08141192,2.56355986 L1.94944135,3.0683506 L1.94144625,3.07944279 L6.25000012,5.56698754 L5.75000012,6.43301294 L1.44144624,3.9454682 C0.98322086,4.96059039 0.85962347,6.13437085 1.1703707,7.29409529 C1.88507976,9.96142581 4.62676454,11.5443383 7.29409506,10.8296292 C9.96142557,10.1149201 11.544338,7.37323536 10.829629,4.70590484 C10.4722744,3.37223964 9.60817605,2.30967894 8.49999998,1.66987313 Z', 'M6.00250506,1.00000061 L6,1 C5.8312503,1 5.66445312,1.00835972 5.5,1.02468762 L5.5,0.0205368885 C5.66486669,0.00693566443 5.83162339,0 6,0 L6.00250686,5.12480482e-07 C9.31506271,0.0013544265 12,2.68712686 12,6 L11,6 C11,3.23941132 8.76277746,1.00135396 6.00250506,1.00000061 Z M3.44328115,0.571633044 L3.94535651,1.44125309 C3.79477198,1.50933927 3.64614153,1.58549813 3.5,1.66987298 C3.35385847,1.75424783 3.21358774,1.84488615 3.07933111,1.94125309 L2.57725574,1.07163304 C2.71323387,0.977420696 2.85418158,0.888035884 3,0.803847577 C3.14581842,0.719659271 3.2937018,0.642287382 3.44328115,0.571633044 Z', @@ -430,13 +429,13 @@ export const icons = { viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer55]: { + timer55: { path: 'M10.8871515,4.93877116 C10.7764707,4.43108229 10.5875051,3.94579225 10.3301269,3.50000021 L10.3308482,3.49958378 C9.46665561,2.00598422 7.8519922,1.00090744 6.00250515,1.00000061 L6.00250515,4.75001343e-07 C8.87812128,0.0011754551 11.2807698,2.02530154 11.8645776,4.72650571 C12.0619293,5.63173625 12.0518761,6.59631008 11.7955548,7.55291434 C10.9379039,10.753711 7.64788218,12.6532059 4.44708556,11.795555 C1.24628894,10.9379042 -0.653205997,7.64788242 0.204444873,4.4470858 C0.681422235,2.66698205 1.91072247,1.28936585 3.45859785,0.564661592 L3.95793802,1.43583792 L3.94546796,1.44144648 L6.4330127,5.75000036 L5.5669873,6.25000036 L3.07944256,1.94144648 C2.17504663,2.5914554 1.48111793,3.54618039 1.1703707,4.70590484 C0.455661641,7.37323536 2.03857409,10.1149201 4.7059046,10.8296292 C7.37323512,11.5443383 10.1149199,9.96142581 10.829629,7.29409529 C10.9454889,6.86170024 11.0009697,6.42735124 11.0012398,6 L11,6 C11,5.63585356 10.9610724,5.28079915 10.8871515,4.93877116 Z', viewBox: '0 0 12 12', ratio: 1, }, - [SessionIconType.Timer60]: { + timer60: { path: 'M6.51360423,1.02605705 L6.5136035,1.02628879 L6.49999983,1.02491092 L6.49999983,6.0000004 L5.49999983,6.0000004 L5.49999983,1.02491092 C4.39176553,1.1356372 3.31344314,1.61548894 2.46446592,2.46446616 C0.511844466,4.41708762 0.511844466,7.58291251 2.46446592,9.53553397 C4.41708738,11.4881554 7.58291228,11.4881554 9.53553374,9.53553397 C10.5118444,8.55922329 10.9999998,7.27961177 10.9999998,6.00000024 L11.9999998,6.00000024 C11.9999998,7.53553409 11.4142133,9.07106792 10.2426405,10.2426408 C7.89949477,12.5857865 4.10050489,12.5857865 1.75735914,10.2426408 C-0.585786607,7.899495 -0.585786607,4.10050513 1.75735914,1.75735938 C3.01051112,0.504207398 4.68007561,-0.0787387759 6.32064441,0.00852085708 C9.4853004,0.175084568 12,2.7938725 12,6 L11,6 C11,3.411981 9.0337411,1.28320638 6.51360423,1.02605705 Z', viewBox: '0 0 12 12', diff --git a/ts/components/session/icon/SessionIcon.tsx b/ts/components/session/icon/SessionIcon.tsx index 8ab21c4aa5..979465c3e3 100644 --- a/ts/components/session/icon/SessionIcon.tsx +++ b/ts/components/session/icon/SessionIcon.tsx @@ -1,19 +1,19 @@ import React from 'react'; import { icons, SessionIconSize, SessionIconType } from '../icon'; -import styled, { css, DefaultTheme, keyframes, useTheme } from 'styled-components'; -import { lightTheme } from '../../../state/ducks/SessionTheme'; +import styled, { css, keyframes } from 'styled-components'; export type SessionIconProps = { iconType: SessionIconType; iconSize: SessionIconSize | number; iconColor?: string; iconRotation?: number; + iconPadding?: string; rotateDuration?: number; glowDuration?: number; - borderRadius?: number; + borderRadius?: string; glowStartDelay?: number; noScale?: boolean; - theme?: DefaultTheme; + backgroundColor?: string; }; const getIconDimensionFromIconSize = (iconSize: SessionIconSize | number) => { @@ -21,17 +21,19 @@ const getIconDimensionFromIconSize = (iconSize: SessionIconSize | number) => { return iconSize; } else { switch (iconSize) { - case SessionIconSize.Tiny: + case 'tiny': return 12; - case SessionIconSize.Small: + case 'small': return 15; - case SessionIconSize.Medium: + case 'medium': return 20; - case SessionIconSize.Large: + case 'large': return 25; - case SessionIconSize.Huge: + case 'huge': return 30; - case SessionIconSize.Max: + case 'huge2': + return 40; + case 'max': return 80; default: return 20; @@ -44,11 +46,13 @@ type StyledSvgProps = { height: string | number; iconRotation: number; rotateDuration?: number; - borderRadius?: number; + borderRadius?: string; + iconPadding?: string; glowDuration?: number; glowStartDelay?: number; noScale?: boolean; iconColor?: string; + backgroundColor?: string; }; const rotate = keyframes` @@ -123,7 +127,10 @@ const Svg = React.memo(styled.svg` transform: ${props => `rotate(${props.iconRotation}deg)`}; animation: ${props => animation(props)}; border-radius: ${props => props.borderRadius}; + background-color: ${props => (props.backgroundColor ? props.backgroundColor : '')}; + border-radius: ${props => (props.borderRadius ? props.borderRadius : '')}; filter: ${props => (props.noScale ? `drop-shadow(0px 0px 4px ${props.iconColor})` : '')}; + padding: ${props => (props.iconPadding ? props.iconPadding : '')}; `); //tslint:enable no-unnecessary-callback-wrapper @@ -138,10 +145,11 @@ const SessionSvg = (props: { glowDuration?: number; glowStartDelay?: number; noScale?: boolean; - borderRadius?: number; - theme: DefaultTheme; + borderRadius?: string; + backgroundColor?: string; + iconPadding?: string; }) => { - const colorSvg = props.iconColor || props?.theme?.colors.textColor; + const colorSvg = props.iconColor || 'var(--colors-text)'; const pathArray = props.path instanceof Array ? props.path : [props.path]; const propsToPick = { width: props.width, @@ -153,6 +161,9 @@ const SessionSvg = (props: { glowStartDelay: props.glowStartDelay, iconColor: props.iconColor, noScale: props.noScale, + backgroundColor: props.backgroundColor, + borderRadius: props.borderRadius, + iconPadding: props.iconPadding, }; return ( @@ -168,25 +179,21 @@ export const SessionIcon = (props: SessionIconProps) => { const { iconType, iconColor, - theme, rotateDuration, glowDuration, borderRadius, glowStartDelay, noScale, + backgroundColor, + iconPadding, } = props; let { iconSize, iconRotation } = props; - iconSize = iconSize || SessionIconSize.Medium; + iconSize = iconSize || 'medium'; iconRotation = iconRotation || 0; - const themeToUse = theme || useTheme() || lightTheme; - const iconDimensions = getIconDimensionFromIconSize(iconSize); const iconDef = icons[iconType]; const ratio = iconDef?.ratio || 1; - if (!themeToUse) { - window?.log?.error('Missing theme props in SessionIcon'); - } return ( { borderRadius={borderRadius} iconRotation={iconRotation} iconColor={iconColor} - theme={themeToUse} + backgroundColor={backgroundColor} + iconPadding={iconPadding} /> ); }; diff --git a/ts/components/session/icon/SessionIconButton.tsx b/ts/components/session/icon/SessionIconButton.tsx index 3d8638965f..89f5ac0a38 100644 --- a/ts/components/session/icon/SessionIconButton.tsx +++ b/ts/components/session/icon/SessionIconButton.tsx @@ -2,14 +2,12 @@ import React from 'react'; import classNames from 'classnames'; import { SessionIcon, SessionIconProps } from '../icon'; import { SessionNotificationCount } from '../SessionNotificationCount'; -import { DefaultTheme, useTheme } from 'styled-components'; import _ from 'lodash'; interface SProps extends SessionIconProps { onClick?: any; notificationCount?: number; isSelected?: boolean; - theme?: DefaultTheme; isHidden?: boolean; } @@ -21,11 +19,13 @@ const SessionIconButtonInner = (props: SProps) => { iconRotation, isSelected, notificationCount, - theme, glowDuration, glowStartDelay, noScale, isHidden, + backgroundColor, + borderRadius, + iconPadding, } = props; const clickHandler = (e: any) => { if (props.onClick) { @@ -34,8 +34,6 @@ const SessionIconButtonInner = (props: SProps) => { } }; - const themeToUSe = theme || useTheme(); - return (
{ iconSize={iconSize} iconColor={iconColor} iconRotation={iconRotation} - theme={themeToUSe} glowDuration={glowDuration} glowStartDelay={glowStartDelay} noScale={noScale} + backgroundColor={backgroundColor} + borderRadius={borderRadius} + iconPadding={iconPadding} /> {Boolean(notificationCount) && }
diff --git a/ts/components/session/menu/ConversationHeaderMenu.tsx b/ts/components/session/menu/ConversationHeaderMenu.tsx index f164c1721b..ca49eb7578 100644 --- a/ts/components/session/menu/ConversationHeaderMenu.tsx +++ b/ts/components/session/menu/ConversationHeaderMenu.tsx @@ -72,8 +72,8 @@ const ConversationHeaderMenu = (props: PropsConversationHeaderMenu) => { {getChangeNicknameMenuItem(isMe, isGroup, conversationId)} {getClearNicknameMenuItem(isMe, hasNickname, isGroup, conversationId)} {getDeleteMessagesMenuItem(isPublic, conversationId)} - {getAddModeratorsMenuItem(weAreAdmin, isKickedFromGroup, conversationId)} - {getRemoveModeratorsMenuItem(weAreAdmin, isKickedFromGroup, conversationId)} + {getAddModeratorsMenuItem(weAreAdmin, isPublic, isKickedFromGroup, conversationId)} + {getRemoveModeratorsMenuItem(weAreAdmin, isPublic, isKickedFromGroup, conversationId)} {getUpdateGroupNameMenuItem(weAreAdmin, isKickedFromGroup, left, conversationId)} {getLeaveGroupMenuItem(isKickedFromGroup, left, isGroup, isPublic, conversationId)} {/* TODO: add delete group */} diff --git a/ts/components/session/menu/Menu.tsx b/ts/components/session/menu/Menu.tsx index 484ba5f8ba..23f92ee091 100644 --- a/ts/components/session/menu/Menu.tsx +++ b/ts/components/session/menu/Menu.tsx @@ -79,12 +79,20 @@ function showDeleteContact( return (!isMe && !isGroup) || (isGroup && (isGroupLeft || isKickedFromGroup || isPublic)); } -function showAddModerators(isAdmin: boolean, isKickedFromGroup: boolean): boolean { - return !isKickedFromGroup && isAdmin; +function showAddModerators( + isAdmin: boolean, + isPublic: boolean, + isKickedFromGroup: boolean +): boolean { + return !isKickedFromGroup && isAdmin && isPublic; } -function showRemoveModerators(isAdmin: boolean, isKickedFromGroup: boolean): boolean { - return !isKickedFromGroup && isAdmin; +function showRemoveModerators( + isAdmin: boolean, + isPublic: boolean, + isKickedFromGroup: boolean +): boolean { + return !isKickedFromGroup && isAdmin && isPublic; } function showUpdateGroupName(isAdmin: boolean, isKickedFromGroup: boolean, left: boolean): boolean { @@ -252,10 +260,11 @@ export function getUpdateGroupNameMenuItem( export function getRemoveModeratorsMenuItem( isAdmin: boolean | undefined, + isPublic: boolean | undefined, isKickedFromGroup: boolean | undefined, conversationId: string ): JSX.Element | null { - if (showRemoveModerators(Boolean(isAdmin), Boolean(isKickedFromGroup))) { + if (showRemoveModerators(Boolean(isAdmin), Boolean(isPublic), Boolean(isKickedFromGroup))) { return ( { @@ -271,10 +280,11 @@ export function getRemoveModeratorsMenuItem( export function getAddModeratorsMenuItem( isAdmin: boolean | undefined, + isPublic: boolean | undefined, isKickedFromGroup: boolean | undefined, conversationId: string ): JSX.Element | null { - if (showAddModerators(Boolean(isAdmin), Boolean(isKickedFromGroup))) { + if (showAddModerators(Boolean(isAdmin), Boolean(isPublic), Boolean(isKickedFromGroup))) { return ( { diff --git a/ts/components/session/registration/RegistrationStages.tsx b/ts/components/session/registration/RegistrationStages.tsx index 4e6152fe0e..92fe085e8c 100644 --- a/ts/components/session/registration/RegistrationStages.tsx +++ b/ts/components/session/registration/RegistrationStages.tsx @@ -2,8 +2,8 @@ import React, { createContext, useEffect, useState } from 'react'; import { PromiseUtils, StringUtils, ToastUtils, UserUtils } from '../../../session/utils'; import { getConversationController } from '../../../session/conversations'; import { createOrUpdateItem, removeAll } from '../../../data/data'; -import { SignUpTab } from './SignUpTab'; -import { SignInTab } from './SignInTab'; +import { SignUpMode, SignUpTab } from './SignUpTab'; +import { SignInMode, SignInTab } from './SignInTab'; import { trigger } from '../../../shims/events'; import { generateMnemonic, @@ -159,14 +159,22 @@ export enum RegistrationPhase { interface RegistrationPhaseContext { registrationPhase: RegistrationPhase; + signUpMode: SignUpMode; + signInMode: SignInMode; setRegistrationPhase: (phase: RegistrationPhase) => void; + setSignInMode: (phase: SignInMode) => void; + setSignUpMode: (phase: SignUpMode) => void; generatedRecoveryPhrase: string; hexGeneratedPubKey: string; } export const RegistrationContext = createContext({ registrationPhase: RegistrationPhase.Start, + signInMode: SignInMode.Default, + signUpMode: SignUpMode.Default, setRegistrationPhase: () => undefined, + setSignUpMode: () => undefined, + setSignInMode: () => undefined, generatedRecoveryPhrase: '', hexGeneratedPubKey: '', }); @@ -175,6 +183,8 @@ export const RegistrationStages = () => { const [generatedRecoveryPhrase, setGeneratedRecoveryPhrase] = useState(''); const [hexGeneratedPubKey, setHexGeneratedPubKey] = useState(''); const [registrationPhase, setRegistrationPhase] = useState(RegistrationPhase.Start); + const [signInMode, setSignInMode] = useState(SignInMode.Default); + const [signUpMode, setSignUpMode] = useState(SignUpMode.Default); useEffect(() => { void generateMnemonicAndKeyPair(); @@ -206,6 +216,10 @@ export const RegistrationStages = () => { ); }; @@ -43,7 +41,6 @@ const RecoveryPhraseInput = (props: { enableShowHide={true} onValueChanged={props.onSeedChanged} onEnterPressed={props.handlePressEnter} - theme={lightTheme} /> ); }; diff --git a/ts/components/session/registration/SignInTab.tsx b/ts/components/session/registration/SignInTab.tsx index 862e783d70..ee33bce292 100644 --- a/ts/components/session/registration/SignInTab.tsx +++ b/ts/components/session/registration/SignInTab.tsx @@ -10,6 +10,7 @@ import { signInWithRecovery, } from './RegistrationStages'; import { RegistrationUserDetails } from './RegistrationUserDetails'; +import { GoBackMainMenuButton } from './SignUpTab'; import { TermsAndConditions } from './TermsAndConditions'; export enum SignInMode { @@ -91,9 +92,8 @@ const SignInButtons = (props: { }; export const SignInTab = () => { - const { setRegistrationPhase } = useContext(RegistrationContext); + const { setRegistrationPhase, signInMode, setSignInMode } = useContext(RegistrationContext); - const [signInMode, setSignInMode] = useState(SignInMode.Default); const [recoveryPhrase, setRecoveryPhrase] = useState(''); const [recoveryPhraseError, setRecoveryPhraseError] = useState(undefined as string | undefined); const [displayName, setDisplayName] = useState(''); @@ -135,24 +135,28 @@ export const SignInTab = () => { return (
{signInMode !== SignInMode.Default && ( - { - const sanitizedName = name.replace(window.displayNameRegex, ''); - const trimName = sanitizedName.trim(); - setDisplayName(sanitizedName); - setDisplayNameError(!trimName ? window.i18n('displayNameEmpty') : undefined); - }} - onSeedChanged={(seed: string) => { - setRecoveryPhrase(seed); - setRecoveryPhraseError(!seed ? window.i18n('recoveryPhraseEmpty') : undefined); - }} - recoveryPhrase={recoveryPhrase} - stealAutoFocus={true} - /> + <> + + + { + const sanitizedName = name.replace(window.displayNameRegex, ''); + const trimName = sanitizedName.trim(); + setDisplayName(sanitizedName); + setDisplayNameError(!trimName ? window.i18n('displayNameEmpty') : undefined); + }} + onSeedChanged={(seed: string) => { + setRecoveryPhrase(seed); + setRecoveryPhraseError(!seed ? window.i18n('recoveryPhraseEmpty') : undefined); + }} + recoveryPhrase={recoveryPhrase} + stealAutoFocus={true} + /> + )} void }) => { ); }; +export const GoBackMainMenuButton = () => { + const { setRegistrationPhase, setSignInMode, setSignUpMode } = useContext(RegistrationContext); + return ( + { + setRegistrationPhase(RegistrationPhase.Start); + setSignInMode(SignInMode.Default); + setSignUpMode(SignUpMode.Default); + }} + /> + ); +}; + const SignUpSessionIDShown = (props: { continueSignUp: () => void }) => { return (
-
- {window.i18n('yourUniqueSessionID')} -
+ + + +
+ {window.i18n('yourUniqueSessionID')} +
+
{window.i18n('signupSessionIDBlurb')}
@@ -56,11 +79,13 @@ const SignUpSessionIDShown = (props: { continueSignUp: () => void }) => { }; export const SignUpTab = () => { - const { setRegistrationPhase, generatedRecoveryPhrase, hexGeneratedPubKey } = useContext( - RegistrationContext - ); - - const [signUpMode, setSignUpMode] = useState(SignUpMode.Default); + const { + signUpMode, + setRegistrationPhase, + generatedRecoveryPhrase, + hexGeneratedPubKey, + setSignUpMode, + } = useContext(RegistrationContext); const [displayName, setDisplayName] = useState(''); const [displayNameError, setDisplayNameError] = useState(''); @@ -106,10 +131,12 @@ export const SignUpTab = () => { return (
-
- {window.i18n('welcomeToYourSession')} -
- + + + + {window.i18n('welcomeToYourSession')} + + void; - type: TabType; -}) => { - const handleClick = onSelect - ? () => { - onSelect(type); - } - : undefined; - - const label = type === TabType.SignUp ? window.i18n('createAccount') : window.i18n('signIn'); - - return ( -
- {label} -
- ); -}; diff --git a/ts/components/session/settings/SessionSettings.tsx b/ts/components/session/settings/SessionSettings.tsx index 5d37087e8c..92a9196ef0 100644 --- a/ts/components/session/settings/SessionSettings.tsx +++ b/ts/components/session/settings/SessionSettings.tsx @@ -15,13 +15,12 @@ import { hasLinkPreviewPopupBeenDisplayed, } from '../../../../ts/data/data'; import { shell } from 'electron'; -import { SessionConfirmDialogProps } from '../../dialog/SessionConfirm'; import { mapDispatchToProps } from '../../../state/actions'; import { unblockConvoById } from '../../../interactions/conversationInteractions'; import { toggleAudioAutoplay } from '../../../state/ducks/userConfig'; import { sessionPassword, updateConfirmModal } from '../../../state/ducks/modalDialog'; import { PasswordAction } from '../../dialog/SessionPasswordDialog'; -import { SessionIconButton, SessionIconSize, SessionIconType } from '../icon'; +import { SessionIconButton } from '../icon'; import { ToastUtils } from '../../../session/utils'; export enum SessionSettingCategory { @@ -54,10 +53,6 @@ interface State { shouldLockSettings: boolean | null; } -interface ConfirmationDialogParams extends SessionConfirmDialogProps { - shouldShowConfirm: boolean | undefined; -} - interface LocalSettingType { category: SessionSettingCategory; description: string | undefined; @@ -70,7 +65,6 @@ interface LocalSettingType { type: SessionSettingType | undefined; setFn: any; onClick: any; - confirmationDialogParams: ConfirmationDialogParams | undefined; } class SettingsViewInner extends React.Component { @@ -162,7 +156,6 @@ class SettingsViewInner extends React.Component { onClick={onClickFn} onSliderChange={sliderFn} content={content} - confirmationDialogParams={setting.confirmationDialogParams} /> )}
@@ -257,11 +250,7 @@ class SettingsViewInner extends React.Component {
v{window.versionInfo.version} - + {window.versionInfo.commitHash}
@@ -335,7 +324,6 @@ class SettingsViewInner extends React.Component { content: { defaultValue: true }, comparisonValue: undefined, onClick: undefined, - confirmationDialogParams: undefined, }, { id: 'spell-check', @@ -348,7 +336,6 @@ class SettingsViewInner extends React.Component { content: { defaultValue: true }, comparisonValue: undefined, onClick: undefined, - confirmationDialogParams: undefined, }, { id: 'link-preview-setting', @@ -376,7 +363,6 @@ class SettingsViewInner extends React.Component { content: undefined, comparisonValue: undefined, onClick: undefined, - confirmationDialogParams: undefined, }, { @@ -403,7 +389,6 @@ class SettingsViewInner extends React.Component { content: undefined, comparisonValue: undefined, onClick: undefined, - confirmationDialogParams: undefined, }, { id: 'audio-message-autoplay-setting', @@ -420,7 +405,6 @@ class SettingsViewInner extends React.Component { }, comparisonValue: undefined, onClick: undefined, - confirmationDialogParams: undefined, }, { @@ -459,7 +443,6 @@ class SettingsViewInner extends React.Component { ], }, }, - confirmationDialogParams: undefined, }, { id: 'zoom-factor-setting', @@ -479,7 +462,6 @@ class SettingsViewInner extends React.Component { defaultValue: 100, info: (value: number) => `${value}%`, }, - confirmationDialogParams: undefined, }, { id: 'help-translation', @@ -497,7 +479,6 @@ class SettingsViewInner extends React.Component { buttonText: window.i18n('helpUsTranslateSession'), buttonColor: SessionButtonColor.Primary, }, - confirmationDialogParams: undefined, }, { id: 'media-permissions', @@ -510,7 +491,6 @@ class SettingsViewInner extends React.Component { content: undefined, comparisonValue: undefined, onClick: undefined, - confirmationDialogParams: undefined, }, { id: 'read-receipt-setting', @@ -523,7 +503,6 @@ class SettingsViewInner extends React.Component { comparisonValue: undefined, onClick: undefined, content: {}, - confirmationDialogParams: undefined, }, { id: 'typing-indicators-setting', @@ -536,7 +515,6 @@ class SettingsViewInner extends React.Component { comparisonValue: undefined, onClick: undefined, content: {}, - confirmationDialogParams: undefined, }, { id: 'auto-update', @@ -549,7 +527,6 @@ class SettingsViewInner extends React.Component { comparisonValue: undefined, onClick: undefined, content: {}, - confirmationDialogParams: undefined, }, { id: 'set-password', @@ -567,7 +544,6 @@ class SettingsViewInner extends React.Component { onClick: () => { this.displayPasswordModal('set'); }, - confirmationDialogParams: undefined, }, { id: 'change-password', @@ -585,7 +561,6 @@ class SettingsViewInner extends React.Component { onClick: () => { this.displayPasswordModal('change'); }, - confirmationDialogParams: undefined, }, { id: 'remove-password', @@ -603,7 +578,6 @@ class SettingsViewInner extends React.Component { onClick: () => { this.displayPasswordModal('remove'); }, - confirmationDialogParams: undefined, }, ]; } @@ -651,7 +625,6 @@ class SettingsViewInner extends React.Component { }, hidden: false, onClick: undefined, - confirmationDialogParams: undefined, }); } @@ -668,7 +641,6 @@ class SettingsViewInner extends React.Component { setFn: undefined, hidden: false, onClick: undefined, - confirmationDialogParams: undefined, }, ]; } diff --git a/ts/hooks/useEncryptedFileFetch.ts b/ts/hooks/useEncryptedFileFetch.ts index 0742525a41..b71f511681 100644 --- a/ts/hooks/useEncryptedFileFetch.ts +++ b/ts/hooks/useEncryptedFileFetch.ts @@ -1,12 +1,15 @@ import { useEffect, useRef, useState } from 'react'; -import { getDecryptedMediaUrl } from '../session/crypto/DecryptedAttachmentsManager'; +import { + getAlreadyDecryptedMediaUrl, + getDecryptedMediaUrl, +} from '../session/crypto/DecryptedAttachmentsManager'; import { perfEnd, perfStart } from '../session/utils/Performance'; export const useEncryptedFileFetch = (url: string, contentType: string) => { // tslint:disable-next-line: no-bitwise const [urlToLoad, setUrlToLoad] = useState(''); - const [loading, setLoading] = useState(true); + const [loading, setLoading] = useState(false); const mountedRef = useRef(true); @@ -22,8 +25,12 @@ export const useEncryptedFileFetch = (url: string, contentType: string) => { setLoading(false); } } + const alreadyDecrypted = getAlreadyDecryptedMediaUrl(url); useEffect(() => { + if (alreadyDecrypted) { + return; + } setLoading(true); mountedRef.current = true; void fetchUrl(); @@ -32,5 +39,9 @@ export const useEncryptedFileFetch = (url: string, contentType: string) => { mountedRef.current = false; }; }, [url]); + + if (alreadyDecrypted) { + return { urlToLoad: alreadyDecrypted, loading: false }; + } return { urlToLoad, loading }; }; diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index c4b25c26f2..021e3c7197 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -202,9 +202,11 @@ export class ConversationModel extends Backbone.Model { this.throttledBumpTyping = _.throttle(this.bumpTyping, 300); this.updateLastMessage = _.throttle(this.bouncyUpdateLastMessage.bind(this), 1000, { trailing: true, + leading: true, }); this.triggerUIRefresh = _.throttle(this.triggerUIRefresh, 1000, { trailing: true, + leading: true, }); this.throttledNotify = _.debounce(this.notify, 500, { maxWait: 5000, trailing: true }); //start right away the function is called, and wait 1sec before calling it again @@ -934,7 +936,8 @@ export class ConversationModel extends Backbone.Model { public async addSingleMessage(messageAttributes: MessageAttributesOptionals, setToExpire = true) { const model = new MessageModel(messageAttributes); - const messageId = await model.commit(); + // no need to trigger a UI update now, we trigger a messageAdded just below + const messageId = await model.commit(false); model.set({ id: messageId }); if (setToExpire) { diff --git a/ts/models/message.ts b/ts/models/message.ts index e2a9783dee..64f9f7d032 100644 --- a/ts/models/message.ts +++ b/ts/models/message.ts @@ -1011,14 +1011,16 @@ export class MessageModel extends Backbone.Model { await this.commit(); } - public async commit() { + public async commit(triggerUIUpdate = true) { if (!this.attributes.id) { throw new Error('A message always needs an id'); } perfStart(`messageCommit-${this.attributes.id}`); const id = await saveMessage(this.attributes); - this.dispatchMessageUpdate(); + if (triggerUIUpdate) { + this.dispatchMessageUpdate(); + } perfEnd(`messageCommit-${this.attributes.id}`, 'messageCommit'); return id; @@ -1027,6 +1029,9 @@ export class MessageModel extends Backbone.Model { public async markRead(readAt: number) { this.markReadNoCommit(readAt); await this.commit(); + // the line below makes sure that getNextExpiringMessage will find this message as expiring. + // getNextExpiringMessage is used on app start to clean already expired messages which should have been removed already, but are not + await this.setToExpire(); const convo = this.getConversation(); if (convo) { diff --git a/ts/receiver/queuedJob.ts b/ts/receiver/queuedJob.ts index 62ed2239f7..0035522dec 100644 --- a/ts/receiver/queuedJob.ts +++ b/ts/receiver/queuedJob.ts @@ -384,7 +384,9 @@ export async function handleMessageJob( source: string ) { window?.log?.info( - `Starting handleDataMessage for message ${message.idForLogging()} in conversation ${conversation.idForLogging()}` + `Starting handleDataMessage for message ${message.idForLogging()}, ${message.get( + 'serverTimestamp' + ) || message.get('timestamp')} in conversation ${conversation.idForLogging()}` ); try { diff --git a/ts/session/crypto/DecryptedAttachmentsManager.ts b/ts/session/crypto/DecryptedAttachmentsManager.ts index 833a471c5e..5e578d291e 100644 --- a/ts/session/crypto/DecryptedAttachmentsManager.ts +++ b/ts/session/crypto/DecryptedAttachmentsManager.ts @@ -105,3 +105,25 @@ export const getDecryptedMediaUrl = async (url: string, contentType: string): Pr return url; } }; + +/** + * + * Returns the already decrypted URL or null + */ +export const getAlreadyDecryptedMediaUrl = (url: string): string | null => { + if (!url) { + return null; + } + if (url.startsWith('blob:')) { + return url; + } else if ( + window.Signal.Migrations.attachmentsPath && + url.startsWith(window.Signal.Migrations.attachmentsPath) + ) { + if (urlToDecryptedBlobMap.has(url)) { + const existingObjUrl = urlToDecryptedBlobMap.get(url)?.decrypted as string; + return existingObjUrl; + } + } + return null; +}; diff --git a/ts/session/utils/Toast.tsx b/ts/session/utils/Toast.tsx index e5cd4d56ef..80efe120e7 100644 --- a/ts/session/utils/Toast.tsx +++ b/ts/session/utils/Toast.tsx @@ -172,7 +172,7 @@ export function pushYouLeftTheGroup() { } export function pushDeleted() { - pushToastSuccess('deleted', window.i18n('deleted'), undefined, SessionIconType.Check); + pushToastSuccess('deleted', window.i18n('deleted'), undefined, 'check'); } export function pushCannotRemoveCreatorFromGroup() { diff --git a/ts/state/ducks/SessionTheme.tsx b/ts/state/ducks/SessionTheme.tsx index c36f401371..52999b0838 100644 --- a/ts/state/ducks/SessionTheme.tsx +++ b/ts/state/ducks/SessionTheme.tsx @@ -1,8 +1,6 @@ import React from 'react'; -// tslint:disable-next-line: no-import-side-effect no-submodule-imports -// import 'reset-css/reset.css'; -import { DefaultTheme, ThemeProvider } from 'styled-components'; +import { createGlobalStyle } from 'styled-components'; const white = '#ffffff'; const black = '#000000'; @@ -12,166 +10,346 @@ const accentLightTheme = '#00e97b'; const accentDarkTheme = '#00f782'; const borderLightThemeColor = '#f1f1f1'; const borderDarkThemeColor = '#ffffff0F'; -const borderHighContrastLightTheme = '#afafaf'; -const borderHighContrastDarkTheme = '#484848'; - -// const borderAvatarColor = '#00000059'; -// const borderLightTheme = '#f1f1f1'; -// const borderDarkTheme = '#ffffff0F'; - -const common = { - fonts: { - sessionFontDefault: 'Roboto', - sessionFontAccent: 'Loor', - sessionFontMono: 'SpaceMono', - xs: '11px', - sm: '13px', - md: '15px', - lg: '18px', - xl: '24px', - }, - margins: { - xs: '5px', - sm: '10px', - md: '15px', - lg: '20px', - }, - animations: { - defaultDuration: '0.25s', - }, -}; -export const lightTheme: DefaultTheme = { - common, - colors: { - accent: accentLightTheme, - accentButton: black, - warning: warning, - destructive: destructive, - cellBackground: '#fcfcfc', - modalBackground: '#fcfcfc', - fakeChatBubbleBackground: '#f5f5f5', - // input - inputBackground: '#8E8E93331F', - // text - textColor: black, - textColorSubtle: `${black}99`, - textColorSubtleNoOpacity: '#52514f', - textColorOpposite: white, - textHighlight: `${black}33`, - textAccent: '#00c769', - // inbox - inboxBackground: white, - // buttons - backgroundPrimary: '#272726', - foregroundPrimary: white, - buttonGreen: '#272726', - // conversation view - composeViewBackground: '#fcfcfc', - composeViewTextFieldBackground: '#ededed', - receivedMessageBackground: '#f5f5f5', - sentMessageBackground: accentLightTheme, - receivedMessageText: black, - sentMessageText: white, - sessionShadow: `0 0 4px 0 ${black}5E`, - sessionShadowColor: `${black}5E`, - // left pane - conversationList: white, - conversationItemHasUnread: '#fcfcfc', - conversationItemSelected: '#f0f0f0', - clickableHovered: '#dfdfdf', - sessionBorder: `1px solid ${borderLightThemeColor}`, - sessionBorderColor: borderLightThemeColor, - sessionBorderHighContrast: `1px solid ${borderHighContrastLightTheme}`, - sessionUnreadBorder: `4px solid ${accentLightTheme}`, - leftpaneOverlayBackground: white, - recoveryPhraseBannerBackground: white, - // scrollbars - scrollBarTrack: '#fcfcfc', - scrollBarThumb: '#474646', - // pill divider: - pillDividerColor: `${black}1A`, - pillDividerTextColor: '#555555', - // context menu - contextMenuBackground: '#f5f5f5', - filterSessionText: 'brightness(0) saturate(100%)', - lastSeenIndicatorColor: '#62656a', - lastSeenIndicatorTextColor: '#070c14', - quoteBottomBarBackground: '#f0f0f0', - }, +// DARK COLORS +const darkColorAccent = accentDarkTheme; +const darkColorAccentButton = accentDarkTheme; +const darkColorText = white; +const darkColorTextOpposite = black; + +const darkColorTextSubtle = `${white}99`; +const darkColorTextAccent = accentDarkTheme; +const darkColorSessionShadow = `0 0 4px 0 ${white}33`; +const darkColorComposeViewBg = '#232323'; +const darkColorSentMessageBg = accentDarkTheme; +const darkColorSentMessageText = black; +const darkColorClickableHovered = '#414347'; +const darkColorSessionBorder = `1px solid ${borderDarkThemeColor}`; +const darkColorSessionBorderColor = borderDarkThemeColor; +const darkColorRecoveryPhraseBannerBg = '#1f1f1f'; +const darkColorPillDivider = '#353535'; +const darkColorLastSeenIndicator = '#353535'; +const darkColorLastSeenIndicatorText = '#a8a9aa'; +const darkColorQuoteBottomBarBg = '#404040'; +const darkColorCellBackground = '#1b1b1b'; +const darkColorReceivedMessageBg = '#2d2d2d'; +const darkColorReceivedMessageText = white; + +const darkColorPillDividerText = '#a0a0a0'; +const darkInputBackground = darkColorCellBackground; +const darkFilterSessionText = 'none'; +const darkUnreadBorder = `4px solid ${accentDarkTheme}`; + +const darkScrollbarThumb = '#474646'; +const darkScrollbarTrack = '#1b1b1b'; +const darkFakeChatBubbleBg = '#212121'; + +const darkInboxBackground = '#171717'; +const darkLeftPaneOverlayBg = darkInboxBackground; +const darkConversationItemSelected = '#404040'; +const darkConversationItemHasUnread = '#2c2c2c'; +const darkConversationList = '#1b1b1b'; + +const darkTextHighlight = accentDarkTheme; +const darkForegroundPrimary = white; +const darkBackgroundPrimary = '#474646'; +const darkButtonGreen = accentDarkTheme; +const darkModalBackground = '#101011'; + +export const switchHtmlToDarkTheme = () => { + document.documentElement.style.setProperty('--color-accent', darkColorAccent); + document.documentElement.style.setProperty('--color-accent-button', darkColorAccentButton); + document.documentElement.style.setProperty('--color-text', darkColorText); + document.documentElement.style.setProperty('--color-text-subtle', darkColorTextSubtle); + document.documentElement.style.setProperty('--color-text-accent', darkColorTextAccent); + document.documentElement.style.setProperty('--color-text-opposite', darkColorTextOpposite); + document.documentElement.style.setProperty('--color-session-shadow', darkColorSessionShadow); + document.documentElement.style.setProperty( + '--color-compose-view-button-background', + darkColorComposeViewBg + ); + document.documentElement.style.setProperty( + '--color-sent-message-background', + darkColorSentMessageBg + ); + document.documentElement.style.setProperty('--color-sent-message-text', darkColorSentMessageText); + document.documentElement.style.setProperty( + '--color-clickable-hovered', + darkColorClickableHovered + ); + document.documentElement.style.setProperty('--color-session-border', darkColorSessionBorder); + document.documentElement.style.setProperty('--color-session-border', darkColorSessionBorderColor); + document.documentElement.style.setProperty( + '--color-recovery-phrase-banner-background', + darkColorRecoveryPhraseBannerBg + ); + document.documentElement.style.setProperty('--color-pill-divider', darkColorPillDivider); + document.documentElement.style.setProperty( + '--color-last-seen-indicator', + darkColorLastSeenIndicator + ); + document.documentElement.style.setProperty( + '--color-last-seen-indicator-text', + darkColorLastSeenIndicatorText + ); + document.documentElement.style.setProperty( + '--color-quote-bottom-bar-background', + darkColorQuoteBottomBarBg + ); + document.documentElement.style.setProperty('--color-cell-background', darkColorCellBackground); + document.documentElement.style.setProperty( + '--color-received-message-text', + darkColorReceivedMessageText + ); + document.documentElement.style.setProperty( + '--color-received-message-background', + darkColorReceivedMessageBg + ); + document.documentElement.style.setProperty('--color-pill-divider-text', darkColorPillDividerText); + document.documentElement.style.setProperty('--color-input-background', darkInputBackground); + + document.documentElement.style.setProperty('--filter-session-text', darkFilterSessionText); + document.documentElement.style.setProperty('--border-unread', darkUnreadBorder); + + document.documentElement.style.setProperty('--color-scroll-bar-thumb', darkScrollbarThumb); + document.documentElement.style.setProperty('--color-scroll-bar-track', darkScrollbarTrack); + document.documentElement.style.setProperty( + '--color-fake-chat-bubble-background', + darkFakeChatBubbleBg + ); + document.documentElement.style.setProperty('--color-inbox-background', darkInboxBackground); + document.documentElement.style.setProperty( + '--color-left-pane-overlay-background', + darkLeftPaneOverlayBg + ); + document.documentElement.style.setProperty( + '--color-conversation-item-selected', + darkConversationItemSelected + ); + document.documentElement.style.setProperty( + '--color-conversation-item-has-unread', + darkConversationItemHasUnread + ); + document.documentElement.style.setProperty('--color-conversation-list', darkConversationList); + + document.documentElement.style.setProperty('--color-text-highlight', darkTextHighlight); + document.documentElement.style.setProperty('--color-foreground-primary', darkForegroundPrimary); + document.documentElement.style.setProperty('--color-background-primary', darkBackgroundPrimary); + document.documentElement.style.setProperty('--color-button-green', darkButtonGreen); + document.documentElement.style.setProperty('--color-modal-background', darkModalBackground); + document.documentElement.style.setProperty('--border-session', darkColorSessionBorder); }; -export const darkTheme = { - common, - colors: { - accent: accentDarkTheme, - accentButton: accentDarkTheme, - warning: warning, - destructive: destructive, - cellBackground: '#1b1b1b', - modalBackground: '#101011', - fakeChatBubbleBackground: '#212121', - // input - inputBackground: '#8e8e931F', - // text - textColor: white, - textColorSubtle: `${white}99`, - textColorSubtleNoOpacity: '#7f7d7d', - textColorOpposite: black, - textHighlight: `${accentDarkTheme}99`, - textAccent: accentDarkTheme, - // inbox - inboxBackground: 'linear-gradient(180deg, #171717 0%, #121212 100%)', - // buttons - backgroundPrimary: '#474646', - foregroundPrimary: white, - buttonGreen: accentDarkTheme, - // conversation view - composeViewBackground: '#1b1b1b', - composeViewTextFieldBackground: '#141414', - receivedMessageBackground: '#222325', - sentMessageBackground: accentDarkTheme, - receivedMessageText: white, - sentMessageText: black, - sessionShadow: `0 0 4px 0 ${white}33`, - sessionShadowColor: `${white}33`, - // left pane - conversationList: '#1b1b1b', - conversationItemHasUnread: '#2c2c2c', - conversationItemSelected: '#404040', - clickableHovered: '#414347', - sessionBorder: `1px solid ${borderDarkThemeColor}`, - sessionBorderColor: borderDarkThemeColor, - sessionBorderHighContrast: `1px solid ${borderHighContrastDarkTheme}`, - sessionUnreadBorder: `4px solid ${accentDarkTheme}`, - leftpaneOverlayBackground: 'linear-gradient(180deg, #171717 0%, #121212 100%)', - recoveryPhraseBannerBackground: '#1f1f1f', - // scrollbars - scrollBarTrack: '#1b1b1b', - scrollBarThumb: '#474646', - // pill divider: - pillDividerColor: '#353535', - pillDividerTextColor: '#a0a0a0', - // context menu - contextMenuBackground: '#212121', - filterSessionText: 'none', - lastSeenIndicatorColor: '#353535', - lastSeenIndicatorTextColor: '#a8a9aa', - quoteBottomBarBackground: '#404040', - }, +// LIGHT COLORS +const lightColorAccent = accentLightTheme; +const lightColorAccentButton = black; +const lightColorText = black; +const lightColorTextOpposite = white; +const lightColorTextSubtle = `${black}99`; +const lightColorTextAccent = '#00c769'; +const lightColorSessionShadow = `0 0 4px 0 ${black}5E`; +const lightColorComposeViewBg = '#efefef'; +const lightColorSentMessageBg = accentLightTheme; +const lightColorSentMessageText = white; +const lightColorClickableHovered = '#dfdfdf'; +const lightColorSessionBorderColor = borderLightThemeColor; +const lightColorSessionBorder = `1px solid ${lightColorSessionBorderColor}`; +const lightColorRecoveryPhraseBannerBg = white; +const lightColorPillDivider = `${black}1A`; +const lightColorLastSeenIndicator = '#62656a'; +const lightColorLastSeenIndicatorText = '#070c14'; +const lightColorQuoteBottomBarBg = '#f0f0f0'; +const lightColorCellBackground = '#f9f9f9'; +const lightColorReceivedMessageBg = '#f5f5f5'; +const lightColorReceivedMessageText = black; + +const lightColorPillDividerText = '#555555'; + +const lightInputBackground = '#efefef'; +const lightFilterSessionText = 'brightness(0) saturate(100%)'; +const lightUnreadBorder = `4px solid ${accentLightTheme}`; + +const lightScrollbarThumb = '#474646'; +const lightScrollbarTrack = '#fcfcfc'; +const lightFakeChatBubbleBg = '#f5f5f5'; + +const lightInboxBackground = white; +const lightLeftPaneOverlayBg = lightInboxBackground; +const lightConversationItemSelected = '#f0f0f0'; +const lightConversationItemHasUnread = '#fcfcfc'; +const lightConversationList = '#f9f9f9'; + +const lightTextHighlight = accentLightTheme; +const lightForegroundPrimary = white; +const lightBackgroundPrimary = '#272726'; +const lightButtonGreen = '#272726'; +const lightModalBackground = '#fcfcfc'; + +export const switchHtmlToLightTheme = () => { + document.documentElement.style.setProperty('--color-accent', lightColorAccent); + document.documentElement.style.setProperty('--color-accent-button', lightColorAccentButton); + document.documentElement.style.setProperty('--color-text', lightColorText); + document.documentElement.style.setProperty('--color-text-subtle', lightColorTextSubtle); + document.documentElement.style.setProperty('--color-text-accent', lightColorTextAccent); + document.documentElement.style.setProperty('--color-text-opposite', lightColorTextOpposite); + + document.documentElement.style.setProperty('--color-session-shadow', lightColorSessionShadow); + document.documentElement.style.setProperty( + '--color-compose-view-button-background', + lightColorComposeViewBg + ); + document.documentElement.style.setProperty( + '--color-sent-message-background', + lightColorSentMessageBg + ); + document.documentElement.style.setProperty( + '--color-sent-message-text', + lightColorSentMessageText + ); + document.documentElement.style.setProperty( + '--color-clickable-hovered', + lightColorClickableHovered + ); + document.documentElement.style.setProperty('--color-session-border', lightColorSessionBorder); + document.documentElement.style.setProperty( + '--color-session-border', + lightColorSessionBorderColor + ); + document.documentElement.style.setProperty( + '--color-recovery-phrase-banner-background', + lightColorRecoveryPhraseBannerBg + ); + document.documentElement.style.setProperty('--color-pill-divider', lightColorPillDivider); + document.documentElement.style.setProperty( + '--color-last-seen-indicator', + lightColorLastSeenIndicator + ); + document.documentElement.style.setProperty( + '--color-last-seen-indicator-text', + lightColorLastSeenIndicatorText + ); + document.documentElement.style.setProperty( + '--color-quote-bottom-bar-background', + lightColorQuoteBottomBarBg + ); + document.documentElement.style.setProperty('--color-cell-background', lightColorCellBackground); + document.documentElement.style.setProperty( + '--color-received-message-text', + lightColorReceivedMessageText + ); + document.documentElement.style.setProperty( + '--color-received-message-background', + lightColorReceivedMessageBg + ); + document.documentElement.style.setProperty( + '--color-pill-divider-text', + lightColorPillDividerText + ); + document.documentElement.style.setProperty('--color-input-background', lightInputBackground); + document.documentElement.style.setProperty('--filter-session-text', lightFilterSessionText); + document.documentElement.style.setProperty('--border-unread', lightUnreadBorder); + + document.documentElement.style.setProperty('--color-scroll-bar-thumb', lightScrollbarThumb); + document.documentElement.style.setProperty('--color-scroll-bar-track', lightScrollbarTrack); + document.documentElement.style.setProperty( + '--color-fake-chat-bubble-background', + lightFakeChatBubbleBg + ); + document.documentElement.style.setProperty('--color-inbox-background', lightInboxBackground); + document.documentElement.style.setProperty( + '--color-left-pane-overlay-background', + lightLeftPaneOverlayBg + ); + document.documentElement.style.setProperty( + '--color-conversation-item-selected', + lightConversationItemSelected + ); + document.documentElement.style.setProperty( + '--color-conversation-item-has-unread', + lightConversationItemHasUnread + ); + document.documentElement.style.setProperty('--color-conversation-list', lightConversationList); + + document.documentElement.style.setProperty('--color-text-highlight', lightTextHighlight); + document.documentElement.style.setProperty('--color-foreground-primary', lightForegroundPrimary); + document.documentElement.style.setProperty('--color-background-primary', lightBackgroundPrimary); + document.documentElement.style.setProperty('--color-button-green', lightButtonGreen); + document.documentElement.style.setProperty('--color-modal-background', lightModalBackground); + document.documentElement.style.setProperty('--border-session', lightColorSessionBorder); }; -export const inversedTheme = (theme: DefaultTheme): DefaultTheme => { - return { - colors: { - ...theme.colors, - textColor: theme.colors.textColorOpposite, - textColorOpposite: theme.colors.textColor, - }, - common: theme.common, +// default to light theme +export const SessionGlobalStyles = createGlobalStyle` + html { + /* FONTS */ + --font-default: 'Roboto'; + --font-font-accent: 'Loor'; + --font-font-mono: 'SpaceMono'; + --font-size-xs: 11px; + --font-size-sm: 13px; + --font-size-md: 15px; + + /* MARGINS */ + --margins-xs: 5px; + --margins-sm: 10px; + --margins-md: 15px; + --margins-lg: 20px; + + /* ANIMATIONS */ + --default-duration: '0.25s'; + /* FILTERS */ + --filter-session-text: ${lightFilterSessionText}; + /* BORDERS */ + --border-unread: ${lightUnreadBorder}; + --border-session: ${lightColorSessionBorder}; + + /* COLORS NOT CHANGING BETWEEN THEMES */ + --color-warning: ${warning}; + --color-destructive: ${destructive}; + /* COLORS */ + --color-accent: ${lightColorAccent}; + --color-accent-button: ${lightColorAccentButton}; + + --color-text: ${lightColorText}; + --color-text-subtle: ${lightColorTextSubtle}; + --color-text-accent: ${lightColorTextAccent}; + --color-text-opposite: ${lightColorTextOpposite}; + + --color-session-shadow: ${lightColorSessionShadow}; + --color-compose-view-button-background: ${lightColorComposeViewBg}; + --color-sent-message-background: ${lightColorSentMessageBg}; + --color-sent-message-text: ${lightColorSentMessageText}; + --color-clickable-hovered: ${lightColorClickableHovered}; + --color-session-border: ${lightColorSessionBorderColor}; + --color-recovery-phrase-banner-background: ${lightColorRecoveryPhraseBannerBg}; + --color-pill-divider: ${lightColorPillDivider}; + --color-last-seen-indicator: ${lightColorLastSeenIndicator}; + --color-last-seen-indicator-text: ${lightColorLastSeenIndicatorText}; + --color-quote-bottom-bar-background: ${lightColorQuoteBottomBarBg}; + --color-cell-background: ${lightColorCellBackground}; + --color-pill-divider-text: ${lightColorPillDividerText}; + --color-input-background: ${lightInputBackground}; + --color-scroll-bar-thumb: ${lightScrollbarThumb}; + --color-scroll-bar-track: ${lightScrollbarTrack}; + --color-fake-chat-bubble-background: ${lightFakeChatBubbleBg}; + --color-inbox-background: ${lightInboxBackground}; + --color-left-pane-overlay-background: ${lightLeftPaneOverlayBg}; + --color-conversation-item-selected: ${lightConversationItemSelected}; + --color-conversation-item-has-unread: ${lightConversationItemHasUnread}; + --color-conversation-list: ${lightConversationList}; + --color-text-highlight: ${lightTextHighlight}; + --color-foreground-primary: ${lightForegroundPrimary}; + --color-background-primary: ${lightBackgroundPrimary}; + --color-button-green: ${lightButtonGreen}; + --color-modal-background: ${lightModalBackground}; + + }; -}; +`; -export const SessionTheme = ({ children, theme }: { children: any; theme: DefaultTheme }) => ( - {children} +export const SessionTheme = ({ children }: { children: any }) => ( + <> + + {children} + ); diff --git a/ts/state/ducks/conversations.ts b/ts/state/ducks/conversations.ts index 170f9ebd76..de19e15137 100644 --- a/ts/state/ducks/conversations.ts +++ b/ts/state/ducks/conversations.ts @@ -663,6 +663,7 @@ const conversationsSlice = createSlice({ // keep the unread visible just like in other apps. It will be shown until the user changes convo return { ...state, + firstUnreadMessageId: undefined, }; }, diff --git a/ts/state/ducks/theme.tsx b/ts/state/ducks/theme.tsx index c7455e308b..00b9c1edf1 100644 --- a/ts/state/ducks/theme.tsx +++ b/ts/state/ducks/theme.tsx @@ -1,15 +1,14 @@ export const APPLY_THEME = 'APPLY_THEME'; -export type ThemeStateType = typeof lightTheme; +export type ThemeStateType = 'light' | 'dark'; export const applyTheme = (theme: ThemeStateType) => { return { type: APPLY_THEME, payload: theme, }; }; -import { lightTheme } from './SessionTheme'; -export const initialThemeState = lightTheme; +export const initialThemeState: ThemeStateType = 'light'; export const reducer = ( state: any = initialThemeState, diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts index 66c81b52c3..61fe507a3f 100644 --- a/ts/state/selectors/conversations.ts +++ b/ts/state/selectors/conversations.ts @@ -146,9 +146,10 @@ export type MessagePropsType = | 'unread-indicator'; export const getSortedMessagesTypesOfSelectedConversation = createSelector( - getMessagesOfSelectedConversation, + getSortedMessagesOfSelectedConversation, getFirstUnreadMessageId, (sortedMessages, firstUnreadId) => { + const maxMessagesBetweenTwoDateBreaks = 5; // we want to show the date break if there is a large jump in time // remember that messages are sorted from the most recent to the oldest return sortedMessages.map((msg, index) => { @@ -159,9 +160,11 @@ export const getSortedMessagesTypesOfSelectedConversation = createSelector( ? 0 : sortedMessages[index + 1].propsForMessage.serverTimestamp || sortedMessages[index + 1].propsForMessage.timestamp; - // more than 10 minutes + const showDateBreak = - messageTimestamp - previousMessageTimestamp > 10 * 60 * 1000 ? messageTimestamp : undefined; + messageTimestamp - previousMessageTimestamp > maxMessagesBetweenTwoDateBreaks * 60 * 1000 + ? messageTimestamp + : undefined; if (msg.propsForDataExtractionNotification) { return { @@ -973,6 +976,7 @@ export const getGenericReadableMessageSelectorProps = createSelector( conversationType, expirationLength, expirationTimestamp, + isExpired, isUnread, receivedAt, isKickedFromGroup, @@ -984,6 +988,8 @@ export const getGenericReadableMessageSelectorProps = createSelector( expirationLength, expirationTimestamp, isUnread, + isExpired, + convoId: props.propsForMessage.convoId, receivedAt, isKickedFromGroup, }; diff --git a/ts/styled.d.ts b/ts/styled.d.ts deleted file mode 100644 index 953f901d38..0000000000 --- a/ts/styled.d.ts +++ /dev/null @@ -1,83 +0,0 @@ -import 'styled-components'; - -declare module 'styled-components' { - export interface DefaultTheme { - common: { - fonts: { - sessionFontDefault: string; - sessionFontAccent: string; - sessionFontMono: string; - xs: string; - sm: string; - md: string; - lg: string; - xl: string; - }; - margins: { - xs: string; - sm: string; - md: string; - lg: string; - }; - animations: { - defaultDuration: string; - }; - }; - colors: { - accent: string; - accentButton: string; - warning: string; - destructive: string; - cellBackground: string; - modalBackground: string; - fakeChatBubbleBackground: string; - // input - inputBackground: string; - // text - textColor: string; - textColorSubtle: string; - textColorSubtleNoOpacity: string; - textColorOpposite: string; - textHighlight: string; - textAccent: string; - // inbox - inboxBackground: string; - // buttons - backgroundPrimary: string; - foregroundPrimary: string; - buttonGreen: string; - // conversation view - composeViewBackground: string; - composeViewTextFieldBackground: string; - receivedMessageBackground: string; - sentMessageBackground: string; - receivedMessageText: string; - sentMessageText: string; - sessionShadow: string; - sessionShadowColor: string; - // left pane - conversationList: string; - conversationItemHasUnread: string; - conversationItemSelected: string; - clickableHovered: string; - sessionBorder: string; - sessionBorderColor: string; - sessionBorderHighContrast: string; - sessionUnreadBorder: string; - leftpaneOverlayBackground: string; - recoveryPhraseBannerBackground: string; - // scrollbars - scrollBarTrack: string; - scrollBarThumb: string; - // pill divider: - pillDividerColor: string; - pillDividerTextColor: string; - // context menu - contextMenuBackground: string; - filterSessionText: string; - lastSeenIndicatorColor: string; - lastSeenIndicatorTextColor: string; - quoteBottomBarBackground: string; - }; - } -} diff --git a/ts/util/timer.ts b/ts/util/timer.ts index 03db356cbc..9e552313c3 100644 --- a/ts/util/timer.ts +++ b/ts/util/timer.ts @@ -16,40 +16,40 @@ export function getIncrement(length: number): number { export function getTimerBucketIcon(expiration: number, length: number): SessionIconType { const delta = expiration - Date.now(); if (delta < 0) { - return SessionIconType.Timer60; + return 'timer60'; } if (delta > length) { - return SessionIconType.Timer00; + return 'timer00'; } const bucket = Math.round((delta / length) * 12); const padded = padStart(String(bucket * 5), 2, '0'); switch (padded) { case '00': - return SessionIconType.Timer00; + return 'timer00'; case '05': - return SessionIconType.Timer05; + return 'timer05'; case '10': - return SessionIconType.Timer10; + return 'timer10'; case '15': - return SessionIconType.Timer15; + return 'timer15'; case '20': - return SessionIconType.Timer20; + return 'timer20'; case '25': - return SessionIconType.Timer25; + return 'timer25'; case '30': - return SessionIconType.Timer30; + return 'timer30'; case '35': - return SessionIconType.Timer35; + return 'timer35'; case '40': - return SessionIconType.Timer40; + return 'timer40'; case '45': - return SessionIconType.Timer45; + return 'timer45'; case '50': - return SessionIconType.Timer50; + return 'timer50'; case '55': - return SessionIconType.Timer55; + return 'timer55'; default: - return SessionIconType.Timer60; + return 'timer60'; } } diff --git a/ts/window.d.ts b/ts/window.d.ts index 7b7e581205..86b3ddda15 100644 --- a/ts/window.d.ts +++ b/ts/window.d.ts @@ -5,10 +5,8 @@ import { LibsignalProtocol } from '../../libtextsecure/libsignal-protocol'; import { SignalInterface } from '../../js/modules/signal'; import { LibTextsecure } from '../libtextsecure'; -import { ConfirmationDialogParams } from '../background'; import { Store } from 'redux'; -import { DefaultTheme } from 'styled-components'; import { ConversationCollection, ConversationModel } from './models/conversation'; import { ConversationType } from './state/ducks/conversations';