Fetch data in ranking screen

pull/5/head
avalin 9 months ago
parent 9d7061fa62
commit 7eb97fcb2c

@ -1,110 +1,27 @@
package fr.iut.alldev.allin.ui.ranking
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import fr.iut.alldev.allin.data.model.User
import androidx.compose.runtime.getValue
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import fr.iut.alldev.allin.ui.core.AllInLoading
import fr.iut.alldev.allin.ui.ranking.components.RankingScreenContent
@Composable
fun RankingScreen() {
val users = remember { mockRanking }
fun RankingScreen(
viewModel: RankingViewModel = hiltViewModel()
) {
val state by viewModel.state.collectAsStateWithLifecycle()
RankingScreenContent(
users = users.sortedByDescending { it.coins }
)
}
when (val s = state) {
is RankingViewModel.State.Loaded -> {
RankingScreenContent(
users = s.friends.sortedByDescending { it.coins }
)
}
private val mockRanking by lazy {
listOf(
User(
id = "1",
username = "Owen",
email = "",
coins = 8533
),
User(
id = "2",
username = "Dave",
email = "",
coins = 6942
),
User(
id = "3",
username = "Lucas",
email = "",
coins = 3333
),
User(
id = "4",
username = "Louison",
email = "",
coins = 1970
),
User(
id = "5",
username = "Imri",
email = "",
coins = 1
),
User(
id = "21",
username = "Owen",
email = "",
coins = 8533
),
User(
id = "22",
username = "Dave",
email = "",
coins = 6942
),
User(
id = "23",
username = "Lucas",
email = "",
coins = 3333
),
User(
id = "24",
username = "Louison",
email = "",
coins = 1970
),
User(
id = "25",
username = "Imri",
email = "",
coins = 1
),
User(
id = "31",
username = "Owen",
email = "",
coins = 8533
),
User(
id = "32",
username = "Dave",
email = "",
coins = 6942
),
User(
id = "33",
username = "Lucas",
email = "",
coins = 3333
),
User(
id = "34",
username = "Louison",
email = "",
coins = 1970
),
User(
id = "35",
username = "Imri",
email = "",
coins = 1
)
)
RankingViewModel.State.Loading -> {
AllInLoading(visible = true)
}
}
}

@ -0,0 +1,43 @@
package fr.iut.alldev.allin.ui.ranking
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import fr.iut.alldev.allin.data.model.User
import fr.iut.alldev.allin.data.repository.FriendRepository
import fr.iut.alldev.allin.keystore.AllInKeystoreManager
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@HiltViewModel
class RankingViewModel @Inject constructor(
private val friendRepository: FriendRepository,
private val keystoreManager: AllInKeystoreManager
) : ViewModel() {
private val _state by lazy { MutableStateFlow<State>(State.Loading) }
val state get() = _state.asStateFlow()
init {
viewModelScope.launch {
try {
_state.emit(
State.Loaded(
friends = friendRepository.getFriends(
token = keystoreManager.getTokenOrEmpty()
)
)
)
} catch (e: Exception) {
Timber.e(e)
}
}
}
sealed interface State {
data object Loading : State
data class Loaded(val friends: List<User>) : State
}
}

@ -67,12 +67,14 @@ fun RankingScreenContent(
}
}
itemsIndexed(users.subList(1, users.size), key = { _, user -> user.id }) { idx, user ->
RankingScreenItem(
position = idx + 3,
username = user.username,
coins = user.coins
)
if (users.size > 2) {
itemsIndexed(users.subList(2, users.size), key = { _, user -> user.id }) { idx, user ->
RankingScreenItem(
position = idx + 3,
username = user.username,
coins = user.coins
)
}
}
}
}

Loading…
Cancel
Save