Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit ce1434b0 authored by Wolf-Martell Montwé's avatar Wolf-Martell Montwé
Browse files

Change contribution views to react on purchase and contribution errors along with nicer UI

parent b180cc72
Loading
Loading
Loading
Loading
+45 −4
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.funding.googleplay.domain.DomainContract
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State

@Composable
@@ -13,9 +14,12 @@ fun ContributionContentPreview() {
    PreviewWithTheme {
        ContributionContent(
            state = State(
                listState = ContributionListState(
                    recurringContributions = FakeData.recurringContributions,
                    oneTimeContributions = FakeData.oneTimeContributions,
                    selectedContribution = FakeData.recurringContributions.first(),
                    isLoading = false,
                ),
            ),
            onEvent = {},
            contentPadding = PaddingValues(),
@@ -28,7 +32,44 @@ fun ContributionContentPreview() {
fun ContributionContentEmptyPreview() {
    PreviewWithTheme {
        ContributionContent(
            state = State(),
            state = State(
                listState = ContributionListState(
                    isLoading = false,
                ),
            ),
            onEvent = {},
            contentPadding = PaddingValues(),
        )
    }
}

@Composable
@Preview(showBackground = true)
fun ContributionContentLoadingPreview() {
    PreviewWithTheme {
        ContributionContent(
            state = State(
                listState = ContributionListState(
                    isLoading = true,
                ),
            ),
            onEvent = {},
            contentPadding = PaddingValues(),
        )
    }
}

@Composable
@Preview(showBackground = true)
fun ContributionContentListErrorPreview() {
    PreviewWithTheme {
        ContributionContent(
            state = State(
                listState = ContributionListState(
                    error = DomainContract.BillingError.DeveloperError("Developer error"),
                    isLoading = false,
                ),
            ),
            onEvent = {},
            contentPadding = PaddingValues(),
        )
+85 −20
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@ package app.k9mail.feature.funding.googleplay.ui.contribution
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.funding.googleplay.domain.DomainContract
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState
import kotlinx.collections.immutable.persistentListOf

@Composable
@@ -10,13 +12,17 @@ import kotlinx.collections.immutable.persistentListOf
internal fun ContributionListPreview() {
    PreviewWithTheme {
        ContributionList(
            state = ContributionListState(
                oneTimeContributions = FakeData.oneTimeContributions,
                recurringContributions = FakeData.recurringContributions,
                selectedContribution = FakeData.recurringContributions.first(),
                isRecurringContributionSelected = true,
            selectedItem = FakeData.recurringContributions.first(),
                isLoading = false,
            ),
            onOneTimeContributionTypeClick = {},
            onRecurringContributionTypeClick = {},
            onItemClick = {},
            onRetryClick = {},
        )
    }
}
@@ -26,13 +32,17 @@ internal fun ContributionListPreview() {
internal fun ContributionListRecurringPreview() {
    PreviewWithTheme {
        ContributionList(
            state = ContributionListState(
                oneTimeContributions = FakeData.oneTimeContributions,
                recurringContributions = FakeData.recurringContributions,
            selectedItem = FakeData.oneTimeContributions.last(),
                selectedContribution = FakeData.oneTimeContributions.last(),
                isRecurringContributionSelected = false,
                isLoading = false,
            ),
            onOneTimeContributionTypeClick = {},
            onRecurringContributionTypeClick = {},
            onItemClick = {},
            onRetryClick = {},
        )
    }
}
@@ -42,13 +52,17 @@ internal fun ContributionListRecurringPreview() {
internal fun ContributionListOneTimeOnlyPreview() {
    PreviewWithTheme {
        ContributionList(
            state = ContributionListState(
                oneTimeContributions = FakeData.oneTimeContributions,
                recurringContributions = persistentListOf(),
            selectedItem = null,
                selectedContribution = null,
                isRecurringContributionSelected = false,
                isLoading = false,
            ),
            onOneTimeContributionTypeClick = {},
            onRecurringContributionTypeClick = {},
            onItemClick = {},
            onRetryClick = {},
        )
    }
}
@@ -58,13 +72,17 @@ internal fun ContributionListOneTimeOnlyPreview() {
internal fun ContributionListRecurringOnlyPreview() {
    PreviewWithTheme {
        ContributionList(
            state = ContributionListState(
                oneTimeContributions = persistentListOf(),
                recurringContributions = FakeData.recurringContributions,
            selectedItem = null,
                selectedContribution = null,
                isRecurringContributionSelected = true,
                isLoading = false,
            ),
            onOneTimeContributionTypeClick = {},
            onRecurringContributionTypeClick = {},
            onItemClick = {},
            onRetryClick = {},
        )
    }
}
@@ -74,13 +92,60 @@ internal fun ContributionListRecurringOnlyPreview() {
internal fun ContributionListEmptyPreview() {
    PreviewWithTheme {
        ContributionList(
            state = ContributionListState(
                oneTimeContributions = persistentListOf(),
                recurringContributions = persistentListOf(),
            selectedItem = null,
                selectedContribution = null,
                isRecurringContributionSelected = false,
                isLoading = false,
            ),
            onOneTimeContributionTypeClick = {},
            onRecurringContributionTypeClick = {},
            onItemClick = {},
            onRetryClick = {},
        )
    }
}

@Composable
@Preview(showBackground = true)
internal fun ContributionListLoadingPreview() {
    PreviewWithTheme {
        ContributionList(
            state = ContributionListState(
                oneTimeContributions = persistentListOf(),
                recurringContributions = persistentListOf(),
                selectedContribution = null,
                isRecurringContributionSelected = false,
                isLoading = true,
            ),
            onOneTimeContributionTypeClick = {},
            onRecurringContributionTypeClick = {},
            onItemClick = {},
            onRetryClick = {},
        )
    }
}

@Composable
@Preview(showBackground = true)
internal fun ContributionListErrorPreview() {
    PreviewWithTheme {
        ContributionList(
            state = ContributionListState(
                oneTimeContributions = persistentListOf(),
                recurringContributions = persistentListOf(),
                selectedContribution = null,
                isRecurringContributionSelected = false,
                isLoading = false,
                error = DomainContract.BillingError.UnknownError(
                    "An error occurred",
                ),
            ),
            onOneTimeContributionTypeClick = {},
            onRecurringContributionTypeClick = {},
            onItemClick = {},
            onRetryClick = {},
        )
    }
}
+6 −3
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ package app.k9mail.feature.funding.googleplay.ui.contribution
import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.common.annotation.PreviewDevicesWithBackground
import app.k9mail.core.ui.compose.designsystem.PreviewWithTheme
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ContributionListState
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State

@Composable
@@ -13,11 +14,13 @@ fun ContributionScreenPreview() {
            onBack = {},
            viewModel = FakeContributionViewModel(
                initialState = State(
                    listState = ContributionListState(
                        recurringContributions = FakeData.recurringContributions,
                        oneTimeContributions = FakeData.oneTimeContributions,
                        selectedContribution = FakeData.recurringContributions.first(),
                    ),
                ),
            ),
        )
    }
}
+2 −1
Original line number Diff line number Diff line
package app.k9mail.feature.funding.googleplay.ui.contribution

import app.k9mail.core.ui.compose.common.mvi.BaseViewModel
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.Effect
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.Event
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.State
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionContract.ViewModel

internal class FakeContributionViewModel(
    initialState: State,
) : BaseViewModel<State, Event, Nothing>(initialState = initialState), ViewModel {
) : BaseViewModel<State, Event, Effect>(initialState = initialState), ViewModel {

    val events = mutableListOf<Event>()

+8 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ import app.k9mail.feature.funding.googleplay.data.remote.GoogleBillingPurchaseHa
import app.k9mail.feature.funding.googleplay.domain.BillingManager
import app.k9mail.feature.funding.googleplay.domain.ContributionIdProvider
import app.k9mail.feature.funding.googleplay.domain.DomainContract
import app.k9mail.feature.funding.googleplay.domain.usecase.GetAvailableContributions
import app.k9mail.feature.funding.googleplay.ui.contribution.ContributionViewModel
import com.android.billingclient.api.ProductDetails
import org.koin.androidx.viewmodel.dsl.viewModel
@@ -70,9 +71,16 @@ val featureFundingModule = module {
        )
    }

    single<DomainContract.UseCase.GetAvailableContributions> {
        GetAvailableContributions(
            billingManager = get(),
        )
    }

    viewModel {
        ContributionViewModel(
            billingManager = get(),
            getAvailableContributions = get(),
        )
    }
}
Loading