diff --git a/app/src/main/java/dev/adriankuta/kahootquiz/KahootQuizApp.kt b/app/src/main/java/dev/adriankuta/kahootquiz/KahootQuizApp.kt new file mode 100644 index 0000000..9d9c7c9 --- /dev/null +++ b/app/src/main/java/dev/adriankuta/kahootquiz/KahootQuizApp.kt @@ -0,0 +1,20 @@ +package dev.adriankuta.kahootquiz + +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +@Composable +fun KahootQuizApp( + modifier: Modifier = Modifier +) { + Scaffold( + contentWindowInsets = WindowInsets.safeDrawing, + modifier = modifier, + ) { paddingValues -> + KahootQuizNavGraph(modifier = modifier.padding(paddingValues)) + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/adriankuta/kahootquiz/KahootQuizNavGraph.kt b/app/src/main/java/dev/adriankuta/kahootquiz/KahootQuizNavGraph.kt new file mode 100644 index 0000000..014dcec --- /dev/null +++ b/app/src/main/java/dev/adriankuta/kahootquiz/KahootQuizNavGraph.kt @@ -0,0 +1,23 @@ +package dev.adriankuta.kahootquiz + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.rememberNavController +import dev.adriankuta.kahootquiz.ui.quiz.navigation.QuizRoute +import dev.adriankuta.kahootquiz.ui.quiz.navigation.quizScreen + +@Composable +fun KahootQuizNavGraph( + modifier: Modifier = Modifier, + navController: NavHostController = rememberNavController(), +) { + NavHost( + navController = navController, + startDestination = QuizRoute, + modifier = modifier + ) { + quizScreen() + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/adriankuta/kahootquiz/MainActivity.kt b/app/src/main/java/dev/adriankuta/kahootquiz/MainActivity.kt index f03130b..bf3752b 100644 --- a/app/src/main/java/dev/adriankuta/kahootquiz/MainActivity.kt +++ b/app/src/main/java/dev/adriankuta/kahootquiz/MainActivity.kt @@ -4,64 +4,19 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview import dagger.hilt.android.AndroidEntryPoint -import dev.adriankuta.kahootquiz.domain.usecases.GetQuizUseCase import dev.adriankuta.kahootquiz.ui.theme.KahootQuizTheme -import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { - @Inject - lateinit var getQuizUseCase: GetQuizUseCase - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { KahootQuizTheme { - Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - - var quizId by remember { mutableStateOf(null) } - - LaunchedEffect(Unit) { - quizId = getQuizUseCase().id.value - } - - Greeting( - name = quizId ?: "Android", - modifier = Modifier.padding(innerPadding) - ) - } + KahootQuizApp() } } } } - -@Composable -fun Greeting(name: String, modifier: Modifier = Modifier) { - Text( - text = "Hello $name!", - modifier = modifier - ) -} - -@Preview(showBackground = true) -@Composable -fun GreetingPreview() { - KahootQuizTheme { - Greeting("Android") - } -} \ No newline at end of file diff --git a/model/data/src/main/kotlin/dev/adriankuta/kahootquiz/model/data/mappers/QuizMapper.kt b/model/data/src/main/kotlin/dev/adriankuta/kahootquiz/model/data/mappers/QuizMapper.kt index 56adb70..70c71a1 100644 --- a/model/data/src/main/kotlin/dev/adriankuta/kahootquiz/model/data/mappers/QuizMapper.kt +++ b/model/data/src/main/kotlin/dev/adriankuta/kahootquiz/model/data/mappers/QuizMapper.kt @@ -2,6 +2,7 @@ package dev.adriankuta.kahootquiz.model.data.mappers import dev.adriankuta.kahootquiz.core.network.models.* import dev.adriankuta.kahootquiz.domain.models.* +import kotlin.time.Duration.Companion.milliseconds internal fun QuizResponseDto.toDomainModel(): Quiz = Quiz( @@ -110,7 +111,7 @@ private fun ChannelDto.toDomain(): Channel = Channel(id = id) private fun QuestionDto.toDomain(): Question = Question( type = type, question = question, - time = time, + time = time?.milliseconds, points = points, pointsMultiplier = pointsMultiplier, choices = choices?.map { it.toDomain() }, diff --git a/ui/quiz/build.gradle.kts b/ui/quiz/build.gradle.kts index 20f0afc..7e401e1 100644 --- a/ui/quiz/build.gradle.kts +++ b/ui/quiz/build.gradle.kts @@ -1,6 +1,7 @@ plugins { alias(libs.plugins.kahootquiz.android.library.compose) alias(libs.plugins.kahootquiz.android.library.hilt) + alias(libs.plugins.kotlin.serialization) } android { @@ -9,4 +10,6 @@ android { dependencies { implementation(projects.domain) + implementation(libs.androidx.hilt.navigation.compose) + implementation(libs.timber) } diff --git a/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/QuizScreen.kt b/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/QuizScreen.kt new file mode 100644 index 0000000..2c5cc1f --- /dev/null +++ b/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/QuizScreen.kt @@ -0,0 +1,29 @@ +package dev.adriankuta.kahootquiz.ui.quiz + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle + +@Composable +fun QuizScreen( + modifier: Modifier = Modifier, + viewModel: QuizScreenViewModel = hiltViewModel() +) { + + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + QuizScreen( + uiState = uiState, + modifier = modifier + ) +} + +@Composable +private fun QuizScreen( + uiState: QuizUiState, + modifier: Modifier = Modifier, +) { + +} diff --git a/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/QuizScreenViewModel.kt b/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/QuizScreenViewModel.kt new file mode 100644 index 0000000..00e8dd7 --- /dev/null +++ b/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/QuizScreenViewModel.kt @@ -0,0 +1,31 @@ +package dev.adriankuta.kahootquiz.ui.quiz + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import dev.adriankuta.kahootquiz.domain.models.Quiz +import dev.adriankuta.kahootquiz.domain.usecases.GetQuizUseCase +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class QuizScreenViewModel @Inject constructor( + private val getQuizUseCase: GetQuizUseCase +) : ViewModel() { + private val _uiState = MutableStateFlow(QuizUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + init { + viewModelScope.launch { + _uiState.value = QuizUiState(getQuizUseCase()) + } + } + +} + +data class QuizUiState( + val quiz: Quiz? = null +) \ No newline at end of file diff --git a/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/navigation/QuizNavigation.kt b/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/navigation/QuizNavigation.kt new file mode 100644 index 0000000..4ac80e0 --- /dev/null +++ b/ui/quiz/src/main/kotlin/dev/adriankuta/kahootquiz/ui/quiz/navigation/QuizNavigation.kt @@ -0,0 +1,14 @@ +package dev.adriankuta.kahootquiz.ui.quiz.navigation + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import kotlinx.serialization.Serializable + +@Serializable +data object QuizRoute + +fun NavGraphBuilder.quizScreen() { + composable { + + } +} \ No newline at end of file