Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This workflow will build a Kotlin project with Gradle and cache/restore any dependencies to improve the workflow execution time

name: Test FlowForms core - jvm
name: Build & Test FlowForms Core

# Runs on every push to main and every pull request to main
on:
Expand All @@ -26,6 +26,6 @@ jobs:
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Build and test FF Core - jvm with Gradle
run: ./gradlew FlowForms-Core:jvmTest
- name: Gradle check task - Build and Test FlowForms-Core
run: ./gradlew FlowForms-Core:check

Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@ package com.rootstrap.flowforms.example

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.doAfterTextChanged
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.rootstrap.flowforms.core.common.StatusCodes.CORRECT
import com.rootstrap.flowforms.core.common.StatusCodes.UNMODIFIED
import com.rootstrap.flowforms.core.field.FieldStatus
import com.rootstrap.flowforms.core.form.FormStatus
import com.rootstrap.flowforms.example.SignUpFormModel.Companion.CONFIRMATION
import com.rootstrap.flowforms.example.SignUpFormModel.Companion.CONFIRM_PASSWORD
import com.rootstrap.flowforms.example.SignUpFormModel.Companion.EMAIL
Expand All @@ -19,12 +18,12 @@ import com.rootstrap.flowforms.example.databinding.ActivityMainBinding
import com.rootstrap.flowforms.example.validations.ValidEmail.Companion.INVALID_EMAIL
import com.rootstrap.flowforms.example.validations.ValidEmail.Companion.MIN_LENGTH_UNSATISFIED
import com.rootstrap.flowforms.example.validations.ValidEmail.Companion.PASSWORD_MATCH_UNSATISFIED
import kotlinx.coroutines.launch

import com.rootstrap.flowforms.util.bind
import com.rootstrap.flowforms.util.repeatOnLifeCycleScope

class MainActivity : AppCompatActivity() {

lateinit var viewModel: SignUpViewModel
private lateinit var viewModel: SignUpViewModel
private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -35,96 +34,73 @@ class MainActivity : AppCompatActivity() {
binding.lifecycleOwner = this
binding.formModel = viewModel.formModel

lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
viewModel.form.fields.collect {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
it[NAME]?.status?.collect { status ->
when (status.code) {
CORRECT, UNMODIFIED -> binding.nameInputLayout.error = null
else -> binding.nameInputLayout.error = getString(R.string.required_field)
}
}
}
launch {
it[EMAIL]?.status?.collect { status ->
when (status.code) {
CORRECT, UNMODIFIED -> binding.emailInputLayout.error = null
INVALID_EMAIL -> binding.emailInputLayout.error = getString(R.string.invalid_email)
else -> binding.emailInputLayout.error = getString(R.string.required_field)
}
}
}
launch {
it[NEW_PASSWORD]?.status?.collect { status ->
when (status.code) {
CORRECT, UNMODIFIED -> binding.passwordInputLayout.error = null
MIN_LENGTH_UNSATISFIED -> binding.passwordInputLayout.error = getString(R.string.min_length, MIN_PASSWORD_LENGTH)
else -> binding.passwordInputLayout.error = getString(R.string.required_field)
}
}
}
launch {
it[CONFIRM_PASSWORD]?.status?.collect { status ->
when (status.code) {
CORRECT, UNMODIFIED -> binding.confirmPasswordInputLayout.error = null
MIN_LENGTH_UNSATISFIED -> binding.confirmPasswordInputLayout.error = getString(R.string.min_length, MIN_PASSWORD_LENGTH)
PASSWORD_MATCH_UNSATISFIED -> binding.confirmPasswordInputLayout.error = getString(R.string.password_match)
else -> binding.confirmPasswordInputLayout.error = getString(R.string.required_field)
}
}
}
}
}
}
}
listenStatusChanges()
bindFields()
}

launch {
viewModel.form.status.collect { status ->
when (status.code) {
CORRECT -> {
binding.continueButton.isEnabled = true
}
else -> {
binding.continueButton.isEnabled = false
}
}
}
}
}
private fun listenStatusChanges() {
viewModel.form.fields.value.let {
repeatOnLifeCycleScope(
{ it[NAME]?.status?.collect(::onNameStatusChange) },
{ it[EMAIL]?.status?.collect(::onEmailStatusChange) },
{ it[NEW_PASSWORD]?.status?.collect(::onPasswordStatusChange) },
{ it[CONFIRM_PASSWORD]?.status?.collect(::onConfirmPasswordChange) },
{ viewModel.form.status.collect(::onFormStatusChange) }
)
}
}

