diff options
Diffstat (limited to 'client-web/source/resource')
-rw-r--r-- | client-web/source/resource/mod.ts | 4 | ||||
-rw-r--r-- | client-web/source/resource/track.ts | 68 |
2 files changed, 32 insertions, 40 deletions
diff --git a/client-web/source/resource/mod.ts b/client-web/source/resource/mod.ts index 50bc91c..de44823 100644 --- a/client-web/source/resource/mod.ts +++ b/client-web/source/resource/mod.ts @@ -23,14 +23,14 @@ export abstract class Resource { private _state: ChannelState = "disconnected" get state() { return this._state } set state(value: ChannelState) { - if (value != this._state) this.update_el() + const old_value = this._state this._state = value + if (value != old_value) this.update_el() } destroy() { this.on_destroy() } abstract create_element(): HTMLElement - abstract create_preview(): HTMLElement static create(user: User, info: ProvideInfo): Resource | undefined { if (info.kind == "audio" || info.kind == "video") return new TrackResource(user, info) diff --git a/client-web/source/resource/track.ts b/client-web/source/resource/track.ts index b2f73ab..a14525b 100644 --- a/client-web/source/resource/track.ts +++ b/client-web/source/resource/track.ts @@ -31,49 +31,41 @@ export class TrackResource extends Resource { super.destroy() } - // TODO --- all the following code could be more generic and prettier in the UI --- - - create_preview(): HTMLElement { - return ebutton(`Enable ${this.info.kind}`, { - onclick: (e) => { - (e as HTMLButtonElement).disabled = true; - this.request() - } - }) - } create_element() { - if (!this.track) { return this.create_preview() } const el = document.createElement("div") - el.append(ebutton(`Enable ${this.info.kind}`, { - onclick: (e) => { - (e as HTMLButtonElement).disabled = true; - this.request_stop() - } - })) - - const is_video = this.track.kind == "video" - const media_el = is_video ? document.createElement("video") : document.createElement("audio") - const stream = new MediaStream([this.track.track]) - media_el.srcObject = stream - media_el.classList.add("media") - media_el.autoplay = true - media_el.controls = true - if (this.track.local) media_el.muted = true - el.append(media_el) + if (!this.track?.local) { + el.append(ebutton(`${this.track ? "Disable" : "Enable"} ${this.info.kind}`, { + onclick: (e) => { + (e as HTMLButtonElement).disabled = true; + this.track ? this.request_stop() : this.request() + } + })) + } + if (this.track) { + const is_video = this.track.kind == "video" + const media_el = is_video ? document.createElement("video") : document.createElement("audio") + const stream = new MediaStream([this.track.track]) + media_el.srcObject = stream + media_el.classList.add("media") + media_el.autoplay = true + media_el.controls = true + if (this.track.local) media_el.muted = true + el.append(media_el) - if (this.track.local) { - const end_button = document.createElement("button") - end_button.textContent = "End" - end_button.addEventListener("click", () => { - this.track?.end() + if (this.track.local) { + const end_button = document.createElement("button") + end_button.textContent = "End" + end_button.addEventListener("click", () => { + this.track?.end() + }) + el.append(end_button) + } + this.el.append(el) + this.track.addEventListener("ended", () => { + media_el.srcObject = null // TODO + el.remove() }) - el.append(end_button) } - this.el.append(el) - this.track.addEventListener("ended", () => { - media_el.srcObject = null // TODO - el.remove() - }) return el } }
\ No newline at end of file |