From 612b06d6a88fa51d9b14ac8425aaa72a5f6c0884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Ma=C5=A1a?= Date: Thu, 19 Sep 2024 20:29:49 +0200 Subject: [PATCH] Add feedback form link --- .../common/core/ui/primitives/UserTipCard.kt | 47 +++++++++++++++---- .../common/partyList/PartyListScreen.kt | 20 +++++++- .../moko-resources/base/strings.xml | 1 + 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/primitives/UserTipCard.kt b/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/primitives/UserTipCard.kt index d075aebf4..526b3a8ef 100644 --- a/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/primitives/UserTipCard.kt +++ b/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/core/ui/primitives/UserTipCard.kt @@ -2,14 +2,17 @@ package cz.frantisekmasa.wfrp_master.common.core.ui.primitives import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding import androidx.compose.material.Card import androidx.compose.material.Icon +import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.material.TextButton import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Close import androidx.compose.material.icons.rounded.Highlight import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -19,11 +22,13 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.unit.dp import cz.frantisekmasa.wfrp_master.common.Str import cz.frantisekmasa.wfrp_master.common.core.domain.NamedEnum import cz.frantisekmasa.wfrp_master.common.core.domain.localizedName +import cz.frantisekmasa.wfrp_master.common.core.shared.rememberUrlOpener import cz.frantisekmasa.wfrp_master.common.core.tips.DismissedUserTipsHolder import cz.frantisekmasa.wfrp_master.common.core.ui.dialogs.AlertDialog import cz.frantisekmasa.wfrp_master.common.core.ui.flow.collectWithLifecycle @@ -37,6 +42,7 @@ import org.kodein.di.compose.rememberInstance fun UserTipCard( tip: UserTip, modifier: Modifier = Modifier, + shape: Shape = MaterialTheme.shapes.medium, ) { val dismissedTipsHolder: DismissedUserTipsHolder by rememberInstance() val dismissedTips = dismissedTipsHolder.dismissedTips.collectWithLifecycle(null).value @@ -85,6 +91,7 @@ fun UserTipCard( val isLightTheme = MaterialTheme.colors.isLight Card( + shape = shape, backgroundColor = if (isLightTheme) { Theme.fixedColors.warning @@ -92,23 +99,45 @@ fun UserTipCard( MaterialTheme.colors.surface }, border = if (isLightTheme) null else BorderStroke(1.dp, Theme.fixedColors.warning), - modifier = modifier.clickable { dialogVisible = true }, ) { + val urlOpener = rememberUrlOpener() Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(Spacing.small), + horizontalArrangement = Arrangement.SpaceBetween, + modifier = + modifier + .let { + if (tip.link != null) { + it.clickable { urlOpener.open(tip.link, isGooglePlayLink = false) } + } else { + it + } + } + .padding(Spacing.small), ) { - Icon(Icons.Rounded.Highlight, null, Modifier.padding(end = Spacing.medium)) - Text( - tip.localizedName, - style = MaterialTheme.typography.body2, - fontStyle = FontStyle.Italic, - ) + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(Spacing.small), + ) { + Icon(Icons.Rounded.Highlight, null, Modifier.padding(end = Spacing.medium)) + Text( + tip.localizedName, + style = MaterialTheme.typography.body2, + fontStyle = FontStyle.Italic, + ) + } + IconButton(onClick = { dialogVisible = true }) { + Icon(Icons.Rounded.Close, stringResource(Str.common_ui_button_dismiss)) + } } } } -enum class UserTip(override val translatableName: StringResource) : NamedEnum { +enum class UserTip( + override val translatableName: StringResource, + val link: String? = null, +) : NamedEnum { ARMOUR_TRAPPINGS(Str.armour_tip_trappings), COMPENDIUM_LINK_MOVED(Str.parties_messages_compendium_card_moved), + FEEDBACK_FORM(Str.common_ui_tip_feedback_form, "https://forms.gle/YJEECqLbn6sZWYCu9"), } diff --git a/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/partyList/PartyListScreen.kt b/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/partyList/PartyListScreen.kt index 150f9640c..9f0ca6c83 100644 --- a/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/partyList/PartyListScreen.kt +++ b/common/src/commonMain/kotlin/cz/frantisekmasa/wfrp_master/common/partyList/PartyListScreen.kt @@ -3,13 +3,17 @@ package cz.frantisekmasa.wfrp_master.common.partyList import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.Divider import androidx.compose.material.ExtendedFloatingActionButton import androidx.compose.material.Icon import androidx.compose.material.ListItem +import androidx.compose.material.MaterialTheme import androidx.compose.material.Scaffold import androidx.compose.material.Text import androidx.compose.material.TopAppBar @@ -51,6 +55,8 @@ import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.FloatingActionsMen import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.ItemIcon import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.MenuState import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.Spacing +import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.UserTip +import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.UserTipCard import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.VISUAL_ONLY_ICON_DESCRIPTION import cz.frantisekmasa.wfrp_master.common.core.ui.primitives.rememberScreenModel import cz.frantisekmasa.wfrp_master.common.gameMaster.GameMasterScreen @@ -252,8 +258,20 @@ fun PartyList( ) { LazyColumn( Modifier.fillMaxHeight(), - contentPadding = PaddingValues(top = Spacing.medium, bottom = Spacing.bottomPaddingUnderFab), + contentPadding = PaddingValues(bottom = Spacing.bottomPaddingUnderFab), ) { + item { + UserTipCard( + UserTip.FEEDBACK_FORM, + modifier = Modifier.fillMaxWidth(), + shape = MaterialTheme.shapes.large, + ) + } + + item { + Spacer(modifier = Modifier.height(Spacing.medium)) + } + items(parties, key = { it.id }) { item -> WithContextMenu( onClick = { onClick(item) }, diff --git a/common/src/commonMain/moko-resources/base/strings.xml b/common/src/commonMain/moko-resources/base/strings.xml index 59cf59619..dc23a94fe 100644 --- a/common/src/commonMain/moko-resources/base/strings.xml +++ b/common/src/commonMain/moko-resources/base/strings.xml @@ -295,6 +295,7 @@ Markdown formatting is supported No items Select All + Do you have 3 minutes to share feedback? days hours minutes