Skip to content

Commit

Permalink
[feature/droidknights#222] Session쪽 List Param을 PersistentList로 대체하기
Browse files Browse the repository at this point in the history
  • Loading branch information
l2hyunwoo committed Aug 22, 2023
1 parent 86311ca commit 510b6e7
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 13 deletions.
4 changes: 4 additions & 0 deletions feature/session/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@ plugins {
android {
namespace = "com.droidknights.app2023.feature.session"
}

dependencies {
implementation(libs.kotlinx.immutable)
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ import com.droidknights.app2023.core.model.Room
import com.droidknights.app2023.core.model.Session
import com.droidknights.app2023.core.model.Speaker
import com.droidknights.app2023.core.model.Tag
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.datetime.LocalDateTime

@Composable
Expand Down Expand Up @@ -104,14 +106,15 @@ private fun SessionDetailContent(session: Session) {
SessionDetailTitle(title = session.title, modifier = Modifier.padding(top = 8.dp))
Spacer(modifier = Modifier.height(8.dp))
SessionChips(session = session)
SessionOverview(content = session.content)
if (session.content.isNotEmpty()) {
Spacer(modifier = Modifier.height(16.dp))
SessionOverview(content = session.content)
Spacer(modifier = Modifier.height(56.dp))
} else {
Spacer(modifier = Modifier.height(40.dp))
}
SessionDetailSpeaker(session.speakers)
SessionDetailSpeaker(session.speakers.toPersistentList())
}
}

Expand All @@ -130,7 +133,7 @@ private fun SessionDetailTitle(

@Composable
private fun SessionDetailSpeaker(
speakers: List<Speaker>,
speakers: PersistentList<Speaker>,
modifier: Modifier = Modifier,
) {
Column(modifier = modifier) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import com.droidknights.app2023.core.designsystem.theme.KnightsTheme
import com.droidknights.app2023.core.model.Room
import com.droidknights.app2023.core.model.Session
import com.droidknights.app2023.core.ui.RoomText
import kotlinx.collections.immutable.PersistentList

@Composable
internal fun SessionScreen(
Expand Down Expand Up @@ -84,7 +85,7 @@ private val SessionGroupSpace = 16.dp

private fun LazyListScope.sessionItems(
room: Room,
items: List<Session>,
items: PersistentList<Session>,
topPadding: Dp,
onItemClick: (Session) -> Unit,
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,25 @@ import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import com.droidknights.app2023.core.model.Room
import com.droidknights.app2023.core.model.Session
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.mapNotNull

data class SessionGroup(
val room: Room,
val sessions: List<Session>,
val sessions: PersistentList<Session>,
)

@Stable
class SessionState(
private val sessions: List<Session>,
private val sessions: PersistentList<Session>,
val listState: LazyListState,
selectedRoom: Room? = sessions.map { it.room }.firstOrNull(),
) {
val groups: List<SessionGroup> = sessions
.groupBy { it.room }
.map { (room, sessions) -> SessionGroup(room, sessions) }
.map { (room, sessions) -> SessionGroup(room, sessions.toPersistentList()) }

val rooms: List<Room> = sessions.map { it.room }.distinct()

Expand Down Expand Up @@ -69,7 +71,7 @@ class SessionState(

companion object {
fun Saver(
sessions: List<Session>,
sessions: PersistentList<Session>,
listState: LazyListState,
): Saver<SessionState, *> = Saver(
save = { it.selectedRoom },
Expand All @@ -86,7 +88,7 @@ class SessionState(

@Composable
internal fun rememberSessionState(
sessions: List<Session>,
sessions: PersistentList<Session>,
listState: LazyListState = rememberLazyListState(),
): SessionState {
val state = rememberSaveable(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ import com.droidknights.app2023.core.designsystem.theme.KnightsTheme
import com.droidknights.app2023.core.designsystem.theme.surfaceDim
import com.droidknights.app2023.core.model.Room
import com.droidknights.app2023.core.ui.RoomText
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.launch

@Composable
Expand All @@ -65,7 +67,7 @@ internal fun SessionTopAppBar(
) {
SessionTabRow(
selectedRoom = sessionState.selectedRoom,
rooms = rooms,
rooms = rooms.toPersistentList(),
onRoomSelect = { room ->
coroutineScope.launch {
sessionState.scrollTo(room)
Expand Down Expand Up @@ -94,7 +96,7 @@ internal fun SessionTopAppBar(
@Composable
private fun SessionTabRow(
selectedRoom: Room?,
rooms: List<Room>,
rooms: PersistentList<Room>,
onRoomSelect: (Room) -> Unit,
modifier: Modifier = Modifier,
) {
Expand Down Expand Up @@ -188,7 +190,7 @@ private fun SessionTabIndicatorPreview() {
KnightsTheme {
SessionTabRow(
selectedRoom = Room.TRACK2,
rooms = Room.values().toList(),
rooms = Room.values().toList().toPersistentList(),
onRoomSelect = { },
modifier = Modifier.size(320.dp, 48.dp),
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.droidknights.app2023.feature.session

import com.droidknights.app2023.core.model.Session
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf

data class SessionUiState(
val sessions: List<Session> = emptyList(),
val sessions: PersistentList<Session> = persistentListOf(),
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.droidknights.app2023.core.domain.usecase.GetSessionsUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.flow
Expand All @@ -17,6 +18,6 @@ class SessionViewModel @Inject constructor(
) : ViewModel() {

val uiState: StateFlow<SessionUiState> = flow { emit(getSessionsUseCase()) }
.map { SessionUiState(it) }
.map { SessionUiState(it.toPersistentList()) }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), SessionUiState())
}

0 comments on commit 510b6e7

Please sign in to comment.