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") @Query("SELECT * FROM resumes WHERE id = :resumeId LIMIT 1")
fun getById(resumeId: String): Flow<ResumeEntity?> 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.map
import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.merge
import org.koin.core.annotation.Single import org.koin.core.annotation.Single
import kotlin.collections.map
@Single @Single
class ResumeRepositoryImpl( class ResumeRepositoryImpl(
@@ -78,7 +79,7 @@ class ResumeRepositoryImpl(
override suspend fun updateResume( override suspend fun updateResume(
resumeId: String, resumeId: String,
resumeForm: ResumeCreationModel resumeForm: ResumeCreationModel
): Result<String> = networkRequest<ResumeCreateDTO> { ): Result<String> = networkRequest<ResumeDTO> {
method = HttpMethod.Patch method = HttpMethod.Patch
url { url {
@@ -88,7 +89,13 @@ class ResumeRepositoryImpl(
setBody(resumeForm.mapToData()) setBody(resumeForm.mapToData())
contentType(ContentType.Application.Json) contentType(ContentType.Application.Json)
}.map { }.map {
resumeId resumeDao.upsertAll(
listOf(
it.mapToDB()
)
)
resumeDao.deleteWithId(resumeId)
it.id
} }
override suspend fun refreshResume(resumeId: String): Result<ResumeModel> = override suspend fun refreshResume(resumeId: String): Result<ResumeModel> =
@@ -140,23 +147,12 @@ class ResumeRepositoryImpl(
resumeId: String, resumeId: String,
offset: Long, offset: Long,
pageSize: Int pageSize: Int
): Result<List<ResumeModel>> { ): Result<List<ResumeModel>> = networkRequest<ResumeListDTO> {
val mock = List(pageSize) { index -> method = HttpMethod.Get
val version = (offset + index + 1).toInt() url {
ResumeModel( path("resume", resumeId, "history")
id = resumeId, parameters.append("limit", pageSize.toString())
position = "Android разработчик v$version", parameters.append("offset", offset.toString())
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) }.map { it -> it.resumes.map { it.mapToDomain() } }
}
} }
@@ -36,7 +36,13 @@ data class ResumeFormState(
) )
@KoinViewModel @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 suggestSkillsUseCase: SuggestSkillsUseCase,
private val validateDataUseCase: ValidateFieldsUseCase, private val validateDataUseCase: ValidateFieldsUseCase,
private val postResumeUseCase: PostResumeUseCase private val postResumeUseCase: PostResumeUseCase
@@ -1,5 +1,6 @@
package com.prodhack.moscow2025.presentation.screens.createResume package com.prodhack.moscow2025.presentation.screens.createResume
import android.util.Log
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
@@ -52,7 +53,7 @@ import org.koin.androidx.compose.koinViewModel
fun ErrorCollectorScope.CreateResumeScreen( fun ErrorCollectorScope.CreateResumeScreen(
goBack: () -> Unit, goBack: () -> Unit,
openResumeDetails: (String) -> Unit, openResumeDetails: (String) -> Unit,
viewModel: CreateResumeViewModel = koinViewModel(), viewModel: BaseCreateResumeViewModel = koinViewModel<CreateResumeViewModel>(),
title: String = "Новое резюме", title: String = "Новое резюме",
submitButtonText: String = "Узнать свою ЗП" submitButtonText: String = "Узнать свою ЗП"
) { ) {
@@ -297,14 +298,15 @@ fun ErrorCollectorScope.CreateResumeScreen(
Spacer(modifier = Modifier.height(Paddings.large)) Spacer(modifier = Modifier.height(Paddings.large))
val resumeFillState = viewModel.resumeFillState.collectAsStateWithCallbacks { val resumeFillState = viewModel.resumeFillState.collectAsStateWithCallbacks {
openResumeDetails(it) Log.d("CreateResumeScreen", it)
} openResumeDetails(it)
BigButton( }
onClick = viewModel::submit, BigButton(
buttonText = submitButtonText, onClick = viewModel::submit,
isLoading = resumeFillState.value.isLoading buttonText = submitButtonText,
) isLoading = resumeFillState.value.isLoading
)
Spacer(modifier = Modifier.height(Paddings.large)) Spacer(modifier = Modifier.height(Paddings.large))
} }
} }
@@ -11,7 +11,11 @@ import org.koin.core.parameter.parametersOf
@Composable @Composable
fun ErrorCollectorScope.EditResumeScreen( fun ErrorCollectorScope.EditResumeScreen(
navBackStackEntry: NavBackStackEntry, navBackStackEntry: NavBackStackEntry,
viewModel: EditResumeViewModel = koinViewModel(), viewModel: EditResumeViewModel = koinViewModel {
parametersOf(
navBackStackEntry.arguments?.getString(AppDestination.ResumeEdit.ARG_ID, "") ?: ""
)
},
openResumeDetails: (String) -> Unit, openResumeDetails: (String) -> Unit,
goBack: () -> Unit goBack: () -> Unit
) { ) {
@@ -1,15 +1,14 @@
package com.prodhack.moscow2025.presentation.screens.editResume package com.prodhack.moscow2025.presentation.screens.editResume
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.prodhack.moscow2025.domain.usecase.auth.ValidateFieldsUseCase import com.prodhack.moscow2025.domain.usecase.auth.ValidateFieldsUseCase
import com.prodhack.moscow2025.domain.usecase.resumes.GetResumeInfoUseCase import com.prodhack.moscow2025.domain.usecase.resumes.GetResumeInfoUseCase
import com.prodhack.moscow2025.domain.usecase.resumes.PostResumeUseCase import com.prodhack.moscow2025.domain.usecase.resumes.PostResumeUseCase
import com.prodhack.moscow2025.domain.usecase.resumes.SuggestSkillsUseCase import com.prodhack.moscow2025.domain.usecase.resumes.SuggestSkillsUseCase
import com.prodhack.moscow2025.presentation.navigation.AppDestination import com.prodhack.moscow2025.presentation.screens.createResume.BaseCreateResumeViewModel
import com.prodhack.moscow2025.presentation.screens.createResume.CreateResumeViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koin.android.annotation.KoinViewModel import org.koin.android.annotation.KoinViewModel
import org.koin.core.annotation.Provided
@KoinViewModel @KoinViewModel
class EditResumeViewModel( class EditResumeViewModel(
@@ -17,15 +16,15 @@ class EditResumeViewModel(
suggestSkillsUseCase: SuggestSkillsUseCase, suggestSkillsUseCase: SuggestSkillsUseCase,
validateDataUseCase: ValidateFieldsUseCase, validateDataUseCase: ValidateFieldsUseCase,
postResumeUseCase: PostResumeUseCase, postResumeUseCase: PostResumeUseCase,
savedStateHandle: SavedStateHandle @Provided resumeId: String
) : CreateResumeViewModel( ) : BaseCreateResumeViewModel(
suggestSkillsUseCase = suggestSkillsUseCase, suggestSkillsUseCase = suggestSkillsUseCase,
validateDataUseCase = validateDataUseCase, validateDataUseCase = validateDataUseCase,
postResumeUseCase = postResumeUseCase postResumeUseCase = postResumeUseCase
) { ) {
private val resumeId: String = // private val resumeId: String =
savedStateHandle.get<String>(AppDestination.ResumeEdit.ARG_ID) // savedStateHandle.get<String>(AppDestination.ResumeEdit.ARG_ID)
?: savedStateHandle.get<String>("id") ?: "" // ?: savedStateHandle.get<String>("id") ?: ""
init { init {
viewModelScope.launch { viewModelScope.launch {
@@ -61,10 +61,7 @@ fun ErrorCollectorScope.ResumeDetailsScreen(
) )
} }
) { ) {
viewModel.resumeState.FoldUIStateWithGlobalCallbacks(
val resumeState by viewModel.resumeState.collectAsStateWithCallbacks()
resumeState.FoldUIStateWithGlobalCallbacks(
onLoading = { onLoading = {
LoadingPlaceholder( LoadingPlaceholder(
modifier = Modifier modifier = Modifier
@@ -45,7 +45,7 @@ class ResumeDetailsViewModel(
resumeState.collect { resumeState.collect {
val data = (it as? UIState.Success)?.data val data = (it as? UIState.Success)?.data
if (data?.prediction == null) { if (data?.prediction == null) {
startPredictionPolling() // startPredictionPolling()
} }
} }
} }