binding.nameInputEditText.doAfterTextChanged {
lifecycleScope.launch {
viewModel.form.validateOnValueChange(NAME)
}
private fun bindFields() {
binding.apply {
viewModel.form.bind(lifecycleScope,
nameInputEditText to NAME,
emailInputEditText to EMAIL,
passwordInputEditText to NEW_PASSWORD,
confirmPasswordInputEditText to CONFIRM_PASSWORD
)
viewModel.form.bind(this@MainActivity, lifecycleScope,
viewModel.formModel.confirm to CONFIRMATION
)
}
}

binding.emailInputEditText.doAfterTextChanged {
lifecycleScope.launch {
viewModel.form.validateOnValueChange(EMAIL)
}
private fun onNameStatusChange(status: FieldStatus) {
when (status.code) {
CORRECT, UNMODIFIED -> binding.nameInputLayout.error = null
else -> binding.nameInputLayout.error = getString(R.string.required_field)
}
}

binding.passwordInputEditText.doAfterTextChanged {
lifecycleScope.launch {
viewModel.form.validateOnValueChange(NEW_PASSWORD)
}
private fun onEmailStatusChange(status: FieldStatus) {
when (status.code) {
CORRECT, UNMODIFIED -> binding.emailInputLayout.error = null
INVALID_EMAIL -> binding.emailInputLayout.error = getString(R.string.invalid_email)
else -> binding.emailInputLayout.error = getString(R.string.required_field)
}
}

binding.confirmPasswordInputEditText.doAfterTextChanged {
lifecycleScope.launch {
viewModel.form.validateOnValueChange(CONFIRM_PASSWORD)
}
private fun onPasswordStatusChange(status: FieldStatus) {
when (status.code) {
CORRECT, UNMODIFIED -> binding.passwordInputLayout.error = null
MIN_LENGTH_UNSATISFIED -> binding.passwordInputLayout.error = getString(R.string.min_length, MIN_PASSWORD_LENGTH)
else -> binding.passwordInputLayout.error = getString(R.string.required_field)
}
}

viewModel.formModel.confirm.observe(this) {
lifecycleScope.launch {
viewModel.form.validateOnValueChange(CONFIRMATION)
}
private fun onConfirmPasswordChange(status: FieldStatus) {
when (status.code) {
CORRECT, UNMODIFIED -> binding.confirmPasswordInputLayout.error = null
MIN_LENGTH_UNSATISFIED -> binding.confirmPasswordInputLayout.error = getString(R.string.min_length, MIN_PASSWORD_LENGTH)
PASSWORD_MATCH_UNSATISFIED -> binding.confirmPasswordInputLayout.error = getString(R.string.password_match)
else -> binding.confirmPasswordInputLayout.error = getString(R.string.required_field)
}
}

private fun onFormStatusChange(status: FormStatus) {
when (status.code) {
CORRECT -> binding.continueButton.isEnabled = true
else -> binding.continueButton.isEnabled = false
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,17 @@ import com.rootstrap.flowforms.example.SignUpFormModel.Companion.EMAIL
import com.rootstrap.flowforms.example.SignUpFormModel.Companion.MIN_PASSWORD_LENGTH
import com.rootstrap.flowforms.example.SignUpFormModel.Companion.NAME
import com.rootstrap.flowforms.example.SignUpFormModel.Companion.NEW_PASSWORD
import com.rootstrap.flowforms.example.validations.MinLength
import com.rootstrap.flowforms.example.validations.Match
import com.rootstrap.flowforms.example.validations.MinLength
import com.rootstrap.flowforms.example.validations.RequiredTrue
import com.rootstrap.flowforms.example.validations.ValidEmail

class SignUpViewModel : ViewModel() {

val formModel = SignUpFormModel()

val form = FlowForm().withFields(
// TODO : Add async validation example
val form = FlowForm().setFields(
FlowField(NAME, listOf(Required { formModel.name })),
FlowField(EMAIL, listOf(Required { formModel.email }, ValidEmail { formModel.email })),
FlowField(NEW_PASSWORD, listOf(
Expand Down
1 change: 0 additions & 1 deletion FlowForms-Android-Ext/.gitignore

This file was deleted.

53 changes: 0 additions & 53 deletions FlowForms-Android-Ext/build.gradle.kts

This file was deleted.

1 change: 0 additions & 1 deletion FlowForms-Android-Ext/consumer-rules.pro

This file was deleted.

21 changes: 0 additions & 21 deletions FlowForms-Android-Ext/proguard-rules.pro

This file was deleted.

5 changes: 0 additions & 5 deletions FlowForms-Android-Ext/src/main/AndroidManifest.xml

This file was deleted.

This file was deleted.

6 changes: 5 additions & 1 deletion FlowForms-Core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ kotlin {
}
val jvmMain by getting
val jvmTest by getting
val androidMain by getting
val androidMain by getting {
dependencies {
implementations(Dependencies.flowFormsAndroidLibraries)
}
}
val androidTest by getting
}
}
Expand Down
Loading