Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

♻️ [SponsorsScreen]Added loading indicator since it is missing. #950

Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,50 @@ data class SponsorsScreenUiState(
)

data class SponsorsListUiState(
val platinumSponsors: PersistentList<Sponsor>,
val goldSponsors: PersistentList<Sponsor>,
val supporters: PersistentList<Sponsor>,
val platinumSponsorsUiState: PlatinumSponsorsUiState,
val goldSponsorsUiState: GoldSponsorsUiState,
val supportersUiState: SupportersUiState,
)

sealed interface PlatinumSponsorsUiState {
val userMessageStateHolder: UserMessageStateHolder

data class Loading(
override val userMessageStateHolder: UserMessageStateHolder,
) : PlatinumSponsorsUiState

data class Exists(
override val userMessageStateHolder: UserMessageStateHolder,
val platinumSponsors: PersistentList<Sponsor>,
) : PlatinumSponsorsUiState
}

sealed interface GoldSponsorsUiState {
val userMessageStateHolder: UserMessageStateHolder

data class Loading(
override val userMessageStateHolder: UserMessageStateHolder,
) : GoldSponsorsUiState

data class Exists(
override val userMessageStateHolder: UserMessageStateHolder,
val goldSponsors: PersistentList<Sponsor>,
) : GoldSponsorsUiState
}

sealed interface SupportersUiState {
val userMessageStateHolder: UserMessageStateHolder

data class Loading(
override val userMessageStateHolder: UserMessageStateHolder,
) : SupportersUiState

data class Exists(
override val userMessageStateHolder: UserMessageStateHolder,
val supporters: PersistentList<Sponsor>,
) : SupportersUiState
}

