before sleep

This commit is contained in:
MaximOksiuta
2025-11-23 05:29:28 +03:00
parent 4fadf1bb81
commit 539f477c95
8 changed files with 51 additions and 44 deletions
@@ -22,4 +22,7 @@ interface ResumeDao: BasePaginationDAO<ResumeEntity> {
@Query("SELECT * FROM resumes WHERE id = :resumeId LIMIT 1")
fun getById(resumeId: String): Flow<ResumeEntity?>
@Query("DELETE FROM resumes WHERE id = :resumeId")
suspend fun deleteWithId(resumeId: String)
}
@@ -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<String> = networkRequest<ResumeCreateDTO> {
): Result<String> = networkRequest<ResumeDTO> {
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<ResumeModel> =
@@ -140,23 +147,12 @@ class ResumeRepositoryImpl(
resumeId: String,
offset: Long,
pageSize: Int
): Result<List<ResumeModel>> {
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")
)
}
return Result.success(mock)
): Result<List<ResumeModel>> = networkRequest<ResumeListDTO> {
method = HttpMethod.Get
url {
path("resume", resumeId, "history")
parameters.append("limit", pageSize.toString())
parameters.append("offset", offset.toString())
}
}.map { it -> it.resumes.map { it.mapToDomain() } }
}
@@ -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
@@ -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<CreateResumeViewModel>(),
title: String = "Новое резюме",
submitButtonText: String = "Узнать свою ЗП"
) {
@@ -298,6 +299,7 @@ fun ErrorCollectorScope.CreateResumeScreen(
Spacer(modifier = Modifier.height(Paddings.large))
val resumeFillState = viewModel.resumeFillState.collectAsStateWithCallbacks {
Log.d("CreateResumeScreen", it)
openResumeDetails(it)
}
BigButton(
@@ -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
) {
@@ -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<String>(AppDestination.ResumeEdit.ARG_ID)
?: savedStateHandle.get<String>("id") ?: ""
// private val resumeId: String =
// savedStateHandle.get<String>(AppDestination.ResumeEdit.ARG_ID)
// ?: savedStateHandle.get<String>("id") ?: ""
init {
viewModelScope.launch {
@@ -61,10 +61,7 @@ fun ErrorCollectorScope.ResumeDetailsScreen(
)
}
) {
val resumeState by viewModel.resumeState.collectAsStateWithCallbacks()
resumeState.FoldUIStateWithGlobalCallbacks(
viewModel.resumeState.FoldUIStateWithGlobalCallbacks(
onLoading = {
LoadingPlaceholder(
modifier = Modifier
@@ -45,7 +45,7 @@ class ResumeDetailsViewModel(
resumeState.collect {
val data = (it as? UIState.Success)?.data
if (data?.prediction == null) {
startPredictionPolling()
// startPredictionPolling()
}
}
}