Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
68b03ee
wip
panasetskaya May 20, 2026
5958808
Merge branch 'develop' into feat/maker-days-swish-payin
panasetskaya May 20, 2026
c973287
setup invoice payin
panasetskaya May 20, 2026
4ce872c
di and renaming
panasetskaya May 20, 2026
3e9a3d1
PayinAccountOverviewDestination
panasetskaya May 20, 2026
fb10cc9
navgraph change
panasetskaya May 20, 2026
d0d5a42
active methods first iteration
panasetskaya May 20, 2026
425c908
SetAsDefaultUseCase
panasetskaya May 20, 2026
8aafceb
default and pending state
panasetskaya May 21, 2026
d4af5ce
swish payin impl
panasetskaya May 21, 2026
c31397a
always show Manage payment methods
panasetskaya May 21, 2026
6d760c9
help center nav
panasetskaya May 21, 2026
d6cafce
ReminderCardConnectPayment copy
panasetskaya May 21, 2026
493621d
qrcode and swish icon
panasetskaya May 21, 2026
fff8a29
don't pass on the error message if not user error
panasetskaya May 21, 2026
e7291a3
safeExecuteAllowingPartialResponses
panasetskaya May 22, 2026
cb10b86
icons in overview
panasetskaya May 22, 2026
f0da87a
icons in select
panasetskaya May 22, 2026
6762015
copy
panasetskaya May 22, 2026
9a1421a
bank name
panasetskaya May 22, 2026
ff702a1
format phone
panasetskaya May 22, 2026
0042aa5
copy
panasetskaya May 22, 2026
46c4633
icons in select payout method
panasetskaya May 22, 2026
f2c4c70
ktlint
panasetskaya May 22, 2026
a2463a0
border and color for qr
panasetskaya May 22, 2026
8f98db7
border and color for qr
panasetskaya May 22, 2026
d1c9929
copy
panasetskaya May 22, 2026
335c488
safeExecuteAllowingPartialResponses in SetAsDefaultUseCase.kt
panasetskaya May 22, 2026
cf0c0e0
copy and phone number digit filtering
panasetskaya May 22, 2026
c463111
remove logs
panasetskaya May 22, 2026
1d304ef
add multiscreen previews
panasetskaya May 22, 2026
f2722a7
Merge branch 'develop' into feat/maker-days-swish-payin
panasetskaya Aug 18, 2026
cd415a1
bring module up to date with DI and nav
panasetskaya Aug 18, 2026
fc5726c
Merge branch 'develop' into feat/maker-days-swish-payin
panasetskaya Aug 20, 2026
cc4defc
remove logs
panasetskaya Aug 26, 2026
3f9f0cb
always show payment details
panasetskaya Aug 26, 2026
c1e9bb6
navigation to Payin module
panasetskaya Aug 26, 2026
d111bf4
connectPayment deeplink leads to payin overview now. scrollability
panasetskaya Aug 31, 2026
c0579e9
show member details even if default active is none
panasetskaya Aug 31, 2026
653a86c
Merge branch 'develop' into feat/maker-days-swish-payin
panasetskaya Aug 31, 2026
495d925
member reminders lead to payin overview
panasetskaya Aug 31, 2026
a39ea3d
onboarding step leads to payin overview
panasetskaya Aug 31, 2026
081c039
check isDefault
panasetskaya Aug 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import com.hedvig.android.apollo.ApolloOperationError.OperationError
import com.hedvig.android.apollo.ApolloOperationError.OperationException
import com.hedvig.android.apollo.parseResponse
import com.hedvig.android.core.common.ErrorMessage
import com.hedvig.android.logger.logcat
import kotlin.jvm.JvmInline
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
Expand Down Expand Up @@ -175,10 +176,21 @@ private fun <D : Operation.Data> iorFromErrorsAndData(
data: D?,
): Ior<Nel<ApolloOperationError>, D> {
return when {
errors != null && data != null -> Ior.Both(errors, data)
errors != null -> Ior.Left(errors)
data != null -> Ior.Right(data)
else -> error("Non compliant server")
errors != null && data != null -> {
Ior.Both(errors, data)
}

errors != null -> {
Ior.Left(errors)
}

data != null -> {
Ior.Right(data)
}

else -> {
error("Non compliant server")
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions app/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,8 @@ dependencies {
implementation(projects.featureOnboarding)

implementation(projects.featureRemoveAddons)
implementation(projects.featurePayinAccount)
implementation(projects.featurePayinAccountNavigation)
implementation(projects.featurePayoutAccount)
implementation(projects.featurePayments)
implementation(projects.featureProfile)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ import com.hedvig.android.feature.movingflow.SelectContractForMovingKey
import com.hedvig.android.feature.movingflow.movingFlowEntries
import com.hedvig.android.feature.onboarding.data.ResetOnboardingSeenUseCase
import com.hedvig.android.feature.onboarding.navigation.onboardingEntries
import com.hedvig.android.feature.payin.account.navigation.PayinAccountKey
import com.hedvig.android.feature.payin.account.navigation.payinAccountEntries
import com.hedvig.android.feature.payments.navigation.paymentsEntries
import com.hedvig.android.feature.payoutaccount.navigation.PayoutAccountKey
import com.hedvig.android.feature.payoutaccount.navigation.payoutAccountEntries
Expand Down Expand Up @@ -105,6 +107,7 @@ internal fun EntryProviderScope<HedvigNavKey>.hedvigEntryProvider(
) {
val shouldShowRequestPermissionRationale: (String) -> Boolean = androidAppHost::shouldShowPermissionRationale
val navigateToConnectPayment: () -> Unit = { backstack.add(TrustlyKey) }
val navigateToPayinAccount: () -> Unit = { backstack.add(PayinAccountKey) }
val navigateToPayoutAccount: () -> Unit = { backstack.add(PayoutAccountKey) }
val navigateToInbox: () -> Unit = { backstack.add(InboxKey) }
val navigateToNewConversation: () -> Unit = { backstack.add(ChatKey(Uuid.randomUUID().toString())) }
Expand Down Expand Up @@ -136,7 +139,7 @@ internal fun EntryProviderScope<HedvigNavKey>.hedvigEntryProvider(
navigateToNewConversation = navigateToNewConversation,
navigateToConversation = navigateToConversation,
navigateToInbox = navigateToInbox,
navigateToConnectPayment = navigateToConnectPayment,
navigateToPayinAccount = navigateToPayinAccount,
navigateToPayoutAccount = navigateToPayoutAccount,
navigateToTravelCertificate = navigateToTravelCertificate,
navigateToAddonPurchaseFlow = navigateToAddonPurchaseFlow,
Expand All @@ -158,7 +161,9 @@ internal fun EntryProviderScope<HedvigNavKey>.hedvigEntryProvider(
addPaymentsEntries(
backstack = backstack,
globalSnackBarState = globalSnackBarState,
openUrl = openUrl,
navigateToConnectPayment = navigateToConnectPayment,
navigateToPayinAccount = navigateToPayinAccount,
navigateToPayoutAccount = navigateToPayoutAccount,
navigateToNewConversation = navigateToNewConversation,
)
Expand All @@ -169,7 +174,7 @@ internal fun EntryProviderScope<HedvigNavKey>.hedvigEntryProvider(
languageService = languageService,
externalNavigator = externalNavigator,
openUrl = openUrl,
navigateToConnectPayment = navigateToConnectPayment,
navigateToPayinAccount = navigateToPayinAccount,
navigateToPayoutAccount = navigateToPayoutAccount,
navigateToNewConversation = navigateToNewConversation,
onResetOnboardingForDebug = {
Expand Down Expand Up @@ -243,7 +248,7 @@ private fun EntryProviderScope<HedvigNavKey>.addHomeEntries(
navigateToNewConversation: () -> Unit,
navigateToConversation: (String) -> Unit,
navigateToInbox: () -> Unit,
navigateToConnectPayment: () -> Unit,
navigateToPayinAccount: () -> Unit,
navigateToPayoutAccount: () -> Unit,
navigateToTravelCertificate: () -> Unit,
navigateToAddonPurchaseFlow: (List<String>) -> Unit,
Expand All @@ -267,7 +272,7 @@ private fun EntryProviderScope<HedvigNavKey>.addHomeEntries(
onNavigateToInbox = navigateToInbox,
onNavigateToNewConversation = navigateToNewConversation,
navigateToClaimDetails = { claimId -> backstack.add(ClaimDetailsKey(claimId)) },
navigateToConnectPayment = navigateToConnectPayment,
navigateToConnectPayment = navigateToPayinAccount,
navigateToConnectPayout = navigateToPayoutAccount,
navigateToContactInfo = { backstack.add(ContactInfoKey) },
navigateToMissingInfo = { contractId: String, type: CoInsuredFlowType ->
Expand Down Expand Up @@ -458,13 +463,16 @@ private fun EntryProviderScope<HedvigNavKey>.addInsuranceEntries(
private fun EntryProviderScope<HedvigNavKey>.addPaymentsEntries(
backstack: BackstackController,
globalSnackBarState: GlobalSnackBarState,
openUrl: (String) -> Unit,
navigateToConnectPayment: () -> Unit,
navigateToPayinAccount: () -> Unit,
navigateToPayoutAccount: () -> Unit,
navigateToNewConversation: () -> Unit,
) {
paymentsEntries(
backstack = backstack,
navigateToConnectPayment = navigateToConnectPayment,
navigateToPayinAccount = navigateToPayinAccount,
navigateToPayoutAccount = navigateToPayoutAccount,
openConversation = navigateToNewConversation,
)
Expand All @@ -473,6 +481,12 @@ private fun EntryProviderScope<HedvigNavKey>.addPaymentsEntries(
globalSnackBarState = globalSnackBarState,
navigateToConnectPayment = navigateToConnectPayment,
)
payinAccountEntries(
backstack = backstack,
globalSnackBarState = globalSnackBarState,
navigateToConnectPayment = navigateToConnectPayment,
openUrl = openUrl,
)
connectPaymentEntries(backstack = backstack)
}

Expand All @@ -483,7 +497,7 @@ private fun EntryProviderScope<HedvigNavKey>.addProfileEntries(
languageService: LanguageService,
externalNavigator: ExternalNavigator,
openUrl: (String) -> Unit,
navigateToConnectPayment: () -> Unit,
navigateToPayinAccount: () -> Unit,
navigateToPayoutAccount: () -> Unit,
navigateToNewConversation: () -> Unit,
onResetOnboardingForDebug: () -> Unit,
Expand All @@ -501,7 +515,7 @@ private fun EntryProviderScope<HedvigNavKey>.addProfileEntries(
globalSnackBarState = globalSnackBarState,
backstack = backstack,
hedvigBuildConstants = hedvigBuildConstants,
navigateToConnectPayment = navigateToConnectPayment,
navigateToConnectPayment = navigateToPayinAccount,
navigateToConnectPayout = navigateToPayoutAccount,
navigateToAddMissingInfo = { contractId: String, type: CoInsuredFlowType ->
backstack.add(CoInsuredAddInfoKey(contractId, type))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ fun HedvigButtonGhostWithBorder(
enabled: Boolean = true,
interactionSource: MutableInteractionSource? = null,
size: ButtonSize = ButtonSize.Medium,
isLoading: Boolean = false,
) {
HedvigTextButton(
text = text,
Expand All @@ -275,6 +276,7 @@ fun HedvigButtonGhostWithBorder(
),
buttonSize = size,
interactionSource = interactionSource,
isLoading = isLoading,
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hedvig.android.design.system.hedvig

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
Expand Down Expand Up @@ -37,6 +38,7 @@ import com.hedvig.android.design.system.hedvig.icon.CheckFilled
import com.hedvig.android.design.system.hedvig.icon.HedvigIcons
import com.hedvig.android.design.system.hedvig.icon.InfoFilled
import com.hedvig.android.design.system.hedvig.icon.WarningFilled
import com.hedvig.android.design.system.hedvig.icon.colored.Swish
import com.hedvig.android.design.system.hedvig.tokens.EmptyStateTokens

@Composable
Expand Down Expand Up @@ -148,6 +150,15 @@ private fun ColumnScope.EmptyStateIcon(iconStyle: EmptyStateIconStyle) {
)
Spacer(Modifier.height(16.dp))
}

EmptyStateIconStyle.SWISH -> {
Image(
HedvigIcons.Swish,
null,
modifier = Modifier.size(48.dp),
)
Spacer(Modifier.height(16.dp))
}
}
}

Expand All @@ -162,6 +173,8 @@ object EmptyStateDefaults {
BANK_ID,
NO_ICON,
SUCCESS_WITH_WARNING,

SWISH,
}

sealed class EmptyStateButtonStyle {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
package com.hedvig.android.design.system.hedvig.icon

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.path
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.hedvig.android.design.system.hedvig.HedvigTheme
import com.hedvig.android.design.system.hedvig.Icon
import com.hedvig.android.design.system.hedvig.icon.colored.Swish

val HedvigIcons.Autogiro: ImageVector
get() {
if (_NounCardSubscriptionPayment8118834 != null) {
return _NounCardSubscriptionPayment8118834!!
}
_NounCardSubscriptionPayment8118834 = ImageVector.Builder(
name = "NounCardSubscriptionPayment8118834",
defaultWidth = 110.dp,
defaultHeight = 135.dp,
viewportWidth = 110f,
viewportHeight = 135f,
).apply {
path(fill = SolidColor(Color.Black)) {
moveToRelative(93.54f, 57.92f)
verticalLineToRelative(-6.67f)
curveToRelative(0f, -4.71f, -0f, -8.07f, -0.22f, -10.69f)
curveToRelative(-0.21f, -2.59f, -0.61f, -4.19f, -1.26f, -5.46f)
curveToRelative(-1.3f, -2.55f, -3.37f, -4.62f, -5.92f, -5.92f)
curveToRelative(-1.27f, -0.64f, -2.87f, -1.05f, -5.46f, -1.26f)
curveToRelative(-2.62f, -0.21f, -5.98f, -0.22f, -10.69f, -0.22f)
horizontalLineToRelative(-30f)
curveToRelative(-4.71f, 0f, -8.07f, 0f, -10.69f, 0.22f)
curveToRelative(-2.59f, 0.21f, -4.19f, 0.61f, -5.46f, 1.26f)
curveToRelative(-2.55f, 1.3f, -4.62f, 3.37f, -5.92f, 5.92f)
curveToRelative(-0.64f, 1.27f, -1.05f, 2.87f, -1.26f, 5.46f)
curveToRelative(-0.21f, 2.62f, -0.22f, 5.98f, -0.22f, 10.69f)
verticalLineToRelative(13.33f)
curveToRelative(0f, 4.72f, 0f, 8.07f, 0.22f, 10.69f)
curveToRelative(0.21f, 2.59f, 0.61f, 4.19f, 1.26f, 5.46f)
curveToRelative(1.3f, 2.55f, 3.37f, 4.62f, 5.92f, 5.92f)
curveToRelative(1.27f, 0.64f, 2.87f, 1.05f, 5.46f, 1.26f)
curveToRelative(2.62f, 0.21f, 5.98f, 0.21f, 10.69f, 0.21f)
horizontalLineToRelative(17.08f)
curveToRelative(1.73f, 0f, 3.13f, 1.4f, 3.13f, 3.13f)
reflectiveCurveToRelative(-1.4f, 3.13f, -3.13f, 3.13f)
horizontalLineToRelative(-17.08f)
curveToRelative(-4.61f, 0f, -8.27f, 0f, -11.2f, -0.23f)
curveToRelative(-2.97f, -0.25f, -5.49f, -0.75f, -7.79f, -1.92f)
curveToRelative(-3.72f, -1.9f, -6.75f, -4.93f, -8.65f, -8.65f)
curveToRelative(-1.17f, -2.3f, -1.68f, -4.81f, -1.92f, -7.78f)
curveToRelative(-0.24f, -2.94f, -0.24f, -6.59f, -0.24f, -11.2f)
verticalLineToRelative(-13.33f)
curveToRelative(0f, -4.61f, -0f, -8.27f, 0.24f, -11.2f)
curveToRelative(0.24f, -2.97f, 0.75f, -5.49f, 1.92f, -7.79f)
curveToRelative(1.9f, -3.72f, 4.93f, -6.75f, 8.65f, -8.65f)
curveToRelative(2.3f, -1.17f, 4.81f, -1.68f, 7.79f, -1.92f)
curveToRelative(2.93f, -0.24f, 6.59f, -0.24f, 11.2f, -0.24f)
horizontalLineToRelative(30f)
curveToRelative(4.61f, 0f, 8.27f, -0f, 11.2f, 0.24f)
curveToRelative(2.97f, 0.24f, 5.49f, 0.75f, 7.79f, 1.92f)
curveToRelative(3.72f, 1.9f, 6.75f, 4.93f, 8.65f, 8.65f)
curveToRelative(1.17f, 2.3f, 1.68f, 4.81f, 1.92f, 7.79f)
curveToRelative(0.24f, 2.93f, 0.24f, 6.59f, 0.24f, 11.2f)
verticalLineToRelative(6.67f)
curveToRelative(0f, 1.72f, -1.4f, 3.13f, -3.13f, 3.13f)
curveToRelative(-1.73f, 0f, -3.13f, -1.4f, -3.13f, -3.13f)
close()
}
path(fill = SolidColor(Color.Black)) {
moveToRelative(94.58f, 42.29f)
verticalLineToRelative(6.25f)
horizontalLineToRelative(-79.16f)
verticalLineToRelative(-6.25f)
close()
}
path(fill = SolidColor(Color.Black)) {
moveToRelative(46.67f, 71.46f)
curveToRelative(1.72f, 0f, 3.13f, 1.4f, 3.13f, 3.13f)
curveToRelative(0f, 1.73f, -1.4f, 3.13f, -3.13f, 3.13f)
horizontalLineToRelative(-20.84f)
curveToRelative(-1.72f, 0f, -3.13f, -1.4f, -3.13f, -3.13f)
curveToRelative(0f, -1.72f, 1.4f, -3.13f, 3.13f, -3.13f)
close()
}
path(fill = SolidColor(Color.Black)) {
moveToRelative(93.54f, 76.67f)
curveToRelative(0f, -2.88f, -2.33f, -5.21f, -5.21f, -5.21f)
horizontalLineToRelative(-18.75f)
curveToRelative(-1.72f, 0f, -3.13f, -1.4f, -3.13f, -3.13f)
curveToRelative(0f, -1.72f, 1.4f, -3.13f, 3.13f, -3.13f)
horizontalLineToRelative(18.75f)
curveToRelative(6.33f, 0f, 11.46f, 5.13f, 11.46f, 11.46f)
curveToRelative(0f, 1.72f, -1.4f, 3.13f, -3.13f, 3.13f)
curveToRelative(-1.73f, 0f, -3.13f, -1.4f, -3.13f, -3.13f)
close()
}
path(fill = SolidColor(Color.Black)) {
moveToRelative(71.54f, 59.88f)
curveToRelative(1.22f, -1.22f, 3.2f, -1.22f, 4.42f, 0f)
curveToRelative(1.22f, 1.22f, 1.22f, 3.2f, 0f, 4.42f)
lineToRelative(-4.04f, 4.04f)
lineToRelative(4.04f, 4.04f)
curveToRelative(1.22f, 1.22f, 1.22f, 3.2f, 0f, 4.42f)
curveToRelative(-1.22f, 1.22f, -3.2f, 1.22f, -4.42f, 0f)
lineToRelative(-6.25f, -6.25f)
curveToRelative(-1.22f, -1.22f, -1.22f, -3.2f, 0f, -4.42f)
close()
}
path(fill = SolidColor(Color.Black)) {
moveToRelative(70.63f, 82.92f)
curveToRelative(0f, 2.88f, 2.33f, 5.21f, 5.21f, 5.21f)
horizontalLineToRelative(18.75f)
curveToRelative(1.73f, 0f, 3.13f, 1.4f, 3.13f, 3.13f)
reflectiveCurveToRelative(-1.4f, 3.13f, -3.13f, 3.13f)
horizontalLineToRelative(-18.75f)
curveToRelative(-6.33f, 0f, -11.46f, -5.13f, -11.46f, -11.46f)
curveToRelative(0f, -1.73f, 1.4f, -3.13f, 3.13f, -3.13f)
reflectiveCurveToRelative(3.13f, 1.4f, 3.13f, 3.13f)
close()
}
path(fill = SolidColor(Color.Black)) {
moveToRelative(92.63f, 99.71f)
curveToRelative(-1.22f, 1.22f, -3.2f, 1.22f, -4.42f, 0f)
curveToRelative(-1.22f, -1.22f, -1.22f, -3.2f, 0f, -4.42f)
lineToRelative(4.04f, -4.04f)
lineToRelative(-4.04f, -4.04f)
curveToRelative(-1.22f, -1.22f, -1.22f, -3.2f, 0f, -4.42f)
curveToRelative(1.22f, -1.22f, 3.2f, -1.22f, 4.42f, 0f)
lineToRelative(6.25f, 6.25f)
curveToRelative(1.22f, 1.22f, 1.22f, 3.2f, 0f, 4.42f)
close()
}
}.build()

return _NounCardSubscriptionPayment8118834!!
}

@Suppress("ObjectPropertyName")
private var _NounCardSubscriptionPayment8118834: ImageVector? = null

@Preview
@Composable
private fun IconPreview() {
HedvigTheme {
Column(
verticalArrangement = Arrangement.spacedBy(8.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Icon(
imageVector = HedvigIcons.Autogiro,
contentDescription = com.hedvig.android.compose.ui.EmptyContentDescription,
modifier = Modifier
.width((24.0).dp)
.height((24.0).dp),
)
}
}
}
Loading
Loading