feat: share dialog (#372); closes #352

* fix: bottom sheet title position

* feat: new bottom sheet

* feat: use bottom sheet to share

* chore: update viewmodels

* fix: avoid sharing multiple times same URL
This commit is contained in:
Diego Beraldin 2023-12-25 02:27:02 +01:00 committed by GitHub
parent fd80fd20ae
commit 8d4decf608
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 364 additions and 235 deletions

View File

@ -52,11 +52,15 @@ class BlockBottomSheet(
verticalArrangement = Arrangement.spacedBy(Spacing.s), verticalArrangement = Arrangement.spacedBy(Spacing.s),
) { ) {
Column( Column(
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally,
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.community_detail_block), text = stringResource(MR.strings.community_detail_block),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -62,7 +62,11 @@ class ColorBottomSheet : Screen {
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_custom_seed_color), text = stringResource(MR.strings.settings_custom_seed_color),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -53,7 +53,11 @@ class CommentBarThemeBottomSheet : Screen {
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_comment_bar_theme), text = stringResource(MR.strings.settings_comment_bar_theme),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -56,7 +56,11 @@ class DurationBottomSheet(
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_zombie_mode_interval), text = stringResource(MR.strings.settings_zombie_mode_interval),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -59,7 +59,11 @@ class FontFamilyBottomSheet(
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_ui_font_family), text = stringResource(MR.strings.settings_ui_font_family),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -59,7 +59,11 @@ class FontScaleBottomSheet(
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_content_font_scale), text = stringResource(MR.strings.settings_content_font_scale),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -45,7 +45,11 @@ class InboxTypeSheet : Screen {
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.inbox_listing_type_title), text = stringResource(MR.strings.inbox_listing_type_title),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -48,7 +48,11 @@ class LanguageBottomSheet : Screen {
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_language), text = stringResource(MR.strings.settings_language),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -54,7 +54,11 @@ class ListingTypeBottomSheet(
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.home_listing_title), text = stringResource(MR.strings.home_listing_title),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -47,7 +47,11 @@ class PostLayoutBottomSheet : Screen {
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_post_layout), text = stringResource(MR.strings.settings_post_layout),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -53,7 +53,7 @@ fun RawContentDialog(
val shareHelper = remember { getShareHelper() } val shareHelper = remember { getShareHelper() }
val onShareLambda = rememberCallback { val onShareLambda = rememberCallback {
val query = clipboardManager.getText()?.text.orEmpty() val query = clipboardManager.getText()?.text.orEmpty()
shareHelper.share(query, "text/plain") shareHelper.share(query)
} }
val onQuoteLambda = rememberCallback { val onQuoteLambda = rememberCallback {
val query = clipboardManager.getText()?.text.orEmpty() val query = clipboardManager.getText()?.text.orEmpty()

View File

@ -45,7 +45,11 @@ class ReportListTypeSheet : Screen {
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.report_list_type_title), text = stringResource(MR.strings.report_list_type_title),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -0,0 +1,87 @@
package com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import cafe.adriel.voyager.core.screen.Screen
import com.github.diegoberaldin.raccoonforlemmy.core.appearance.theme.Spacing
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.components.BottomSheetHandle
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotificationCenter
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.onClick
import com.github.diegoberaldin.raccoonforlemmy.core.utils.compose.rememberCallback
import com.github.diegoberaldin.raccoonforlemmy.resources.MR
import dev.icerock.moko.resources.compose.stringResource
class ShareBottomSheet(
private val urls: List<String>,
) : Screen {
@Composable
override fun Content() {
val navigationCoordinator = remember { getNavigationCoordinator() }
val notificationCenter = remember { getNotificationCenter() }
Column(
modifier = Modifier.padding(
top = Spacing.s,
start = Spacing.s,
end = Spacing.s,
bottom = Spacing.m,
),
verticalArrangement = Arrangement.spacedBy(Spacing.s),
) {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
) {
BottomSheetHandle()
Text(
modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.post_action_share),
style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground,
)
Column(
modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(Spacing.xxxs),
) {
for (value in urls) {
Row(
modifier = Modifier.padding(
horizontal = Spacing.s,
vertical = Spacing.m,
).fillMaxWidth().onClick(
onClick = rememberCallback {
val event = NotificationCenterEvent.Share(value)
notificationCenter.send(event)
navigationCoordinator.hideBottomSheet()
},
),
) {
Text(
text = value,
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onBackground,
)
}
}
}
}
}
}
}

View File

@ -51,7 +51,11 @@ class SliderBottomSheet(
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_zombie_mode_scroll_amount), text = stringResource(MR.strings.settings_zombie_mode_scroll_amount),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -85,7 +85,11 @@ internal class SortBottomSheetMain(
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.home_sort_title), text = stringResource(MR.strings.home_sort_title),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,
@ -189,7 +193,11 @@ internal class SortBottomSheetTop(
contentDescription = null, contentDescription = null,
) )
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = SortType.Top.Generic.toReadableName() + "", text = SortType.Top.Generic.toReadableName() + "",
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -52,7 +52,11 @@ class ThemeBottomSheet : Screen {
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_ui_theme), text = stringResource(MR.strings.settings_ui_theme),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -47,7 +47,11 @@ class VoteFormatBottomSheet : Screen {
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = stringResource(MR.strings.settings_vote_format), text = stringResource(MR.strings.settings_vote_format),
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onBackground, color = MaterialTheme.colorScheme.onBackground,

View File

@ -71,7 +71,11 @@ class VoteThemeBottomSheet(
) { ) {
BottomSheetHandle() BottomSheetHandle()
Text( Text(
modifier = Modifier.padding(start = Spacing.s, top = Spacing.s), modifier = Modifier.padding(
start = Spacing.s,
top = Spacing.s,
end = Spacing.s,
),
text = if (downvote) { text = if (downvote) {
stringResource(MR.strings.settings_downvote_color) stringResource(MR.strings.settings_downvote_color)
} else { } else {

View File

@ -58,4 +58,6 @@ sealed interface NotificationCenterEvent {
val communityId: Int? = null, val communityId: Int? = null,
val instanceId: Int? = null, val instanceId: Int? = null,
) : NotificationCenterEvent ) : NotificationCenterEvent
data class Share(val url: String) : NotificationCenterEvent
} }

View File

@ -5,7 +5,7 @@ import org.koin.core.module.Module
@Stable @Stable
interface ShareHelper { interface ShareHelper {
fun share(url: String, mimeType: String) fun share(url: String, mimeType: String = "text/plain")
} }
expect val shareHelperModule: Module expect val shareHelperModule: Module

View File

@ -49,7 +49,6 @@ interface SettingsMviModel :
data class ChangeZombieModeScrollAmount(val value: Float) : Intent data class ChangeZombieModeScrollAmount(val value: Float) : Intent
data class ChangeMarkAsReadWhileScrolling(val value: Boolean) : Intent data class ChangeMarkAsReadWhileScrolling(val value: Boolean) : Intent
data class ChangeDefaultInboxUnreadOnly(val value: Boolean) : Intent data class ChangeDefaultInboxUnreadOnly(val value: Boolean) : Intent
data class ChangeSharePostOriginal(val value: Boolean) : Intent
data class ChangeSearchPostTitleOnly(val value: Boolean) : Intent data class ChangeSearchPostTitleOnly(val value: Boolean) : Intent
} }
@ -89,7 +88,6 @@ interface SettingsMviModel :
val availableSortTypesForPosts: List<SortType> = emptyList(), val availableSortTypesForPosts: List<SortType> = emptyList(),
val availableSortTypesForComments: List<SortType> = emptyList(), val availableSortTypesForComments: List<SortType> = emptyList(),
val commentBarTheme: CommentBarTheme = CommentBarTheme.Blue, val commentBarTheme: CommentBarTheme = CommentBarTheme.Blue,
val sharePostOriginal: Boolean = true,
val searchPostTitleOnly: Boolean = false, val searchPostTitleOnly: Boolean = false,
) )

View File

@ -539,17 +539,6 @@ class SettingsScreen : Screen {
}, },
) )
// share posts from original instance
SettingsSwitchRow(
title = stringResource(MR.strings.settings_share_post_original),
value = uiState.sharePostOriginal,
onValueChanged = rememberCallbackArgs(model) { value ->
model.reduce(
SettingsMviModel.Intent.ChangeSharePostOriginal(value)
)
},
)
// search posts only in title // search posts only in title
SettingsSwitchRow( SettingsSwitchRow(
title = stringResource(MR.strings.settings_search_posts_title_only), title = stringResource(MR.strings.settings_search_posts_title_only),

View File

@ -334,10 +334,6 @@ class SettingsViewModel(
changeDefaultInboxUnreadOnly(intent.value) changeDefaultInboxUnreadOnly(intent.value)
} }
is SettingsMviModel.Intent.ChangeSharePostOriginal -> {
changeSharePostOriginal(intent.value)
}
is SettingsMviModel.Intent.ChangeSearchPostTitleOnly -> { is SettingsMviModel.Intent.ChangeSearchPostTitleOnly -> {
changeSearchPostTitleOnly(intent.value) changeSearchPostTitleOnly(intent.value)
} }
@ -654,16 +650,6 @@ class SettingsViewModel(
} }
} }
private fun changeSharePostOriginal(value: Boolean) {
mvi.updateState { it.copy(sharePostOriginal = value) }
mvi.scope?.launch {
val settings = settingsRepository.currentSettings.value.copy(
sharePostOriginal = value
)
saveSettings(settings)
}
}
private fun changeSearchPostTitleOnly(value: Boolean) { private fun changeSearchPostTitleOnly(value: Boolean) {
mvi.updateState { it.copy(searchPostTitleOnly = value) } mvi.updateState { it.copy(searchPostTitleOnly = value) }
mvi.scope?.launch { mvi.scope?.launch {

View File

@ -256,7 +256,6 @@
<string name="settings_comment_bar_theme_red">🍓 الفراولة</string> <string name="settings_comment_bar_theme_red">🍓 الفراولة</string>
<string name="settings_comment_bar_theme_multi">🌈 قوس المطر</string> <string name="settings_comment_bar_theme_multi">🌈 قوس المطر</string>
<string name="message_confirm_exit">ضغط على 🔙 مرة أخرى للخروج</string> <string name="message_confirm_exit">ضغط على 🔙 مرة أخرى للخروج</string>
<string name="settings_share_post_original">مشاركة المشاركات من المثيل الأصلي</string>
<string name="community_action_unsubscribe">إلغاء الاشتراك</string> <string name="community_action_unsubscribe">إلغاء الاشتراك</string>
<string name="settings_search_posts_title_only">البحث عن المشاركات فقط في العنوان</string> <string name="settings_search_posts_title_only">البحث عن المشاركات فقط في العنوان</string>
<string name="settings_content_font_family">عائلة خطوط المحتوى</string> <string name="settings_content_font_family">عائلة خطوط المحتوى</string>

View File

@ -287,7 +287,6 @@
<string name="settings_comment_bar_theme_red">🍓 Strawberry</string> <string name="settings_comment_bar_theme_red">🍓 Strawberry</string>
<string name="settings_comment_bar_theme_multi">🌈 Rainbow</string> <string name="settings_comment_bar_theme_multi">🌈 Rainbow</string>
<string name="message_confirm_exit">Tap 🔙 again to exit</string> <string name="message_confirm_exit">Tap 🔙 again to exit</string>
<string name="settings_share_post_original">Share posts from original instance</string>
<string name="community_action_unsubscribe">Unsubscribe</string> <string name="community_action_unsubscribe">Unsubscribe</string>
<string name="settings_search_posts_title_only">Search posts only in title</string> <string name="settings_search_posts_title_only">Search posts only in title</string>
<string name="settings_content_font_family">Content font family</string> <string name="settings_content_font_family">Content font family</string>

View File

@ -266,8 +266,6 @@
<string name="settings_comment_bar_theme_red">🍓 Ягода</string> <string name="settings_comment_bar_theme_red">🍓 Ягода</string>
<string name="settings_comment_bar_theme_multi">🌈 дъга</string> <string name="settings_comment_bar_theme_multi">🌈 дъга</string>
<string name="message_confirm_exit">Докоснете 🔙 отново, за да излезете</string> <string name="message_confirm_exit">Докоснете 🔙 отново, за да излезете</string>
<string name="settings_share_post_original">Споделяйте публикации от оригиналния екземпляр
</string>
<string name="community_action_unsubscribe">Отписване</string> <string name="community_action_unsubscribe">Отписване</string>
<string name="settings_search_posts_title_only">Търсете публикации само в заглавието</string> <string name="settings_search_posts_title_only">Търсете публикации само в заглавието</string>
<string name="settings_content_font_family">Семейство шрифтове за съдържание</string> <string name="settings_content_font_family">Семейство шрифтове за съдържание</string>

View File

@ -258,7 +258,6 @@
<string name="settings_comment_bar_theme_red">🍓 Jahoda</string> <string name="settings_comment_bar_theme_red">🍓 Jahoda</string>
<string name="settings_comment_bar_theme_multi">🌈 Duha</string> <string name="settings_comment_bar_theme_multi">🌈 Duha</string>
<string name="message_confirm_exit">Pro ukončení klepněte znovu na 🔙</string> <string name="message_confirm_exit">Pro ukončení klepněte znovu na 🔙</string>
<string name="settings_share_post_original">Sdílejte příspěvky z původní instance</string>
<string name="community_action_unsubscribe">Odhlásit odběr</string> <string name="community_action_unsubscribe">Odhlásit odběr</string>
<string name="settings_search_posts_title_only">Hledejte příspěvky pouze v názvu</string> <string name="settings_search_posts_title_only">Hledejte příspěvky pouze v názvu</string>
<string name="settings_content_font_family">Rodina písem obsahu</string> <string name="settings_content_font_family">Rodina písem obsahu</string>

View File

@ -258,7 +258,6 @@
<string name="settings_comment_bar_theme_red">🍓 Jordbær</string> <string name="settings_comment_bar_theme_red">🍓 Jordbær</string>
<string name="settings_comment_bar_theme_multi">🌈 Regnbue</string> <string name="settings_comment_bar_theme_multi">🌈 Regnbue</string>
<string name="message_confirm_exit">Tryk på 🔙 igen for at afslutte</string> <string name="message_confirm_exit">Tryk på 🔙 igen for at afslutte</string>
<string name="settings_share_post_original">Del indlæg fra den oprindelige instans</string>
<string name="community_action_unsubscribe">Opsige abonnement</string> <string name="community_action_unsubscribe">Opsige abonnement</string>
<string name="settings_search_posts_title_only">Søg kun efter indlæg i titlen</string> <string name="settings_search_posts_title_only">Søg kun efter indlæg i titlen</string>
<string name="settings_content_font_family">Indhold skrifttypefamilie</string> <string name="settings_content_font_family">Indhold skrifttypefamilie</string>

View File

@ -264,7 +264,6 @@
<string name="settings_comment_bar_theme_red">🍓 Erdbeere</string> <string name="settings_comment_bar_theme_red">🍓 Erdbeere</string>
<string name="settings_comment_bar_theme_multi">🌈 Regenbogen</string> <string name="settings_comment_bar_theme_multi">🌈 Regenbogen</string>
<string name="message_confirm_exit">Tippen Sie erneut auf 🔙, um den Vorgang zu beenden</string> <string name="message_confirm_exit">Tippen Sie erneut auf 🔙, um den Vorgang zu beenden</string>
<string name="settings_share_post_original">Teilen Sie Beiträge von der Originalinstanz</string>
<string name="community_action_unsubscribe">Abbestellen</string> <string name="community_action_unsubscribe">Abbestellen</string>
<string name="settings_search_posts_title_only">Durchsuchen Sie Beiträge nur nach Titel</string> <string name="settings_search_posts_title_only">Durchsuchen Sie Beiträge nur nach Titel</string>
<string name="settings_content_font_family">Content-Schriftfamilie</string> <string name="settings_content_font_family">Content-Schriftfamilie</string>

View File

@ -267,8 +267,6 @@
<string name="settings_comment_bar_theme_red">🍓 Φράουλα</string> <string name="settings_comment_bar_theme_red">🍓 Φράουλα</string>
<string name="settings_comment_bar_theme_multi">🌈 Ουράνιο τόξο</string> <string name="settings_comment_bar_theme_multi">🌈 Ουράνιο τόξο</string>
<string name="message_confirm_exit">Πατήστε ξανά 🔙 για έξοδο</string> <string name="message_confirm_exit">Πατήστε ξανά 🔙 για έξοδο</string>
<string name="settings_share_post_original">Μοιραστείτε αναρτήσεις από το αρχικό παράδειγμα
</string>
<string name="community_action_unsubscribe">Απεγγραφή</string> <string name="community_action_unsubscribe">Απεγγραφή</string>
<string name="settings_search_posts_title_only">Αναζήτηση αναρτήσεων μόνο στον τίτλο</string> <string name="settings_search_posts_title_only">Αναζήτηση αναρτήσεων μόνο στον τίτλο</string>
<string name="settings_content_font_family">Γραμματοσειρά περιεχομένων</string> <string name="settings_content_font_family">Γραμματοσειρά περιεχομένων</string>

View File

@ -257,7 +257,6 @@
<string name="settings_comment_bar_theme_red">🍓 Frago</string> <string name="settings_comment_bar_theme_red">🍓 Frago</string>
<string name="settings_comment_bar_theme_multi">🌈 Ĉielarko</string> <string name="settings_comment_bar_theme_multi">🌈 Ĉielarko</string>
<string name="message_confirm_exit">Frapu 🔙 denove por eliri</string> <string name="message_confirm_exit">Frapu 🔙 denove por eliri</string>
<string name="settings_share_post_original">Kunhavigi afiŝojn de origina nodo</string>
<string name="community_action_unsubscribe">Malaboni</string> <string name="community_action_unsubscribe">Malaboni</string>
<string name="settings_search_posts_title_only">Serĉi afiŝojn nur en titolo</string> <string name="settings_search_posts_title_only">Serĉi afiŝojn nur en titolo</string>
<string name="settings_content_font_family">Enhavo tiparo</string> <string name="settings_content_font_family">Enhavo tiparo</string>

View File

@ -262,9 +262,6 @@
<string name="settings_comment_bar_theme_red">🍓 Fresa</string> <string name="settings_comment_bar_theme_red">🍓 Fresa</string>
<string name="settings_comment_bar_theme_multi">🌈 Arcoíris</string> <string name="settings_comment_bar_theme_multi">🌈 Arcoíris</string>
<string name="message_confirm_exit">Tocar 🔙 nuevamente para salir</string> <string name="message_confirm_exit">Tocar 🔙 nuevamente para salir</string>
<string name="settings_share_post_original">Compartir publicaciones desde la instancia
original
</string>
<string name="community_action_unsubscribe">Cancelar suscripción</string> <string name="community_action_unsubscribe">Cancelar suscripción</string>
<string name="settings_search_posts_title_only">Buscar publicaciones sólo en el título</string> <string name="settings_search_posts_title_only">Buscar publicaciones sólo en el título</string>
<string name="settings_content_font_family">Fuente del contenido</string> <string name="settings_content_font_family">Fuente del contenido</string>

View File

@ -258,7 +258,6 @@
<string name="settings_comment_bar_theme_red">🍓 Maasikas</string> <string name="settings_comment_bar_theme_red">🍓 Maasikas</string>
<string name="settings_comment_bar_theme_multi">🌈 Vikerkaar</string> <string name="settings_comment_bar_theme_multi">🌈 Vikerkaar</string>
<string name="message_confirm_exit">Väljumiseks puudutage uuesti 🔙</string> <string name="message_confirm_exit">Väljumiseks puudutage uuesti 🔙</string>
<string name="settings_share_post_original">Jaga postitusi algsest eksemplarist</string>
<string name="community_action_unsubscribe">Loobu tellimusest</string> <string name="community_action_unsubscribe">Loobu tellimusest</string>
<string name="settings_search_posts_title_only">Otsi postitusi ainult pealkirjast</string> <string name="settings_search_posts_title_only">Otsi postitusi ainult pealkirjast</string>
<string name="settings_content_font_family">Sisu fondiperekond</string> <string name="settings_content_font_family">Sisu fondiperekond</string>

View File

@ -258,7 +258,6 @@
<string name="settings_comment_bar_theme_red">🍓 Mansikka</string> <string name="settings_comment_bar_theme_red">🍓 Mansikka</string>
<string name="settings_comment_bar_theme_multi">🌈 Sateenkaari</string> <string name="settings_comment_bar_theme_multi">🌈 Sateenkaari</string>
<string name="message_confirm_exit">Poistu napauttamalla 🔙 uudelleen</string> <string name="message_confirm_exit">Poistu napauttamalla 🔙 uudelleen</string>
<string name="settings_share_post_original">Jaa viestejä alkuperäisestä esiintymisestä</string>
<string name="community_action_unsubscribe">Lopeta tilaus</string> <string name="community_action_unsubscribe">Lopeta tilaus</string>
<string name="settings_search_posts_title_only">Hae viestejä vain otsikosta</string> <string name="settings_search_posts_title_only">Hae viestejä vain otsikosta</string>
<string name="settings_content_font_family">Sisällön kirjasinperhe</string> <string name="settings_content_font_family">Sisällön kirjasinperhe</string>

View File

@ -261,8 +261,6 @@
<string name="settings_comment_bar_theme_red">🍓 Fraise</string> <string name="settings_comment_bar_theme_red">🍓 Fraise</string>
<string name="settings_comment_bar_theme_multi">🌈 Arc-en-ciel</string> <string name="settings_comment_bar_theme_multi">🌈 Arc-en-ciel</string>
<string name="message_confirm_exit">Appuyez à nouveau sur 🔙 pour quitter</string> <string name="message_confirm_exit">Appuyez à nouveau sur 🔙 pour quitter</string>
<string name="settings_share_post_original">Partager les publications de l\'instance d\'origine
</string>
<string name="community_action_unsubscribe">Se désabonner</string> <string name="community_action_unsubscribe">Se désabonner</string>
<string name="settings_search_posts_title_only">Rechercher les publications uniquement dans le <string name="settings_search_posts_title_only">Rechercher les publications uniquement dans le
titre titre

View File

@ -267,7 +267,6 @@
<string name="settings_comment_bar_theme_red">🍓 Sú talún</string> <string name="settings_comment_bar_theme_red">🍓 Sú talún</string>
<string name="settings_comment_bar_theme_multi">🌈 Bogha ceatha</string> <string name="settings_comment_bar_theme_multi">🌈 Bogha ceatha</string>
<string name="message_confirm_exit">Tapáil 🔙 arís chun imeacht</string> <string name="message_confirm_exit">Tapáil 🔙 arís chun imeacht</string>
<string name="settings_share_post_original">Roinn postálacha ón mbunús</string>
<string name="community_action_unsubscribe">Díliostáil</string> <string name="community_action_unsubscribe">Díliostáil</string>
<string name="settings_search_posts_title_only">Cuardaigh postálacha i dteideal amháin</string> <string name="settings_search_posts_title_only">Cuardaigh postálacha i dteideal amháin</string>
<string name="settings_content_font_family">Teaghlach cló ábhar</string> <string name="settings_content_font_family">Teaghlach cló ábhar</string>

View File

@ -263,7 +263,6 @@
<string name="settings_comment_bar_theme_red">🍓 Jagoda</string> <string name="settings_comment_bar_theme_red">🍓 Jagoda</string>
<string name="settings_comment_bar_theme_multi">🌈 Duga</string> <string name="settings_comment_bar_theme_multi">🌈 Duga</string>
<string name="message_confirm_exit">Ponovno dodirnite 🔙 za izlaz</string> <string name="message_confirm_exit">Ponovno dodirnite 🔙 za izlaz</string>
<string name="settings_share_post_original">Dijelite postove iz izvorne instance</string>
<string name="community_action_unsubscribe">Odjavi pretplatu</string> <string name="community_action_unsubscribe">Odjavi pretplatu</string>
<string name="settings_search_posts_title_only">Pretraži postove samo u naslovu</string> <string name="settings_search_posts_title_only">Pretraži postove samo u naslovu</string>
<string name="settings_content_font_family">Obitelj fontova sadržaja</string> <string name="settings_content_font_family">Obitelj fontova sadržaja</string>

View File

@ -262,7 +262,6 @@
<string name="settings_comment_bar_theme_red">🍓 Eper</string> <string name="settings_comment_bar_theme_red">🍓 Eper</string>
<string name="settings_comment_bar_theme_multi">🌈 Szivárvány</string> <string name="settings_comment_bar_theme_multi">🌈 Szivárvány</string>
<string name="message_confirm_exit">A kilépéshez érintse meg ismét a 🔙 elemet</string> <string name="message_confirm_exit">A kilépéshez érintse meg ismét a 🔙 elemet</string>
<string name="settings_share_post_original">Oszd meg az eredeti példány bejegyzéseit</string>
<string name="community_action_unsubscribe">Leiratkozás</string> <string name="community_action_unsubscribe">Leiratkozás</string>
<string name="settings_search_posts_title_only">Keresés a bejegyzésekben csak a címben</string> <string name="settings_search_posts_title_only">Keresés a bejegyzésekben csak a címben</string>
<string name="settings_content_font_family">Tartalmi betűtípuscsalád</string> <string name="settings_content_font_family">Tartalmi betűtípuscsalád</string>

View File

@ -262,7 +262,6 @@
<string name="settings_comment_bar_theme_red">🍓 Fragola</string> <string name="settings_comment_bar_theme_red">🍓 Fragola</string>
<string name="settings_comment_bar_theme_multi">🌈 Arcobaleno</string> <string name="settings_comment_bar_theme_multi">🌈 Arcobaleno</string>
<string name="message_confirm_exit">Premi due volte 🔙 per uscire</string> <string name="message_confirm_exit">Premi due volte 🔙 per uscire</string>
<string name="settings_share_post_original">Condividi post dall\'istanza originale</string>
<string name="community_action_unsubscribe">Disiscriviti</string> <string name="community_action_unsubscribe">Disiscriviti</string>
<string name="settings_search_posts_title_only">Cerca solo nel titolo dei post</string> <string name="settings_search_posts_title_only">Cerca solo nel titolo dei post</string>
<string name="settings_content_font_family">Font contenuti</string> <string name="settings_content_font_family">Font contenuti</string>

View File

@ -260,8 +260,6 @@
<string name="settings_comment_bar_theme_red">🍓 Braškių</string> <string name="settings_comment_bar_theme_red">🍓 Braškių</string>
<string name="settings_comment_bar_theme_multi">🌈 Vaivorykštė</string> <string name="settings_comment_bar_theme_multi">🌈 Vaivorykštė</string>
<string name="message_confirm_exit">Bakstelėkite 🔙 dar kartą, kad išeitumėte</string> <string name="message_confirm_exit">Bakstelėkite 🔙 dar kartą, kad išeitumėte</string>
<string name="settings_share_post_original">Bendrinkite įrašus iš pradinio egzemplioriaus
</string>
<string name="community_action_unsubscribe">Atsisakyti prenumeratos</string> <string name="community_action_unsubscribe">Atsisakyti prenumeratos</string>
<string name="settings_search_posts_title_only">Ieškoti įrašų tik pavadinime</string> <string name="settings_search_posts_title_only">Ieškoti įrašų tik pavadinime</string>
<string name="settings_content_font_family">Turinio šriftų šeima</string> <string name="settings_content_font_family">Turinio šriftų šeima</string>

View File

@ -262,7 +262,6 @@
<string name="settings_comment_bar_theme_red">🍓 Zemeņu</string> <string name="settings_comment_bar_theme_red">🍓 Zemeņu</string>
<string name="settings_comment_bar_theme_multi">🌈 Varavīksne</string> <string name="settings_comment_bar_theme_multi">🌈 Varavīksne</string>
<string name="message_confirm_exit">Lai izietu, vēlreiz pieskarieties 🔙</string> <string name="message_confirm_exit">Lai izietu, vēlreiz pieskarieties 🔙</string>
<string name="settings_share_post_original">Kopīgojiet ziņas no sākotnējās instances</string>
<string name="community_action_unsubscribe">Anulēt abonementu</string> <string name="community_action_unsubscribe">Anulēt abonementu</string>
<string name="settings_search_posts_title_only">Meklēt ziņas tikai virsrakstā</string> <string name="settings_search_posts_title_only">Meklēt ziņas tikai virsrakstā</string>
<string name="settings_content_font_family">Satura fontu saime</string> <string name="settings_content_font_family">Satura fontu saime</string>

View File

@ -263,7 +263,6 @@
<string name="settings_comment_bar_theme_red">🍓 Frawli</string> <string name="settings_comment_bar_theme_red">🍓 Frawli</string>
<string name="settings_comment_bar_theme_multi">🌈 Qawsalla</string> <string name="settings_comment_bar_theme_multi">🌈 Qawsalla</string>
<string name="message_confirm_exit">Tektek mill-ġdid 🔙 biex toħroġ</string> <string name="message_confirm_exit">Tektek mill-ġdid 🔙 biex toħroġ</string>
<string name="settings_share_post_original">Aqsam il-postijiet mill-istanza oriġinali</string>
<string name="community_action_unsubscribe">Annulla l-abbonament</string> <string name="community_action_unsubscribe">Annulla l-abbonament</string>
<string name="settings_search_posts_title_only">Fittex postijiet biss fit-titlu</string> <string name="settings_search_posts_title_only">Fittex postijiet biss fit-titlu</string>
<string name="settings_content_font_family">Familja tat-tipa tal-kontenut</string> <string name="settings_content_font_family">Familja tat-tipa tal-kontenut</string>

View File

@ -261,8 +261,6 @@
<string name="settings_comment_bar_theme_red">🍓 Aardbei</string> <string name="settings_comment_bar_theme_red">🍓 Aardbei</string>
<string name="settings_comment_bar_theme_multi">🌈 Regenboog</string> <string name="settings_comment_bar_theme_multi">🌈 Regenboog</string>
<string name="message_confirm_exit">Tik nogmaals op 🔙 om af te sluiten</string> <string name="message_confirm_exit">Tik nogmaals op 🔙 om af te sluiten</string>
<string name="settings_share_post_original">Deel berichten van de oorspronkelijke instantie
</string>
<string name="community_action_unsubscribe">Uitschrijven</string> <string name="community_action_unsubscribe">Uitschrijven</string>
<string name="settings_search_posts_title_only">Zoek berichten alleen op titel</string> <string name="settings_search_posts_title_only">Zoek berichten alleen op titel</string>
<string name="settings_content_font_family">Inhoud lettertypefamilie</string> <string name="settings_content_font_family">Inhoud lettertypefamilie</string>

View File

@ -260,8 +260,6 @@
<string name="settings_comment_bar_theme_red">🍓 Jordbær</string> <string name="settings_comment_bar_theme_red">🍓 Jordbær</string>
<string name="settings_comment_bar_theme_multi">🌈 Regnbue</string> <string name="settings_comment_bar_theme_multi">🌈 Regnbue</string>
<string name="message_confirm_exit">Trykk på 🔙 igjen for å avslutte</string> <string name="message_confirm_exit">Trykk på 🔙 igjen for å avslutte</string>
<string name="settings_share_post_original">Del innlegg fra den opprinnelige forekomsten
</string>
<string name="community_action_unsubscribe">Avslutte abonnementet</string> <string name="community_action_unsubscribe">Avslutte abonnementet</string>
<string name="settings_search_posts_title_only">Søk kun innlegg i tittel</string> <string name="settings_search_posts_title_only">Søk kun innlegg i tittel</string>
<string name="settings_content_font_family">Innhold fontfamilie</string> <string name="settings_content_font_family">Innhold fontfamilie</string>

View File

@ -261,7 +261,6 @@
<string name="settings_comment_bar_theme_red">🍓 Truskawka</string> <string name="settings_comment_bar_theme_red">🍓 Truskawka</string>
<string name="settings_comment_bar_theme_multi">🌈 Tęcza</string> <string name="settings_comment_bar_theme_multi">🌈 Tęcza</string>
<string name="message_confirm_exit">Kliknij ponownie 🔙, aby wyjść</string> <string name="message_confirm_exit">Kliknij ponownie 🔙, aby wyjść</string>
<string name="settings_share_post_original">Udostępniaj posty z oryginalnej instancji</string>
<string name="community_action_unsubscribe">Zrezygnuj z subskrypcji</string> <string name="community_action_unsubscribe">Zrezygnuj z subskrypcji</string>
<string name="settings_search_posts_title_only">Szukaj postów tylko po tytule</string> <string name="settings_search_posts_title_only">Szukaj postów tylko po tytule</string>
<string name="settings_content_font_family">Rodzina czcionek treści</string> <string name="settings_content_font_family">Rodzina czcionek treści</string>

View File

@ -260,8 +260,6 @@
<string name="settings_comment_bar_theme_red">🍓 Morango</string> <string name="settings_comment_bar_theme_red">🍓 Morango</string>
<string name="settings_comment_bar_theme_multi">🌈 Arco-íris</string> <string name="settings_comment_bar_theme_multi">🌈 Arco-íris</string>
<string name="message_confirm_exit">Tocar em 🔙 novamente para sair</string> <string name="message_confirm_exit">Tocar em 🔙 novamente para sair</string>
<string name="settings_share_post_original">Compartilhar postagens da instância original
</string>
<string name="community_action_unsubscribe">Cancelar subscrição</string> <string name="community_action_unsubscribe">Cancelar subscrição</string>
<string name="settings_search_posts_title_only">Pesquise postagens apenas no título</string> <string name="settings_search_posts_title_only">Pesquise postagens apenas no título</string>
<string name="settings_content_font_family">Fonte dos conteúdos</string> <string name="settings_content_font_family">Fonte dos conteúdos</string>

View File

@ -259,7 +259,6 @@
<string name="settings_comment_bar_theme_red">🍓 Căpșună</string> <string name="settings_comment_bar_theme_red">🍓 Căpșună</string>
<string name="settings_comment_bar_theme_multi">🌈 Curcubeu</string> <string name="settings_comment_bar_theme_multi">🌈 Curcubeu</string>
<string name="message_confirm_exit">Apasă din nou 🔙 pentru a ieși</string> <string name="message_confirm_exit">Apasă din nou 🔙 pentru a ieși</string>
<string name="settings_share_post_original">Distribui postări din instanța originală</string>
<string name="community_action_unsubscribe">Dezabonează-te</string> <string name="community_action_unsubscribe">Dezabonează-te</string>
<string name="settings_search_posts_title_only">Căută postări numai în titlu</string> <string name="settings_search_posts_title_only">Căută postări numai în titlu</string>
<string name="settings_content_font_family">Font conținuturilor</string> <string name="settings_content_font_family">Font conținuturilor</string>

View File

@ -261,8 +261,6 @@
<string name="settings_comment_bar_theme_red">🍓 Клубника</string> <string name="settings_comment_bar_theme_red">🍓 Клубника</string>
<string name="settings_comment_bar_theme_multi">🌈 Радуга</string> <string name="settings_comment_bar_theme_multi">🌈 Радуга</string>
<string name="message_confirm_exit">Нажмите 🔙 еще раз, чтобы выйти</string> <string name="message_confirm_exit">Нажмите 🔙 еще раз, чтобы выйти</string>
<string name="settings_share_post_original">Делитесь сообщениями из исходного экземпляра
</string>
<string name="community_action_unsubscribe">Отписаться</string> <string name="community_action_unsubscribe">Отписаться</string>
<string name="settings_search_posts_title_only">Искать сообщения только по заголовку</string> <string name="settings_search_posts_title_only">Искать сообщения только по заголовку</string>
<string name="settings_content_font_family">Размер шрифта контента</string> <string name="settings_content_font_family">Размер шрифта контента</string>

View File

@ -259,7 +259,6 @@
<string name="settings_comment_bar_theme_red">🍓 Jordgubbe</string> <string name="settings_comment_bar_theme_red">🍓 Jordgubbe</string>
<string name="settings_comment_bar_theme_multi">🌈 Regnbåge</string> <string name="settings_comment_bar_theme_multi">🌈 Regnbåge</string>
<string name="message_confirm_exit">Tryck på 🔙 igen för att avsluta</string> <string name="message_confirm_exit">Tryck på 🔙 igen för att avsluta</string>
<string name="settings_share_post_original">Dela inlägg från den ursprungliga instansen</string>
<string name="community_action_unsubscribe">Säga upp</string> <string name="community_action_unsubscribe">Säga upp</string>
<string name="settings_search_posts_title_only">Sök endast inlägg i rubriken</string> <string name="settings_search_posts_title_only">Sök endast inlägg i rubriken</string>
<string name="settings_content_font_family">Teckenstorlek för innehåll</string> <string name="settings_content_font_family">Teckenstorlek för innehåll</string>

View File

@ -260,7 +260,6 @@
<string name="settings_comment_bar_theme_red">🍓 Jahodový</string> <string name="settings_comment_bar_theme_red">🍓 Jahodový</string>
<string name="settings_comment_bar_theme_multi">🌈 Dúha</string> <string name="settings_comment_bar_theme_multi">🌈 Dúha</string>
<string name="message_confirm_exit">Opätovným klepnutím na 🔙 ukončíte</string> <string name="message_confirm_exit">Opätovným klepnutím na 🔙 ukončíte</string>
<string name="settings_share_post_original">Zdieľajte príspevky z pôvodnej inštancie</string>
<string name="community_action_unsubscribe">Zrušte odber</string> <string name="community_action_unsubscribe">Zrušte odber</string>
<string name="settings_search_posts_title_only">Hľadajte príspevky iba v názve</string> <string name="settings_search_posts_title_only">Hľadajte príspevky iba v názve</string>
<string name="settings_content_font_family">Veľkosť písma obsahu</string> <string name="settings_content_font_family">Veľkosť písma obsahu</string>

View File

@ -258,7 +258,6 @@
<string name="settings_comment_bar_theme_red">🍓 Jagoda</string> <string name="settings_comment_bar_theme_red">🍓 Jagoda</string>
<string name="settings_comment_bar_theme_multi">🌈 Mavrica</string> <string name="settings_comment_bar_theme_multi">🌈 Mavrica</string>
<string name="message_confirm_exit">Znova tapnite 🔙 za izhod</string> <string name="message_confirm_exit">Znova tapnite 🔙 za izhod</string>
<string name="settings_share_post_original">Delite objave iz prvotnega primerka</string>
<string name="community_action_unsubscribe">Odjavi se</string> <string name="community_action_unsubscribe">Odjavi se</string>
<string name="settings_search_posts_title_only">Išči objave samo v naslovu</string> <string name="settings_search_posts_title_only">Išči objave samo v naslovu</string>
<string name="settings_content_font_family">Velikost pisave vsebine</string> <string name="settings_content_font_family">Velikost pisave vsebine</string>

View File

@ -264,7 +264,6 @@
<string name="settings_comment_bar_theme_red">🍓 Luleshtrydhe</string> <string name="settings_comment_bar_theme_red">🍓 Luleshtrydhe</string>
<string name="settings_comment_bar_theme_multi">🌈 Ylber</string> <string name="settings_comment_bar_theme_multi">🌈 Ylber</string>
<string name="message_confirm_exit">Prekni sërish 🔙 për të dalë</string> <string name="message_confirm_exit">Prekni sërish 🔙 për të dalë</string>
<string name="settings_share_post_original">Ndani postimet nga shembulli origjinal</string>
<string name="community_action_unsubscribe">Çregjistrohu</string> <string name="community_action_unsubscribe">Çregjistrohu</string>
<string name="settings_search_posts_title_only">Kërkoni postimet vetëm në titull</string> <string name="settings_search_posts_title_only">Kërkoni postimet vetëm në titull</string>
<string name="settings_content_font_family">Madhësia e shkronjave të përmbajtjes</string> <string name="settings_content_font_family">Madhësia e shkronjave të përmbajtjes</string>

View File

@ -261,7 +261,6 @@
<string name="settings_comment_bar_theme_red">🍓 Çilek</string> <string name="settings_comment_bar_theme_red">🍓 Çilek</string>
<string name="settings_comment_bar_theme_multi">🌈 Gökkuşağı</string> <string name="settings_comment_bar_theme_multi">🌈 Gökkuşağı</string>
<string name="message_confirm_exit">Çıkmak için 🔙 simgesine tekrar dokunun</string> <string name="message_confirm_exit">Çıkmak için 🔙 simgesine tekrar dokunun</string>
<string name="settings_share_post_original">Orijinal örnekteki gönderileri paylaşın</string>
<string name="community_action_unsubscribe">Abonelikten çık</string> <string name="community_action_unsubscribe">Abonelikten çık</string>
<string name="settings_search_posts_title_only">Gönderileri yalnızca başlıkta ara</string> <string name="settings_search_posts_title_only">Gönderileri yalnızca başlıkta ara</string>
<string name="settings_content_font_family">İçerik yazı tipi boyutu</string> <string name="settings_content_font_family">İçerik yazı tipi boyutu</string>

View File

@ -260,8 +260,6 @@
<string name="settings_comment_bar_theme_red">🍓 Полуниця</string> <string name="settings_comment_bar_theme_red">🍓 Полуниця</string>
<string name="settings_comment_bar_theme_multi">🌈 Веселка</string> <string name="settings_comment_bar_theme_multi">🌈 Веселка</string>
<string name="message_confirm_exit">Натисніть 🔙 ще раз, щоб вийти</string> <string name="message_confirm_exit">Натисніть 🔙 ще раз, щоб вийти</string>
<string name="settings_share_post_original">Діліться публікаціями з оригінального екземпляра
</string>
<string name="community_action_unsubscribe">Відписатися</string> <string name="community_action_unsubscribe">Відписатися</string>
<string name="settings_search_posts_title_only">Шукати публікації лише за назвою</string> <string name="settings_search_posts_title_only">Шукати публікації лише за назвою</string>
<string name="settings_content_font_family">Розмір шрифту вмісту</string> <string name="settings_content_font_family">Розмір шрифту вмісту</string>

View File

@ -26,7 +26,6 @@ interface CommunityDetailMviModel :
data object Subscribe : Intent data object Subscribe : Intent
data object Unsubscribe : Intent data object Unsubscribe : Intent
data class DeletePost(val id: Int) : Intent data class DeletePost(val id: Int) : Intent
data class SharePost(val id: Int) : Intent
data class MarkAsRead(val id: Int) : Intent data class MarkAsRead(val id: Int) : Intent
data class Hide(val id: Int) : Intent data class Hide(val id: Int) : Intent
data object Block : Intent data object Block : Intent
@ -38,10 +37,12 @@ interface CommunityDetailMviModel :
data class ModLockPost(val id: Int) : Intent data class ModLockPost(val id: Int) : Intent
data class ModToggleModUser(val id: Int) : Intent data class ModToggleModUser(val id: Int) : Intent
data object ToggleFavorite : Intent data object ToggleFavorite : Intent
data class Share(val url: String) : Intent
} }
data class UiState( data class UiState(
val community: CommunityModel = CommunityModel(), val community: CommunityModel = CommunityModel(),
val instance: String = "",
val isLogged: Boolean = false, val isLogged: Boolean = false,
val refreshing: Boolean = false, val refreshing: Boolean = false,
val asyncInProgress: Boolean = false, val asyncInProgress: Boolean = false,

View File

@ -87,6 +87,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.PostCardPlaceholder
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ShareBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotificationCenter import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotificationCenter
@ -791,9 +792,22 @@ class CommunityDetailScreen(
CommunityDetailMviModel.Intent.Hide(post.id) CommunityDetailMviModel.Intent.Hide(post.id)
) )
OptionId.Share -> model.reduce( OptionId.Share -> {
CommunityDetailMviModel.Intent.SharePost(post.id) val urls = listOfNotNull(
) post.originalUrl,
"https://${uiState.instance}/post/${post.id}"
).distinct()
if (urls.size == 1) {
model.reduce(
CommunityDetailMviModel.Intent.Share(
urls.first()
)
)
} else {
val screen = ShareBottomSheet(urls = urls)
navigationCoordinator.showBottomSheet(screen)
}
}
OptionId.FeaturePost -> model.reduce( OptionId.FeaturePost -> model.reduce(
CommunityDetailMviModel.Intent.ModFeaturePost( CommunityDetailMviModel.Intent.ModFeaturePost(

View File

@ -63,6 +63,8 @@ class CommunityDetailViewModel(
mvi.updateState { mvi.updateState {
it.copy( it.copy(
community = it.community.takeIf { c -> c.id != 0 } ?: community, community = it.community.takeIf { c -> c.id != 0 } ?: community,
instance = otherInstance.takeIf { n -> n.isNotEmpty() }
?: apiConfigurationRepository.instance.value,
) )
} }
@ -131,6 +133,9 @@ class CommunityDetailViewModel(
.onEach { evt -> .onEach { evt ->
applySortType(evt.value) applySortType(evt.value)
}.launchIn(this) }.launchIn(this)
notificationCenter.subscribe(NotificationCenterEvent.Share::class).onEach { evt ->
shareHelper.share(evt.url)
}.launchIn(this)
if (uiState.value.currentUserId == null) { if (uiState.value.currentUserId == null) {
val auth = identityRepository.authToken.value.orEmpty() val auth = identityRepository.authToken.value.orEmpty()
@ -164,6 +169,10 @@ class CommunityDetailViewModel(
} }
} }
is CommunityDetailMviModel.Intent.Share -> {
shareHelper.share(intent.url)
}
is CommunityDetailMviModel.Intent.SavePost -> { is CommunityDetailMviModel.Intent.SavePost -> {
if (intent.feedback) { if (intent.feedback) {
hapticFeedback.vibrate() hapticFeedback.vibrate()
@ -187,11 +196,6 @@ class CommunityDetailViewModel(
CommunityDetailMviModel.Intent.Subscribe -> subscribe() CommunityDetailMviModel.Intent.Subscribe -> subscribe()
CommunityDetailMviModel.Intent.Unsubscribe -> unsubscribe() CommunityDetailMviModel.Intent.Unsubscribe -> unsubscribe()
is CommunityDetailMviModel.Intent.DeletePost -> handlePostDelete(intent.id) is CommunityDetailMviModel.Intent.DeletePost -> handlePostDelete(intent.id)
is CommunityDetailMviModel.Intent.SharePost -> {
uiState.value.posts.firstOrNull { it.id == intent.id }?.also { post ->
share(post = post)
}
}
CommunityDetailMviModel.Intent.Block -> blockCommunity() CommunityDetailMviModel.Intent.Block -> blockCommunity()
CommunityDetailMviModel.Intent.BlockInstance -> blockInstance() CommunityDetailMviModel.Intent.BlockInstance -> blockInstance()
@ -486,20 +490,6 @@ class CommunityDetailViewModel(
mvi.updateState { it.copy(posts = it.posts.filter { post -> post.id != id }) } mvi.updateState { it.copy(posts = it.posts.filter { post -> post.id != id }) }
} }
private fun share(post: PostModel) {
val shareOriginal = settingsRepository.currentSettings.value.sharePostOriginal
val url = if (shareOriginal) {
post.originalUrl.orEmpty()
} else if (otherInstance.isNotEmpty()) {
"https://${otherInstance}/post/${post.id}"
} else {
"https://${apiConfigurationRepository.instance.value}/post/${post.id}"
}
if (url.isNotEmpty()) {
shareHelper.share(url, "text/plain")
}
}
private fun blockCommunity() { private fun blockCommunity() {
mvi.updateState { it.copy(asyncInProgress = true) } mvi.updateState { it.copy(asyncInProgress = true) }
mvi.scope?.launch(Dispatchers.IO) { mvi.scope?.launch(Dispatchers.IO) {

View File

@ -18,10 +18,10 @@ interface MultiCommunityMviModel :
data class UpVotePost(val id: Int, val feedback: Boolean = false) : Intent data class UpVotePost(val id: Int, val feedback: Boolean = false) : Intent
data class DownVotePost(val id: Int, val feedback: Boolean = false) : Intent data class DownVotePost(val id: Int, val feedback: Boolean = false) : Intent
data class SavePost(val id: Int, val feedback: Boolean = false) : Intent data class SavePost(val id: Int, val feedback: Boolean = false) : Intent
data class SharePost(val id: Int) : Intent
data class MarkAsRead(val id: Int) : Intent data class MarkAsRead(val id: Int) : Intent
data class Hide(val id: Int) : Intent data class Hide(val id: Int) : Intent
data object ClearRead : Intent data object ClearRead : Intent
data class Share(val url: String) : Intent
} }
data class UiState( data class UiState(

View File

@ -66,6 +66,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.OptionId
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCard 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.PostCardPlaceholder
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ShareBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel import com.github.diegoberaldin.raccoonforlemmy.core.persistence.data.MultiCommunityModel
@ -391,9 +392,22 @@ class MultiCommunityScreen(
) )
) )
OptionId.Share -> model.reduce( OptionId.Share -> {
MultiCommunityMviModel.Intent.SharePost(post.id) val urls = listOfNotNull(
) post.originalUrl,
"https://${uiState.instance}/post/${post.id}"
).distinct()
if (urls.size == 1) {
model.reduce(
MultiCommunityMviModel.Intent.Share(
urls.first()
)
)
} else {
val screen = ShareBottomSheet(urls = urls)
navigationCoordinator.showBottomSheet(screen)
}
}
else -> Unit else -> Unit
} }

View File

@ -72,6 +72,9 @@ class MultiCommunityViewModel(
.onEach { evt -> .onEach { evt ->
applySortType(evt.value) applySortType(evt.value)
}.launchIn(this) }.launchIn(this)
notificationCenter.subscribe(NotificationCenterEvent.Share::class).onEach { evt ->
shareHelper.share(evt.url)
}.launchIn(this)
if (uiState.value.currentUserId == null) { if (uiState.value.currentUserId == null) {
val auth = identityRepository.authToken.value.orEmpty() val auth = identityRepository.authToken.value.orEmpty()
@ -120,9 +123,9 @@ class MultiCommunityViewModel(
) )
} }
is MultiCommunityMviModel.Intent.SharePost -> share( is MultiCommunityMviModel.Intent.Share -> {
post = uiState.value.posts.first { it.id == intent.id } shareHelper.share(intent.url)
) }
is MultiCommunityMviModel.Intent.UpVotePost -> { is MultiCommunityMviModel.Intent.UpVotePost -> {
if (intent.feedback) { if (intent.feedback) {
@ -314,18 +317,6 @@ class MultiCommunityViewModel(
} }
} }
private fun share(post: PostModel) {
val shareOriginal = settingsRepository.currentSettings.value.sharePostOriginal
val url = if (shareOriginal) {
post.originalUrl.orEmpty()
} else {
"https://${apiConfigurationRepository.instance.value}/post/${post.id}"
}
if (url.isNotEmpty()) {
shareHelper.share(url, "text/plain")
}
}
private fun clearRead() { private fun clearRead() {
hideReadPosts = true hideReadPosts = true
mvi.updateState { mvi.updateState {

View File

@ -19,7 +19,7 @@ interface ProfileLoggedMviModel :
data object LoadNextPage : Intent data object LoadNextPage : Intent
data class DeletePost(val id: Int) : Intent data class DeletePost(val id: Int) : Intent
data class DeleteComment(val id: Int) : Intent data class DeleteComment(val id: Int) : Intent
data class SharePost(val id: Int) : Intent data class Share(val url: String) : Intent
data class UpVotePost(val id: Int, val feedback: Boolean = false) : Intent data class UpVotePost(val id: Int, val feedback: Boolean = false) : Intent
data class DownVotePost(val id: Int, val feedback: Boolean = false) : Intent data class DownVotePost(val id: Int, val feedback: Boolean = false) : Intent
data class SavePost(val id: Int, val feedback: Boolean = false) : Intent data class SavePost(val id: Int, val feedback: Boolean = false) : Intent
@ -31,6 +31,7 @@ interface ProfileLoggedMviModel :
data class UiState( data class UiState(
val user: UserModel? = null, val user: UserModel? = null,
val instance: String = "",
val section: ProfileLoggedSection = ProfileLoggedSection.Posts, val section: ProfileLoggedSection = ProfileLoggedSection.Posts,
val refreshing: Boolean = false, val refreshing: Boolean = false,
val loading: Boolean = false, val loading: Boolean = false,

View File

@ -49,6 +49,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCardPl
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.ProfileLoggedSection import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.ProfileLoggedSection
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.UserHeader import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.UserHeader
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ShareBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent import com.github.diegoberaldin.raccoonforlemmy.core.notifications.NotificationCenterEvent
@ -279,9 +280,22 @@ object ProfileLoggedScreen : Tab {
rawContent = post rawContent = post
} }
OptionId.Share -> model.reduce( OptionId.Share -> {
ProfileLoggedMviModel.Intent.SharePost(post.id) val urls = listOfNotNull(
) post.originalUrl,
"https://${uiState.instance}/post/${post.id}"
).distinct()
if (urls.size == 1) {
model.reduce(
ProfileLoggedMviModel.Intent.Share(
urls.first()
)
)
} else {
val screen = ShareBottomSheet(urls = urls)
navigationCoordinator.showBottomSheet(screen)
}
}
else -> Unit else -> Unit
} }

View File

@ -51,6 +51,7 @@ class ProfileLoggedViewModel(
@OptIn(FlowPreview::class) @OptIn(FlowPreview::class)
override fun onStarted() { override fun onStarted() {
mvi.onStarted() mvi.onStarted()
mvi.updateState { it.copy(instance = apiConfigurationRepository.instance.value) }
mvi.scope?.launch(Dispatchers.IO) { mvi.scope?.launch(Dispatchers.IO) {
themeRepository.postLayout.onEach { layout -> themeRepository.postLayout.onEach { layout ->
mvi.updateState { it.copy(postLayout = layout) } mvi.updateState { it.copy(postLayout = layout) }
@ -83,6 +84,9 @@ class ProfileLoggedViewModel(
notificationCenter.subscribe(NotificationCenterEvent.PostDeleted::class).onEach { evt -> notificationCenter.subscribe(NotificationCenterEvent.PostDeleted::class).onEach { evt ->
handlePostDelete(evt.model.id) handlePostDelete(evt.model.id)
}.launchIn(this) }.launchIn(this)
notificationCenter.subscribe(NotificationCenterEvent.Share::class).onEach { evt ->
shareHelper.share(evt.url)
}.launchIn(this)
if (uiState.value.posts.isEmpty()) { if (uiState.value.posts.isEmpty()) {
refreshUser() refreshUser()
@ -104,10 +108,8 @@ class ProfileLoggedViewModel(
refresh() refresh()
} }
is ProfileLoggedMviModel.Intent.SharePost -> { is ProfileLoggedMviModel.Intent.Share -> {
uiState.value.posts.firstOrNull { it.id == intent.id }?.also { post -> shareHelper.share(intent.url)
share(post = post)
}
} }
is ProfileLoggedMviModel.Intent.DownVoteComment -> { is ProfileLoggedMviModel.Intent.DownVoteComment -> {
@ -452,16 +454,4 @@ class ProfileLoggedViewModel(
refresh() refresh()
} }
} }
private fun share(post: PostModel) {
val shareOriginal = settingsRepository.currentSettings.value.sharePostOriginal
val url = if (shareOriginal) {
post.originalUrl.orEmpty()
} else {
"https://${apiConfigurationRepository.instance.value}/post/${post.id}"
}
if (url.isNotEmpty()) {
shareHelper.share(url, "text/plain")
}
}
} }

View File

@ -31,15 +31,16 @@ interface PostDetailMviModel :
data class DeleteComment(val commentId: Int) : Intent data class DeleteComment(val commentId: Int) : Intent
data object DeletePost : Intent data object DeletePost : Intent
data object HapticIndication : Intent data object HapticIndication : Intent
data object SharePost : Intent
data object ModFeaturePost : Intent data object ModFeaturePost : Intent
data object ModLockPost : Intent data object ModLockPost : Intent
data class ModDistinguishComment(val commentId: Int) : Intent data class ModDistinguishComment(val commentId: Int) : Intent
data class ModToggleModUser(val id: Int) : Intent data class ModToggleModUser(val id: Int) : Intent
data class Share(val url: String) : Intent
} }
data class UiState( data class UiState(
val post: PostModel = PostModel(), val post: PostModel = PostModel(),
val instance: String = "",
val isModerator: Boolean = false, val isModerator: Boolean = false,
val isLogged: Boolean = false, val isLogged: Boolean = false,
val refreshing: Boolean = false, val refreshing: Boolean = false,

View File

@ -87,6 +87,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.OptionId
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCard import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ShareBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotificationCenter import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotificationCenter
@ -469,7 +470,18 @@ class PostDetailScreen(
rawContent = uiState.post rawContent = uiState.post
} }
OptionId.Share -> model.reduce(PostDetailMviModel.Intent.SharePost) OptionId.Share -> {
val urls = listOfNotNull(
post.originalUrl,
"https://${uiState.instance}/post/${post.id}"
).distinct()
if (urls.size == 1) {
model.reduce(PostDetailMviModel.Intent.Share(urls.first()))
} else {
val screen = ShareBottomSheet(urls = urls)
navigationCoordinator.showBottomSheet(screen)
}
}
OptionId.FeaturePost -> model.reduce( OptionId.FeaturePost -> model.reduce(
PostDetailMviModel.Intent.ModFeaturePost, PostDetailMviModel.Intent.ModFeaturePost,

View File

@ -53,7 +53,12 @@ class PostDetailViewModel(
override fun onStarted() { override fun onStarted() {
mvi.onStarted() mvi.onStarted()
mvi.updateState {
it.copy(
instance = otherInstance.takeIf { n -> n.isNotEmpty() }
?: apiConfigurationRepository.instance.value,
)
}
mvi.scope?.launch(Dispatchers.Main) { mvi.scope?.launch(Dispatchers.Main) {
notificationCenter.subscribe(NotificationCenterEvent.PostUpdated::class).onEach { evt -> notificationCenter.subscribe(NotificationCenterEvent.PostUpdated::class).onEach { evt ->
handlePostUpdate(evt.model) handlePostUpdate(evt.model)
@ -113,6 +118,9 @@ class PostDetailViewModel(
notificationCenter.subscribe(NotificationCenterEvent.PostUpdated::class).onEach { notificationCenter.subscribe(NotificationCenterEvent.PostUpdated::class).onEach {
refreshPost() refreshPost()
}.launchIn(this) }.launchIn(this)
notificationCenter.subscribe(NotificationCenterEvent.Share::class).onEach { evt ->
shareHelper.share(evt.url)
}.launchIn(this)
} }
mvi.scope?.launch(Dispatchers.IO) { mvi.scope?.launch(Dispatchers.IO) {
@ -259,6 +267,10 @@ class PostDetailViewModel(
toggleSavePost(post = intent.post) toggleSavePost(post = intent.post)
} }
is PostDetailMviModel.Intent.Share -> {
shareHelper.share(intent.url)
}
is PostDetailMviModel.Intent.UpVoteComment -> { is PostDetailMviModel.Intent.UpVoteComment -> {
if (intent.feedback) { if (intent.feedback) {
hapticFeedback.vibrate() hapticFeedback.vibrate()
@ -282,9 +294,6 @@ class PostDetailViewModel(
is PostDetailMviModel.Intent.DeleteComment -> deleteComment(intent.commentId) is PostDetailMviModel.Intent.DeleteComment -> deleteComment(intent.commentId)
PostDetailMviModel.Intent.DeletePost -> deletePost() PostDetailMviModel.Intent.DeletePost -> deletePost()
PostDetailMviModel.Intent.SharePost -> share(
post = uiState.value.post,
)
is PostDetailMviModel.Intent.ToggleExpandComment -> { is PostDetailMviModel.Intent.ToggleExpandComment -> {
uiState.value.comments.firstOrNull { it.id == intent.commentId } uiState.value.comments.firstOrNull { it.id == intent.commentId }
@ -475,7 +484,9 @@ class PostDetailViewModel(
post = post, post = post,
downVoted = newValue, downVoted = newValue,
) )
mvi.updateState { it.copy(post = newPost) } mvi.updateState {
it.copy(post = newPost)
}
mvi.scope?.launch(Dispatchers.IO) { mvi.scope?.launch(Dispatchers.IO) {
try { try {
val auth = identityRepository.authToken.value.orEmpty() val auth = identityRepository.authToken.value.orEmpty()
@ -629,20 +640,6 @@ class PostDetailViewModel(
} }
} }
private fun share(post: PostModel) {
val shareOriginal = settingsRepository.currentSettings.value.sharePostOriginal
val url = if (shareOriginal) {
post.originalUrl.orEmpty()
} else if (otherInstance.isNotEmpty()) {
"https://${otherInstance}/post/${post.id}"
} else {
"https://${apiConfigurationRepository.instance.value}/post/${post.id}"
}
if (url.isNotEmpty()) {
shareHelper.share(url, "text/plain")
}
}
private fun toggleExpanded(comment: CommentModel) { private fun toggleExpanded(comment: CommentModel) {
mvi.scope?.launch { mvi.scope?.launch {
val commentId = comment.id val commentId = comment.id

View File

@ -25,7 +25,7 @@ interface PostListMviModel :
data class HandlePostUpdate(val post: PostModel) : Intent data class HandlePostUpdate(val post: PostModel) : Intent
data object HapticIndication : Intent data object HapticIndication : Intent
data class DeletePost(val id: Int) : Intent data class DeletePost(val id: Int) : Intent
data class SharePost(val id: Int) : Intent data class Share(val url: String) : Intent
data class MarkAsRead(val id: Int) : Intent data class MarkAsRead(val id: Int) : Intent
data class Hide(val id: Int) : Intent data class Hide(val id: Int) : Intent
data object ClearRead : Intent data object ClearRead : Intent

View File

@ -69,6 +69,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabN
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.BlockBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.BlockBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ListingTypeBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ListingTypeBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ShareBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection import com.github.diegoberaldin.raccoonforlemmy.core.navigation.TabNavigationSection
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getDrawerCoordinator import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getDrawerCoordinator
@ -515,9 +516,22 @@ class PostListScreen : Screen {
) )
) )
OptionId.Share -> model.reduce( OptionId.Share -> {
PostListMviModel.Intent.SharePost(post.id) val urls = listOfNotNull(
) post.originalUrl,
"https://${uiState.instance}/post/${post.id}"
).distinct()
if (urls.size == 1) {
model.reduce(
PostListMviModel.Intent.Share(
urls.first()
)
)
} else {
val screen = ShareBottomSheet(urls = urls)
navigationCoordinator.showBottomSheet(screen)
}
}
OptionId.Block -> { OptionId.Block -> {
val screen = BlockBottomSheet( val screen = BlockBottomSheet(

View File

@ -124,6 +124,9 @@ class PostListViewModel(
instanceId != null -> blockInstance(instanceId) instanceId != null -> blockInstance(instanceId)
} }
}.launchIn(this) }.launchIn(this)
notificationCenter.subscribe(NotificationCenterEvent.Share::class).onEach { evt ->
shareHelper.share(evt.url)
}.launchIn(this)
zombieModeHelper.index.onEach { index -> zombieModeHelper.index.onEach { index ->
if (uiState.value.zombieModeActive) { if (uiState.value.zombieModeActive) {
@ -205,10 +208,8 @@ class PostListViewModel(
PostListMviModel.Intent.HapticIndication -> hapticFeedback.vibrate() PostListMviModel.Intent.HapticIndication -> hapticFeedback.vibrate()
is PostListMviModel.Intent.HandlePostUpdate -> handlePostUpdate(intent.post) is PostListMviModel.Intent.HandlePostUpdate -> handlePostUpdate(intent.post)
is PostListMviModel.Intent.DeletePost -> handlePostDelete(intent.id) is PostListMviModel.Intent.DeletePost -> handlePostDelete(intent.id)
is PostListMviModel.Intent.SharePost -> { is PostListMviModel.Intent.Share -> {
uiState.value.posts.firstOrNull { it.id == intent.id }?.also { post -> shareHelper.share(intent.url)
share(post = post)
}
} }
is PostListMviModel.Intent.MarkAsRead -> { is PostListMviModel.Intent.MarkAsRead -> {
@ -458,18 +459,6 @@ class PostListViewModel(
} }
} }
private fun share(post: PostModel) {
val shareOriginal = settingsRepository.currentSettings.value.sharePostOriginal
val url = if (shareOriginal) {
post.originalUrl.orEmpty()
} else {
"https://${apiConfigurationRepository.instance.value}/post/${post.id}"
}
if (url.isNotEmpty()) {
shareHelper.share(url, "text/plain")
}
}
private fun clearRead() { private fun clearRead() {
hideReadPosts = true hideReadPosts = true
mvi.updateState { mvi.updateState {

View File

@ -23,15 +23,16 @@ interface SavedItemsMviModel :
data class UpVotePost(val id: Int, val feedback: Boolean = false) : Intent data class UpVotePost(val id: Int, val feedback: Boolean = false) : Intent
data class DownVotePost(val id: Int, val feedback: Boolean = false) : Intent data class DownVotePost(val id: Int, val feedback: Boolean = false) : Intent
data class SavePost(val id: Int, val feedback: Boolean = false) : Intent data class SavePost(val id: Int, val feedback: Boolean = false) : Intent
data class SharePost(val id: Int) : Intent
data class UpVoteComment(val id: Int, val feedback: Boolean = false) : Intent data class UpVoteComment(val id: Int, val feedback: Boolean = false) : Intent
data class DownVoteComment(val id: Int, val feedback: Boolean = false) : Intent data class DownVoteComment(val id: Int, val feedback: Boolean = false) : Intent
data class SaveComment(val id: Int, val feedback: Boolean = false) : Intent data class SaveComment(val id: Int, val feedback: Boolean = false) : Intent
data class Share(val url: String) : Intent
} }
data class UiState( data class UiState(
val section: SavedItemsSection = SavedItemsSection.Posts, val section: SavedItemsSection = SavedItemsSection.Posts,
val user: UserModel? = null, val user: UserModel? = null,
val instance: String = "",
val refreshing: Boolean = false, val refreshing: Boolean = false,
val loading: Boolean = false, val loading: Boolean = false,
val canFetchMore: Boolean = true, val canFetchMore: Boolean = true,

View File

@ -59,6 +59,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.OptionId
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCard import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.PostCard
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ShareBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.persistence.di.getSettingsRepository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.di.getSettingsRepository
@ -299,11 +300,20 @@ class SavedItemsScreen : Screen {
} }
OptionId.Share -> { OptionId.Share -> {
model.reduce( val urls = listOfNotNull(
SavedItemsMviModel.Intent.SharePost( post.originalUrl,
post.id "https://${uiState.instance}/post/${post.id}"
).distinct()
if (urls.size == 1) {
model.reduce(
SavedItemsMviModel.Intent.Share(
urls.first()
)
) )
) } else {
val screen = ShareBottomSheet(urls = urls)
navigationCoordinator.showBottomSheet(screen)
}
} }
else -> Unit else -> Unit

View File

@ -45,6 +45,7 @@ class SavedItemsViewModel(
override fun onStarted() { override fun onStarted() {
mvi.onStarted() mvi.onStarted()
mvi.updateState { it.copy(instance = apiConfigurationRepository.instance.value) }
mvi.scope?.launch { mvi.scope?.launch {
themeRepository.postLayout.onEach { layout -> themeRepository.postLayout.onEach { layout ->
mvi.updateState { it.copy(postLayout = layout) } mvi.updateState { it.copy(postLayout = layout) }
@ -68,6 +69,10 @@ class SavedItemsViewModel(
.onEach { evt -> .onEach { evt ->
applySortType(evt.value) applySortType(evt.value)
}.launchIn(this) }.launchIn(this)
notificationCenter.subscribe(NotificationCenterEvent.Share::class).onEach { evt ->
shareHelper.share(evt.url)
}.launchIn(this)
if (mvi.uiState.value.posts.isEmpty()) { if (mvi.uiState.value.posts.isEmpty()) {
val sortTypes = getSortTypesUseCase.getTypesForSavedItems() val sortTypes = getSortTypesUseCase.getTypesForSavedItems()
mvi.updateState { it.copy(availableSortTypes = sortTypes) } mvi.updateState { it.copy(availableSortTypes = sortTypes) }
@ -117,6 +122,10 @@ class SavedItemsViewModel(
) )
} }
is SavedItemsMviModel.Intent.Share -> {
shareHelper.share(intent.url)
}
is SavedItemsMviModel.Intent.UpVoteComment -> { is SavedItemsMviModel.Intent.UpVoteComment -> {
if (intent.feedback) { if (intent.feedback) {
hapticFeedback.vibrate() hapticFeedback.vibrate()
@ -136,9 +145,6 @@ class SavedItemsViewModel(
} }
is SavedItemsMviModel.Intent.ChangeSort -> applySortType(intent.value) is SavedItemsMviModel.Intent.ChangeSort -> applySortType(intent.value)
is SavedItemsMviModel.Intent.SharePost -> share(
post = uiState.value.posts.first { it.id == intent.id }
)
} }
} }
@ -399,16 +405,4 @@ class SavedItemsViewModel(
} }
} }
} }
private fun share(post: PostModel) {
val shareOriginal = settingsRepository.currentSettings.value.sharePostOriginal
val url = if (shareOriginal) {
post.originalUrl.orEmpty()
} else {
"https://${apiConfigurationRepository.instance.value}/post/${post.id}"
}
if (url.isNotEmpty()) {
shareHelper.share(url, "text/plain")
}
}
} }

View File

@ -28,13 +28,14 @@ interface UserDetailMviModel :
data class DownVoteComment(val id: Int, val feedback: Boolean = false) : Intent data class DownVoteComment(val id: Int, val feedback: Boolean = false) : Intent
data class SaveComment(val id: Int, val feedback: Boolean = false) : Intent data class SaveComment(val id: Int, val feedback: Boolean = false) : Intent
data object HapticIndication : Intent data object HapticIndication : Intent
data class SharePost(val id: Int) : Intent data class Share(val url: String) : Intent
data object Block : Intent data object Block : Intent
data object BlockInstance : Intent data object BlockInstance : Intent
} }
data class UiState( data class UiState(
val isLogged: Boolean = false, val isLogged: Boolean = false,
val instance: String = "",
val currentUserId: Int? = null, val currentUserId: Int? = null,
val section: UserDetailSection = UserDetailSection.Posts, val section: UserDetailSection = UserDetailSection.Posts,
val sortType: SortType = SortType.Active, val sortType: SortType = SortType.Active,

View File

@ -86,6 +86,7 @@ import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.UserDetail
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.UserHeader import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.UserHeader
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection import com.github.diegoberaldin.raccoonforlemmy.core.commonui.lemmyui.di.getFabNestedScrollConnection
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.RawContentDialog
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.ShareBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet import com.github.diegoberaldin.raccoonforlemmy.core.commonui.modals.SortBottomSheet
import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator import com.github.diegoberaldin.raccoonforlemmy.core.navigation.di.getNavigationCoordinator
import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotificationCenter import com.github.diegoberaldin.raccoonforlemmy.core.notifications.di.getNotificationCenter
@ -603,9 +604,22 @@ class UserDetailScreen(
rawContent = post rawContent = post
} }
OptionId.Share -> model.reduce( OptionId.Share -> {
UserDetailMviModel.Intent.SharePost(post.id) val urls = listOfNotNull(
) post.originalUrl,
"https://${uiState.instance}/post/${post.id}"
).distinct()
if (urls.size == 1) {
model.reduce(
UserDetailMviModel.Intent.Share(
urls.first()
)
)
} else {
val screen = ShareBottomSheet(urls = urls)
navigationCoordinator.showBottomSheet(screen)
}
}
else -> Unit else -> Unit
} }

View File

@ -53,6 +53,12 @@ class UserDetailViewModel(
override fun onStarted() { override fun onStarted() {
mvi.onStarted() mvi.onStarted()
mvi.updateState {
it.copy(
instance = otherInstance.takeIf { n -> n.isNotEmpty() }
?: apiConfigurationRepository.instance.value,
)
}
mvi.scope?.launch { mvi.scope?.launch {
themeRepository.postLayout.onEach { layout -> themeRepository.postLayout.onEach { layout ->
mvi.updateState { it.copy(postLayout = layout) } mvi.updateState { it.copy(postLayout = layout) }
@ -64,6 +70,9 @@ class UserDetailViewModel(
.onEach { evt -> .onEach { evt ->
applySortType(evt.value) applySortType(evt.value)
}.launchIn(this) }.launchIn(this)
notificationCenter.subscribe(NotificationCenterEvent.Share::class).onEach { evt ->
shareHelper.share(evt.url)
}.launchIn(this)
} }
mvi.updateState { mvi.updateState {
it.copy( it.copy(
@ -173,10 +182,8 @@ class UserDetailViewModel(
} }
} }
is UserDetailMviModel.Intent.SharePost -> { is UserDetailMviModel.Intent.Share -> {
uiState.value.posts.firstOrNull { it.id == intent.id }?.also { post -> shareHelper.share(intent.url)
share(post = post)
}
} }
UserDetailMviModel.Intent.Block -> blockUser() UserDetailMviModel.Intent.Block -> blockUser()
@ -478,20 +485,6 @@ class UserDetailViewModel(
} }
} }
private fun share(post: PostModel) {
val shareOriginal = settingsRepository.currentSettings.value.sharePostOriginal
val url = if (shareOriginal) {
post.originalUrl.orEmpty()
} else if (otherInstance.isNotEmpty()) {
"https://${otherInstance}/post/${post.id}"
} else {
"https://${apiConfigurationRepository.instance.value}/post/${post.id}"
}
if (url.isNotEmpty()) {
shareHelper.share(url, "text/plain")
}
}
private fun blockUser() { private fun blockUser() {
mvi.updateState { it.copy(asyncInProgress = true) } mvi.updateState { it.copy(asyncInProgress = true) }
mvi.scope?.launch(Dispatchers.IO) { mvi.scope?.launch(Dispatchers.IO) {

View File

@ -75,7 +75,7 @@ class WebViewScreen(
Icon( Icon(
modifier = Modifier.onClick( modifier = Modifier.onClick(
onClick = rememberCallback { onClick = rememberCallback {
shareHelper.share(url, "text/plain") shareHelper.share(url)
}, },
), ),
imageVector = Icons.Default.Share, imageVector = Icons.Default.Share,