diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt new file mode 100644 index 0000000..b5d0ca1 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt @@ -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()) + } + } + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedUiState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedUiState.kt new file mode 100644 index 0000000..a95e19f --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedUiState.kt @@ -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>>>, + ) : FriendsFeedUiState +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt new file mode 100644 index 0000000..5f01c40 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt @@ -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 = feedDAO.getFriendsSessions() + .map { it.toList() } + .map { FriendsFeedUiState.Succes(it) } + .stateIn( + scope = viewModelScope, + initialValue = FriendsFeedUiState.Loading, + started = SharingStarted.Eagerly, + ) +} +