import 'dart:async';
import 'dart:html';
import 'dart:math';
import 'package:frappe/frappe.dart';
InputElement usernameInput = querySelector("#username");
Element usernameAvailable = querySelector("#usernameAvailable");
InputElement fullnameInput = querySelector("#fullname");
ButtonElement registerButton = querySelector("#register");
Element result = querySelector("#result");
void main() {
var username = new Property.fromStreamWithInitialValue(usernameInput.value, usernameInput.onInput.map(inputValue));
var fullname = new Property.fromStreamWithInitialValue(fullnameInput.value, fullnameInput.onInput.map(inputValue));
var isUsernameValid = username.map((value) => value.isNotEmpty);
var isFullnameValid = fullname.map((value) => value.isNotEmpty);
var isUsernameAvailable = username
.changes
.flatMapLatest((value) => new Stream.fromFuture(fetchIsUsernameAvailable(value)));
var isValid = isUsernameValid
.combine(isFullnameValid, (a, b) => a && b)
.combine(isUsernameAvailable, (a, b) => a && b)
.asPropertyWithInitialValue(false);
var onSubmit = new EventStream(usernameInput.onKeyUp.where(isEnterKey))
.merge(fullnameInput.onKeyUp.where(isEnterKey))
.merge(registerButton.onClick)
.when(isValid);
var onRequestRegistration = username
.combine(fullname, (username, fullname) => register(username, fullname))
.sampleOn(onSubmit);
username.changes.forEach((_) => usernameAvailable.text = "");
isUsernameAvailable
.distinct()
.doAction((value) => print("Username available? $value"))
.where((value) => !value)
.forEach((value) => usernameAvailable.text = "Sorry, username is taken");
isValid
.distinct()
.doAction((value) => print("Form valid? $value"))
.forEach((value) => registerButton.disabled = !value);
onRequestRegistration
.doAction((_) => print("Registering ..."))
.asyncMap((request) => request)
.doAction((_) => print("Registered!"))
.forEach((_) => result.text = "Thanks, you're registered!");
}
Future fetchIsUsernameAvailable(String username) {
return new Future.delayed(randomDelay(), () => username.length % 2 == 0);
}
Future register(String username, String fullname) {
return new Future.delayed(randomDelay() * 4, () => true);
}
Duration randomDelay() => new Duration(milliseconds: new Random().nextInt(500) + 500);
String inputValue(Event event) => event.target.value;
bool isEnterKey(KeyboardEvent event) => event.keyCode == 13;