Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
0450af2
Remove unnecessary dependencies from feature-flags-public
StylianosGakis Feb 13, 2026
98094b2
Merge feature-flag modules in one KMP compatible one
StylianosGakis Feb 13, 2026
9d029e3
Make data-termination and data-conversations kmp
StylianosGakis Feb 13, 2026
ad5d0b9
Make ui-emergency kmp
StylianosGakis Feb 13, 2026
2f6b4a7
Make navigation-compose-typed kmp
StylianosGakis Feb 13, 2026
32957cc
Make feature-help-center kmp
StylianosGakis Feb 13, 2026
54e5d2e
Make more of feature-help-center kmp
StylianosGakis Feb 16, 2026
de95289
Fallback to simple text for Markdown for iOS
StylianosGakis Feb 16, 2026
4239a29
Export help center feature in umbrella too
StylianosGakis Feb 16, 2026
fe7fe03
Fix identityHashCode for native too
StylianosGakis Feb 16, 2026
4730fa1
Export AccessTokenFetcher properly for iOS
StylianosGakis Feb 16, 2026
11e72ca
WIP Umbrella consumer
StylianosGakis Feb 16, 2026
7dd2a9e
Apply IDE fix to not double-build the Kotlin code when running Umbrella
StylianosGakis Feb 16, 2026
66d87ad
Fix using android specific code in HelpCenter code
StylianosGakis Feb 16, 2026
1a65abb
Commit automatic changes in project.pbxproj
StylianosGakis Feb 16, 2026
ab826ec
Use HedvigText as the fallback for MarkdownText for native
StylianosGakis Feb 16, 2026
052d5b4
Remove unused parameters
StylianosGakis Feb 17, 2026
9a8dd11
WIP
StylianosGakis Feb 17, 2026
4da7c1f
Merge branch 'develop' into feat/help-center-kmp
StylianosGakis Mar 12, 2026
de48f79
Fix using non KMP libs in commonMain
StylianosGakis Mar 12, 2026
50592da
Add bundleId name to the framework
StylianosGakis Mar 12, 2026
eb6a622
Test
StylianosGakis Mar 12, 2026
bd9d99a
Merge branch 'develop' into feat/help-center-kmp
StylianosGakis Mar 12, 2026
a88038e
WIP
StylianosGakis Mar 13, 2026
060c4b2
More work to make umbrella-consumer run
StylianosGakis Mar 31, 2026
6d4a38b
Fix iOS logger
StylianosGakis Apr 1, 2026
51436e5
Small fixes
StylianosGakis Apr 1, 2026
58ba2e0
Molecule needs to run on the Main Thread on native too
StylianosGakis Apr 1, 2026
d5c6b7e
Go edge-to-edge on the iOS app
StylianosGakis Apr 1, 2026
a36a96f
Small umbrella consumer app refactors
StylianosGakis Apr 7, 2026
e161db0
Create umbrella artifact from branch
StylianosGakis Apr 7, 2026
47fcd1d
Add umbrella on push paths
StylianosGakis Apr 7, 2026
0e2f516
Temp insets fix for iOS
StylianosGakis Apr 9, 2026
3847ae7
Make umbrella also have an android target
StylianosGakis Apr 10, 2026
fc62ae0
Delete some unused code
StylianosGakis Apr 10, 2026
dfbfdf0
Try without the otf files
StylianosGakis Apr 13, 2026
d687050
Remove paths since many more paths now are involved in Umbrella
StylianosGakis Apr 13, 2026
f39a826
Update the branch name on the umbrella workflow
StylianosGakis Apr 13, 2026
1645664
Temp delete font files to test the XCFramework without them
StylianosGakis Apr 13, 2026
9677ed8
Revert "Temp delete font files to test the XCFramework without them"
StylianosGakis Apr 13, 2026
18c4bbf
Revert "Try without the otf files"
StylianosGakis Apr 13, 2026
2371d34
Try to call Swift-provided lambda on the main thread
StylianosGakis Apr 13, 2026
f9f36d0
Provide the entire help-center feature in HelpCenterViewController
StylianosGakis Apr 13, 2026
cf326f1
Update umbrella-consumer to the new APIs
StylianosGakis Apr 13, 2026
3a79194
Merge branch 'develop' into bug/untangle-merge
StylianosGakis Apr 14, 2026
833b2ad
Try to delete the redeclarations
StylianosGakis Apr 14, 2026
30423b7
Provide an ImageLoader for iOS too
StylianosGakis Apr 14, 2026
179f2ea
Formatting
StylianosGakis Apr 14, 2026
9ab095b
Fix graph generating task
StylianosGakis Apr 17, 2026
2d6cc92
Update schema
StylianosGakis Apr 17, 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
6 changes: 1 addition & 5 deletions .github/workflows/umbrella.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,7 @@ on:
push:
branches:
- develop
- makerdays/chat-claim
paths:
- 'app/authlib/**'
- 'app/feature/feature-claim-chat/**'
- 'app/shareddi/**'
- feat/help-center-kmp
workflow_dispatch:

