Is there any better way to do this ? After a cust...
# webassembly
d
Is there any better way to do this ? After a custom
trait
or interface to attach to any group of existing types.
Copy code
external interface HasValidationApi {
  val validity: ValidationState

  val setCustomValidity(error: String)
  // ... more items removed
}

fun hasValidationApi(ele: HTMLElement): HasValidationApi? {
  return when(ele) {
    is HTMLInputElement -> ele as HasValidationApi
    is HTMLSelectElement -> ele as HasValidationApi
    is HTMLTextAreaElement -> ele as HasValidationApi
    is HTMLFieldSetElement -> ele as HasValidationApi
    is HTMLButtonElement -> ele as HasValidationApi
    is HTMLOutputElement -> ele as HasValidationApi
    else -> null
  }
}

fun validityStateMessage(validityState: ValidityState, ignoreCustomError: Boolean = true): String {
  return when {
    validityState.badInput -> "Bad Input"
    validityState.customError && !ignoreCustomError -> "Custom Error"
    validityState.patternMismatch -> "Pattern Mismatch"
    // ... items removed
    validityState.valid -> ""
    else -> "Validity Sate Unknown"
  }
}

fun onMyEventSetCustomValidity(ele: HTMLElemen) {
   val e = hasValidationApi(ele)
   if(e != null) {
     val error = validityStateMessage(e.validity, ignoreCustomError = true)
     e.setCustomValidity(error)
   }
}