diff --git a/app/core/core-common-public/src/androidMain/kotlin/com/hedvig/core/common/android/validation/ValidateEmail.kt b/app/core/core-common-public/src/androidMain/kotlin/com/hedvig/core/common/android/validation/ValidateEmail.kt index bc9e79c9af..eb64a2733b 100644 --- a/app/core/core-common-public/src/androidMain/kotlin/com/hedvig/core/common/android/validation/ValidateEmail.kt +++ b/app/core/core-common-public/src/androidMain/kotlin/com/hedvig/core/common/android/validation/ValidateEmail.kt @@ -11,6 +11,6 @@ fun validateEmail(email: CharSequence): ValidationResult { } } -fun isValidEmail(email: String): Boolean { +actual fun isValidEmail(email: String): Boolean { return email.isNotBlank() && PatternsCompat.EMAIL_ADDRESS.matcher(email).matches() } diff --git a/app/core/core-common-public/src/commonMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.kt b/app/core/core-common-public/src/commonMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.kt new file mode 100644 index 0000000000..0977718768 --- /dev/null +++ b/app/core/core-common-public/src/commonMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.kt @@ -0,0 +1,16 @@ +package com.hedvig.core.common.android.validation + +expect fun isValidEmail(email: String): Boolean + +/** + * The pattern of `androidx.core.util.PatternsCompat.EMAIL_ADDRESS`, so targets without androidx.core + * accept exactly the same addresses as Android. + */ +internal const val EMAIL_ADDRESS_PATTERN: String = + "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + + "\\@" + + "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + + "(" + + "\\." + + "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" + + ")+" diff --git a/app/core/core-common-public/src/commonTest/kotlin/com/hedvig/core/common/android/validation/IsValidEmailTest.kt b/app/core/core-common-public/src/commonTest/kotlin/com/hedvig/core/common/android/validation/IsValidEmailTest.kt new file mode 100644 index 0000000000..f5525878fd --- /dev/null +++ b/app/core/core-common-public/src/commonTest/kotlin/com/hedvig/core/common/android/validation/IsValidEmailTest.kt @@ -0,0 +1,37 @@ +package com.hedvig.core.common.android.validation + +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class IsValidEmailTest { + @Test + fun acceptsValidEmails() { + listOf( + "a@b.co", + "first.last@example.com", + "user+tag@sub.example.org", + "USER_1%x-y@example-domain.se", + ).forEach { email -> + assertTrue(isValidEmail(email), "Expected \"$email\" to be valid") + } + } + + @Test + fun rejectsInvalidEmails() { + listOf( + "", + " ", + "plainaddress", + "@example.com", + "user@", + "user@example", + "user name@example.com", + " user@example.com", + "user@example.com ", + "user@@example.com", + ).forEach { email -> + assertFalse(isValidEmail(email), "Expected \"$email\" to be invalid") + } + } +} diff --git a/app/core/core-common-public/src/jvmMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.jvm.kt b/app/core/core-common-public/src/jvmMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.jvm.kt new file mode 100644 index 0000000000..9fd22569f6 --- /dev/null +++ b/app/core/core-common-public/src/jvmMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.jvm.kt @@ -0,0 +1,7 @@ +package com.hedvig.core.common.android.validation + +private val emailAddressRegex = Regex(EMAIL_ADDRESS_PATTERN) + +actual fun isValidEmail(email: String): Boolean { + return email.isNotBlank() && emailAddressRegex.matches(email) +} diff --git a/app/core/core-common-public/src/nativeMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.native.kt b/app/core/core-common-public/src/nativeMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.native.kt new file mode 100644 index 0000000000..9fd22569f6 --- /dev/null +++ b/app/core/core-common-public/src/nativeMain/kotlin/com/hedvig/core/common/android/validation/IsValidEmail.native.kt @@ -0,0 +1,7 @@ +package com.hedvig.core.common.android.validation + +private val emailAddressRegex = Regex(EMAIL_ADDRESS_PATTERN) + +actual fun isValidEmail(email: String): Boolean { + return email.isNotBlank() && emailAddressRegex.matches(email) +}