From 4e39829df6ff92a52a100db1e0260cacbcaaeb93 Mon Sep 17 00:00:00 2001 From: Diego Beraldin Date: Thu, 30 May 2024 21:53:05 +0200 Subject: [PATCH] feat: specific language on a per-community basis (#909) --- .../commonui/detailopener/api/DetailOpener.kt | 2 +- .../kotlin/DefaultDetailOpenerTest.kt | 2 +- .../detailopener/impl/DefaultDetailOpener.kt | 8 +- .../core/commonui/lemmyui/Options.kt | 2 + .../src/androidMain/res/values-ar/strings.xml | 1 + .../src/androidMain/res/values-bg/strings.xml | 1 + .../src/androidMain/res/values-cs/strings.xml | 1 + .../src/androidMain/res/values-da/strings.xml | 1 + .../src/androidMain/res/values-de/strings.xml | 1 + .../src/androidMain/res/values-el/strings.xml | 1 + .../src/androidMain/res/values-eo/strings.xml | 1 + .../src/androidMain/res/values-es/strings.xml | 1 + .../src/androidMain/res/values-et/strings.xml | 1 + .../src/androidMain/res/values-fi/strings.xml | 1 + .../src/androidMain/res/values-fr/strings.xml | 1 + .../src/androidMain/res/values-ga/strings.xml | 1 + .../src/androidMain/res/values-hr/strings.xml | 1 + .../src/androidMain/res/values-hu/strings.xml | 1 + .../src/androidMain/res/values-it/strings.xml | 1 + .../src/androidMain/res/values-lt/strings.xml | 1 + .../src/androidMain/res/values-lv/strings.xml | 1 + .../src/androidMain/res/values-mt/strings.xml | 1 + .../src/androidMain/res/values-nl/strings.xml | 1 + .../src/androidMain/res/values-no/strings.xml | 1 + .../src/androidMain/res/values-pl/strings.xml | 1 + .../androidMain/res/values-pt-rBR/strings.xml | 1 + .../src/androidMain/res/values-pt/strings.xml | 1 + .../src/androidMain/res/values-ro/strings.xml | 1 + .../src/androidMain/res/values-ru/strings.xml | 1 + .../src/androidMain/res/values-se/strings.xml | 1 + .../src/androidMain/res/values-sk/strings.xml | 2 +- .../src/androidMain/res/values-sl/strings.xml | 1 + .../src/androidMain/res/values-sq/strings.xml | 1 + .../src/androidMain/res/values-sr/strings.xml | 1 + .../androidMain/res/values-tok/strings.xml | 1 + .../src/androidMain/res/values-tr/strings.xml | 1 + .../src/androidMain/res/values-uk/strings.xml | 1 + .../src/androidMain/res/values/strings.xml | 1 + ...ommunityPreferredLanguageRepositoryTest.kt | 108 ++++++++++++++++++ .../DefaultCommunitySortRepositoryTest.kt | 47 ++++---- .../persistence/di/CorePersistenceModule.kt | 7 ++ .../CommunityPreferredLanguageRepository.kt | 12 ++ .../repository/CommunitySortRepository.kt | 6 +- ...ultCommunityPreferredLanguageRepository.kt | 52 +++++++++ .../DefaultCommunitySortRepository.kt | 13 ++- .../usecase/DefaultLoginUseCaseTest.kt | 5 + .../DefaultSwitchAccountUseCaseTest.kt | 5 + .../domain/identity/di/IdentityModule.kt | 2 + .../identity/usecase/DefaultLoginUseCase.kt | 3 + .../usecase/DefaultSwitchAccountUseCase.kt | 3 + .../CommunityDetailMviModel.kt | 5 + .../communitydetail/CommunityDetailScreen.kt | 29 +++++ .../CommunityDetailViewModel.kt | 91 ++++++++++----- .../di/CommunityDetailModule.kt | 1 + .../createcomment/CreateCommentViewModel.kt | 7 +- .../createcomment/di/CreateCommentModule.kt | 1 + .../unit/createpost/CreatePostViewModel.kt | 27 +++-- .../unit/createpost/di/CreatePostModule.kt | 1 + .../unit/drafts/DraftsScreen.kt | 7 +- .../unit/explore/ExploreScreen.kt | 4 +- .../FilteredContentsScreen.kt | 11 +- .../unit/myaccount/ProfileLoggedScreen.kt | 2 + .../unit/postdetail/PostDetailScreen.kt | 2 + .../unit/userdetail/UserDetailScreen.kt | 1 + 64 files changed, 420 insertions(+), 81 deletions(-) create mode 100644 core/persistence/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunityPreferredLanguageRepositoryTest.kt create mode 100644 core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/CommunityPreferredLanguageRepository.kt create mode 100644 core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunityPreferredLanguageRepository.kt diff --git a/core/commonui/detailopener-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/detailopener/api/DetailOpener.kt b/core/commonui/detailopener-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/detailopener/api/DetailOpener.kt index 8dbdf99b9..95410f14a 100644 --- a/core/commonui/detailopener-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/detailopener/api/DetailOpener.kt +++ b/core/commonui/detailopener-api/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/detailopener/api/DetailOpener.kt @@ -27,7 +27,7 @@ interface DetailOpener { fun openReply( draftId: Long? = null, - originalPost: PostModel? = null, + originalPost: PostModel, originalComment: CommentModel? = null, editedComment: CommentModel? = null, initialText: String? = null, diff --git a/core/commonui/detailopener-impl/src/androidUnitTest/kotlin/DefaultDetailOpenerTest.kt b/core/commonui/detailopener-impl/src/androidUnitTest/kotlin/DefaultDetailOpenerTest.kt index a0b47a39c..2728074cc 100644 --- a/core/commonui/detailopener-impl/src/androidUnitTest/kotlin/DefaultDetailOpenerTest.kt +++ b/core/commonui/detailopener-impl/src/androidUnitTest/kotlin/DefaultDetailOpenerTest.kt @@ -185,7 +185,7 @@ class DefaultDetailOpenerTest { val comment = CommentModel(text = "test", id = 1) launch { - sut.openReply(originalComment = comment) + sut.openReply(originalComment = comment, originalPost = PostModel(id = 0)) } advanceTimeBy(OPEN_DELAY) diff --git a/core/commonui/detailopener-impl/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/detailopener/impl/DefaultDetailOpener.kt b/core/commonui/detailopener-impl/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/detailopener/impl/DefaultDetailOpener.kt index 1759ccde5..4d362910c 100644 --- a/core/commonui/detailopener-impl/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/detailopener/impl/DefaultDetailOpener.kt +++ b/core/commonui/detailopener-impl/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/detailopener/impl/DefaultDetailOpener.kt @@ -102,16 +102,14 @@ class DefaultDetailOpener( override fun openReply( draftId: Long?, - originalPost: PostModel?, + originalPost: PostModel, originalComment: CommentModel?, editedComment: CommentModel?, initialText: String?, ) { scope.launch { withContext(Dispatchers.IO) { - if (originalPost != null) { - itemCache.putPost(originalPost) - } + itemCache.putPost(originalPost) if (originalComment != null) { itemCache.putComment(originalComment) } @@ -122,7 +120,7 @@ class DefaultDetailOpener( val screen = CreateCommentScreen( draftId = draftId, - originalPostId = originalPost?.id, + originalPostId = originalPost.id, originalCommentId = originalComment?.id, editedCommentId = editedComment?.id, initialText = initialText, diff --git a/core/commonui/lemmyui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/lemmyui/Options.kt b/core/commonui/lemmyui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/lemmyui/Options.kt index 666b4e8f3..468e4f76d 100644 --- a/core/commonui/lemmyui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/lemmyui/Options.kt +++ b/core/commonui/lemmyui/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/commonui/lemmyui/Options.kt @@ -30,6 +30,8 @@ sealed class OptionId(val value: Int) { data object AdminFeaturePost : OptionId(11) + data object SetPreferredLanguage : OptionId(12) + data object FeaturePost : OptionId(13) data object LockPost : OptionId(14) diff --git a/core/l10n/src/androidMain/res/values-ar/strings.xml b/core/l10n/src/androidMain/res/values-ar/strings.xml index 0e9421cc3..ff321ca88 100644 --- a/core/l10n/src/androidMain/res/values-ar/strings.xml +++ b/core/l10n/src/androidMain/res/values-ar/strings.xml @@ -398,4 +398,5 @@ تطهير وضع علامة مميزة (مثال) إلغاء تحديد علامة مميزة (مثال) + تعيين اللغة المفضلة diff --git a/core/l10n/src/androidMain/res/values-bg/strings.xml b/core/l10n/src/androidMain/res/values-bg/strings.xml index e6cef72c6..def56f310 100644 --- a/core/l10n/src/androidMain/res/values-bg/strings.xml +++ b/core/l10n/src/androidMain/res/values-bg/strings.xml @@ -398,4 +398,5 @@ Прочистване Маркиране като представено (екземпляр) Демаркиране като представено (екземпляр) + Задаване на предпочитанияезик diff --git a/core/l10n/src/androidMain/res/values-cs/strings.xml b/core/l10n/src/androidMain/res/values-cs/strings.xml index 31616e3b4..2e2976e79 100644 --- a/core/l10n/src/androidMain/res/values-cs/strings.xml +++ b/core/l10n/src/androidMain/res/values-cs/strings.xml @@ -398,4 +398,5 @@ Očistit Označit jako doporučené (instance) Zrušit označení jako doporučené (instance) + Nastavení preferovaného jazyka diff --git a/core/l10n/src/androidMain/res/values-da/strings.xml b/core/l10n/src/androidMain/res/values-da/strings.xml index 4ba0d125b..2c5ddc26d 100644 --- a/core/l10n/src/androidMain/res/values-da/strings.xml +++ b/core/l10n/src/androidMain/res/values-da/strings.xml @@ -398,4 +398,5 @@ Udrensning Markér som fremhævet (forekomst) Fjern markering som fremhævet (forekomst) + Indstil foretrukket sprog diff --git a/core/l10n/src/androidMain/res/values-de/strings.xml b/core/l10n/src/androidMain/res/values-de/strings.xml index 83ac6f3aa..a964b835e 100755 --- a/core/l10n/src/androidMain/res/values-de/strings.xml +++ b/core/l10n/src/androidMain/res/values-de/strings.xml @@ -398,4 +398,5 @@ Säubern Als vorgestellt markieren (Instanz) Markierung als vorgestellt aufheben (Instanz) + Bevorzugte Sprache festlegen diff --git a/core/l10n/src/androidMain/res/values-el/strings.xml b/core/l10n/src/androidMain/res/values-el/strings.xml index 6f49bf86f..a44fc3136 100644 --- a/core/l10n/src/androidMain/res/values-el/strings.xml +++ b/core/l10n/src/androidMain/res/values-el/strings.xml @@ -398,4 +398,5 @@ Καθάρισε Επισήμανση ως χαρακτηρισμένου (παράδειγμα) Κατάργηση επισήμανσης ως επιλεγμένου (παράδειγμα) + Ορισμός προτιμώμενης γλώσσας diff --git a/core/l10n/src/androidMain/res/values-eo/strings.xml b/core/l10n/src/androidMain/res/values-eo/strings.xml index 2b47b0d31..5699d3996 100644 --- a/core/l10n/src/androidMain/res/values-eo/strings.xml +++ b/core/l10n/src/androidMain/res/values-eo/strings.xml @@ -398,4 +398,5 @@ Elpurigi Marki kiel elstara (nodo) Malmarki kiel elstara (nodo) + Agordi preferatan lingvon diff --git a/core/l10n/src/androidMain/res/values-es/strings.xml b/core/l10n/src/androidMain/res/values-es/strings.xml index fff5a4e32..27553187c 100755 --- a/core/l10n/src/androidMain/res/values-es/strings.xml +++ b/core/l10n/src/androidMain/res/values-es/strings.xml @@ -398,4 +398,5 @@ Purgar Marcar como destacado (instancia) Desmarcar como destacado (instancia) + Elegir idioma preferido diff --git a/core/l10n/src/androidMain/res/values-et/strings.xml b/core/l10n/src/androidMain/res/values-et/strings.xml index cf80437df..4372a87e1 100644 --- a/core/l10n/src/androidMain/res/values-et/strings.xml +++ b/core/l10n/src/androidMain/res/values-et/strings.xml @@ -398,4 +398,5 @@ Puhastamine Märgi esiletõstetuks (näide) Tühista esiletõstetud märgistus (näide) + Eelistatud keele määramine diff --git a/core/l10n/src/androidMain/res/values-fi/strings.xml b/core/l10n/src/androidMain/res/values-fi/strings.xml index 61f049454..657df3144 100644 --- a/core/l10n/src/androidMain/res/values-fi/strings.xml +++ b/core/l10n/src/androidMain/res/values-fi/strings.xml @@ -398,4 +398,5 @@ Puhdistaa Merkitse esittelyyn (esim.) Poista suositellun merkintä (esim.) + Aseta ensisijainen kieli diff --git a/core/l10n/src/androidMain/res/values-fr/strings.xml b/core/l10n/src/androidMain/res/values-fr/strings.xml index 7f8e5636b..a1296b389 100755 --- a/core/l10n/src/androidMain/res/values-fr/strings.xml +++ b/core/l10n/src/androidMain/res/values-fr/strings.xml @@ -398,4 +398,5 @@ Purger Marquer comme présenté (instance) Démarquer comme présenté (instance) + Définir la langue préférée diff --git a/core/l10n/src/androidMain/res/values-ga/strings.xml b/core/l10n/src/androidMain/res/values-ga/strings.xml index f7a3c974b..93700b784 100644 --- a/core/l10n/src/androidMain/res/values-ga/strings.xml +++ b/core/l10n/src/androidMain/res/values-ga/strings.xml @@ -398,4 +398,5 @@ Glanadh Marcáil mar atá léirithe (cás) Dímharcáil mar atá i gceist (cás) + An teanga rogha a shocrú diff --git a/core/l10n/src/androidMain/res/values-hr/strings.xml b/core/l10n/src/androidMain/res/values-hr/strings.xml index 7533c270c..8afb1c70c 100644 --- a/core/l10n/src/androidMain/res/values-hr/strings.xml +++ b/core/l10n/src/androidMain/res/values-hr/strings.xml @@ -398,4 +398,5 @@ Čišćenje Označi kao istaknuto (instanca) Ukloni oznaku kao istaknuto (instanca) + Postavljanje preferiranog jezik diff --git a/core/l10n/src/androidMain/res/values-hu/strings.xml b/core/l10n/src/androidMain/res/values-hu/strings.xml index d50a3d20e..e6eb39c53 100644 --- a/core/l10n/src/androidMain/res/values-hu/strings.xml +++ b/core/l10n/src/androidMain/res/values-hu/strings.xml @@ -398,4 +398,5 @@ Tisztítás Megjelölés kiemeltként (példány) Kiemeltként való megjelölés visszavonása (példány) + Előnyben részesítettnyelv beállítása diff --git a/core/l10n/src/androidMain/res/values-it/strings.xml b/core/l10n/src/androidMain/res/values-it/strings.xml index d1fe70e4c..0aea1989e 100755 --- a/core/l10n/src/androidMain/res/values-it/strings.xml +++ b/core/l10n/src/androidMain/res/values-it/strings.xml @@ -398,4 +398,5 @@ Epura Contrassegna come fissato (istanza) Contrassegna come non fisasto (istanza) + Imposta lingua preferita diff --git a/core/l10n/src/androidMain/res/values-lt/strings.xml b/core/l10n/src/androidMain/res/values-lt/strings.xml index 2f978926d..7c0b714f9 100644 --- a/core/l10n/src/androidMain/res/values-lt/strings.xml +++ b/core/l10n/src/androidMain/res/values-lt/strings.xml @@ -398,4 +398,5 @@ Valymas Pažymėti kaip siūlomą (pavyzdys) Panaikinkite žymėjimą kaip panašų (pavyzdys) + Nustatyti pageidaujamą kalbą diff --git a/core/l10n/src/androidMain/res/values-lv/strings.xml b/core/l10n/src/androidMain/res/values-lv/strings.xml index 9ad28b140..372fb15e7 100644 --- a/core/l10n/src/androidMain/res/values-lv/strings.xml +++ b/core/l10n/src/androidMain/res/values-lv/strings.xml @@ -398,4 +398,5 @@ Iztīrīšana Atzīmēt kā piedāvātu (piemērs) Noņemt atzīmēto kā piedāvāto (piemērs) + Iestatīt vēlamo valodu diff --git a/core/l10n/src/androidMain/res/values-mt/strings.xml b/core/l10n/src/androidMain/res/values-mt/strings.xml index 9b0440c4d..656cf2ebf 100644 --- a/core/l10n/src/androidMain/res/values-mt/strings.xml +++ b/core/l10n/src/androidMain/res/values-mt/strings.xml @@ -398,4 +398,5 @@ Tnaddaf Immarka bħala dehru (istanza) Neħħi l-immarka bħala dehru (istanza) + Issettja l-lingwa preferuta diff --git a/core/l10n/src/androidMain/res/values-nl/strings.xml b/core/l10n/src/androidMain/res/values-nl/strings.xml index 8fc45ece2..13215a76d 100644 --- a/core/l10n/src/androidMain/res/values-nl/strings.xml +++ b/core/l10n/src/androidMain/res/values-nl/strings.xml @@ -398,4 +398,5 @@ Zuiveren Markeren als aanbevolen (instantie) Markering als aanbevolen opheffen (instantie) + Voorkeurstaal instellen diff --git a/core/l10n/src/androidMain/res/values-no/strings.xml b/core/l10n/src/androidMain/res/values-no/strings.xml index aed76f08e..00de58d65 100644 --- a/core/l10n/src/androidMain/res/values-no/strings.xml +++ b/core/l10n/src/androidMain/res/values-no/strings.xml @@ -398,4 +398,5 @@ Rensing Merk som fremhevet (forekomst) Fjern merking som fremhevet (forekomst) + Sett foretrukket språk diff --git a/core/l10n/src/androidMain/res/values-pl/strings.xml b/core/l10n/src/androidMain/res/values-pl/strings.xml index db88a0ab8..f6c012110 100644 --- a/core/l10n/src/androidMain/res/values-pl/strings.xml +++ b/core/l10n/src/androidMain/res/values-pl/strings.xml @@ -398,4 +398,5 @@ Oczyszczać Oznacz jako polecane (instancja) Usuń oznaczenie jako polecane (instancja) + Ustaw preferowany język diff --git a/core/l10n/src/androidMain/res/values-pt-rBR/strings.xml b/core/l10n/src/androidMain/res/values-pt-rBR/strings.xml index c0e9f4e89..695a7256d 100644 --- a/core/l10n/src/androidMain/res/values-pt-rBR/strings.xml +++ b/core/l10n/src/androidMain/res/values-pt-rBR/strings.xml @@ -398,4 +398,5 @@ Purgar Marcar como destaque (instância) Desmarcar como destaque (instância) + Definir idioma preferido diff --git a/core/l10n/src/androidMain/res/values-pt/strings.xml b/core/l10n/src/androidMain/res/values-pt/strings.xml index 58a2b34f2..d082829d7 100755 --- a/core/l10n/src/androidMain/res/values-pt/strings.xml +++ b/core/l10n/src/androidMain/res/values-pt/strings.xml @@ -398,4 +398,5 @@ Purgar Marcar como destaque (instância) Desmarcar como destaque (instância) + Definir idioma preferido diff --git a/core/l10n/src/androidMain/res/values-ro/strings.xml b/core/l10n/src/androidMain/res/values-ro/strings.xml index 2ae9b93b9..f37bbd666 100755 --- a/core/l10n/src/androidMain/res/values-ro/strings.xml +++ b/core/l10n/src/androidMain/res/values-ro/strings.xml @@ -398,4 +398,5 @@ Epurează Marchează ca recomandat (instanță) Anulează marcare ca recomandat (instanță) + Setează limba preferată diff --git a/core/l10n/src/androidMain/res/values-ru/strings.xml b/core/l10n/src/androidMain/res/values-ru/strings.xml index f1dc3191f..77f05608e 100644 --- a/core/l10n/src/androidMain/res/values-ru/strings.xml +++ b/core/l10n/src/androidMain/res/values-ru/strings.xml @@ -397,4 +397,5 @@ Удалять Отметить как избранное (экземпляр) Снять пометку как избранное (экземпляр) + Установить предпочитаемый язык diff --git a/core/l10n/src/androidMain/res/values-se/strings.xml b/core/l10n/src/androidMain/res/values-se/strings.xml index 016e6abdf..4683f4e46 100644 --- a/core/l10n/src/androidMain/res/values-se/strings.xml +++ b/core/l10n/src/androidMain/res/values-se/strings.xml @@ -398,4 +398,5 @@ Rena Markera som utvald (instans) Avmarkera som utvald (instans) + Ställ in önskat språk diff --git a/core/l10n/src/androidMain/res/values-sk/strings.xml b/core/l10n/src/androidMain/res/values-sk/strings.xml index 0fbf1633a..1c8f5eaf8 100644 --- a/core/l10n/src/androidMain/res/values-sk/strings.xml +++ b/core/l10n/src/androidMain/res/values-sk/strings.xml @@ -398,5 +398,5 @@ Vyčistiť Označiť ako odporúčané (inštancia) Zrušiť označenie ako odporúčané (inštancia) - + Nastavenie preferovaného jazyka diff --git a/core/l10n/src/androidMain/res/values-sl/strings.xml b/core/l10n/src/androidMain/res/values-sl/strings.xml index 26a82cb4a..634b9048e 100644 --- a/core/l10n/src/androidMain/res/values-sl/strings.xml +++ b/core/l10n/src/androidMain/res/values-sl/strings.xml @@ -398,4 +398,5 @@ Čiščenje Označi kot predstavljeno (primer) Odznači kot predstavljeno (primer) + Nastavitev prednostnega jezika diff --git a/core/l10n/src/androidMain/res/values-sq/strings.xml b/core/l10n/src/androidMain/res/values-sq/strings.xml index f51c2f6b7..33ed1dccd 100644 --- a/core/l10n/src/androidMain/res/values-sq/strings.xml +++ b/core/l10n/src/androidMain/res/values-sq/strings.xml @@ -398,4 +398,5 @@ Pastrim Shëno si të paraqitur (shembull) Hiq shënimin si të paraqitur (shembull) + Cakto gjuhën e preferuar diff --git a/core/l10n/src/androidMain/res/values-sr/strings.xml b/core/l10n/src/androidMain/res/values-sr/strings.xml index a13e39011..46dd5735d 100755 --- a/core/l10n/src/androidMain/res/values-sr/strings.xml +++ b/core/l10n/src/androidMain/res/values-sr/strings.xml @@ -398,4 +398,5 @@ Чистка Означи као истакнуто (инстанца) Уклони ознаку као истакнуто (инстанца) + Подеси преферирани језик diff --git a/core/l10n/src/androidMain/res/values-tok/strings.xml b/core/l10n/src/androidMain/res/values-tok/strings.xml index 3fca62c1d..369947856 100755 --- a/core/l10n/src/androidMain/res/values-tok/strings.xml +++ b/core/l10n/src/androidMain/res/values-tok/strings.xml @@ -398,4 +398,5 @@ o weka kin o sitelen sama sewi (ilo nanpa) o sitelen ala sama sewi (ilo nanpa) + o anu e toki pi wile sina diff --git a/core/l10n/src/androidMain/res/values-tr/strings.xml b/core/l10n/src/androidMain/res/values-tr/strings.xml index 4dd7d0a98..2a033f6f6 100644 --- a/core/l10n/src/androidMain/res/values-tr/strings.xml +++ b/core/l10n/src/androidMain/res/values-tr/strings.xml @@ -398,4 +398,5 @@ Tasfiye Öne çıkan olarak işaretle (örnek) Öne çıkan işaretini kaldır (örnek) + Tercih edilen dili ayarla diff --git a/core/l10n/src/androidMain/res/values-uk/strings.xml b/core/l10n/src/androidMain/res/values-uk/strings.xml index c66ac90db..a61991f88 100644 --- a/core/l10n/src/androidMain/res/values-uk/strings.xml +++ b/core/l10n/src/androidMain/res/values-uk/strings.xml @@ -397,4 +397,5 @@ Чистка Позначити як рекомендоване (екземпляр) Скасувати позначення як рекомендованого (екземпляр) + Tercih edilen dili ayarla diff --git a/core/l10n/src/androidMain/res/values/strings.xml b/core/l10n/src/androidMain/res/values/strings.xml index 77739d91e..e7e7bd9cc 100755 --- a/core/l10n/src/androidMain/res/values/strings.xml +++ b/core/l10n/src/androidMain/res/values/strings.xml @@ -406,4 +406,5 @@ Purge Mark as featured (instance) Unmark as featured (instance) + Set preferred language diff --git a/core/persistence/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunityPreferredLanguageRepositoryTest.kt b/core/persistence/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunityPreferredLanguageRepositoryTest.kt new file mode 100644 index 000000000..84476fe6b --- /dev/null +++ b/core/persistence/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunityPreferredLanguageRepositoryTest.kt @@ -0,0 +1,108 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository + +import com.github.diegoberaldin.raccoonforlemmy.core.preferences.TemporaryKeyStore +import com.github.diegoberaldin.raccoonforlemmy.core.testutils.DispatcherTestRule +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import junit.framework.TestCase.assertNull +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test +import kotlin.test.assertEquals + +class DefaultCommunityPreferredLanguageRepositoryTest { + @get:Rule + val dispatcherTestRule = DispatcherTestRule() + + private val keyStore = mockk(relaxUnitFun = true) + + private val sut = DefaultCommunityPreferredLanguageRepository(keyStore = keyStore) + + @Test + fun givenEmptyInitialState_whenSave_thenValueIsStored() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf() + + sut.save("!raccoonforlemmy@lemmy.world", 1) + + verify { + keyStore.save(KEY, listOf("!raccoonforlemmy@lemmy.world:1")) + } + } + + @Test + fun givenCommunityAlreadyExisting_whenSave_thenValueIsStored() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!raccoonforlemmy@lemmy.world:0") + + sut.save("!raccoonforlemmy@lemmy.world", 1) + + verify { + keyStore.save(KEY, listOf("!raccoonforlemmy@lemmy.world:1")) + } + } + + @Test + fun givenCommunityAlreadyExisting_whenSaveNull_thenValueIsRemoved() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!raccoonforlemmy@lemmy.world:0") + + sut.save("!raccoonforlemmy@lemmy.world", null) + + verify { + keyStore.save(KEY, emptyList()) + } + } + + @Test + fun givenOtherCommunityAlreadyExisting_whenSave_thenBothValuesAreStored() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!test@lemmy.world:1") + + sut.save("!raccoonforlemmy@lemmy.world", 1) + + verify { + keyStore.save(KEY, listOf("!test@lemmy.world:1", "!raccoonforlemmy@lemmy.world:1")) + } + } + + @Test + fun givenOtherCommunityAlreadyExisting_whenSaveNull_thenValueIsRemovedButTheOtherIsNot() = + runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!test@lemmy.world:1") + + sut.save("!raccoonforlemmy@lemmy.world", null) + + verify { + keyStore.save(KEY, listOf("!test@lemmy.world:1")) + } + } + + @Test + fun givenEmptyInitialState_whenGet_thenResultIsAsExpected() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf() + + val res = sut.get("!raccoonforlemmy@lemmy.world") + + assertNull(res) + } + + @Test + fun givenCommunityExists_whenGet_thenResultIsAsExpected() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!raccoonforlemmy@lemmy.world:2") + + val res = sut.get("!raccoonforlemmy@lemmy.world") + + assertEquals(2, res) + } + + @Test + fun givenCommunityDoesNotExist_whenGet_thenResultIsAsExpected() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!test@lemmy.world:2") + + val res = sut.get("!raccoonforlemmy@lemmy.world") + + assertNull(res) + } + + companion object { + private const val KEY = "communityPreferredLanguage" + } +} diff --git a/core/persistence/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunitySortRepositoryTest.kt b/core/persistence/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunitySortRepositoryTest.kt index a0d095e98..bdf562635 100644 --- a/core/persistence/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunitySortRepositoryTest.kt +++ b/core/persistence/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunitySortRepositoryTest.kt @@ -6,6 +6,7 @@ import io.mockk.every import io.mockk.mockk import io.mockk.verify import junit.framework.TestCase.assertNull +import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test import kotlin.test.assertEquals @@ -19,62 +20,66 @@ class DefaultCommunitySortRepositoryTest { private val sut = DefaultCommunitySortRepository(keyStore = keyStore) @Test - fun givenEmptyInitialState_whenSaveSort_thenValueIsStored() { - every { keyStore.get("communitySort", listOf()) } returns listOf() + fun givenEmptyInitialState_whenSave_thenValueIsStored() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf() - sut.saveSort("!raccoonforlemmy@lemmy.world", 1) + sut.save("!raccoonforlemmy@lemmy.world", 1) verify { - keyStore.save("communitySort", listOf("!raccoonforlemmy@lemmy.world:1")) + keyStore.save(KEY, listOf("!raccoonforlemmy@lemmy.world:1")) } } @Test - fun givenCommunityAlreadyExisting_whenSaveSort_thenValueIsStored() { - every { keyStore.get("communitySort", listOf()) } returns listOf("!raccoonforlemmy@lemmy.world:0") + fun givenCommunityAlreadyExisting_whenSave_thenValueIsStored() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!raccoonforlemmy@lemmy.world:0") - sut.saveSort("!raccoonforlemmy@lemmy.world", 1) + sut.save("!raccoonforlemmy@lemmy.world", 1) verify { - keyStore.save("communitySort", listOf("!raccoonforlemmy@lemmy.world:1")) + keyStore.save(KEY, listOf("!raccoonforlemmy@lemmy.world:1")) } } @Test - fun givenOtherCommunityAlreadyExisting_whenSaveSort_thenBothValuesAreStored() { - every { keyStore.get("communitySort", listOf()) } returns listOf("!test@lemmy.world:1") + fun givenOtherCommunityAlreadyExisting_whenSave_thenBothValuesAreStored() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!test@lemmy.world:1") - sut.saveSort("!raccoonforlemmy@lemmy.world", 1) + sut.save("!raccoonforlemmy@lemmy.world", 1) verify { - keyStore.save("communitySort", listOf("!test@lemmy.world:1", "!raccoonforlemmy@lemmy.world:1")) + keyStore.save(KEY, listOf("!test@lemmy.world:1", "!raccoonforlemmy@lemmy.world:1")) } } @Test - fun givenEmptyInitialState_whenGet_thenResultIsAsExpected() { - every { keyStore.get("communitySort", listOf()) } returns listOf() + fun givenEmptyInitialState_whenGet_thenResultIsAsExpected() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf() - val res = sut.getSort("!raccoonforlemmy@lemmy.world") + val res = sut.get("!raccoonforlemmy@lemmy.world") assertNull(res) } @Test - fun givenCommunityExists_whenGet_thenResultIsAsExpected() { - every { keyStore.get("communitySort", listOf()) } returns listOf("!raccoonforlemmy@lemmy.world:2") + fun givenCommunityExists_whenGet_thenResultIsAsExpected() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!raccoonforlemmy@lemmy.world:2") - val res = sut.getSort("!raccoonforlemmy@lemmy.world") + val res = sut.get("!raccoonforlemmy@lemmy.world") assertEquals(2, res) } @Test - fun givenCommunityDoesNotExist_whenGet_thenResultIsAsExpected() { - every { keyStore.get("communitySort", listOf()) } returns listOf("!test@lemmy.world:2") + fun givenCommunityDoesNotExist_whenGet_thenResultIsAsExpected() = runTest { + every { keyStore.get(KEY, listOf()) } returns listOf("!test@lemmy.world:2") - val res = sut.getSort("!raccoonforlemmy@lemmy.world") + val res = sut.get("!raccoonforlemmy@lemmy.world") assertNull(res) } + + companion object { + private const val KEY = "communitySort" + } } diff --git a/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/di/CorePersistenceModule.kt b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/di/CorePersistenceModule.kt index 1ed1bca8f..67ab0f0d5 100644 --- a/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/di/CorePersistenceModule.kt +++ b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/di/CorePersistenceModule.kt @@ -3,8 +3,10 @@ package com.github.diegoberaldin.raccoonforlemmy.core.persistence.di import com.github.diegoberaldin.raccoonforlemmy.core.persistence.DatabaseProvider import com.github.diegoberaldin.raccoonforlemmy.core.persistence.DefaultDatabaseProvider import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunitySortRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.DefaultAccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.DefaultCommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.DefaultCommunitySortRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.DefaultDraftRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.DefaultFavoriteCommunityRepository @@ -66,6 +68,11 @@ val corePersistenceModule = keyStore = get(), ) } + single { + DefaultCommunityPreferredLanguageRepository( + keyStore = get(), + ) + } single { DefaultImportSettingsUseCase( settingsRepository = get(), diff --git a/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/CommunityPreferredLanguageRepository.kt b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/CommunityPreferredLanguageRepository.kt new file mode 100644 index 000000000..38a801dfc --- /dev/null +++ b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/CommunityPreferredLanguageRepository.kt @@ -0,0 +1,12 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository + +interface CommunityPreferredLanguageRepository { + suspend fun get(handle: String): Long? + + suspend fun save( + handle: String, + value: Long?, + ) + + suspend fun clear() +} \ No newline at end of file diff --git a/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/CommunitySortRepository.kt b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/CommunitySortRepository.kt index 0def85ee9..52098e2fe 100644 --- a/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/CommunitySortRepository.kt +++ b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/CommunitySortRepository.kt @@ -1,12 +1,12 @@ package com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository interface CommunitySortRepository { - fun getSort(handle: String): Int? + suspend fun get(handle: String): Int? - fun saveSort( + suspend fun save( handle: String, value: Int, ) - fun clear() + suspend fun clear() } diff --git a/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunityPreferredLanguageRepository.kt b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunityPreferredLanguageRepository.kt new file mode 100644 index 000000000..1a2e58a49 --- /dev/null +++ b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunityPreferredLanguageRepository.kt @@ -0,0 +1,52 @@ +package com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository + +import com.github.diegoberaldin.raccoonforlemmy.core.preferences.TemporaryKeyStore +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import kotlinx.coroutines.withContext + +private const val SETTINGS_KEY = "communityPreferredLanguage" + +internal class DefaultCommunityPreferredLanguageRepository( + private val keyStore: TemporaryKeyStore, +) : CommunityPreferredLanguageRepository { + + override suspend fun get(handle: String): Long? = withContext(Dispatchers.IO) { + val map = deserializeMap() + map[handle] + } + + override suspend fun save( + handle: String, + value: Long?, + ) = withContext(Dispatchers.IO) { + val map = deserializeMap() + if (value != null) { + map[handle] = value + } else { + map.remove(handle) + } + val newValue = serializeMap(map) + keyStore.save(SETTINGS_KEY, newValue) + } + + private fun deserializeMap(): MutableMap = + keyStore.get(SETTINGS_KEY, listOf()).mapNotNull { + it.split(":").takeIf { e -> e.size == 2 }?.let { e -> e[0] to e[1] } + }.let { pairs -> + val res = mutableMapOf() + for (pair in pairs) { + res[pair.first] = pair.second.toLong() + } + res + } + + private fun serializeMap(map: Map): List = + map.map { e -> + e.key + ":" + e.value + } + + override suspend fun clear() = withContext(Dispatchers.IO) { + keyStore.remove(SETTINGS_KEY) + } +} \ No newline at end of file diff --git a/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunitySortRepository.kt b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunitySortRepository.kt index 7942d4c43..d3a1db0d9 100644 --- a/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunitySortRepository.kt +++ b/core/persistence/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/core/persistence/repository/DefaultCommunitySortRepository.kt @@ -1,21 +1,24 @@ package com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository import com.github.diegoberaldin.raccoonforlemmy.core.preferences.TemporaryKeyStore +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import kotlinx.coroutines.withContext private const val SETTINGS_KEY = "communitySort" internal class DefaultCommunitySortRepository( private val keyStore: TemporaryKeyStore, ) : CommunitySortRepository { - override fun getSort(handle: String): Int? { + override suspend fun get(handle: String): Int? = withContext(Dispatchers.IO) { val map = deserializeMap() - return map[handle] + map[handle] } - override fun saveSort( + override suspend fun save( handle: String, value: Int, - ) { + ) = withContext(Dispatchers.IO) { val map = deserializeMap() map[handle] = value val newValue = serializeMap(map) @@ -38,7 +41,7 @@ internal class DefaultCommunitySortRepository( e.key + ":" + e.value } - override fun clear() { + override suspend fun clear() = withContext(Dispatchers.IO) { keyStore.remove(SETTINGS_KEY) } } diff --git a/domain/identity/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCaseTest.kt b/domain/identity/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCaseTest.kt index 9876b5693..e68d14386 100644 --- a/domain/identity/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCaseTest.kt +++ b/domain/identity/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCaseTest.kt @@ -4,6 +4,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.api.dto.LoginResponse import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.AccountModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.SettingsModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunitySortRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository import com.github.diegoberaldin.raccoonforlemmy.core.testutils.DispatcherTestRule @@ -36,6 +37,8 @@ class DefaultLoginUseCaseTest { private val settingsRepository = mockk(relaxUnitFun = true) private val siteRepository = mockk(relaxUnitFun = true) private val communitySortRepository = mockk(relaxUnitFun = true) + private val communityPreferredLanguageRepository = + mockk(relaxUnitFun = true) private val sut = DefaultLoginUseCase( authRepository = authRepository, @@ -45,6 +48,7 @@ class DefaultLoginUseCaseTest { settingsRepository = settingsRepository, siteRepository = siteRepository, communitySortRepository = communitySortRepository, + communityPreferredLanguageRepository = communityPreferredLanguageRepository, ) @Test @@ -184,6 +188,7 @@ class DefaultLoginUseCaseTest { accountRepository.setActive(accountId, true) settingsRepository.changeCurrentSettings(oldSettings) communitySortRepository.clear() + communityPreferredLanguageRepository.clear() } coVerify(inverse = true) { accountRepository.createAccount(any()) diff --git a/domain/identity/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCaseTest.kt b/domain/identity/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCaseTest.kt index ccec2eb77..6045f1120 100644 --- a/domain/identity/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCaseTest.kt +++ b/domain/identity/src/androidUnitTest/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCaseTest.kt @@ -6,6 +6,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationC import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.AccountModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.SettingsModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunitySortRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository import com.github.diegoberaldin.raccoonforlemmy.core.testutils.DispatcherTestRule @@ -27,6 +28,8 @@ class DefaultSwitchAccountUseCaseTest { private val serviceProvider = mockk(relaxUnitFun = true) private val notificationCenter = mockk(relaxUnitFun = true) private val communitySortRepository = mockk(relaxUnitFun = true) + private val communityPreferredLanguageRepository = + mockk(relaxUnitFun = true) private val sut = DefaultSwitchAccountUseCase( identityRepository = identityRepository, @@ -35,6 +38,7 @@ class DefaultSwitchAccountUseCaseTest { serviceProvider = serviceProvider, notificationCenter = notificationCenter, communitySortRepository = communitySortRepository, + communityPreferredLanguageRepository = communityPreferredLanguageRepository, ) @Test @@ -79,6 +83,7 @@ class DefaultSwitchAccountUseCaseTest { settingsRepository.getSettings(accountId) settingsRepository.changeCurrentSettings(newSettings) communitySortRepository.clear() + communityPreferredLanguageRepository.clear() notificationCenter.send(ofType(NotificationCenterEvent.Logout::class)) identityRepository.storeToken("new-token") identityRepository.refreshLoggedState() diff --git a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/di/IdentityModule.kt b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/di/IdentityModule.kt index e01cb476c..daf73e570 100644 --- a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/di/IdentityModule.kt +++ b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/di/IdentityModule.kt @@ -47,6 +47,7 @@ val coreIdentityModule = settingsRepository = get(), siteRepository = get(), communitySortRepository = get(), + communityPreferredLanguageRepository = get(), ) } single { @@ -66,6 +67,7 @@ val coreIdentityModule = serviceProvider = get(named("default")), notificationCenter = get(), communitySortRepository = get(), + communityPreferredLanguageRepository = get(), ) } single { diff --git a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCase.kt b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCase.kt index e77f0698f..0eb33f2d8 100644 --- a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCase.kt +++ b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCase.kt @@ -2,6 +2,7 @@ package com.github.diegoberaldin.raccoonforlemmy.domain.identity.usecase import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.AccountModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunitySortRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository import com.github.diegoberaldin.raccoonforlemmy.core.utils.debug.logDebug @@ -18,6 +19,7 @@ internal class DefaultLoginUseCase( private val settingsRepository: SettingsRepository, private val siteRepository: SiteRepository, private val communitySortRepository: CommunitySortRepository, + private val communityPreferredLanguageRepository: CommunityPreferredLanguageRepository, ) : LoginUseCase { override suspend operator fun invoke( instance: String, @@ -78,6 +80,7 @@ internal class DefaultLoginUseCase( accountRepository.setActive(id, true) communitySortRepository.clear() + communityPreferredLanguageRepository.clear() val newSettings = settingsRepository.getSettings(id) settingsRepository.changeCurrentSettings(newSettings) diff --git a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCase.kt b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCase.kt index 16edf127c..f0774ce44 100644 --- a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCase.kt +++ b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCase.kt @@ -5,6 +5,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationC import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.AccountModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunitySortRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository @@ -16,6 +17,7 @@ internal class DefaultSwitchAccountUseCase( private val notificationCenter: NotificationCenter, private val settingsRepository: SettingsRepository, private val communitySortRepository: CommunitySortRepository, + private val communityPreferredLanguageRepository: CommunityPreferredLanguageRepository, ) : SwitchAccountUseCase { override suspend fun invoke(account: AccountModel) { val accountId = account.id ?: return @@ -29,6 +31,7 @@ internal class DefaultSwitchAccountUseCase( notificationCenter.send(NotificationCenterEvent.Logout) communitySortRepository.clear() + communityPreferredLanguageRepository.clear() serviceProvider.changeInstance(instance) diff --git a/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailMviModel.kt b/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailMviModel.kt index cabe13dab..71a7a8b38 100644 --- a/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailMviModel.kt +++ b/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailMviModel.kt @@ -7,6 +7,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.appearance.data.VoteFormat import com.github.diegoberaldin.raccoonforlemmy.core.architecture.MviModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.ActionOnSwipe import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommunityModel +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.LanguageModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.PostModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.SortType import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel @@ -69,6 +70,8 @@ interface CommunityDetailMviModel : data object WillOpenDetail : Intent data object UnhideCommunity : Intent + + data class SelectPreferredLanguage(val languageId: Long?) : Intent } data class UiState( @@ -104,6 +107,8 @@ interface CommunityDetailMviModel : val fadeReadPosts: Boolean = false, val showUnreadComments: Boolean = false, val downVoteEnabled: Boolean = true, + val currentPreferredLanguageId: Long? = null, + val availableLanguages: List = emptyList(), ) sealed interface Effect { diff --git a/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailScreen.kt b/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailScreen.kt index 4e76e4c3b..8506f33ff 100644 --- a/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailScreen.kt +++ b/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailScreen.kt @@ -109,6 +109,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCard import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCardPlaceholder import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.CopyPostBottomSheet +import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SelectLanguageDialog import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ShareBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.l10n.LocalXmlStrings @@ -209,6 +210,7 @@ class CommunityDetailScreen( with(LocalDensity.current) { WindowInsets.statusBars.getTop(this) } + var selectLanguageDialogOpen by remember { mutableStateOf(false) } LaunchedEffect(model) { model.effects.onEach { effect -> @@ -368,6 +370,12 @@ class CommunityDetailScreen( OptionId.SetCustomSort, LocalXmlStrings.current.communitySetCustomSort, ) + if (uiState.isLogged) { + this += Option( + OptionId.SetPreferredLanguage, + LocalXmlStrings.current.communitySetPreferredLanguage, + ) + } this += Option( OptionId.InfoInstance, @@ -600,6 +608,10 @@ class CommunityDetailScreen( navigationCoordinator.pushScreen(screen) } + OptionId.SetPreferredLanguage -> { + selectLanguageDialogOpen = true + } + else -> Unit } }, @@ -1477,6 +1489,7 @@ class CommunityDetailScreen( if (quotation != null) { detailOpener.openReply( originalComment = content, + originalPost = PostModel(id = content.postId), initialText = buildString { append("> ") @@ -1520,5 +1533,21 @@ class CommunityDetailScreen( }, ) } + + if (selectLanguageDialogOpen) { + SelectLanguageDialog( + languages = uiState.availableLanguages, + currentLanguageId = uiState.currentPreferredLanguageId, + onSelect = + rememberCallbackArgs { langId -> + model.reduce(CommunityDetailMviModel.Intent.SelectPreferredLanguage(langId)) + selectLanguageDialogOpen = false + }, + onDismiss = + rememberCallback { + selectLanguageDialogOpen = false + }, + ) + } } } diff --git a/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailViewModel.kt b/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailViewModel.kt index 6383775aa..c06f5d8fd 100644 --- a/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailViewModel.kt +++ b/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/CommunityDetailViewModel.kt @@ -10,6 +10,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationC import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.FavoriteCommunityModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunitySortRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.FavoriteCommunityRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository @@ -64,6 +65,7 @@ class CommunityDetailViewModel( private val itemCache: LemmyItemCache, private val communitySortRepository: CommunitySortRepository, private val postNavigationManager: PostNavigationManager, + private val communityPreferredLanguageRepository: CommunityPreferredLanguageRepository, ) : CommunityDetailMviModel, DefaultMviModel( initialState = CommunityDetailMviModel.UiState(), @@ -79,8 +81,8 @@ class CommunityDetailViewModel( it.copy( community = community, instance = - otherInstance.takeIf { n -> n.isNotEmpty() } - ?: apiConfigurationRepository.instance.value, + otherInstance.takeIf { n -> n.isNotEmpty() } + ?: apiConfigurationRepository.instance.value, ) } } @@ -132,16 +134,16 @@ class CommunityDetailViewModel( updateState { it.copy( posts = - it.posts.map { p -> - if (p.id == postId) { - p.copy( - creator = newUser, - updateDate = newUser.updateDate, - ) - } else { - p - } - }, + it.posts.map { p -> + if (p.id == postId) { + p.copy( + creator = newUser, + updateDate = newUser.updateDate, + ) + } else { + p + } + }, ) } }.launchIn(this) @@ -153,12 +155,12 @@ class CommunityDetailViewModel( handlePostUpdate(newPost) } }.launchIn(this) + val communityHandle = uiState.value.community.readableHandle notificationCenter.subscribe(NotificationCenterEvent.ChangeSortType::class) .onEach { evt -> - if (evt.screenKey == uiState.value.community.readableHandle) { + if (evt.screenKey == communityHandle) { if (evt.defaultForCommunity) { - val handle = uiState.value.community.readableHandle - communitySortRepository.saveSort(handle, evt.value.toInt()) + communitySortRepository.save(communityHandle, evt.value.toInt()) } applySortType(evt.value) } @@ -189,10 +191,20 @@ class CommunityDetailViewModel( } } if (uiState.value.initial) { - val defaultPostSortType = settingsRepository.currentSettings.value.defaultPostSortType.toSortType() + val defaultPostSortType = + settingsRepository.currentSettings.value.defaultPostSortType.toSortType() val customPostSortType = - communitySortRepository.getSort(uiState.value.community.readableHandle)?.toSortType() - updateState { it.copy(sortType = customPostSortType ?: defaultPostSortType) } + communitySortRepository.get(communityHandle)?.toSortType() + val preferredLanguageId = communityPreferredLanguageRepository.get(communityHandle) + val auth = identityRepository.authToken.value.orEmpty() + val languages = siteRepository.getLanguages(auth) + updateState { + it.copy( + sortType = customPostSortType ?: defaultPostSortType, + currentPreferredLanguageId = preferredLanguageId, + availableLanguages = languages, + ) + } refresh(initial = true) } } @@ -330,6 +342,10 @@ class CommunityDetailViewModel( CommunityDetailMviModel.Intent.UnhideCommunity -> { unhideCommunity() } + + is CommunityDetailMviModel.Intent.SelectPreferredLanguage -> { + updatePreferredLanguage(intent.languageId) + } } } @@ -356,7 +372,8 @@ class CommunityDetailViewModel( } val auth = identityRepository.authToken.value val accountId = accountRepository.getActive()?.id - val isFavorite = favoriteCommunityRepository.getBy(accountId, currentState.community.id) != null + val isFavorite = + favoriteCommunityRepository.getBy(accountId, currentState.community.id) != null val refreshedCommunity = communityRepository.get( auth = auth, @@ -553,7 +570,11 @@ class CommunityDetailViewModel( ) if (community != null) { updateState { it.copy(community = community) } - notificationCenter.send(NotificationCenterEvent.CommunitySubscriptionChanged(community)) + notificationCenter.send( + NotificationCenterEvent.CommunitySubscriptionChanged( + community + ) + ) } } } @@ -568,7 +589,11 @@ class CommunityDetailViewModel( ) if (community != null) { updateState { it.copy(community = community) } - notificationCenter.send(NotificationCenterEvent.CommunitySubscriptionChanged(community)) + notificationCenter.send( + NotificationCenterEvent.CommunitySubscriptionChanged( + community + ) + ) } } } @@ -578,13 +603,13 @@ class CommunityDetailViewModel( updateState { it.copy( posts = - it.posts.map { p -> - if (p.id == post.id) { - post - } else { - p - } - }, + it.posts.map { p -> + if (p.id == post.id) { + post + } else { + p + } + }, ) } } @@ -759,4 +784,14 @@ class CommunityDetailViewModel( } } } + + private fun updatePreferredLanguage(languageId: Long?) { + screenModelScope.launch { + val communityHandle = uiState.value.community.readableHandle + communityPreferredLanguageRepository.save(handle = communityHandle, value = languageId) + updateState { + it.copy(currentPreferredLanguageId = languageId) + } + } + } } diff --git a/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/di/CommunityDetailModule.kt b/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/di/CommunityDetailModule.kt index 54bf40a9f..788383ebf 100644 --- a/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/di/CommunityDetailModule.kt +++ b/unit/communitydetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/communitydetail/di/CommunityDetailModule.kt @@ -29,6 +29,7 @@ val communityDetailModule = communitySortRepository = get(), postPaginationManager = get(), postNavigationManager = get(), + communityPreferredLanguageRepository = get(), ) } } diff --git a/unit/createcomment/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createcomment/CreateCommentViewModel.kt b/unit/createcomment/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createcomment/CreateCommentViewModel.kt index 830c82bea..e4aae76b9 100644 --- a/unit/createcomment/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createcomment/CreateCommentViewModel.kt +++ b/unit/createcomment/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createcomment/CreateCommentViewModel.kt @@ -8,11 +8,13 @@ import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationC import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.DraftModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.DraftType import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.DraftRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository import com.github.diegoberaldin.raccoonforlemmy.core.utils.ValidationError import com.github.diegoberaldin.raccoonforlemmy.core.utils.datetime.epochMillis import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.readableHandle import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.CommentRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.LemmyItemCache import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.PostRepository @@ -36,6 +38,7 @@ class CreateCommentViewModel( private val itemCache: LemmyItemCache, private val accountRepository: AccountRepository, private val draftRepository: DraftRepository, + private val communityPreferredLanguageRepository: CommunityPreferredLanguageRepository, ) : CreateCommentMviModel, DefaultMviModel( initialState = CreateCommentMviModel.UiState(), @@ -61,6 +64,8 @@ class CreateCommentViewModel( } else { originalCommentFromCache } + val communityHandle = originalPost?.community?.readableHandle.orEmpty() + val preferredLanguageId = communityPreferredLanguageRepository.get(communityHandle) updateState { it.copy( originalPost = originalPost, @@ -97,7 +102,7 @@ class CreateCommentViewModel( fullHeightImages = settings.fullHeightImages, fullWidthImages = settings.fullWidthImages, showScores = settings.showScores, - currentLanguageId = settings.defaultLanguageId, + currentLanguageId = preferredLanguageId ?: settings.defaultLanguageId, ) } }.launchIn(this) diff --git a/unit/createcomment/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createcomment/di/CreateCommentModule.kt b/unit/createcomment/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createcomment/di/CreateCommentModule.kt index bef1c2514..af31e9654 100644 --- a/unit/createcomment/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createcomment/di/CreateCommentModule.kt +++ b/unit/createcomment/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createcomment/di/CreateCommentModule.kt @@ -22,6 +22,7 @@ val createCommentModule = itemCache = get(), accountRepository = get(), draftRepository = get(), + communityPreferredLanguageRepository = get(), ) } } diff --git a/unit/createpost/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createpost/CreatePostViewModel.kt b/unit/createpost/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createpost/CreatePostViewModel.kt index 72af772b3..0d76ee451 100644 --- a/unit/createpost/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createpost/CreatePostViewModel.kt +++ b/unit/createpost/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createpost/CreatePostViewModel.kt @@ -8,6 +8,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationC import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.DraftModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.DraftType import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository +import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.CommunityPreferredLanguageRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.DraftRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.SettingsRepository import com.github.diegoberaldin.raccoonforlemmy.core.utils.ValidationError @@ -15,6 +16,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.utils.datetime.epochMillis import com.github.diegoberaldin.raccoonforlemmy.core.utils.isValidUrl import com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository.IdentityRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.CommunityModel +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.readableHandle import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.readableName import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.CommunityRepository import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.LemmyItemCache @@ -38,6 +40,7 @@ class CreatePostViewModel( private val accountRepository: AccountRepository, private val draftRepository: DraftRepository, private val notificationCenter: NotificationCenter, + private val communityPreferredLanguageRepository: CommunityPreferredLanguageRepository, ) : CreatePostMviModel, DefaultMviModel( initialState = CreatePostMviModel.UiState(), @@ -66,7 +69,6 @@ class CreatePostViewModel( fullHeightImages = settings.fullHeightImages, fullWidthImages = settings.fullWidthImages, showScores = settings.showScores, - currentLanguageId = settings.defaultLanguageId, ) } }.launchIn(this) @@ -141,6 +143,7 @@ class CreatePostViewModel( it.copy(currentLanguageId = intent.value) } } + is CreatePostMviModel.Intent.ChangeBodyValue -> screenModelScope.launch { updateState { @@ -159,17 +162,25 @@ class CreatePostViewModel( val preferNicknames = uiState.value.preferNicknames val communityId = community.id val name = community.readableName(preferNicknames) - val auth = identityRepository.authToken.value.orEmpty() + screenModelScope.launch { - val communityInfo = - name.ifEmpty { - val remoteCommunity = communityRepository.get(auth = auth, id = communityId) - remoteCommunity?.name.orEmpty() - } + val (actualName, actualHandle) = if (name.isEmpty()) { + val auth = identityRepository.authToken.value.orEmpty() + val remoteCommunity = communityRepository.get(auth = auth, id = communityId) + remoteCommunity?.name.orEmpty() to remoteCommunity?.readableHandle.orEmpty() + } else { + name to community.readableHandle + } + + val preferredLanguageId = + communityPreferredLanguageRepository.get(actualHandle) + val defaultLanguageId = settingsRepository.currentSettings.value.defaultLanguageId + updateState { it.copy( communityId = communityId, - communityInfo = communityInfo, + communityInfo = actualName, + currentLanguageId = preferredLanguageId ?: defaultLanguageId, ) } } diff --git a/unit/createpost/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createpost/di/CreatePostModule.kt b/unit/createpost/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createpost/di/CreatePostModule.kt index 8974f9157..505a5d9b2 100644 --- a/unit/createpost/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createpost/di/CreatePostModule.kt +++ b/unit/createpost/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/createpost/di/CreatePostModule.kt @@ -21,6 +21,7 @@ val createPostModule = accountRepository = get(), draftRepository = get(), notificationCenter = get(), + communityPreferredLanguageRepository = get(), ) } } diff --git a/unit/drafts/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/drafts/DraftsScreen.kt b/unit/drafts/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/drafts/DraftsScreen.kt index 113edecfe..ac76fae8c 100644 --- a/unit/drafts/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/drafts/DraftsScreen.kt +++ b/unit/drafts/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/drafts/DraftsScreen.kt @@ -269,10 +269,9 @@ class DraftsScreen : Screen { rememberCallback { detailOpener.openReply( draftId = draft.id, - originalPost = - draft.postId?.let { - PostModel(id = it) - }, + originalPost = PostModel( + id = draft.postId ?: 0 + ), originalComment = draft.parentId?.let { CommentModel(id = it, text = "") diff --git a/unit/explore/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/explore/ExploreScreen.kt b/unit/explore/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/explore/ExploreScreen.kt index 361fd5e7a..2d56bd194 100644 --- a/unit/explore/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/explore/ExploreScreen.kt +++ b/unit/explore/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/explore/ExploreScreen.kt @@ -413,7 +413,9 @@ class ExploreScreen( ?: defaultReplyColor, onTriggered = rememberCallback { - detailOpener.openReply(originalPost = result.model) + detailOpener.openReply( + originalPost = result.model, + ) }, ) diff --git a/unit/filteredcontents/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/filteredcontents/FilteredContentsScreen.kt b/unit/filteredcontents/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/filteredcontents/FilteredContentsScreen.kt index 4da8cb629..09c237020 100644 --- a/unit/filteredcontents/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/filteredcontents/FilteredContentsScreen.kt +++ b/unit/filteredcontents/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/filteredcontents/FilteredContentsScreen.kt @@ -744,7 +744,10 @@ class FilteredContentsScreen( backgroundColor = replyColor ?: defaultReplyColor, onTriggered = rememberCallback { - detailOpener.openReply(originalComment = comment) + detailOpener.openReply( + originalPost = PostModel(comment.postId), + originalComment = comment, + ) }, ) @@ -822,7 +825,10 @@ class FilteredContentsScreen( }, onReply = rememberCallback { - detailOpener.openReply(originalComment = comment) + detailOpener.openReply( + originalPost = PostModel(id = comment.postId), + originalComment = comment, + ) }, options = buildList { @@ -1028,6 +1034,7 @@ class FilteredContentsScreen( rawContent = null if (quotation != null) { detailOpener.openReply( + originalPost = PostModel(id = content.postId), originalComment = content, initialText = buildString { diff --git a/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedScreen.kt b/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedScreen.kt index 27cd0667e..1298849de 100644 --- a/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedScreen.kt +++ b/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedScreen.kt @@ -501,6 +501,7 @@ object ProfileLoggedScreen : Tab { OptionId.Edit -> { detailOpener.openReply( + originalPost = PostModel(id = comment.postId), editedComment = comment, ) } @@ -635,6 +636,7 @@ object ProfileLoggedScreen : Tab { rawContent = null if (quotation != null) { detailOpener.openReply( + originalPost = PostModel(id = content.postId), originalComment = content, initialText = buildString { diff --git a/unit/postdetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/postdetail/PostDetailScreen.kt b/unit/postdetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/postdetail/PostDetailScreen.kt index adc49f387..29cb64974 100644 --- a/unit/postdetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/postdetail/PostDetailScreen.kt +++ b/unit/postdetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/postdetail/PostDetailScreen.kt @@ -1343,6 +1343,7 @@ class PostDetailScreen( OptionId.Edit -> { detailOpener.openReply( + originalPost = PostModel(id = comment.postId), editedComment = comment, ) } @@ -1583,6 +1584,7 @@ class PostDetailScreen( OptionId.Edit -> { detailOpener.openReply( + originalPost = PostModel(id = comment.postId), editedComment = comment, ) } diff --git a/unit/userdetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/userdetail/UserDetailScreen.kt b/unit/userdetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/userdetail/UserDetailScreen.kt index c27915a11..8e085de7b 100644 --- a/unit/userdetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/userdetail/UserDetailScreen.kt +++ b/unit/userdetail/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/userdetail/UserDetailScreen.kt @@ -1277,6 +1277,7 @@ class UserDetailScreen( rawContent = null if (quotation != null) { detailOpener.openReply( + originalPost = PostModel(id = content.id), originalComment = content, initialText = buildString {