UNPKG

esp-web-tools

Version:

Web tools for ESP devices

139 lines (120 loc) 3.73 kB
import { flash } from "./flash"; import "./flash-log"; import "./flash-progress"; import type { FlashLog } from "./flash-log"; import type { FlashProgress } from "./flash-progress"; import type { InstallButton } from "./install-button"; import { State } from "./const"; let stateListenerAdded = false; let logEl: FlashLog | undefined; let progressEl: FlashProgress | undefined; let improvEl: HTMLElement | undefined; const addElement = <T extends HTMLElement>( button: InstallButton, element: T ): T => { button.renderRoot!.append(element); return element; }; export const startFlash = async (button: InstallButton) => { if (button.hasAttribute("active")) { return; } const manifest = button.manifest || button.getAttribute("manifest"); if (!manifest) { alert("No manifest defined!"); return; } let hasImprov = false; if (!stateListenerAdded) { stateListenerAdded = true; button.addEventListener("state-changed", (ev) => { const state = (button.state = ev.detail); if (state.state === State.INITIALIZING) { button.toggleAttribute("active", true); } else if (state.state === State.MANIFEST && state.build?.improv) { hasImprov = true; // @ts-ignore // preload improv button import("https://www.improv-wifi.com/sdk-js/launch-button.js"); } else if (state.state === State.FINISHED) { button.toggleAttribute("active", false); if (hasImprov) { startImprov(button); } } else if (state.state === State.ERROR) { button.toggleAttribute("active", false); } progressEl?.processState(ev.detail); logEl?.processState(ev.detail); }); } const logConsole = button.logConsole || button.hasAttribute("log-console"); const showLog = button.showLog || button.hasAttribute("show-log"); const showProgress = !showLog && button.hideProgress !== true && !button.hasAttribute("hide-progress"); if (showLog && !logEl) { logEl = addElement<FlashLog>( button, document.createElement("esp-web-flash-log") ); } else if (!showLog && logEl) { logEl.remove(); logEl = undefined; } if (showProgress && !progressEl) { progressEl = addElement<FlashProgress>( button, document.createElement("esp-web-flash-progress") ); } else if (!showProgress && progressEl) { progressEl.remove(); progressEl = undefined; } logEl?.clear(); progressEl?.clear(); improvEl?.classList.toggle("hidden", true); flash( button, logConsole ? console : { log: () => {}, error: () => {}, debug: () => {}, }, manifest, button.eraseFirst !== undefined ? button.eraseFirst : button.hasAttribute("erase-first") ); }; const startImprov = async (button: InstallButton) => { // @ts-ignore await import("https://www.improv-wifi.com/sdk-js/launch-button.js"); const improvButtonConstructor = customElements.get( "improv-wifi-launch-button" ); if ( !improvButtonConstructor.isSupported || !improvButtonConstructor.isAllowed ) { return; } if (!improvEl) { improvEl = document.createElement("improv-wifi-launch-button"); improvEl.addEventListener("state-changed", (ev: any) => { if (ev.detail.state === "PROVISIONED") { improvEl!.classList.toggle("hidden", true); } }); const improvButton = document.createElement("button"); improvButton.slot = "activate"; improvButton.textContent = "CLICK HERE TO FINISH SETTING UP YOUR DEVICE"; improvEl.appendChild(improvButton); addElement(button, improvEl); } improvEl.classList.toggle("hidden", false); };