refactor friends feed to use uiState.Loading

This commit is contained in:
brreynie 2023-05-16 11:34:13 +02:00
parent 5b8d59cb75
commit 6989f3c806
3 changed files with 167 additions and 0 deletions

View file

@ -0,0 +1,128 @@
package be.ugent.sel.studeez.screens.friends_feed
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Card
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import be.ugent.sel.studeez.common.composable.DateText
import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate
import be.ugent.sel.studeez.common.composable.drawer.DrawerActions
import be.ugent.sel.studeez.common.composable.feed.LoadingFeed
import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions
import be.ugent.sel.studeez.data.local.models.FeedEntry
import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds
import be.ugent.sel.studeez.resources
import be.ugent.sel.studeez.R.string as AppText
@Composable
fun FriendsFeedRoute(
viewModel: FriendsFeedViewModel,
drawerActions: DrawerActions,
navigationBarActions: NavigationBarActions
) {
val friendsFeedUiState by viewModel.uiState.collectAsState()
FriendsFeedScreen(
drawerActions = drawerActions,
navigationBarActions = navigationBarActions,
uiState = friendsFeedUiState,
)
}
@Composable
fun FriendsFeedScreen(
drawerActions: DrawerActions,
navigationBarActions: NavigationBarActions,
uiState: FriendsFeedUiState,
) {
PrimaryScreenTemplate(
title = resources().getString(AppText.friends_feed),
drawerActions = drawerActions,
navigationBarActions = navigationBarActions
) {
when (uiState) {
FriendsFeedUiState.Loading -> LoadingFeed()
is FriendsFeedUiState.Succes -> {
val friendsSessions = uiState.friendSessions
LazyColumn() {
// Default Timers, cannot be edited
items(friendsSessions) {
val (day, feedEntries) = it
DateText(date = day)
feedEntries.forEach { (name, feedEntry) ->
FriendsFeedEntry(name = name, feedEntry = feedEntry)
}
Spacer(modifier = Modifier.height(10.dp))
}
}
}
}
}
}
@Composable
fun FriendsFeedEntry(
name: String,
feedEntry: FeedEntry
) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 10.dp, vertical = 5.dp),
) {
Row(
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Row(
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.padding(start = 10.dp)
.weight(11f)
) {
Box(
modifier = Modifier
.size(20.dp)
.clip(CircleShape)
.background(Color(feedEntry.argb_color)),
)
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Column(
verticalArrangement = Arrangement.spacedBy(0.dp)
) {
Text(
text = "$name studied for ${feedEntry.subJectName}",
fontWeight = FontWeight.Medium,
overflow = TextOverflow.Ellipsis,
maxLines = 1,
)
Text(
text = feedEntry.taskName,
overflow = TextOverflow.Ellipsis,
maxLines = 1,
)
}
Text(text = HoursMinutesSeconds(feedEntry.totalStudyTime).toString())
}
}
}
}
}

View file

@ -0,0 +1,10 @@
package be.ugent.sel.studeez.screens.friends_feed
import be.ugent.sel.studeez.data.local.models.FeedEntry
sealed interface FriendsFeedUiState {
object Loading : FriendsFeedUiState
data class Succes(
val friendSessions: List<Pair<String, List<Pair<String, FeedEntry>>>>,
) : FriendsFeedUiState
}

View file

@ -0,0 +1,29 @@
package be.ugent.sel.studeez.screens.friends_feed
import androidx.lifecycle.viewModelScope
import be.ugent.sel.studeez.domain.FeedDAO
import be.ugent.sel.studeez.domain.LogService
import be.ugent.sel.studeez.screens.StudeezViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import javax.inject.Inject
@HiltViewModel
class FriendsFeedViewModel @Inject constructor(
private val feedDAO: FeedDAO,
logService: LogService
) : StudeezViewModel(logService) {
val uiState: StateFlow<FriendsFeedUiState> = feedDAO.getFriendsSessions()
.map { it.toList() }
.map { FriendsFeedUiState.Succes(it) }
.stateIn(
scope = viewModelScope,
initialValue = FriendsFeedUiState.Loading,
started = SharingStarted.Eagerly,
)
}