Skip to content

Commit

Permalink
Adjust upcoming event state (#1446)
Browse files Browse the repository at this point in the history
* Adjust upcoming event state

* Resolve formatting issue

* Fix UI tests

* Remove unused method

---------

Co-authored-by: Ashley Davies <[email protected]>
  • Loading branch information
ashdavies and ashdavies authored Jan 19, 2025
1 parent dab0bd0 commit 0467651
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import playground.conferences_app.generated.resources.call_for_papers_days_remai

@Composable
internal fun EventsDetailPane(
event: Event,
item: Event,
onBackClick: () -> Unit,
modifier: Modifier = Modifier,
windowSizeClass: WindowSizeClass = LocalWindowSizeClass.current,
Expand All @@ -48,7 +48,7 @@ internal fun EventsDetailPane(
modifier = modifier,
topBar = {
EventsTopBar(
title = event.name,
title = item.name,
actions = {
IconButton(onClick = { error("Crashlytics") }) {
Icon(Icons.Default.Warning, contentDescription = null)
Expand All @@ -71,13 +71,13 @@ internal fun EventsDetailPane(
Card(Modifier.padding(MaterialTheme.spacing.large)) {
Box {
EventsDetailImage(
imageUrl = event.imageUrl,
name = event.name,
imageUrl = item.imageUrl,
name = item.name,
)

EventDateLabel(
dateStart = remember { LocalDate.parse(event.dateStart) },
dateEnd = remember { LocalDate.parse(event.dateEnd) },
dateStart = remember { LocalDate.parse(item.dateStart) },
dateEnd = remember { LocalDate.parse(item.dateEnd) },
modifier = Modifier
.padding(MaterialTheme.spacing.large)
.align(Alignment.TopEnd),
Expand All @@ -86,13 +86,13 @@ internal fun EventsDetailPane(
}

EventsDetailLocation(
location = event.location,
location = item.location,
)

if (event.cfpEnd != null) {
if (item.cfpEnd != null) {
EventsDetailCfp(
cfpEnd = event.cfpEnd,
cfpSite = event.cfpSite,
cfpEnd = item.cfpEnd,
cfpSite = item.cfpSite,
)
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
Expand Down Expand Up @@ -45,11 +46,8 @@ import io.ashdavies.party.events.Event
import io.ashdavies.party.events.EventDateLabel
import io.ashdavies.party.events.EventsTopBar
import io.ashdavies.party.events.daysUntilCfpEnd
import io.ashdavies.party.events.paging.errorMessage
import io.ashdavies.party.events.paging.isRefreshing
import io.ashdavies.party.material.padding
import io.ashdavies.party.material.spacing
import io.ashdavies.party.paging.items
import io.ashdavies.placeholder.PlaceholderHighlight
import io.ashdavies.placeholder.fade
import io.ashdavies.placeholder.placeholder
Expand All @@ -60,48 +58,52 @@ import playground.conferences_app.generated.resources.call_for_papers_open
import playground.conferences_app.generated.resources.online_only
import playground.conferences_app.generated.resources.upcoming_events

private const val EMPTY_STRING = ""

@Composable
@OptIn(ExperimentalMaterial3Api::class)
internal fun UpcomingEventsPane(
state: UpcomingEventsScreen.State,
onClick: (Event) -> Unit,
onClick: (Int) -> Unit,
modifier: Modifier = Modifier,
selectedItem: Event? = null,
) {
val isRefreshing = state.pagingItems.loadState.isRefreshing
val eventSink = state.eventSink

Scaffold(
modifier = modifier,
topBar = { EventsTopBar(stringResource(Res.string.upcoming_events)) },
) { contentPadding ->
PullToRefreshBox(
isRefreshing = isRefreshing,
onRefresh = OnClick("events_refresh") { state.pagingItems.refresh() },
isRefreshing = state.isRefreshing,
onRefresh = OnClick("events_refresh") { eventSink(UpcomingEventsScreen.Event.Refresh) },
modifier = Modifier.padding(contentPadding),
) {
if (state.pagingItems.loadState.hasError) {
EventFailure(state.pagingItems.loadState.errorMessage ?: "Unknown Error")
if (state.errorMessage != null) {
EventFailure(state.errorMessage)
}

LazyColumn(Modifier.fillMaxSize()) {
items(state.pagingItems) { event ->
EventItemContent(
event = event,
isSelected = event == selectedItem,
modifier = Modifier
.animateItem() // TODO Slow animation on addition
.fillMaxWidth()
.padding(MaterialTheme.spacing.large)
.clip(MaterialTheme.shapes.medium)
.clickable(
enabled = event != null,
onClickLabel = event?.name,
onClick = { onClick(event!!) },
)
.paint(rememberBackgroundPainter(event?.imageUrl)),
)
itemsIndexed(state.itemList) { index, item ->
val itemModifier = Modifier
.animateItem() // TODO Slow animation on addition
.fillMaxWidth()
.padding(MaterialTheme.spacing.large)
.clip(MaterialTheme.shapes.medium)

when (item) {
is Event -> EventItemContent(
event = item,
isSelected = index == state.selectedIndex,
modifier = itemModifier
.paint(rememberBackgroundPainter(item.imageUrl))
.clickable { onClick(index) },

)

null -> EventItemContent(
event = null,
isSelected = false,
modifier = itemModifier,
)
}
}
}
}
Expand Down Expand Up @@ -232,7 +234,7 @@ private fun PlaceholderText(
) {
Text(
overflow = TextOverflow.Ellipsis,
text = text ?: EMPTY_STRING,
text = text ?: "",
style = style,
maxLines = 1,
modifier = modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import androidx.paging.cachedIn
import androidx.paging.compose.collectAsLazyPagingItems
import com.slack.circuit.retained.rememberRetained
import io.ashdavies.party.events.Event
import io.ashdavies.party.events.paging.errorMessage
import io.ashdavies.party.events.paging.isRefreshing
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope

@Composable
Expand All @@ -18,6 +21,15 @@ internal fun UpcomingEventsPresenter(
}.collectAsLazyPagingItems()

return UpcomingEventsScreen.State(
pagingItems = pagingItems,
)
itemList = pagingItems
.itemSnapshotList
.toImmutableList(),
selectedIndex = null,
isRefreshing = pagingItems.loadState.isRefreshing,
errorMessage = pagingItems.loadState.errorMessage,
) { event ->
if (event is UpcomingEventsScreen.Event.Refresh) {
pagingItems.refresh()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,28 @@ import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaf
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.paging.compose.LazyPagingItems
import com.slack.circuit.foundation.internal.BackHandler
import com.slack.circuit.runtime.CircuitUiState
import com.slack.circuit.runtime.screen.Screen
import io.ashdavies.parcelable.Parcelable
import io.ashdavies.parcelable.Parcelize
import io.ashdavies.party.events.Event
import io.ashdavies.party.events.EventsDetailPane
import kotlinx.collections.immutable.ImmutableList
import io.ashdavies.party.events.Event as DatabaseEvent

@Parcelize
internal object UpcomingEventsScreen : Parcelable, Screen {
data class State(val pagingItems: LazyPagingItems<Event>) : CircuitUiState
sealed interface Event {
data object Refresh : Event
}

data class State(
val itemList: ImmutableList<DatabaseEvent?>,
val selectedIndex: Int?,
val isRefreshing: Boolean,
val errorMessage: String?,
val eventSink: (Event) -> Unit,
) : CircuitUiState
}

@Composable
Expand All @@ -32,7 +42,7 @@ internal fun UpcomingEventsScreen(
state: UpcomingEventsScreen.State,
modifier: Modifier = Modifier,
) {
val navigator = rememberListDetailPaneScaffoldNavigator<Event>(
val navigator = rememberListDetailPaneScaffoldNavigator<Int>(
scaffoldDirective = calculatePaneScaffoldDirective(
windowAdaptiveInfo = currentWindowAdaptiveInfo(),
).copy(horizontalPartitionSpacerSize = 0.dp),
Expand All @@ -50,17 +60,14 @@ internal fun UpcomingEventsScreen(
UpcomingEventsPane(
state = state,
onClick = navigator::navigateToDetail,
selectedItem = navigator
.currentDestination
?.content,
)
}
},
detailPane = {
AnimatedPane {
navigator.currentDestination?.content?.let {
EventsDetailPane(
event = it,
item = requireNotNull(state.itemList[it]),
onBackClick = navigator::navigateBack,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ internal class EventsDetailTests {
private fun EventsDetailPreview() {
MaterialPreviewTheme {
EventsDetailPane(
event = DroidconBerlin,
item = DroidconBerlin,
onBackClick = { },
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package io.ashdavies.party.events

import androidx.compose.runtime.Composable
import androidx.paging.PagingData
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems
import io.ashdavies.party.tooling.MaterialPreviewTheme
import io.ashdavies.party.tooling.PreviewDayNight
import io.ashdavies.party.upcoming.UpcomingEventsPane
import io.ashdavies.party.upcoming.UpcomingEventsScreen
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.collections.immutable.toImmutableList

private val DroidconEvents = listOf(AndroidMakers, DroidconBerlin, DroidconLondon)

Expand All @@ -20,14 +16,15 @@ internal class EventsListTests {
private fun EventsListPreview(data: List<Event> = DroidconEvents) {
MaterialPreviewTheme {
UpcomingEventsPane(
state = UpcomingEventsScreen.State(lazyPagingItems(flowOf(PagingData.from(data)))),
state = UpcomingEventsScreen.State(
itemList = data.toImmutableList(),
selectedIndex = null,
isRefreshing = false,
errorMessage = null,
eventSink = { },
),
onClick = { },
)
}
}

@Composable
private fun <T : Any> lazyPagingItems(value: Flow<PagingData<T>>): LazyPagingItems<T> {
return value.collectAsLazyPagingItems()
}
}

0 comments on commit 0467651

Please sign in to comment.