concurrency:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1728,6 +1728,11 @@ type ExternalInsurer {
displayName: String!
insurelyId: String
}
type FetchedExternalInsurance {
displayName: String!
subtitle: String
insurer: ExternalInsurer!
}
type FirstVetAction {
sections: [FirstVetSection!]!
}
Expand Down Expand Up @@ -2729,6 +2734,22 @@ type MemberPaymentAvailablePaymentMethod {
True if the member can set up this payment method for payout.
"""
supportsPayout: Boolean!
"""
True if this method is already ACTIVE for member and can be chosen as default directly without setup, false if
this is a new payment method that the member has not yet set up.
If this is true, then the `details` field will be populated with the payment method details. If this is false, then
the `details` field will be null since the member has not yet set up this payment method.
If true then this method can be set up as default directly by calling `paymentMethodSetDefaultPayin` or
`paymentMethodSetDefaultPayout` mutation depending on if it's a payin or payout method. If false, then the
corresponding mutation for setting up this payment method should be called, eg. `paymentMethodSetupTrustly`,
`paymentMethodSetupSwishPayin` etc.
"""
isActive: Boolean!
"""
For already connected and ACTIVE methods, ie isActive=true, specific details of the actual connection - e.g. a bank
account reference, phone number for swish, or email/kivra for invoice.
"""
details: PaymentMethodDetails
}
type MemberPaymentChargeMethodInfo {
"""
Expand Down Expand Up @@ -2801,48 +2822,75 @@ type MemberPaymentInformation {
}
type MemberPaymentMethod {
"""
The unique id of the payment method. This id is used for switching default and revoking payment methods.
"""
id: ID!
"""
Payment provider, eg Trustly, Swish, Nordea, Kivra etc.
Payment provider, eg Trustly, Swish, Nordea, Kivra etc.
This is used as the "identifier" of the payment method since there can only be one ACTIVE or PENDING payment method
per provider.
"""
provider: MemberPaymentProvider!
"""
The payment method status - ACTIVE, PENDING, or PENDING_DEFAULT.
PENDING_DEFAULT means the payment method is awaiting activation and will become default once activated.
The payment method status - ACTIVE, PENDING.
If ACTIVE, the payment method is ready to use for payins or payouts depending on if it's a payin or payout method.
If PENDING, the payment method has been set up but is still awaiting activation and cannot be used for payins or
payouts until then. Once activated, the status will change to ACTIVE.
"""
status: MemberPaymentMethodStatus!
"""
True if this is the default payment method. Only one ACTIVE payment method can be default at a time.
If status is PENDING then payment method will become the default once activated.
This is 'true' for only one of the members ACTIVE methods which is the default payment method that will be used for
charging or payout the member. For PENDING methods, this can also be 'true' if the member has chosen to set up this
payment method as default during the setup process.
"""
isDefault: Boolean!
"""
Specific details of the actual connection - e.g. a bank account reference, phone number for swish,
Specific details of the actual connection if method is ACTIVE - e.g. a bank account reference, phone number for swish,
or email/kivra for invoice.
"""
details: PaymentMethodDetails!
}
type MemberPaymentMethods {
"""
List of active and pending payment payin methods for this member.
List of all member's ACTIVE and PENDING payment payin methods.
A member can have multiple ACTIVE payment methods with these constraints:
- Only one ACTIVE payment method per provider, eg. one Trustly, one Swish, one Nordea etc.
- Only one ACTIVE payment method can be default at a time.
A member can have multiple PENDING payment methods with these constraints:
- Only one PENDING payment method per provider, eg. one Trustly, one Swish, one Nordea etc.
So there can exist max two payment methods per provider, one ACTIVE and one PENDING.
If a PENDING payment method has isDefault=true, then it will become the default ACTIVE payment method once activated.
"""
payinMethods: [MemberPaymentMethod!]!
"""
List of active and pending payment payout methods for this member.
List of all member's ACTIVE and PENDING payment payout methods.
A member can have multiple ACTIVE payment methods with these constraints:
- Only one ACTIVE payment method per provider, eg. one Trustly, one Swish, one Nordea etc.
- Only one ACTIVE payment method can be default at a time.
A member can have multiple PENDING payment methods with these constraints:
- Only one PENDING payment method per provider, eg. one Trustly, one Swish, one Nordea etc.
So there can exist max two payment methods per provider, one ACTIVE and one PENDING.
If a PENDING payment method has isDefault=true, then it will become the default ACTIVE payment method once activated.
"""
payoutMethods: [MemberPaymentMethod!]!
"""
The default payment method for payin if any.
The default payment method to use for payins if any.
Note that there can exist a PENDING payment method in `payinMethods` list with `isDefault`=true, in that case this default
payment method will be replaced by it once the pending method is activated.
"""
defaultPayinMethod: MemberPaymentMethod
"""
The default payment method for payout if any.
The default payment method to use for payouts if any.
Note that there can exist a PENDING payment method in `payoutMethods` list with `isDefault`=true, in that case this default
payment method will be replaced by it once the pending method is activated.
"""
defaultPayoutMethod: MemberPaymentMethod
"""
The available payment methods that the member can choose from when setting up a new payment method.
The available payment methods that the member can choose from when setting up a new payment method.
This list can include both payment methods that the member has already set up and new payment methods that the
member has not yet set up but are available to them. For already set up payment methods, the `isActive` field will
be true and the `details` field will be populated with the payment method details. For new payment methods that the
member has not yet set up, the `isActive` field will be false and the `details` field will be null.
If member picks a new payment method to set up, the corresponding mutation for setting up that payment method should
be called, eg. `paymentMethodSetupTrustly`, `paymentMethodSetupSwishPayin` etc.
If member picks an already set up payment method to set up as default, then `paymentMethodSetDefaultPayin` or
`paymentMethodSetDefaultPayout` mutation should be called depending on if it's a payin or payout method.
"""
availableMethods: [MemberPaymentAvailablePaymentMethod!]!
"""
Expand Down Expand Up @@ -3392,9 +3440,9 @@ type Mutation {
"""
Setup invoice payment method for the member. Kivra will be used as the provider if supported, else mail.
"""
paymentMethodSetupInvoicePayin(input: PaymentMethodSetupInvoicePayinInput!): PaymentMethodSetupOutput!
paymentMethodSetupInvoicePayin: PaymentMethodSetupOutput!
"""
Setup Trustly payment payin and payout method for the member.
Setup Trustly payment payin and payout method for the member. Requires member consent via redirect to Trustly URL in response.
"""
paymentMethodSetupTrustly(input: PaymentMethodSetupTrustlyInput!): PaymentMethodSetupOutput!
"""
Expand All @@ -3406,17 +3454,19 @@ type Mutation {
"""
paymentMethodSetupSwishPayout(input: PaymentMethodSetupSwishInput!): PaymentMethodSetupOutput!
"""
Setup Swish payin method for the member.
Setup Swish payin method for the member. Requires member consent in Swish app.
"""
paymentMethodSetupSwishPayin(input: PaymentMethodSetupSwishInput!): PaymentMethodSetupOutput!
"""
Revoke an active payment method. The member will be required to set up a new payment method if they revoke their default one.
A member can have multiple ACTIVE payment methods where one of those is default. This mutation changes the
members default payment method for charging to any of his/hers other active payment methods.
"""
paymentMethodRevoke(id: ID!): UserError
paymentMethodSetDefaultPayin(provider: MemberPaymentProvider!): UserError
"""
Set an active payment method as default.
A member can have multiple ACTIVE payment methods where one of those is default. This mutation changes the
members default payment method for payouts to any of his/hers other active payment methods.
"""
paymentMethodSetDefault(id: ID!): UserError
paymentMethodSetDefaultPayout(provider: MemberPaymentProvider!): UserError
"""
Start a conversation. This is effectively creating one, but with two slight differences from a regular
"create something"-mutation:
Expand Down Expand Up @@ -3707,17 +3757,7 @@ type PaymentMethodInvoiceDetails {
"""
email: String
}
input PaymentMethodSetupInvoicePayinInput {
"""
Set up invoice payment method as default.
"""
setAsDefaultPayout: Boolean!
}
input PaymentMethodSetupNordeaPayoutInput {
"""
Set up Nordea payout method as default.
"""
setAsDefault: Boolean!
"""
The clearing number for member's bank account.
"""
Expand Down Expand Up @@ -3756,24 +3796,12 @@ enum PaymentMethodSetupStatus {
FAILED
}
input PaymentMethodSetupSwishInput {
"""
Set up Swish payment method as default.
"""
setAsDefault: Boolean!
"""
The Swish mobile number to use for payout or payin.
"""
phoneNumber: String!
}
input PaymentMethodSetupTrustlyInput {
"""
Set up Trustly payment method as default for payin.
"""
setAsDefaultPayin: Boolean!
"""
Set up Trustly payment method as default for payout.
"""
setAsDefaultPayout: Boolean!
"""
The URL to redirect the member back to after a successful setup after Trustly onboarding.
"""
Expand Down Expand Up @@ -3905,6 +3933,11 @@ type PriceIntent {
When 'true' it means user has gone trough Insurely flow with that price intent
"""
hasCollectedInsurelyData: Boolean!
"""
List of external insurances fetched via Insurely that correspond to products Hedvig offers.
Null when no Insurely data collection has been associated with this price intent.
"""
fetchedExternalInsurances: [FetchedExternalInsurance!]
}
enum PriceIntentAnimal {
CAT
Expand Down
3 changes: 1 addition & 2 deletions app/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,7 @@ dependencies {
implementation(projects.featureCrossSellSheet)
implementation(projects.featureDeleteAccount)
implementation(projects.featureEditCoinsured)
implementation(projects.featureFlagsAndroid)
implementation(projects.featureFlagsPublic)
implementation(projects.featureFlags)
implementation(projects.featureForever)
implementation(projects.featureHelpCenter)
implementation(projects.featureHome)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ val applicationModule = module {
)
}

private class AndroidBuildConfig() : AppBuildConfig {
private class AndroidBuildConfig : AppBuildConfig {
override val debug: Boolean = BuildConfig.DEBUG
override val applicationId: String = BuildConfig.APPLICATION_ID
override val buildType: String = BuildConfig.BUILD_TYPE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,7 @@ internal fun HedvigNavHost(
helpCenterGraph(
hedvigDeepLinkContainer = hedvigDeepLinkContainer,
navController = navController,
onNavigateUp = navController::navigateUp,
onNavigateToQuickLink = onNavigateToQuickLink@{ quickLinkDestination ->
val destination: Destination = when (quickLinkDestination) {
QuickLinkChangeAddress -> {
Expand Down
1 change: 1 addition & 0 deletions app/core/core-datastore-public/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id("hedvig.multiplatform.library")
id("hedvig.multiplatform.library.android")
id("hedvig.gradle.plugin")
alias(libs.plugins.kmpNativeCoroutines)
}

kotlin {
Expand Down
1 change: 0 additions & 1 deletion app/core/core-resources/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ lokalise {
kotlin {
androidLibrary {
namespace = "hedvig.resources"
@Suppress("UnstableApiUsage")
androidResources.enable = true
}
sourceSets {
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion app/data/data-addons/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ dependencies {
implementation(projects.apolloOctopusPublic)
implementation(projects.coreCommonPublic)
implementation(projects.coreDemoMode)
implementation(projects.featureFlagsPublic)
implementation(projects.featureFlags)

testImplementation(libs.apollo.testingSupport)
testImplementation(libs.assertK)
Expand Down
2 changes: 1 addition & 1 deletion app/data/data-changetier/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ dependencies {
implementation(projects.dataContract)
implementation(projects.dataCrossSellAfterFlow)
implementation(projects.dataProductVariantPublic)
implementation(projects.featureFlagsPublic)
implementation(projects.featureFlags)
implementation(projects.uiTiersAndAddons)

testImplementation(libs.apollo.testingSupport)
Expand Down
19 changes: 12 additions & 7 deletions app/data/data-conversations/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
plugins {
id("hedvig.jvm.library")
id("hedvig.multiplatform.library")
id("hedvig.gradle.plugin")
}

hedvig {
apollo("octopus")
}

dependencies {
implementation(libs.apollo.normalizedCache)
implementation(libs.arrow.core)
implementation(libs.koin.core)
implementation(projects.apolloCore)
implementation(projects.apolloOctopusPublic)
kotlin {
sourceSets {
commonMain.dependencies {
implementation(libs.apollo.normalizedCache)
implementation(libs.arrow.core)
implementation(libs.koin.core)
implementation(projects.apolloCore)
implementation(projects.apolloOctopusPublic)
implementation(projects.loggingPublic)
}
}
}
30 changes: 17 additions & 13 deletions app/data/data-termination/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
plugins {
id("hedvig.jvm.library")
id("hedvig.multiplatform.library")
id("hedvig.gradle.plugin")
}

hedvig {
apollo("octopus")
}

dependencies {
implementation(libs.apollo.normalizedCache)
implementation(libs.apollo.runtime)
implementation(libs.arrow.core)
implementation(libs.koin.core)
implementation(libs.kotlinx.datetime)
implementation(projects.apolloCore)
implementation(projects.apolloOctopusPublic)
implementation(projects.coreCommonPublic)
implementation(projects.coreUiData)
implementation(projects.dataContract)
implementation(projects.featureFlagsPublic)
kotlin {
sourceSets {
commonMain.dependencies {
implementation(libs.apollo.normalizedCache)
implementation(libs.apollo.runtime)
implementation(libs.arrow.core)
implementation(libs.koin.core)
implementation(libs.kotlinx.datetime)
implementation(projects.apolloCore)
implementation(projects.apolloOctopusPublic)
implementation(projects.coreCommonPublic)
implementation(projects.coreUiData)
implementation(projects.dataContract)
implementation(projects.featureFlags)
}
}
}
10 changes: 7 additions & 3 deletions app/datadog/datadog-core/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
plugins {
id("hedvig.jvm.library")
id("hedvig.multiplatform.library")
id("hedvig.gradle.plugin")
}

dependencies {
implementation(libs.coroutines.core)
kotlin {
sourceSets {
commonMain.dependencies {
implementation(libs.coroutines.core)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.isSpecified
import com.hedvig.android.design.system.hedvig.internal.identityHashCode
import kotlin.math.roundToInt

/**
Expand All @@ -36,7 +37,7 @@ internal object MinimumInteractiveModifier : ModifierNodeElement<MinimumInteract
"interactions if the element would measure smaller"
}

override fun hashCode(): Int = System.identityHashCode(this)
override fun hashCode(): Int = identityHashCode(this)

override fun equals(other: Any?) = (other === this)
}
Expand Down
Loading
Loading