You've already forked RekomenciMobile
before sleep
This commit is contained in:
+3
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-20
@@ -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() } }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-1
@@ -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
|
||||||
+11
-9
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-1
@@ -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
|
||||||
) {
|
) {
|
||||||
|
|||||||
+7
-8
@@ -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 {
|
||||||
|
|||||||
+1
-4
@@ -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
|
||||||
|
|||||||
+1
-1
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user