Mercurial > code > home > repos > light9
view light9/ascoltami/Light9AscoltamiUi.ts @ 2123:c4427fd59306
port some of ascoltami into lit
author | drewp@bigasterisk.com |
---|---|
date | Thu, 02 Jun 2022 23:24:09 -0700 |
parents | |
children | eb5d8349c871 |
line wrap: on
line source
import debug from "debug"; import { html, LitElement } from "lit"; import { customElement, property } from "lit/decorators.js"; import { NamedNode } from "n3"; import { getTopGraph } from "../web/RdfdbSyncedGraph"; import { SyncedGraph } from "../web/SyncedGraph"; export { RdfdbSyncedGraph } from "../web/RdfdbSyncedGraph"; export { Light9TimelineAudio } from "../web/light9-timeline-audio"; import { classMap } from "lit/directives/class-map.js"; debug.enable("*"); const log = debug("asco"); function byId(id: string): HTMLElement { return document.getElementById(id)!; } async function postJson(url: string, jsBody: Object) { return fetch(url, { method: "POST", headers: { "Content-Type": "applcation/json" }, body: JSON.stringify(jsBody), }); } @customElement("light9-ascoltami-ui") export class Light9AscoltamiUi extends LitElement { graph!: SyncedGraph; times!: { intro: number; post: number }; currentDuration: number = 0; @property() nextText: string = ""; @property() isPlaying: boolean = false; render() { return html`<rdfdb-synced-graph></rdfdb-synced-graph> <link rel="stylesheet" href="./style.css" /> <h1>ascoltami <a href="metrics">[metrics]</a></h1> <div class="commands"> <button id="cmd-stop" @click=${this.onCmdStop} class="playMode ${classMap({ active: !this.isPlaying })}"> <strong>Stop</strong> <div class="key">s</div> </button> <button id="cmd-play" @click=${this.onCmdPlay} class="playMode ${classMap({ active: this.isPlaying })}"> <strong>Play</strong> <div class="key">p</div> </button> <button id="cmd-intro" @click=${this.onCmdIntro}> <strong>Skip intro</strong> <div class="key">i</div> </button> <button id="cmd-post" @click=${this.onCmdPost}> <strong>Skip to Post</strong> <div class="key">t</div> </button> <button id="cmd-go" @click=${this.onCmdGo}> <strong>Go</strong> <div class="key">g</div> <div id="next">${this.nextText}</div> </button> </div> `; } onCmdStop(ev?: MouseEvent): void { postJson("api/time", { pause: true }); } onCmdPlay(ev?: MouseEvent): void { postJson("api/time", { resume: true }); } onCmdIntro(ev?: MouseEvent): void { postJson("api/time", { t: this.times.intro, resume: true }); } onCmdPost(ev?: MouseEvent): void { postJson("api/time", { t: this.currentDuration - this.times.post, resume: true }); } onCmdGo(ev?: MouseEvent): void { postJson("api/go", {}); } bindKeys() { document.addEventListener("keypress", (ev) => { if (ev.which == 115) { this.onCmdStop(); return false; } if (ev.which == 112) { this.onCmdPlay(); return false; } if (ev.which == 105) { this.onCmdIntro(); return false; } if (ev.which == 116) { this.onCmdPost(); return false; } if (ev.key == "g") { this.onCmdGo(); return false; } return true; }); } currentDurationChanged(newDuration: number): void { this.currentDuration = newDuration; } async musicSetup() { // shoveled over from the vanillajs version const config = await (await fetch("api/config")).json(); this.times = config.times; document.title = document.title.replace("{{host}}", config.host); const h1 = document.querySelector("h1")!; h1.innerText = h1.innerText.replace("{{host}}", config.host); byId("nav").innerText = navigator.userAgent; var updateFreq = navigator.userAgent.indexOf("Linux") != -1 ? 10 : 2; if (navigator.userAgent.match(/Windows NT/)) { // helper laptop updateFreq = 10; } byId("updateReq").innerText = "" + updateFreq; (window as any).finishOldStyleSetup( this.times, updateFreq, this.currentDurationChanged.bind(this), (t: string) => { this.nextText = t; }, (is: boolean) => { this.isPlaying = is; } ); } constructor() { super(); this.bindKeys(); // byId("cmd-stop").addEventListener("click", (ev: Event) => // ); getTopGraph().then((g) => { this.graph = g; this.musicSetup(); // async }); } }