Release 1.9.9 (#6924)

* Login with QR UI components (#6790)

* Display QR button on login screen if HS supports

* Create start screen

* Add build flag

* Connect start screen to the login

* QR display screen

* Move `LabelledDividerView` into separate file

* Show display QR screen on button tap

* Add swift concurreny to CameraAccessManager

* Introduce `QRLoginServiceProtocol`

* Use new service in screens

* Introduce scan QR code screen

* Remove hardcoded service availability

* Remove unnecessary import

* Add confirmation screen

* Add loading screen

* Fix ZXingObjc targets

* Add failure screen

* Add strings

* Various UI tweaks, navigation according to the service state

* Fix tests

* Add string for invalid QR error

* Add QR login service mode

* dark mode support almost completed

* 'View all' button in other sessions list

* Changelog

* Only use device type name as fallback for session display name

* Add changelog

* Revert translation changes

* Fix copyright year

* updated the package and added a circle background to the + button

* QR login from device manager (#6818)

* Add link device button into the sessions overview screen

* Run Swift format

* Fix tests

* Fix a crash in tests

* Fix PR remark

* Bring back English string for now to unbreak the build

* pr comment addressed

* Fix composer resizing animations

* Remove prefix from tests

* Add back generated user session name string

* Fixed swiftformat warnings

* Remove current app name from device type name

* updated package version

* QR Login additional flags (#6825)

* Include app name in default session display name

* Add changelog

* edit is displayed in the WYSIWYG, but the send button still sends a new message instead of correcting the edit

* Move composer send media selection to it's own coordinator and us e ioS 15 api for sheet

* fix newline in pod lockfile

* fix newline

* Add labs flag and strings

* Translated using Weblate (Italian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (German)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Icelandic)

Currently translated at 86.0% (1919 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/is/

* Split out models, add some tests and fix some formatting.

* Fixed formatting

* Expose AuthenticationRestClient async login token generation method (MSC3882)

* Only update the nav bar from the top SwiftUI view.

* Bugfix: Element freezes after searching in a room #6762

* Tidy-up formatting.

* Hide Maximise button as animations not working correctly

* Remove the ffmpeg pod.

* created the replace formatted text function

* Fix authentication tests.

* Translated using Weblate (Swedish)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/sv/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translations update from Weblate (#6843)

* Translated using Weblate (Italian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Estonian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (German)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Icelandic)

Currently translated at 86.0% (1919 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/is/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2229 of 2229 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Thomas Schmidt <thomas@thsmdt.com>
Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6844)

* Translated using Weblate (Icelandic)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/is/

* Translated using Weblate (Swedish)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/sv/

Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: LinAGKar <linus.kardell@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>

* edit works functionally (no UI changes yet)

* package update

* formatted reply support

* error logging improvement

* code improvements

* improving code

* improving overall code

* Filter button

* Verified sessions

* reverting the xcscheme file

* revert

* todo reminder

* Ignore OS version from web based sessions (PSG-826) (#6852)

* Ignore OS version from web based sessions

* Add changelog

* Clear filter button

* Device Manager: Rename Session (#6826)

* Publish the user sessions overview data.
* Add UserSessionName screen.
* Update logout action to match Figma more closely.

* UI and unit tests

* Device Manager: Verify session (#6832)

* Initial implementation
* Add verificationState to UserSessionInfo
* Listen for changes device changes in the service.

* Remove loader for static location sharing

* Remove loader for live location sharing

* Move completions around

* Add changelog.d file

* edit mode changes the send button

* right assets

* color improvements and implementing the cancel callback

* implemented cancel, but I need to actually need to solve a problem where the previous text is not stored in case of cancel of the reply/edit

* edit reply completed, just need to polish the UI a bit more.

* Renamed  OtherUserSessionsFilter  to UserOtherSessionsFilter

* Changelog

* Formating

* some UI tweaks

* Add voice broadcast state event (#6785)

* Tidy up TabBarCoordinator now that AllChatsCoordinator exists.

* Update Riot/Assets/en.lproj/Vector.strings

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>

* Update RiotSwiftUI/Modules/UserSessions/UserOtherSessions/UserOtherSessionsModels.swift

Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>

* Single scale image

* Renamed filerWasChanged to filterWasChanged

* Revert collections update

* Added accessibility label to filter menu

* pr comment + some design improvements

* should now be aligned to the designs

* get rid of additional UIHostingController. Cleanup and comments.

* legacy sendMode code separation to have RiotSwiftUI be able to build.

* Added last activity item to session details screen

* fix

* More comments

* Update strings for unknown sessions.

* Fix RiotTests.

* code improvements

* wiftlint

* Remove verify session button for other sessions when the current session is unverified

* Implement login with scanned QR code flows

* Fix initiator flows and e2e tests

* Add missing rendezvousServerBaseURL buildSetting

* Add changelog

* Remove extra step as no longer required

* Fix typo

* Remove now unnecessary creator public key publishing. Rebuilt flows and fixed tests

* Fix UI tests for features currently disabled

* composer code improvement

* improving code

* unit tests

* Tests completed! The only doubt I have left is about testing the string content considering the localisations in tests

* code improvement

* code improvement

* ui tests should now work on CI

* ui test should work now

* ui tests fix on ci

* ui test improvements

* Correct verificationStatusAdditionalInfoText for other session

* Changelog

* Correct label for other verified session

* Formating fixes

* Update enhancement issue template

Link to discussions for cross-platform and feature requests

* Updates based on comments.

* more comment updates

* unit tests improved!

* improved UI tests

* Add a SignOutFlowPresenter. (#6854)

Used in AllChats, UserSessions and Settings.
(TabBarCoordinator is unnecessary as signout will be removed from there).

* Additional translations and accessiblity labels

* Added E2EE support on sessions created through QR code login

* Fixed various SwiftFormat warnings

* Remove unnecessary private key requests as it already happens automatically when marking the existing device as verified

* Allow the login with qr button to be shown on the login screen if the currently selected homeserver supports it

* Check login intents match between QR code and current flow

* Fix authentication unit tests

* Login against the homeserver provided through the QR code

* Navigating to session overview goes to session details

* Changelog

* Fix typo

* custom tint + blinking dark theme text color issue fix

* Identify inactive sessions

* Changelog

* Translated using Weblate (German)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (French)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/fr/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2269 of 2269 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* opacity transition implemented

* 0.15 animation

* updated UI tests

* project yml with the latest working version of the package

* "Notifications on this device" not refreshed in user settings screen

* Update tools.

• Un-pin versions to update tools on each release.
• Switch to SwiftFormat as a pod.

* All chats shows no rooms in the list

- Fixed

* added the grabber and the corner radius

* the right corner radius value

* ios 16 custom detent

* height value

* Revert "height value"

This reverts commit fae63c6f768d2dd375d431bc16acca31e2dd56bb.

* Revert "ios 16 custom detent"

This reverts commit 758dacc00e77c57b787aae71405a1f90c03c3666.

* better padding

* Update Wysiwyg dep and use new focused param on WysiwygComposerView

* Filter out application section if needed

* Add changelog.d file

* design improvements!

* designs are perfect now

* Fix bubble cell visibility (#6893)

* updated the swiftpm

* package resolved

* Set inputAccessoryViewForKeyboard so that interactive dismissal works.

* [Voice Broadcast] Aggregate the chunks of voice messages in room timeline (#6891)

* Add missing changelogs

* changelog

* changelog

* changelog linked to an issue

* Add weak self reference to closure

* spacing improved further

* Use unstable prefixes for QR code login

* Changelog

* Force update client information

* Changelog

* Fix incorrect Task creation for processing scanned qr codes

* Check and mark the received MSK as trusted before locally verifying the existing device

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6909)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (49 of 49 strings)

Translation: Element iOS/Element iOS (Push)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6910)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6909)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (49 of 49 strings)

Translation: Element iOS/Element iOS (Push)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6911)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6909)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (49 of 49 strings)

Translation: Element iOS/Element iOS (Push)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6910)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6909)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (49 of 49 strings)

Translation: Element iOS/Element iOS (Push)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-push/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Translations update from Weblate (#6908)

* Translated using Weblate (Bulgarian)

Currently translated at 100.0% (8 of 8 strings)

Translation: Element iOS/Element iOS (Dialogs)
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios-dialogs/bg/

* Translations update from Weblate (#6907)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>

* Translations update from Weblate (#6915)

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (German)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/de/

* Translated using Weblate (Russian)

Currently translated at 81.2% (1870 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/ru/

* Translated using Weblate (Hungarian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/hu/

* Translated using Weblate (Bulgarian)

Currently translated at 66.4% (1529 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/bg/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

* Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/pt_BR/

* Translated using Weblate (Ukrainian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/uk/

* Translated using Weblate (Estonian)

Currently translated at 97.5% (2245 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/et/

* Translated using Weblate (Indonesian)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/id/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (2301 of 2301 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/sk/

* Translated using Weblate (Italian)

Currently translated at 100.0% (2302 of 2302 strings)

Translation: Element iOS/Element iOS
Translate-URL: https://translate.element.io/projects/riot-ios/riot-ios/it/

Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Weblate <noreply@weblate.org>

* Missing change from fix

* changelog

* Only running alpha builds when PR labeled with `Trigger-PR-Build`

* Configure codecov flags and have them be carried forward

* Add pull request change types for triggering alpha builds

* changelog.d: Upgrade MatrixSDK version ([v0.24.1](https://github.com/matrix-org/matrix-ios-sdk/releases/tag/v0.24.1)).

* version++

Co-authored-by: Anderas <andyuhnak@gmail.com>
Co-authored-by: Mauro Romito <mauro.romito@element.io>
Co-authored-by: Aleksandrs Proskurins <paleksandrs@gmail.com>
Co-authored-by: Johannes Marbach <johannesm@element.io>
Co-authored-by: aringenbach <arnaudr@element.io>
Co-authored-by: David Langley <langley.dave@gmail.com>
Co-authored-by: random <dictionary@tutamail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Linerly <linerly@protonmail.com>
Co-authored-by: Priit Jõerüüt <riot@joeruut.com>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Vri <element@vrifox.cc>
Co-authored-by: Thomas Schmidt <thomas@thsmdt.com>
Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Co-authored-by: Stefan Ceriu <stefanc@matrix.org>
Co-authored-by: Aleksandrs Proskurins <aleksandrsp@element.io>
Co-authored-by: Doug <douglase@element.io>
Co-authored-by: Doug <6060466+pixlwave@users.noreply.github.com>
Co-authored-by: Shunmugaraj <toshanmugaraj@gmail.com>
Co-authored-by: LinAGKar <linus.kardell@gmail.com>
Co-authored-by: lvre <7uu3qrbvm@relay.firefox.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Element Translate Bot <admin@riot.im>
Co-authored-by: Alfonso Grillo <alfogrillo@gmail.com>
Co-authored-by: Alfonso Grillo <alfogrillo@element.io>
Co-authored-by: Yoan Pintas <y.pintas@gmail.com>
Co-authored-by: Gil Eluard <gile@element.io>
Co-authored-by: Hugh Nimmo-Smith <hughns@element.io>
Co-authored-by: Kat Gerasimova <ekaterinag@element.io>
Co-authored-by: Velin92 <34335419+Velin92@users.noreply.github.com>
Co-authored-by: Thibault Martin <mail@thibaultmart.in>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
Co-authored-by: Nui Harime <harime.nui@yandex.ru>
Co-authored-by: Szimszon <github@oregpreshaz.eu>
Co-authored-by: Slavi Pantaleev <slavi@devture.com>
Co-authored-by: gulekismail <ismailgulek0@gmail.com>
This commit is contained in:
ismailgulek
2022-10-18 16:09:06 +03:00
committed by GitHub
parent 2a4fbfd2b3
commit 2fc0832ca8
357 changed files with 15106 additions and 1585 deletions
@@ -14,12 +14,14 @@
// limitations under the License.
//
import Combine
import CommonKit
import SwiftUI
struct UserSessionOverviewCoordinatorParameters {
let session: MXSession
let sessionInfo: UserSessionInfo
let sessionsOverviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never>
}
final class UserSessionOverviewCoordinator: Coordinator, Presentable {
@@ -42,9 +44,13 @@ final class UserSessionOverviewCoordinator: Coordinator, Presentable {
self.parameters = parameters
let service = UserSessionOverviewService(session: parameters.session, sessionInfo: parameters.sessionInfo)
viewModel = UserSessionOverviewViewModel(sessionInfo: parameters.sessionInfo, service: service)
viewModel = UserSessionOverviewViewModel(sessionInfo: parameters.sessionInfo,
service: service,
sessionsOverviewDataPublisher: parameters.sessionsOverviewDataPublisher)
hostingController = VectorHostingController(rootView: UserSessionOverview(viewModel: viewModel.context))
hostingController.vc_setLargeTitleDisplayMode(.never)
hostingController.vc_removeBackTitle()
indicatorPresenter = UserIndicatorTypePresenter(presentingViewController: hostingController)
}
@@ -55,12 +61,17 @@ final class UserSessionOverviewCoordinator: Coordinator, Presentable {
MXLog.debug("[UserSessionOverviewCoordinator] did start.")
viewModel.completion = { [weak self] result in
guard let self = self else { return }
MXLog.debug("[UserSessionOverviewCoordinator] UserSessionOverviewViewModel did complete with result: \(result).")
switch result {
case .verifyCurrentSession:
break // TODO:
case let .verifySession(sessionInfo):
self.completion?(.verifySession(sessionInfo))
case let .showSessionDetails(sessionInfo: sessionInfo):
self.completion?(.openSessionDetails(sessionInfo: sessionInfo))
case let .renameSession(sessionInfo):
self.completion?(.renameSession(sessionInfo))
case let .logoutOfSession(sessionInfo):
self.completion?(.logoutOfSession(sessionInfo))
}
}
}
@@ -51,7 +51,7 @@ enum MockUserSessionOverviewScreenState: MockScreenState, CaseIterable {
session = UserSessionInfo(id: "alice",
name: "iOS",
deviceType: .mobile,
isVerified: false,
verificationState: .unverified,
lastSeenIP: "10.0.0.10",
lastSeenTimestamp: nil,
applicationName: "Element iOS",
@@ -69,14 +69,14 @@ enum MockUserSessionOverviewScreenState: MockScreenState, CaseIterable {
session = UserSessionInfo(id: "1",
name: "macOS",
deviceType: .desktop,
isVerified: true,
verificationState: .verified,
lastSeenIP: "1.0.0.1",
lastSeenTimestamp: Date().timeIntervalSince1970 - 130_000,
applicationName: "Element MacOS",
applicationVersion: "1.0.0",
applicationURL: nil,
deviceModel: nil,
deviceOS: "macOS 12.5.1",
deviceOS: "macOS",
lastSeenIPLocation: nil,
clientName: "Electron",
clientVersion: "20.1.1",
@@ -87,14 +87,14 @@ enum MockUserSessionOverviewScreenState: MockScreenState, CaseIterable {
session = UserSessionInfo(id: "1",
name: "macOS",
deviceType: .desktop,
isVerified: true,
verificationState: .verified,
lastSeenIP: "1.0.0.1",
lastSeenTimestamp: Date().timeIntervalSince1970 - 130_000,
applicationName: "Element MacOS",
applicationVersion: "1.0.0",
applicationURL: nil,
deviceModel: nil,
deviceOS: "macOS 12.5.1",
deviceOS: "macOS",
lastSeenIPLocation: nil,
clientName: "My Mac",
clientVersion: "1.0.0",
@@ -105,14 +105,14 @@ enum MockUserSessionOverviewScreenState: MockScreenState, CaseIterable {
session = UserSessionInfo(id: "1",
name: "macOS",
deviceType: .desktop,
isVerified: true,
verificationState: .verified,
lastSeenIP: "1.0.0.1",
lastSeenTimestamp: Date().timeIntervalSince1970 - 130_000,
applicationName: "Element MacOS",
applicationVersion: "1.0.0",
applicationURL: nil,
deviceModel: nil,
deviceOS: "macOS 12.5.1",
deviceOS: "macOS",
lastSeenIPLocation: nil,
clientName: "My Mac",
clientVersion: "1.0.0",
@@ -18,7 +18,6 @@ import Combine
import MatrixSDK
class UserSessionOverviewService: UserSessionOverviewServiceProtocol {
// MARK: - Members
private(set) var pusherEnabledSubject: CurrentValueSubject<Bool?, Never>
@@ -29,54 +28,97 @@ class UserSessionOverviewService: UserSessionOverviewServiceProtocol {
private let session: MXSession
private let sessionInfo: UserSessionInfo
private var pusher: MXPusher?
private var localNotificationSettings: [String: Any]?
// MARK: - Setup
init(session: MXSession, sessionInfo: UserSessionInfo) {
self.session = session
self.sessionInfo = sessionInfo
self.pusherEnabledSubject = CurrentValueSubject(nil)
self.remotelyTogglingPushersAvailableSubject = CurrentValueSubject(false)
checkServerVersions { [weak self] in
self?.checkPusher()
pusherEnabledSubject = CurrentValueSubject(nil)
remotelyTogglingPushersAvailableSubject = CurrentValueSubject(false)
localNotificationSettings = session.accountData.localNotificationSettingsForDevice(withId: sessionInfo.id)
if let localNotificationSettings = localNotificationSettings, let isSilenced = localNotificationSettings[kMXAccountDataIsSilencedKey] as? Bool {
remotelyTogglingPushersAvailableSubject.send(true)
pusherEnabledSubject.send(!isSilenced)
}
checkPusher { [weak self] in
guard self?.pusher != nil else {
return
}
self?.checkServerVersions()
}
}
// MARK: - UserSessionOverviewServiceProtocol
func togglePushNotifications() {
guard let pusher = pusher, let enabled = pusher.enabled?.boolValue, self.remotelyTogglingPushersAvailableSubject.value else {
guard let pusher = pusher, let enabled = pusher.enabled?.boolValue else {
updateLocalNotification()
return
}
let data = pusher.data.jsonDictionary() as? [String: Any] ?? [:]
self.session.matrixRestClient.setPusher(pushKey: pusher.pushkey,
kind: MXPusherKind(value: pusher.kind),
appId: pusher.appId,
appDisplayName:pusher.appDisplayName,
deviceDisplayName: pusher.deviceDisplayName,
profileTag: pusher.profileTag ?? "",
lang: pusher.lang,
data: data,
append: false,
enabled: !enabled) { [weak self] response in
guard let self = self else { return }
switch response {
case .success:
self.checkPusher()
case .failure(let error):
MXLog.warning("[UserSessionOverviewService] togglePushNotifications failed due to error: \(error)")
self.pusherEnabledSubject.send(enabled)
}
}
toggle(pusher, enabled: !enabled)
}
// MARK: - Private
private func checkServerVersions(_ completion: @escaping () -> Void) {
private func toggle(_ pusher: MXPusher, enabled: Bool) {
guard remotelyTogglingPushersAvailableSubject.value else {
MXLog.warning("[UserSessionOverviewService] toggle pusher canceled: remotely toggling pushers not available")
return
}
MXLog.debug("[UserSessionOverviewService] remotely toggling pusher")
let data = pusher.data.jsonDictionary() as? [String: Any] ?? [:]
session.matrixRestClient.setPusher(pushKey: pusher.pushkey,
kind: MXPusherKind(value: pusher.kind),
appId: pusher.appId,
appDisplayName: pusher.appDisplayName,
deviceDisplayName: pusher.deviceDisplayName,
profileTag: pusher.profileTag ?? "",
lang: pusher.lang,
data: data,
append: false,
enabled: enabled) { [weak self] response in
guard let self = self else { return }
switch response {
case .success:
if let account = MXKAccountManager.shared().activeAccounts.first, account.device?.deviceId == pusher.deviceId {
account.loadCurrentPusher(nil)
}
self.checkPusher()
case .failure(let error):
MXLog.warning("[UserSessionOverviewService] togglePusher failed due to error: \(error)")
self.pusherEnabledSubject.send(!enabled)
}
}
}
private func updateLocalNotification() {
guard var localNotificationSettings = localNotificationSettings, let isSilenced = localNotificationSettings[kMXAccountDataIsSilencedKey] as? Bool else {
MXLog.warning("[UserSessionOverviewService] updateLocalNotification canceled: \"\(kMXAccountDataIsSilencedKey)\" notification property not found")
return
}
localNotificationSettings[kMXAccountDataIsSilencedKey] = !isSilenced
session.setAccountData(localNotificationSettings, forType: MXAccountData.localNotificationSettingsKeyForDevice(withId: sessionInfo.id)) { [weak self] in
self?.localNotificationSettings = localNotificationSettings
self?.pusherEnabledSubject.send(isSilenced)
} failure: { [weak self] error in
MXLog.warning("[UserSessionOverviewService] updateLocalNotification failed due to error: \(String(describing: error))")
self?.pusherEnabledSubject.send(!isSilenced)
}
}
private func checkServerVersions() {
session.supportedMatrixVersions { [weak self] response in
switch response {
case .success(let versions):
@@ -84,11 +126,10 @@ class UserSessionOverviewService: UserSessionOverviewServiceProtocol {
case .failure(let error):
MXLog.warning("[UserSessionOverviewService] checkServerVersions failed due to error: \(error)")
}
completion()
}
}
private func checkPusher() {
private func checkPusher(_ completion: (() -> Void)? = nil) {
session.matrixRestClient.pushers { [weak self] response in
switch response {
case .success(let pushers):
@@ -96,6 +137,7 @@ class UserSessionOverviewService: UserSessionOverviewServiceProtocol {
case .failure(let error):
MXLog.warning("[UserSessionOverviewService] checkPusher failed due to error: \(error)")
}
completion?()
}
}
@@ -18,18 +18,16 @@ import Combine
import Foundation
class MockUserSessionOverviewService: UserSessionOverviewServiceProtocol {
var pusherEnabledSubject: CurrentValueSubject<Bool?, Never>
var remotelyTogglingPushersAvailableSubject: CurrentValueSubject<Bool, Never>
init(pusherEnabled: Bool? = nil, remotelyTogglingPushersAvailable: Bool = true) {
self.pusherEnabledSubject = CurrentValueSubject(pusherEnabled)
self.remotelyTogglingPushersAvailableSubject = CurrentValueSubject(remotelyTogglingPushersAvailable)
pusherEnabledSubject = CurrentValueSubject(pusherEnabled)
remotelyTogglingPushersAvailableSubject = CurrentValueSubject(remotelyTogglingPushersAvailable)
}
func togglePushNotifications() {
guard let enabled = pusherEnabledSubject.value, self.remotelyTogglingPushersAvailableSubject.value else {
guard let enabled = pusherEnabledSubject.value, remotelyTogglingPushersAvailableSubject.value else {
return
}
@@ -20,23 +20,22 @@ import XCTest
@testable import RiotSwiftUI
class UserSessionOverviewViewModelTests: XCTestCase {
var sut: UserSessionOverviewViewModel!
func test_whenVerifyCurrentSessionProcessed_completionWithVerifyCurrentSessionCalled() {
sut = UserSessionOverviewViewModel(sessionInfo: createUserSessionInfo(), service: MockUserSessionOverviewService())
let sessionInfo = createUserSessionInfo()
let sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: MockUserSessionOverviewService())
XCTAssertEqual(sut.state.isPusherEnabled, nil)
var modelResult: UserSessionOverviewViewModelResult?
sut.completion = { result in
modelResult = result
}
sut.process(viewAction: .verifyCurrentSession)
XCTAssertEqual(modelResult, .verifyCurrentSession)
sut.process(viewAction: .verifySession)
XCTAssertEqual(modelResult, .verifySession(sessionInfo))
}
func test_whenViewSessionDetailsProcessed_completionWithShowSessionDetailsCalled() {
let sessionInfo = createUserSessionInfo()
sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: MockUserSessionOverviewService())
let sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: MockUserSessionOverviewService())
XCTAssertEqual(sut.state.isPusherEnabled, nil)
var modelResult: UserSessionOverviewViewModelResult?
@@ -46,11 +45,11 @@ class UserSessionOverviewViewModelTests: XCTestCase {
sut.process(viewAction: .viewSessionDetails)
XCTAssertEqual(modelResult, .showSessionDetails(sessionInfo: sessionInfo))
}
func test_whenViewSessionDetailsProcessed_toggleAvailablePusher() {
let sessionInfo = createUserSessionInfo()
let service = MockUserSessionOverviewService(pusherEnabled: true)
sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: service)
let sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: service)
XCTAssertTrue(sut.state.remotelyTogglingPushersAvailable)
XCTAssertEqual(sut.state.isPusherEnabled, true)
@@ -63,7 +62,7 @@ class UserSessionOverviewViewModelTests: XCTestCase {
func test_whenViewSessionDetailsProcessed_toggleNoPusher() {
let sessionInfo = createUserSessionInfo()
let service = MockUserSessionOverviewService(pusherEnabled: nil)
sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: service)
let sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: service)
XCTAssertTrue(sut.state.remotelyTogglingPushersAvailable)
XCTAssertEqual(sut.state.isPusherEnabled, nil)
@@ -76,7 +75,7 @@ class UserSessionOverviewViewModelTests: XCTestCase {
func test_whenViewSessionDetailsProcessed_remotelyTogglingPushersNotAvailable() {
let sessionInfo = createUserSessionInfo()
let service = MockUserSessionOverviewService(pusherEnabled: true, remotelyTogglingPushersAvailable: false)
sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: service)
let sut = UserSessionOverviewViewModel(sessionInfo: sessionInfo, service: service)
XCTAssertFalse(sut.state.remotelyTogglingPushersAvailable)
XCTAssertEqual(sut.state.isPusherEnabled, true)
@@ -90,7 +89,7 @@ class UserSessionOverviewViewModelTests: XCTestCase {
UserSessionInfo(id: "session",
name: "iOS",
deviceType: .mobile,
isVerified: false,
verificationState: .unverified,
lastSeenIP: "10.0.0.10",
lastSeenTimestamp: Date().timeIntervalSince1970 - 100,
applicationName: "Element iOS",
@@ -20,19 +20,24 @@ import Foundation
enum UserSessionOverviewCoordinatorResult {
case openSessionDetails(sessionInfo: UserSessionInfo)
case verifySession(UserSessionInfo)
case renameSession(UserSessionInfo)
case logoutOfSession(UserSessionInfo)
}
// MARK: View model
enum UserSessionOverviewViewModelResult: Equatable {
case showSessionDetails(sessionInfo: UserSessionInfo)
case verifyCurrentSession
case verifySession(UserSessionInfo)
case renameSession(UserSessionInfo)
case logoutOfSession(UserSessionInfo)
}
// MARK: View
struct UserSessionOverviewViewState: BindableState {
let cardViewData: UserSessionCardViewData
var cardViewData: UserSessionCardViewData
let isCurrentSession: Bool
var isPusherEnabled: Bool?
var remotelyTogglingPushersAvailable: Bool
@@ -40,7 +45,9 @@ struct UserSessionOverviewViewState: BindableState {
}
enum UserSessionOverviewViewAction {
case verifyCurrentSession
case verifySession
case viewSessionDetails
case togglePushNotifications
case renameSession
case logoutOfSession
}
@@ -14,6 +14,7 @@
// limitations under the License.
//
import Combine
import SwiftUI
typealias UserSessionOverviewViewModelType = StateStoreViewModel<UserSessionOverviewViewState, UserSessionOverviewViewAction>
@@ -26,7 +27,13 @@ class UserSessionOverviewViewModel: UserSessionOverviewViewModelType, UserSessio
// MARK: - Setup
init(sessionInfo: UserSessionInfo, service: UserSessionOverviewServiceProtocol) {
init(sessionInfo: UserSessionInfo,
service: UserSessionOverviewServiceProtocol,
sessionsOverviewDataPublisher: CurrentValueSubject<UserSessionsOverviewData, Never> = .init(.init(currentSession: nil,
unverifiedSessions: [],
inactiveSessions: [],
otherSessions: [],
linkDeviceEnabled: false))) {
self.sessionInfo = sessionInfo
self.service = service
@@ -39,6 +46,21 @@ class UserSessionOverviewViewModel: UserSessionOverviewViewModelType, UserSessio
super.init(initialViewState: state)
startObservingService()
sessionsOverviewDataPublisher.sink { [weak self] overviewData in
guard let self = self else { return }
var updatedInfo: UserSessionInfo?
if let currentSession = overviewData.currentSession, currentSession.id == sessionInfo.id {
updatedInfo = currentSession
} else if let otherSession = overviewData.otherSessions.first(where: { $0.id == sessionInfo.id }) {
updatedInfo = otherSession
}
guard let updatedInfo = updatedInfo else { return }
self.state.cardViewData = UserSessionCardViewData(sessionInfo: updatedInfo)
}
.store(in: &cancellables)
}
private func startObservingService() {
@@ -62,13 +84,17 @@ class UserSessionOverviewViewModel: UserSessionOverviewViewModelType, UserSessio
override func process(viewAction: UserSessionOverviewViewAction) {
switch viewAction {
case .verifyCurrentSession:
completion?(.verifyCurrentSession)
case .verifySession:
completion?(.verifySession(sessionInfo))
case .viewSessionDetails:
completion?(.showSessionDetails(sessionInfo: sessionInfo))
case .togglePushNotifications:
self.state.showLoadingIndicator = true
state.showLoadingIndicator = true
service.togglePushNotifications()
case .renameSession:
completion?(.renameSession(sessionInfo))
case .logoutOfSession:
completion?(.logoutOfSession(sessionInfo))
}
}
}
@@ -24,16 +24,18 @@ struct UserSessionOverview: View {
var body: some View {
ScrollView {
UserSessionCardView(viewData: viewModel.viewState.cardViewData, onVerifyAction: { _ in
viewModel.send(viewAction: .verifyCurrentSession)
viewModel.send(viewAction: .verifySession)
},
onViewDetailsAction: { _ in
viewModel.send(viewAction: .viewSessionDetails)
})
.padding(16)
SwiftUI.Section {
UserSessionOverviewDisclosureCell(title: VectorL10n.userSessionOverviewSessionDetailsButtonTitle, onBackgroundTap: {
UserSessionOverviewItem(title: VectorL10n.userSessionOverviewSessionDetailsButtonTitle,
showsChevron: true) {
viewModel.send(viewAction: .viewSessionDetails)
})
}
if let enabled = viewModel.viewState.isPusherEnabled {
UserSessionOverviewToggleCell(title: VectorL10n.userSessionPushNotifications,
message: VectorL10n.userSessionPushNotificationsMessage,
@@ -42,6 +44,14 @@ struct UserSessionOverview: View {
}
}
}
SwiftUI.Section {
UserSessionOverviewItem(title: VectorL10n.manageSessionSignOut,
alignment: .center,
isDestructive: true) {
viewModel.send(viewAction: .logoutOfSession)
}
}
}
.background(theme.colors.system.ignoresSafeArea())
.frame(maxHeight: .infinity)
@@ -49,6 +59,22 @@ struct UserSessionOverview: View {
.navigationTitle(viewModel.viewState.isCurrentSession ?
VectorL10n.userSessionOverviewCurrentSessionTitle :
VectorL10n.userSessionOverviewSessionTitle)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Menu {
Button { viewModel.send(viewAction: .renameSession) } label: {
Label(VectorL10n.manageSessionRename, systemImage: "pencil")
}
} label: {
Image(systemName: "ellipsis")
.padding(.horizontal, 4)
.padding(.vertical, 12)
}
.offset(x: 4) // Re-align the symbol after applying padding.
}
}
.accentColor(theme.colors.accent)
}
}
@@ -16,10 +16,13 @@
import SwiftUI
struct UserSessionOverviewDisclosureCell: View {
struct UserSessionOverviewItem: View {
@Environment(\.theme) private var theme: ThemeSwiftUI
let title: String
var alignment: Alignment = .leading
var showsChevron = false
var isDestructive = false
var onBackgroundTap: (() -> Void)?
var body: some View {
@@ -29,9 +32,12 @@ struct UserSessionOverviewDisclosureCell: View {
HStack {
Text(title)
.font(theme.fonts.body)
.foregroundColor(theme.colors.primaryContent)
.frame(maxWidth: .infinity, alignment: .leading)
Image(Asset.Images.chevron.name)
.foregroundColor(textColor)
.frame(maxWidth: .infinity, alignment: alignment)
if showsChevron {
Image(Asset.Images.chevron.name)
}
}
.padding(.vertical, 15)
.padding(.horizontal, 16)
@@ -40,17 +46,27 @@ struct UserSessionOverviewDisclosureCell: View {
.background(theme.colors.background)
}
}
var textColor: Color {
isDestructive ? theme.colors.alert : theme.colors.primaryContent
}
}
struct UserSessionOverviewDisclosureCell_Previews: PreviewProvider {
struct UserSessionOverviewItem_Previews: PreviewProvider {
static var buttons: some View {
NavigationView {
ScrollView {
UserSessionOverviewItem(title: "Nav item", showsChevron: true)
UserSessionOverviewItem(title: "Button")
UserSessionOverviewItem(title: "Button", isDestructive: true)
}
}
}
static var previews: some View {
Group {
UserSessionOverviewDisclosureCell(title: "Title")
.theme(.light)
.preferredColorScheme(.light)
UserSessionOverviewDisclosureCell(title: "Title")
.theme(.dark)
.preferredColorScheme(.dark)
buttons.theme(.light).preferredColorScheme(.light)
buttons.theme(.dark).preferredColorScheme(.dark)
}
}
}