mirror of
				https://github.com/AdrianKuta/KahootQuiz.git
				synced 2025-10-31 00:43:40 +01:00 
			
		
		
		
	feat: Implement QuizScreen and basic navigation structure
This commit introduces the `QuizScreen` composable, its associated `QuizScreenViewModel`, and sets up the basic navigation graph for the application.
Key changes:
- **UI Layer (`ui:quiz` module):**
    - Added `QuizScreen.kt` with a basic composable structure.
    - Implemented `QuizScreenViewModel.kt` which fetches quiz data using `GetQuizUseCase` and exposes it via `QuizUiState`.
    - Created `QuizUiState` data class to hold the quiz data for the UI.
    - Added `navigation/QuizNavigation.kt` to define the `QuizRoute` and `quizScreen` navigation extension.
    - Updated `ui/quiz/build.gradle.kts` to include dependencies for Hilt navigation and Timber.
- **App Module (`app` module):**
    - Created `KahootQuizApp.kt` which sets up the main `Scaffold` and includes the navigation graph.
    - Added `KahootQuizNavGraph.kt` to define the `NavHost` and integrate the `quizScreen`.
    - Modified `MainActivity.kt` to call the new `KahootQuizApp` composable, removing the previous direct use case call and UI.
- **Data Layer (`model:data` module):**
    - Updated `QuizMapper.kt` to convert `time` from `Long?` to `Duration?` (using `milliseconds`) when mapping `QuestionDto` to the domain `Question` model.
			
			
This commit is contained in:
		| @@ -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) | ||||
| } | ||||
|   | ||||
| @@ -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, | ||||
| ) { | ||||
|  | ||||
| } | ||||
| @@ -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<QuizUiState> = _uiState.asStateFlow() | ||||
|  | ||||
|     init { | ||||
|         viewModelScope.launch { | ||||
|             _uiState.value = QuizUiState(getQuizUseCase()) | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| data class QuizUiState( | ||||
|     val quiz: Quiz? = null | ||||
| ) | ||||
| @@ -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<QuizRoute> { | ||||
|  | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	![github-actions[bot]@users.noreply.github.com](/assets/img/avatar_default.png) GitHub Actions Bot
					GitHub Actions Bot