forked from auracaster/bumble_mirror
103 lines
3.3 KiB
JavaScript
103 lines
3.3 KiB
JavaScript
import {LitElement, html} from 'https://cdn.jsdelivr.net/gh/lit/dist@2/core/lit-core.min.js';
|
|
|
|
class BumbleControls extends LitElement {
|
|
constructor() {
|
|
super();
|
|
this.bumbleLoaded = false;
|
|
this.connected = false;
|
|
}
|
|
|
|
render() {
|
|
return html`
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
|
<dialog id="settings-dialog" @close=${this.onSettingsDialogClose} style="font-family:sans-serif">
|
|
<p>WebSocket URL for HCI transport</p>
|
|
<form>
|
|
<input id="settings-hci-url-input" type="text" size="50"></input>
|
|
<button value="cancel" formmethod="dialog">Cancel</button>
|
|
<button @click=${this.saveSettings}>Save</button>
|
|
</form>
|
|
</dialog>
|
|
<button @click=${this.openSettingsDialog} class="mdc-icon-button material-icons"><div class="mdc-icon-button__ripple"></div>settings</button>
|
|
<button @click=${this.connectBluetooth} ?disabled=${!this.canConnect()} class="mdc-icon-button material-icons"><div class="mdc-icon-button__ripple"></div>bluetooth</button>
|
|
<button @click=${this.stop} ?disabled=${!this.connected} class="mdc-icon-button material-icons"><div class="mdc-icon-button__ripple"></div>stop</button>
|
|
`
|
|
}
|
|
|
|
get settingsHciUrlInput() {
|
|
return this.renderRoot.querySelector('#settings-hci-url-input');
|
|
}
|
|
|
|
get settingsDialog() {
|
|
return this.renderRoot.querySelector('#settings-dialog');
|
|
}
|
|
|
|
canConnect() {
|
|
return this.bumbleLoaded && !this.connected && this.getHciUrl();
|
|
}
|
|
|
|
getHciUrl() {
|
|
// Look for a URL parameter setting first.
|
|
const params = (new URL(document.location)).searchParams;
|
|
let hciWsUrl = params.get("hci");
|
|
if (hciWsUrl) {
|
|
return hciWsUrl;
|
|
}
|
|
|
|
// Try to load the setting from storage.
|
|
hciWsUrl = localStorage.getItem("hciWsUrl");
|
|
if (hciWsUrl) {
|
|
return hciWsUrl;
|
|
}
|
|
|
|
// Finally, default to nothing.
|
|
return null;
|
|
}
|
|
|
|
openSettingsDialog() {
|
|
const hciUrl = this.getHciUrl();
|
|
if (hciUrl) {
|
|
this.settingsHciUrlInput.value = hciUrl;
|
|
} else {
|
|
// Start with default, assuming port 7681.
|
|
this.settingsHciUrlInput.value = "ws://localhost:7681/v1/websocket/bt"
|
|
}
|
|
this.settingsDialog.showModal();
|
|
}
|
|
|
|
onSettingsDialogClose() {
|
|
if (this.settingsDialog.returnValue === "cancel") {
|
|
return;
|
|
}
|
|
if (this.settingsHciUrlInput.value) {
|
|
localStorage.setItem("hciWsUrl", this.settingsHciUrlInput.value);
|
|
} else {
|
|
localStorage.removeItem("hciWsUrl");
|
|
}
|
|
|
|
this.requestUpdate();
|
|
}
|
|
|
|
saveSettings(event) {
|
|
event.preventDefault();
|
|
this.settingsDialog.close(this.settingsHciUrlInput.value);
|
|
}
|
|
|
|
async connectBluetooth() {
|
|
this.connected = await this.connector(this.getHciUrl());
|
|
this.requestUpdate();
|
|
}
|
|
|
|
async stop() {
|
|
await this.stopper();
|
|
this.connected = false;
|
|
this.requestUpdate();
|
|
}
|
|
|
|
onBumbleLoaded() {
|
|
this.bumbleLoaded = true;
|
|
this.requestUpdate();
|
|
}
|
|
}
|
|
customElements.define('bumble-controls', BumbleControls);
|