@Composable
fun SponsorsScreen(
onNavigationIconClick: () -> Unit,
Expand Down Expand Up @@ -135,9 +174,18 @@ fun SponsorsScreenPreview() {
SponsorsScreen(
uiState = SponsorsScreenUiState(
sponsorsListUiState = SponsorsListUiState(
platinumSponsors = Sponsor.fakes().filter { it.plan == PLATINUM }.toPersistentList(),
goldSponsors = Sponsor.fakes().filter { it.plan == GOLD }.toPersistentList(),
supporters = Sponsor.fakes().filter { it.plan == SUPPORTER }.toPersistentList(),
platinumSponsorsUiState = PlatinumSponsorsUiState.Exists(
userMessageStateHolder = UserMessageStateHolderImpl(),
platinumSponsors = Sponsor.fakes().filter { it.plan == PLATINUM }.toPersistentList(),
),
goldSponsorsUiState = GoldSponsorsUiState.Exists(
userMessageStateHolder = UserMessageStateHolderImpl(),
goldSponsors = Sponsor.fakes().filter { it.plan == GOLD }.toPersistentList(),
),
supportersUiState = SupportersUiState.Exists(
userMessageStateHolder = UserMessageStateHolderImpl(),
supporters = Sponsor.fakes().filter { it.plan == SUPPORTER }.toPersistentList(),
),
),
userMessageStateHolder = UserMessageStateHolderImpl(),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberUpdatedState
import io.github.droidkaigi.confsched.compose.EventEffect
import io.github.droidkaigi.confsched.compose.EventFlow
import io.github.droidkaigi.confsched.droidkaigiui.UserMessageStateHolder
import io.github.droidkaigi.confsched.droidkaigiui.providePresenterDefaults
import io.github.droidkaigi.confsched.model.Plan.GOLD
import io.github.droidkaigi.confsched.model.Plan.PLATINUM
Expand All @@ -24,7 +25,10 @@ fun sponsorsScreenPresenter(
): SponsorsScreenUiState = providePresenterDefaults { userMessageStateHolder ->
val sponsors by rememberUpdatedState(sponsorsRepository.sponsors())
val sponsorListUiState by rememberUpdatedState(
sponsorList(sponsors = sponsors),
sponsorList(
userMessageStateHolder = userMessageStateHolder,
sponsors = sponsors,
),
)
EventEffect(events) { event ->
}
Expand All @@ -37,10 +41,48 @@ fun sponsorsScreenPresenter(
@Composable
private fun sponsorList(
sponsors: PersistentList<Sponsor>,
userMessageStateHolder: UserMessageStateHolder,
): SponsorsListUiState {
val platinumSponsors = sponsors.filter { it.plan == PLATINUM }.toPersistentList()
val goldSponsors = sponsors.filter { it.plan == GOLD }.toPersistentList()
val supporters = sponsors.filter { it.plan == SUPPORTER }.toPersistentList()

val platinumSponsorsUiState = if (platinumSponsors.isNotEmpty()) {
PlatinumSponsorsUiState.Exists(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about making one big state instead of making for each category?

sealed interface SponsorsListUiState{
data class Exists(
    val platinumSponsors: PersistentList<Sponsor>,
    val goldSponsors: PersistentList<Sponsor>,
    val supporters: PersistentList<Sponsor>,
)
 object Loading
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@takahirom
The issues you pointed out have already been dealt with, so your PR is ready to be reviewed. 🫡
d80ba13

userMessageStateHolder = userMessageStateHolder,
platinumSponsors = platinumSponsors,
)
} else {
PlatinumSponsorsUiState.Loading(
userMessageStateHolder = userMessageStateHolder,
)
}

val goldSponsorsUiState = if (goldSponsors.isNotEmpty()) {
GoldSponsorsUiState.Exists(
userMessageStateHolder = userMessageStateHolder,
goldSponsors = goldSponsors,
)
} else {
GoldSponsorsUiState.Loading(
userMessageStateHolder = userMessageStateHolder,
)
}

val supportersUiState = if (supporters.isNotEmpty()) {
SupportersUiState.Exists(
userMessageStateHolder = userMessageStateHolder,
supporters = supporters,
)
} else {
SupportersUiState.Loading(
userMessageStateHolder = userMessageStateHolder,
)
}

return SponsorsListUiState(
platinumSponsors = sponsors.filter { it.plan == PLATINUM }.toPersistentList(),
goldSponsors = sponsors.filter { it.plan == GOLD }.toPersistentList(),
supporters = sponsors.filter { it.plan == SUPPORTER }.toPersistentList(),
platinumSponsorsUiState = platinumSponsorsUiState,
goldSponsorsUiState = goldSponsorsUiState,
supportersUiState = supportersUiState,
)
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
package io.github.droidkaigi.confsched.sponsors.section

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Surface
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.testTag
Expand All @@ -21,13 +25,17 @@ import conference_app_2024.feature.sponsors.generated.resources.gold_sponsor
import conference_app_2024.feature.sponsors.generated.resources.platinum_sponsor
import conference_app_2024.feature.sponsors.generated.resources.supporters
import io.github.droidkaigi.confsched.designsystem.theme.KaigiTheme
import io.github.droidkaigi.confsched.droidkaigiui.UserMessageStateHolderImpl
import io.github.droidkaigi.confsched.model.Plan.GOLD
import io.github.droidkaigi.confsched.model.Plan.PLATINUM
import io.github.droidkaigi.confsched.model.Plan.SUPPORTER
import io.github.droidkaigi.confsched.model.Sponsor
import io.github.droidkaigi.confsched.model.fakes
import io.github.droidkaigi.confsched.sponsors.GoldSponsorsUiState
import io.github.droidkaigi.confsched.sponsors.PlatinumSponsorsUiState
import io.github.droidkaigi.confsched.sponsors.SponsorsListUiState
import io.github.droidkaigi.confsched.sponsors.SponsorsRes
import io.github.droidkaigi.confsched.sponsors.SupportersUiState
import io.github.droidkaigi.confsched.sponsors.component.SponsorHeader
import io.github.droidkaigi.confsched.sponsors.component.SponsorItem
import kotlinx.collections.immutable.toPersistentList
Expand Down Expand Up @@ -77,18 +85,34 @@ fun SponsorsList(
),
)
}
items(
items = uiState.platinumSponsors,
span = { GridItemSpan(maxLineSpan) },
) { sponsor ->
SponsorItem(
modifier = Modifier
.fillMaxWidth()
.height(110.dp)
.testTag(SponsorsListSponsorItemTestTagPrefix.plus(sponsor.name)),
sponsor = sponsor,
onSponsorsItemClick = onSponsorsItemClick,
)
when (uiState.platinumSponsorsUiState) {
is PlatinumSponsorsUiState.Exists -> {
items(
items = uiState.platinumSponsorsUiState.platinumSponsors,
span = { GridItemSpan(maxLineSpan) },
) { sponsor ->
SponsorItem(
modifier = Modifier
.fillMaxWidth()
.height(110.dp)
.testTag(SponsorsListSponsorItemTestTagPrefix.plus(sponsor.name)),
sponsor = sponsor,
onSponsorsItemClick = onSponsorsItemClick,
)
}
}
is PlatinumSponsorsUiState.Loading -> {
item(
span = { GridItemSpan(maxLineSpan) },
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.padding(contentPadding).fillMaxWidth(),
) {
CircularProgressIndicator()
}
}
}
}

item(span = { GridItemSpan(maxLineSpan) }) {
Expand All @@ -106,18 +130,34 @@ fun SponsorsList(
),
)
}
items(
items = uiState.goldSponsors,
span = { GridItemSpan(3) },
) { sponsor ->
SponsorItem(
modifier = Modifier
.fillMaxWidth()
.height(77.dp)
.testTag(SponsorsListSponsorItemTestTagPrefix.plus(sponsor.name)),
sponsor = sponsor,
onSponsorsItemClick = onSponsorsItemClick,
)
when (uiState.goldSponsorsUiState) {
is GoldSponsorsUiState.Exists -> {
items(
items = uiState.goldSponsorsUiState.goldSponsors,
span = { GridItemSpan(3) },
) { sponsor ->
SponsorItem(
modifier = Modifier
.fillMaxWidth()
.height(77.dp)
.testTag(SponsorsListSponsorItemTestTagPrefix.plus(sponsor.name)),
sponsor = sponsor,
onSponsorsItemClick = onSponsorsItemClick,
)
}
}
is GoldSponsorsUiState.Loading -> {
item(
span = { GridItemSpan(maxLineSpan) },
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.padding(contentPadding).fillMaxWidth(),
) {
CircularProgressIndicator()
}
}
}
}

item(span = { GridItemSpan(maxLineSpan) }) {
Expand All @@ -135,18 +175,34 @@ fun SponsorsList(
),
)
}
items(
items = uiState.supporters,
span = { GridItemSpan(2) },
) { sponsor ->
SponsorItem(
modifier = Modifier
.fillMaxWidth()
.height(77.dp)
.testTag(SponsorsListSponsorItemTestTagPrefix.plus(sponsor.name)),
sponsor = sponsor,
onSponsorsItemClick = onSponsorsItemClick,
)
when (uiState.supportersUiState) {
is SupportersUiState.Exists -> {
items(
items = uiState.supportersUiState.supporters,
span = { GridItemSpan(2) },
) { sponsor ->
SponsorItem(
modifier = Modifier
.fillMaxWidth()
.height(77.dp)
.testTag(SponsorsListSponsorItemTestTagPrefix.plus(sponsor.name)),
sponsor = sponsor,
onSponsorsItemClick = onSponsorsItemClick,
)
}
}
is SupportersUiState.Loading -> {
item(
span = { GridItemSpan(maxLineSpan) },
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.padding(contentPadding).fillMaxWidth(),
) {
CircularProgressIndicator()
}
}
}
}
}
}
Expand All @@ -159,9 +215,18 @@ fun SponsorsListPreview() {
Surface {
SponsorsList(
uiState = SponsorsListUiState(
platinumSponsors = Sponsor.fakes().filter { it.plan == PLATINUM }.toPersistentList(),
goldSponsors = Sponsor.fakes().filter { it.plan == GOLD }.toPersistentList(),
supporters = Sponsor.fakes().filter { it.plan == SUPPORTER }.toPersistentList(),
platinumSponsorsUiState = PlatinumSponsorsUiState.Exists(
userMessageStateHolder = UserMessageStateHolderImpl(),
platinumSponsors = Sponsor.fakes().filter { it.plan == PLATINUM }.toPersistentList(),
),
goldSponsorsUiState = GoldSponsorsUiState.Exists(
userMessageStateHolder = UserMessageStateHolderImpl(),
goldSponsors = Sponsor.fakes().filter { it.plan == GOLD }.toPersistentList(),
),
supportersUiState = SupportersUiState.Exists(
userMessageStateHolder = UserMessageStateHolderImpl(),
supporters = Sponsor.fakes().filter { it.plan == SUPPORTER }.toPersistentList(),
),
),
onSponsorsItemClick = {},
scrollBehavior = null,
Expand Down
Loading