Fetch data in ranking screen
continuous-integration/drone/push Build is passing Details

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

@ -1,110 +1,27 @@
package fr.iut.alldev.allin.ui.ranking package fr.iut.alldev.allin.ui.ranking
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.getValue
import fr.iut.alldev.allin.data.model.User 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 import fr.iut.alldev.allin.ui.ranking.components.RankingScreenContent
@Composable @Composable
fun RankingScreen() { fun RankingScreen(
val users = remember { mockRanking } viewModel: RankingViewModel = hiltViewModel()
) {
val state by viewModel.state.collectAsStateWithLifecycle()
when (val s = state) {
is RankingViewModel.State.Loaded -> {
RankingScreenContent( RankingScreenContent(
users = users.sortedByDescending { it.coins } users = s.friends.sortedByDescending { it.coins }
) )
} }
private val mockRanking by lazy { RankingViewModel.State.Loading -> {
listOf( AllInLoading(visible = true)
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
)
)
} }

@ -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,7 +67,8 @@ fun RankingScreenContent(
} }
} }
itemsIndexed(users.subList(1, users.size), key = { _, user -> user.id }) { idx, user -> if (users.size > 2) {
itemsIndexed(users.subList(2, users.size), key = { _, user -> user.id }) { idx, user ->
RankingScreenItem( RankingScreenItem(
position = idx + 3, position = idx + 3,
username = user.username, username = user.username,
@ -76,6 +77,7 @@ fun RankingScreenContent(
} }
} }
} }
}
@Preview @Preview
@Composable @Composable

Loading…
Cancel
Save