Add dedicated "Support Us" screen (#3200)

This commit is contained in:
AntsyLich
2026-04-10 01:56:24 +06:00
committed by GitHub
parent 1712b9cdc5
commit 50b0ccb928
9 changed files with 248 additions and 5 deletions
@@ -40,6 +40,7 @@ fun MoreScreen(
onClickStats: () -> Unit,
onClickDataAndStorage: () -> Unit,
onClickSettings: () -> Unit,
onClickSupport: () -> Unit,
onClickAbout: () -> Unit,
) {
val uriHandler = LocalUriHandler.current
@@ -136,7 +137,7 @@ fun MoreScreen(
TextPreferenceWidget(
title = stringResource(MR.strings.label_support_us),
icon = Icons.Default.VolunteerActivism,
onPreferenceClick = { uriHandler.openUri(Constants.URL_DONATE) },
onPreferenceClick = onClickSupport,
)
}
item {
@@ -41,6 +41,7 @@ import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.system.updaterEnabled
import kotlinx.coroutines.launch
import logcat.LogPriority
import tachiyomi.core.common.Constants
import tachiyomi.core.common.util.lang.withIOContext
import tachiyomi.core.common.util.lang.withUIContext
import tachiyomi.core.common.util.system.logcat
@@ -179,7 +180,7 @@ object AboutScreen : Screen() {
LinkIcon(
label = "Discord",
icon = CustomIcons.Discord,
url = "https://discord.gg/mihon",
url = Constants.URL_DISCORD,
)
LinkIcon(
label = "X",
@@ -7,7 +7,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import cafe.adriel.voyager.core.model.ScreenModel
import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.model.screenModelScope
@@ -31,6 +30,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import mihon.feature.support.SupportUsScreen
import tachiyomi.core.common.util.lang.launchIO
import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.stringResource
@@ -57,7 +57,6 @@ data object MoreTab : Tab {
@Composable
override fun Content() {
val context = LocalContext.current
val navigator = LocalNavigator.currentOrThrow
val screenModel = rememberScreenModel { MoreScreenModel() }
val downloadQueueState by screenModel.downloadQueueState.collectAsState()
@@ -72,6 +71,7 @@ data object MoreTab : Tab {
onClickStats = { navigator.push(StatsScreen()) },
onClickDataAndStorage = { navigator.push(SettingsScreen(SettingsScreen.Destination.DataAndStorage)) },
onClickSettings = { navigator.push(SettingsScreen()) },
onClickSupport = { navigator.push(SupportUsScreen()) },
onClickAbout = { navigator.push(SettingsScreen(SettingsScreen.Destination.About)) },
)
}
@@ -0,0 +1,143 @@
package mihon.feature.support
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.OpenInNew
import androidx.compose.material3.Card
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow
import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.more.settings.widget.TextPreferenceWidget
import eu.kanade.presentation.util.Screen
import tachiyomi.core.common.Constants
import tachiyomi.i18n.MR
import tachiyomi.presentation.core.components.material.padding
import tachiyomi.presentation.core.i18n.stringResource
import tachiyomi.presentation.core.icons.CustomIcons
import tachiyomi.presentation.core.icons.Discord
import tachiyomi.presentation.core.icons.OpenCollective
import tachiyomi.presentation.core.icons.Patreon
class SupportUsScreen : Screen() {
@Composable
override fun Content() {
val navigator = LocalNavigator.currentOrThrow
val uriHandler = LocalUriHandler.current
Scaffold(
topBar = {
AppBar(
title = stringResource(MR.strings.label_support_us),
navigateUp = navigator::pop,
)
},
) { paddingValues ->
Column(
verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small),
modifier = Modifier.verticalScroll(rememberScrollState()).padding(
remember(paddingValues) {
object : PaddingValues {
override fun calculateLeftPadding(layoutDirection: LayoutDirection): Dp {
return paddingValues.calculateLeftPadding(layoutDirection) +
MaterialTheme.padding.medium
}
override fun calculateTopPadding(): Dp {
return 0.dp
}
override fun calculateRightPadding(layoutDirection: LayoutDirection): Dp {
return paddingValues.calculateRightPadding(layoutDirection) +
MaterialTheme.padding.medium
}
override fun calculateBottomPadding(): Dp {
return 0.dp
}
}
},
),
) {
Spacer(modifier = Modifier.height(paddingValues.calculateTopPadding()))
Text(
text = stringResource(MR.strings.supportUsScreen_perks),
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(horizontal = MaterialTheme.padding.medium),
)
SupportItem(
icon = CustomIcons.Patreon,
title = stringResource(MR.strings.supportUsScreen_donationPlatform_patreon),
onClick = { uriHandler.openUri(Constants.URL_DONATE_PATREON) },
)
SupportItem(
icon = CustomIcons.OpenCollective,
title = stringResource(MR.strings.supportUsScreen_donationPlatform_opencollective),
onClick = { uriHandler.openUri(Constants.URL_DONATE_OPENCOLLECTIVE) },
)
Text(
text = stringResource(MR.strings.supportUsScreen_currentlySupportedBy, 200),
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(horizontal = MaterialTheme.padding.medium),
)
Text(
text = stringResource(MR.strings.supportUsScreen_contactForDetailsMessage),
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(horizontal = MaterialTheme.padding.medium),
)
SupportItem(
icon = CustomIcons.Discord,
title = stringResource(MR.strings.supportUsScreen_contactPlatform),
onClick = { uriHandler.openUri(Constants.URL_DISCORD) },
)
Spacer(modifier = Modifier.height(paddingValues.calculateBottomPadding()))
}
}
}
@Composable
private fun SupportItem(
icon: ImageVector,
title: String,
onClick: () -> Unit,
) {
Card {
TextPreferenceWidget(
title = title,
icon = icon,
widget = {
Icon(
imageVector = Icons.AutoMirrored.Filled.OpenInNew,
contentDescription = null,
)
},
onPreferenceClick = onClick,
)
}
}
}