diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 74d37e3..96f3235 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,7 +16,7 @@ android { minSdk = 24 targetSdk = 33 versionCode = 1 - versionName = "0.55-alpha" + versionName = "0.6-alpha" buildConfigField("String", "BASE_URL", baseUrlKey) testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -118,7 +118,7 @@ dependencies { implementation("androidx.media3:media3-ui:$media3_version") //Ktor - val ktorVersion = "2.2.4" + val ktorVersion = "2.3.0" implementation("io.ktor:ktor-client-core:$ktorVersion") implementation("io.ktor:ktor-client-android:$ktorVersion") implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion") diff --git a/app/src/main/java/com/example/nineintelligence/MainActivity.kt b/app/src/main/java/com/example/nineintelligence/MainActivity.kt index 6036745..f8440ba 100644 --- a/app/src/main/java/com/example/nineintelligence/MainActivity.kt +++ b/app/src/main/java/com/example/nineintelligence/MainActivity.kt @@ -14,12 +14,15 @@ import androidx.navigation.compose.rememberNavController import com.example.nineintelligence.core.AuthPrefs import com.example.nineintelligence.domain.util.ExamType import com.example.nineintelligence.navigation.RootNavigation +import com.example.nineintelligence.presentation.discuss.DiscussionScreen import com.example.nineintelligence.presentation.dummy.SubmitTest import com.example.nineintelligence.presentation.enter.LoginForm import com.example.nineintelligence.presentation.enter.RegisterScreen import com.example.nineintelligence.presentation.exam.ExamScreen +import com.example.nineintelligence.presentation.home.HomeScreen import com.example.nineintelligence.presentation.profile.ProfileScreen import com.example.nineintelligence.ui.theme.NineIntelligenceTheme +import com.google.accompanist.systemuicontroller.rememberSystemUiController import org.koin.android.ext.android.get @UnstableApi @@ -39,8 +42,8 @@ class MainActivity : ComponentActivity() { /*MainReadingSubject( modifier = Modifier.padding(horizontal = 12.dp) )*/ - /*RootNavigation()*/ - RegisterScreen(controller = rememberNavController()) + RootNavigation() + /*RegisterScreen(controller = rememberNavController())*/ /*ProfileScreen( Modifier .fillMaxSize() @@ -69,6 +72,11 @@ class MainActivity : ComponentActivity() { typeOf = ExamType.TAKE_EXAMS, slugName = "tryout-testing-1", time = 60 )*/ /*BankSoal(controller = rememberNavController(), modifier = Modifier.fillMaxSize())*/ + /*HomeScreen( + systemUi = rememberSystemUiController(), + rootController = rememberNavController() + )*/ + /* DiscussionScreen(typeOf = "", controller = rememberNavController())*/ } } } diff --git a/app/src/main/java/com/example/nineintelligence/core/AuthPrefs.kt b/app/src/main/java/com/example/nineintelligence/core/AuthPrefs.kt index 9946840..9904aa1 100644 --- a/app/src/main/java/com/example/nineintelligence/core/AuthPrefs.kt +++ b/app/src/main/java/com/example/nineintelligence/core/AuthPrefs.kt @@ -16,15 +16,23 @@ class AuthPrefs( private companion object { const val AUTH_KEY = "auth_token" - const val TIMER_KEY = "token_time" + const val SAVED_USERNAME = "username" + const val SAVED_PASSWORD = "password" val AUTH_KEY_PREF = stringPreferencesKey(AUTH_KEY) - val TIMER_KEY_PREF = stringPreferencesKey(TIMER_KEY) + val USER_PREF = stringPreferencesKey(SAVED_USERNAME) + val PASSWORD_PREF = stringPreferencesKey(SAVED_PASSWORD) } - suspend fun saveToken(key: String, definedTime: String) { + suspend fun saveToken(key: String) { store.edit { authKey -> authKey[AUTH_KEY_PREF] = key - authKey[TIMER_KEY_PREF] = definedTime + } + } + + suspend fun rememberUser(name: String, password: String) { + store.edit { userPrefs -> + userPrefs[USER_PREF] = name + userPrefs[PASSWORD_PREF] = password } } @@ -34,15 +42,38 @@ class AuthPrefs( }.first() } - suspend fun readTime(): String? { + suspend fun readTokenNonBlocking(): String? { return store.data.map { - it[TIMER_KEY_PREF] + it[AUTH_KEY_PREF] + }.first() + } + + suspend fun isRememberSaved(userName: (String) -> Unit, password: (String) -> Unit): Boolean { + val savedUser = store.data.map { + listOf( + it[USER_PREF], + it[PASSWORD_PREF] + ).takeWhile { out -> + out != null + } }.first() + if (savedUser.isNotEmpty()) { + userName(savedUser[0] ?: "") + password(savedUser[1] ?: "") + } + return savedUser.isNotEmpty() } suspend fun clearData() { store.edit { - it.clear() + it.remove(AUTH_KEY_PREF) + } + } + + suspend fun deleteSavedUser() { + store.edit { + it.remove(USER_PREF) + it.remove(PASSWORD_PREF) } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/nineintelligence/di/AppModule.kt b/app/src/main/java/com/example/nineintelligence/di/AppModule.kt index 412ffc6..573713a 100644 --- a/app/src/main/java/com/example/nineintelligence/di/AppModule.kt +++ b/app/src/main/java/com/example/nineintelligence/di/AppModule.kt @@ -130,7 +130,7 @@ val appModule = module { HomeViewModel(get(), get()) } viewModel { - TryOutInformationViewModel(get(), get()) + TryOutInformationViewModel(get(), get(), get()) } single { diff --git a/app/src/main/java/com/example/nineintelligence/domain/models/StartTryoutResponse.kt b/app/src/main/java/com/example/nineintelligence/domain/models/StartTryoutResponse.kt index 6bf409d..726024d 100644 --- a/app/src/main/java/com/example/nineintelligence/domain/models/StartTryoutResponse.kt +++ b/app/src/main/java/com/example/nineintelligence/domain/models/StartTryoutResponse.kt @@ -5,10 +5,10 @@ import kotlinx.serialization.Serializable @Serializable data class StartTryoutResponse( + @SerialName("to_id") val tryoutId: Int? = null, + @SerialName("user_answers") val userAnswer: List? = emptyList(), + @SerialName("user_id") val userId: String? = null, @SerialName("soal_struct") val soalStruct: String? = null, @SerialName("draft_id") val draftId: Int? = null, - @SerialName("duration") val duration: Int? = null, - @SerialName("user_id") val userId: String? = null, - @SerialName("to_id") val tryoutId: Int? = null, - @SerialName("user_answers") val userAnswer: List = emptyList() + @SerialName("duration") val duration: String? = null ) diff --git a/app/src/main/java/com/example/nineintelligence/domain/models/SubmitModel.kt b/app/src/main/java/com/example/nineintelligence/domain/models/SubmitModel.kt index 867cb9f..57e54eb 100644 --- a/app/src/main/java/com/example/nineintelligence/domain/models/SubmitModel.kt +++ b/app/src/main/java/com/example/nineintelligence/domain/models/SubmitModel.kt @@ -5,10 +5,10 @@ import kotlinx.serialization.Serializable @Serializable data class SubmitModel( - @SerialName("user_answers") val userAnswers: List + @SerialName("user_answers") val userAnswers: List = emptyList() ) @Serializable data class UserAnswerData( - @SerialName("soal_id") val id: Int, - @SerialName("answer") val answer: String + @SerialName("soal_id") val id: Int = 0, + @SerialName("answer") val answer: String = "" ) diff --git a/app/src/main/java/com/example/nineintelligence/domain/repository/StartTryoutImpl.kt b/app/src/main/java/com/example/nineintelligence/domain/repository/StartTryoutImpl.kt index 7583389..a0def14 100644 --- a/app/src/main/java/com/example/nineintelligence/domain/repository/StartTryoutImpl.kt +++ b/app/src/main/java/com/example/nineintelligence/domain/repository/StartTryoutImpl.kt @@ -7,16 +7,19 @@ import com.example.nineintelligence.domain.models.StartTryoutResponse import io.ktor.client.HttpClient import io.ktor.client.call.body import io.ktor.client.request.bearerAuth -import io.ktor.client.request.get import io.ktor.client.request.post +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json class StartTryoutImpl( private val http: HttpClient, private val authPrefs: AuthPrefs ) : StartTryout { override suspend fun startTryout(slugname: String): StartTryoutResponse { - return http.post("${BuildConfig.BASE_URL}tryouts/$slugname/start") { - bearerAuth(authPrefs.readToken() ?: return@post) - }.body() + val res = + Json.decodeFromString(http.post("${BuildConfig.BASE_URL}tryouts/$slugname/start") { + bearerAuth(authPrefs.readToken() ?: return@post) + }.body()) + return res } } \ No newline at end of file diff --git a/app/src/main/java/com/example/nineintelligence/domain/repository/SubmitAnswerImpl.kt b/app/src/main/java/com/example/nineintelligence/domain/repository/SubmitAnswerImpl.kt index d361b88..b8dff30 100644 --- a/app/src/main/java/com/example/nineintelligence/domain/repository/SubmitAnswerImpl.kt +++ b/app/src/main/java/com/example/nineintelligence/domain/repository/SubmitAnswerImpl.kt @@ -20,7 +20,7 @@ class SubmitAnswerImpl( ) : SubmitAnswer { override suspend fun submitAnswer(answer: SubmitModel, slugName: String): String { val res = http.post("${BuildConfig.BASE_URL}tryouts/$slugName/submit") { - bearerAuth(prefs.readToken() ?: return@post) + bearerAuth(prefs.readTokenNonBlocking() ?: return@post) contentType(ContentType.Application.Json) setBody(answer) }.body() diff --git a/app/src/main/java/com/example/nineintelligence/domain/use_case/tryout_use_case/StartTryoutUseCase.kt b/app/src/main/java/com/example/nineintelligence/domain/use_case/tryout_use_case/StartTryoutUseCase.kt index 9531872..f50de7f 100644 --- a/app/src/main/java/com/example/nineintelligence/domain/use_case/tryout_use_case/StartTryoutUseCase.kt +++ b/app/src/main/java/com/example/nineintelligence/domain/use_case/tryout_use_case/StartTryoutUseCase.kt @@ -12,10 +12,10 @@ class StartTryoutUseCase( return try { val res = tryout.startTryout(slugname) Resource.Success(res) - } catch (e: Exception) { + }/* catch (e: Exception) { println(e.message) Resource.Error(e.message) - } catch (e: IOException) { + }*/ catch (e: IOException) { println(e.message) Resource.Error(e.message) } diff --git a/app/src/main/java/com/example/nineintelligence/presentation/discuss/DiscussionScreen.kt b/app/src/main/java/com/example/nineintelligence/presentation/discuss/DiscussionScreen.kt index 6b9b437..98fd293 100644 --- a/app/src/main/java/com/example/nineintelligence/presentation/discuss/DiscussionScreen.kt +++ b/app/src/main/java/com/example/nineintelligence/presentation/discuss/DiscussionScreen.kt @@ -116,7 +116,6 @@ fun DiscussionScreen( controller.popBackStack() } ) - if (shouldShowPlaylistSelector) { MenuListDialog(onDismiss = { shouldShowPlaylistSelector = false @@ -172,9 +171,10 @@ private fun MainScreen( color = MainBlueColor ) - SideEffect { + LaunchedEffect(key1 = Unit, block = { playSelectedVideo(videoList[it], context, player = playerExo) - } + }) + DisposableEffect(key1 = true, effect = { onDispose { playerExo.release() diff --git a/app/src/main/java/com/example/nineintelligence/presentation/enter/EnterViewModel.kt b/app/src/main/java/com/example/nineintelligence/presentation/enter/EnterViewModel.kt index 0603b91..880411d 100644 --- a/app/src/main/java/com/example/nineintelligence/presentation/enter/EnterViewModel.kt +++ b/app/src/main/java/com/example/nineintelligence/presentation/enter/EnterViewModel.kt @@ -1,7 +1,9 @@ package com.example.nineintelligence.presentation.enter import androidx.compose.runtime.State +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.nineintelligence.core.AuthPrefs @@ -10,6 +12,7 @@ import com.example.nineintelligence.domain.util.Resource import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -21,24 +24,55 @@ class EnterViewModel( private val _currentPassword = MutableStateFlow("") private val _isCheckedRememberMe = MutableStateFlow(false) private val _loginState = mutableStateOf(LoginState()) + var isLoadingLogin by mutableStateOf(false) + private set val loginState: State = _loginState val currentEmail = _currentEmail.asStateFlow() val currentPassword = _currentPassword.asStateFlow() val isCheckedRememberMe = _isCheckedRememberMe.asStateFlow() + init { + viewModelScope.launch(Dispatchers.IO) { + _isCheckedRememberMe.update { + store.isRememberSaved(userName = { username -> + _currentEmail.update { + username + } + }, password = { password -> + _currentPassword.update { + password + } + }) + } + } + } + fun onEmailChange(text: String) = _currentEmail.update { text } fun onPasswordChange(text: String) = _currentPassword.update { text } - fun onCheckedChange(data: Boolean) = _isCheckedRememberMe.update { data } + fun onCheckedChange(data: Boolean) { + viewModelScope.launch(Dispatchers.IO) { + if (!data && store.isRememberSaved(userName = {}, password = {})) { + store.deleteSavedUser() + } + } + _isCheckedRememberMe.update { data } + } fun loginUser(username: String, password: String) = viewModelScope.launch(Dispatchers.IO) { + isLoadingLogin = true login.getUserAuth(username, password).let { out -> when (out) { is Resource.Success -> { - store.saveToken(out.data?.token ?: return@launch, "") + isLoadingLogin = false + if (isCheckedRememberMe.first()) { + store.rememberUser(username, password) + } + store.saveToken(out.data?.token ?: return@launch) _loginState.value = LoginState(false, out.data.token, "") } is Resource.Error -> { + isLoadingLogin = false _loginState.value = LoginState(false, null, out.errorMessages ?: "") } diff --git a/app/src/main/java/com/example/nineintelligence/presentation/enter/LoginForm.kt b/app/src/main/java/com/example/nineintelligence/presentation/enter/LoginForm.kt index 835a04c..f8be882 100644 --- a/app/src/main/java/com/example/nineintelligence/presentation/enter/LoginForm.kt +++ b/app/src/main/java/com/example/nineintelligence/presentation/enter/LoginForm.kt @@ -4,6 +4,7 @@ import android.util.Patterns import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -24,6 +25,7 @@ import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.Checkbox import androidx.compose.material3.CheckboxDefaults +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -52,6 +54,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.compose.ui.window.Dialog import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController import com.example.nineintelligence.R @@ -67,8 +70,7 @@ import org.koin.androidx.compose.koinViewModel @OptIn(ExperimentalMaterial3Api::class) @Composable fun LoginForm( - viewModel: EnterViewModel = koinViewModel(), - controller: NavController + viewModel: EnterViewModel = koinViewModel(), controller: NavController ) { val email by viewModel.currentEmail.collectAsStateWithLifecycle() val password by viewModel.currentPassword.collectAsStateWithLifecycle() @@ -163,12 +165,13 @@ fun LoginForm( fontFamily = font, fontSize = 14.sp ) - }, isError = if (hasFocusedEmail) isErrorEmailAddress else false, + }, + isError = if (hasFocusedEmail) isErrorEmailAddress else false, singleLine = true, supportingText = { - if(hasFocusedEmail && isErrorEmailAddress) { - CustomText(text = "Invalid Email Address") - } + if (hasFocusedEmail && isErrorEmailAddress) { + CustomText(text = "Invalid Email Address") + } }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email) ) @@ -204,8 +207,7 @@ fun LoginForm( }) { Icon( imageVector = if (passwordVisibility) Icons.Filled.VisibilityOff - else Icons.Filled.Visibility, - contentDescription = null + else Icons.Filled.Visibility, contentDescription = null ) } }, @@ -254,7 +256,16 @@ fun LoginForm( } } } + Box( + modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center + ) { + if(viewModel.isLoadingLogin){ + Dialog(onDismissRequest = { }) { + CircularProgressIndicator(color = MainYellowColor) + } + } + } } } diff --git a/app/src/main/java/com/example/nineintelligence/presentation/enter/RegisterScreen.kt b/app/src/main/java/com/example/nineintelligence/presentation/enter/RegisterScreen.kt index bde9af3..0559a64 100644 --- a/app/src/main/java/com/example/nineintelligence/presentation/enter/RegisterScreen.kt +++ b/app/src/main/java/com/example/nineintelligence/presentation/enter/RegisterScreen.kt @@ -33,6 +33,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextStyle @@ -47,6 +48,7 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController import com.example.nineintelligence.R +import com.example.nineintelligence.core.CustomText import com.example.nineintelligence.ui.theme.DeliverCustomFonts import com.example.nineintelligence.ui.theme.MainYellowColor import com.example.nineintelligence.ui.theme.PlaceholderColor @@ -68,9 +70,12 @@ fun RegisterScreen( var confirmPasswordVisibility by remember { mutableStateOf(true) } - val correctBothPassword = remember(viewModel.password,viewModel.confirmPassword) { + val correctBothPassword = remember(viewModel.confirmPassword,viewModel.password) { viewModel.password == viewModel.confirmPassword } + var hasFocusedConfirmPassword by remember { + mutableStateOf(false) + } val context = LocalContext.current LaunchedEffect(key1 = registerState, block = { if (registerState?.userName != null) { @@ -278,7 +283,16 @@ fun RegisterScreen( context ) }, - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .onFocusChanged { + if (hasFocusedConfirmPassword) { + return@onFocusChanged + } + if (it.isFocused) { + hasFocusedConfirmPassword = true + } + }, shape = RoundedCornerShape(14.dp), placeholder = { Text( @@ -299,7 +313,12 @@ fun RegisterScreen( ) } }, visualTransformation = if (confirmPasswordVisibility) - PasswordVisualTransformation() else VisualTransformation.None + PasswordVisualTransformation() else VisualTransformation.None, + isError = !correctBothPassword, supportingText = { + if(!correctBothPassword){ + CustomText(text = "Confirm Password incorrect") + } + } ) Spacer(modifier = Modifier.height(8.dp)) Row( diff --git a/app/src/main/java/com/example/nineintelligence/presentation/exam/ExamScreen.kt b/app/src/main/java/com/example/nineintelligence/presentation/exam/ExamScreen.kt index 81f0c8f..95e88c7 100644 --- a/app/src/main/java/com/example/nineintelligence/presentation/exam/ExamScreen.kt +++ b/app/src/main/java/com/example/nineintelligence/presentation/exam/ExamScreen.kt @@ -135,6 +135,16 @@ fun ExamScreen( val retrievedSoal by vm.listQuestion.collectAsStateWithLifecycle() val discussionResponse by vm.discussionResponse.collectAsStateWithLifecycle() val resultSubmit by vm.resultSubmit.collectAsStateWithLifecycle() + LaunchedEffect(key1 = resultSubmit, block = { + resultSubmit?.let { + shouldShowDialogOver = false + controller.navigate(NavigationHolder.QuestionDiscussion.route + "/$slugName") { + popUpTo(NavigationHolder.ExamScreen.route + "/$slugName") { + inclusive = true + } + } + } + }) BackHandler { controller.navigate(NavigationHolder.ProfileScreenChild.route) { popUpTo(NavigationHolder.ProfileScreenChild.route) { @@ -366,18 +376,10 @@ fun ExamScreen( if (shouldShowDialogOver) { Dialog(onDismissRequest = { shouldShowDialogOver = false }) { DialogIsOver(onSubmitClick = { - /*vm.saveAnswer(SubmitModel(savedAnswerViewModel?.map { + vm.saveAnswer(SubmitModel(savedAnswerViewModel?.map { it.second } ?: return@DialogIsOver), slugName) - resultSubmit?.let { - }*/ - shouldShowDialogOver = false - controller.navigate(NavigationHolder.QuestionDiscussion.route + "/$slugName") { - popUpTo(NavigationHolder.ProfileScreenChild.route) { - inclusive = true - } - } }, onCancelClick = { shouldShowDialogOver = false }) diff --git a/app/src/main/java/com/example/nineintelligence/presentation/home/HomeScreen.kt b/app/src/main/java/com/example/nineintelligence/presentation/home/HomeScreen.kt index 68e83b0..8dfeebe 100644 --- a/app/src/main/java/com/example/nineintelligence/presentation/home/HomeScreen.kt +++ b/app/src/main/java/com/example/nineintelligence/presentation/home/HomeScreen.kt @@ -183,7 +183,7 @@ fun HomeScreen( modifier = Modifier.padding( top = 32.dp, bottom = 64.dp - ) + ), upcomingTryout = "" ) } } @@ -264,7 +264,7 @@ fun HomeScreen( type = NavType.StringType defaultValue = "" } - )) {out-> + )) { out -> val getSlug = out.arguments?.getString("slug") ExamScreen( controller = controller, modifier = Modifier @@ -368,7 +368,8 @@ private fun HeaderRow( @OptIn(ExperimentalMaterial3Api::class) @Composable private fun HomeScreenChild( - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + upcomingTryout: String = "" ) { var shouldShowReminderDialog by remember { mutableStateOf(false) diff --git a/app/src/main/java/com/example/nineintelligence/presentation/tryout/TryOutInformationViewModel.kt b/app/src/main/java/com/example/nineintelligence/presentation/tryout/TryOutInformationViewModel.kt index bddfdc3..e0f9f28 100644 --- a/app/src/main/java/com/example/nineintelligence/presentation/tryout/TryOutInformationViewModel.kt +++ b/app/src/main/java/com/example/nineintelligence/presentation/tryout/TryOutInformationViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import com.example.nineintelligence.domain.models.GetSoalModel import com.example.nineintelligence.domain.models.TakenTryOutModel import com.example.nineintelligence.domain.use_case.exam_use_case.GetSoalUseCase +import com.example.nineintelligence.domain.use_case.tryout_use_case.StartTryoutUseCase import com.example.nineintelligence.domain.use_case.tryout_use_case.TakenTryOutUseCase import com.example.nineintelligence.domain.util.Resource import kotlinx.coroutines.Dispatchers @@ -15,7 +16,8 @@ import kotlinx.coroutines.launch class TryOutInformationViewModel( private val takenTryOutUseCase: TakenTryOutUseCase, - private val getSoalUseCase: GetSoalUseCase + private val getSoalUseCase: GetSoalUseCase, + private val startTryoutUseCase: StartTryoutUseCase ) : ViewModel() { private val _takenTryOutInformation = MutableStateFlow(null) val takenTryOutInformation = _takenTryOutInformation.asStateFlow() @@ -23,6 +25,24 @@ class TryOutInformationViewModel( private val _getSoal = MutableStateFlow>(emptyList()) val getSoal = _getSoal.asStateFlow() + fun startTryout(slugname: String) = viewModelScope.launch(Dispatchers.IO) { + startTryoutUseCase.startTryout(slugname).let { + when (it) { + is Resource.Success -> { + println(it.data?.duration) + } + + is Resource.Error -> { + + } + + else -> { + + } + } + } + } + suspend fun readTryOutRequiredInformation(slugname: String) { when (val res = takenTryOutUseCase.getListTakenTryOut()) { is Resource.Success -> { diff --git a/app/src/main/java/com/example/nineintelligence/presentation/tryout/TryoutInformation.kt b/app/src/main/java/com/example/nineintelligence/presentation/tryout/TryoutInformation.kt index 4ea562b..671592a 100644 --- a/app/src/main/java/com/example/nineintelligence/presentation/tryout/TryoutInformation.kt +++ b/app/src/main/java/com/example/nineintelligence/presentation/tryout/TryoutInformation.kt @@ -232,6 +232,7 @@ fun TryoutInformation( Spacer(modifier = Modifier.height(12.dp)) Button( onClick = { + viewModel.startTryout(slugname) controller.navigate( NavigationHolder.ExamScreen.route + "/$slugname/" + "${tryoutInfo?.tryoutDetails?.duration}" diff --git a/build.gradle.kts b/build.gradle.kts index cb760f3..559bc89 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - val agp_version by extra("8.1.0-alpha11") + val agp_version by extra("8.2.0-alpha01") val agp_version1 by extra(agp_version) val agp_version2 by extra("7.4.2") val agp_version3 by extra(agp_version1) @@ -14,7 +14,7 @@ buildscript { } dependencies { classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0") - classpath("com.android.tools.build:gradle:$agp_version6") + classpath("com.android.tools.build:gradle:$agp_version2") } }