Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
a51b0cf
ANDR-5: Инициализация фичи Interview Trainer и верстка первого экрана…
PanMobile Jan 25, 2026
091ef9e
ANDR-5: CreateQuiz второй этап. Data + Domain (#95)
PanMobile Jan 30, 2026
f36f589
[ANDR-54] ANDR-70: Третий этап CreateQuizScreen. Логика + Тесты (#100)
PanMobile Feb 2, 2026
f678a8a
Merge branch 'develop' into epic/ANDR-52
PanMobile Feb 17, 2026
ca71f39
Merge branch 'develop' into epic/ANDR-52
PanMobile Feb 19, 2026
017c4fe
[Публичный тренажер] ANDR-71: Четвертый этап CreateQuizScreen. Навиг…
PanMobile Feb 19, 2026
0317040
[Публичный тренажер] ANDR-58: Первый этап InterviewQuizScreen. Полная…
Deyryl Feb 19, 2026
3785e6b
ANDR-71: Обработка ошибок при запросе
PanMobile Feb 20, 2026
398ee9a
ANDR-71: строковые ресурсы для contentDescription
PanMobile Feb 20, 2026
13668ed
ANDR-71: Изменение верстки экрана загрузки; добавление передаваемого …
PanMobile Feb 20, 2026
ea3151b
ANDR-71: небольшой рефактор основного экрана (Box вынесен внутрь экра…
PanMobile Feb 20, 2026
1b7ba91
Revert коммитов
PanMobile Feb 20, 2026
8cfd22f
[Публичный тренажер] ANDR-71: Пятый этап CreateQuizScreen. QOL измен…
PanMobile Mar 6, 2026
580f882
[Публичный тренажер] ANDR-59: Второй этап InterviewQuizScreen. Data +…
Deyryl Mar 12, 2026
27d9524
ANDR-93: вынос в core-ui кнопок Знаю/Не знаю. Исползование в QuizScre…
Deyryl Mar 21, 2026
b7e8bd4
Feature/ANDR-63-1 Публичный тренажер, экран результатов. Верстка экра…
arte123ras Mar 26, 2026
d67071c
[Публичный тренажер] ANDR-60: Третий этап InterviewQuizScreen. Логика…
Deyryl Mar 30, 2026
228b7cc
Feature/andr 95 (#131)
xMODDIIx Mar 30, 2026
ae52c4b
[Публичный тренажер] ANDR-71: CreateQuizScreen. QOL изменения-2 (#126)
PanMobile Mar 30, 2026
9c61fa1
ANDR-95-fix-text-field: добавил второй modifier для OutlinedTextField…
xMODDIIx Apr 1, 2026
31c4dd9
[Публичный тренажер] ANDR-72: Четвертый этап InterviewQuizScreen. Нав…
Deyryl Apr 3, 2026
77b6fde
[Dynamic Preview] ANDR-94: Новое динамическое превью (#137)
PanMobile Apr 14, 2026
c05fb17
ANDR-101: SkillButton-Refactor (#140)
Yrun00 Apr 17, 2026
4a831a3
Второй этап, ANDR-64: data+domain (#144)
arte123ras Apr 25, 2026
2813945
Merge branch 'develop' into epic/ANDR-52
PanMobile Apr 25, 2026
921e66c
[Публичный тренажер] ANDR-71: CreateQuizScreen. QOL изменения-3 (#147)
PanMobile May 11, 2026
c0dbbe1
[Публичный тренажер] ANDR-72: Четвертый этап InterviewQuizScreen. Нав…
Deyryl Jun 1, 2026
bd04c68
ANDR-104: подключение фичи epic/ANDR-52 (interview-trainer)
Jeskrill Jun 29, 2026
5ee005f
ANDR-104: фича-тоггл EnableInterviewTrainer
Jeskrill Jun 29, 2026
629787e
ANDR-104: гейтинг Interview Trainer по фича-тогглу
Jeskrill Jun 29, 2026
4fd974e
ANDR-104: скрытие карточки Interview Trainer на home
Jeskrill Jun 29, 2026
3e0a41c
ANDR-104: Тест на скрытие карточки
Jeskrill Jun 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ dependencies {
implementation(project(":feature:questions-or-collections:impl"))
implementation(project(":feature:public-collections:impl"))
implementation(project(":feature:selection-specializations:impl"))
implementation(project(":feature:interview-trainer:api"))
implementation(project(":feature:interview-trainer:impl"))
}

tasks.withType<Test> {
Expand Down
8 changes: 7 additions & 1 deletion app/src/main/java/ru/yeahub/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ import ru.yeahub.example_details.impl.detailsFeatureModule
import ru.yeahub.example_home.impl.data.di.questionsMainFeatureModule
import ru.yeahub.example_profile.impl.profileFeatureModule
import ru.yeahub.feature_toggle_impl.di.featureToggleModule
import ru.yeahub.interview_trainer.impl.createQuiz.di.createQuizModule
import ru.yeahub.interview_trainer.impl.interviewQuiz.di.interviewQuizModule
import ru.yeahub.interview_trainer.impl.interviewQuizResult.di.interviewQuizResultModule
import ru.yeahub.navigation_impl.navigationPathModule
import ru.yeahub.network_impl.networkModule
import ru.yeahub.public_collections.impl.di.CollectionsFeatureModule
Expand Down Expand Up @@ -55,7 +58,10 @@ class Application : Application() {
CollectionsFeatureModule,
detailQuestionFeatureModule,
collectionsAndQuestionsFeatureModule,
specializationFeatureModule
specializationFeatureModule,
createQuizModule,
interviewQuizModule,
interviewQuizResultModule
)
}
// проверка, что модули загружены
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,12 @@ object FeatureRoute {
object PublicCollectionsFeature {
const val FEATURE_NAME = "public_collections"
}

object InterviewTrainerFeature {
const val FEATURE_NAME = "interview_trainer"

const val CREATE_QUIZ_SCREEN_NAME = "create_quiz"
const val INTERVIEW_QUIZ_SCREEN_NAME = "interview_quiz"
const val INTERVIEW_QUIZ_RESULT_SCREEN_NAME = "interview_quiz_result"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ru.yeahub.network_api

import ru.yeahub.network_api.models.GetCollectionsResponse
import ru.yeahub.network_api.models.GetFeatureFlagsResponse
import ru.yeahub.network_api.models.GetNewMockQuizResponse
import ru.yeahub.network_api.models.GetPublicQuestionResponse
import ru.yeahub.network_api.models.GetPublicQuestionsResponse
import ru.yeahub.network_api.models.GetSkillsResponse
Expand Down Expand Up @@ -61,4 +62,12 @@ interface ApiService {
specializationsId: Long,
isFree: Boolean
): GetCollectionsResponse

suspend fun getQuizMockQuestions(
skills: List<String>?,
complexity: List<Int>?,
collection: Int?,
limit: Int?,
specialization: Int,
): GetNewMockQuizResponse
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.yeahub.network_api.models

data class GetNewMockQuizResponse(
val id: String,
val startDate: String,
val fullCount: Int,
val skills: List<String>,
val response: QuizAnswersWrapperDto,
val questions: List<GetQuestionResponse>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.yeahub.network_api.models

data class QuestionAnswerDto(
val questionId: Long,
val questionTitle: String,
val answer: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.yeahub.network_api.models

data class QuizAnswersWrapperDto(
val answers: List<QuestionAnswerDto>
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import retrofit2.http.Query
import ru.yeahub.network_api.ApiService
import ru.yeahub.network_api.models.GetCollectionsResponse
import ru.yeahub.network_api.models.GetFeatureFlagsResponse
import ru.yeahub.network_api.models.GetNewMockQuizResponse
import ru.yeahub.network_api.models.GetPublicQuestionResponse
import ru.yeahub.network_api.models.GetPublicQuestionsResponse
import ru.yeahub.network_api.models.GetSkillsResponse
Expand Down Expand Up @@ -72,4 +73,13 @@ interface RetrofitApiService : ApiService {
@Query("roleIds") roleIds: List<Long>?,
@Query("clientType") clientType: String
): GetFeatureFlagsResponse

@GET("interview-preparation/quizzes/mock/new")
override suspend fun getQuizMockQuestions(
@Query("skills") skills: List<String>?,
@Query("complexity") complexity: List<Int>?,
@Query("collection") collection: Int?,
@Query("limit") limit: Int?,
@Query("specialization") specialization: Int,
): GetNewMockQuizResponse
}
4 changes: 4 additions & 0 deletions core/ui/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ dependencies {
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.material3)
implementation(libs.androidx.runtime.android)
implementation(libs.androidx.icons)

implementation(libs.koin.core)
implementation(libs.koin.compose)

implementation(libs.coil.compose)
implementation(libs.jsoup)
Expand Down
151 changes: 151 additions & 0 deletions core/ui/src/main/java/ru/yeahub/core_ui/component/QuizAnswerButton.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package ru.yeahub.core_ui.component

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import ru.yeahub.core_ui.example.staticPreview.StaticPreview
import ru.yeahub.core_ui.theme.Theme
import ru.yeahub.core_utils.common.TextOrResource
import ru.yeahub.ui.R

private val FIGMA_LOW_PADDING = 8.dp
private val FIGMA_RADIUS = 12.dp

@Composable
fun KnownAnswerButton(
enabled: Boolean,
isHighlighted: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier
) {
QuizAnswerButton(
iconRes = R.drawable.thumbs_up_icon,
text = TextOrResource.Resource(R.string.quiz_answer_known),
enabled = enabled,
isHighlighted = isHighlighted,
onClick = onClick,
modifier = modifier
)
}

@Composable
fun UnknownAnswerButton(
enabled: Boolean,
isHighlighted: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier
) {
QuizAnswerButton(
iconRes = R.drawable.thumbs_down_icon,
text = TextOrResource.Resource(R.string.quiz_answer_unknown),
enabled = enabled,
isHighlighted = isHighlighted,
onClick = onClick,
modifier = modifier
)
}

@Composable
private fun QuizAnswerButton(
iconRes: Int,
text: TextOrResource,
enabled: Boolean,
isHighlighted: Boolean,
onClick: () -> Unit,
modifier: Modifier = Modifier
) {
val context = LocalContext.current

val contentColor = if (isHighlighted) {
Theme.colors.purple700
} else {
Theme.colors.black700
}

Button(
onClick = onClick,
modifier = modifier
.width(120.dp)
.height(48.dp),
shape = RoundedCornerShape(FIGMA_RADIUS),
colors = ButtonDefaults.buttonColors(
containerColor = Theme.colors.black10,
contentColor = contentColor,
disabledContainerColor = Theme.colors.black10,
disabledContentColor = contentColor
),
contentPadding = PaddingValues(
horizontal = 12.dp,
vertical = FIGMA_LOW_PADDING
),
enabled = enabled
) {
Icon(
painter = painterResource(iconRes),
contentDescription = null,
modifier = Modifier.padding(end = FIGMA_LOW_PADDING)
)
Text(
text = when (text) {
is TextOrResource.Text -> text.text
is TextOrResource.Resource -> text.getString(context)
},
style = Theme.typography.body2
)
}
}

@StaticPreview
@Composable
fun KnownAnswerHighlightedButtonPreview() {
KnownAnswerButton(
enabled = true,
isHighlighted = true,
onClick = {},
modifier = Modifier
)
}

@StaticPreview
@Composable
fun KnownAnswerButtonPreview() {
KnownAnswerButton(
enabled = true,
isHighlighted = false,
onClick = {},
modifier = Modifier
)
}

@StaticPreview
@Composable
fun UnknownAnswerHighlightedButtonPreview() {
UnknownAnswerButton(
enabled = true,
isHighlighted = true,
onClick = {},
modifier = Modifier
)
}

@StaticPreview
@Composable
fun UnknownAnswerButtonPreview() {
UnknownAnswerButton(
enabled = true,
isHighlighted = true,
onClick = {},
modifier = Modifier
)
}
Loading
Loading