feat: connexion et envoi du score Play Jeux dans l'UI partagée

This commit is contained in:
herel committed 2026-08-29 08:32:00 +02:00
1 parent 5078693a5f
commit fbb0371992
3 files changed
+31 -1

No files matched your search

@@ -1,6 +1,7 @@
package com.livrets package com.livrets
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@@ -9,6 +10,10 @@ import androidx.compose.runtime.setValue
import com.livrets.data.HistoryRepository import com.livrets.data.HistoryRepository
import com.livrets.game.GameConfig import com.livrets.game.GameConfig
import com.livrets.game.GameResult import com.livrets.game.GameResult
import com.livrets.games.GamesServices
import com.livrets.games.NoopGamesServices
import com.livrets.games.leaderboardId
import com.livrets.games.leaderboardScore
import com.livrets.theme.AppTheme import com.livrets.theme.AppTheme
import com.livrets.ui.GameScreen import com.livrets.ui.GameScreen
import com.livrets.ui.HistoryScreen import com.livrets.ui.HistoryScreen
@@ -28,20 +33,30 @@ sealed interface Screen {
@Composable @Composable
fun App( fun App(
filesDirPath: String, filesDirPath: String,
gamesServices: GamesServices = NoopGamesServices,
onThemeChanged: @Composable (isDark: Boolean) -> Unit = {}, onThemeChanged: @Composable (isDark: Boolean) -> Unit = {},
) = AppTheme(onThemeChanged) { ) = AppTheme(onThemeChanged) {
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val history = remember { HistoryRepository("$filesDirPath/history.json".toPath()) } val history = remember { HistoryRepository("$filesDirPath/history.json".toPath()) }
var screen by remember { mutableStateOf<Screen>(Screen.Home) } var screen by remember { mutableStateOf<Screen>(Screen.Home) }
LaunchedEffect(gamesServices) { gamesServices.signIn() }
val homePreview: @Composable () -> Unit = { val homePreview: @Composable () -> Unit = {
HomeScreen(onPlay = {}, onHistory = {}) HomeScreen(onPlay = {}, onHistory = {}, onLeaderboard = {})
} }
when (val current = screen) { when (val current = screen) {
Screen.Home -> HomeScreen( Screen.Home -> HomeScreen(
onPlay = { config -> screen = Screen.Game(config) }, onPlay = { config -> screen = Screen.Game(config) },
onHistory = { screen = Screen.History }, onHistory = { screen = Screen.History },
onLeaderboard = { config ->
scope.launch {
if (gamesServices.isSignedIn() || gamesServices.signIn()) {
gamesServices.showLeaderboard(config.leaderboardId())
}
}
},
) )
is Screen.Game -> GameScreen( is Screen.Game -> GameScreen(
@@ -49,6 +64,12 @@ fun App(
onFinish = { result -> onFinish = { result ->
screen = Screen.Results(result) screen = Screen.Results(result)
scope.launch { history.save(result) } scope.launch { history.save(result) }
scope.launch {
val score = result.leaderboardScore()
if (score > 0 && gamesServices.isSignedIn()) {
gamesServices.submitScore(result.config.leaderboardId(), score)
}
}
}, },
onQuit = { screen = Screen.Home }, onQuit = { screen = Screen.Home },
) )
@@ -32,6 +32,7 @@ import com.livrets.game.GameConfig
fun HomeScreen( fun HomeScreen(
onPlay: (GameConfig) -> Unit, onPlay: (GameConfig) -> Unit,
onHistory: () -> Unit, onHistory: () -> Unit,
onLeaderboard: (GameConfig) -> Unit,
) { ) {
var questionCount by remember { mutableStateOf(10) } var questionCount by remember { mutableStateOf(10) }
var secondsPerQuestion by remember { mutableStateOf(5) } var secondsPerQuestion by remember { mutableStateOf(5) }
@@ -60,6 +61,9 @@ fun HomeScreen(
Text("Jouer", fontSize = 20.sp) Text("Jouer", fontSize = 20.sp)
} }
TextButton(onClick = onHistory) { Text("Historique") } TextButton(onClick = onHistory) { Text("Historique") }
TextButton(
onClick = { onLeaderboard(GameConfig(questionCount, secondsPerQuestion, maxTable)) },
) { Text("Classement") }
} }
} }
@@ -24,6 +24,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.livrets.game.GameResult import com.livrets.game.GameResult
import com.livrets.games.leaderboardScore
@Composable @Composable
fun ResultsScreen( fun ResultsScreen(
@@ -55,6 +56,10 @@ fun ResultsScreen(
text = "Temps moyen de réponse : ${result.averageResponseMs / 1000.0} s", text = "Temps moyen de réponse : ${result.averageResponseMs / 1000.0} s",
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
) )
Text(
text = "Points classement : ${result.leaderboardScore()}",
style = MaterialTheme.typography.titleMedium,
)
Spacer(Modifier.height(16.dp)) Spacer(Modifier.height(16.dp))
Text( Text(