diff --git a/app/src/main/java/com/prodhack/moscow2025/data/data_providers/local_db/dao/ResumeDao.kt b/app/src/main/java/com/prodhack/moscow2025/data/data_providers/local_db/dao/ResumeDao.kt index a92d8df..b349ee0 100644 --- a/app/src/main/java/com/prodhack/moscow2025/data/data_providers/local_db/dao/ResumeDao.kt +++ b/app/src/main/java/com/prodhack/moscow2025/data/data_providers/local_db/dao/ResumeDao.kt @@ -22,4 +22,7 @@ interface ResumeDao: BasePaginationDAO { @Query("SELECT * FROM resumes WHERE id = :resumeId LIMIT 1") fun getById(resumeId: String): Flow + + @Query("DELETE FROM resumes WHERE id = :resumeId") + suspend fun deleteWithId(resumeId: String) } diff --git a/app/src/main/java/com/prodhack/moscow2025/data/repImplementations/ResumeRepositoryImpl.kt b/app/src/main/java/com/prodhack/moscow2025/data/repImplementations/ResumeRepositoryImpl.kt index 86b9144..9620d01 100644 --- a/app/src/main/java/com/prodhack/moscow2025/data/repImplementations/ResumeRepositoryImpl.kt +++ b/app/src/main/java/com/prodhack/moscow2025/data/repImplementations/ResumeRepositoryImpl.kt @@ -27,6 +27,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import org.koin.core.annotation.Single +import kotlin.collections.map @Single class ResumeRepositoryImpl( @@ -78,7 +79,7 @@ class ResumeRepositoryImpl( override suspend fun updateResume( resumeId: String, resumeForm: ResumeCreationModel - ): Result = networkRequest { + ): Result = networkRequest { method = HttpMethod.Patch url { @@ -88,7 +89,13 @@ class ResumeRepositoryImpl( setBody(resumeForm.mapToData()) contentType(ContentType.Application.Json) }.map { - resumeId + resumeDao.upsertAll( + listOf( + it.mapToDB() + ) + ) + resumeDao.deleteWithId(resumeId) + it.id } override suspend fun refreshResume(resumeId: String): Result = @@ -140,23 +147,12 @@ class ResumeRepositoryImpl( resumeId: String, offset: Long, pageSize: Int - ): Result> { - val mock = List(pageSize) { index -> - val version = (offset + index + 1).toInt() - ResumeModel( - id = resumeId, - position = "Android разработчик v$version", - about = "Описание версии $version", - skills = listOf("Kotlin", "Compose", "Room", "Ktor $version"), - city = "Москва", - experienceType = com.prodhack.moscow2025.domain.models.ExperienceType.Between3And6, - experience = emptyList(), - education = emptyList(), - projects = emptyList(), - prediction = Pair(200000 + version * 1000, 230000 + version * 1000), - recommendedSkills = listOf("Coroutines", "Flows") - ) + ): Result> = networkRequest { + method = HttpMethod.Get + url { + path("resume", resumeId, "history") + parameters.append("limit", pageSize.toString()) + parameters.append("offset", offset.toString()) } - return Result.success(mock) - } + }.map { it -> it.resumes.map { it.mapToDomain() } } } diff --git a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/CreateResumeViewModel.kt b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/BaseCreateResumeViewModel.kt similarity index 97% rename from app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/CreateResumeViewModel.kt rename to app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/BaseCreateResumeViewModel.kt index 2f74221..15e07a8 100644 --- a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/CreateResumeViewModel.kt +++ b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/BaseCreateResumeViewModel.kt @@ -36,7 +36,13 @@ data class ResumeFormState( ) @KoinViewModel -open class CreateResumeViewModel( +class CreateResumeViewModel( + suggestSkillsUseCase: SuggestSkillsUseCase, + validateDataUseCase: ValidateFieldsUseCase, + postResumeUseCase: PostResumeUseCase +) : BaseCreateResumeViewModel(suggestSkillsUseCase, validateDataUseCase, postResumeUseCase) + +open class BaseCreateResumeViewModel( private val suggestSkillsUseCase: SuggestSkillsUseCase, private val validateDataUseCase: ValidateFieldsUseCase, private val postResumeUseCase: PostResumeUseCase diff --git a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/CreateResumeScreen.kt b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/CreateResumeScreen.kt index c9e9eba..d98786c 100644 --- a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/CreateResumeScreen.kt +++ b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/createResume/CreateResumeScreen.kt @@ -1,5 +1,6 @@ package com.prodhack.moscow2025.presentation.screens.createResume +import android.util.Log import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope @@ -52,7 +53,7 @@ import org.koin.androidx.compose.koinViewModel fun ErrorCollectorScope.CreateResumeScreen( goBack: () -> Unit, openResumeDetails: (String) -> Unit, - viewModel: CreateResumeViewModel = koinViewModel(), + viewModel: BaseCreateResumeViewModel = koinViewModel(), title: String = "Новое резюме", submitButtonText: String = "Узнать свою ЗП" ) { @@ -297,14 +298,15 @@ fun ErrorCollectorScope.CreateResumeScreen( Spacer(modifier = Modifier.height(Paddings.large)) - val resumeFillState = viewModel.resumeFillState.collectAsStateWithCallbacks { - openResumeDetails(it) - } - BigButton( - onClick = viewModel::submit, - buttonText = submitButtonText, - isLoading = resumeFillState.value.isLoading - ) + val resumeFillState = viewModel.resumeFillState.collectAsStateWithCallbacks { + Log.d("CreateResumeScreen", it) + openResumeDetails(it) + } + BigButton( + onClick = viewModel::submit, + buttonText = submitButtonText, + isLoading = resumeFillState.value.isLoading + ) Spacer(modifier = Modifier.height(Paddings.large)) } } diff --git a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/editResume/EditResumeScreen.kt b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/editResume/EditResumeScreen.kt index cfe52c8..60d1fc0 100644 --- a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/editResume/EditResumeScreen.kt +++ b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/editResume/EditResumeScreen.kt @@ -11,7 +11,11 @@ import org.koin.core.parameter.parametersOf @Composable fun ErrorCollectorScope.EditResumeScreen( navBackStackEntry: NavBackStackEntry, - viewModel: EditResumeViewModel = koinViewModel(), + viewModel: EditResumeViewModel = koinViewModel { + parametersOf( + navBackStackEntry.arguments?.getString(AppDestination.ResumeEdit.ARG_ID, "") ?: "" + ) + }, openResumeDetails: (String) -> Unit, goBack: () -> Unit ) { diff --git a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/editResume/EditResumeViewModel.kt b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/editResume/EditResumeViewModel.kt index a3306d3..c8d6b20 100644 --- a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/editResume/EditResumeViewModel.kt +++ b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/editResume/EditResumeViewModel.kt @@ -1,15 +1,14 @@ package com.prodhack.moscow2025.presentation.screens.editResume -import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.prodhack.moscow2025.domain.usecase.auth.ValidateFieldsUseCase import com.prodhack.moscow2025.domain.usecase.resumes.GetResumeInfoUseCase import com.prodhack.moscow2025.domain.usecase.resumes.PostResumeUseCase import com.prodhack.moscow2025.domain.usecase.resumes.SuggestSkillsUseCase -import com.prodhack.moscow2025.presentation.navigation.AppDestination -import com.prodhack.moscow2025.presentation.screens.createResume.CreateResumeViewModel +import com.prodhack.moscow2025.presentation.screens.createResume.BaseCreateResumeViewModel import kotlinx.coroutines.launch import org.koin.android.annotation.KoinViewModel +import org.koin.core.annotation.Provided @KoinViewModel class EditResumeViewModel( @@ -17,15 +16,15 @@ class EditResumeViewModel( suggestSkillsUseCase: SuggestSkillsUseCase, validateDataUseCase: ValidateFieldsUseCase, postResumeUseCase: PostResumeUseCase, - savedStateHandle: SavedStateHandle -) : CreateResumeViewModel( + @Provided resumeId: String +) : BaseCreateResumeViewModel( suggestSkillsUseCase = suggestSkillsUseCase, validateDataUseCase = validateDataUseCase, postResumeUseCase = postResumeUseCase ) { - private val resumeId: String = - savedStateHandle.get(AppDestination.ResumeEdit.ARG_ID) - ?: savedStateHandle.get("id") ?: "" +// private val resumeId: String = +// savedStateHandle.get(AppDestination.ResumeEdit.ARG_ID) +// ?: savedStateHandle.get("id") ?: "" init { viewModelScope.launch { diff --git a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/resumeDetails/ResumeDetailsScreen.kt b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/resumeDetails/ResumeDetailsScreen.kt index 2c65073..ba7cd67 100644 --- a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/resumeDetails/ResumeDetailsScreen.kt +++ b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/resumeDetails/ResumeDetailsScreen.kt @@ -61,10 +61,7 @@ fun ErrorCollectorScope.ResumeDetailsScreen( ) } ) { - - val resumeState by viewModel.resumeState.collectAsStateWithCallbacks() - - resumeState.FoldUIStateWithGlobalCallbacks( + viewModel.resumeState.FoldUIStateWithGlobalCallbacks( onLoading = { LoadingPlaceholder( modifier = Modifier diff --git a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/resumeDetails/ResumeDetailsViewModel.kt b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/resumeDetails/ResumeDetailsViewModel.kt index e7a5434..74bc98c 100644 --- a/app/src/main/java/com/prodhack/moscow2025/presentation/screens/resumeDetails/ResumeDetailsViewModel.kt +++ b/app/src/main/java/com/prodhack/moscow2025/presentation/screens/resumeDetails/ResumeDetailsViewModel.kt @@ -45,7 +45,7 @@ class ResumeDetailsViewModel( resumeState.collect { val data = (it as? UIState.Success)?.data if (data?.prediction == null) { - startPredictionPolling() +// startPredictionPolling() } } }