package xapi.components.impl;
import static xapi.components.api.LoggingCallback.voidCallback;
import java.util.function.Supplier;
import javax.validation.constraints.NotNull;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.core.client.ScriptInjector;
import xapi.components.api.Document;
import xapi.components.api.IsWebComponent;
import xapi.components.api.JsoConstructorSupplier;
import elemental.dom.Element;
import elemental.js.dom.JsElement;
public class WebComponentSupport {
public void ensureWebComponentApi(ScheduledCommand onLoaded) {
// Check if document.register exists
if (JsSupport.doc().getRegisterElement() == null) {
// Nope... Lets inject our polyfill
ScriptInjector
.fromUrl(getPolyfillUrl())
.setCallback(voidCallback(onLoaded))
.setRemoveTag(true)
.inject();
} else {
Scheduler.get().scheduleDeferred(onLoaded);
}
}
public static <E extends Element> E asElement(
@NotNull IsWebComponent<E> webComponent) {
if (webComponent instanceof JsElement) {
return castToElement(webComponent);
}
throw new RuntimeException("Unknown web component type "
+ webComponent.getClass());
}
private static native <E extends Element> E castToElement(
IsWebComponent<E> webComponent)
/*-{
return webComponent;
}-*/;
protected String getPolyfillUrl() {
return GWT.getHostPageBaseURL() + "x-tag-components.min.js";
}
public static <E extends IsWebComponent<? extends Element>> Supplier<E> register(String tagName,
JavaScriptObject build) {
Document doc = JsSupport.doc();
JavaScriptObject jso = doc.getRegisterElement().call(doc, tagName, build);
return new JsoConstructorSupplier<E>(jso);
}
}