-
Notifications
You must be signed in to change notification settings - Fork 1
[Публичный тренажер] ANDR-58: Первый этап InterviewQuizScreen. Полная верстка экранов #97
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
Deyryl
wants to merge
129
commits into
epic/ANDR-52
Choose a base branch
from
feature/ANDR-55
base: epic/ANDR-52
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
129 commits
Select commit
Hold shift + click to select a range
cd737ef
Создан модуль Interview_Trainer
PanMobile 95a8631
Моделирование состояний первого экрана интервью тренажера - CreateQuiz
PanMobile 742d39e
Добавление необходимых ресурсов для верстки первого экрана экрана Cre…
PanMobile efed7b2
Добавление базовых классов фичи
PanMobile 68e7927
Базовая верстка первого экрана CreateQuizScreen.kt
PanMobile 7acdad3
Добавление объекта интервью тренажера в пути фич для будущей навигации
PanMobile a49296b
ANDR-5: VoSpecialization перенесен внутри Loaded
PanMobile 0a2cec3
ANDR-5: SkillButton.kt компонент изменен. Убрана полная заливка кнопк…
PanMobile 54d700b
ANDR-5: Добавлены дополнительные строковые ресурсы для возможных ошибок
PanMobile f8b2d96
ANDR-5: Создание превью и правки по отступам
PanMobile b96cd8a
ANDR-5: Экран загрузки CreateQuiz
PanMobile 00394a1
ANDR-5: Использование экрана загрузки в главном для @StaticPreview
PanMobile 1499028
ANDR-5: Удалены неиспользуемые строки ошибок
PanMobile 2ed9317
ANDR-5: Убран лишний класс параметров. В StaticPreview передаем сразу…
PanMobile 1a8ac42
ANDR-5: Убрана преписка Mock у @Composable
PanMobile 8eb8ae0
ANDR-5: id стало Long по аналогии с другими классами
PanMobile 3e69cfa
ANDR-5: Command'ы и Result'ы убраны из папки intents. Сама папка удалена
PanMobile 1fef1a4
ANDR-5: Создан интерфейс юзкейса
PanMobile 635231a
ANDR-5: Созданы Domain модели
PanMobile 0392640
ANDR-5: ВьюМоделька экрана CreateQuiz. Сделана не до конца
PanMobile 04978c4
ANDR-5: Изменение кол-ва вопросов через данные у ивента
PanMobile 6d1237f
ANDR-5: изменил путь файла
PanMobile 1eaa176
ANDR-5: Изменение кода экрана. Настроено правильное прокидывание лямб…
PanMobile 1eb6051
ANDR-5: Сделано Динамическое превью
PanMobile 41f25a7
ANDR-5: убраны default параметры
PanMobile a4396ca
ANDR-5: убраны лишние классы
PanMobile 59e9c7f
ANDR-5: Создан маппер
PanMobile 0d7468d
ANDR-5: имплементирован маппер и отдельный флоу ввода пользователя дл…
PanMobile df6d2ad
ANDR-5: сделано рабочее динамик превью
PanMobile 34863b1
ANDR-5: убран default диспатчер при обновлении ввода пользователя
PanMobile 0c5b94b
ANDR-5: убраны параметры по умолчанию в верстке
PanMobile 8674fae
ANDR-55 добавлен экран тренировки и класс состояний тренировки
Deyryl 67535fc
Моделирование состояний первого экрана интервью тренажера - CreateQuiz
PanMobile f3f6b8c
Добавление необходимых ресурсов для верстки первого экрана экрана Cre…
PanMobile 87b922d
ANDR-5: VoSpecialization перенесен внутри Loaded
PanMobile f66fd53
ANDR-5: Command'ы и Result'ы убраны из папки intents. Сама папка удалена
PanMobile 028cf6c
ANDR-5: Создан интерфейс юзкейса
PanMobile 81811e8
ANDR-5: Созданы Domain модели
PanMobile 331dc21
ANDR-5: убраны лишние классы
PanMobile f6559d6
ANDR-55 добавлен экран тренировки и класс состояний тренировки
Deyryl 20fa947
ANDR-55: добавление иконок
Deyryl 7092807
ANDR-55: верстка экрана, добавление в QuizState enum class, создание …
Deyryl 75d0b2a
Merge remote-tracking branch 'origin/feature/ANDR-55' into feature/AN…
Deyryl 0b1a33d
ANDR-55: добавление строк для экрана тренажера
Deyryl 2525793
ANDR-55: добавление LoadingScreen
Deyryl 4cd3c41
ANDR-55: добавление Command, Event, ScreenMapper, State
Deyryl f715c43
ANDR-55: обновление string ресурсов
Deyryl 32835c5
ANDR-55: создание и написание ViewModel
Deyryl 27bd39f
ANDR-55: окончательная верстка. Создание динамического превью. Добавл…
Deyryl 137c676
ANDR-55: увеличение длины ответа для данных превью
Deyryl e332c17
ANDR-55: рефакторинг. Кнопка Проверить результат м.б. неактивной
Deyryl 16f211a
Моделирование состояний первого экрана интервью тренажера - CreateQuiz
PanMobile 2b6f741
Добавление необходимых ресурсов для верстки первого экрана экрана Cre…
PanMobile 899e4e4
ANDR-5: VoSpecialization перенесен внутри Loaded
PanMobile b2b790a
ANDR-5: Command'ы и Result'ы убраны из папки intents. Сама папка удалена
PanMobile bda2c30
ANDR-5: Создан интерфейс юзкейса
PanMobile a2f427e
ANDR-5: убраны лишние классы
PanMobile f16904f
ANDR-55 добавлен экран тренировки и класс состояний тренировки
Deyryl bb86320
ANDR-55: добавление иконок
Deyryl c1e303a
ANDR-55: верстка экрана, добавление в QuizState enum class, создание …
Deyryl 32c8def
Моделирование состояний первого экрана интервью тренажера - CreateQuiz
PanMobile bb9cd66
Добавление необходимых ресурсов для верстки первого экрана экрана Cre…
PanMobile 4e9b78b
ANDR-5: VoSpecialization перенесен внутри Loaded
PanMobile 7d9ad90
ANDR-5: Command'ы и Result'ы убраны из папки intents. Сама папка удалена
PanMobile 016a98a
ANDR-5: Создан интерфейс юзкейса
PanMobile 9be8a3a
ANDR-5: убраны лишние классы
PanMobile 1c37828
ANDR-55: добавление строк для экрана тренажера
Deyryl 1729b9e
ANDR-55: добавление LoadingScreen
Deyryl fe13bee
ANDR-55: добавление Command, Event, ScreenMapper, State
Deyryl bb326f0
ANDR-55: обновление string ресурсов
Deyryl f2feafa
ANDR-55: создание и написание ViewModel
Deyryl 0083995
ANDR-55: окончательная верстка. Создание динамического превью. Добавл…
Deyryl 1f2604c
ANDR-55: увеличение длины ответа для данных превью
Deyryl e43851a
ANDR-55: рефакторинг. Кнопка Проверить результат м.б. неактивной
Deyryl 63eca4f
ANDR-55: удаление превью из LoadingScreen
Deyryl f0b99aa
Merge remote-tracking branch 'origin/feature/ANDR-55' into feature/AN…
Deyryl 77c6568
ANDR-58: из Command и Event наследники заменены на ToDo
Deyryl 6d61ef1
ANDR-58: рефакторинг QuizScreen и QuizScreenLoading
Deyryl 25b604d
[ANDR-83] Дополнения по Compose (#103)
PanMobile 35b92b2
ANDR-48: Authentication — модули api/impl и экран регистрации (#104)
xMODDIIx 52e9d68
ANDR-5: Инициализация фичи Interview Trainer и верстка первого экрана…
PanMobile e472c82
ANDR-5: CreateQuiz второй этап. Data + Domain (#95)
PanMobile f466087
[ANDR-54] ANDR-70: Третий этап CreateQuizScreen. Логика + Тесты (#100)
PanMobile ab5d30f
Моделирование состояний первого экрана интервью тренажера - CreateQuiz
PanMobile 69669e1
Добавление необходимых ресурсов для верстки первого экрана экрана Cre…
PanMobile c4124c7
ANDR-5: VoSpecialization перенесен внутри Loaded
PanMobile 360a2e4
ANDR-5: Command'ы и Result'ы убраны из папки intents. Сама папка удалена
PanMobile 5255e7a
ANDR-5: Создан интерфейс юзкейса
PanMobile 8ad8d5e
ANDR-5: убраны лишние классы
PanMobile e8ad011
ANDR-55 добавлен экран тренировки и класс состояний тренировки
Deyryl 1f26151
ANDR-55: добавление иконок
Deyryl 64ca47c
ANDR-55: верстка экрана, добавление в QuizState enum class, создание …
Deyryl 18225aa
Моделирование состояний первого экрана интервью тренажера - CreateQuiz
PanMobile ee451b8
Добавление необходимых ресурсов для верстки первого экрана экрана Cre…
PanMobile 52d2437
ANDR-5: VoSpecialization перенесен внутри Loaded
PanMobile caebd34
ANDR-5: Command'ы и Result'ы убраны из папки intents. Сама папка удалена
PanMobile 256f2ff
ANDR-5: Создан интерфейс юзкейса
PanMobile 1a9ed51
ANDR-5: убраны лишние классы
PanMobile 7db2f87
ANDR-55: добавление строк для экрана тренажера
Deyryl 12cf082
ANDR-55: добавление LoadingScreen
Deyryl fe72f9e
ANDR-55: добавление Command, Event, ScreenMapper, State
Deyryl eb974ba
ANDR-55: обновление string ресурсов
Deyryl 5c32c50
ANDR-55: создание и написание ViewModel
Deyryl b50a548
ANDR-55: окончательная верстка. Создание динамического превью. Добавл…
Deyryl ced00b6
ANDR-55: увеличение длины ответа для данных превью
Deyryl 03de904
ANDR-55: рефакторинг. Кнопка Проверить результат м.б. неактивной
Deyryl 0f5bf66
ANDR-55: удаление превью из LoadingScreen
Deyryl 85fcd30
Моделирование состояний первого экрана интервью тренажера - CreateQuiz
PanMobile b9ebe7c
Добавление необходимых ресурсов для верстки первого экрана экрана Cre…
PanMobile dea8624
ANDR-5: VoSpecialization перенесен внутри Loaded
PanMobile c32ff79
ANDR-5: Command'ы и Result'ы убраны из папки intents. Сама папка удалена
PanMobile cd6fc0f
ANDR-5: Создан интерфейс юзкейса
PanMobile df44608
ANDR-5: убраны лишние классы
PanMobile 9f0260b
Моделирование состояний первого экрана интервью тренажера - CreateQuiz
PanMobile 084f366
Добавление необходимых ресурсов для верстки первого экрана экрана Cre…
PanMobile 1580396
ANDR-5: VoSpecialization перенесен внутри Loaded
PanMobile 408977c
ANDR-5: Command'ы и Result'ы убраны из папки intents. Сама папка удалена
PanMobile 191d08d
ANDR-5: Создан интерфейс юзкейса
PanMobile 0ebcde6
ANDR-5: убраны лишние классы
PanMobile eede3d3
ANDR-58: из Command и Event наследники заменены на ToDo
Deyryl 34ecf16
ANDR-58: рефакторинг QuizScreen и QuizScreenLoading
Deyryl b6ae94a
Merge remote-tracking branch 'origin/feature/ANDR-55' into feature/AN…
Deyryl 54ac7fe
ANDR-58: подключение immutable библиотеки
Deyryl bb7a39b
ANDR-58: В стейте Loaded изменение коллекций на Persistent
Deyryl af560a4
ANDR-58: изменение под Persistent коллекции стейта
Deyryl 528c17d
ANDR-58: добавление static preview
Deyryl 29a2e2e
ANDR-58: убраны лишние файлы для epic
Deyryl 76db7e5
ANDR-58: убраны лишние строки для epic
Deyryl 8a0f7e9
ANDR-58: удаление лишнего изменения settings.gradle.kts
Deyryl File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 6 additions & 0 deletions
6
.../java/ru/yeahub/interview_trainer/impl/interviewQuiz/presentation/InterviewQuizCommand.kt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| package ru.yeahub.interview_trainer.impl.interviewQuiz.presentation | ||
|
|
||
| sealed interface InterviewQuizCommand { | ||
|
|
||
| data object ToDo : InterviewQuizCommand | ||
| } |
6 changes: 6 additions & 0 deletions
6
...in/java/ru/yeahub/interview_trainer/impl/interviewQuiz/presentation/InterviewQuizEvent.kt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| package ru.yeahub.interview_trainer.impl.interviewQuiz.presentation | ||
|
|
||
| sealed interface InterviewQuizEvent { | ||
|
|
||
| data object ToDo : InterviewQuizEvent | ||
| } |
39 changes: 39 additions & 0 deletions
39
.../ru/yeahub/interview_trainer/impl/interviewQuiz/presentation/InterviewQuizScreenMapper.kt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| package ru.yeahub.interview_trainer.impl.interviewQuiz.presentation | ||
|
|
||
| import kotlinx.collections.immutable.PersistentList | ||
| import kotlinx.collections.immutable.PersistentMap | ||
|
|
||
| class InterviewQuizScreenMapper { | ||
|
|
||
| fun getScreenState( | ||
| questions: PersistentList<InterviewQuizState.Loaded.VoQuestion>, | ||
| questionIndex: Int, | ||
| isAnswerVisible: Boolean, | ||
| answers: PersistentMap<Long, InterviewQuizState.Loaded.QuizAnswer>, | ||
| selectedAnswer: InterviewQuizState.Loaded.QuizAnswer | ||
| ): InterviewQuizState { | ||
| val canGoNext = answers.containsKey(questions[questionIndex].id) && | ||
| questionIndex != questions.lastIndex | ||
|
|
||
| val canGoPrev = questionIndex > 0 | ||
|
|
||
| val question = questions[questionIndex] | ||
|
|
||
| val questionsCount = questions.size | ||
|
|
||
| val isLastQuestion = questionIndex != questions.lastIndex | ||
|
|
||
| return InterviewQuizState.Loaded( | ||
| questions = questions, | ||
| questionsCount = questionsCount, | ||
| questionIndex = questionIndex, | ||
| question = question, | ||
| isAnswerVisible = isAnswerVisible, | ||
| answers = answers, | ||
| canGoNext = canGoNext, | ||
| canGoPrev = canGoPrev, | ||
| selectedAnswer = selectedAnswer, | ||
| isLastQuestion = isLastQuestion | ||
| ) | ||
| } | ||
| } |
37 changes: 37 additions & 0 deletions
37
...in/java/ru/yeahub/interview_trainer/impl/interviewQuiz/presentation/InterviewQuizState.kt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| package ru.yeahub.interview_trainer.impl.interviewQuiz.presentation | ||
|
|
||
| import androidx.compose.runtime.Immutable | ||
| import kotlinx.collections.immutable.PersistentList | ||
| import kotlinx.collections.immutable.PersistentMap | ||
|
|
||
| sealed interface InterviewQuizState { | ||
|
|
||
| /** Изначальное состояние */ | ||
| data object Loading : InterviewQuizState | ||
|
|
||
| @Immutable | ||
| data class Loaded( | ||
| val questions: PersistentList<VoQuestion>, | ||
| val questionsCount: Int, | ||
| val questionIndex: Int, | ||
| val question: VoQuestion, | ||
| val isAnswerVisible: Boolean, | ||
| val answers: PersistentMap<Long, QuizAnswer>, | ||
| val canGoPrev: Boolean, | ||
| val canGoNext: Boolean, | ||
| val selectedAnswer: QuizAnswer, | ||
| val isLastQuestion: Boolean | ||
| ) : InterviewQuizState { | ||
|
|
||
| enum class QuizAnswer { KNOWN, UNKNOWN, NONE } | ||
|
|
||
| @Immutable | ||
| data class VoQuestion( | ||
| val id: Long, | ||
| val title: String, | ||
| val shortAnswer: String | ||
| ) | ||
| } | ||
|
|
||
| data class Error(val throwable: Throwable) : InterviewQuizState | ||
| } |
91 changes: 91 additions & 0 deletions
91
...ava/ru/yeahub/interview_trainer/impl/interviewQuiz/presentation/InterviewQuizViewModel.kt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,91 @@ | ||
| package ru.yeahub.interview_trainer.impl.interviewQuiz.presentation | ||
|
|
||
| import kotlinx.collections.immutable.PersistentList | ||
| import kotlinx.collections.immutable.PersistentMap | ||
| import kotlinx.collections.immutable.persistentMapOf | ||
| import kotlinx.collections.immutable.toPersistentList | ||
| import kotlinx.coroutines.flow.MutableSharedFlow | ||
| import kotlinx.coroutines.flow.MutableStateFlow | ||
| import kotlinx.coroutines.flow.SharingStarted | ||
| import kotlinx.coroutines.flow.asSharedFlow | ||
| import kotlinx.coroutines.flow.map | ||
| import kotlinx.coroutines.flow.stateIn | ||
| import ru.yeahub.core_utils.BaseViewModel | ||
| import ru.yeahub.interview_trainer.impl.interviewQuiz.presentation.InterviewQuizState.Loaded.QuizAnswer | ||
| import ru.yeahub.interview_trainer.impl.interviewQuiz.presentation.InterviewQuizState.Loaded.VoQuestion | ||
|
|
||
| open class InterviewQuizViewModel( | ||
| private val screenMapper: InterviewQuizScreenMapper | ||
| ) : BaseViewModel() { | ||
|
|
||
| // Вопросы для превью. Временно | ||
| private val previewQuestions by lazy { | ||
| previewQuestions() | ||
| } | ||
|
|
||
| private val userInputState = MutableStateFlow( | ||
| UserInput( | ||
| isAnswerVisible = false, | ||
| answers = persistentMapOf(), | ||
| selectedAnswer = QuizAnswer.NONE | ||
| ) | ||
| ) | ||
|
|
||
| val screenState = userInputState | ||
| .map { userInput -> | ||
| screenMapper.getScreenState( | ||
| questions = previewQuestions, | ||
| questionIndex = FIRST_QUESTION_INDEX, | ||
| isAnswerVisible = userInput.isAnswerVisible, | ||
| answers = userInput.answers, | ||
| selectedAnswer = userInput.selectedAnswer | ||
| ) | ||
| }.stateIn( | ||
| scope = viewModelScopeSafe, | ||
| started = SharingStarted.WhileSubscribed(TIME_TO_CLEAN_UP_RESOURCES), | ||
| initialValue = InterviewQuizState.Loading | ||
| ) | ||
|
|
||
| private val _commands = MutableSharedFlow<InterviewQuizCommand>() | ||
| val commands = _commands.asSharedFlow() | ||
|
|
||
| fun onEvent(event: InterviewQuizEvent) { | ||
| when (event) { | ||
| InterviewQuizEvent.ToDo -> { /* TODO */ } | ||
| } | ||
| } | ||
|
|
||
| /** Создание списка вопросов для тестирования превью */ | ||
| @Suppress("MagicNumber") | ||
| private fun previewQuestions(): PersistentList<VoQuestion> { | ||
| val shortAnswer = "Виртуальный DOM (VDOM) — это легковесное " + | ||
| "представление реального DOM в памяти, которое используется в " + | ||
| "JavaScript-библиотеках, таких как React и Vue, " + | ||
| "для повышения производительности веб-приложений." | ||
|
|
||
| val base = VoQuestion( | ||
| id = 0, | ||
| title = "Что такое Virtual DOM, и как он работает?", | ||
| shortAnswer = shortAnswer | ||
| ) | ||
| val questions = mutableListOf<VoQuestion>() | ||
| repeat(10) { index -> | ||
| questions.add(base.copy(id = index.toLong())) | ||
| } | ||
|
|
||
| return questions.toPersistentList() | ||
| } | ||
|
|
||
| private data class UserInput( | ||
| val isAnswerVisible: Boolean, | ||
| val answers: PersistentMap<Long, QuizAnswer>, | ||
| val selectedAnswer: QuizAnswer | ||
| ) | ||
|
|
||
| companion object { | ||
|
|
||
| private const val TIME_TO_CLEAN_UP_RESOURCES = 5000L | ||
|
|
||
| private const val FIRST_QUESTION_INDEX = 0 | ||
| } | ||
| } | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.